Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2012-01-03 08:23:41 +0400
committerThomas Dinges <blender@dingto.org>2012-01-03 08:23:41 +0400
commitd3af919ac618f82e650b9ae7a2a7b7049f27adf3 (patch)
treec4dfb58d5f176f97ce51329940af513ed51c40d2
parente8dab248c8070d9651f20e34fdf358a18d52f75d (diff)
parent434c1e6df82a082fe03034a3ad3825f7b50ea533 (diff)
Merging Trunk changes into Tile branch:
SVN Range: 42300-43091. Resolved issues: * Re-added compat code for new Compositor in readfile.c * Matrix multiplication order fixes, see commit 42670. Tested compile on windows, branch looks good after merge! :)
-rw-r--r--CMakeLists.txt131
-rw-r--r--SConstruct32
-rw-r--r--build_files/buildbot/config/user-config-i686.py1
-rw-r--r--build_files/buildbot/config/user-config-player-x86_64.py2
-rw-r--r--build_files/buildbot/config/user-config-x86_64.py3
-rwxr-xr-xbuild_files/cmake/cmake_qtcreator_project.py9
-rw-r--r--build_files/cmake/macros.cmake13
-rw-r--r--build_files/scons/config/darwin-config.py16
-rw-r--r--build_files/scons/config/linux-config.py4
-rw-r--r--build_files/scons/config/linuxcross-config.py2
-rw-r--r--build_files/scons/config/win32-mingw-config.py12
-rw-r--r--build_files/scons/config/win32-vc-config.py11
-rw-r--r--build_files/scons/config/win64-vc-config.py10
-rw-r--r--build_files/scons/tools/Blender.py7
-rw-r--r--build_files/scons/tools/btools.py12
-rw-r--r--doc/manpage/blender.17
-rw-r--r--doc/python_api/rst/change_log.rst637
-rw-r--r--doc/python_api/sphinx_doc_gen.py7
-rw-r--r--extern/CMakeLists.txt2
-rw-r--r--extern/libmv/CMakeLists.txt66
-rw-r--r--extern/libmv/SConscript5
-rwxr-xr-xextern/libmv/bundle.sh79
-rw-r--r--extern/libmv/files.txt224
-rw-r--r--extern/libmv/libmv-capi.cpp39
-rw-r--r--extern/libmv/libmv-capi.h3
-rw-r--r--extern/libmv/libmv/numeric/numeric.h2
-rw-r--r--extern/libmv/libmv/tracking/brute_region_tracker.cc340
-rw-r--r--extern/libmv/libmv/tracking/brute_region_tracker.h46
-rw-r--r--extern/libmv/libmv/tracking/esm_region_tracker.cc28
-rw-r--r--extern/libmv/libmv/tracking/esm_region_tracker.h4
-rw-r--r--extern/libmv/libmv/tracking/hybrid_region_tracker.cc67
-rw-r--r--extern/libmv/libmv/tracking/hybrid_region_tracker.h52
-rwxr-xr-xextern/libmv/mkfiles.sh4
-rw-r--r--extern/libmv/third_party/glog/src/config.h2
-rw-r--r--extern/libmv/third_party/glog/src/config_freebsd.h161
-rw-r--r--intern/CMakeLists.txt4
-rw-r--r--intern/SConscript3
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp17
-rw-r--r--intern/audaspace/intern/AUD_SoftwareDevice.cpp4
-rw-r--r--intern/audaspace/jack/AUD_JackDevice.h4
-rw-r--r--intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp6
-rw-r--r--intern/cycles/CMakeLists.txt20
-rw-r--r--intern/cycles/SConscript24
-rw-r--r--intern/cycles/app/cycles_test.cpp36
-rw-r--r--intern/cycles/app/cycles_xml.cpp80
-rw-r--r--intern/cycles/app/io_export_cycles_xml.py (renamed from intern/cycles/blender/addon/xml.py)66
-rw-r--r--intern/cycles/blender/CMakeLists.txt1
-rw-r--r--intern/cycles/blender/addon/__init__.py4
-rw-r--r--intern/cycles/blender/addon/engine.py36
-rw-r--r--intern/cycles/blender/addon/enums.py7
-rw-r--r--intern/cycles/blender/addon/properties.py3
-rw-r--r--intern/cycles/blender/addon/ui.py36
-rw-r--r--intern/cycles/blender/blender_camera.cpp38
-rw-r--r--intern/cycles/blender/blender_mesh.cpp17
-rw-r--r--intern/cycles/blender/blender_object.cpp45
-rw-r--r--intern/cycles/blender/blender_python.cpp76
-rw-r--r--intern/cycles/blender/blender_session.cpp88
-rw-r--r--intern/cycles/blender/blender_session.h2
-rw-r--r--intern/cycles/blender/blender_shader.cpp251
-rw-r--r--intern/cycles/blender/blender_sync.cpp63
-rw-r--r--intern/cycles/blender/blender_sync.h17
-rw-r--r--intern/cycles/bvh/bvh_build.cpp12
-rw-r--r--intern/cycles/device/device.cpp46
-rw-r--r--intern/cycles/device/device.h16
-rw-r--r--intern/cycles/device/device_cpu.cpp26
-rw-r--r--intern/cycles/device/device_cuda.cpp64
-rw-r--r--intern/cycles/device/device_multi.cpp8
-rw-r--r--intern/cycles/device/device_opencl.cpp51
-rw-r--r--intern/cycles/kernel/CMakeLists.txt10
-rw-r--r--intern/cycles/kernel/SConscript65
-rw-r--r--intern/cycles/kernel/kernel.cl12
-rw-r--r--intern/cycles/kernel/kernel.cpp14
-rw-r--r--intern/cycles/kernel/kernel.cu12
-rw-r--r--intern/cycles/kernel/kernel.h18
-rw-r--r--intern/cycles/kernel/kernel_bvh.h17
-rw-r--r--intern/cycles/kernel/kernel_camera.h8
-rw-r--r--intern/cycles/kernel/kernel_compat_opencl.h19
-rw-r--r--intern/cycles/kernel/kernel_displace.h48
-rw-r--r--intern/cycles/kernel/kernel_film.h5
-rw-r--r--intern/cycles/kernel/kernel_optimized.cpp14
-rw-r--r--intern/cycles/kernel/kernel_path.h21
-rw-r--r--intern/cycles/kernel/kernel_random.h14
-rw-r--r--intern/cycles/kernel/kernel_types.h45
-rw-r--r--intern/cycles/kernel/osl/nodes/CMakeLists.txt6
-rw-r--r--intern/cycles/kernel/osl/nodes/node_camera.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_color.h75
-rw-r--r--intern/cycles/kernel/osl/nodes/node_gamma.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_hsv.osl43
-rw-r--r--intern/cycles/kernel/osl/nodes/node_invert.osl29
-rw-r--r--intern/cycles/kernel/osl/nodes/node_mix.osl74
-rw-r--r--intern/cycles/kernel/osl/nodes/node_normal.osl31
-rw-r--r--intern/cycles/kernel/osl/nodes/node_sepcomb_rgb.osl40
-rw-r--r--intern/cycles/kernel/svm/svm.h27
-rw-r--r--intern/cycles/kernel/svm/svm_camera.h43
-rw-r--r--intern/cycles/kernel/svm/svm_gamma.h37
-rw-r--r--intern/cycles/kernel/svm/svm_hsv.h132
-rw-r--r--intern/cycles/kernel/svm/svm_invert.h40
-rw-r--r--intern/cycles/kernel/svm/svm_mix.h76
-rw-r--r--intern/cycles/kernel/svm/svm_normal.h41
-rw-r--r--intern/cycles/kernel/svm/svm_sepcomb_rgb.h44
-rw-r--r--intern/cycles/kernel/svm/svm_types.h9
-rw-r--r--intern/cycles/render/buffers.cpp42
-rw-r--r--intern/cycles/render/buffers.h55
-rw-r--r--intern/cycles/render/camera.cpp11
-rw-r--r--intern/cycles/render/graph.cpp53
-rw-r--r--intern/cycles/render/graph.h1
-rw-r--r--intern/cycles/render/integrator.cpp8
-rw-r--r--intern/cycles/render/integrator.h2
-rw-r--r--intern/cycles/render/mesh.cpp18
-rw-r--r--intern/cycles/render/mesh_displace.cpp23
-rw-r--r--intern/cycles/render/nodes.cpp243
-rw-r--r--intern/cycles/render/nodes.h45
-rw-r--r--intern/cycles/render/session.cpp75
-rw-r--r--intern/cycles/render/session.h21
-rw-r--r--intern/cycles/render/sobol.cpp27
-rw-r--r--intern/cycles/render/sobol.h4
-rw-r--r--intern/cycles/render/tile.cpp26
-rw-r--r--intern/cycles/render/tile.h10
-rw-r--r--intern/cycles/subd/subd_mesh.cpp2
-rw-r--r--intern/cycles/util/util_boundbox.h8
-rw-r--r--intern/cycles/util/util_cache.h2
-rw-r--r--intern/cycles/util/util_math.h6
-rw-r--r--intern/cycles/util/util_md5.cpp5
-rw-r--r--intern/cycles/util/util_system.cpp6
-rw-r--r--intern/cycles/util/util_transform.h21
-rw-r--r--intern/dualcon/CMakeLists.txt46
-rw-r--r--intern/dualcon/SConscript9
-rw-r--r--intern/dualcon/dualcon.h95
-rw-r--r--intern/dualcon/intern/GeoCommon.h69
-rw-r--r--intern/dualcon/intern/MemoryAllocator.h219
-rw-r--r--intern/dualcon/intern/ModelReader.h64
-rw-r--r--intern/dualcon/intern/Projections.cpp76
-rw-r--r--intern/dualcon/intern/Projections.h845
-rw-r--r--intern/dualcon/intern/Queue.h110
-rw-r--r--intern/dualcon/intern/cubes.h46
-rw-r--r--intern/dualcon/intern/dualcon_c_api.cpp191
-rw-r--r--intern/dualcon/intern/manifold_table.cpp282
-rw-r--r--intern/dualcon/intern/manifold_table.h33
-rw-r--r--intern/dualcon/intern/marching_cubes_table.cpp554
-rw-r--r--intern/dualcon/intern/marching_cubes_table.h38
-rw-r--r--intern/dualcon/intern/octree.cpp4311
-rw-r--r--intern/dualcon/intern/octree.h1596
-rw-r--r--intern/dualcon/intern/readme.txt112
-rw-r--r--intern/ghost/CMakeLists.txt7
-rw-r--r--intern/ghost/GHOST_C-api.h3
-rw-r--r--intern/ghost/GHOST_ISystem.h5
-rw-r--r--intern/ghost/GHOST_IWindow.h2
-rw-r--r--intern/ghost/intern/GHOST_C-api.cpp3
-rw-r--r--intern/ghost/intern/GHOST_CallbackEventConsumer.cpp2
-rw-r--r--intern/ghost/intern/GHOST_Debug.h33
-rw-r--r--intern/ghost/intern/GHOST_DisplayManager.h17
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerSDL.cpp8
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerSDL.h8
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerX11.cpp76
-rw-r--r--intern/ghost/intern/GHOST_EventDragnDrop.h19
-rw-r--r--intern/ghost/intern/GHOST_EventKey.h12
-rw-r--r--intern/ghost/intern/GHOST_EventNDOF.h6
-rw-r--r--intern/ghost/intern/GHOST_EventTrackpad.h6
-rw-r--r--intern/ghost/intern/GHOST_System.cpp5
-rw-r--r--intern/ghost/intern/GHOST_System.h5
-rw-r--r--intern/ghost/intern/GHOST_SystemCarbon.cpp3
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.h4
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm3
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp8
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp12
-rw-r--r--intern/ghost/intern/GHOST_TimerTask.h12
-rw-r--r--intern/ghost/intern/GHOST_Window.cpp10
-rw-r--r--intern/ghost/intern/GHOST_Window.h5
-rw-r--r--intern/ghost/intern/GHOST_WindowCarbon.cpp3
-rw-r--r--intern/ghost/intern/GHOST_WindowCocoa.mm19
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp11
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.h4
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp13
-rw-r--r--intern/guardedalloc/MEM_sys_types.h10
-rw-r--r--intern/iksolver/intern/IK_Solver.cpp3
-rw-r--r--intern/mikktspace/mikktspace.c1
-rw-r--r--intern/opennl/intern/opennl.c2
-rw-r--r--intern/opennl/superlu/get_perm_c.c18
-rw-r--r--intern/opennl/superlu/scolumn_bmod.c1
-rw-r--r--intern/opennl/superlu/strsv.c13
-rw-r--r--intern/opennl/superlu/sutil.c4
-rw-r--r--intern/opennl/superlu/util.h3
-rw-r--r--intern/smoke/intern/smoke_API.cpp3
-rw-r--r--release/datafiles/blender_icons.pngbin201043 -> 218213 bytes
-rw-r--r--release/datafiles/splash.pngbin153933 -> 195415 bytes
-rw-r--r--release/plugins/sequence/color-correction-hsv.c3
-rw-r--r--release/plugins/sequence/color-correction-yuv.c9
-rw-r--r--release/plugins/sequence/dnr.c3
-rw-r--r--release/plugins/sequence/gamma.c3
-rw-r--r--release/scripts/modules/animsys_refactor.py1
-rw-r--r--release/scripts/modules/bpy/path.py2
-rw-r--r--release/scripts/modules/bpy/utils.py8
-rw-r--r--release/scripts/modules/bpy_extras/image_utils.py36
-rw-r--r--release/scripts/modules/bpy_extras/io_utils.py22
-rw-r--r--release/scripts/modules/bpy_extras/keyconfig_utils.py1
-rw-r--r--release/scripts/modules/bpy_extras/view3d_utils.py19
-rw-r--r--release/scripts/modules/rna_prop_ui.py8
-rw-r--r--release/scripts/modules/rna_xml.py300
-rw-r--r--release/scripts/modules/sys_info.py10
-rw-r--r--release/scripts/presets/ffmpeg/DV.py2
-rw-r--r--release/scripts/presets/ffmpeg/DVD.py2
-rw-r--r--release/scripts/presets/ffmpeg/SVCD.py2
-rw-r--r--release/scripts/presets/ffmpeg/VCD.py2
-rw-r--r--release/scripts/presets/tracking_settings/blurry_footage.py11
-rw-r--r--release/scripts/presets/tracking_settings/blurry_movie.py11
-rw-r--r--release/scripts/presets/tracking_settings/default.py4
-rw-r--r--release/scripts/presets/tracking_settings/fast_motion.py12
-rw-r--r--release/scripts/presets/tracking_track_color/object.py5
-rw-r--r--release/scripts/startup/bl_operators/anim.py4
-rw-r--r--release/scripts/startup/bl_operators/clip.py27
-rw-r--r--release/scripts/startup/bl_operators/image.py4
-rw-r--r--release/scripts/startup/bl_operators/object_randomize_transform.py54
-rw-r--r--release/scripts/startup/bl_operators/presets.py1
-rw-r--r--release/scripts/startup/bl_operators/sequencer.py8
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py2
-rw-r--r--release/scripts/startup/bl_operators/wm.py140
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py87
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_object_constraint.py35
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py6
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py112
-rw-r--r--release/scripts/startup/bl_ui/space_image.py42
-rw-r--r--release/scripts/startup/bl_ui/space_logic.py4
-rw-r--r--release/scripts/startup/bl_ui/space_node.py1
-rw-r--r--release/scripts/startup/bl_ui/space_text.py2
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py6
-rw-r--r--release/scripts/startup/bl_ui/space_userpref_keymap.py2
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py25
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py17
-rw-r--r--release/scripts/startup/keyingsets_builtins.py2
-rw-r--r--source/blender/CMakeLists.txt1
-rw-r--r--source/blender/avi/intern/avi.c57
-rw-r--r--source/blender/avi/intern/codecs.c15
-rw-r--r--source/blender/avi/intern/endian.c30
-rw-r--r--source/blender/avi/intern/mjpeg.c57
-rw-r--r--source/blender/avi/intern/options.c3
-rw-r--r--source/blender/avi/intern/rgb32.c6
-rw-r--r--source/blender/blenfont/BLF_translation.h5
-rw-r--r--source/blender/blenfont/intern/blf_lang.c134
-rw-r--r--source/blender/blenfont/intern/blf_translation.c46
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h30
-rw-r--r--source/blender/blenkernel/BKE_array_mallocn.h38
-rw-r--r--source/blender/blenkernel/BKE_blender.h8
-rw-r--r--source/blender/blenkernel/BKE_colortools.h3
-rw-r--r--source/blender/blenkernel/BKE_customdata.h35
-rw-r--r--source/blender/blenkernel/BKE_deform.h7
-rw-r--r--source/blender/blenkernel/BKE_effect.h5
-rw-r--r--source/blender/blenkernel/BKE_global.h1
-rw-r--r--source/blender/blenkernel/BKE_group.h2
-rw-r--r--source/blender/blenkernel/BKE_mesh.h34
-rw-r--r--source/blender/blenkernel/BKE_modifier.h6
-rw-r--r--source/blender/blenkernel/BKE_movieclip.h2
-rw-r--r--source/blender/blenkernel/BKE_node.h3
-rw-r--r--source/blender/blenkernel/BKE_object.h4
-rw-r--r--source/blender/blenkernel/BKE_particle.h3
-rw-r--r--source/blender/blenkernel/BKE_texture.h2
-rw-r--r--source/blender/blenkernel/BKE_tracking.h48
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h8
-rw-r--r--source/blender/blenkernel/BKE_writeffmpeg.h2
-rw-r--r--source/blender/blenkernel/CMakeLists.txt1
-rw-r--r--source/blender/blenkernel/depsgraph_private.h2
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c36
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.h24
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c1516
-rw-r--r--source/blender/blenkernel/intern/anim.c38
-rw-r--r--source/blender/blenkernel/intern/armature.c60
-rw-r--r--source/blender/blenkernel/intern/boids.c3
-rw-r--r--source/blender/blenkernel/intern/brush.c62
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c2
-rw-r--r--source/blender/blenkernel/intern/camera.c2
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c125
-rw-r--r--source/blender/blenkernel/intern/colortools.c39
-rw-r--r--source/blender/blenkernel/intern/constraint.c433
-rw-r--r--source/blender/blenkernel/intern/customdata.c556
-rw-r--r--source/blender/blenkernel/intern/deform.c250
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c58
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c75
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c1294
-rw-r--r--source/blender/blenkernel/intern/effect.c37
-rw-r--r--source/blender/blenkernel/intern/fcurve.c7
-rw-r--r--source/blender/blenkernel/intern/group.c26
-rw-r--r--source/blender/blenkernel/intern/idprop.c6
-rw-r--r--source/blender/blenkernel/intern/image.c26
-rw-r--r--source/blender/blenkernel/intern/image_gen.c18
-rw-r--r--source/blender/blenkernel/intern/ipo.c13
-rw-r--r--source/blender/blenkernel/intern/lattice.c6
-rw-r--r--source/blender/blenkernel/intern/library.c18
-rw-r--r--source/blender/blenkernel/intern/material.c2
-rw-r--r--source/blender/blenkernel/intern/mball.c6
-rw-r--r--source/blender/blenkernel/intern/mesh.c287
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c115
-rw-r--r--source/blender/blenkernel/intern/modifier.c9
-rw-r--r--source/blender/blenkernel/intern/movieclip.c24
-rw-r--r--source/blender/blenkernel/intern/multires.c3
-rw-r--r--source/blender/blenkernel/intern/node.c48
-rw-r--r--source/blender/blenkernel/intern/object.c43
-rw-r--r--source/blender/blenkernel/intern/ocean.c3
-rw-r--r--source/blender/blenkernel/intern/paint.c17
-rw-r--r--source/blender/blenkernel/intern/particle.c56
-rw-r--r--source/blender/blenkernel/intern/particle_system.c171
-rw-r--r--source/blender/blenkernel/intern/pointcache.c6
-rw-r--r--source/blender/blenkernel/intern/scene.c4
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c2
-rw-r--r--source/blender/blenkernel/intern/sequencer.c5
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c61
-rw-r--r--source/blender/blenkernel/intern/suggestions.c54
-rw-r--r--source/blender/blenkernel/intern/text.c18
-rw-r--r--source/blender/blenkernel/intern/texture.c4
-rw-r--r--source/blender/blenkernel/intern/tracking.c554
-rw-r--r--source/blender/blenkernel/intern/unit.c12
-rw-r--r--source/blender/blenkernel/intern/writeavi.c3
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c10
-rw-r--r--source/blender/blenlib/BLI_array.h185
-rw-r--r--source/blender/blenlib/BLI_dynstr.h11
-rw-r--r--source/blender/blenlib/BLI_edgehash.h11
-rw-r--r--source/blender/blenlib/BLI_fileops.h1
-rw-r--r--source/blender/blenlib/BLI_ghash.h10
-rw-r--r--source/blender/blenlib/BLI_math_base.h5
-rw-r--r--source/blender/blenlib/BLI_math_color.h29
-rw-r--r--source/blender/blenlib/BLI_math_geom.h6
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h6
-rw-r--r--source/blender/blenlib/BLI_math_vector.h1
-rw-r--r--source/blender/blenlib/BLI_md5.h45
-rw-r--r--source/blender/blenlib/BLI_utildefines.h33
-rw-r--r--source/blender/blenlib/CMakeLists.txt4
-rw-r--r--source/blender/blenlib/intern/BLI_dynstr.c20
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c89
-rw-r--r--source/blender/blenlib/intern/BLI_linklist.c24
-rw-r--r--source/blender/blenlib/intern/BLI_memarena.c18
-rw-r--r--source/blender/blenlib/intern/BLI_mempool.c34
-rw-r--r--source/blender/blenlib/intern/bpath.c25
-rw-r--r--source/blender/blenlib/intern/edgehash.c220
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c30
-rw-r--r--source/blender/blenlib/intern/math_color.c51
-rw-r--r--source/blender/blenlib/intern/math_color_inline.c109
-rw-r--r--source/blender/blenlib/intern/math_geom.c67
-rw-r--r--source/blender/blenlib/intern/math_matrix.c42
-rw-r--r--source/blender/blenlib/intern/math_rotation.c6
-rw-r--r--source/blender/blenlib/intern/math_vector.c9
-rw-r--r--source/blender/blenlib/intern/md5.c (renamed from source/blender/imbuf/intern/md5.c)102
-rw-r--r--source/blender/blenlib/intern/path_util.c8
-rw-r--r--source/blender/blenlib/intern/rand.c39
-rw-r--r--source/blender/blenlib/intern/scanfill.c16
-rw-r--r--source/blender/blenlib/intern/storage.c10
-rw-r--r--source/blender/blenlib/intern/winstuff.c18
-rw-r--r--source/blender/blenloader/BLO_sys_types.h9
-rw-r--r--source/blender/blenloader/CMakeLists.txt1
-rw-r--r--source/blender/blenloader/SConscript2
-rw-r--r--source/blender/blenloader/intern/readfile.c321
-rw-r--r--source/blender/blenloader/intern/writefile.c78
-rw-r--r--source/blender/collada/AnimationExporter.cpp4
-rw-r--r--source/blender/collada/AnimationImporter.cpp14
-rw-r--r--source/blender/collada/ArmatureExporter.cpp6
-rw-r--r--source/blender/collada/ArmatureImporter.cpp10
-rw-r--r--source/blender/collada/DocumentImporter.cpp2
-rw-r--r--source/blender/collada/MeshImporter.cpp3
-rw-r--r--source/blender/collada/TransformReader.cpp2
-rw-r--r--source/blender/collada/TransformWriter.cpp4
-rw-r--r--source/blender/collada/collada_utils.cpp2
-rw-r--r--source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_LensGhostOperation.cpp2
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c2
-rw-r--r--source/blender/editors/animation/anim_filter.c2
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c14
-rw-r--r--source/blender/editors/animation/keyframing.c14
-rw-r--r--source/blender/editors/animation/keyingsets.c6
-rw-r--r--source/blender/editors/armature/editarmature.c15
-rw-r--r--source/blender/editors/armature/meshlaplacian.c7
-rw-r--r--source/blender/editors/armature/poselib.c3
-rw-r--r--source/blender/editors/armature/poseobject.c27
-rw-r--r--source/blender/editors/curve/curve_intern.h1
-rw-r--r--source/blender/editors/curve/curve_ops.c25
-rw-r--r--source/blender/editors/curve/editcurve.c29
-rw-r--r--source/blender/editors/curve/editfont.c45
-rw-r--r--source/blender/editors/datafiles/blender_icons.png.c13105
-rw-r--r--source/blender/editors/datafiles/splash.png.c10920
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c2
-rw-r--r--source/blender/editors/include/BIF_glutil.h5
-rw-r--r--source/blender/editors/include/ED_curve.h1
-rw-r--r--source/blender/editors/include/ED_mesh.h18
-rw-r--r--source/blender/editors/include/ED_object.h10
-rw-r--r--source/blender/editors/include/ED_view3d.h10
-rw-r--r--source/blender/editors/include/UI_icons.h2
-rw-r--r--source/blender/editors/interface/interface.c8
-rw-r--r--source/blender/editors/interface/interface_draw.c32
-rw-r--r--source/blender/editors/interface/interface_handlers.c98
-rw-r--r--source/blender/editors/interface/interface_intern.h1
-rw-r--r--source/blender/editors/interface/interface_ops.c15
-rw-r--r--source/blender/editors/interface/interface_panel.c1
-rw-r--r--source/blender/editors/interface/interface_regions.c43
-rw-r--r--source/blender/editors/interface/interface_templates.c32
-rw-r--r--source/blender/editors/interface/interface_widgets.c26
-rw-r--r--source/blender/editors/interface/resources.c2
-rw-r--r--source/blender/editors/interface/view2d.c3
-rw-r--r--source/blender/editors/mesh/editface.c238
-rw-r--r--source/blender/editors/mesh/editmesh.c47
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c27
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c48
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c32
-rw-r--r--source/blender/editors/mesh/mesh_data.c16
-rw-r--r--source/blender/editors/mesh/mesh_navmesh.c3
-rw-r--r--source/blender/editors/mesh/meshtools.c288
-rw-r--r--source/blender/editors/metaball/mball_edit.c1
-rw-r--r--source/blender/editors/object/object_add.c47
-rw-r--r--source/blender/editors/object/object_bake.c33
-rw-r--r--source/blender/editors/object/object_constraint.c151
-rw-r--r--source/blender/editors/object/object_edit.c59
-rw-r--r--source/blender/editors/object/object_group.c7
-rw-r--r--source/blender/editors/object/object_hook.c10
-rw-r--r--source/blender/editors/object/object_intern.h3
-rw-r--r--source/blender/editors/object/object_modifier.c20
-rw-r--r--source/blender/editors/object/object_ops.c7
-rw-r--r--source/blender/editors/object/object_relations.c18
-rw-r--r--source/blender/editors/object/object_select.c3
-rw-r--r--source/blender/editors/object/object_shapekey.c15
-rw-r--r--source/blender/editors/object/object_transform.c6
-rw-r--r--source/blender/editors/object/object_vgroup.c1113
-rw-r--r--source/blender/editors/physics/dynamicpaint_ops.c11
-rw-r--r--source/blender/editors/physics/particle_object.c9
-rw-r--r--source/blender/editors/physics/physics_fluid.c6
-rw-r--r--source/blender/editors/physics/physics_pointcache.c3
-rw-r--r--source/blender/editors/render/render_internal.c66
-rw-r--r--source/blender/editors/render/render_opengl.c11
-rw-r--r--source/blender/editors/render/render_preview.c27
-rw-r--r--source/blender/editors/render/render_shading.c11
-rw-r--r--source/blender/editors/screen/glutil.c21
-rw-r--r--source/blender/editors/screen/screen_ops.c103
-rw-r--r--source/blender/editors/screen/screendump.c54
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c34
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h21
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c6
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c34
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c72
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c498
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c154
-rw-r--r--source/blender/editors/sound/sound_ops.c198
-rw-r--r--source/blender/editors/space_action/action_select.c2
-rw-r--r--source/blender/editors/space_api/spacetypes.c1
-rw-r--r--source/blender/editors/space_buttons/buttons_texture.c2
-rw-r--r--source/blender/editors/space_clip/clip_draw.c34
-rw-r--r--source/blender/editors/space_clip/clip_editor.c3
-rw-r--r--source/blender/editors/space_clip/clip_graph_draw.c18
-rw-r--r--source/blender/editors/space_clip/clip_graph_ops.c29
-rw-r--r--source/blender/editors/space_clip/clip_intern.h10
-rw-r--r--source/blender/editors/space_clip/clip_ops.c14
-rw-r--r--source/blender/editors/space_clip/clip_toolbar.c3
-rw-r--r--source/blender/editors/space_clip/clip_utils.c17
-rw-r--r--source/blender/editors/space_clip/space_clip.c5
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c725
-rw-r--r--source/blender/editors/space_file/file_ops.c6
-rw-r--r--source/blender/editors/space_file/filesel.c10
-rw-r--r--source/blender/editors/space_graph/graph_select.c13
-rw-r--r--source/blender/editors/space_image/image_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_buttons.c3
-rw-r--r--source/blender/editors/space_node/node_draw.c103
-rw-r--r--source/blender/editors/space_node/node_edit.c291
-rw-r--r--source/blender/editors/space_node/node_intern.h15
-rw-r--r--source/blender/editors/space_node/node_ops.c4
-rw-r--r--source/blender/editors/space_node/node_select.c204
-rw-r--r--source/blender/editors/space_node/node_state.c154
-rw-r--r--source/blender/editors/space_node/node_templates.c2
-rw-r--r--source/blender/editors/space_node/space_node.c4
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_edit.c13
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c10
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c4
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c1
-rw-r--r--source/blender/editors/space_text/text_ops.c1
-rw-r--r--source/blender/editors/space_time/space_time.c1
-rw-r--r--source/blender/editors/space_view3d/drawanimviz.c266
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c78
-rw-r--r--source/blender/editors/space_view3d/drawobject.c505
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c23
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c74
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c13
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c21
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c57
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c142
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c28
-rw-r--r--source/blender/editors/transform/transform.c35
-rw-r--r--source/blender/editors/transform/transform.h13
-rw-r--r--source/blender/editors/transform/transform_constraints.c36
-rw-r--r--source/blender/editors/transform/transform_conversions.c96
-rw-r--r--source/blender/editors/transform/transform_generics.c11
-rw-r--r--source/blender/editors/transform/transform_input.c10
-rw-r--r--source/blender/editors/transform/transform_manipulator.c4
-rw-r--r--source/blender/editors/transform/transform_ops.c2
-rw-r--r--source/blender/editors/transform/transform_orientations.c33
-rw-r--r--source/blender/editors/transform/transform_snap.c90
-rw-r--r--source/blender/editors/util/undo.c17
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c3
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c13
-rw-r--r--source/blender/gpu/GPU_buffers.h2
-rw-r--r--source/blender/gpu/GPU_draw.h2
-rw-r--r--source/blender/gpu/GPU_extensions.h2
-rw-r--r--source/blender/gpu/GPU_material.h6
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c35
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c64
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h3
-rw-r--r--source/blender/gpu/intern/gpu_draw.c83
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c42
-rw-r--r--source/blender/gpu/intern/gpu_material.c75
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl86
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c2954
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c10
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp12
-rw-r--r--source/blender/imbuf/CMakeLists.txt2
-rw-r--r--source/blender/imbuf/IMB_imbuf.h17
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h1
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c5
-rw-r--r--source/blender/imbuf/intern/anim_movie.c52
-rw-r--r--source/blender/imbuf/intern/bmp.c6
-rw-r--r--source/blender/imbuf/intern/divers.c755
-rw-r--r--source/blender/imbuf/intern/indexer.c29
-rw-r--r--source/blender/imbuf/intern/jp2.c26
-rw-r--r--source/blender/imbuf/intern/md5.h119
-rw-r--r--source/blender/imbuf/intern/thumbs.c13
-rw-r--r--source/blender/imbuf/intern/util.c15
-rw-r--r--source/blender/makesdna/DNA_ID.h9
-rw-r--r--source/blender/makesdna/DNA_action_types.h12
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h4
-rw-r--r--source/blender/makesdna/DNA_anim_types.h6
-rw-r--r--source/blender/makesdna/DNA_armature_types.h6
-rw-r--r--source/blender/makesdna/DNA_boid_types.h6
-rw-r--r--source/blender/makesdna/DNA_brush_types.h8
-rw-r--r--source/blender/makesdna/DNA_camera_types.h9
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h5
-rw-r--r--source/blender/makesdna/DNA_color_types.h5
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h39
-rw-r--r--source/blender/makesdna/DNA_controller_types.h5
-rw-r--r--source/blender/makesdna/DNA_curve_types.h10
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h42
-rw-r--r--source/blender/makesdna/DNA_defs.h50
-rw-r--r--source/blender/makesdna/DNA_documentation.h10
-rw-r--r--source/blender/makesdna/DNA_dynamicpaint_types.h39
-rw-r--r--source/blender/makesdna/DNA_effect_types.h5
-rw-r--r--source/blender/makesdna/DNA_fileglobal_types.h5
-rw-r--r--source/blender/makesdna/DNA_genfile.h27
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h5
-rw-r--r--source/blender/makesdna/DNA_group_types.h5
-rw-r--r--source/blender/makesdna/DNA_image_types.h21
-rw-r--r--source/blender/makesdna/DNA_key_types.h6
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h8
-rw-r--r--source/blender/makesdna/DNA_lattice_types.h8
-rw-r--r--source/blender/makesdna/DNA_listBase.h6
-rw-r--r--source/blender/makesdna/DNA_material_types.h12
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h59
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h71
-rw-r--r--source/blender/makesdna/DNA_meta_types.h7
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h47
-rw-r--r--source/blender/makesdna/DNA_movieclip_types.h8
-rw-r--r--source/blender/makesdna/DNA_nla_types.h6
-rw-r--r--source/blender/makesdna/DNA_node_types.h14
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim.h5
-rw-r--r--source/blender/makesdna/DNA_object_force.h9
-rw-r--r--source/blender/makesdna/DNA_object_types.h34
-rw-r--r--source/blender/makesdna/DNA_outliner_types.h5
-rw-r--r--source/blender/makesdna/DNA_packedFile_types.h6
-rw-r--r--source/blender/makesdna/DNA_particle_types.h15
-rw-r--r--source/blender/makesdna/DNA_property_types.h5
-rw-r--r--source/blender/makesdna/DNA_scene_types.h97
-rw-r--r--source/blender/makesdna/DNA_screen_types.h5
-rw-r--r--source/blender/makesdna/DNA_sdna_types.h5
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h7
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h17
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h5
-rw-r--r--source/blender/makesdna/DNA_sound_types.h5
-rw-r--r--source/blender/makesdna/DNA_space_types.h103
-rw-r--r--source/blender/makesdna/DNA_speaker_types.h5
-rw-r--r--source/blender/makesdna/DNA_text_types.h5
-rw-r--r--source/blender/makesdna/DNA_texture_types.h11
-rw-r--r--source/blender/makesdna/DNA_tracking_types.h34
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h20
-rw-r--r--source/blender/makesdna/DNA_vec_types.h5
-rw-r--r--source/blender/makesdna/DNA_vfont_types.h5
-rw-r--r--source/blender/makesdna/DNA_view2d_types.h5
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h23
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h5
-rw-r--r--source/blender/makesdna/DNA_world_types.h11
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c169
-rw-r--r--source/blender/makesdna/intern/makesdna.c30
-rw-r--r--source/blender/makesrna/RNA_access.h11
-rw-r--r--source/blender/makesrna/RNA_define.h2
-rw-r--r--source/blender/makesrna/intern/makesrna.c94
-rw-r--r--source/blender/makesrna/intern/rna_access.c79
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c2
-rw-r--r--source/blender/makesrna/intern/rna_brush.c2
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c100
-rw-r--r--source/blender/makesrna/intern/rna_curve.c6
-rw-r--r--source/blender/makesrna/intern/rna_define.c23
-rw-r--r--source/blender/makesrna/intern/rna_dynamicpaint.c6
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c2
-rw-r--r--source/blender/makesrna/intern/rna_image.c7
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c6
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_material.c10
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c5
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c55
-rw-r--r--source/blender/makesrna/intern/rna_movieclip.c1
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c23
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h1
-rw-r--r--source/blender/makesrna/intern/rna_object.c12
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c32
-rw-r--r--source/blender/makesrna/intern/rna_particle.c18
-rw-r--r--source/blender/makesrna/intern/rna_rna.c29
-rw-r--r--source/blender/makesrna/intern/rna_scene.c24
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c4
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c52
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c7
-rw-r--r--source/blender/makesrna/intern/rna_space.c17
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c303
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c52
-rw-r--r--source/blender/makesrna/intern/rna_world.c1
-rw-r--r--source/blender/modifiers/CMakeLists.txt10
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h1
-rw-r--r--source/blender/modifiers/SConscript4
-rw-r--r--source/blender/modifiers/intern/MOD_array.c4
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.c2
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c21
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c4
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c37
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c28
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c20
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c57
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c15
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c24
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c56
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c4
-rw-r--r--source/blender/modifiers/intern/MOD_remesh.c227
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c20
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c4
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c22
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c59
-rw-r--r--source/blender/modifiers/intern/MOD_util.c1
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c46
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c6
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c20
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c56
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c58
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c111
-rw-r--r--source/blender/nodes/CMakeLists.txt1
-rw-r--r--source/blender/nodes/NOD_shader.h1
-rw-r--r--source/blender/nodes/composite/node_composite_util.c11
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_alphaOver.c3
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c13
-rw-r--r--source/blender/nodes/shader/node_shader_util.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_camera.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_dynamic.c12
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_gamma.c63
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_hueSatVal.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_invert.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c4
-rw-r--r--source/blender/python/SConscript4
-rw-r--r--source/blender/python/generic/bgl.c5
-rw-r--r--source/blender/python/generic/bpy_internal_import.c99
-rw-r--r--source/blender/python/generic/idprop_py_api.c6
-rw-r--r--source/blender/python/generic/py_capi_utils.c2
-rw-r--r--source/blender/python/intern/CMakeLists.txt18
-rw-r--r--source/blender/python/intern/bpy.c76
-rw-r--r--source/blender/python/intern/bpy_app.c39
-rw-r--r--source/blender/python/intern/bpy_app_ffmpeg.c143
-rw-r--r--source/blender/python/intern/bpy_app_ffmpeg.h32
-rw-r--r--source/blender/python/intern/bpy_app_handlers.c81
-rw-r--r--source/blender/python/intern/bpy_driver.c93
-rw-r--r--source/blender/python/intern/bpy_interface.c212
-rw-r--r--source/blender/python/intern/bpy_interface_atexit.c18
-rw-r--r--source/blender/python/intern/bpy_intern_string.c12
-rw-r--r--source/blender/python/intern/bpy_library.c92
-rw-r--r--source/blender/python/intern/bpy_operator.c150
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c34
-rw-r--r--source/blender/python/intern/bpy_props.c465
-rw-r--r--source/blender/python/intern/bpy_rna.c2030
-rw-r--r--source/blender/python/intern/bpy_rna_anim.c82
-rw-r--r--source/blender/python/intern/bpy_rna_array.c328
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c33
-rw-r--r--source/blender/python/intern/bpy_traceback.c20
-rw-r--r--source/blender/python/intern/bpy_util.c32
-rw-r--r--source/blender/python/intern/gpu.c26
-rw-r--r--source/blender/python/mathutils/mathutils.c181
-rw-r--r--source/blender/python/mathutils/mathutils.h14
-rw-r--r--source/blender/python/mathutils/mathutils_Color.c167
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.c148
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.h2
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c1312
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.h48
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c184
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c1502
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.h3
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.c381
-rw-r--r--source/blender/python/mathutils/mathutils_noise.c62
-rw-r--r--source/blender/quicktime/apple/qtkit_export.m69
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m3
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c30
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c3
-rw-r--r--source/blender/quicktime/quicktime_export.h2
-rw-r--r--source/blender/render/intern/raytrace/rayobject_octree.cpp2
-rw-r--r--source/blender/render/intern/source/convertblender.c92
-rw-r--r--source/blender/render/intern/source/envmap.c16
-rw-r--r--source/blender/render/intern/source/external_engine.c5
-rw-r--r--source/blender/render/intern/source/imagetexture.c12
-rw-r--r--source/blender/render/intern/source/pipeline.c84
-rw-r--r--source/blender/render/intern/source/pixelshading.c1
-rw-r--r--source/blender/render/intern/source/pointdensity.c2
-rw-r--r--source/blender/render/intern/source/rayshade.c14
-rw-r--r--source/blender/render/intern/source/render_texture.c44
-rw-r--r--source/blender/render/intern/source/renderdatabase.c6
-rw-r--r--source/blender/render/intern/source/shadbuf.c6
-rw-r--r--source/blender/render/intern/source/shadeinput.c12
-rw-r--r--source/blender/render/intern/source/shadeoutput.c8
-rw-r--r--source/blender/render/intern/source/strand.c3
-rw-r--r--source/blender/render/intern/source/volumetric.c6
-rw-r--r--source/blender/render/intern/source/zbuf.c10
-rw-r--r--source/blender/windowmanager/WM_api.h5
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c48
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c33
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c3
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c54
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c11
-rw-r--r--source/creator/CMakeLists.txt14
-rw-r--r--source/creator/creator.c2
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp1
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h166
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp3
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h2
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp3
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp2
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp185
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.h3
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp22
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp3
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp4
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp182
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp3
-rw-r--r--source/gameengine/Expressions/InputParser.cpp18
-rw-r--r--source/gameengine/Expressions/Operator1Expr.cpp5
-rw-r--r--source/gameengine/Expressions/Operator2Expr.cpp11
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h3
-rw-r--r--source/gameengine/Expressions/StringValue.h2
-rw-r--r--source/gameengine/Expressions/Value.cpp3
-rw-r--r--source/gameengine/Expressions/Value.h2
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt4
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp15
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp30
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp3
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp9
-rw-r--r--source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h1
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp17
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.h1
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.cpp4
-rw-r--r--source/gameengine/Ketsji/BL_Material.cpp18
-rw-r--r--source/gameengine/Ketsji/BL_Texture.cpp20
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h2
-rw-r--r--source/gameengine/Ketsji/KX_Dome.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.cpp79
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.h6
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h6
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h49
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp26
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h2
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp3
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt1
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.cpp22
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp2
-rw-r--r--source/tests/CMakeLists.txt5
-rw-r--r--source/tests/bl_pyapi_mathutils.py163
784 files changed, 46960 insertions, 25793 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6f8e72f7494..01d81eb7f00 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -156,6 +156,7 @@ endif()
if(UNIX AND NOT APPLE)
option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support and unicode input)" ON)
+ option(WITH_X11_XF86VMODE "Enable X11 video mode switching" OFF)
option(WITH_BUILTIN_GLEW "Use GLEW OpenGL wrapper library bundled with blender" ON)
option(WITH_XDG_USER_DIRS "Build with XDG Base Directory Specification (only config and documents for now)" OFF)
mark_as_advanced(WITH_XDG_USER_DIRS)
@@ -169,6 +170,7 @@ option(WITH_MOD_FLUID "Enable Elbeem Modifier (Fluid Simulation)" ON)
option(WITH_MOD_SMOKE "Enable Smoke Modifier (Smoke Simulation)" ON)
option(WITH_MOD_DECIMATE "Enable Decimate Modifier" ON)
option(WITH_MOD_BOOLEAN "Enable Boolean Modifier" ON)
+option(WITH_MOD_REMESH "Enable Remesh Modifier" ON)
option(WITH_MOD_CLOTH_ELTOPO "Enable Experemental cloth solver" OFF)
mark_as_advanced(WITH_MOD_CLOTH_ELTOPO)
option(WITH_MOD_OCEANSIM "Enable Ocean Modifier" OFF)
@@ -281,10 +283,12 @@ if(WITH_PYTHON_MODULE AND WITH_PYTHON_INSTALL)
message(FATAL_ERROR "WITH_PYTHON_MODULE requires WITH_PYTHON_INSTALL to be OFF")
endif()
-if(WITH_CODEC_QUICKTIME AND MINGW)
- message(FATAL_ERROR "MINGW requires WITH_CODEC_QUICKTIME to be OFF "
- "because it is currently unsupported, remove this "
- "line if youre a developer who wants to add support.")
+if(MINGW)
+ if(WITH_CODEC_QUICKTIME)
+ message(FATAL_ERROR "MINGW requires WITH_CODEC_QUICKTIME to be OFF "
+ "because it is currently unsupported, remove this "
+ "line if youre a developer who wants to add support.")
+ endif()
endif()
if(NOT WITH_FFTW3 AND WITH_MOD_OCEANSIM)
@@ -581,6 +585,17 @@ if(UNIX AND NOT APPLE)
if(WITH_X11_XINPUT)
set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xinput_LIB}")
endif()
+
+ if(WITH_X11_XF86VMODE)
+ # XXX, why dont cmake make this available?
+ FIND_LIBRARY(X11_Xxf86vmode_LIB Xxf86vm ${X11_LIB_SEARCH_PATH})
+ mark_as_advanced(X11_Xxf86vmode_LIB)
+ if(X11_Xxf86vmode_LIB)
+ set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS} ${X11_Xxf86vmode_LIB}")
+ else()
+ set(WITH_X11_XF86VMODE OFF)
+ endif()
+ endif()
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
@@ -649,10 +664,6 @@ elseif(WIN32)
set(ICONV_LIBPATH ${ICONV}/lib)
endif()
- set(PNG "${LIBDIR}/png")
- set(PNG_INCLUDE_DIR "${PNG}/include")
- set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
-
set(JPEG "${LIBDIR}/jpeg")
set(JPEG_INCLUDE_DIR "${JPEG}/include")
set(JPEG_LIBPATH ${JPEG}/lib) # not cmake defined
@@ -662,7 +673,7 @@ elseif(WIN32)
if(WITH_OPENAL)
set(OPENAL ${LIBDIR}/openal)
set(OPENAL_INCLUDE_DIR ${OPENAL}/include)
- set(OPENAL_LIBRARY wrap_oal)
+ set(OPENAL_LIBRARY OpenAL32)
set(OPENAL_LIBPATH ${OPENAL}/lib)
endif()
@@ -727,12 +738,12 @@ elseif(WIN32)
set(GETTEXT_LIBRARIES gnu_gettext)
endif()
- if(CMAKE_CL_64)
- set(PNG_LIBRARIES libpng)
- else()
- set(PNG_LIBRARIES libpng_st)
- endif()
+ set(PNG_LIBRARIES libpng)
set(JPEG_LIBRARIES libjpeg)
+
+ set(PNG "${LIBDIR}/png")
+ set(PNG_INCLUDE_DIR "${PNG}/include")
+ set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
set(ZLIB_INCLUDE_DIRS ${LIBDIR}/zlib/include)
if(CMAKE_CL_64)
@@ -767,22 +778,27 @@ elseif(WIN32)
${LIBDIR}/opencollada/include/COLLADASaxFrameworkLoader/include
${LIBDIR}/opencollada/include/GeneratedSaxParser/include
)
+
+ set_lib_path(OPENCOLLADA_LIBPATH "opencollada/lib")
set(OPENCOLLADA_LIBRARIES
- ${LIBDIR}/opencollada/lib/OpenCOLLADASaxFrameworkLoader.lib
- ${LIBDIR}/opencollada/lib/OpenCOLLADAFramework.lib
- ${LIBDIR}/opencollada/lib/OpenCOLLADABaseUtils.lib
- ${LIBDIR}/opencollada/lib/OpenCOLLADAStreamWriter.lib
- ${LIBDIR}/opencollada/lib/MathMLSolver.lib
- ${LIBDIR}/opencollada/lib/GeneratedSaxParser.lib
- ${LIBDIR}/opencollada/lib/xml2.lib
- ${LIBDIR}/opencollada/lib/buffer.lib
- ${LIBDIR}/opencollada/lib/ftoa.lib
- ${LIBDIR}/opencollada/lib/UTF.lib
+ ${OPENCOLLADA_LIBPATH}/OpenCOLLADASaxFrameworkLoader.lib
+ ${OPENCOLLADA_LIBPATH}/OpenCOLLADAFramework.lib
+ ${OPENCOLLADA_LIBPATH}/OpenCOLLADABaseUtils.lib
+ ${OPENCOLLADA_LIBPATH}/OpenCOLLADAStreamWriter.lib
+ ${OPENCOLLADA_LIBPATH}/MathMLSolver.lib
+ ${OPENCOLLADA_LIBPATH}/GeneratedSaxParser.lib
+ ${OPENCOLLADA_LIBPATH}/xml2.lib
+ ${OPENCOLLADA_LIBPATH}/buffer.lib
+ ${OPENCOLLADA_LIBPATH}/ftoa.lib
+ ${OPENCOLLADA_LIBPATH}/UTF.lib
)
set(PCRE_LIBRARIES
- ${LIBDIR}/opencollada/lib/pcre.lib
+ ${OPENCOLLADA_LIBPATH}/pcre.lib
)
+
+ unset(OPENCOLLADA_LIBPATH)
+
endif()
if(WITH_CODEC_FFMPEG)
@@ -800,18 +816,8 @@ elseif(WIN32)
endif()
if(WITH_IMAGE_OPENEXR)
- if(MSVC90)
- set(MSVC_LIB _vs2008)
- set(MSVC_INC)
- elseif(MSVC10)
- set(MSVC_LIB _vs2010)
- set(MSVC_INC _vs2010)
- else()
- set(MSVC_LIB msvc)
- set(MSVC_INC)
- endif()
- set(OPENEXR ${LIBDIR}/openexr)
- set(OPENEXR_LIBPATH ${OPENEXR}/lib${MSVC_LIB})
+ set_lib_path(OPENEXR "openexr")
+ set_lib_path(OPENEXR_LIBPATH "openexr/lib")
set(OPENEXR_LIBRARIES
${OPENEXR_LIBPATH}/Iex.lib
${OPENEXR_LIBPATH}/Half.lib
@@ -819,7 +825,7 @@ elseif(WIN32)
${OPENEXR_LIBPATH}/Imath.lib
${OPENEXR_LIBPATH}/IlmThread.lib
)
- set(OPENEXR_INCUDE ${OPENEXR}/include${MSVC_INC})
+ set_lib_path(OPENEXR_INCUDE "openexr/include")
set(OPENEXR_INCLUDE_DIRS
${OPENEXR_INCUDE}
${OPENEXR_INCUDE}/IlmImf
@@ -846,9 +852,9 @@ elseif(WIN32)
if(WITH_PYTHON)
# normally cached but not since we include them with blender
set(PYTHON_VERSION 3.2) # CACHE STRING)
- set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}") # CACHE PATH)
- set(PYTHON_LIBRARY "${LIBDIR}/python/lib/python32.lib") #CACHE FILEPATH)
-
+ set_lib_path(PYTHON_INCLUDE_DIR "python/include/python${PYTHON_VERSION}")
+ set_lib_path(PYTHON_LIBRARY "python/lib/python32.lib") #CACHE FILEPATH)
+
# uncached vars
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
@@ -857,14 +863,23 @@ elseif(WIN32)
if(WITH_BOOST)
set(BOOST ${LIBDIR}/boost)
set(BOOST_INCLUDE_DIR ${BOOST}/include)
- set(BOOST_POSTFIX "vc90-mt-s-1_47.lib")
- set(BOOST_DEBUG_POSTFIX "vc90-mt-sgd-1_47.lib")
+ if(MSVC10)
+ set(BOOST_POSTFIX "vc100-mt-s-1_47.lib")
+ set(BOOST_DEBUG_POSTFIX "vc100-mt-sgd-1_47.lib")
+ else()
+ set(BOOST_POSTFIX "vc90-mt-s-1_47.lib")
+ set(BOOST_DEBUG_POSTFIX "vc90-mt-sgd-1_47.lib")
+ endif()
set(BOOST_LIBRARIES
- optimized libboost_date_time-${BOOST_POSTFIX} libboost_filesystem-${BOOST_POSTFIX}
- libboost_regex-${BOOST_POSTFIX} libboost_system-${BOOST_POSTFIX} libboost_thread-${BOOST_POSTFIX}
- debug libboost_date_time-${BOOST_DEBUG_POSTFIX} libboost_filesystem-${BOOST_DEBUG_POSTFIX}
- libboost_regex-${BOOST_DEBUG_POSTFIX} libboost_system-${BOOST_DEBUG_POSTFIX} libboost_thread-${BOOST_DEBUG_POSTFIX})
- set(BOOST_LIBPATH ${BOOST}/lib)
+ optimized libboost_date_time-${BOOST_POSTFIX} optimized libboost_filesystem-${BOOST_POSTFIX}
+ optimized libboost_regex-${BOOST_POSTFIX} optimized libboost_system-${BOOST_POSTFIX} optimized libboost_thread-${BOOST_POSTFIX}
+ debug libboost_date_time-${BOOST_DEBUG_POSTFIX} debug libboost_filesystem-${BOOST_DEBUG_POSTFIX}
+ debug libboost_regex-${BOOST_DEBUG_POSTFIX} debug libboost_system-${BOOST_DEBUG_POSTFIX} debug libboost_thread-${BOOST_DEBUG_POSTFIX})
+ if(MSVC10)
+ set(BOOST_LIBPATH ${BOOST}/lib/vc_10)
+ else()
+ set(BOOST_LIBPATH ${BOOST}/lib)
+ endif()
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
endif()
@@ -872,7 +887,7 @@ elseif(WIN32)
set(OPENIMAGEIO ${LIBDIR}/openimageio)
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
set(OPENIMAGEIO_LIBRARIES OpenImageIO)
- set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
+ set_lib_path(OPENIMAGEIO_LIBPATH "openimageio/lib")
set(OPENIMAGEIO_DEFINITIONS)
endif()
@@ -904,6 +919,10 @@ elseif(WIN32)
set(GETTEXT_LIBPATH ${GETTEXT}/lib)
set(GETTEXT_LIBRARIES intl)
endif()
+
+ set(PNG "${LIBDIR}/gcc/png")
+ set(PNG_INCLUDE_DIR "${PNG}/include")
+ set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
set(JPEG_LIBRARIES libjpeg)
set(PNG_LIBRARIES png)
@@ -1386,7 +1405,10 @@ if(CMAKE_COMPILER_IS_GNUCC)
# disable because it gives warnings for printf() & friends.
# ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion)
- ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
+
+ if(NOT APPLE)
+ ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
+ endif()
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
@@ -1398,7 +1420,10 @@ if(CMAKE_COMPILER_IS_GNUCC)
# flags to undo strict flags
ADD_CHECK_C_COMPILER_FLAG(CC_REMOVE_STRICT_FLAGS C_WARN_NO_DEPRECATED_DECLARATIONS -Wno-deprecated-declarations)
ADD_CHECK_C_COMPILER_FLAG(CC_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_PARAMETER -Wno-unused-parameter)
- ADD_CHECK_C_COMPILER_FLAG(CC_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_BUT_SET_VARIABLE -Wno-unused-but-set-variable)
+
+ if(NOT APPLE)
+ ADD_CHECK_C_COMPILER_FLAG(CC_REMOVE_STRICT_FLAGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
+ endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
@@ -1420,11 +1445,9 @@ endif()
if(MSVC10)
if(WITH_IMAGE_OPENEXR)
message(WARNING "MSVC 2010 does not support OpenEXR, disabling WITH_IMAGE_OPENEXR. To enable support use Use MSVC 2008")
- set(WITH_IMAGE_OPENEXR OFF)
endif()
if(WITH_OPENCOLLADA)
message(WARNING "MSVC 2010 does not support OpenCollada, disabling WITH_OPENCOLLADA. To enable support use Use MSVC 2008")
- set(WITH_OPENCOLLADA OFF)
endif()
endif()
@@ -1536,6 +1559,7 @@ if(FIRST_RUN)
info_cfg_text("System Options:")
info_cfg_option(WITH_INSTALL_PORTABLE)
+ info_cfg_option(WITH_X11_XF86VMODE)
info_cfg_option(WITH_X11_XINPUT)
info_cfg_option(WITH_BUILTIN_GLEW)
@@ -1566,6 +1590,7 @@ if(FIRST_RUN)
info_cfg_text("Modifiers:")
info_cfg_option(WITH_MOD_BOOLEAN)
+ info_cfg_option(WITH_MOD_REMESH)
info_cfg_option(WITH_MOD_DECIMATE)
info_cfg_option(WITH_MOD_FLUID)
info_cfg_option(WITH_MOD_OCEANSIM)
diff --git a/SConstruct b/SConstruct
index cd4e31efeff..ee43015cf6e 100644
--- a/SConstruct
+++ b/SConstruct
@@ -119,6 +119,12 @@ tempbitness = int(B.arguments.get('BF_BITNESS', bitness)) # default to bitness f
if tempbitness in (32, 64): # only set if 32 or 64 has been given
bitness = int(tempbitness)
+if bitness:
+ B.bitness = bitness
+else:
+ B.bitness = tempbitness
+
+
# first check cmdline for toolset and we create env to work on
quickie = B.arguments.get('BF_QUICK', None)
quickdebug = B.arguments.get('BF_QUICKDEBUG', None)
@@ -258,6 +264,7 @@ if 'blenderlite' in B.targets:
target_env_defs['WITH_BF_OCEANSIM'] = False
target_env_defs['WITH_BF_DECIMATE'] = False
target_env_defs['WITH_BF_BOOLEAN'] = False
+ target_env_defs['WITH_BF_REMESH'] = False
target_env_defs['WITH_BF_PYTHON'] = False
target_env_defs['WITH_BF_3DMOUSE'] = False
@@ -266,7 +273,7 @@ if 'blenderlite' in B.targets:
if k not in B.arguments:
env[k] = v
-# Extended OSX_SDK and 3D_CONNEXION_CLIENT_LIBRARY detection for OSX
+# Extended OSX_SDK and 3D_CONNEXION_CLIENT_LIBRARY and JAckOSX detection for OSX
if env['OURPLATFORM']=='darwin':
print B.bc.OKGREEN + "Detected Xcode version: -- " + B.bc.ENDC + env['XCODE_CUR_VER'][:9] + " --"
print "Available " + env['MACOSX_SDK_CHECK']
@@ -285,6 +292,16 @@ if env['OURPLATFORM']=='darwin':
else:
env.Append(LINKFLAGS=['-Xlinker','-weak_framework','-Xlinker','3DconnexionClient'])
+ # for now, Mac builders must download and install the JackOSX framework
+ # necessary header file lives here when installed:
+ # /Library/Frameworks/Jackmp.framework/Versions/A/Headers/jack.h
+ if env['WITH_BF_JACK'] == 1:
+ if not os.path.exists('/Library/Frameworks/Jackmp.framework'):
+ print "JackOSX install not found, disabling WITH_BF_JACK" # avoid build errors !
+ env['WITH_BF_JACK'] = 0
+ else:
+ env.Append(LINKFLAGS=['-Xlinker','-weak_framework','-Xlinker','Jackmp'])
+
if env['WITH_BF_OPENMP'] == 1:
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
env['CCFLAGS'].append('/openmp')
@@ -581,6 +598,14 @@ if env['OURPLATFORM']!='darwin':
source.remove('CMakeLists.txt')
source=['intern/cycles/doc/license/'+s for s in source]
scriptinstall.append(env.Install(dir=dir,source=source))
+
+ # cuda binaries
+ if env['WITH_BF_CYCLES_CUDA_BINARIES']:
+ dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'lib')
+ for arch in env['BF_CYCLES_CUDA_BINARIES_ARCH']:
+ kernel_build_dir = os.path.join(B.root_build_dir, 'intern/cycles/kernel')
+ cubin_file = os.path.join(kernel_build_dir, "kernel_%s.cubin" % arch)
+ scriptinstall.append(env.Install(dir=dir,source=cubin_file))
if env['WITH_BF_INTERNATIONAL']:
internationalpaths=['release' + os.sep + 'datafiles']
@@ -702,10 +727,6 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
# For MinGW and linuxcross static linking will be used
dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
- #currently win64-vc doesn't appear to have libpng.dll
- if env['OURPLATFORM'] != 'win64-vc':
- dllsources += ['${BF_PNG_LIBPATH}/libpng.dll']
-
dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll']
# Used when linking to libtiff was dynamic
# keep it here until compilation on all platform would be ok
@@ -736,7 +757,6 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
if env['WITH_BF_OPENAL']:
dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
- dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
if env['WITH_BF_SNDFILE']:
dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
diff --git a/build_files/buildbot/config/user-config-i686.py b/build_files/buildbot/config/user-config-i686.py
index 34817ed0ae9..f7190b3dedb 100644
--- a/build_files/buildbot/config/user-config-i686.py
+++ b/build_files/buildbot/config/user-config-i686.py
@@ -96,6 +96,7 @@ WITH_BF_JACK = True
# Cycles
WITH_BF_CYCLES = True
+WITH_BF_CYCLES_CUDA_BINARIES = True
WITH_BF_OIIO = True
WITH_BF_STATICOIIO = True
diff --git a/build_files/buildbot/config/user-config-player-x86_64.py b/build_files/buildbot/config/user-config-player-x86_64.py
index ad3839a2434..60c8060e78e 100644
--- a/build_files/buildbot/config/user-config-player-x86_64.py
+++ b/build_files/buildbot/config/user-config-player-x86_64.py
@@ -95,5 +95,5 @@ WITH_BF_OCEANSIM = True
# Compilation and optimization
BF_DEBUG = False
-REL_CCFLAGS = ['-O2'] # C & C++
+REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
diff --git a/build_files/buildbot/config/user-config-x86_64.py b/build_files/buildbot/config/user-config-x86_64.py
index e090ddfbfd6..ac2342057fb 100644
--- a/build_files/buildbot/config/user-config-x86_64.py
+++ b/build_files/buildbot/config/user-config-x86_64.py
@@ -96,6 +96,7 @@ WITH_BF_JACK = True
# Cycles
WITH_BF_CYCLES = True
+WITH_BF_CYCLES_CUDA_BINARIES = True
WITH_BF_OIIO = True
WITH_BF_STATICOIIO = True
@@ -116,5 +117,5 @@ WITH_BF_OCEANSIM = True
# Compilation and optimization
BF_DEBUG = False
-REL_CCFLAGS = ['-O2'] # C & C++
+REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
diff --git a/build_files/cmake/cmake_qtcreator_project.py b/build_files/cmake/cmake_qtcreator_project.py
index 07ffa659437..8cabc75e426 100755
--- a/build_files/cmake/cmake_qtcreator_project.py
+++ b/build_files/cmake/cmake_qtcreator_project.py
@@ -47,6 +47,13 @@ import os
import sys
+def quote_define(define):
+ if " " in define.strip():
+ return '"%s"' % define
+ else:
+ return define
+
+
def create_qtc_project_main():
files = list(source_list(SOURCE_DIR, filename_check=is_project_file))
files_rel = [os.path.relpath(f, start=PROJECT_DIR) for f in files]
@@ -99,7 +106,7 @@ def create_qtc_project_main():
qtc_cfg = os.path.join(PROJECT_DIR, "%s.config" % FILE_NAME)
f = open(qtc_cfg, 'w')
f.write("// ADD PREDEFINED MACROS HERE!\n")
- defines_final = [("#define %s %s" % item) for item in defines]
+ defines_final = [("#define %s %s" % (item[0], quote_define(item[1]))) for item in defines]
if sys.platform != "win32":
defines_final += cmake_compiler_defines()
f.write("\n".join(defines_final))
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index c6a834050d0..406f2537dce 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -665,3 +665,16 @@ function(delayed_do_install
endif()
endfunction()
+macro(set_lib_path
+ lvar
+ lproj)
+
+
+ if(MSVC10 AND EXISTS ${LIBDIR}/vc2010/${lproj})
+ set(${lvar} ${LIBDIR}/vc2010/${lproj})
+ else()
+ set(${lvar} ${LIBDIR}/${lproj})
+ endif()
+
+
+endmacro() \ No newline at end of file
diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py
index 028b1bd0289..b84890fbba3 100644
--- a/build_files/scons/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -148,12 +148,12 @@ BF_CXX = '/usr'
WITH_BF_STATICCXX = False
BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
-# TODO - set proper paths here (add precompiled to lib/ ? )
-WITH_BF_JACK = False
-BF_JACK = '/usr'
-BF_JACK_INC = '${BF_JACK}/include/jack'
+# we use simply jack framework
+WITH_BF_JACK = True
+BF_JACK = '/Library/Frameworks/Jackmp.framework'
+BF_JACK_INC = '${BF_JACK}/headers'
BF_JACK_LIB = 'jack'
-BF_JACK_LIBPATH = '${BF_JACK}/lib'
+BF_JACK_LIBPATH = '${BF_JACK}'
WITH_BF_SNDFILE = True
BF_SNDFILE = LIBDIR + '/sndfile'
@@ -283,7 +283,7 @@ BF_PCRE_LIBPATH = '${BF_PCRE}/lib'
#BF_EXPAT_LIB = 'expat'
#BF_EXPAT_LIBPATH = '/usr/lib'
-#Cycles
+# Cycles
WITH_BF_CYCLES = True
WITH_BF_OIIO = True
@@ -298,6 +298,10 @@ BF_BOOST_INC = BF_BOOST + '/include'
BF_BOOST_LIB = 'boost_date_time-mt boost_filesystem-mt boost_regex-mt boost_system-mt boost_thread-mt'
BF_BOOST_LIBPATH = BF_BOOST + '/lib'
+WITH_BF_CYCLES_CUDA_BINARIES = False
+BF_CYCLES_CUDA_NVCC = '/usr/local/cuda/bin/nvcc'
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_13', 'sm_20', 'sm_21']
+
#Ray trace optimization
if MACOSX_ARCHITECTURE == 'x86_64' or MACOSX_ARCHITECTURE == 'i386':
WITH_BF_RAYOPTIMIZATION = True
diff --git a/build_files/scons/config/linux-config.py b/build_files/scons/config/linux-config.py
index b25bf98c9e6..6964ff993b6 100644
--- a/build_files/scons/config/linux-config.py
+++ b/build_files/scons/config/linux-config.py
@@ -219,6 +219,10 @@ BF_BOOST_LIBPATH = BF_BOOST + '/lib'
WITH_BF_CYCLES = WITH_BF_OIIO and WITH_BF_BOOST
+WITH_BF_CYCLES_CUDA_BINARIES = False
+BF_CYCLES_CUDA_NVCC = '/usr/local/cuda/bin/nvcc'
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_13', 'sm_20', 'sm_21']
+
WITH_BF_OPENMP = True
#Ray trace optimization
diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py
index 5e2c1d67d1f..7ec27af9ea8 100644
--- a/build_files/scons/config/linuxcross-config.py
+++ b/build_files/scons/config/linuxcross-config.py
@@ -13,7 +13,7 @@ WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = False
BF_OPENAL = LIBDIR + '/openal'
BF_OPENAL_INC = '${BF_OPENAL}/include'
-BF_OPENAL_LIB = 'OpenAL32 wrap_oal'
+BF_OPENAL_LIB = 'OpenAL32'
BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
# Warning, this static lib configuration is untested! users of this OS please confirm.
BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a'
diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py
index 51f438e0a4d..e4f8827b7c8 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -14,7 +14,7 @@ BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION[0]}${BF_PY
WITH_BF_OPENAL = True
BF_OPENAL = LIBDIR + '/openal'
BF_OPENAL_INC = '${BF_OPENAL}/include'
-BF_OPENAL_LIB = 'wrap_oal'
+BF_OPENAL_LIB = 'OpenAL32'
BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
WITH_BF_FFMPEG = True
@@ -64,7 +64,7 @@ BF_JPEG_LIB = 'liblibjpeg'
BF_JPEG_LIBPATH = '${BF_JPEG}/lib'
WITH_BF_PNG = True
-BF_PNG = LIBDIR + '/png'
+BF_PNG = LIBDIR + '/gcc/png'
BF_PNG_INC = '${BF_PNG}/include'
BF_PNG_LIB = 'png'
BF_PNG_LIBPATH = '${BF_PNG}/lib'
@@ -156,15 +156,15 @@ WITH_BF_CYCLES = True
WITH_BF_OIIO = True
BF_OIIO = LIBDIR + '/gcc/openimageio'
-BF_OIIO_INC = '#../lib/windows/gcc/openimageio/include'
+BF_OIIO_INC = BF_OIIO + '/include'
BF_OIIO_LIB = 'OpenImageIO'
-BF_OIIO_LIBPATH = '#../lib/windows/gcc/openimageio/lib'
+BF_OIIO_LIBPATH = BF_OIIO + '/lib'
WITH_BF_BOOST = True
BF_BOOST = LIBDIR + '/boost'
-BF_BOOST_INC = '#../lib/windows/boost/include'
+BF_BOOST_INC = BF_BOOST + '/include'
BF_BOOST_LIB = 'boost_date_time-mgw45-mt-s-1_47 boost_filesystem-mgw45-mt-s-1_47 boost_regex-mgw45-mt-s-1_47 boost_system-mgw45-mt-s-1_47 boost_thread-mgw45-mt-s-1_47'
-BF_BOOST_LIBPATH = '#../lib/windows/boost/lib/gcc'
+BF_BOOST_LIBPATH = BF_BOOST + '/lib/gcc'
#Ray trace optimization
WITH_BF_RAYOPTIMIZATION = True
diff --git a/build_files/scons/config/win32-vc-config.py b/build_files/scons/config/win32-vc-config.py
index 7295a16c4bc..07cd30b7ee1 100644
--- a/build_files/scons/config/win32-vc-config.py
+++ b/build_files/scons/config/win32-vc-config.py
@@ -20,7 +20,7 @@ BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
WITH_BF_OPENAL = True
BF_OPENAL = LIBDIR + '/openal'
BF_OPENAL_INC = '${BF_OPENAL}/include '
-BF_OPENAL_LIB = 'wrap_oal'
+BF_OPENAL_LIB = 'OpenAL32'
BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
WITH_BF_ICONV = True
@@ -57,7 +57,7 @@ WITH_BF_STATICOPENEXR = False
BF_OPENEXR = LIBDIR + '/openexr'
BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/IlmImf ${BF_OPENEXR}/include/Iex ${BF_OPENEXR}/include/Imath '
BF_OPENEXR_LIB = ' Iex Half IlmImf Imath IlmThread '
-BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib_vs2008'
+BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
# Warning, this static lib configuration is untested! users of this OS please confirm.
BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a'
@@ -72,7 +72,7 @@ BF_JPEG_LIBPATH = '${BF_JPEG}/lib'
WITH_BF_PNG = True
BF_PNG = LIBDIR + '/png'
BF_PNG_INC = '${BF_PNG}/include'
-BF_PNG_LIB = 'libpng_st'
+BF_PNG_LIB = 'libpng'
BF_PNG_LIBPATH = '${BF_PNG}/lib'
WITH_BF_TIFF = True
@@ -165,6 +165,11 @@ BF_BOOST_INC = '${BF_BOOST}/include'
BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_47 libboost_filesystem-vc90-mt-s-1_47 libboost_regex-vc90-mt-s-1_47 libboost_system-vc90-mt-s-1_47 libboost_thread-vc90-mt-s-1_47'
BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
+#CUDA
+WITH_BF_CYCLES_CUDA_BINARIES = False
+#BF_CYCLES_CUDA_NVCC = "" # Path to the nvidia compiler
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_13', 'sm_20', 'sm_21']
+
#Ray trace optimization
WITH_BF_RAYOPTIMIZATION = True
BF_RAYOPTIMIZATION_SSE_FLAGS = ['/arch:SSE']
diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py
index eb04d9f6403..2e7ea6d0034 100644
--- a/build_files/scons/config/win64-vc-config.py
+++ b/build_files/scons/config/win64-vc-config.py
@@ -20,7 +20,7 @@ BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
WITH_BF_OPENAL = True
BF_OPENAL = LIBDIR + '/openal'
BF_OPENAL_INC = '${BF_OPENAL}/include '
-BF_OPENAL_LIB = 'wrap_oal'
+BF_OPENAL_LIB = 'OpenAL32'
BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
WITH_BF_SNDFILE = True
@@ -61,7 +61,7 @@ WITH_BF_STATICOPENEXR = False
BF_OPENEXR = LIBDIR + '/openexr'
BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/IlmImf ${BF_OPENEXR}/include/Iex ${BF_OPENEXR}/include/Imath '
BF_OPENEXR_LIB = ' Iex Half IlmImf Imath IlmThread '
-BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib_vs2008'
+BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
# Warning, this static lib configuration is untested! users of this OS please confirm.
BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a'
@@ -154,6 +154,7 @@ WITH_BF_3DMOUSE = True
WITH_BF_OPENMP = True
+#Cycles
WITH_BF_CYCLES = True
WITH_BF_OIIO = True
@@ -169,6 +170,11 @@ BF_BOOST_INC = '${BF_BOOST}/include'
BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_47 libboost_filesystem-vc90-mt-s-1_47 libboost_regex-vc90-mt-s-1_47 libboost_system-vc90-mt-s-1_47 libboost_thread-vc90-mt-s-1_47'
BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
+#CUDA
+WITH_BF_CYCLES_CUDA_BINARIES = False
+#BF_CYCLES_CUDA_NVCC = "" # Path to the nvidia compiler
+BF_CYCLES_CUDA_BINARIES_ARCH = ['sm_13', 'sm_20', 'sm_21']
+
#Ray trace optimization
WITH_BF_RAYOPTIMIZATION = True
BF_RAYOPTIMIZATION_SSE_FLAGS = ['/arch:SSE','/arch:SSE2']
diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py
index 38cd960ebe1..e9195fe207d 100644
--- a/build_files/scons/tools/Blender.py
+++ b/build_files/scons/tools/Blender.py
@@ -50,6 +50,7 @@ program_list = [] # A list holding Nodes to final binaries, used to create insta
arguments = None
targets = None
resources = []
+bitness = 0
#some internals
blenderdeps = [] # don't manipulate this one outside this module!
@@ -291,7 +292,7 @@ def setup_syslibs(lenv):
syslibs += Split(lenv['BF_JPEG_LIB'])
syslibs += Split(lenv['BF_PNG_LIB'])
-
+
syslibs += lenv['LLIBS']
return syslibs
@@ -588,6 +589,8 @@ def AppIt(target=None, source=None, env=None):
commands.getoutput(cmd)
cmd = 'mkdir %s/kernel' % (cinstalldir)
commands.getoutput(cmd)
+ cmd = 'mkdir %s/lib' % (cinstalldir)
+ commands.getoutput(cmd)
cmd = 'cp -R %s/blender/addon/*.py %s/' % (croot, cinstalldir)
commands.getoutput(cmd)
cmd = 'cp -R %s/doc/license %s/license' % (croot, cinstalldir)
@@ -596,6 +599,8 @@ def AppIt(target=None, source=None, env=None):
commands.getoutput(cmd)
cmd = 'cp -R %s/kernel/svm %s/util/util_color.h %s/util/util_math.h %s/util/util_transform.h %s/util/util_types.h %s/kernel/' % (croot, croot, croot, croot, croot, cinstalldir)
commands.getoutput(cmd)
+ cmd = 'cp -R %s/../intern/cycles/kernel/*.cubin %s/lib/' % (builddir, cinstalldir)
+ commands.getoutput(cmd)
if env['WITH_OSX_STATICPYTHON']:
cmd = 'mkdir %s/%s.app/Contents/MacOS/%s/python/'%(installdir,binary, VERSION)
diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py
index 1ddbfcb9608..9d47edcfd79 100644
--- a/build_files/scons/tools/btools.py
+++ b/build_files/scons/tools/btools.py
@@ -152,14 +152,16 @@ def validate_arguments(args, bc):
'WITH_BF_FLUID',
'WITH_BF_DECIMATE',
'WITH_BF_BOOLEAN',
+ 'WITH_BF_REMESH',
'WITH_BF_OCEANSIM',
'WITH_BF_CXX_GUARDEDALLOC',
'WITH_BF_JEMALLOC', 'WITH_BF_STATICJEMALLOC', 'BF_JEMALLOC', 'BF_JEMALLOC_INC', 'BF_JEMALLOC_LIBPATH', 'BF_JEMALLOC_LIB', 'BF_JEMALLOC_LIB_STATIC',
'BUILDBOT_BRANCH',
'WITH_BF_3DMOUSE', 'WITH_BF_STATIC3DMOUSE', 'BF_3DMOUSE', 'BF_3DMOUSE_INC', 'BF_3DMOUSE_LIB', 'BF_3DMOUSE_LIBPATH', 'BF_3DMOUSE_LIB_STATIC',
- 'WITH_BF_CYCLES', 'WITH_BF_CYCLES_BINARIES' 'BF_CYCLES_BINARIES_ARCH',
+ 'WITH_BF_CYCLES', 'WITH_BF_CYCLES_CUDA_BINARIES' 'BF_CYCLES_CUDA_NVCC', 'BF_CYCLES_CUDA_NVCC', 'WITH_BF_CYCLES_CUDA_THREADED_COMPILE',
'WITH_BF_OIIO', 'WITH_BF_STATICOIIO', 'BF_OIIO', 'BF_OIIO_INC', 'BF_OIIO_LIB', 'BF_OIIO_LIB_STATIC', 'BF_OIIO_LIBPATH',
- 'WITH_BF_BOOST', 'WITH_BF_STATICBOOST', 'BF_BOOST', 'BF_BOOST_INC', 'BF_BOOST_LIB', 'BF_BOOST_LIB_STATIC', 'BF_BOOST_LIBPATH'
+ 'WITH_BF_BOOST', 'WITH_BF_STATICBOOST', 'BF_BOOST', 'BF_BOOST_INC', 'BF_BOOST_LIB', 'BF_BOOST_LIB_STATIC', 'BF_BOOST_LIBPATH',
+ 'WITH_BF_LIBMV'
]
# Have options here that scons expects to be lists
@@ -260,6 +262,7 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_FLUID', 'Build with Fluid simulation (Elbeem)', True)),
(BoolVariable('WITH_BF_DECIMATE', 'Build with decimate modifier', True)),
(BoolVariable('WITH_BF_BOOLEAN', 'Build with boolean modifier', True)),
+ (BoolVariable('WITH_BF_REMESH', 'Build with remesh modifier', True)),
(BoolVariable('WITH_BF_OCEANSIM', 'Build with ocean simulation', False)),
('BF_PROFILE_FLAGS', 'Profiling compiler flags', ''),
(BoolVariable('WITH_BF_OPENAL', 'Use OpenAL if true', False)),
@@ -544,7 +547,10 @@ def read_opts(env, cfg, args):
localopts.AddVariables(
(BoolVariable('WITH_BF_CYCLES', 'Build with the Cycles engine', True)),
- (BoolVariable('WITH_BF_CYCLES_BINARIES', 'Build with precompiled CUDA binaries', False)),
+ (BoolVariable('WITH_BF_CYCLES_CUDA_BINARIES', 'Build with precompiled CUDA binaries', False)),
+ (BoolVariable('WITH_BF_CYCLES_CUDA_THREADED_COMPILE', 'Build several render kernels at once (using BF_NUMJOBS)', False)),
+ ('BF_CYCLES_CUDA_NVCC', 'CUDA nvcc compiler path', ''),
+ ('BF_CYCLES_CUDA_BINARIES_ARCH', 'CUDA architectures to compile binaries for', []),
(BoolVariable('WITH_BF_OIIO', 'Build with OpenImageIO', False)),
(BoolVariable('WITH_BF_STATICOIIO', 'Staticly link to OpenImageIO', False)),
diff --git a/doc/manpage/blender.1 b/doc/manpage/blender.1
index 620a90e61d2..169006fc609 100644
--- a/doc/manpage/blender.1
+++ b/doc/manpage/blender.1
@@ -1,4 +1,4 @@
-.TH "BLENDER" "1" "October 17, 2011" "Blender Blender 2\&.60 (sub 0)"
+.TH "BLENDER" "1" "December 10, 2011" "Blender Blender 2\&.60 (sub 7)"
.SH NAME
blender \- a 3D modelling and rendering package
@@ -15,7 +15,7 @@ Use Blender to create TV commercials, to make technical visualizations, business
http://www.blender.org
.SH OPTIONS
-Blender 2.59 (sub 4)
+Blender 2.60 (sub 7)
Usage: blender [args ...] [file] [args ...]
.br
.SS "Render Options:"
@@ -378,11 +378,10 @@ Arguments are executed in the order they are given. eg
\fIBLENDER_USER_CONFIG\fR Directory for user configuration files.
\fIBLENDER_USER_SCRIPTS\fR Directory for user scripts.
\fIBLENDER_SYSTEM_SCRIPTS\fR Directory for system wide scripts.
- \fIBLENDER_USER_DATAFILES\fR Directory for user data files (icons, translations, ..).
+ \fIBLENDER_USER_DAT`AFILES\fR Directory for user data files (icons, translations, ..).
\fIBLENDER_SYSTEM_DATAFILES\fR Directory for system wide data files.
\fIBLENDER_SYSTEM_PYTHON\fR Directory for system python libraries.
\fITMP\fR or \fITMPDIR\fR Store temporary files here.
- \fISDL_AUDIODRIVER\fR LibSDL audio driver \- alsa, esd, dma.
\fIPYTHONHOME\fR Path to the python directory, eg. /usr/lib/python.
.br
.br
diff --git a/doc/python_api/rst/change_log.rst b/doc/python_api/rst/change_log.rst
index d332c4faff4..5de7bb49e1c 100644
--- a/doc/python_api/rst/change_log.rst
+++ b/doc/python_api/rst/change_log.rst
@@ -1480,3 +1480,640 @@ Added
* :class:`bpy.types.SceneGameData.restrict_animation_updates`
* :class:`bpy.types.SceneGameData.show_obstacle_simulation`
+
+2.60 to 2.61
+============
+
+bpy.types.BlendDataGroups
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataGroups.is_updated`
+
+bpy.types.BlendDataBrushes
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataBrushes.is_updated`
+
+bpy.types.Theme
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Theme.clip_editor`
+
+bpy.types.BlendData
+-------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendData.movieclips`
+
+bpy.types.BlendDataGreasePencils
+--------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataGreasePencils.is_updated`
+
+bpy.types.BlendDataImages
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataImages.is_updated`
+
+bpy.types.CompositorNodes
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.CompositorNodes.clear`
+
+bpy.types.BlendDataScenes
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataScenes.is_updated`
+
+bpy.types.RenderEngine
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RenderEngine.bl_use_shading_nodes`
+* :class:`bpy.types.RenderEngine.is_animation`
+* :class:`bpy.types.RenderEngine.is_preview`
+* :class:`bpy.types.RenderEngine.tag_redraw`
+* :class:`bpy.types.RenderEngine.tag_update`
+* :class:`bpy.types.RenderEngine.update`
+* :class:`bpy.types.RenderEngine.update_progress`
+* :class:`bpy.types.RenderEngine.view_draw`
+* :class:`bpy.types.RenderEngine.view_update`
+
+bpy.types.BackgroundImage
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BackgroundImage.clip`
+* :class:`bpy.types.BackgroundImage.clip_user`
+* :class:`bpy.types.BackgroundImage.show_background_image`
+* :class:`bpy.types.BackgroundImage.source`
+* :class:`bpy.types.BackgroundImage.use_camera_clip`
+
+bpy.types.BlendDataMetaBalls
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataMetaBalls.is_updated`
+
+bpy.types.SpaceTimeline
+-----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceTimeline.cache_dynamicpaint`
+
+bpy.types.BlendDataMeshes
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataMeshes.is_updated`
+
+bpy.types.BlendDataNodeTrees
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataNodeTrees.is_updated`
+
+bpy.types.RenderSettings
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RenderSettings.image_settings`
+* :class:`bpy.types.RenderSettings.use_shading_nodes`
+
+Removed
+^^^^^^^
+
+* **cineon_black**
+* **cineon_gamma**
+* **cineon_white**
+* **color_mode**
+* **exr_codec**
+* **exr_preview**
+* **exr_zbuf**
+* **file_format**
+* **file_quality**
+* **jpeg2k_depth**
+* **jpeg2k_preset**
+* **jpeg2k_ycc**
+* **use_cineon_log**
+* **use_exr_half**
+* **use_tiff_16bit**
+
+bpy.types.Curve
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Curve.cycles`
+
+bpy.types.RegionView3D
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RegionView3D.view_camera_offset`
+* :class:`bpy.types.RegionView3D.view_camera_zoom`
+
+bpy.types.Scene
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Scene.active_clip`
+* :class:`bpy.types.Scene.cycles`
+
+bpy.types.NodeLinks
+-------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.NodeLinks.clear`
+
+bpy.types.BlendDataLattices
+---------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataLattices.is_updated`
+
+bpy.types.BlendDataParticles
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataParticles.is_updated`
+
+bpy.types.BlendDataWorlds
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataWorlds.is_updated`
+
+bpy.types.ObjectConstraints
+---------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ObjectConstraints.clear`
+
+bpy.types.RenderLayers
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RenderLayers.new`
+* :class:`bpy.types.RenderLayers.remove`
+
+bpy.types.Menu
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Menu.bl_description`
+
+bpy.types.Lamp
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Lamp.cycles`
+* :class:`bpy.types.Lamp.node_tree`
+* :class:`bpy.types.Lamp.use_nodes`
+
+bpy.types.CurveSplines
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.CurveSplines.clear`
+
+bpy.types.Screen
+----------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Screen.use_play_clip_editors`
+
+bpy.types.BlendDataActions
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataActions.is_updated`
+
+bpy.types.BlendDataSounds
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataSounds.is_updated`
+
+bpy.types.Object
+----------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Object.cycles_visibility`
+* :class:`bpy.types.Object.slow_parent_offset`
+
+Removed
+^^^^^^^
+
+* **time_offset**
+* **use_time_offset_add_parent**
+* **use_time_offset_edit**
+* **use_time_offset_parent**
+* **use_time_offset_particle**
+
+bpy.types.ObjectModifiers
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ObjectModifiers.clear`
+
+bpy.types.BlendDataMaterials
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataMaterials.is_updated`
+
+bpy.types.MetaBallElements
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.MetaBallElements.clear`
+
+bpy.types.NodeSocket
+--------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.NodeSocket.group_socket`
+* :class:`bpy.types.NodeSocket.show_expanded`
+
+bpy.types.Node
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Node.show_texture`
+
+bpy.types.CompositorNodeOutputFile
+----------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.CompositorNodeOutputFile.image_settings`
+
+Removed
+^^^^^^^
+
+* **exr_codec**
+* **image_type**
+* **quality**
+* **use_exr_half**
+
+bpy.types.BlendDataTexts
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataTexts.is_updated`
+
+bpy.types.ThemeView3D
+---------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ThemeView3D.bundle_solid`
+* :class:`bpy.types.ThemeView3D.camera_path`
+
+bpy.types.Event
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Event.unicode`
+
+bpy.types.VertexGroups
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.VertexGroups.clear`
+
+bpy.types.TexMapping
+--------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.TexMapping.mapping`
+* :class:`bpy.types.TexMapping.mapping_x`
+* :class:`bpy.types.TexMapping.mapping_y`
+* :class:`bpy.types.TexMapping.mapping_z`
+
+bpy.types.BlendDataObjects
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataObjects.is_updated`
+
+bpy.types.BlendDataCurves
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataCurves.is_updated`
+
+bpy.types.BlendDataLibraries
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataLibraries.is_updated`
+
+bpy.types.ThemeUserInterface
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ThemeUserInterface.icon_alpha`
+* :class:`bpy.types.ThemeUserInterface.panel`
+
+bpy.types.SpaceNodeEditor
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceNodeEditor.shader_type`
+
+bpy.types.SpaceView3D
+---------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceView3D.show_bundle_names`
+* :class:`bpy.types.SpaceView3D.show_camera_path`
+* :class:`bpy.types.SpaceView3D.show_reconstruction`
+* :class:`bpy.types.SpaceView3D.tracks_draw_size`
+* :class:`bpy.types.SpaceView3D.tracks_draw_type`
+
+bpy.types.BlendDataWindowManagers
+---------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataWindowManagers.is_updated`
+
+bpy.types.BlendDataScreens
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataScreens.is_updated`
+
+bpy.types.BlendDataArmatures
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataArmatures.is_updated`
+
+bpy.types.UserPreferencesInput
+------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.UserPreferencesInput.tweak_threshold`
+
+Removed
+^^^^^^^
+
+* **ndof_orbit_invert_axes**
+
+bpy.types.Mesh
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Mesh.cycles`
+
+bpy.types.BlendDataCameras
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataCameras.is_updated`
+
+bpy.types.MetaBall
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.MetaBall.cycles`
+
+bpy.types.UILayout
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.UILayout.template_image_settings`
+* :class:`bpy.types.UILayout.template_marker`
+* :class:`bpy.types.UILayout.template_movieclip`
+* :class:`bpy.types.UILayout.template_node_link`
+* :class:`bpy.types.UILayout.template_node_view`
+* :class:`bpy.types.UILayout.template_texture_user`
+* :class:`bpy.types.UILayout.template_track`
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.UILayout.template_list` (data, property, active_data, active_property, prop_list, rows, maxrows, type), *was (data, property, active_data, active_property, rows, maxrows, type)*
+
+bpy.types.ID
+------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ID.is_updated`
+* :class:`bpy.types.ID.is_updated_data`
+
+bpy.types.World
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.World.cycles`
+* :class:`bpy.types.World.node_tree`
+* :class:`bpy.types.World.use_nodes`
+
+bpy.types.BlendDataTextures
+---------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataTextures.is_updated`
+
+bpy.types.ShaderNodes
+---------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ShaderNodes.clear`
+
+bpy.types.TimelineMarkers
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.TimelineMarkers.clear`
+
+bpy.types.SpaceFileBrowser
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceFileBrowser.active_operator`
+
+bpy.types.Material
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Material.cycles`
+
+bpy.types.BlendDataSpeakers
+---------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataSpeakers.is_updated`
+
+bpy.types.Camera
+----------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Camera.angle_x`
+* :class:`bpy.types.Camera.angle_y`
+* :class:`bpy.types.Camera.cycles`
+* :class:`bpy.types.Camera.sensor_fit`
+* :class:`bpy.types.Camera.sensor_height`
+* :class:`bpy.types.Camera.sensor_width`
+* :class:`bpy.types.Camera.show_sensor`
+
+bpy.types.BlendDataLamps
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataLamps.is_updated`
+
+bpy.types.TextureNodes
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.TextureNodes.clear`
+
+bpy.types.BlendDataFonts
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.BlendDataFonts.is_updated`
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index 88641bdb663..29fcec58ae8 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -87,6 +87,7 @@ else:
"gpu",
"mathutils",
"mathutils.geometry",
+ "mathutils.noise",
)
FILTER_BPY_TYPES = ("bpy_struct", "Operator", "ID") # allow
@@ -1190,6 +1191,8 @@ def rna2sphinx(BASEPATH):
fw(" mathutils.rst\n\n")
if "mathutils.geometry" not in EXCLUDE_MODULES:
fw(" mathutils.geometry.rst\n\n")
+ if "mathutils.noise" not in EXCLUDE_MODULES:
+ fw(" mathutils.noise.rst\n\n")
if "bgl" not in EXCLUDE_MODULES:
fw(" bgl.rst\n\n")
if "blf" not in EXCLUDE_MODULES:
@@ -1329,6 +1332,10 @@ def rna2sphinx(BASEPATH):
import mathutils.geometry as module
pymodule2sphinx(BASEPATH, "mathutils.geometry", module, "Geometry Utilities")
+ if "mathutils.noise" not in EXCLUDE_MODULES:
+ import mathutils.noise as module
+ pymodule2sphinx(BASEPATH, "mathutils.noise", module, "Noise Utilities")
+
if "blf" not in EXCLUDE_MODULES:
import blf as module
pymodule2sphinx(BASEPATH, "blf", module, "Font Drawing")
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index a5dd3b16860..60253e08d4c 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -45,7 +45,7 @@ if(WITH_BUILTIN_GLEW)
endif()
if(WITH_GAMEENGINE)
- add_subdirectory(recastnavigation)
+ add_subdirectory(recastnavigation)
endif()
if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE))
diff --git a/extern/libmv/CMakeLists.txt b/extern/libmv/CMakeLists.txt
index 6f0d5f3d126..671520a76f8 100644
--- a/extern/libmv/CMakeLists.txt
+++ b/extern/libmv/CMakeLists.txt
@@ -22,6 +22,10 @@
#
# ***** END GPL LICENSE BLOCK *****
+# NOTEL This file is automatically generated by bundle.sh script
+# If you're doing changes in this file, please update template
+# in that script too
+
set(INC
.
../Eigen3
@@ -53,6 +57,8 @@ set(SRC
libmv/image/array_nd.cc
libmv/tracking/pyramid_region_tracker.cc
libmv/tracking/sad.cc
+ libmv/tracking/brute_region_tracker.cc
+ libmv/tracking/hybrid_region_tracker.cc
libmv/tracking/esm_region_tracker.cc
libmv/tracking/trklt_region_tracker.cc
libmv/tracking/klt_region_tracker.cc
@@ -100,6 +106,8 @@ set(SRC
libmv/image/sample.h
libmv/image/image.h
libmv/tracking/region_tracker.h
+ libmv/tracking/brute_region_tracker.h
+ libmv/tracking/hybrid_region_tracker.h
libmv/tracking/retrack_region_tracker.h
libmv/tracking/sad.h
libmv/tracking/pyramid_region_tracker.h
@@ -144,23 +152,23 @@ if(WIN32)
third_party/glog/src/vlog_is_on.cc
third_party/glog/src/windows/port.cc
- third_party/glog/src/utilities.h
- third_party/glog/src/stacktrace_generic-inl.h
+ third_party/glog/src/config.h
third_party/glog/src/stacktrace.h
+ third_party/glog/src/stacktrace_generic-inl.h
+ third_party/glog/src/stacktrace_libunwind-inl.h
+ third_party/glog/src/stacktrace_powerpc-inl.h
+ third_party/glog/src/stacktrace_x86-inl.h
third_party/glog/src/stacktrace_x86_64-inl.h
+ third_party/glog/src/utilities.h
+ third_party/glog/src/base/commandlineflags.h
third_party/glog/src/base/googleinit.h
third_party/glog/src/base/mutex.h
- third_party/glog/src/base/commandlineflags.h
- third_party/glog/src/stacktrace_powerpc-inl.h
- third_party/glog/src/stacktrace_x86-inl.h
- third_party/glog/src/config.h
- third_party/glog/src/stacktrace_libunwind-inl.h
+ third_party/glog/src/windows/config.h
+ third_party/glog/src/windows/port.h
+ third_party/glog/src/windows/glog/log_severity.h
+ third_party/glog/src/windows/glog/logging.h
third_party/glog/src/windows/glog/raw_logging.h
third_party/glog/src/windows/glog/vlog_is_on.h
- third_party/glog/src/windows/glog/logging.h
- third_party/glog/src/windows/glog/log_severity.h
- third_party/glog/src/windows/port.h
- third_party/glog/src/windows/config.h
)
list(APPEND INC
@@ -175,12 +183,12 @@ if(WIN32)
if(MSVC)
set(MSVC_OFLAGS O1 O2 Ox)
- foreach(FLAG )
- string(REPLACE "" "Od" CMAKE_CXX_FLAGS_RELEASE "")
- string(REPLACE "" "Od" CMAKE_C_FLAGS_RELWITHDEBINFO "")
+ foreach(FLAG ${MSVC_OFLAGS})
+ string(REPLACE "${FLAG}" "Od" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
+ string(REPLACE "${FLAG}" "Od" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
endforeach()
endif()
-else(WIN32)
+else()
list(APPEND SRC
third_party/glog/src/utilities.cc
third_party/glog/src/symbolize.cc
@@ -190,25 +198,26 @@ else(WIN32)
third_party/glog/src/demangle.cc
third_party/glog/src/raw_logging.cc
- third_party/glog/src/utilities.h
- third_party/glog/src/stacktrace_generic-inl.h
+ third_party/glog/src/config.h
+ third_party/glog/src/config_freebsd.h
+ third_party/glog/src/config_linux.h
third_party/glog/src/config_mac.h
+ third_party/glog/src/demangle.h
third_party/glog/src/stacktrace.h
+ third_party/glog/src/stacktrace_generic-inl.h
+ third_party/glog/src/stacktrace_libunwind-inl.h
+ third_party/glog/src/stacktrace_powerpc-inl.h
+ third_party/glog/src/stacktrace_x86-inl.h
third_party/glog/src/stacktrace_x86_64-inl.h
third_party/glog/src/symbolize.h
+ third_party/glog/src/utilities.h
+ third_party/glog/src/base/commandlineflags.h
third_party/glog/src/base/googleinit.h
third_party/glog/src/base/mutex.h
- third_party/glog/src/base/commandlineflags.h
- third_party/glog/src/stacktrace_powerpc-inl.h
- third_party/glog/src/stacktrace_x86-inl.h
- third_party/glog/src/config.h
- third_party/glog/src/demangle.h
- third_party/glog/src/stacktrace_libunwind-inl.h
+ third_party/glog/src/glog/log_severity.h
+ third_party/glog/src/glog/logging.h
third_party/glog/src/glog/raw_logging.h
third_party/glog/src/glog/vlog_is_on.h
- third_party/glog/src/glog/logging.h
- third_party/glog/src/glog/log_severity.h
- third_party/glog/src/config_linux.h
)
list(APPEND INC
@@ -216,6 +225,9 @@ else(WIN32)
)
endif()
-add_definitions(-DV3DLIB_ENABLE_SUITESPARSE -DGOOGLE_GLOG_DLL_DECL=)
+add_definitions(
+ -DV3DLIB_ENABLE_SUITESPARSE
+ -DGOOGLE_GLOG_DLL_DECL=
+)
blender_add_lib(extern_libmv "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/libmv/SConscript b/extern/libmv/SConscript
index 9c134934fa0..a2132e73f03 100644
--- a/extern/libmv/SConscript
+++ b/extern/libmv/SConscript
@@ -1,4 +1,9 @@
#!/usr/bin/python
+
+# NOTEL This file is automatically generated by bundle.sh script
+# If you're doing changes in this file, please update template
+# in that script too
+
import sys
import os
diff --git a/extern/libmv/bundle.sh b/extern/libmv/bundle.sh
index 690f78df387..ca808e12d7e 100755
--- a/extern/libmv/bundle.sh
+++ b/extern/libmv/bundle.sh
@@ -33,14 +33,14 @@ rm -rf $tmp
chmod 664 ./third_party/glog/src/windows/*.cc ./third_party/glog/src/windows/*.h ./third_party/glog/src/windows/glog/*.h
-sources=`find ./libmv -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | sed -r 's/^\.\//\t/'`
-headers=`find ./libmv -type f -iname '*.h' | sed -r 's/^\.\//\t/'`
+sources=`find ./libmv -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | sed -r 's/^\.\//\t/' | sort -d`
+headers=`find ./libmv -type f -iname '*.h' | sed -r 's/^\.\//\t/' | sort -d`
-third_sources=`find ./third_party -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | grep -v glog | sed -r 's/^\.\//\t/'`
-third_headers=`find ./third_party -type f -iname '*.h' | grep -v glog | sed -r 's/^\.\//\t/'`
+third_sources=`find ./third_party -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | grep -v glog | sed -r 's/^\.\//\t/' | sort`
+third_headers=`find ./third_party -type f -iname '*.h' | grep -v glog | sed -r 's/^\.\//\t/' | sort`
-third_glog_sources=`find ./third_party -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | grep glog | grep -v windows | sed -r 's/^\.\//\t\t/'`
-third_glog_headers=`find ./third_party -type f -iname '*.h' | grep glog | grep -v windows | sed -r 's/^\.\//\t\t/'`
+third_glog_sources=`find ./third_party -type f -iname '*.cc' -or -iname '*.cpp' -or -iname '*.c' | grep glog | grep -v windows | sed -r 's/^\.\//\t\t/' | sort`
+third_glog_headers=`find ./third_party -type f -iname '*.h' | grep glog | grep -v windows | sed -r 's/^\.\//\t\t/' | sort`
src_dir=`find ./libmv -type f -iname '*.cc' -exec dirname {} \; -or -iname '*.cpp' -exec dirname {} \; -or -iname '*.c' -exec dirname {} \; | sed -r 's/^\.\//\t/' | sort | uniq`
src_third_dir=`find ./third_party -type f -iname '*.cc' -exec dirname {} \; -or -iname '*.cpp' -exec dirname {} \; -or -iname '*.c' -exec dirname {} \; | sed -r 's/^\.\//\t/' | sort | uniq`
@@ -89,7 +89,6 @@ for x in $src_dir $src_third_dir; do
done
cat > CMakeLists.txt << EOF
-# \$Id\$
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
@@ -114,17 +113,21 @@ cat > CMakeLists.txt << EOF
#
# ***** END GPL LICENSE BLOCK *****
+# NOTEL This file is automatically generated by bundle.sh script
+# If you're doing changes in this file, please update template
+# in that script too
+
set(INC
.
../Eigen3
- ./third_party/ssba
- ./third_party/ldl/Include
+ third_party/ssba
+ third_party/ldl/Include
../colamd/Include
)
set(INC_SYS
- ${PNG_INCLUDE_DIR}
- ${ZLIB_INCLUDE_DIRS}
+ \${PNG_INCLUDE_DIR}
+ \${ZLIB_INCLUDE_DIRS}
)
set(SRC
@@ -139,7 +142,7 @@ ${headers}
${third_headers}
)
-IF(WIN32)
+if(WIN32)
list(APPEND SRC
third_party/glog/src/logging.cc
third_party/glog/src/raw_logging.cc
@@ -167,28 +170,23 @@ IF(WIN32)
)
list(APPEND INC
- ./third_party/glog/src/windows
+ third_party/glog/src/windows
)
- IF(NOT MINGW)
+ if(NOT MINGW)
list(APPEND INC
- ./third_party/msinttypes
+ third_party/msinttypes
)
- ENDIF(MINGW)
-
- list(APPEND INC
- ./third_party/glog/src/windows
- ./third_party/msinttypes
- )
+ endif()
- IF(MSVC)
+ if(MSVC)
set(MSVC_OFLAGS O1 O2 Ox)
- foreach(FLAG ${MSVC_OFLAGS})
- string(REPLACE "${FLAG}" "Od" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
- string(REPLACE "${FLAG}" "Od" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+ foreach(FLAG \${MSVC_OFLAGS})
+ string(REPLACE "\${FLAG}" "Od" CMAKE_CXX_FLAGS_RELEASE "\${CMAKE_CXX_FLAGS_RELEASE}")
+ string(REPLACE "\${FLAG}" "Od" CMAKE_C_FLAGS_RELWITHDEBINFO "\${CMAKE_C_FLAGS_RELWITHDEBINFO}")
endforeach()
- ENDIF(MSVC)
-ELSE(WIN32)
+ endif()
+else()
list(APPEND SRC
${third_glog_sources}
@@ -196,17 +194,25 @@ ${third_glog_headers}
)
list(APPEND INC
- ./third_party/glog/src
+ third_party/glog/src
)
-ENDIF(WIN32)
+endif()
-add_definitions(-DV3DLIB_ENABLE_SUITESPARSE -DGOOGLE_GLOG_DLL_DECL=)
+add_definitions(
+ -DV3DLIB_ENABLE_SUITESPARSE
+ -DGOOGLE_GLOG_DLL_DECL=
+)
blender_add_lib(extern_libmv "\${SRC}" "\${INC}" "\${INC_SYS}")
EOF
cat > SConscript << EOF
#!/usr/bin/python
+
+# NOTEL This file is automatically generated by bundle.sh script
+# If you're doing changes in this file, please update template
+# in that script too
+
import sys
import os
@@ -230,7 +236,6 @@ incs += ' ' + env['BF_ZLIB_INC']
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ./third_party/glog/src/windows ./third_party/glog/src/windows/glog'
- incs += ' ./third_party/glog/src/windows ./third_party/glog/src/windows/glog'
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
incs += ' ./third_party/msinttypes'
${win_src}
@@ -246,16 +251,16 @@ ${win_src}
defs.append('NDEBUG')
else:
if not env['BF_DEBUG']:
- cflags_libmv = Split(env['REL_CFLAGS'])
- ccflags_libmv = Split(env['REL_CCFLAGS'])
- cxxflags_libmv = Split(env['REL_CXXFLAGS'])
+ cflags_libmv += Split(env['REL_CFLAGS'])
+ ccflags_libmv += Split(env['REL_CCFLAGS'])
+ cxxflags_libmv += Split(env['REL_CXXFLAGS'])
else:
src += env.Glob("third_party/glog/src/*.cc")
incs += ' ./third_party/glog/src'
if not env['BF_DEBUG']:
- cflags_libmv = Split(env['REL_CFLAGS'])
- ccflags_libmv = Split(env['REL_CCFLAGS'])
- cxxflags_libmv = Split(env['REL_CXXFLAGS'])
+ cflags_libmv += Split(env['REL_CFLAGS'])
+ ccflags_libmv += Split(env['REL_CCFLAGS'])
+ cxxflags_libmv += Split(env['REL_CXXFLAGS'])
incs += ' ./third_party/ssba ./third_party/ldl/Include ../colamd/Include'
diff --git a/extern/libmv/files.txt b/extern/libmv/files.txt
index fe6be5d0b20..96dfd89828e 100644
--- a/extern/libmv/files.txt
+++ b/extern/libmv/files.txt
@@ -1,141 +1,151 @@
+libmv/base/id_generator.h
+libmv/base/scoped_ptr.h
+libmv/base/vector.h
+libmv/base/vector_utils.h
+libmv/image/array_nd.cc
+libmv/image/array_nd.h
+libmv/image/convolve.cc
+libmv/image/convolve.h
+libmv/image/image.h
+libmv/image/sample.h
+libmv/image/tuple.h
libmv/logging/logging.h
+libmv/multiview/conditioning.cc
+libmv/multiview/conditioning.h
+libmv/multiview/euclidean_resection.cc
+libmv/multiview/euclidean_resection.h
+libmv/multiview/fundamental.cc
+libmv/multiview/fundamental.h
+libmv/multiview/nviewtriangulation.h
+libmv/multiview/projection.cc
+libmv/multiview/projection.h
+libmv/multiview/resection.h
+libmv/multiview/triangulation.cc
+libmv/multiview/triangulation.h
libmv/numeric/dogleg.h
+libmv/numeric/function_derivative.h
libmv/numeric/levenberg_marquardt.h
-libmv/numeric/poly.h
libmv/numeric/numeric.cc
-libmv/numeric/function_derivative.h
-libmv/numeric/poly.cc
-libmv/numeric/tinyvector.cc
libmv/numeric/numeric.h
-libmv/simple_pipeline/reconstruction.cc
-libmv/simple_pipeline/resect.h
-libmv/simple_pipeline/resect.cc
-libmv/simple_pipeline/reconstruction.h
+libmv/numeric/poly.cc
+libmv/numeric/poly.h
+libmv/simple_pipeline/bundle.cc
+libmv/simple_pipeline/bundle.h
+libmv/simple_pipeline/callbacks.cc
+libmv/simple_pipeline/callbacks.h
+libmv/simple_pipeline/camera_intrinsics.cc
libmv/simple_pipeline/camera_intrinsics.h
-libmv/simple_pipeline/intersect.cc
+libmv/simple_pipeline/detect.cc
+libmv/simple_pipeline/detect.h
libmv/simple_pipeline/initialize_reconstruction.cc
-libmv/simple_pipeline/camera_intrinsics.cc
+libmv/simple_pipeline/initialize_reconstruction.h
+libmv/simple_pipeline/intersect.cc
+libmv/simple_pipeline/intersect.h
libmv/simple_pipeline/pipeline.cc
-libmv/simple_pipeline/tracks.h
-libmv/simple_pipeline/detect.h
-libmv/simple_pipeline/detect.cc
libmv/simple_pipeline/pipeline.h
+libmv/simple_pipeline/reconstruction.cc
+libmv/simple_pipeline/reconstruction.h
+libmv/simple_pipeline/resect.cc
+libmv/simple_pipeline/resect.h
libmv/simple_pipeline/tracks.cc
-libmv/simple_pipeline/bundle.cc
-libmv/simple_pipeline/intersect.h
-libmv/simple_pipeline/bundle.h
-libmv/simple_pipeline/initialize_reconstruction.h
-libmv/image/convolve.h
-libmv/image/tuple.h
-libmv/image/array_nd.h
-libmv/image/convolve.cc
-libmv/image/array_nd.cc
-libmv/image/sample.h
-libmv/image/image.h
+libmv/simple_pipeline/tracks.h
+libmv/tracking/brute_region_tracker.cc
+libmv/tracking/brute_region_tracker.h
+libmv/tracking/esm_region_tracker.cc
+libmv/tracking/esm_region_tracker.h
+libmv/tracking/hybrid_region_tracker.cc
+libmv/tracking/hybrid_region_tracker.h
+libmv/tracking/klt_region_tracker.cc
+libmv/tracking/klt_region_tracker.h
+libmv/tracking/lmicklt_region_tracker.cc
+libmv/tracking/lmicklt_region_tracker.h
libmv/tracking/pyramid_region_tracker.cc
+libmv/tracking/pyramid_region_tracker.h
libmv/tracking/region_tracker.h
-libmv/tracking/sad.cc
-libmv/tracking/trklt_region_tracker.cc
-libmv/tracking/klt_region_tracker.cc
+libmv/tracking/retrack_region_tracker.cc
libmv/tracking/retrack_region_tracker.h
+libmv/tracking/sad.cc
libmv/tracking/sad.h
-libmv/tracking/pyramid_region_tracker.h
+libmv/tracking/trklt_region_tracker.cc
libmv/tracking/trklt_region_tracker.h
-libmv/tracking/retrack_region_tracker.cc
-libmv/tracking/klt_region_tracker.h
-libmv/base/id_generator.h
-libmv/base/vector.h
-libmv/base/scoped_ptr.h
-libmv/base/vector_utils.h
-libmv/multiview/projection.cc
-libmv/multiview/conditioning.cc
-libmv/multiview/nviewtriangulation.h
-libmv/multiview/resection.h
-libmv/multiview/fundamental.cc
-libmv/multiview/euclidean_resection.cc
-libmv/multiview/euclidean_resection.h
-libmv/multiview/triangulation.h
-libmv/multiview/projection.h
-libmv/multiview/triangulation.cc
-libmv/multiview/fundamental.h
-libmv/multiview/conditioning.h
-third_party/ssba/README.TXT
-third_party/ssba/COPYING.TXT
-third_party/ssba/Geometry/v3d_metricbundle.h
-third_party/ssba/Geometry/v3d_metricbundle.cpp
-third_party/ssba/Geometry/v3d_cameramatrix.h
-third_party/ssba/Geometry/v3d_distortion.h
-third_party/ssba/README.libmv
-third_party/ssba/Math/v3d_linear_utils.h
-third_party/ssba/Math/v3d_optimization.h
-third_party/ssba/Math/v3d_mathutilities.h
-third_party/ssba/Math/v3d_linear.h
-third_party/ssba/Math/v3d_optimization.cpp
-third_party/gflags/gflags_completions.h
-third_party/gflags/mutex.h
-third_party/gflags/gflags.cc
-third_party/gflags/gflags_reporting.cc
-third_party/gflags/README.libmv
-third_party/gflags/config.h
-third_party/gflags/gflags_completions.cc
-third_party/gflags/gflags.h
-third_party/fast/fast_9.c
third_party/fast/fast_10.c
third_party/fast/fast_11.c
-third_party/fast/fast.h
-third_party/fast/LICENSE
third_party/fast/fast_12.c
+third_party/fast/fast_9.c
third_party/fast/fast.c
+third_party/fast/fast.h
+third_party/fast/LICENSE
+third_party/fast/nonmax.c
third_party/fast/README
third_party/fast/README.libmv
-third_party/fast/nonmax.c
-third_party/ldl/Include/ldl.h
-third_party/ldl/CMakeLists.txt
-third_party/ldl/README.libmv
-third_party/ldl/Doc/ChangeLog
-third_party/ldl/Doc/lesser.txt
-third_party/ldl/README.txt
-third_party/ldl/Source/ldl.c
+third_party/gflags/config.h
+third_party/gflags/gflags.cc
+third_party/gflags/gflags_completions.cc
+third_party/gflags/gflags_completions.h
+third_party/gflags/gflags.h
+third_party/gflags/gflags_reporting.cc
+third_party/gflags/mutex.h
+third_party/gflags/README.libmv
+third_party/glog/AUTHORS
third_party/glog/ChangeLog
third_party/glog/COPYING
-third_party/glog/src/utilities.cc
-third_party/glog/src/utilities.h
-third_party/glog/src/symbolize.cc
-third_party/glog/src/stacktrace_generic-inl.h
+third_party/glog/NEWS
+third_party/glog/README
+third_party/glog/README.libmv
+third_party/glog/src/base/commandlineflags.h
+third_party/glog/src/base/googleinit.h
+third_party/glog/src/base/mutex.h
+third_party/glog/src/config_freebsd.h
+third_party/glog/src/config.h
+third_party/glog/src/config_linux.h
third_party/glog/src/config_mac.h
-third_party/glog/src/vlog_is_on.cc
+third_party/glog/src/demangle.cc
+third_party/glog/src/demangle.h
+third_party/glog/src/glog/logging.h
+third_party/glog/src/glog/log_severity.h
+third_party/glog/src/glog/raw_logging.h
+third_party/glog/src/glog/vlog_is_on.h
+third_party/glog/src/logging.cc
+third_party/glog/src/raw_logging.cc
third_party/glog/src/signalhandler.cc
+third_party/glog/src/stacktrace_generic-inl.h
third_party/glog/src/stacktrace.h
+third_party/glog/src/stacktrace_libunwind-inl.h
+third_party/glog/src/stacktrace_powerpc-inl.h
third_party/glog/src/stacktrace_x86_64-inl.h
+third_party/glog/src/stacktrace_x86-inl.h
+third_party/glog/src/symbolize.cc
third_party/glog/src/symbolize.h
-third_party/glog/src/base/googleinit.h
-third_party/glog/src/base/mutex.h
-third_party/glog/src/base/commandlineflags.h
-third_party/glog/src/windows/preprocess.sh
-third_party/glog/src/windows/port.h
+third_party/glog/src/utilities.cc
+third_party/glog/src/utilities.h
+third_party/glog/src/vlog_is_on.cc
third_party/glog/src/windows/config.h
-third_party/glog/src/windows/glog/raw_logging.h
-third_party/glog/src/windows/glog/vlog_is_on.h
third_party/glog/src/windows/glog/logging.h
third_party/glog/src/windows/glog/log_severity.h
+third_party/glog/src/windows/glog/raw_logging.h
+third_party/glog/src/windows/glog/vlog_is_on.h
third_party/glog/src/windows/port.cc
-third_party/glog/src/logging.cc
-third_party/glog/src/stacktrace_powerpc-inl.h
-third_party/glog/src/stacktrace_x86-inl.h
-third_party/glog/src/demangle.cc
-third_party/glog/src/config.h
-third_party/glog/src/demangle.h
-third_party/glog/src/stacktrace_libunwind-inl.h
-third_party/glog/src/glog/raw_logging.h
-third_party/glog/src/glog/vlog_is_on.h
-third_party/glog/src/glog/logging.h
-third_party/glog/src/glog/log_severity.h
-third_party/glog/src/raw_logging.cc
-third_party/glog/src/config_linux.h
-third_party/glog/NEWS
-third_party/glog/README
-third_party/glog/README.libmv
-third_party/glog/AUTHORS
-third_party/msinttypes/stdint.h
+third_party/glog/src/windows/port.h
+third_party/glog/src/windows/preprocess.sh
+third_party/ldl/CMakeLists.txt
+third_party/ldl/Doc/ChangeLog
+third_party/ldl/Doc/lesser.txt
+third_party/ldl/Include/ldl.h
+third_party/ldl/README.libmv
+third_party/ldl/README.txt
+third_party/ldl/Source/ldl.c
third_party/msinttypes/inttypes.h
third_party/msinttypes/README.libmv
+third_party/msinttypes/stdint.h
+third_party/ssba/COPYING.TXT
+third_party/ssba/Geometry/v3d_cameramatrix.h
+third_party/ssba/Geometry/v3d_distortion.h
+third_party/ssba/Geometry/v3d_metricbundle.cpp
+third_party/ssba/Geometry/v3d_metricbundle.h
+third_party/ssba/Math/v3d_linear.h
+third_party/ssba/Math/v3d_linear_utils.h
+third_party/ssba/Math/v3d_mathutilities.h
+third_party/ssba/Math/v3d_optimization.cpp
+third_party/ssba/Math/v3d_optimization.h
+third_party/ssba/README.libmv
+third_party/ssba/README.TXT
diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp
index aa05279d731..1835c53b53f 100644
--- a/extern/libmv/libmv-capi.cpp
+++ b/extern/libmv/libmv-capi.cpp
@@ -36,6 +36,8 @@
#include "Math/v3d_optimization.h"
#include "libmv/tracking/esm_region_tracker.h"
+#include "libmv/tracking/brute_region_tracker.h"
+#include "libmv/tracking/hybrid_region_tracker.h"
#include "libmv/tracking/klt_region_tracker.h"
#include "libmv/tracking/trklt_region_tracker.h"
#include "libmv/tracking/lmicklt_region_tracker.h"
@@ -109,18 +111,35 @@ void libmv_setLoggingVerbosity(int verbosity)
/* ************ RegionTracker ************ */
-libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, int half_window_size)
+libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation)
{
- libmv::EsmRegionTracker *klt_region_tracker = new libmv::EsmRegionTracker;
+ libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker;
+ esm_region_tracker->half_window_size = half_window_size;
+ esm_region_tracker->max_iterations = max_iterations;
+ esm_region_tracker->min_determinant = 1e-4;
+ esm_region_tracker->minimum_correlation = minimum_correlation;
- klt_region_tracker->half_window_size = half_window_size;
- klt_region_tracker->max_iterations = max_iterations;
- klt_region_tracker->min_determinant = 1e-4;
+ libmv::PyramidRegionTracker *pyramid_region_tracker =
+ new libmv::PyramidRegionTracker(esm_region_tracker, pyramid_level);
- libmv::PyramidRegionTracker *region_tracker =
- new libmv::PyramidRegionTracker(klt_region_tracker, pyramid_level);
+ return (libmv_RegionTracker *)pyramid_region_tracker;
+}
+
+libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation)
+{
+ libmv::EsmRegionTracker *esm_region_tracker = new libmv::EsmRegionTracker;
+ esm_region_tracker->half_window_size = half_window_size;
+ esm_region_tracker->max_iterations = max_iterations;
+ esm_region_tracker->min_determinant = 1e-4;
+ esm_region_tracker->minimum_correlation = minimum_correlation;
+
+ libmv::BruteRegionTracker *brute_region_tracker = new libmv::BruteRegionTracker;
+ brute_region_tracker->half_window_size = half_window_size;
+
+ libmv::HybridRegionTracker *hybrid_region_tracker =
+ new libmv::HybridRegionTracker(brute_region_tracker, esm_region_tracker);
- return (libmv_RegionTracker *)region_tracker;
+ return (libmv_RegionTracker *)hybrid_region_tracker;
}
static void floatBufToImage(const float *buf, int width, int height, libmv::FloatImage *image)
@@ -477,7 +496,7 @@ double libmv_reporojectionErrorForTrack(libmv_Reconstruction *libmv_reconstructi
{
libmv::EuclideanReconstruction *reconstruction = &libmv_reconstruction->reconstruction;
libmv::CameraIntrinsics *intrinsics = &libmv_reconstruction->intrinsics;
- libmv::vector<libmv::Marker> markers = libmv_reconstruction->tracks.MarkersForTrack(track);
+ libmv::vector<libmv::Marker> markers = libmv_reconstruction->tracks.MarkersForTrack(track);
int num_reprojected = 0;
double total_error = 0.0;
@@ -661,7 +680,7 @@ void libmv_destroyFeatures(struct libmv_Features *libmv_features)
/* ************ camera intrinsics ************ */
struct libmv_CameraIntrinsics *libmv_ReconstructionExtractIntrinsics(struct libmv_Reconstruction *libmv_Reconstruction) {
- return (struct libmv_CameraIntrinsics *)&libmv_Reconstruction->intrinsics;
+ return (struct libmv_CameraIntrinsics *)&libmv_Reconstruction->intrinsics;
}
struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, double principal_x, double principal_y,
diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h
index 321593520b5..e10d4ef842a 100644
--- a/extern/libmv/libmv-capi.h
+++ b/extern/libmv/libmv-capi.h
@@ -43,7 +43,8 @@ void libmv_startDebugLogging(void);
void libmv_setLoggingVerbosity(int verbosity);
/* RegionTracker */
-struct libmv_RegionTracker *libmv_regionTrackerNew(int max_iterations, int pyramid_level, int half_window_size);
+struct libmv_RegionTracker *libmv_pyramidRegionTrackerNew(int max_iterations, int pyramid_level, int half_window_size, double minimum_correlation);
+struct libmv_RegionTracker *libmv_hybridRegionTrackerNew(int max_iterations, int half_window_size, double minimum_correlation);
int libmv_regionTrackerTrack(struct libmv_RegionTracker *libmv_tracker, const float *ima1, const float *ima2,
int width, int height, double x1, double y1, double *x2, double *y2);
void libmv_regionTrackerDestroy(struct libmv_RegionTracker *libmv_tracker);
diff --git a/extern/libmv/libmv/numeric/numeric.h b/extern/libmv/libmv/numeric/numeric.h
index 21e0f067446..bb7f9b364ef 100644
--- a/extern/libmv/libmv/numeric/numeric.h
+++ b/extern/libmv/libmv/numeric/numeric.h
@@ -33,7 +33,7 @@
#include <Eigen/QR>
#include <Eigen/SVD>
-#if _WIN32 || __APPLE__
+#if _WIN32 || __APPLE__ || __FreeBSD__
void static sincos (double x, double *sinx, double *cosx) {
*sinx = sin(x);
*cosx = cos(x);
diff --git a/extern/libmv/libmv/tracking/brute_region_tracker.cc b/extern/libmv/libmv/tracking/brute_region_tracker.cc
new file mode 100644
index 00000000000..a416710ad2b
--- /dev/null
+++ b/extern/libmv/libmv/tracking/brute_region_tracker.cc
@@ -0,0 +1,340 @@
+// Copyright (c) 2011 libmv authors.
+//
+// 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 "libmv/tracking/brute_region_tracker.h"
+
+#ifdef __SSE2__
+#include <emmintrin.h>
+#endif
+
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
+// Needed for memalign on Linux and _aligned_alloc on Windows.
+#ifdef FREE_WINDOWS
+/* make sure _aligned_malloc is included */
+#ifdef __MSVCRT_VERSION__
+#undef __MSVCRT_VERSION__
+#endif
+
+#define __MSVCRT_VERSION__ 0x0700
+#endif
+
+#include <malloc.h>
+#else
+// Apple's malloc is 16-byte aligned, and does not have malloc.h, so include
+// stdilb instead.
+#include <cstdlib>
+#endif
+
+#include "libmv/image/image.h"
+#include "libmv/image/convolve.h"
+#include "libmv/image/sample.h"
+#include "libmv/logging/logging.h"
+
+namespace libmv {
+namespace {
+
+// TODO(keir): It's stupid that this is needed here. Push this somewhere else.
+void *aligned_malloc(int size, int alignment) {
+#ifdef _WIN32
+ return _aligned_malloc(size, alignment);
+#elif __APPLE__
+ // On Mac OS X, both the heap and the stack are guaranteed 16-byte aligned so
+ // they work natively with SSE types with no further work.
+ CHECK_EQ(alignment, 16);
+ return malloc(size);
+#elif __FreeBSD__
+ void *result;
+
+ if(posix_memalign(&result, alignment, size)) {
+ // non-zero means allocation error
+ // either no allocation or bad alignment value
+ return NULL;
+ }
+ return result;
+#else // This is for Linux.
+ return memalign(alignment, size);
+#endif
+}
+
+void aligned_free(void *ptr) {
+#ifdef _WIN32
+ _aligned_free(ptr);
+#else
+ free(ptr);
+#endif
+}
+
+bool RegionIsInBounds(const FloatImage &image1,
+ double x, double y,
+ int half_window_size) {
+ // Check the minimum coordinates.
+ int min_x = floor(x) - half_window_size - 1;
+ int min_y = floor(y) - half_window_size - 1;
+ if (min_x < 0.0 ||
+ min_y < 0.0) {
+ return false;
+ }
+
+ // Check the maximum coordinates.
+ int max_x = ceil(x) + half_window_size + 1;
+ int max_y = ceil(y) + half_window_size + 1;
+ if (max_x > image1.cols() ||
+ max_y > image1.rows()) {
+ return false;
+ }
+
+ // Ok, we're good.
+ return true;
+}
+
+#ifdef __SSE2__
+
+// Compute the sub of absolute differences between the arrays "a" and "b".
+// The array "a" is assumed to be 16-byte aligned, while "b" is not. The
+// result is returned as the first and third elements of __m128i if
+// interpreted as a 4-element 32-bit integer array. The SAD is the sum of the
+// elements.
+//
+// The function requires size % 16 valid extra elements at the end of both "a"
+// and "b", since the SSE load instructionst will pull in memory past the end
+// of the arrays if their size is not a multiple of 16.
+inline static __m128i SumOfAbsoluteDifferencesContiguousSSE(
+ const unsigned char *a, // aligned
+ const unsigned char *b, // not aligned
+ unsigned int size,
+ __m128i sad) {
+ // Do the bulk of the work as 16-way integer operations.
+ for(unsigned int j = 0; j < size / 16; j++) {
+ sad = _mm_add_epi32(sad, _mm_sad_epu8( _mm_load_si128 ((__m128i*)(a + 16 * j)),
+ _mm_loadu_si128((__m128i*)(b + 16 * j))));
+ }
+ // Handle the trailing end.
+ // TODO(keir): Benchmark to verify that the below SSE is a win compared to a
+ // hand-rolled loop. It's not clear that the hand rolled loop would be slower
+ // than the potential cache miss when loading the immediate table below.
+ //
+ // An alternative to this version is to take a packet of all 1's then do a
+ // 128-bit shift. The issue is that the shift instruction needs an immediate
+ // amount rather than a variable amount, so the branch instruction here must
+ // remain. See _mm_srli_si128 and _mm_slli_si128.
+ unsigned int remainder = size % 16u;
+ if (remainder) {
+ unsigned int j = size / 16;
+ __m128i a_trail = _mm_load_si128 ((__m128i*)(a + 16 * j));
+ __m128i b_trail = _mm_loadu_si128((__m128i*)(b + 16 * j));
+ __m128i mask;
+ switch (remainder) {
+#define X 0xff
+ case 1: mask = _mm_setr_epi8(X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 2: mask = _mm_setr_epi8(X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 3: mask = _mm_setr_epi8(X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 4: mask = _mm_setr_epi8(X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 5: mask = _mm_setr_epi8(X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 6: mask = _mm_setr_epi8(X, X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 7: mask = _mm_setr_epi8(X, X, X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 8: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0); break;
+ case 9: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0); break;
+ case 10: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, 0, 0, 0, 0, 0, 0); break;
+ case 11: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, X, 0, 0, 0, 0, 0); break;
+ case 12: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, X, X, 0, 0, 0, 0); break;
+ case 13: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, X, X, X, 0, 0, 0); break;
+ case 14: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, X, X, X, X, 0, 0); break;
+ case 15: mask = _mm_setr_epi8(X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 0); break;
+#undef X
+ }
+ sad = _mm_add_epi32(sad, _mm_sad_epu8(_mm_and_si128(mask, a_trail),
+ _mm_and_si128(mask, b_trail)));
+ }
+ return sad;
+}
+#endif
+
+// Computes the sum of absolute differences between pattern and image. Pattern
+// must be 16-byte aligned, and the stride must be a multiple of 16. The image
+// does pointer does not have to be aligned.
+int SumOfAbsoluteDifferencesContiguousImage(
+ const unsigned char *pattern,
+ unsigned int pattern_width,
+ unsigned int pattern_height,
+ unsigned int pattern_stride,
+ const unsigned char *image,
+ unsigned int image_stride) {
+#ifdef __SSE2__
+ // TODO(keir): Add interleaved accumulation, where accumulation is done into
+ // two or more SSE registers that then get combined at the end. This reduces
+ // instruction dependency; in Eigen's squared norm code, splitting the
+ // accumulation produces a ~2x speedup. It's not clear it will help here,
+ // where the number of SSE instructions in the inner loop is smaller.
+ __m128i sad = _mm_setzero_si128();
+ for (int r = 0; r < pattern_height; ++r) {
+ sad = SumOfAbsoluteDifferencesContiguousSSE(&pattern[pattern_stride * r],
+ &image[image_stride * r],
+ pattern_width,
+ sad);
+ }
+ return _mm_cvtsi128_si32(
+ _mm_add_epi32(sad,
+ _mm_shuffle_epi32(sad, _MM_SHUFFLE(3, 0, 1, 2))));
+#else
+ int sad = 0;
+ for (int r = 0; r < pattern_height; ++r) {
+ for (int c = 0; c < pattern_width; ++c) {
+ sad += abs(pattern[pattern_stride * r + c] - image[image_stride * r + c]);
+ }
+ }
+ return sad;
+#endif
+}
+
+// Sample a region of size width, height centered at x,y in image, converting
+// from float to byte in the process. Samples from the first channel. Puts
+// result into *pattern.
+void SampleRectangularPattern(const FloatImage &image,
+ double x, double y,
+ int width,
+ int height,
+ int pattern_stride,
+ unsigned char *pattern) {
+ // There are two cases for width and height: even or odd. If it's odd, then
+ // the bounds [-width / 2, width / 2] works as expected. However, for even,
+ // this results in one extra access past the end. So use < instead of <= in
+ // the loops below, but increase the end limit by one in the odd case.
+ int end_width = (width / 2) + (width % 2);
+ int end_height = (height / 2) + (height % 2);
+ for (int r = -height / 2; r < end_height; ++r) {
+ for (int c = -width / 2; c < end_width; ++c) {
+ pattern[pattern_stride * (r + height / 2) + c + width / 2] =
+ SampleLinear(image, y + r, x + c, 0) * 255.0;
+ }
+ }
+}
+
+// Returns x rounded up to the nearest multiple of alignment.
+inline int PadToAlignment(int x, int alignment) {
+ if (x % alignment != 0) {
+ x += alignment - (x % alignment);
+ }
+ return x;
+}
+
+// Sample a region centered at x,y in image with size extending by half_width
+// from x. Samples from the first channel. The resulting array is placed in
+// *pattern, and the stride, which will be a multiple of 16 if SSE is enabled,
+// is returned in *pattern_stride.
+//
+// NOTE: Caller must free *pattern with aligned_malloc() from above.
+void SampleSquarePattern(const FloatImage &image,
+ double x, double y,
+ int half_width,
+ unsigned char **pattern,
+ int *pattern_stride) {
+ int width = 2 * half_width + 1;
+ // Allocate an aligned block with padding on the end so each row of the
+ // pattern starts on a 16-byte boundary.
+ *pattern_stride = PadToAlignment(width, 16);
+ int pattern_size_bytes = *pattern_stride * width;
+ *pattern = static_cast<unsigned char *>(
+ aligned_malloc(pattern_size_bytes, 16));
+ SampleRectangularPattern(image, x, y, width, width,
+ *pattern_stride,
+ *pattern);
+}
+
+// NOTE: Caller must free *image with aligned_malloc() from above.
+void FloatArrayToByteArrayWithPadding(const FloatImage &float_image,
+ unsigned char **image,
+ int *image_stride) {
+ // Allocate enough so that accessing 16 elements past the end is fine.
+ *image_stride = float_image.Width() + 16;
+ *image = static_cast<unsigned char *>(
+ aligned_malloc(*image_stride * float_image.Height(), 16));
+ for (int i = 0; i < float_image.Height(); ++i) {
+ for (int j = 0; j < float_image.Width(); ++j) {
+ (*image)[*image_stride * i + j] =
+ static_cast<unsigned char>(255.0 * float_image(i, j, 0));
+ }
+ }
+}
+
+} // namespace
+
+// TODO(keir): Compare the "sharpness" of the peak around the best pixel. It's
+// probably worth plotting a few examples to see what the histogram of SAD
+// values for every hypothesis looks like.
+//
+// TODO(keir): Priority queue for multiple hypothesis.
+bool BruteRegionTracker::Track(const FloatImage &image1,
+ const FloatImage &image2,
+ double x1, double y1,
+ double *x2, double *y2) const {
+ if (!RegionIsInBounds(image1, x1, y1, half_window_size)) {
+ LG << "Fell out of image1's window with x1=" << x1 << ", y1=" << y1
+ << ", hw=" << half_window_size << ".";
+ return false;
+ }
+ int pattern_width = 2 * half_window_size + 1;
+
+ Array3Df image_and_gradient1;
+ Array3Df image_and_gradient2;
+ BlurredImageAndDerivativesChannels(image1, 0.9, &image_and_gradient1);
+ BlurredImageAndDerivativesChannels(image2, 0.9, &image_and_gradient2);
+
+ // Sample the pattern to get it aligned to an image grid.
+ unsigned char *pattern;
+ int pattern_stride;
+ SampleSquarePattern(image_and_gradient1, x1, y1, half_window_size,
+ &pattern,
+ &pattern_stride);
+
+ // Convert the search area directly to bytes without sampling.
+ unsigned char *search_area;
+ int search_area_stride;
+ FloatArrayToByteArrayWithPadding(image_and_gradient2, &search_area, &search_area_stride);
+
+ // Try all possible locations inside the search area. Yes, everywhere.
+ int best_i, best_j, best_sad = INT_MAX;
+ for (int i = 0; i < image2.Height() - pattern_width; ++i) {
+ for (int j = 0; j < image2.Width() - pattern_width; ++j) {
+ int sad = SumOfAbsoluteDifferencesContiguousImage(pattern,
+ pattern_width,
+ pattern_width,
+ pattern_stride,
+ search_area + search_area_stride * i + j,
+ search_area_stride);
+ if (sad < best_sad) {
+ best_i = i;
+ best_j = j;
+ best_sad = sad;
+ }
+ }
+ }
+
+ aligned_free(pattern);
+ aligned_free(search_area);
+
+ if (best_sad != INT_MAX) {
+ *x2 = best_j + half_window_size;
+ *y2 = best_i + half_window_size;
+ return true;
+ }
+ return false;
+}
+
+} // namespace libmv
diff --git a/extern/libmv/libmv/tracking/brute_region_tracker.h b/extern/libmv/libmv/tracking/brute_region_tracker.h
new file mode 100644
index 00000000000..7a9b06d8a31
--- /dev/null
+++ b/extern/libmv/libmv/tracking/brute_region_tracker.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2011 libmv authors.
+//
+// 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 LIBMV_REGION_TRACKING_BRUTE_REGION_TRACKER_H_
+#define LIBMV_REGION_TRACKING_BRUTE_REGION_TRACKER_H_
+
+#include "libmv/image/image.h"
+#include "libmv/tracking/region_tracker.h"
+
+namespace libmv {
+
+struct BruteRegionTracker : public RegionTracker {
+ BruteRegionTracker() : half_window_size(4) {}
+
+ virtual ~BruteRegionTracker() {}
+
+ // Tracker interface.
+ virtual bool Track(const FloatImage &image1,
+ const FloatImage &image2,
+ double x1, double y1,
+ double *x2, double *y2) const;
+
+ // No point in creating getters or setters.
+ int half_window_size;
+};
+
+} // namespace libmv
+
+#endif // LIBMV_REGION_TRACKING_BRUTE_REGION_TRACKER_H_
diff --git a/extern/libmv/libmv/tracking/esm_region_tracker.cc b/extern/libmv/libmv/tracking/esm_region_tracker.cc
index 844b5ff3cb9..9784b61c068 100644
--- a/extern/libmv/libmv/tracking/esm_region_tracker.cc
+++ b/extern/libmv/libmv/tracking/esm_region_tracker.cc
@@ -273,10 +273,30 @@ bool EsmRegionTracker::Track(const FloatImage &image1,
// If the step was accepted, then check for termination.
if (d.squaredNorm() < min_update_squared_distance) {
- if (new_error > reasonable_error) {
- LG << "Update size shrank but reasonable error ("
- << reasonable_error << ") not achieved; failing.";
- return true; // XXX
+ // Compute the Pearson product-moment correlation coefficient to check
+ // for sanity.
+ // TODO(keir): Put this somewhere smarter.
+ double sX=0,sY=0,sXX=0,sYY=0,sXY=0;
+ for (int r = 0; r < width; ++r) {
+ for (int c = 0; c < width; ++c) {
+ double x = image_and_gradient1_sampled(r, c, 0);
+ double y = image_and_gradient2_sampled[new_image](r, c, 0);
+ sX += x;
+ sY += y;
+ sXX += x*x;
+ sYY += y*y;
+ sXY += x*y;
+ }
+ }
+ double N = width*width;
+ sX /= N, sY /= N, sXX /= N, sYY /= N, sXY /= N;
+ double correlation = (sXY-sX*sY)/sqrt(double((sXX-sX*sX)*(sYY-sY*sY)));
+ LG << "Final correlation: " << correlation;
+
+ if (correlation < minimum_correlation) {
+ LG << "Correlation " << correlation << " greater than "
+ << minimum_correlation << "; bailing.";
+ return false;
}
LG << "Successful track in " << (i + 1) << " iterations.";
return true;
diff --git a/extern/libmv/libmv/tracking/esm_region_tracker.h b/extern/libmv/libmv/tracking/esm_region_tracker.h
index c63417201ad..602b32f1675 100644
--- a/extern/libmv/libmv/tracking/esm_region_tracker.h
+++ b/extern/libmv/libmv/tracking/esm_region_tracker.h
@@ -38,7 +38,8 @@ struct EsmRegionTracker : public RegionTracker {
max_iterations(16),
min_determinant(1e-6),
min_update_squared_distance(1e-4),
- sigma(0.9) {}
+ sigma(0.9),
+ minimum_correlation(0.78) {}
virtual ~EsmRegionTracker() {}
@@ -54,6 +55,7 @@ struct EsmRegionTracker : public RegionTracker {
double min_determinant;
double min_update_squared_distance;
double sigma;
+ double minimum_correlation;
};
} // namespace libmv
diff --git a/extern/libmv/libmv/tracking/hybrid_region_tracker.cc b/extern/libmv/libmv/tracking/hybrid_region_tracker.cc
new file mode 100644
index 00000000000..ea3b0f5bfc0
--- /dev/null
+++ b/extern/libmv/libmv/tracking/hybrid_region_tracker.cc
@@ -0,0 +1,67 @@
+// Copyright (c) 2011 libmv authors.
+//
+// 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 "libmv/tracking/hybrid_region_tracker.h"
+
+#include "libmv/image/image.h"
+#include "libmv/image/convolve.h"
+#include "libmv/image/sample.h"
+#include "libmv/logging/logging.h"
+
+namespace libmv {
+
+bool HybridRegionTracker::Track(const FloatImage &image1,
+ const FloatImage &image2,
+ double x1, double y1,
+ double *x2, double *y2) const {
+ double x2_coarse = *x2;
+ double y2_coarse = *y2;
+ if (!coarse_tracker_->Track(image1, image2, x1, y1, &x2_coarse, &y2_coarse)) {
+ LG << "Coarse tracker failed.";
+ return false;
+ }
+
+ double x2_fine = x2_coarse;
+ double y2_fine = y2_coarse;
+ if (!fine_tracker_->Track(image1, image2, x1, y1, &x2_fine, &y2_fine)) {
+ LG << "Fine tracker failed.";
+ return false;
+ }
+
+ // Calculate the shift done by the fine tracker.
+ double dx2 = x2_coarse - x2_fine;
+ double dy2 = y2_coarse - y2_fine;
+ double fine_shift = sqrt(dx2 * dx2 + dy2 * dy2);
+
+ LG << "Refinement: dx=" << dx2 << " dy=" << dy2 << ", d=" << fine_shift;
+
+ // If the fine tracker shifted the window by more than a pixel, then
+ // something bad probably happened and we should give up tracking.
+ if (fine_shift < 2.0) {
+ LG << "Refinement small enough; success.";
+ *x2 = x2_fine;
+ *y2 = y2_fine;
+ return true;
+ }
+ LG << "Refinement was too big; failing.";
+ return false;
+}
+
+} // namespace libmv
diff --git a/extern/libmv/libmv/tracking/hybrid_region_tracker.h b/extern/libmv/libmv/tracking/hybrid_region_tracker.h
new file mode 100644
index 00000000000..a18341f0ce4
--- /dev/null
+++ b/extern/libmv/libmv/tracking/hybrid_region_tracker.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2011 libmv authors.
+//
+// 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 LIBMV_REGION_TRACKING_HYBRID_REGION_TRACKER_H_
+#define LIBMV_REGION_TRACKING_HYBRID_REGION_TRACKER_H_
+
+#include "libmv/image/image.h"
+#include "libmv/base/scoped_ptr.h"
+#include "libmv/tracking/region_tracker.h"
+
+namespace libmv {
+
+// TODO(keir): Documentation!
+class HybridRegionTracker : public RegionTracker {
+ public:
+ HybridRegionTracker(RegionTracker *coarse_tracker,
+ RegionTracker *fine_tracker)
+ : coarse_tracker_(coarse_tracker),
+ fine_tracker_(fine_tracker) {}
+
+ virtual ~HybridRegionTracker() {}
+
+ // Tracker interface.
+ virtual bool Track(const FloatImage &image1,
+ const FloatImage &image2,
+ double x1, double y1,
+ double *x2, double *y2) const;
+
+ scoped_ptr<RegionTracker> coarse_tracker_;
+ scoped_ptr<RegionTracker> fine_tracker_;
+};
+
+} // namespace libmv
+
+#endif // LIBMV_REGION_TRACKING_HYBRID_REGION_TRACKER_H_
diff --git a/extern/libmv/mkfiles.sh b/extern/libmv/mkfiles.sh
index 6618f2849ea..fe84c357de4 100755
--- a/extern/libmv/mkfiles.sh
+++ b/extern/libmv/mkfiles.sh
@@ -1,4 +1,4 @@
#!/bin/sh
-find ./libmv/ -type f | sed -r 's/^\.\///' > files.txt
-find ./third_party/ -type f | sed -r 's/^\.\///' >> files.txt
+find ./libmv/ -type f | sed -r 's/^\.\///' | sort > files.txt
+find ./third_party/ -type f | sed -r 's/^\.\///' | sort >> files.txt
diff --git a/extern/libmv/third_party/glog/src/config.h b/extern/libmv/third_party/glog/src/config.h
index 06ed686f87c..49c0d8905b0 100644
--- a/extern/libmv/third_party/glog/src/config.h
+++ b/extern/libmv/third_party/glog/src/config.h
@@ -4,6 +4,8 @@
/* Namespace for Google classes */
#ifdef __APPLE__
#include "config_mac.h"
+#elif __FreeBSD__
+ #include "config_freebsd.h"
#elif __MINGW32__
#include "windows/config.h"
#elif __GNUC__
diff --git a/extern/libmv/third_party/glog/src/config_freebsd.h b/extern/libmv/third_party/glog/src/config_freebsd.h
new file mode 100644
index 00000000000..caaef9d998b
--- /dev/null
+++ b/extern/libmv/third_party/glog/src/config_freebsd.h
@@ -0,0 +1,161 @@
+/* src/config.h. Generated from config.h.in by configure. */
+/* src/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Namespace for Google classes */
+#define GOOGLE_NAMESPACE google
+
+/* Define if you have the `dladdr' function */
+/* #undef HAVE_DLADDR */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#define HAVE_EXECINFO_H 1
+
+/* Define if you have the `fcntl' function */
+#define HAVE_FCNTL 1
+
+/* Define to 1 if you have the <glob.h> header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_LIBPTHREAD 1
+
+/* Define to 1 if you have the <libunwind.h> header file. */
+/* #undef HAVE_LIBUNWIND_H */
+
+/* define if you have google gflags library */
+#define HAVE_LIB_GFLAGS 1
+
+/* define if you have google gmock library */
+/* #undef HAVE_LIB_GMOCK */
+
+/* define if you have google gtest library */
+/* #undef HAVE_LIB_GTEST */
+
+/* define if you have libunwind */
+/* #undef HAVE_LIB_UNWIND */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* define if the compiler implements namespaces */
+#define HAVE_NAMESPACES 1
+
+/* Define if you have POSIX threads libraries and header files. */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* define if the compiler implements pthread_rwlock_* */
+#define HAVE_RWLOCK 1
+
+/* Define if you have the `sigaltstack' function */
+#define HAVE_SIGALTSTACK 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <syscall.h> header file. */
+/* #undef HAVE_SYSCALL_H */
+
+/* Define to 1 if you have the <syslog.h> header file. */
+#define HAVE_SYSLOG_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+#define HAVE_SYS_SYSCALL_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/ucontext.h> header file. */
+#define HAVE_SYS_UCONTEXT_H 1
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#define HAVE_SYS_UTSNAME_H 1
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+#define HAVE_UCONTEXT_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* define if the compiler supports using expression for operator */
+#define HAVE_USING_OPERATOR 1
+
+/* define if your compiler has __attribute__ */
+#define HAVE___ATTRIBUTE__ 1
+
+/* define if your compiler has __builtin_expect */
+#define HAVE___BUILTIN_EXPECT 1
+
+/* define if your compiler has __sync_val_compare_and_swap */
+/* #undef HAVE___SYNC_VAL_COMPARE_AND_SWAP */
+
+/* Name of package */
+#define PACKAGE "glog"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "opensource@google.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "glog"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "glog 0.3.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "glog"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.3.1"
+
+/* How to access the PC from a struct ucontext */
+/* #define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP] */
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* The size of `void *', as computed by sizeof. */
+#define SIZEOF_VOID_P 8
+
+/* Define to 1 if you have the ANSI C header files. */
+/* #undef STDC_HEADERS */
+
+#define STDC_HEADERS 1
+/* the namespace where STL code like vector<> is defined */
+#define STL_NAMESPACE std
+
+/* location of source code */
+#define TEST_SRC_DIR "."
+
+/* Version number of package */
+#define VERSION "0.3.1"
+
+/* Stops putting the code inside the Google namespace */
+#define _END_GOOGLE_NAMESPACE_ }
+
+/* Puts following code inside the Google namespace */
+#define _START_GOOGLE_NAMESPACE_ namespace google {
+
diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt
index 0f7672595d7..9f5217e68e3 100644
--- a/intern/CMakeLists.txt
+++ b/intern/CMakeLists.txt
@@ -36,6 +36,10 @@ if(WITH_AUDASPACE)
add_subdirectory(audaspace)
endif()
+if(WITH_MOD_REMESH)
+ add_subdirectory(dualcon)
+endif()
+
if(WITH_MOD_FLUID)
add_subdirectory(elbeem)
endif()
diff --git a/intern/SConscript b/intern/SConscript
index c13714543cb..bb19426263a 100644
--- a/intern/SConscript
+++ b/intern/SConscript
@@ -22,6 +22,9 @@ SConscript(['audaspace/SConscript',
# perhaps get rid of intern/csg?
NEW_CSG='false'
+if env ['WITH_BF_REMESH']:
+ SConscript(['dualcon/SConscript'])
+
if env['WITH_BF_FLUID']:
SConscript(['elbeem/SConscript'])
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp
index 7455e24cdc0..9100a277124 100644
--- a/intern/audaspace/intern/AUD_C-API.cpp
+++ b/intern/audaspace/intern/AUD_C-API.cpp
@@ -137,8 +137,21 @@ int AUD_init(AUD_DeviceType device, AUD_DeviceSpecs specs, int buffersize)
#endif
#ifdef WITH_JACK
case AUD_JACK_DEVICE:
- dev = new AUD_JackDevice("Blender", specs, buffersize);
- break;
+#ifdef __APPLE__
+ struct stat st;
+ if(stat("/Library/Frameworks/Jackmp.framework", &st) != 0)
+ {
+ printf("Warning: Jack Framework not installed\n");
+ // No break, fall through to default, to return false
+ }
+ else
+ {
+#endif
+ dev = new AUD_JackDevice("Blender", specs, buffersize);
+ break;
+#ifdef __APPLE__
+ }
+#endif
#endif
default:
return false;
diff --git a/intern/audaspace/intern/AUD_SoftwareDevice.cpp b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
index b1e5d8ccd75..1d993abab73 100644
--- a/intern/audaspace/intern/AUD_SoftwareDevice.cpp
+++ b/intern/audaspace/intern/AUD_SoftwareDevice.cpp
@@ -121,7 +121,9 @@ void AUD_SoftwareDevice::AUD_SoftwareHandle::update()
if(flags & AUD_RENDER_DISTANCE)
{
- if(m_device->m_distance_model == AUD_DISTANCE_MODEL_INVERSE_CLAMPED || m_device->m_distance_model == AUD_DISTANCE_MODEL_LINEAR_CLAMPED || m_device->m_distance_model == AUD_DISTANCE_MODEL_EXPONENT_CLAMPED)
+ if(m_device->m_distance_model == AUD_DISTANCE_MODEL_INVERSE_CLAMPED ||
+ m_device->m_distance_model == AUD_DISTANCE_MODEL_LINEAR_CLAMPED ||
+ m_device->m_distance_model == AUD_DISTANCE_MODEL_EXPONENT_CLAMPED)
{
distance = AUD_MAX(AUD_MIN(m_distance_max, distance), m_distance_reference);
}
diff --git a/intern/audaspace/jack/AUD_JackDevice.h b/intern/audaspace/jack/AUD_JackDevice.h
index 3813685dbb6..6373d4f9d6d 100644
--- a/intern/audaspace/jack/AUD_JackDevice.h
+++ b/intern/audaspace/jack/AUD_JackDevice.h
@@ -36,6 +36,10 @@
#include <string>
+#if defined(__APPLE__) // always first include for jack weaklinking !
+#include <weakjack.h>
+#endif
+
#include <jack.h>
#include <ringbuffer.h>
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
index 9a79c412e4f..543e7e087b1 100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
+++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
@@ -202,7 +202,7 @@ Operate(
}
- void
+ void
BSP_GhostTestApp3D::
UpdateFrame(
){
@@ -210,9 +210,9 @@ if (m_window) {
GHOST_Rect v_rect;
m_window->getClientBounds(v_rect);
-
+
glViewport(0,0,v_rect.getWidth(),v_rect.getHeight());
-
+
}
}
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index c5c4f6b22a6..114ff47663b 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -10,12 +10,14 @@ include(cmake/external_libs.cmake)
if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
set(WITH_CYCLES_OPTIMIZED_KERNEL ON)
+endif()
- if(WIN32 AND MSVC)
- set(CYCLES_OPTIMIZED_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast")
- elseif(CMAKE_COMPILER_IS_GNUCC)
- set(CYCLES_OPTIMIZED_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3")
- endif()
+if(WIN32 AND MSVC)
+ set(CYCLES_OPTIMIZED_KERNEL_FLAGS "/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast -D_CRT_SECURE_NO_WARNINGS /EHsc")
+elseif(CMAKE_COMPILER_IS_GNUCC)
+ set(CYCLES_OPTIMIZED_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mfpmath=sse")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
endif()
# for OSL, not needed yet
@@ -34,19 +36,19 @@ if(WITH_CYCLES_OPTIMIZED_KERNEL)
endif()
if(WITH_CYCLES_NETWORK)
- add_definitions(-DWITH_NETWORK)
+ add_definitions(-DWITH_NETWORK)
endif()
if(WITH_CYCLES_OSL)
- add_definitions(-DWITH_OSL)
+ add_definitions(-DWITH_OSL)
endif()
if(WITH_CYCLES_PARTIO)
- add_definitions(-DWITH_PARTIO)
+ add_definitions(-DWITH_PARTIO)
endif()
if(WITH_CYCLES_CUDA_BINARIES)
- add_definitions(-DWITH_CUDA_BINARIES)
+ add_definitions(-DWITH_CUDA_BINARIES)
endif()
add_definitions(-DWITH_OPENCL)
diff --git a/intern/cycles/SConscript b/intern/cycles/SConscript
index ecd22f654e8..bc9eb563e50 100644
--- a/intern/cycles/SConscript
+++ b/intern/cycles/SConscript
@@ -14,6 +14,7 @@ sources.remove(path.join('kernel', 'kernel_optimized.cpp'))
incs = []
defs = []
+cxxflags = []
defs.append('CCL_NAMESPACE_BEGIN=namespace ccl {')
defs.append('CCL_NAMESPACE_END=}')
@@ -22,7 +23,7 @@ defs.append('WITH_OPENCL')
defs.append('WITH_MULTI')
defs.append('WITH_CUDA')
-if env['WITH_BF_CYCLES_BINARIES']:
+if env['WITH_BF_CYCLES_CUDA_BINARIES']:
defs.append('WITH_CUDA_BINARIES')
incs.extend('. bvh render device kernel kernel/osl kernel/svm util subd'.split())
@@ -33,20 +34,31 @@ incs.append(cycles['BF_OIIO_INC'])
incs.append(cycles['BF_BOOST_INC'])
incs.append(cycles['BF_PYTHON_INC'])
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ cxxflags.append('-D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split())
+else:
+ cxxflags.append('-ffast-math'.split())
+
# optimized kernel
if env['WITH_BF_RAYOPTIMIZATION']:
optim_cxxflags = []
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
- optim_cxxflags.append('/Ox /Ot /arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /EHsc /fp:fast'.split())
+ optim_cxxflags.append('/arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc'.split())
else:
- optim_cxxflags.append('-ffast-math -msse -msse2 -msse3'.split())
+ optim_cxxflags.append('-ffast-math -msse -msse2 -msse3 -mfpmath=sse'.split())
- optim_defs = defs + ['WITH_OPTIMIZED_KERNEL']
+ defs.append('WITH_OPTIMIZED_KERNEL')
+ optim_defs = defs[:]
optim_sources = [path.join('kernel', 'kernel_optimized.cpp')]
cycles_optim = cycles.Clone()
- cycles_optim.BlenderLib('bf_intern_cycles_optimized', optim_sources, incs, optim_defs, libtype=['intern'], priority=[0], compileflags=[None], cxx_compileflags=optim_cxxflags)
+ cycles_optim.BlenderLib('bf_intern_cycles_optimized', optim_sources, incs, optim_defs, libtype=['intern'], priority=[10], compileflags=[None], cxx_compileflags=optim_cxxflags)
+
+cycles.BlenderLib('bf_intern_cycles', sources, incs, defs, libtype=['intern'], priority=[0], compileflags=[None], cxx_compileflags=cxxflags)
-cycles.BlenderLib('bf_intern_cycles', sources, incs, defs, libtype=['intern'], priority=[0], compileflags=[None])
+# cuda kernel binaries
+if env['WITH_BF_CYCLES_CUDA_BINARIES']:
+ kernel_binaries = SConscript(['kernel/SConscript'])
+ cycles.Depends("device/device_cuda.o", kernel_binaries)
diff --git a/intern/cycles/app/cycles_test.cpp b/intern/cycles/app/cycles_test.cpp
index 27e53ded6db..d9386f75141 100644
--- a/intern/cycles/app/cycles_test.cpp
+++ b/intern/cycles/app/cycles_test.cpp
@@ -82,10 +82,21 @@ static void session_print_status()
session_print(status);
}
+static BufferParams& session_buffer_params()
+{
+ static BufferParams buffer_params;
+ buffer_params.width = options.width;
+ buffer_params.height = options.height;
+ buffer_params.full_width = options.width;
+ buffer_params.full_height = options.height;
+
+ return buffer_params;
+}
+
static void session_init()
{
options.session = new Session(options.session_params);
- options.session->reset(options.width, options.height, options.session_params.samples);
+ options.session->reset(session_buffer_params(), options.session_params.samples);
options.session->scene = options.scene;
if(options.session_params.background && !options.quiet)
@@ -98,12 +109,15 @@ static void session_init()
options.scene = NULL;
}
-static void scene_init()
+static void scene_init(int width, int height)
{
options.scene = new Scene(options.scene_params);
xml_read_file(options.scene, options.filepath.c_str());
- options.width = options.scene->camera->width;
- options.height = options.scene->camera->height;
+
+ if (width == 0 || height == 0) {
+ options.width = options.scene->camera->width;
+ options.height = options.scene->camera->height;
+ }
}
static void session_exit()
@@ -151,7 +165,7 @@ static void display_info(Progress& progress)
static void display()
{
- options.session->draw(options.width, options.height);
+ options.session->draw(session_buffer_params());
display_info(options.session->progress);
}
@@ -162,13 +176,13 @@ static void resize(int width, int height)
options.height= height;
if(options.session)
- options.session->reset(options.width, options.height, options.session_params.samples);
+ options.session->reset(session_buffer_params(), options.session_params.samples);
}
void keyboard(unsigned char key)
{
if(key == 'r')
- options.session->reset(options.width, options.height, options.session_params.samples);
+ options.session->reset(session_buffer_params(), options.session_params.samples);
else if(key == 27) // escape
options.session->progress.set_cancel("Cancelled");
}
@@ -183,8 +197,8 @@ static int files_parse(int argc, const char *argv[])
static void options_parse(int argc, const char **argv)
{
- options.width= 1024;
- options.height= 512;
+ options.width= 0;
+ options.height= 0;
options.filepath = "";
options.session = NULL;
options.quiet = false;
@@ -223,6 +237,8 @@ static void options_parse(int argc, const char **argv)
"--samples %d", &options.session_params.samples, "Number of samples to render",
"--output %s", &options.session_params.output_path, "File path to write output image",
"--threads %d", &options.session_params.threads, "CPU Rendering Threads",
+ "--width %d", &options.width, "Window width in pixel",
+ "--height %d", &options.height, "Window height in pixel",
"--help", &help, "Print help message",
NULL);
@@ -276,7 +292,7 @@ static void options_parse(int argc, const char **argv)
}
/* load scene */
- scene_init();
+ scene_init(options.width, options.height);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp
index 5f9e1d7a5ff..e29a73ec9e8 100644
--- a/intern/cycles/app/cycles_xml.cpp
+++ b/intern/cycles/app/cycles_xml.cpp
@@ -257,8 +257,18 @@ static void xml_read_integrator(const XMLReadState& state, pugi::xml_node node)
xml_read_int(&integrator->min_bounce, node, "min_bounce");
xml_read_int(&integrator->max_bounce, node, "max_bounce");
+
+ xml_read_int(&integrator->max_diffuse_bounce, node, "max_diffuse_bounce");
+ xml_read_int(&integrator->max_glossy_bounce, node, "max_glossy_bounce");
+ xml_read_int(&integrator->max_transmission_bounce, node, "max_transmission_bounce");
+
+ xml_read_int(&integrator->transparent_min_bounce, node, "transparent_min_bounce");
+ xml_read_int(&integrator->transparent_max_bounce, node, "transparent_max_bounce");
+
+ xml_read_bool(&integrator->transparent_shadows, node, "transparent_shadows");
xml_read_bool(&integrator->no_caustics, node, "no_caustics");
- xml_read_float(&integrator->blur_caustics, node, "blur_caustics");
+
+ xml_read_int(&integrator->seed, node, "seed");
}
/* Camera */
@@ -339,66 +349,38 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
else if(string_iequals(node.name(), "noise_texture")) {
snode = new NoiseTextureNode();
}
- else if(string_iequals(node.name(), "blend_texture")) {
- BlendTextureNode *blend = new BlendTextureNode();
- xml_read_enum(&blend->progression, BlendTextureNode::progression_enum, node, "progression");
- xml_read_enum(&blend->axis, BlendTextureNode::axis_enum, node, "axis");
+ else if(string_iequals(node.name(), "gradient_texture")) {
+ GradientTextureNode *blend = new GradientTextureNode();
+ xml_read_enum(&blend->type, GradientTextureNode::type_enum, node, "type");
snode = blend;
}
- else if(string_iequals(node.name(), "clouds_texture")) {
- CloudsTextureNode *clouds = new CloudsTextureNode();
- xml_read_bool(&clouds->hard, node, "hard");
- xml_read_int(&clouds->depth, node, "depth");
- xml_read_enum(&clouds->basis, CloudsTextureNode::basis_enum, node, "basis");
- snode = clouds;
- }
else if(string_iequals(node.name(), "voronoi_texture")) {
VoronoiTextureNode *voronoi = new VoronoiTextureNode();
- xml_read_enum(&voronoi->distance_metric, VoronoiTextureNode::distance_metric_enum, node, "distance_metric");
xml_read_enum(&voronoi->coloring, VoronoiTextureNode::coloring_enum, node, "coloring");
snode = voronoi;
}
else if(string_iequals(node.name(), "musgrave_texture")) {
MusgraveTextureNode *musgrave = new MusgraveTextureNode();
xml_read_enum(&musgrave->type, MusgraveTextureNode::type_enum, node, "type");
- xml_read_enum(&musgrave->basis, MusgraveTextureNode::basis_enum, node, "basis");
snode = musgrave;
}
- else if(string_iequals(node.name(), "marble_texture")) {
- MarbleTextureNode *marble = new MarbleTextureNode();
- xml_read_enum(&marble->type, MarbleTextureNode::type_enum, node, "type");
- xml_read_enum(&marble->wave, MarbleTextureNode::wave_enum, node, "wave");
- xml_read_enum(&marble->basis, MarbleTextureNode::basis_enum, node, "basis");
- xml_read_bool(&marble->hard, node, "hard");
- xml_read_int(&marble->depth, node, "depth");
- snode = marble;
- }
else if(string_iequals(node.name(), "magic_texture")) {
MagicTextureNode *magic = new MagicTextureNode();
xml_read_int(&magic->depth, node, "depth");
snode = magic;
}
- else if(string_iequals(node.name(), "stucci_texture")) {
- StucciTextureNode *stucci = new StucciTextureNode();
- xml_read_enum(&stucci->type, StucciTextureNode::type_enum, node, "type");
- xml_read_enum(&stucci->basis, StucciTextureNode::basis_enum, node, "basis");
- xml_read_bool(&stucci->hard, node, "hard");
- snode = stucci;
- }
- else if(string_iequals(node.name(), "distorted_noise_texture")) {
- DistortedNoiseTextureNode *dist = new DistortedNoiseTextureNode();
- xml_read_enum(&dist->basis, DistortedNoiseTextureNode::basis_enum, node, "basis");
- xml_read_enum(&dist->distortion_basis, DistortedNoiseTextureNode::basis_enum, node, "distortion_basis");
+ else if(string_iequals(node.name(), "noise_texture")) {
+ NoiseTextureNode *dist = new NoiseTextureNode();
snode = dist;
}
- else if(string_iequals(node.name(), "wood_texture")) {
- WoodTextureNode *wood = new WoodTextureNode();
- xml_read_enum(&wood->type, WoodTextureNode::type_enum, node, "type");
- xml_read_enum(&wood->wave, WoodTextureNode::wave_enum, node, "wave");
- xml_read_enum(&wood->basis, WoodTextureNode::basis_enum, node, "basis");
- xml_read_bool(&wood->hard, node, "hard");
+ else if(string_iequals(node.name(), "wave_texture")) {
+ WaveTextureNode *wood = new WaveTextureNode();
+ xml_read_enum(&wood->type, WaveTextureNode::type_enum, node, "type");
snode = wood;
}
+ else if(string_iequals(node.name(), "normal")) {
+ snode = new NormalNode();
+ }
else if(string_iequals(node.name(), "mapping")) {
snode = new MappingNode();
}
@@ -466,16 +448,34 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
else if(string_iequals(node.name(), "add_closure")) {
snode = new AddClosureNode();
}
+ else if(string_iequals(node.name(), "invert")) {
+ snode = new InvertNode();
+ }
else if(string_iequals(node.name(), "mix")) {
MixNode *mix = new MixNode();
xml_read_enum(&mix->type, MixNode::type_enum, node, "type");
snode = mix;
}
+ else if(string_iequals(node.name(), "gamma")) {
+ snode = new GammaNode();
+ }
+ else if(string_iequals(node.name(), "combine_rgb")) {
+ snode = new CombineRGBNode();
+ }
+ else if(string_iequals(node.name(), "separate_rgb")) {
+ snode = new SeparateRGBNode();
+ }
+ else if(string_iequals(node.name(), "hsv")) {
+ snode = new HSVNode();
+ }
else if(string_iequals(node.name(), "attribute")) {
AttributeNode *attr = new AttributeNode();
xml_read_ustring(&attr->attribute, node, "attribute");
snode = attr;
}
+ else if(string_iequals(node.name(), "camera")) {
+ snode = new CameraNode();
+ }
else if(string_iequals(node.name(), "fresnel")) {
snode = new FresnelNode();
}
diff --git a/intern/cycles/blender/addon/xml.py b/intern/cycles/app/io_export_cycles_xml.py
index f17051d92dc..2314d935214 100644
--- a/intern/cycles/blender/addon/xml.py
+++ b/intern/cycles/app/io_export_cycles_xml.py
@@ -16,16 +16,15 @@
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-# <pep8 compliant>
-
# XML exporter for generating test files, not intended for end users
import os
-import bpy
-from bpy_extras.io_utils import ExportHelper
import xml.etree.ElementTree as etree
import xml.dom.minidom as dom
+import bpy
+from bpy_extras.io_utils import ExportHelper
+from bpy.props import PointerProperty, StringProperty
def strip(root):
root.text = None
@@ -34,7 +33,6 @@ def strip(root):
for elem in root:
strip(elem)
-
def write(node, fname):
strip(node)
@@ -43,10 +41,51 @@ def write(node, fname):
f = open(fname, "w")
f.write(s)
+
+class CyclesXMLSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Scene.cycles_xml = PointerProperty(
+ type=cls,
+ name="Cycles XML export Settings",
+ description="Cycles XML export settings")
+ cls.filepath = StringProperty(
+ name='Filepath',
+ description='Filepath for the .xml file',
+ maxlen=256,
+ default='',
+ subtype='FILE_PATH')
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Scene.cycles_xml
+
+# User Interface Drawing Code
+class RenderButtonsPanel():
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "render"
+ @classmethod
+ def poll(self, context):
+ rd = context.scene.render
+ return rd.engine == 'CYCLES'
+
+
+class PHYSICS_PT_fluid_export(RenderButtonsPanel, bpy.types.Panel):
+ bl_label = "Cycles XML Exporter"
+
+ def draw(self, context):
+ layout = self.layout
+
+ cycles = context.scene.cycles_xml
+
+ #layout.prop(cycles, "filepath")
+ layout.operator("export_mesh.cycles_xml")
+
+# Export Operator
class ExportCyclesXML(bpy.types.Operator, ExportHelper):
- ''''''
bl_idname = "export_mesh.cycles_xml"
bl_label = "Export Cycles XML"
@@ -61,12 +100,12 @@ class ExportCyclesXML(bpy.types.Operator, ExportHelper):
# get mesh
scene = context.scene
- obj = context.object
+ object = context.active_object
- if not obj:
+ if not object:
raise Exception("No active object")
- mesh = obj.to_mesh(scene, True, 'PREVIEW')
+ mesh = object.to_mesh(scene, True, 'PREVIEW')
if not mesh:
raise Exception("No mesh data in active object")
@@ -87,19 +126,18 @@ class ExportCyclesXML(bpy.types.Operator, ExportHelper):
verts += " "
node = etree.Element('mesh', attrib={'nverts': nverts, 'verts': verts, 'P': P})
-
+
# write to file
write(node, filepath)
return {'FINISHED'}
-
def register():
- pass
-
+ bpy.utils.register_module(__name__)
def unregister():
- pass
+ bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()
+
diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt
index b96048acf05..3b685346791 100644
--- a/intern/cycles/blender/CMakeLists.txt
+++ b/intern/cycles/blender/CMakeLists.txt
@@ -39,7 +39,6 @@ set(ADDON_FILES
addon/presets.py
addon/properties.py
addon/ui.py
- addon/xml.py
)
blender_add_lib(bf_intern_cycles "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index 34ed3dd8072..a82d69903a8 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -33,7 +33,7 @@ bl_info = {
"category": "Render"}
import bpy
-from . import ui, properties, xml, engine, presets
+from . import ui, properties, engine, presets
class CyclesRender(bpy.types.RenderEngine):
@@ -77,13 +77,11 @@ class CyclesRender(bpy.types.RenderEngine):
def register():
properties.register()
ui.register()
- xml.register()
presets.register()
bpy.utils.register_module(__name__)
def unregister():
- xml.unregister()
ui.unregister()
properties.unregister()
presets.unregister()
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index 2fedd2c0afa..3d71c25d7ad 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -22,17 +22,17 @@ import bpy
def init():
- import bcycles
+ import _cycles
import os.path
path = os.path.dirname(__file__)
user_path = os.path.dirname(os.path.abspath(bpy.utils.user_resource('CONFIG', '')))
- bcycles.init(path, user_path)
+ _cycles.init(path, user_path)
def create(engine, data, scene, region=0, v3d=0, rv3d=0):
- import bcycles
+ import _cycles
data = data.as_pointer()
scene = scene.as_pointer()
@@ -43,46 +43,42 @@ def create(engine, data, scene, region=0, v3d=0, rv3d=0):
if rv3d:
rv3d = rv3d.as_pointer()
- engine.session = bcycles.create(engine.as_pointer(), data, scene, region, v3d, rv3d)
+ engine.session = _cycles.create(engine.as_pointer(), data, scene, region, v3d, rv3d)
def free(engine):
if hasattr(engine, "session"):
if engine.session:
- import bcycles
- bcycles.free(engine.session)
+ import _cycles
+ _cycles.free(engine.session)
del engine.session
def render(engine):
- import bcycles
+ import _cycles
if hasattr(engine, "session"):
- bcycles.render(engine.session)
+ _cycles.render(engine.session)
def update(engine, data, scene):
- import bcycles
- if scene.render.use_border:
- engine.report({'ERROR'}, "Border rendering not supported yet")
- free(engine)
- else:
- bcycles.sync(engine.session)
+ import _cycles
+ _cycles.sync(engine.session)
def draw(engine, region, v3d, rv3d):
- import bcycles
+ import _cycles
v3d = v3d.as_pointer()
rv3d = rv3d.as_pointer()
# draw render image
- bcycles.draw(engine.session, v3d, rv3d)
+ _cycles.draw(engine.session, v3d, rv3d)
def available_devices():
- import bcycles
- return bcycles.available_devices()
+ import _cycles
+ return _cycles.available_devices()
def with_osl():
- import bcycles
- return bcycles.with_osl()
+ import _cycles
+ return _cycles.with_osl
diff --git a/intern/cycles/blender/addon/enums.py b/intern/cycles/blender/addon/enums.py
index 581dc08436a..a11f5ca0f87 100644
--- a/intern/cycles/blender/addon/enums.py
+++ b/intern/cycles/blender/addon/enums.py
@@ -41,7 +41,12 @@ devices = (
gpu_type = (
("CUDA", "CUDA", "NVidia only"),
- ("OPENCL", "OpenCL (incomplete)", ""),
+ ("OPENCL", "OpenCL", ""),
+ )
+
+feature_set = (
+ ("SUPPORTED", "Supported", "Only use finished and supported features"),
+ ("EXPERIMENTAL", "Experimental", "Use experimental and incomplete features that might be broken or change in the future"),
)
shading_systems = (
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 37de27dc6b4..0ea7396f9c2 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -41,6 +41,9 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
cls.gpu_type = EnumProperty(name="GPU Type", description="Processing system to use on the GPU",
items=enums.gpu_type, default="CUDA")
+ cls.feature_set = EnumProperty(name="Feature Set", description="Feature set to use for rendering",
+ items=enums.feature_set, default="SUPPORTED")
+
cls.shading_system = EnumProperty(name="Shading System", description="Shading system to use for rendering",
items=enums.shading_systems, default="GPU_COMPATIBLE")
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index ca733c6eeb0..6e73795666e 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -160,18 +160,17 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
scene = context.scene
rd = scene.render
- # row = layout.row()
- # row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
+ row = layout.row()
+ row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
- # col = row.column(align=True)
- # col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
- # col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
+ col = row.column(align=True)
+ col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
+ col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
row = layout.row()
- # rl = rd.layers.active
- rl = rd.layers[0]
+ rl = rd.layers.active
row.prop(rl, "name")
- #row.prop(rd, "use_single_layer", text="", icon_only=True)
+ row.prop(rd, "use_single_layer", text="", icon_only=True)
split = layout.split()
@@ -183,6 +182,7 @@ class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
layout.separator()
+ rl = rd.layers[0]
layout.prop(rl, "material_override", text="Material")
@@ -294,7 +294,12 @@ class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
@classmethod
def poll(cls, context):
- return CyclesButtonsPanel.poll(context) and (context.mesh or context.curve or context.meta_ball)
+ if CyclesButtonsPanel.poll(context):
+ if context.mesh or context.curve or context.meta_ball:
+ if context.scene.cycles.feature_set == 'EXPERIMENTAL':
+ return True
+
+ return False
def draw(self, context):
layout = self.layout
@@ -706,15 +711,18 @@ def draw_device(self, context):
if scene.render.engine == "CYCLES":
cscene = scene.cycles
+ layout.prop(cscene, "feature_set")
+ experimental = cscene.feature_set == 'EXPERIMENTAL'
+
available_devices = engine.available_devices()
available_cuda = 'cuda' in available_devices
- available_opencl = 'opencl' in available_devices
+ available_opencl = experimental and 'opencl' in available_devices
if available_cuda or available_opencl:
layout.prop(cscene, "device")
if cscene.device == 'GPU' and available_cuda and available_opencl:
layout.prop(cscene, "gpu_type")
- if cscene.device == 'CPU' and engine.with_osl():
+ if experimental and cscene.device == 'CPU' and engine.with_osl():
layout.prop(cscene, "shading_system")
@@ -737,6 +745,12 @@ def get_panels():
bpy.types.RENDER_PT_encoding,
bpy.types.RENDER_PT_dimensions,
bpy.types.RENDER_PT_stamp,
+ bpy.types.SCENE_PT_scene,
+ bpy.types.SCENE_PT_audio,
+ bpy.types.SCENE_PT_unit,
+ bpy.types.SCENE_PT_keying_sets,
+ bpy.types.SCENE_PT_keying_set_paths,
+ bpy.types.SCENE_PT_physics,
bpy.types.WORLD_PT_context_world,
bpy.types.DATA_PT_context_mesh,
bpy.types.DATA_PT_context_camera,
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 2a2c2a7c643..cbc430d9240 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -72,17 +72,12 @@ static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
if(!b_dof_object)
return b_camera.dof_distance();
- /* for dof object, return distance along camera direction. this is
- * compatible with blender, but does it fit our dof model? */
- Transform obmat = get_transform(b_ob.matrix_world());
+ /* for dof object, return distance along camera Z direction */
+ Transform obmat = transform_clear_scale(get_transform(b_ob.matrix_world()));
Transform dofmat = get_transform(b_dof_object.matrix_world());
+ Transform mat = transform_inverse(obmat) * dofmat;
- float3 cam_p = transform_get_column(&obmat, 3);
- float3 cam_dir = normalize(transform_get_column(&obmat, 2));
- float3 dof_p = transform_get_column(&dofmat, 3);
- float3 proj_p = dot(dof_p, cam_dir) * cam_dir;
-
- return len(proj_p - cam_p);
+ return fabsf(transform_get_column(&mat, 3).z);
}
static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob)
@@ -207,6 +202,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
/* transform, note the blender camera points along the negative z-axis */
cam->matrix = bcam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
+ cam->matrix = transform_clear_scale(cam->matrix);
/* set update flag */
if(cam->modified(prevcam))
@@ -286,5 +282,29 @@ void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int
blender_camera_sync(scene->camera, &bcam, width, height);
}
+BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, BL::RegionView3D b_rv3d, int width, int height)
+{
+ BufferParams params;
+
+ params.full_width = width;
+ params.full_height = height;
+
+ /* border render */
+ BL::RenderSettings r = b_scene.render();
+
+ if(!b_rv3d && r.use_border()) {
+ params.full_x = r.border_min_x()*width;
+ params.full_y = r.border_min_y()*height;
+ params.width = (int)(r.border_max_x()*width) - params.full_x;
+ params.height = (int)(r.border_max_y()*height) - params.full_y;
+ }
+ else {
+ params.width = width;
+ params.height = height;
+ }
+
+ return params;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 2bc79224e08..bc43809e46c 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -78,8 +78,9 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
for(b_mesh.faces.begin(f); f != b_mesh.faces.end(); ++f) {
int4 vi = get_int4(f->vertices_raw());
- int n= (vi[3] == 0)? 3: 4;
- int shader = used_shaders[f->material_index()];
+ int n = (vi[3] == 0)? 3: 4;
+ int mi = clamp(f->material_index(), 0, used_shaders.size()-1);
+ int shader = used_shaders[mi];
bool smooth = f->use_smooth();
mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
@@ -232,10 +233,12 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
BL::Object::material_slots_iterator slot;
for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
- if(render_layer.material_override)
- find_shader(render_layer.material_override, used_shaders);
+ BL::Material material_override = render_layers.front().material_override;
+
+ if(material_override)
+ find_shader(material_override, used_shaders, scene->default_surface);
else
- find_shader(slot->material(), used_shaders);
+ find_shader(slot->material(), used_shaders, scene->default_surface);
}
if(used_shaders.size() == 0)
@@ -281,7 +284,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
mesh->name = ustring(b_ob_data.name().c_str());
if(b_mesh) {
- if(cmesh.data && RNA_boolean_get(&cmesh, "use_subdivision"))
+ if(cmesh.data && experimental && RNA_boolean_get(&cmesh, "use_subdivision"))
create_subd_mesh(mesh, b_mesh, &cmesh, used_shaders);
else
create_mesh(scene, mesh, b_mesh, used_shaders);
@@ -294,7 +297,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
if(cmesh.data) {
int method = RNA_enum_get(&cmesh, "displacement_method");
- if(method == 0)
+ if(method == 0 || !experimental)
mesh->displacement_method = Mesh::DISPLACE_BUMP;
else if(method == 1)
mesh->displacement_method = Mesh::DISPLACE_TRUE;
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index abadee9328e..caf5b0a99b1 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -137,7 +137,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob,
/* shader */
vector<uint> used_shaders;
- find_shader(b_lamp, used_shaders);
+ find_shader(b_lamp, used_shaders, scene->default_light);
if(used_shaders.size() == 0)
used_shaders.push_back(scene->default_light);
@@ -154,7 +154,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob,
/* Object */
-void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint visibility)
+void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint layer_flag)
{
/* light is handled separately */
if(object_is_light(b_ob)) {
@@ -181,11 +181,19 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
if(object_updated || (object->mesh && object->mesh->need_update)) {
object->name = b_ob.name().c_str();
object->tfm = tfm;
-
- object->visibility = object_ray_visibility(b_ob) & visibility;
+
+ /* visibility flags for both parent */
+ object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL;
if(b_parent.ptr.data != b_ob.ptr.data)
object->visibility &= object_ray_visibility(b_parent);
+ /* camera flag is not actually used, instead is tested
+ against render layer flags */
+ if(object->visibility & PATH_RAY_CAMERA) {
+ object->visibility |= layer_flag << PATH_RAY_LAYER_SHIFT;
+ object->visibility &= ~PATH_RAY_CAMERA;
+ }
+
object->tag_update(scene);
}
}
@@ -195,8 +203,7 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
{
/* layer data */
- uint scene_layer = render_layer.scene_layer;
- uint layer = render_layer.layer;
+ uint scene_layer = render_layers.front().scene_layer;
/* prepare for sync */
light_map.pre_sync();
@@ -212,11 +219,6 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
uint ob_layer = get_layer(b_ob->layers());
if(!hide && (ob_layer & scene_layer)) {
- uint visibility = PATH_RAY_ALL;
-
- if(!(ob_layer & layer))
- visibility &= ~PATH_RAY_CAMERA;
-
if(b_ob->is_duplicator()) {
/* dupli objects */
object_create_duplilist(*b_ob, b_scene);
@@ -226,25 +228,32 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) {
Transform tfm = get_transform(b_dup->matrix());
- sync_object(*b_ob, b_index, b_dup->object(), tfm, visibility);
+ sync_object(*b_ob, b_index, b_dup->object(), tfm, ob_layer);
b_index++;
}
object_free_duplilist(*b_ob);
- /* check if we should render duplicator */
hide = true;
- BL::Object::particle_systems_iterator b_psys;
+ }
+
+ /* check if we should render or hide particle emitter */
+ BL::Object::particle_systems_iterator b_psys;
+ bool render_emitter = false;
- for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys)
- if(b_psys->settings().use_render_emitter())
- hide = false;
+ for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys) {
+ if(b_psys->settings().use_render_emitter()) {
+ hide = false;
+ render_emitter = true;
+ }
+ else if(!render_emitter)
+ hide = true;
}
if(!hide) {
/* object itself */
Transform tfm = get_transform(b_ob->matrix_world());
- sync_object(*b_ob, 0, *b_ob, tfm, visibility);
+ sync_object(*b_ob, 0, *b_ob, tfm, ob_layer);
}
}
}
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 58049bb8cbe..90dab298dc3 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -35,8 +35,7 @@ static PyObject *init_func(PyObject *self, PyObject *args)
path_init(path, user_path);
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *create_func(PyObject *self, PyObject *args)
@@ -89,35 +88,23 @@ static PyObject *create_func(PyObject *self, PyObject *args)
return PyLong_FromVoidPtr(session);
}
-static PyObject *free_func(PyObject *self, PyObject *args)
+static PyObject *free_func(PyObject *self, PyObject *value)
{
- PyObject *pysession;
+ delete (BlenderSession*)PyLong_AsVoidPtr(value);
- if(!PyArg_ParseTuple(args, "O", &pysession))
- return NULL;
-
- delete (BlenderSession*)PyLong_AsVoidPtr(pysession);
-
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
-static PyObject *render_func(PyObject *self, PyObject *args)
+static PyObject *render_func(PyObject *self, PyObject *value)
{
- PyObject *pysession;
-
- if(!PyArg_ParseTuple(args, "O", &pysession))
- return NULL;
-
Py_BEGIN_ALLOW_THREADS
- BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+ BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
session->render();
Py_END_ALLOW_THREADS
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *draw_func(PyObject *self, PyObject *args)
@@ -137,22 +124,15 @@ static PyObject *draw_func(PyObject *self, PyObject *args)
session->draw(viewport[2], viewport[3]);
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
-static PyObject *sync_func(PyObject *self, PyObject *args)
+static PyObject *sync_func(PyObject *self, PyObject *value)
{
- PyObject *pysession;
-
- if(!PyArg_ParseTuple(args, "O", &pysession))
- return NULL;
-
- BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+ BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
session->synchronize();
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static PyObject *available_devices_func(PyObject *self, PyObject *args)
@@ -163,38 +143,26 @@ static PyObject *available_devices_func(PyObject *self, PyObject *args)
for(size_t i = 0; i < types.size(); i++) {
string name = Device::string_from_type(types[i]);
- PyTuple_SetItem(ret, i, PyUnicode_FromString(name.c_str()));
+ PyTuple_SET_ITEM(ret, i, PyUnicode_FromString(name.c_str()));
}
return ret;
}
-static PyObject *with_osl_func(PyObject *self, PyObject *args)
-{
-#ifdef WITH_OSL
- PyObject *ret = Py_True;
-#else
- PyObject *ret = Py_False;
-#endif
-
- return Py_INCREF(ret), ret;
-}
-
static PyMethodDef methods[] = {
{"init", init_func, METH_VARARGS, ""},
{"create", create_func, METH_VARARGS, ""},
- {"free", free_func, METH_VARARGS, ""},
- {"render", render_func, METH_VARARGS, ""},
+ {"free", free_func, METH_O, ""},
+ {"render", render_func, METH_O, ""},
{"draw", draw_func, METH_VARARGS, ""},
- {"sync", sync_func, METH_VARARGS, ""},
+ {"sync", sync_func, METH_O, ""},
{"available_devices", available_devices_func, METH_NOARGS, ""},
- {"with_osl", with_osl_func, METH_NOARGS, ""},
{NULL, NULL, 0, NULL},
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
- "bcycles",
+ "_cycles",
"Blender cycles render integration",
-1,
methods,
@@ -207,6 +175,16 @@ extern "C" PyObject *CYCLES_initPython();
PyObject *CYCLES_initPython()
{
- return PyModule_Create(&ccl::module);
+ PyObject *mod= PyModule_Create(&ccl::module);
+
+#ifdef WITH_OSL
+ PyModule_AddObject(mod, "with_osl", Py_True);
+ Py_INCREF(Py_True);
+#else
+ PyModule_AddObject(mod, "with_osl", Py_False);
+ Py_INCREF(Py_False);
+#endif
+
+ return mod;
}
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4433b1e24f9..d8c65c7a607 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -40,7 +40,8 @@
CCL_NAMESPACE_BEGIN
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_)
-: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL)
+: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL),
+ b_rr(PointerRNA_NULL), b_rlay(PointerRNA_NULL)
{
/* offline render */
BL::RenderSettings r = b_scene.render();
@@ -55,7 +56,8 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_
BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_, BL::Scene b_scene_,
BL::SpaceView3D b_v3d_, BL::RegionView3D b_rv3d_, int width_, int height_)
-: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(b_v3d_), b_rv3d(b_rv3d_)
+: b_engine(b_engine_), b_data(b_data_), b_scene(b_scene_), b_v3d(b_v3d_), b_rv3d(b_rv3d_),
+ b_rr(PointerRNA_NULL), b_rlay(PointerRNA_NULL)
{
/* 3d view render */
width = width_;
@@ -64,6 +66,7 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::BlendData b_data_
last_redraw_time = 0.0f;
create_session();
+ session->start();
}
BlenderSession::~BlenderSession()
@@ -99,9 +102,9 @@ void BlenderSession::create_session()
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
session->set_pause(BlenderSync::get_session_pause(b_scene, background));
- /* start rendering */
- session->reset(width, height, session_params.samples);
- session->start();
+ /* set buffer parameters */
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+ session->reset(buffer_params, session_params.samples);
}
void BlenderSession::free_session()
@@ -112,39 +115,67 @@ void BlenderSession::free_session()
void BlenderSession::render()
{
- session->wait();
+ /* get buffer parameters */
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+ int w = buffer_params.width, h = buffer_params.height;
- if(session->progress.get_cancel())
- return;
+ /* create render result */
+ RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, w, h);
+ PointerRNA rrptr;
+ RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
+ b_rr = BL::RenderResult(rrptr);
+
+ BL::RenderSettings r = b_scene.render();
+ BL::RenderResult::layers_iterator b_iter;
+ BL::RenderLayers b_rr_layers(r.ptr);
+
+ int active = 0;
+
+ /* render each layer */
+ for(b_rr.layers.begin(b_iter); b_iter != b_rr.layers.end(); ++b_iter, ++active) {
+ /* single layer render */
+ if(r.use_single_layer())
+ active = b_rr_layers.active_index();
+
+ /* set layer */
+ b_rlay = *b_iter;
+
+ /* update scene */
+ sync->sync_data(b_v3d, active);
+
+ /* render */
+ session->start();
+ session->wait();
- /* write result */
- write_render_result();
+ if(session->progress.get_cancel())
+ break;
+
+ /* write result */
+ write_render_result();
+ }
+
+ /* delete render result */
+ RE_engine_end_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
}
void BlenderSession::write_render_result()
{
- /* get result */
+ /* get state */
RenderBuffers *buffers = session->buffers;
float exposure = scene->film->exposure;
double total_time, sample_time;
int sample;
session->progress.get_sample(sample, total_time, sample_time);
+ /* get pixels */
float4 *pixels = buffers->copy_from_device(exposure, sample);
if(!pixels)
return;
- struct RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, width, height);
- PointerRNA rrptr;
- RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
- BL::RenderResult rr(rrptr);
-
- BL::RenderResult::layers_iterator layer;
- rr.layers.begin(layer);
- rna_RenderLayer_rect_set(&layer->ptr, (float*)pixels);
-
- RE_engine_end_result((RenderEngine*)b_engine.ptr.data, rrp);
+ /* write pixels */
+ rna_RenderLayer_rect_set(&b_rlay.ptr, (float*)pixels);
+ RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
delete [] pixels;
}
@@ -159,6 +190,7 @@ void BlenderSession::synchronize()
scene->params.modified(scene_params)) {
free_session();
create_session();
+ session->start();
return;
}
@@ -188,8 +220,10 @@ void BlenderSession::synchronize()
session->scene->mutex.unlock();
/* reset if needed */
- if(scene->need_reset())
- session->reset(width, height, session_params.samples);
+ if(scene->need_reset()) {
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+ session->reset(buffer_params, session_params.samples);
+ }
}
bool BlenderSession::draw(int w, int h)
@@ -225,7 +259,9 @@ bool BlenderSession::draw(int w, int h)
/* reset if requested */
if(reset) {
SessionParams session_params = BlenderSync::get_session_params(b_scene, background);
- session->reset(width, height, session_params.samples);
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+
+ session->reset(buffer_params, session_params.samples);
}
}
@@ -233,7 +269,9 @@ bool BlenderSession::draw(int w, int h)
update_status_progress();
/* draw */
- return !session->draw(width, height);
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
+
+ return !session->draw(buffer_params);
}
void BlenderSession::get_status(string& status, string& substatus)
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index e30b60c3d63..26fffcf3aff 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -69,6 +69,8 @@ public:
BL::Scene b_scene;
BL::SpaceView3D b_v3d;
BL::RegionView3D b_rv3d;
+ BL::RenderResult b_rr;
+ BL::RenderLayer b_rlay;
string last_status;
float last_progress;
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index cf8527b9760..f32d2d9a2ce 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -36,9 +36,9 @@ typedef map<void*, SocketPair> PtrSockMap;
/* Find */
-void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders)
+void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders, int default_shader)
{
- Shader *shader = shader_map.find(id);
+ Shader *shader = (id)? shader_map.find(id): scene->shaders[default_shader];
for(size_t i = 0; i < scene->shaders.size(); i++) {
if(scene->shaders[i] == shader) {
@@ -50,28 +50,6 @@ void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders)
/* Graph */
-static BL::NodeSocket get_node_input(BL::Node *b_group_node, BL::NodeSocket b_in)
-{
- if(b_group_node) {
-
- BL::NodeTree b_ntree = BL::NodeGroup(*b_group_node).node_tree();
- BL::NodeTree::links_iterator b_link;
-
- for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
- if(b_link->to_socket().ptr.data == b_in.ptr.data) {
- BL::Node::inputs_iterator b_gin;
-
- for(b_group_node->inputs.begin(b_gin); b_gin != b_group_node->inputs.end(); ++b_gin)
- if(b_gin->group_socket().ptr.data == b_link->from_socket().ptr.data)
- return *b_gin;
-
- }
- }
- }
-
- return b_in;
-}
-
static BL::NodeSocket get_node_output(BL::Node b_node, const string& name)
{
BL::Node::outputs_iterator b_out;
@@ -121,25 +99,19 @@ static void get_tex_mapping(TextureMapping *mapping, BL::ShaderNodeMapping b_map
mapping->scale = get_float3(b_mapping.scale());
}
-static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *b_group_node, BL::ShaderNode b_node)
+static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNode b_node)
{
ShaderNode *node = NULL;
switch(b_node.type()) {
/* not supported */
- case BL::ShaderNode::type_CAMERA: break;
- case BL::ShaderNode::type_COMBRGB: break;
case BL::ShaderNode::type_CURVE_RGB: break;
case BL::ShaderNode::type_CURVE_VEC: break;
case BL::ShaderNode::type_GEOMETRY: break;
- case BL::ShaderNode::type_HUE_SAT: break;
- case BL::ShaderNode::type_INVERT: break;
case BL::ShaderNode::type_MATERIAL: break;
case BL::ShaderNode::type_MATERIAL_EXT: break;
- case BL::ShaderNode::type_NORMAL: break;
case BL::ShaderNode::type_OUTPUT: break;
case BL::ShaderNode::type_SCRIPT: break;
- case BL::ShaderNode::type_SEPRGB: break;
case BL::ShaderNode::type_SQUEEZE: break;
case BL::ShaderNode::type_TEXTURE: break;
case BL::ShaderNode::type_VALTORGB: break;
@@ -158,6 +130,18 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *
node = value;
break;
}
+ case BL::ShaderNode::type_CAMERA: {
+ node = new CameraNode();
+ break;
+ }
+ case BL::ShaderNode::type_INVERT: {
+ node = new InvertNode();
+ break;
+ }
+ case BL::ShaderNode::type_GAMMA: {
+ node = new GammaNode();
+ break;
+ }
case BL::ShaderNode::type_MIX_RGB: {
BL::ShaderNodeMixRGB b_mix_node(b_node);
MixNode *mix = new MixNode();
@@ -165,6 +149,18 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *
node = mix;
break;
}
+ case BL::ShaderNode::type_SEPRGB: {
+ node = new SeparateRGBNode();
+ break;
+ }
+ case BL::ShaderNode::type_COMBRGB: {
+ node = new CombineRGBNode();
+ break;
+ }
+ case BL::ShaderNode::type_HUE_SAT: {
+ node = new HSVNode();
+ break;
+ }
case BL::ShaderNode::type_RGBTOBW: {
node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
break;
@@ -183,6 +179,17 @@ static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *
node = vmath;
break;
}
+ case BL::ShaderNode::type_NORMAL: {
+ BL::Node::outputs_iterator out_it;
+ b_node.outputs.begin(out_it);
+ BL::NodeSocketVectorNone vec_sock(*out_it);
+
+ NormalNode *norm = new NormalNode();
+ norm->direction = get_float3(vec_sock.default_value());
+
+ node = norm;
+ break;
+ }
case BL::ShaderNode::type_MAPPING: {
BL::ShaderNodeMapping b_mapping_node(b_node);
MappingNode *mapping = new MappingNode();
@@ -441,59 +448,115 @@ static SocketPair node_socket_map_pair(PtrNodeMap& node_map, BL::Node b_node, BL
return SocketPair(node_map[b_node.ptr.data], name);
}
-static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, BL::Node *b_group_node, PtrSockMap& sockets_map)
+static ShaderSocketType convert_socket_type(BL::NodeSocket::type_enum b_type)
+{
+ switch (b_type) {
+ case BL::NodeSocket::type_VALUE:
+ return SHADER_SOCKET_FLOAT;
+ case BL::NodeSocket::type_VECTOR:
+ return SHADER_SOCKET_VECTOR;
+ case BL::NodeSocket::type_RGBA:
+ return SHADER_SOCKET_COLOR;
+ case BL::NodeSocket::type_SHADER:
+ return SHADER_SOCKET_CLOSURE;
+
+ case BL::NodeSocket::type_BOOLEAN:
+ case BL::NodeSocket::type_MESH:
+ case BL::NodeSocket::type_INT:
+ default:
+ return SHADER_SOCKET_FLOAT;
+ }
+}
+
+static void set_default_value(ShaderInput *input, BL::NodeSocket sock)
+{
+ /* copy values for non linked inputs */
+ switch(input->type) {
+ case SHADER_SOCKET_FLOAT: {
+ BL::NodeSocketFloatNone value_sock(sock);
+ input->set(value_sock.default_value());
+ break;
+ }
+ case SHADER_SOCKET_COLOR: {
+ BL::NodeSocketRGBA rgba_sock(sock);
+ input->set(get_float3(rgba_sock.default_value()));
+ break;
+ }
+ case SHADER_SOCKET_NORMAL:
+ case SHADER_SOCKET_POINT:
+ case SHADER_SOCKET_VECTOR: {
+ BL::NodeSocketVectorNone vec_sock(sock);
+ input->set(get_float3(vec_sock.default_value()));
+ break;
+ }
+ case SHADER_SOCKET_CLOSURE:
+ break;
+ }
+}
+
+static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, PtrSockMap& sockets_map)
{
/* add nodes */
BL::ShaderNodeTree::nodes_iterator b_node;
PtrNodeMap node_map;
- map<void*, PtrSockMap> node_groups;
+ PtrSockMap proxy_map;
for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
if(b_node->is_a(&RNA_NodeGroup)) {
+ /* add proxy converter nodes for inputs and outputs */
BL::NodeGroup b_gnode(*b_node);
BL::ShaderNodeTree b_group_ntree(b_gnode.node_tree());
-
- node_groups[b_node->ptr.data] = PtrSockMap();
- add_nodes(b_data, graph, b_group_ntree, &b_gnode, node_groups[b_node->ptr.data]);
+ BL::Node::inputs_iterator b_input;
+ BL::Node::outputs_iterator b_output;
+
+ PtrSockMap group_sockmap;
+
+ for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
+ ShaderSocketType extern_type = convert_socket_type(b_input->type());
+ ShaderSocketType intern_type = convert_socket_type(b_input->group_socket().type());
+ ShaderNode *proxy = graph->add(new ProxyNode(extern_type, intern_type));
+
+ /* map the external node socket to the proxy node socket */
+ proxy_map[b_input->ptr.data] = SocketPair(proxy, proxy->inputs[0]->name);
+ /* map the internal group socket to the proxy node socket */
+ group_sockmap[b_input->group_socket().ptr.data] = SocketPair(proxy, proxy->outputs[0]->name);
+
+ /* default input values of the group node */
+ set_default_value(proxy->inputs[0], *b_input);
+ }
+
+ for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
+ ShaderSocketType extern_type = convert_socket_type(b_output->type());
+ ShaderSocketType intern_type = convert_socket_type(b_output->group_socket().type());
+ ShaderNode *proxy = graph->add(new ProxyNode(intern_type, extern_type));
+
+ /* map the external node socket to the proxy node socket */
+ proxy_map[b_output->ptr.data] = SocketPair(proxy, proxy->outputs[0]->name);
+ /* map the internal group socket to the proxy node socket */
+ group_sockmap[b_output->group_socket().ptr.data] = SocketPair(proxy, proxy->inputs[0]->name);
+
+ /* default input values of internal, unlinked group outputs */
+ set_default_value(proxy->inputs[0], b_output->group_socket());
+ }
+
+ add_nodes(b_data, graph, b_group_ntree, group_sockmap);
}
else {
- ShaderNode *node = add_node(b_data, graph, b_group_node, BL::ShaderNode(*b_node));
-
+ ShaderNode *node = add_node(b_data, graph, BL::ShaderNode(*b_node));
+
if(node) {
BL::Node::inputs_iterator b_input;
- BL::Node::outputs_iterator b_output;
-
+
node_map[b_node->ptr.data] = node;
-
+
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
SocketPair pair = node_socket_map_pair(node_map, *b_node, *b_input);
ShaderInput *input = pair.first->input(pair.second.c_str());
- BL::NodeSocket sock(get_node_input(b_group_node, *b_input));
-
+
assert(input);
-
+
/* copy values for non linked inputs */
- switch(input->type) {
- case SHADER_SOCKET_FLOAT: {
- BL::NodeSocketFloatNone value_sock(sock);
- input->set(value_sock.default_value());
- break;
- }
- case SHADER_SOCKET_COLOR: {
- BL::NodeSocketRGBA rgba_sock(sock);
- input->set(get_float3(rgba_sock.default_value()));
- break;
- }
- case SHADER_SOCKET_NORMAL:
- case SHADER_SOCKET_POINT:
- case SHADER_SOCKET_VECTOR: {
- BL::NodeSocketVectorNone vec_sock(sock);
- input->set(get_float3(vec_sock.default_value()));
- break;
- }
- case SHADER_SOCKET_CLOSURE:
- break;
- }
+ set_default_value(input, *b_input);
}
}
}
@@ -510,48 +573,32 @@ static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTr
BL::NodeSocket b_from_sock = b_link->from_socket();
BL::NodeSocket b_to_sock = b_link->to_socket();
- /* if link with group socket, add to map so we can connect it later */
- if(b_group_node) {
- if(!b_from_node) {
- sockets_map[b_from_sock.ptr.data] =
- node_socket_map_pair(node_map, b_to_node, b_to_sock);
-
- continue;
- }
- else if(!b_to_node) {
- sockets_map[b_to_sock.ptr.data] =
- node_socket_map_pair(node_map, b_from_node, b_from_sock);
-
- continue;
- }
- }
-
SocketPair from_pair, to_pair;
+ /* links without a node pointer are connections to group inputs/outputs */
+
/* from sock */
- if(b_from_node.is_a(&RNA_NodeGroup)) {
- /* group node */
- BL::NodeSocket group_sock = b_from_sock.group_socket();
- from_pair = node_groups[b_from_node.ptr.data][group_sock.ptr.data];
- }
- else {
- /* regular node */
- from_pair = node_socket_map_pair(node_map, b_from_node, b_from_sock);
+ if(b_from_node) {
+ if (b_from_node.is_a(&RNA_NodeGroup))
+ from_pair = proxy_map[b_from_sock.ptr.data];
+ else
+ from_pair = node_socket_map_pair(node_map, b_from_node, b_from_sock);
}
+ else
+ from_pair = sockets_map[b_from_sock.ptr.data];
/* to sock */
- if(b_to_node.is_a(&RNA_NodeGroup)) {
- /* group node */
- BL::NodeSocket group_sock = b_to_sock.group_socket();
- to_pair = node_groups[b_to_node.ptr.data][group_sock.ptr.data];
- }
- else {
- /* regular node */
- to_pair = node_socket_map_pair(node_map, b_to_node, b_to_sock);
+ if(b_to_node) {
+ if (b_to_node.is_a(&RNA_NodeGroup))
+ to_pair = proxy_map[b_to_sock.ptr.data];
+ else
+ to_pair = node_socket_map_pair(node_map, b_to_node, b_to_sock);
}
+ else
+ to_pair = sockets_map[b_to_sock.ptr.data];
- /* in case of groups there may not actually be a node inside the group
- that the group socket connects to, so from_node or to_node may be NULL */
+ /* either node may be NULL when the node was not exported, typically
+ because the node type is not supported */
if(from_pair.first && to_pair.first) {
ShaderOutput *output = from_pair.first->output(from_pair.second.c_str());
ShaderInput *input = to_pair.first->input(to_pair.second.c_str());
@@ -584,7 +631,7 @@ void BlenderSync::sync_materials()
PtrSockMap sock_to_node;
BL::ShaderNodeTree b_ntree(b_mat->node_tree());
- add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ add_nodes(b_data, graph, b_ntree, sock_to_node);
}
else {
ShaderNode *closure, *out;
@@ -625,7 +672,7 @@ void BlenderSync::sync_world()
PtrSockMap sock_to_node;
BL::ShaderNodeTree b_ntree(b_world.node_tree());
- add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ add_nodes(b_data, graph, b_ntree, sock_to_node);
}
else if(b_world) {
ShaderNode *closure, *out;
@@ -674,7 +721,7 @@ void BlenderSync::sync_lamps()
PtrSockMap sock_to_node;
BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
- add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ add_nodes(b_data, graph, b_ntree, sock_to_node);
}
else {
ShaderNode *closure, *out;
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 36cf29de128..286a9b5b24f 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -47,7 +47,9 @@ BlenderSync::BlenderSync(BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene
mesh_map(&scene_->meshes),
light_map(&scene_->lights),
world_map(NULL),
- world_recalc(false)
+ world_recalc(false),
+ experimental(false),
+ active_layer(0)
{
scene = scene_;
preview = preview_;
@@ -67,13 +69,13 @@ bool BlenderSync::sync_recalc()
BL::BlendData::materials_iterator b_mat;
for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat)
- if(b_mat->is_updated())
+ if(b_mat->is_updated() || (b_mat->node_tree() && b_mat->node_tree().is_updated()))
shader_map.set_recalc(*b_mat);
BL::BlendData::lamps_iterator b_lamp;
for(b_data.lamps.begin(b_lamp); b_lamp != b_data.lamps.end(); ++b_lamp)
- if(b_lamp->is_updated())
+ if(b_lamp->is_updated() || (b_lamp->node_tree() && b_lamp->node_tree().is_updated()))
shader_map.set_recalc(*b_lamp);
BL::BlendData::objects_iterator b_ob;
@@ -105,7 +107,8 @@ bool BlenderSync::sync_recalc()
BL::BlendData::worlds_iterator b_world;
for(b_data.worlds.begin(b_world); b_world != b_data.worlds.end(); ++b_world)
- if(world_map == b_world->ptr.data && b_world->is_updated())
+ if(world_map == b_world->ptr.data &&
+ (b_world->is_updated() || (b_world->node_tree() && b_world->node_tree().is_updated())))
world_recalc = true;
bool recalc =
@@ -119,21 +122,23 @@ bool BlenderSync::sync_recalc()
return recalc;
}
-void BlenderSync::sync_data(BL::SpaceView3D b_v3d)
+void BlenderSync::sync_data(BL::SpaceView3D b_v3d, int layer)
{
- sync_integrator();
+ sync_render_layers(b_v3d);
+ sync_integrator(layer);
sync_film();
- sync_render_layer(b_v3d);
sync_shaders();
sync_objects(b_v3d);
}
/* Integrator */
-void BlenderSync::sync_integrator()
+void BlenderSync::sync_integrator(int layer)
{
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
+
Integrator *integrator = scene->integrator;
Integrator previntegrator = *integrator;
@@ -149,9 +154,8 @@ void BlenderSync::sync_integrator()
integrator->transparent_shadows = get_boolean(cscene, "use_transparent_shadows");
integrator->no_caustics = get_boolean(cscene, "no_caustics");
- integrator->blur_caustics = get_float(cscene, "blur_caustics");
-
integrator->seed = get_int(cscene, "seed");
+ integrator->layer_flag = render_layers[layer].layer;
if(integrator->modified(previntegrator))
integrator->tag_update(scene);
@@ -183,27 +187,32 @@ void BlenderSync::sync_film()
/* Render Layer */
-void BlenderSync::sync_render_layer(BL::SpaceView3D b_v3d)
+void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d)
{
+ render_layers.clear();
+
if(b_v3d) {
- render_layer.scene_layer = get_layer(b_v3d.layers());
- render_layer.layer = render_layer.scene_layer;
- render_layer.material_override = PointerRNA_NULL;
+ RenderLayerInfo rlay;
+
+ rlay.scene_layer = get_layer(b_v3d.layers());
+ rlay.layer = rlay.scene_layer;
+ rlay.material_override = PointerRNA_NULL;
+
+ render_layers.push_back(rlay);
}
else {
BL::RenderSettings r = b_scene.render();
BL::RenderSettings::layers_iterator b_rlay;
- bool first = true;
for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
/* single layer for now */
- if(first) {
- render_layer.scene_layer = get_layer(b_scene.layers());
- render_layer.layer = get_layer(b_rlay->layers());
- render_layer.material_override = b_rlay->material_override();
+ RenderLayerInfo rlay;
- first = false;
- }
+ rlay.scene_layer = get_layer(b_scene.layers());
+ rlay.layer = get_layer(b_rlay->layers());
+ rlay.material_override = b_rlay->material_override();
+
+ render_layers.push_back(rlay);
}
}
}
@@ -253,16 +262,24 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background
SessionParams params;
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ /* feature set */
+ params.experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
+
/* device type */
params.device_type = DEVICE_CPU;
if(RNA_enum_get(&cscene, "device") != 0) {
vector<DeviceType> types = Device::available_types();
- DeviceType dtype = (RNA_enum_get(&cscene, "gpu_type") == 0)? DEVICE_CUDA: DEVICE_OPENCL;
+ DeviceType dtype;
+
+ if(!params.experimental || RNA_enum_get(&cscene, "gpu_type") == 0)
+ dtype = DEVICE_CUDA;
+ else
+ dtype = DEVICE_OPENCL;
if(device_type_available(types, dtype))
params.device_type = dtype;
- else if(device_type_available(types, DEVICE_OPENCL))
+ else if(params.experimental && device_type_available(types, DEVICE_OPENCL))
params.device_type = DEVICE_OPENCL;
else if(device_type_available(types, DEVICE_CUDA))
params.device_type = DEVICE_CUDA;
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 2e7b8ed253d..60fdd7c386b 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -54,7 +54,7 @@ public:
/* sync */
bool sync_recalc();
- void sync_data(BL::SpaceView3D b_v3d);
+ void sync_data(BL::SpaceView3D b_v3d, int layer = 0);
void sync_camera(int width, int height);
void sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height);
@@ -62,6 +62,7 @@ public:
static SceneParams get_scene_params(BL::Scene b_scene, bool background);
static SessionParams get_session_params(BL::Scene b_scene, bool background);
static bool get_session_pause(BL::Scene b_scene, bool background);
+ static BufferParams get_buffer_params(BL::Scene b_scene, BL::RegionView3D b_rv3d, int width, int height);
private:
/* sync */
@@ -69,19 +70,19 @@ private:
void sync_materials();
void sync_objects(BL::SpaceView3D b_v3d);
void sync_film();
- void sync_integrator();
+ void sync_integrator(int layer);
void sync_view();
void sync_world();
- void sync_render_layer(BL::SpaceView3D b_v3d);
+ void sync_render_layers(BL::SpaceView3D b_v3d);
void sync_shaders();
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
Mesh *sync_mesh(BL::Object b_ob, bool object_updated);
- void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint visibility);
+ void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag);
void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
/* util */
- void find_shader(BL::ID id, vector<uint>& used_shaders);
+ void find_shader(BL::ID id, vector<uint>& used_shaders, int default_shader);
bool object_is_modified(BL::Object b_ob);
bool object_is_mesh(BL::Object b_ob);
bool object_is_light(BL::Object b_ob);
@@ -100,6 +101,7 @@ private:
Scene *scene;
bool preview;
+ bool experimental;
struct RenderLayerInfo {
RenderLayerInfo()
@@ -110,7 +112,10 @@ private:
uint scene_layer;
uint layer;
BL::Material material_override;
- } render_layer;
+ };
+
+ vector<RenderLayerInfo> render_layers;
+ int active_layer;
};
CCL_NAMESPACE_END
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 67cff3f5873..38674c2c561 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -59,16 +59,18 @@ void BVHBuild::add_reference_mesh(NodeSpec& root, Mesh *mesh, int i)
Mesh::Triangle t = mesh->triangles[j];
Reference ref;
- ref.prim_index = j;
- ref.prim_object = i;
-
for(int k = 0; k < 3; k++) {
float3 pt = mesh->verts[t.v[k]];
ref.bounds.grow(pt);
}
- references.push_back(ref);
- root.bounds.grow(ref.bounds);
+ if(ref.bounds.valid()) {
+ ref.prim_index = j;
+ ref.prim_object = i;
+
+ references.push_back(ref);
+ root.bounds.grow(ref.bounds);
+ }
}
}
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index f43ccffe461..55fc3bacbba 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -24,6 +24,7 @@
#include "util_cuda.h"
#include "util_debug.h"
+#include "util_foreach.h"
#include "util_math.h"
#include "util_opencl.h"
#include "util_opengl.h"
@@ -37,25 +38,50 @@ CCL_NAMESPACE_BEGIN
DeviceTask::DeviceTask(Type type_)
: type(type_), x(0), y(0), w(0), h(0), rng_state(0), rgba(0), buffer(0),
sample(0), resolution(0),
- displace_input(0), displace_offset(0), displace_x(0), displace_w(0)
+ shader_input(0), shader_output(0),
+ shader_eval_type(0), shader_x(0), shader_w(0)
{
}
-void DeviceTask::split(ThreadQueue<DeviceTask>& tasks, int num)
+void DeviceTask::split_max_size(list<DeviceTask>& tasks, int max_size)
{
- if(type == DISPLACE) {
- num = min(displace_w, num);
+ int num;
+
+ if(type == SHADER) {
+ num = (shader_w + max_size - 1)/max_size;
+ }
+ else {
+ max_size = max(1, max_size/w);
+ num = (h + max_size - 1)/max_size;
+ }
+
+ split(tasks, num);
+}
+
+void DeviceTask::split(ThreadQueue<DeviceTask>& queue, int num)
+{
+ list<DeviceTask> tasks;
+ split(tasks, num);
+
+ foreach(DeviceTask& task, tasks)
+ queue.push(task);
+}
+
+void DeviceTask::split(list<DeviceTask>& tasks, int num)
+{
+ if(type == SHADER) {
+ num = min(shader_w, num);
for(int i = 0; i < num; i++) {
- int tx = displace_x + (displace_w/num)*i;
- int tw = (i == num-1)? displace_w - i*(displace_w/num): displace_w/num;
+ int tx = shader_x + (shader_w/num)*i;
+ int tw = (i == num-1)? shader_w - i*(shader_w/num): shader_w/num;
DeviceTask task = *this;
- task.displace_x = tx;
- task.displace_w = tw;
+ task.shader_x = tx;
+ task.shader_w = tw;
- tasks.push(task);
+ tasks.push_back(task);
}
}
else {
@@ -70,7 +96,7 @@ void DeviceTask::split(ThreadQueue<DeviceTask>& tasks, int num)
task.y = ty;
task.h = th;
- tasks.push(task);
+ tasks.push_back(task);
}
}
}
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 5552e6ab7e2..af9bb694c1b 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -23,6 +23,7 @@
#include "device_memory.h"
+#include "util_list.h"
#include "util_string.h"
#include "util_thread.h"
#include "util_types.h"
@@ -51,7 +52,7 @@ enum MemoryType {
class DeviceTask {
public:
- typedef enum { PATH_TRACE, TONEMAP, DISPLACE } Type;
+ typedef enum { PATH_TRACE, TONEMAP, SHADER } Type;
Type type;
int x, y, w, h;
@@ -60,13 +61,18 @@ public:
device_ptr buffer;
int sample;
int resolution;
+ int offset, stride;
- device_ptr displace_input;
- device_ptr displace_offset;
- int displace_x, displace_w;
+ device_ptr shader_input;
+ device_ptr shader_output;
+ int shader_eval_type;
+ int shader_x, shader_w;
DeviceTask(Type type = PATH_TRACE);
+
+ void split(list<DeviceTask>& tasks, int num);
void split(ThreadQueue<DeviceTask>& tasks, int num);
+ void split_max_size(list<DeviceTask>& tasks, int max_size);
};
/* Device */
@@ -112,7 +118,7 @@ public:
virtual void *osl_memory() { return NULL; }
/* load/compile kernels, must be called before adding tasks */
- virtual bool load_kernels() { return true; }
+ virtual bool load_kernels(bool experimental) { return true; }
/* tasks */
virtual void task_add(DeviceTask& task) = 0;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 990b7cb94b0..145eab9ff59 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -141,8 +141,8 @@ public:
thread_path_trace(task);
else if(task.type == DeviceTask::TONEMAP)
thread_tonemap(task);
- else if(task.type == DeviceTask::DISPLACE)
- thread_displace(task);
+ else if(task.type == DeviceTask::SHADER)
+ thread_shader(task);
tasks.worker_done();
}
@@ -162,7 +162,8 @@ public:
if(system_cpu_support_optimized()) {
for(int y = task.y; y < task.y + task.h; y++) {
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_optimized_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state, task.sample, x, y);
+ kernel_cpu_optimized_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+ task.sample, x, y, task.offset, task.stride);
if(tasks.worker_cancel())
break;
@@ -173,7 +174,8 @@ public:
{
for(int y = task.y; y < task.y + task.h; y++) {
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state, task.sample, x, y);
+ kernel_cpu_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+ task.sample, x, y, task.offset, task.stride);
if(tasks.worker_cancel())
break;
@@ -192,18 +194,20 @@ public:
if(system_cpu_support_optimized()) {
for(int y = task.y; y < task.y + task.h; y++)
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer, task.sample, task.resolution, x, y);
+ kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+ task.sample, task.resolution, x, y, task.offset, task.stride);
}
else
#endif
{
for(int y = task.y; y < task.y + task.h; y++)
for(int x = task.x; x < task.x + task.w; x++)
- kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer, task.sample, task.resolution, x, y);
+ kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+ task.sample, task.resolution, x, y, task.offset, task.stride);
}
}
- void thread_displace(DeviceTask& task)
+ void thread_shader(DeviceTask& task)
{
#ifdef WITH_OSL
if(kernel_osl_use(kg))
@@ -212,8 +216,8 @@ public:
#ifdef WITH_OPTIMIZED_KERNEL
if(system_cpu_support_optimized()) {
- for(int x = task.displace_x; x < task.displace_x + task.displace_w; x++) {
- kernel_cpu_optimized_displace(kg, (uint4*)task.displace_input, (float3*)task.displace_offset, x);
+ for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
+ kernel_cpu_optimized_shader(kg, (uint4*)task.shader_input, (float3*)task.shader_output, task.shader_eval_type, x);
if(tasks.worker_cancel())
break;
@@ -222,8 +226,8 @@ public:
else
#endif
{
- for(int x = task.displace_x; x < task.displace_x + task.displace_w; x++) {
- kernel_cpu_displace(kg, (uint4*)task.displace_input, (float3*)task.displace_offset, x);
+ for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
+ kernel_cpu_shader(kg, (uint4*)task.shader_input, (float3*)task.shader_output, task.shader_eval_type, x);
if(tasks.worker_cancel())
break;
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index e32cbfcc8a7..3c5aafd3f60 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -214,6 +214,21 @@ public:
return string("CUDA ") + deviceName;
}
+ bool support_device(bool experimental)
+ {
+ if(!experimental) {
+ int major, minor;
+ cuDeviceComputeCapability(&major, &minor, cuDevId);
+
+ if(major <= 1 && minor <= 2) {
+ cuda_error(string_printf("CUDA device supported only with compute capability 1.3 or up, found %d.%d.", major, minor));
+ return false;
+ }
+ }
+
+ return true;
+ }
+
string compile_kernel()
{
/* compute cubin name */
@@ -236,8 +251,11 @@ public:
if(path_exists(cubin))
return cubin;
-#ifdef WITH_CUDA_BINARIES
- cuda_error("CUDA binary kernel for this graphics card not found.");
+#if defined(WITH_CUDA_BINARIES) && defined(_WIN32)
+ if(major <= 1 && minor <= 2)
+ cuda_error(string_printf("CUDA device supported only compute capability 1.3 or up, found %d.%d.", major, minor));
+ else
+ cuda_error(string_printf("CUDA binary kernel for this graphics card compute capability (%d.%d) not found.", major, minor));
return "";
#else
/* if not, find CUDA compiler */
@@ -280,12 +298,15 @@ public:
#endif
}
- bool load_kernels()
+ bool load_kernels(bool experimental)
{
/* check if cuda init succeeded */
if(cuContext == 0)
return false;
+ if(!support_device(experimental))
+ return false;
+
/* get kernel */
string cubin = compile_kernel();
@@ -499,6 +520,12 @@ public:
cuda_assert(cuParamSeti(cuPathTrace, offset, task.h))
offset += sizeof(task.h);
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.offset))
+ offset += sizeof(task.offset);
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.stride))
+ offset += sizeof(task.stride);
+
cuda_assert(cuParamSetSize(cuPathTrace, offset))
/* launch kernel: todo find optimal size, cache config for fermi */
@@ -560,6 +587,12 @@ public:
cuda_assert(cuParamSeti(cuFilmConvert, offset, task.h))
offset += sizeof(task.h);
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.offset))
+ offset += sizeof(task.offset);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.stride))
+ offset += sizeof(task.stride);
+
cuda_assert(cuParamSetSize(cuFilmConvert, offset))
/* launch kernel: todo find optimal size, cache config for fermi */
@@ -582,16 +615,16 @@ public:
cuda_pop_context();
}
- void displace(DeviceTask& task)
+ void shader(DeviceTask& task)
{
cuda_push_context();
CUfunction cuDisplace;
- CUdeviceptr d_input = cuda_device_ptr(task.displace_input);
- CUdeviceptr d_offset = cuda_device_ptr(task.displace_offset);
+ CUdeviceptr d_input = cuda_device_ptr(task.shader_input);
+ CUdeviceptr d_offset = cuda_device_ptr(task.shader_output);
/* get kernel function */
- cuda_assert(cuModuleGetFunction(&cuDisplace, cuModule, "kernel_cuda_displace"))
+ cuda_assert(cuModuleGetFunction(&cuDisplace, cuModule, "kernel_cuda_shader"))
/* pass in parameters */
int offset = 0;
@@ -602,11 +635,14 @@ public:
cuda_assert(cuParamSetv(cuDisplace, offset, &d_offset, sizeof(d_offset)))
offset += sizeof(d_offset);
- int displace_x = task.displace_x;
- offset = cuda_align_up(offset, __alignof(displace_x));
+ int shader_eval_type = task.shader_eval_type;
+ offset = cuda_align_up(offset, __alignof(shader_eval_type));
+
+ cuda_assert(cuParamSeti(cuDisplace, offset, task.shader_eval_type))
+ offset += sizeof(task.shader_eval_type);
- cuda_assert(cuParamSeti(cuDisplace, offset, task.displace_x))
- offset += sizeof(task.displace_x);
+ cuda_assert(cuParamSeti(cuDisplace, offset, task.shader_x))
+ offset += sizeof(task.shader_x);
cuda_assert(cuParamSetSize(cuDisplace, offset))
@@ -616,7 +652,7 @@ public:
#else
int xthreads = 8;
#endif
- int xblocks = (task.displace_w + xthreads - 1)/xthreads;
+ int xblocks = (task.shader_w + xthreads - 1)/xthreads;
cuda_assert(cuFuncSetCacheConfig(cuDisplace, CU_FUNC_CACHE_PREFER_L1))
cuda_assert(cuFuncSetBlockShape(cuDisplace, xthreads, 1, 1))
@@ -795,8 +831,8 @@ public:
tonemap(task);
else if(task.type == DeviceTask::PATH_TRACE)
path_trace(task);
- else if(task.type == DeviceTask::DISPLACE)
- displace(task);
+ else if(task.type == DeviceTask::SHADER)
+ shader(task);
}
void task_wait()
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index 128c80ac396..7f24e5789cc 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -132,10 +132,10 @@ public:
return desc.str();
}
- bool load_kernels()
+ bool load_kernels(bool experimental)
{
foreach(SubDevice& sub, devices)
- if(!sub.device->load_kernels())
+ if(!sub.device->load_kernels(experimental))
return false;
return true;
@@ -306,8 +306,8 @@ public:
if(task.buffer) subtask.buffer = sub.ptr_map[task.buffer];
if(task.rng_state) subtask.rng_state = sub.ptr_map[task.rng_state];
if(task.rgba) subtask.rgba = sub.ptr_map[task.rgba];
- if(task.displace_input) subtask.displace_input = sub.ptr_map[task.displace_input];
- if(task.displace_offset) subtask.displace_offset = sub.ptr_map[task.displace_offset];
+ if(task.shader_input) subtask.shader_input = sub.ptr_map[task.shader_input];
+ if(task.shader_output) subtask.shader_output = sub.ptr_map[task.shader_output];
sub.device->task_add(subtask);
}
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index d783ae6c174..6014dd0fdb7 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -25,6 +25,7 @@
#include "device.h"
#include "device_intern.h"
+#include "util_foreach.h"
#include "util_map.h"
#include "util_math.h"
#include "util_md5.h"
@@ -52,6 +53,7 @@ public:
map<string, device_memory*> mem_map;
device_ptr null_mem;
bool device_initialized;
+ string platform_name;
const char *opencl_error_string(cl_int err)
{
@@ -175,6 +177,10 @@ public:
if(opencl_error(ciErr))
return;
+ char name[256];
+ clGetPlatformInfo(cpPlatform, CL_PLATFORM_NAME, sizeof(name), &name, NULL);
+ platform_name = name;
+
cxContext = clCreateContext(0, 1, &cdDevice, NULL, NULL, &ciErr);
if(opencl_error(ciErr))
return;
@@ -277,14 +283,11 @@ public:
{
string build_options = " -cl-fast-relaxed-math ";
- /* Full Shading only on NVIDIA cards at the moment */
- char vendor[256];
-
- clGetPlatformInfo(cpPlatform, CL_PLATFORM_NAME, sizeof(vendor), &vendor, NULL);
- string name = vendor;
-
- if(name == "NVIDIA CUDA")
- build_options += "-D__KERNEL_SHADING__ -D__MULTI_CLOSURE__ ";
+ /* full shading only on NVIDIA cards at the moment */
+ if(platform_name == "NVIDIA CUDA")
+ build_options += "-D__KERNEL_SHADING__ -D__MULTI_CLOSURE__ -cl-nv-maxrregcount=24 -cl-nv-verbose ";
+ if(platform_name == "Apple")
+ build_options += " -D__CL_NO_FLOAT3__ ";
return build_options;
}
@@ -365,7 +368,7 @@ public:
return md5.get_hex();
}
- bool load_kernels()
+ bool load_kernels(bool experimental)
{
/* verify if device was initialized */
if(!device_initialized) {
@@ -541,6 +544,8 @@ public:
cl_int d_w = task.w;
cl_int d_h = task.h;
cl_int d_sample = task.sample;
+ cl_int d_offset = task.offset;
+ cl_int d_stride = task.stride;
/* sample arguments */
int narg = 0;
@@ -559,6 +564,8 @@ public:
ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_y), (void*)&d_y);
ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_w), (void*)&d_w);
ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_h), (void*)&d_h);
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_offset), (void*)&d_offset);
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_stride), (void*)&d_stride);
opencl_assert(ciErr);
@@ -611,6 +618,8 @@ public:
cl_int d_h = task.h;
cl_int d_sample = task.sample;
cl_int d_resolution = task.resolution;
+ cl_int d_offset = task.offset;
+ cl_int d_stride = task.stride;
/* sample arguments */
int narg = 0;
@@ -630,6 +639,8 @@ public:
ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_y), (void*)&d_y);
ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_w), (void*)&d_w);
ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_h), (void*)&d_h);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_offset), (void*)&d_offset);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_stride), (void*)&d_stride);
opencl_assert(ciErr);
@@ -649,12 +660,24 @@ public:
opencl_assert(clFinish(cqCommandQueue));
}
- void task_add(DeviceTask& task)
+ void task_add(DeviceTask& maintask)
{
- if(task.type == DeviceTask::TONEMAP)
- tonemap(task);
- else if(task.type == DeviceTask::PATH_TRACE)
- path_trace(task);
+ list<DeviceTask> tasks;
+
+ /* arbitrary limit to work around apple ATI opencl issue */
+ if(platform_name == "Apple")
+ maintask.split_max_size(tasks, 76800);
+ else
+ tasks.push_back(maintask);
+
+ DeviceTask task;
+
+ foreach(DeviceTask& task, tasks) {
+ if(task.type == DeviceTask::TONEMAP)
+ tonemap(task);
+ else if(task.type == DeviceTask::PATH_TRACE)
+ path_trace(task);
+ }
}
void task_wait()
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index 73425486be1..939a74660a1 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -54,13 +54,17 @@ set(SRC_SVM_HEADERS
svm/svm.h
svm/svm_attribute.h
svm/svm_bsdf.h
+ svm/svm_camera.h
svm/svm_closure.h
svm/svm_convert.h
svm/svm_displace.h
svm/svm_fresnel.h
+ svm/svm_gamma.h
svm/svm_geometry.h
svm/svm_gradient.h
+ svm/svm_hsv.h
svm/svm_image.h
+ svm/svm_invert.h
svm/svm_light_path.h
svm/svm_magic.h
svm/svm_mapping.h
@@ -69,6 +73,8 @@ set(SRC_SVM_HEADERS
svm/svm_musgrave.h
svm/svm_noise.h
svm/svm_noisetex.h
+ svm/svm_normal.h
+ svm/svm_sepcomb_rgb.h
svm/svm_sky.h
svm/svm_tex_coord.h
svm/svm_texture.h
@@ -125,7 +131,7 @@ include_directories(${INC})
add_library(cycles_kernel ${SRC} ${SRC_HEADERS} ${SRC_SVM_HEADERS})
if(WITH_CYCLES_OPTIMIZED_KERNEL)
- SET_SOURCE_FILES_PROPERTIES(kernel_optimized.cpp PROPERTIES COMPILE_FLAGS ${CYCLES_OPTIMIZED_KERNEL_FLAGS})
+ set_source_files_properties(kernel_optimized.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_OPTIMIZED_KERNEL_FLAGS}")
endif()
if(WITH_CYCLES_CUDA)
@@ -137,7 +143,7 @@ endif()
#set(KERNEL_PREPROCESSED ${CMAKE_CURRENT_BINARY_DIR}/kernel_preprocessed.cl)
#add_custom_command(
# OUTPUT ${KERNEL_PREPROCESSED}
-# COMMAND gcc -x c++ -E ${CMAKE_CURRENT_SOURCE_DIR}/kernel.cl -I ${CMAKE_CURRENT_SOURCE_DIR}/../util/ -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DWITH_OPENCL -o ${KERNEL_PREPROCESSED}
+# COMMAND gcc -x c++ -E ${CMAKE_CURRENT_SOURCE_DIR}/kernel.cl -I ${CMAKE_CURRENT_SOURCE_DIR}/../util/ -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -o ${KERNEL_PREPROCESSED}
# DEPENDS ${SRC_KERNEL} ${SRC_UTIL_HEADERS})
#add_custom_target(cycles_kernel_preprocess ALL DEPENDS ${KERNEL_PREPROCESSED})
#delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${KERNEL_PREPROCESSED}" ${CYCLES_INSTALL_PATH}/kernel)
diff --git a/intern/cycles/kernel/SConscript b/intern/cycles/kernel/SConscript
new file mode 100644
index 00000000000..be3c37b476c
--- /dev/null
+++ b/intern/cycles/kernel/SConscript
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+import sys
+import os
+import Blender as B
+
+def normpath(path):
+ return os.path.abspath(os.path.normpath(path))
+
+Import ('env')
+
+kernel_binaries = []
+
+#Bitness
+if B.bitness == 32:
+ bits = 32
+else:
+ bits = 64
+
+if env['WITH_BF_CYCLES_CUDA_BINARIES']:
+ kernel = env.Clone()
+
+ # cuda info
+ nvcc = env['BF_CYCLES_CUDA_NVCC']
+ cuda_archs = env['BF_CYCLES_CUDA_BINARIES_ARCH']
+
+ # build directory
+ root_build_dir = normpath(env['BF_BUILDDIR'])
+ build_dir = os.path.join(root_build_dir, 'intern/cycles/kernel')
+
+ # source directories and files
+ source_dir = Dir('.').srcnode().path
+ kernel_file = os.path.join(source_dir, "kernel.cu")
+ util_dir = os.path.join(source_dir, "../util")
+ svm_dir = os.path.join(source_dir, "../svm")
+
+ # nvcc flags
+ nvcc_flags = "-m%s" % (bits)
+ nvcc_flags += " --cubin -use_fast_math --ptxas-options=\"-v\" --maxrregcount=24"
+ nvcc_flags += " --opencc-options -OPT:Olimit=0"
+ nvcc_flags += " -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DNVCC"
+ nvcc_flags += " -I \"%s\" -I \"%s\"" % (util_dir, svm_dir)
+
+ # dependencies
+ dependencies = ['kernel.cu'] + kernel.Glob('*.h') + kernel.Glob('../util/*.h') + kernel.Glob('svm/*.h')
+ last_cubin_file = None
+
+ # add command for each cuda architecture
+ for arch in cuda_archs:
+ cubin_file = os.path.join(build_dir, "kernel_%s.cubin" % arch)
+
+ command = "\"%s\" -arch=%s %s \"%s\" -o \"%s\"" % (nvcc, arch, nvcc_flags, kernel_file, cubin_file)
+
+ kernel.Command(cubin_file, 'kernel.cu', command)
+ kernel.Depends(cubin_file, dependencies)
+
+ kernel_binaries.append(cubin_file)
+
+ if not env['WITH_BF_CYCLES_CUDA_THREADED_COMPILE']:
+ # trick to compile one kernel at a time to reduce memory usage
+ if last_cubin_file:
+ kernel.Depends(cubin_file, last_cubin_file)
+ last_cubin_file = cubin_file
+
+Return('kernel_binaries')
+
diff --git a/intern/cycles/kernel/kernel.cl b/intern/cycles/kernel/kernel.cl
index c00bc3fe957..479cf9b2e64 100644
--- a/intern/cycles/kernel/kernel.cl
+++ b/intern/cycles/kernel/kernel.cl
@@ -36,7 +36,7 @@ __kernel void kernel_ocl_path_trace(
#include "kernel_textures.h"
int sample,
- int sx, int sy, int sw, int sh)
+ int sx, int sy, int sw, int sh, int offset, int stride)
{
KernelGlobals kglobals, *kg = &kglobals;
@@ -50,7 +50,7 @@ __kernel void kernel_ocl_path_trace(
int y = sy + get_global_id(1);
if(x < sx + sw && y < sy + sh)
- kernel_path_trace(kg, buffer, rng_state, sample, x, y);
+ kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
}
__kernel void kernel_ocl_tonemap(
@@ -63,7 +63,7 @@ __kernel void kernel_ocl_tonemap(
#include "kernel_textures.h"
int sample, int resolution,
- int sx, int sy, int sw, int sh)
+ int sx, int sy, int sw, int sh, int offset, int stride)
{
KernelGlobals kglobals, *kg = &kglobals;
@@ -77,13 +77,13 @@ __kernel void kernel_ocl_tonemap(
int y = sy + get_global_id(1);
if(x < sx + sw && y < sy + sh)
- kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y);
+ kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y, offset, stride);
}
-/*__kernel void kernel_ocl_displace(__global uint4 *input, __global float3 *offset, int sx)
+/*__kernel void kernel_ocl_shader(__global uint4 *input, __global float3 *output, int type, int sx)
{
int x = sx + get_global_id(0);
- kernel_displace(input, offset, x);
+ kernel_shader_evaluate(input, output, (ShaderEvalType)type, x);
}*/
diff --git a/intern/cycles/kernel/kernel.cpp b/intern/cycles/kernel/kernel.cpp
index 52a3852aa01..e66ddd86cd6 100644
--- a/intern/cycles/kernel/kernel.cpp
+++ b/intern/cycles/kernel/kernel.cpp
@@ -204,23 +204,23 @@ void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t
/* Path Tracing */
-void kernel_cpu_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y)
+void kernel_cpu_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
{
- kernel_path_trace(kg, buffer, rng_state, sample, x, y);
+ kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
}
/* Tonemapping */
-void kernel_cpu_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y)
+void kernel_cpu_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y, int offset, int stride)
{
- kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y);
+ kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y, offset, stride);
}
-/* Displacement */
+/* Shader Evaluation */
-void kernel_cpu_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i)
+void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float3 *output, int type, int i)
{
- kernel_displace(kg, input, offset, i);
+ kernel_shader_evaluate(kg, input, output, (ShaderEvalType)type, i);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel.cu b/intern/cycles/kernel/kernel.cu
index 75415a00b00..c97aeb67548 100644
--- a/intern/cycles/kernel/kernel.cu
+++ b/intern/cycles/kernel/kernel.cu
@@ -26,28 +26,28 @@
#include "kernel_path.h"
#include "kernel_displace.h"
-extern "C" __global__ void kernel_cuda_path_trace(float4 *buffer, uint *rng_state, int sample, int sx, int sy, int sw, int sh)
+extern "C" __global__ void kernel_cuda_path_trace(float4 *buffer, uint *rng_state, int sample, int sx, int sy, int sw, int sh, int offset, int stride)
{
int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
int y = sy + blockDim.y*blockIdx.y + threadIdx.y;
if(x < sx + sw && y < sy + sh)
- kernel_path_trace(NULL, buffer, rng_state, sample, x, y);
+ kernel_path_trace(NULL, buffer, rng_state, sample, x, y, offset, stride);
}
-extern "C" __global__ void kernel_cuda_tonemap(uchar4 *rgba, float4 *buffer, int sample, int resolution, int sx, int sy, int sw, int sh)
+extern "C" __global__ void kernel_cuda_tonemap(uchar4 *rgba, float4 *buffer, int sample, int resolution, int sx, int sy, int sw, int sh, int offset, int stride)
{
int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
int y = sy + blockDim.y*blockIdx.y + threadIdx.y;
if(x < sx + sw && y < sy + sh)
- kernel_film_tonemap(NULL, rgba, buffer, sample, resolution, x, y);
+ kernel_film_tonemap(NULL, rgba, buffer, sample, resolution, x, y, offset, stride);
}
-extern "C" __global__ void kernel_cuda_displace(uint4 *input, float3 *offset, int sx)
+extern "C" __global__ void kernel_cuda_shader(uint4 *input, float3 *output, int type, int sx)
{
int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
- kernel_displace(NULL, input, offset, x);
+ kernel_shader_evaluate(NULL, input, output, (ShaderEvalType)type, x);
}
diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h
index 700ee49c5f2..20d43c91169 100644
--- a/intern/cycles/kernel/kernel.h
+++ b/intern/cycles/kernel/kernel.h
@@ -36,14 +36,20 @@ bool kernel_osl_use(KernelGlobals *kg);
void kernel_const_copy(KernelGlobals *kg, const char *name, void *host, size_t size);
void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t width, size_t height);
-void kernel_cpu_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y);
-void kernel_cpu_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y);
-void kernel_cpu_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i);
+void kernel_cpu_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state,
+ int sample, int x, int y, int offset, int stride);
+void kernel_cpu_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer,
+ int sample, int resolution, int x, int y, int offset, int stride);
+void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float3 *output,
+ int type, int i);
#ifdef WITH_OPTIMIZED_KERNEL
-void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y);
-void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y);
-void kernel_cpu_optimized_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i);
+void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state,
+ int sample, int x, int y, int offset, int stride);
+void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer,
+ int sample, int resolution, int x, int y, int offset, int stride);
+void kernel_cpu_optimized_shader(KernelGlobals *kg, uint4 *input, float3 *output,
+ int type, int i);
#endif
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h
index 04150b7ea90..35215fd0f9f 100644
--- a/intern/cycles/kernel/kernel_bvh.h
+++ b/intern/cycles/kernel/kernel_bvh.h
@@ -33,6 +33,15 @@ CCL_NAMESPACE_BEGIN
#define BVH_NODE_SIZE 4
#define TRI_NODE_SIZE 3
+/* silly workaround for float extended precision that happens when compiling
+ without sse support on x86, it results in different results for float ops
+ that you would otherwise expect to compare correctly */
+#if !defined(__i386__) || defined(__SSE__)
+#define NO_EXTENDED_PRECISION
+#else
+#define NO_EXTENDED_PRECISION volatile
+#endif
+
__device_inline float3 bvh_inverse_direction(float3 dir)
{
/* avoid divide by zero (ooeps = exp2f(-80.0f)) */
@@ -94,8 +103,8 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg,
float c0hiy = n0xy.w * idir.y - ood.y;
float c0loz = nz.x * idir.z - ood.z;
float c0hiz = nz.y * idir.z - ood.z;
- float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f);
- float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t);
+ NO_EXTENDED_PRECISION float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f);
+ NO_EXTENDED_PRECISION float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t);
float c1loz = nz.z * idir.z - ood.z;
float c1hiz = nz.w * idir.z - ood.z;
@@ -103,8 +112,8 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg,
float c1hix = n1xy.y * idir.x - ood.x;
float c1loy = n1xy.z * idir.y - ood.y;
float c1hiy = n1xy.w * idir.y - ood.y;
- float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f);
- float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t);
+ NO_EXTENDED_PRECISION float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f);
+ NO_EXTENDED_PRECISION float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t);
/* decide which nodes to traverse next */
#ifdef __VISIBILITY_FLAG__
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
index 9cdc2f1f865..2dbdd076891 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -74,8 +74,8 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
- ray->dD.dx = normalize(Ddiff + kernel_data.cam.dx) - normalize(Ddiff);
- ray->dD.dy = normalize(Ddiff + kernel_data.cam.dy) - normalize(Ddiff);
+ ray->dD.dx = normalize(Ddiff + float4_to_float3(kernel_data.cam.dx)) - normalize(Ddiff);
+ ray->dD.dy = normalize(Ddiff + float4_to_float3(kernel_data.cam.dy)) - normalize(Ddiff);
#endif
#ifdef __CAMERA_CLIPPING__
@@ -107,8 +107,8 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
#ifdef __RAY_DIFFERENTIALS__
/* ray differential */
- ray->dP.dx = kernel_data.cam.dx;
- ray->dP.dy = kernel_data.cam.dy;
+ ray->dP.dx = float4_to_float3(kernel_data.cam.dx);
+ ray->dP.dy = float4_to_float3(kernel_data.cam.dy);
ray->dD.dx = make_float3(0.0f, 0.0f, 0.0f);
ray->dD.dy = make_float3(0.0f, 0.0f, 0.0f);
diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h
index 5515966807b..9fbd8566ecd 100644
--- a/intern/cycles/kernel/kernel_compat_opencl.h
+++ b/intern/cycles/kernel/kernel_compat_opencl.h
@@ -25,12 +25,21 @@
/* no namespaces in opencl */
#define CCL_NAMESPACE_BEGIN
#define CCL_NAMESPACE_END
-#define WITH_OPENCL
+
+#ifdef __CL_NO_FLOAT3__
+#define float3 float4
+#endif
+
+#ifdef __CL_NOINLINE__
+#define __noinline __attribute__((noinline))
+#else
+#define __noinline
+#endif
/* in opencl all functions are device functions, so leave this empty */
#define __device
-#define __device_inline
-#define __device_noinline
+#define __device_inline __device
+#define __device_noinline __device __noinline
/* no assert in opencl */
#define kernel_assert(cond)
@@ -68,7 +77,11 @@ __device float kernel_tex_interp_(__global float *data, int width, float x)
#endif
#define make_float2(x, y) ((float2)(x, y))
+#ifdef __CL_NO_FLOAT3__
+#define make_float3(x, y, z) ((float4)(x, y, z, 0.0))
+#else
#define make_float3(x, y, z) ((float3)(x, y, z))
+#endif
#define make_float4(x, y, z, w) ((float4)(x, y, z, w))
#define make_int2(x, y) ((int2)(x, y))
#define make_int3(x, y, z) ((int3)(x, y, z))
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h
index ef6c3810a75..c39e5e43dbb 100644
--- a/intern/cycles/kernel/kernel_displace.h
+++ b/intern/cycles/kernel/kernel_displace.h
@@ -18,17 +18,51 @@
CCL_NAMESPACE_BEGIN
-__device void kernel_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i)
+__device void kernel_shader_evaluate(KernelGlobals *kg, uint4 *input, float3 *output, ShaderEvalType type, int i)
{
- /* setup shader data */
ShaderData sd;
uint4 in = input[i];
- shader_setup_from_displace(kg, &sd, in.x, in.y, __int_as_float(in.z), __int_as_float(in.w));
+ float3 out;
- /* evaluate */
- float3 P = sd.P;
- shader_eval_displacement(kg, &sd);
- offset[i] = sd.P - P;
+ if(type == SHADER_EVAL_DISPLACE) {
+ /* setup shader data */
+ int object = in.x;
+ int prim = in.y;
+ float u = __int_as_float(in.z);
+ float v = __int_as_float(in.w);
+
+ shader_setup_from_displace(kg, &sd, object, prim, u, v);
+
+ /* evaluate */
+ float3 P = sd.P;
+ shader_eval_displacement(kg, &sd);
+ out = sd.P - P;
+ }
+ else { // SHADER_EVAL_BACKGROUND
+ /* setup ray */
+ Ray ray;
+
+ ray.P = make_float3(0.0f, 0.0f, 0.0f);
+ ray.D = make_float3(__int_as_float(in.x), __int_as_float(in.y), __int_as_float(in.z));
+ ray.t = 0.0f;
+
+#ifdef __RAY_DIFFERENTIALS__
+ ray.dD.dx = make_float3(0.0f, 0.0f, 0.0f);
+ ray.dD.dy = make_float3(0.0f, 0.0f, 0.0f);
+ ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f);
+ ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f);
+#endif
+
+ /* setup shader data */
+ shader_setup_from_background(kg, &sd, &ray);
+
+ /* evaluate */
+ int flag = 0; /* we can't know which type of BSDF this is for */
+ out = shader_eval_background(kg, &sd, flag);
+ }
+
+ /* write output */
+ output[i] = out;
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_film.h b/intern/cycles/kernel/kernel_film.h
index 4373701452e..cd8acc9647a 100644
--- a/intern/cycles/kernel/kernel_film.h
+++ b/intern/cycles/kernel/kernel_film.h
@@ -48,10 +48,9 @@ __device uchar4 film_float_to_byte(float4 color)
return result;
}
-__device void kernel_film_tonemap(KernelGlobals *kg, __global uchar4 *rgba, __global float4 *buffer, int sample, int resolution, int x, int y)
+__device void kernel_film_tonemap(KernelGlobals *kg, __global uchar4 *rgba, __global float4 *buffer, int sample, int resolution, int x, int y, int offset, int stride)
{
- int w = kernel_data.cam.width;
- int index = x + y*w;
+ int index = offset + x + y*stride;
float4 irradiance = buffer[index];
float4 float_result = film_map(kg, irradiance, sample);
diff --git a/intern/cycles/kernel/kernel_optimized.cpp b/intern/cycles/kernel/kernel_optimized.cpp
index 85a2b798a62..c437e06adfa 100644
--- a/intern/cycles/kernel/kernel_optimized.cpp
+++ b/intern/cycles/kernel/kernel_optimized.cpp
@@ -35,23 +35,23 @@ CCL_NAMESPACE_BEGIN
/* Path Tracing */
-void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y)
+void kernel_cpu_optimized_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y, int offset, int stride)
{
- kernel_path_trace(kg, buffer, rng_state, sample, x, y);
+ kernel_path_trace(kg, buffer, rng_state, sample, x, y, offset, stride);
}
/* Tonemapping */
-void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y)
+void kernel_cpu_optimized_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y, int offset, int stride)
{
- kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y);
+ kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y, offset, stride);
}
-/* Displacement */
+/* Shader Evaluate */
-void kernel_cpu_optimized_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i)
+void kernel_cpu_optimized_shader(KernelGlobals *kg, uint4 *input, float3 *output, int type, int i)
{
- kernel_displace(kg, input, offset, i);
+ kernel_shader_evaluate(kg, input, output, (ShaderEvalType)type, i);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index c609f6f13fe..d27ad861c6a 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -34,7 +34,7 @@
CCL_NAMESPACE_BEGIN
#ifdef __MODIFY_TP__
-__device float3 path_terminate_modified_throughput(KernelGlobals *kg, __global float3 *buffer, int x, int y, int sample)
+__device float3 path_terminate_modified_throughput(KernelGlobals *kg, __global float3 *buffer, int x, int y, int offset, int stride, int sample)
{
/* modify throughput to influence path termination probability, to avoid
darker regions receiving fewer samples than lighter regions. also RGB
@@ -45,7 +45,7 @@ __device float3 path_terminate_modified_throughput(KernelGlobals *kg, __global f
const float minL = 0.1f;
if(sample >= minsample) {
- float3 L = buffer[x + y*kernel_data.cam.width];
+ float3 L = buffer[offset + x + y*stride];
float3 Lmin = make_float3(minL, minL, minL);
float correct = (float)(sample+1)/(float)sample;
@@ -130,13 +130,16 @@ __device_inline void path_state_next(KernelGlobals *kg, PathState *state, int la
}
}
-__device_inline uint path_state_ray_visibility(PathState *state)
+__device_inline uint path_state_ray_visibility(KernelGlobals *kg, PathState *state)
{
uint flag = state->flag;
/* for visibility, diffuse/glossy are for reflection only */
if(flag & PATH_RAY_TRANSMIT)
flag &= ~(PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY);
+ /* for camera visibility, use render layer flags */
+ if(flag & PATH_RAY_CAMERA)
+ flag |= kernel_data.integrator.layer_flag;
return flag;
}
@@ -249,7 +252,7 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
for(;; rng_offset += PRNG_BOUNCE_NUM) {
/* intersect scene */
Intersection isect;
- uint visibility = path_state_ray_visibility(&state);
+ uint visibility = path_state_ray_visibility(kg, &state);
if(!scene_intersect(kg, &ray, visibility, &isect)) {
/* eval background shader if nothing hit */
@@ -379,7 +382,7 @@ __device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, R
return make_float4(L.x, L.y, L.z, 1.0f - Ltransparent);
}
-__device void kernel_path_trace(KernelGlobals *kg, __global float4 *buffer, __global uint *rng_state, int sample, int x, int y)
+__device void kernel_path_trace(KernelGlobals *kg, __global float4 *buffer, __global uint *rng_state, int sample, int x, int y, int offset, int stride)
{
/* initialize random numbers */
RNG rng;
@@ -387,7 +390,7 @@ __device void kernel_path_trace(KernelGlobals *kg, __global float4 *buffer, __gl
float filter_u;
float filter_v;
- path_rng_init(kg, rng_state, sample, &rng, x, y, &filter_u, &filter_v);
+ path_rng_init(kg, rng_state, sample, &rng, x, y, offset, stride, &filter_u, &filter_v);
/* sample camera ray */
Ray ray;
@@ -399,7 +402,7 @@ __device void kernel_path_trace(KernelGlobals *kg, __global float4 *buffer, __gl
/* integrate */
#ifdef __MODIFY_TP__
- float3 throughput = path_terminate_modified_throughput(kg, buffer, x, y, sample);
+ float3 throughput = path_terminate_modified_throughput(kg, buffer, x, y, offset, stride, sample);
float4 L = kernel_path_integrate(kg, &rng, sample, ray, throughput)/throughput;
#else
float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
@@ -407,14 +410,14 @@ __device void kernel_path_trace(KernelGlobals *kg, __global float4 *buffer, __gl
#endif
/* accumulate result in output buffer */
- int index = x + y*kernel_data.cam.width;
+ int index = offset + x + y*stride;
if(sample == 0)
buffer[index] = L;
else
buffer[index] += L;
- path_rng_end(kg, rng_state, rng, x, y);
+ path_rng_end(kg, rng_state, rng, x, y, offset, stride);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
index ba97ab3e3b6..41301ebd3dc 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -123,7 +123,7 @@ __device_inline float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dime
#endif
}
-__device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, float *fx, float *fy)
+__device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, int offset, int stride, float *fx, float *fy)
{
#ifdef __SOBOL_FULL_SCREEN__
uint px, py;
@@ -138,7 +138,7 @@ __device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state,
*fx = size * (float)px * (1.0f/(float)0xFFFFFFFF) - x;
*fy = size * (float)py * (1.0f/(float)0xFFFFFFFF) - y;
#else
- *rng = rng_state[x + y*kernel_data.cam.width];
+ *rng = rng_state[offset + x + y*stride];
*rng ^= kernel_data.integrator.seed;
@@ -147,7 +147,7 @@ __device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state,
#endif
}
-__device void path_rng_end(KernelGlobals *kg, __global uint *rng_state, RNG rng, int x, int y)
+__device void path_rng_end(KernelGlobals *kg, __global uint *rng_state, RNG rng, int x, int y, int offset, int stride)
{
/* nothing to do */
}
@@ -163,10 +163,10 @@ __device float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dimension)
return (float)*rng * (1.0f/(float)0xFFFFFFFF);
}
-__device void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, float *fx, float *fy)
+__device void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, int offset, int stride, float *fx, float *fy)
{
/* load state */
- *rng = rng_state[x + y*kernel_data.cam.width];
+ *rng = rng_state[offset + x + y*stride];
*rng ^= kernel_data.integrator.seed;
@@ -174,10 +174,10 @@ __device void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sam
*fy = path_rng(kg, rng, sample, PRNG_FILTER_V);
}
-__device void path_rng_end(KernelGlobals *kg, __global uint *rng_state, RNG rng, int x, int y)
+__device void path_rng_end(KernelGlobals *kg, __global uint *rng_state, RNG rng, int x, int y, int offset, int stride)
{
/* store state for next sample */
- rng_state[x + y*kernel_data.cam.width] = rng;
+ rng_state[offset + x + y*stride] = rng;
}
#endif
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index d9bd645b16d..2c03a34df1f 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -78,6 +78,13 @@ CCL_NAMESPACE_BEGIN
//#define __MODIFY_TP__
//#define __QBVH__
+/* Shader Evaluation */
+
+enum ShaderEvalType {
+ SHADER_EVAL_DISPLACE,
+ SHADER_EVAL_BACKGROUND
+};
+
/* Path Tracing */
enum PathTraceDimension {
@@ -100,7 +107,10 @@ enum PathTraceDimension {
/* these flag values correspond exactly to OSL defaults, so be careful not to
* change this, or if you do, set the "raytypes" shading system attribute with
- * your own new ray types and bitflag values */
+ * your own new ray types and bitflag values.
+ *
+ * for ray visibility tests in BVH traversal, the upper 20 bits are used for
+ * layer visibility tests. */
enum PathRayFlag {
PATH_RAY_CAMERA = 1,
@@ -117,7 +127,9 @@ enum PathRayFlag {
PATH_RAY_MIS_SKIP = 512,
- PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512)
+ PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512),
+
+ PATH_RAY_LAYER_SHIFT = (32-20)
};
/* Closure Label */
@@ -295,29 +307,24 @@ typedef struct ShaderData {
#endif
} ShaderData;
-/* Constrant Kernel Data */
+/* Constrant Kernel Data
+ *
+ * These structs are passed from CPU to various devices, and the struct layout
+ * must match exactly. Structs are padded to ensure 16 byte alignment, and we
+ * do not use float3 because its size may not be the same on all devices. */
typedef struct KernelCamera {
/* type */
int ortho;
- int pad;
-
- /* size */
- int width, height;
+ int pad1, pad2, pad3;
/* matrices */
Transform cameratoworld;
Transform rastertocamera;
/* differentials */
- float3 dx;
-#ifndef WITH_OPENCL
- float pad1;
-#endif
- float3 dy;
-#ifndef WITH_OPENCL
- float pad2;
-#endif
+ float4 dx;
+ float4 dy;
/* depth of field */
float aperturesize;
@@ -358,10 +365,6 @@ typedef struct KernelBackground {
typedef struct KernelSunSky {
/* sun direction in spherical and cartesian */
float theta, phi, pad3, pad4;
- float3 dir;
-#ifndef WITH_OPENCL
- float pad;
-#endif
/* perez function parameters */
float zenith_Y, zenith_x, zenith_y, pad2;
@@ -392,10 +395,12 @@ typedef struct KernelIntegrator {
/* caustics */
int no_caustics;
- float blur_caustics;
/* seed */
int seed;
+
+ /* render layer */
+ int layer_flag;
} KernelIntegrator;
typedef struct KernelBVH {
diff --git a/intern/cycles/kernel/osl/nodes/CMakeLists.txt b/intern/cycles/kernel/osl/nodes/CMakeLists.txt
index 1b8b81eb6f6..1a207d6c139 100644
--- a/intern/cycles/kernel/osl/nodes/CMakeLists.txt
+++ b/intern/cycles/kernel/osl/nodes/CMakeLists.txt
@@ -7,6 +7,7 @@ set(SRC_OSL
node_background.osl
node_blend_texture.osl
node_bump.osl
+ node_camera.osl
node_clouds_texture.osl
node_convert_from_color.osl
node_convert_from_float.osl
@@ -18,10 +19,13 @@ set(SRC_OSL
node_emission.osl
node_environment_texture.osl
node_fresnel.osl
+ node_gamma.osl
node_geometry.osl
node_glass_bsdf.osl
node_glossy_bsdf.osl
+ node_hsv.osl
node_image_texture.osl
+ node_invert.osl
node_light_path.osl
node_magic_texture.osl
node_mapping.osl
@@ -30,11 +34,13 @@ set(SRC_OSL
node_mix.osl
node_mix_closure.osl
node_musgrave_texture.osl
+ node_normal.osl
node_blend_weight_texture.osl
node_noise_texture.osl
node_output_displacement.osl
node_output_surface.osl
node_output_volume.osl
+ node_sepcomb_rgb.osl
node_sky_texture.osl
node_stucci_texture.osl
node_texture_coordinate.osl
diff --git a/intern/cycles/kernel/osl/nodes/node_camera.osl b/intern/cycles/kernel/osl/nodes/node_camera.osl
new file mode 100644
index 00000000000..0b50084db0f
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_camera.osl
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_camera(
+ output vector ViewVector = vector(0.0, 0.0, 0.0),
+ output float ViewZDepth = 0.0,
+ output float ViewDistance = 0.0)
+{
+ ViewVector = (vector)transform("world", "camera", P);
+
+ ViewZDepth = fabs(ViewVector[2]);
+ ViewDistance = lenght(ViewVector);
+
+ ViewVector = normalize(ViewVector);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_color.h b/intern/cycles/kernel/osl/nodes/node_color.h
index b92973d1dfe..37d092eae78 100644
--- a/intern/cycles/kernel/osl/nodes/node_color.h
+++ b/intern/cycles/kernel/osl/nodes/node_color.h
@@ -48,3 +48,78 @@ color color_scene_linear_to_srgb(color c)
color_scene_linear_to_srgb(c[2]));
}
+/* Color Operations */
+
+color rgb_to_hsv(color rgb)
+{
+ float cmax, cmin, h, s, v, cdelta;
+ color c;
+
+ cmax = max(rgb[0], max(rgb[1], rgb[2]));
+ cmin = min(rgb[0], min(rgb[1], rgb[2]));
+ cdelta = cmax - cmin;
+
+ v = cmax;
+
+ if(cmax != 0.0) {
+ s = cdelta/cmax;
+ }
+ else {
+ s = 0.0;
+ h = 0.0;
+ }
+
+ if(s == 0.0) {
+ h = 0.0;
+ }
+ else {
+ c = (color(cmax, cmax, cmax) - rgb)/cdelta;
+
+ if(rgb[0] == cmax) h = c[2] - c[1];
+ else if(rgb[1] == cmax) h = 2.0 + c[0] - c[2];
+ else h = 4.0 + c[1] - c[0];
+
+ h /= 6.0;
+
+ if(h < 0.0)
+ h += 1.0;
+ }
+
+ return color(h, s, v);
+}
+
+color hsv_to_rgb(color hsv)
+{
+ float i, f, p, q, t, h, s, v;
+ color rgb;
+
+ h = hsv[0];
+ s = hsv[1];
+ v = hsv[2];
+
+ if(s==0.0) {
+ rgb = color(v, v, v);
+ }
+ else {
+ if(h==1.0)
+ h = 0.0;
+
+ h *= 6.0;
+ i = floor(h);
+ f = h - i;
+ rgb = color(f, f, f);
+ p = v*(1.0-s);
+ q = v*(1.0-(s*f));
+ t = v*(1.0-(s*(1.0-f)));
+
+ if(i == 0.0) rgb = color(v, t, p);
+ else if(i == 1.0) rgb = color(q, v, p);
+ else if(i == 2.0) rgb = color(p, v, t);
+ else if(i == 3.0) rgb = color(p, q, v);
+ else if(i == 4.0) rgb = color(t, p, v);
+ else rgb = color(v, p, q);
+ }
+
+ return rgb;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_gamma.osl b/intern/cycles/kernel/osl/nodes/node_gamma.osl
new file mode 100644
index 00000000000..4dae07d70bc
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_gamma.osl
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_gamma(
+ color ColorIn = color(0.8, 0.8, 0.8),
+ float Gamma = 1.0,
+ output ColorOut = color(0.8, 0.8, 0.8)
+{
+ int i;
+ for (i=0;i<3;i++) {
+ if (ColorIn[i] > 0.0)
+ ColorIn[i] = powf(ColorIn[i], Gamma);
+ }
+
+ ColorOut = ColorIn;
+}
diff --git a/intern/cycles/kernel/osl/nodes/node_hsv.osl b/intern/cycles/kernel/osl/nodes/node_hsv.osl
new file mode 100644
index 00000000000..8fd7a1612e8
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_hsv.osl
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+#include "node_color.h"
+
+shader node_hsv(
+ float Hue = 0.5,
+ float Saturation = 1.0,
+ float Value = 1.0,
+ float Fac = 0.5,
+ color ColorIn = color(0.0, 0.0, 0.0),
+ output color ColorOut = color(0.0, 0.0, 0.0))
+{
+ float t = clamp(Fac, 0.0, 1.0);
+ color Color = rgb_to_hsv(ColorIn);
+
+ // remember: fmod doesn't work for negative numbers
+ Color[0] += Hue + 0.5;
+ Color[0] = fmod(Color[0], 1.0);
+ Color[1] *= Saturation;
+ Color[2] *= Value;
+
+ Color = hsv_to_rgb(Color);
+
+ ColorOut = mix(Color, ColorIn, t);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_invert.osl b/intern/cycles/kernel/osl/nodes/node_invert.osl
new file mode 100644
index 00000000000..817198c4561
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_invert.osl
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_invert(
+ float Fac = 1.0,
+ color ColorIn = color(0.8, 0.8, 0.8),
+ output ColorOut = color(0.8, 0.8, 0.8)
+{
+ color ColorInv = color(1.0) - ColorIn;
+ ColorOut = mix(ColorIn, ColorInv, Fac);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_mix.osl b/intern/cycles/kernel/osl/nodes/node_mix.osl
index 582aa7b3c60..8a462c995d3 100644
--- a/intern/cycles/kernel/osl/nodes/node_mix.osl
+++ b/intern/cycles/kernel/osl/nodes/node_mix.osl
@@ -17,79 +17,7 @@
*/
#include "stdosl.h"
-
-color rgb_to_hsv(color rgb)
-{
- float cmax, cmin, h, s, v, cdelta;
- color c;
-
- cmax = max(rgb[0], max(rgb[1], rgb[2]));
- cmin = min(rgb[0], min(rgb[1], rgb[2]));
- cdelta = cmax - cmin;
-
- v = cmax;
-
- if(cmax != 0.0) {
- s = cdelta/cmax;
- }
- else {
- s = 0.0;
- h = 0.0;
- }
-
- if(s == 0.0) {
- h = 0.0;
- }
- else {
- c = (color(cmax, cmax, cmax) - rgb)/cdelta;
-
- if(rgb[0] == cmax) h = c[2] - c[1];
- else if(rgb[1] == cmax) h = 2.0 + c[0] - c[2];
- else h = 4.0 + c[1] - c[0];
-
- h /= 6.0;
-
- if(h < 0.0)
- h += 1.0;
- }
-
- return color(h, s, v);
-}
-
-color hsv_to_rgb(color hsv)
-{
- float i, f, p, q, t, h, s, v;
- color rgb;
-
- h = hsv[0];
- s = hsv[1];
- v = hsv[2];
-
- if(s==0.0) {
- rgb = color(v, v, v);
- }
- else {
- if(h==1.0)
- h = 0.0;
-
- h *= 6.0;
- i = floor(h);
- f = h - i;
- rgb = color(f, f, f);
- p = v*(1.0-s);
- q = v*(1.0-(s*f));
- t = v*(1.0-(s*(1.0-f)));
-
- if(i == 0.0) rgb = color(v, t, p);
- else if(i == 1.0) rgb = color(q, v, p);
- else if(i == 2.0) rgb = color(p, v, t);
- else if(i == 3.0) rgb = color(p, q, v);
- else if(i == 4.0) rgb = color(t, p, v);
- else rgb = color(v, p, q);
- }
-
- return rgb;
-}
+#include "node_color.h"
color node_mix_blend(float t, color col1, color col2)
{
diff --git a/intern/cycles/kernel/osl/nodes/node_normal.osl b/intern/cycles/kernel/osl/nodes/node_normal.osl
new file mode 100644
index 00000000000..038a33c9898
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_normal.osl
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_normal(
+ normal Direction = normal(0.0, 0.0, 0.0),
+ normal NormalIn = normal(0.0, 0.0, 0.0),
+ output normal NormalOut = normal(0.0, 0.0, 0.0),
+ output float Dot = 1.0
+{
+ Direction = normalize(Direction);
+ NormalOut = Direction;
+ Dot = dot(Direction, NormalIn);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_sepcomb_rgb.osl b/intern/cycles/kernel/osl/nodes/node_sepcomb_rgb.osl
new file mode 100644
index 00000000000..a02f31f4b07
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_sepcomb_rgb.osl
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "stdosl.h"
+
+shader node_separate_rgb(
+ color Image = color(0.8, 0.8, 0.8),
+ output float R = 0.0,
+ output float G = 0.0,
+ output float B = 0.0)
+{
+ R = Image[0];
+ G = Image[1];
+ B = Image[2];
+}
+
+shader node_combine_rgb(
+ float R = 0.0,
+ float G = 0.0,
+ float B = 0.0,
+ output color Image = color(0.8, 0.8, 0.8)
+{
+ Image = color(R, G, B)
+}
+
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 2615272691c..5a8d6d62c79 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -126,14 +126,20 @@ CCL_NAMESPACE_END
#include "svm_convert.h"
#include "svm_displace.h"
#include "svm_fresnel.h"
+#include "svm_camera.h"
#include "svm_geometry.h"
+#include "svm_hsv.h"
#include "svm_image.h"
+#include "svm_gamma.h"
+#include "svm_invert.h"
#include "svm_light_path.h"
#include "svm_magic.h"
#include "svm_mapping.h"
+#include "svm_normal.h"
#include "svm_wave.h"
#include "svm_math.h"
#include "svm_mix.h"
+#include "svm_sepcomb_rgb.h"
#include "svm_musgrave.h"
#include "svm_sky.h"
#include "svm_tex_coord.h"
@@ -230,6 +236,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
svm_node_tex_magic(kg, sd, stack, node, &offset);
break;
#endif
+ case NODE_CAMERA:
+ svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
+ break;
case NODE_GEOMETRY:
svm_node_geometry(sd, stack, node.y, node.z);
break;
@@ -251,9 +260,24 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
case NODE_VALUE_V:
svm_node_value_v(kg, sd, stack, node.y, &offset);
break;
+ case NODE_INVERT:
+ svm_node_invert(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_GAMMA:
+ svm_node_gamma(sd, stack, node.y, node.z, node.w);
+ break;
case NODE_MIX:
svm_node_mix(kg, sd, stack, node.y, node.z, node.w, &offset);
break;
+ case NODE_SEPARATE_RGB:
+ svm_node_separate_rgb(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_COMBINE_RGB:
+ svm_node_combine_rgb(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_HSV:
+ svm_node_hsv(kg, sd, stack, node.y, node.z, node.w, &offset);
+ break;
case NODE_ATTR:
svm_node_attr(kg, sd, stack, node);
break;
@@ -281,6 +305,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
case NODE_VECTOR_MATH:
svm_node_vector_math(kg, sd, stack, node.y, node.z, node.w, &offset);
break;
+ case NODE_NORMAL:
+ svm_node_normal(kg, sd, stack, node.y, node.z, node.w, &offset);
+ break;
case NODE_MAPPING:
svm_node_mapping(kg, sd, stack, node.y, node.z, &offset);
break;
diff --git a/intern/cycles/kernel/svm/svm_camera.h b/intern/cycles/kernel/svm/svm_camera.h
new file mode 100644
index 00000000000..cf161ddcd8c
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_camera.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device void svm_node_camera(KernelGlobals *kg, ShaderData *sd, float *stack, uint out_vector, uint out_zdepth, uint out_distance)
+{
+ float distance;
+ float zdepth;
+ float3 vector;
+
+ Transform tfm = kernel_data.cam.worldtocamera;
+ vector = transform(&tfm, sd->P);
+ zdepth = vector.z;
+ distance = len(vector);
+
+ if (stack_valid(out_vector))
+ stack_store_float3(stack, out_vector, normalize(vector));
+
+ if (stack_valid(out_zdepth))
+ stack_store_float(stack, out_zdepth, zdepth);
+
+ if (stack_valid(out_distance))
+ stack_store_float(stack, out_distance, distance);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_gamma.h b/intern/cycles/kernel/svm/svm_gamma.h
new file mode 100644
index 00000000000..4a8967011c7
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_gamma.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device void svm_node_gamma(ShaderData *sd, float *stack, uint in_gamma, uint in_color, uint out_color)
+{
+ float3 color = stack_load_float3(stack, in_color);
+ float gamma = stack_load_float(stack, in_gamma);
+
+ if (color.x > 0.0)
+ color.x = powf(color.x, gamma);
+ if (color.y > 0.0)
+ color.y = powf(color.y, gamma);
+ if (color.z > 0.0)
+ color.z = powf(color.z, gamma);
+
+ if (stack_valid(out_color))
+ stack_store_float3(stack, out_color, color);
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/svm/svm_hsv.h b/intern/cycles/kernel/svm/svm_hsv.h
new file mode 100644
index 00000000000..ed17d3fc985
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_hsv.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __SVM_HSV_H__
+#define __SVM_HSV_H__
+
+CCL_NAMESPACE_BEGIN
+
+__device float3 rgb_to_hsv(float3 rgb)
+{
+ float cmax, cmin, h, s, v, cdelta;
+ float3 c;
+
+ cmax = fmaxf(rgb.x, fmaxf(rgb.y, rgb.z));
+ cmin = min(rgb.x, min(rgb.y, rgb.z));
+ cdelta = cmax - cmin;
+
+ v = cmax;
+
+ if(cmax != 0.0f) {
+ s = cdelta/cmax;
+ }
+ else {
+ s = 0.0f;
+ h = 0.0f;
+ }
+
+ if(s == 0.0f) {
+ h = 0.0f;
+ }
+ else {
+ float3 cmax3 = make_float3(cmax, cmax, cmax);
+ c = (cmax3 - rgb)/cdelta;
+
+ if(rgb.x == cmax) h = c.z - c.y;
+ else if(rgb.y == cmax) h = 2.0f + c.x - c.z;
+ else h = 4.0f + c.y - c.x;
+
+ h /= 6.0f;
+
+ if(h < 0.0f)
+ h += 1.0f;
+ }
+
+ return make_float3(h, s, v);
+}
+
+__device float3 hsv_to_rgb(float3 hsv)
+{
+ float i, f, p, q, t, h, s, v;
+ float3 rgb;
+
+ h = hsv.x;
+ s = hsv.y;
+ v = hsv.z;
+
+ if(s==0.0f) {
+ rgb = make_float3(v, v, v);
+ }
+ else {
+ if(h==1.0f)
+ h = 0.0f;
+
+ h *= 6.0f;
+ i = floor(h);
+ f = h - i;
+ rgb = make_float3(f, f, f);
+ p = v*(1.0f-s);
+ q = v*(1.0f-(s*f));
+ t = v*(1.0f-(s*(1.0f-f)));
+
+ if(i == 0.0f) rgb = make_float3(v, t, p);
+ else if(i == 1.0f) rgb = make_float3(q, v, p);
+ else if(i == 2.0f) rgb = make_float3(p, v, t);
+ else if(i == 3.0f) rgb = make_float3(p, q, v);
+ else if(i == 4.0f) rgb = make_float3(t, p, v);
+ else rgb = make_float3(v, p, q);
+ }
+
+ return rgb;
+}
+
+__device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint in_color_offset, uint fac_offset, uint out_color_offset, int *offset)
+{
+ /* read extra data */
+ uint4 node1 = read_node(kg, offset);
+
+ float fac = stack_load_float(stack, fac_offset);
+ float3 in_color = stack_load_float3(stack, in_color_offset);
+ float3 color = in_color;
+
+ float hue = stack_load_float(stack, node1.y);
+ float sat = stack_load_float(stack, node1.z);
+ float val = stack_load_float(stack, node1.w);
+
+ color = rgb_to_hsv(color);
+
+ // remember: fmod doesn't work for negative numbers
+ color.x += hue + 0.5f;
+ color.x = fmod(color.x, 1.0f);
+ color.y *= sat;
+ color.z *= val;
+
+ color = hsv_to_rgb(color);
+
+ color.x = fac*color.x + (1.0f - fac)*in_color.x;
+ color.y = fac*color.y + (1.0f - fac)*in_color.y;
+ color.z = fac*color.z + (1.0f - fac)*in_color.z;
+
+ if (stack_valid(out_color_offset))
+ stack_store_float3(stack, out_color_offset, color);
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __SVM_HSV_H__ */
+
diff --git a/intern/cycles/kernel/svm/svm_invert.h b/intern/cycles/kernel/svm/svm_invert.h
new file mode 100644
index 00000000000..a14d8ec82fa
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_invert.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device float invert(float color, float factor)
+{
+ return factor*(1.0f - color) + (1.0f - factor) * color;
+}
+
+__device void svm_node_invert(ShaderData *sd, float *stack, uint in_fac, uint in_color, uint out_color)
+{
+ float factor = stack_load_float(stack, in_fac);
+ float3 color = stack_load_float3(stack, in_color);
+
+ color.x = invert(color.x, factor);
+ color.y = invert(color.y, factor);
+ color.z = invert(color.z, factor);
+
+ if (stack_valid(out_color))
+ stack_store_float3(stack, out_color, color);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_mix.h b/intern/cycles/kernel/svm/svm_mix.h
index c9e6cdf43b9..e2274a2e691 100644
--- a/intern/cycles/kernel/svm/svm_mix.h
+++ b/intern/cycles/kernel/svm/svm_mix.h
@@ -16,81 +16,9 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-CCL_NAMESPACE_BEGIN
-
-__device float3 rgb_to_hsv(float3 rgb)
-{
- float cmax, cmin, h, s, v, cdelta;
- float3 c;
-
- cmax = fmaxf(rgb.x, fmaxf(rgb.y, rgb.z));
- cmin = min(rgb.x, min(rgb.y, rgb.z));
- cdelta = cmax - cmin;
-
- v = cmax;
-
- if(cmax != 0.0f) {
- s = cdelta/cmax;
- }
- else {
- s = 0.0f;
- h = 0.0f;
- }
-
- if(s == 0.0f) {
- h = 0.0f;
- }
- else {
- float3 cmax3 = make_float3(cmax, cmax, cmax);
- c = (cmax3 - rgb)/cdelta;
-
- if(rgb.x == cmax) h = c.z - c.y;
- else if(rgb.y == cmax) h = 2.0f + c.x - c.z;
- else h = 4.0f + c.y - c.x;
-
- h /= 6.0f;
+#include "svm_hsv.h"
- if(h < 0.0f)
- h += 1.0f;
- }
-
- return make_float3(h, s, v);
-}
-
-__device float3 hsv_to_rgb(float3 hsv)
-{
- float i, f, p, q, t, h, s, v;
- float3 rgb;
-
- h = hsv.x;
- s = hsv.y;
- v = hsv.z;
-
- if(s==0.0f) {
- rgb = make_float3(v, v, v);
- }
- else {
- if(h==1.0f)
- h = 0.0f;
-
- h *= 6.0f;
- i = floor(h);
- f = h - i;
- rgb = make_float3(f, f, f);
- p = v*(1.0f-s);
- q = v*(1.0f-(s*f));
- t = v*(1.0f-(s*(1.0f-f)));
-
- if(i == 0.0f) rgb = make_float3(v, t, p);
- else if(i == 1.0f) rgb = make_float3(q, v, p);
- else if(i == 2.0f) rgb = make_float3(p, v, t);
- else if(i == 3.0f) rgb = make_float3(p, q, v);
- else if(i == 4.0f) rgb = make_float3(t, p, v);
- else rgb = make_float3(v, p, q);
- }
-
- return rgb;
-}
+CCL_NAMESPACE_BEGIN
__device float3 svm_lerp(const float3 a, const float3 b, float t)
{
diff --git a/intern/cycles/kernel/svm/svm_normal.h b/intern/cycles/kernel/svm/svm_normal.h
new file mode 100644
index 00000000000..bed2a8d574d
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_normal.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device void svm_node_normal(KernelGlobals *kg, ShaderData *sd, float *stack, uint in_normal_offset, uint out_normal_offset, uint out_dot_offset, int *offset)
+{
+ /* read extra data */
+ uint4 node1 = read_node(kg, offset);
+ float3 normal = stack_load_float3(stack, in_normal_offset);
+
+ float3 direction;
+ direction.x = __int_as_float(node1.x);
+ direction.y = __int_as_float(node1.y);
+ direction.z = __int_as_float(node1.z);
+ direction = normalize(direction);
+
+ if (stack_valid(out_normal_offset))
+ stack_store_float3(stack, out_normal_offset, direction);
+
+ if (stack_valid(out_dot_offset))
+ stack_store_float(stack, out_dot_offset, dot(direction, normalize(normal)));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_sepcomb_rgb.h b/intern/cycles/kernel/svm/svm_sepcomb_rgb.h
new file mode 100644
index 00000000000..4e23221e3cd
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_sepcomb_rgb.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+__device void svm_node_combine_rgb(ShaderData *sd, float *stack, uint in_offset, uint color_index, uint out_offset)
+{
+ float color = stack_load_float(stack, in_offset);
+
+ if (stack_valid(out_offset))
+ stack_store_float(stack, out_offset+color_index, color);
+}
+
+__device void svm_node_separate_rgb(ShaderData *sd, float *stack, uint icolor_offset, uint color_index, uint out_offset)
+{
+ float3 color = stack_load_float3(stack, icolor_offset);
+
+ if (stack_valid(out_offset)) {
+ if (color_index == 0)
+ stack_store_float(stack, out_offset, color.x);
+ else if (color_index == 1)
+ stack_store_float(stack, out_offset, color.y);
+ else
+ stack_store_float(stack, out_offset, color.z);
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 071477a83c7..c46df3f08c8 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -79,7 +79,14 @@ typedef enum NodeType {
NODE_TEX_ENVIRONMENT = 4600,
NODE_CLOSURE_HOLDOUT = 4700,
NODE_LAYER_WEIGHT = 4800,
- NODE_CLOSURE_VOLUME = 4900
+ NODE_CLOSURE_VOLUME = 4900,
+ NODE_SEPARATE_RGB = 5000,
+ NODE_COMBINE_RGB = 5100,
+ NODE_HSV = 5200,
+ NODE_CAMERA = 5300,
+ NODE_INVERT = 5400,
+ NODE_NORMAL = 5500,
+ NODE_GAMMA = 5600
} NodeType;
typedef enum NodeAttributeType {
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index acdddb475d0..29141b25b59 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -36,8 +36,6 @@ CCL_NAMESPACE_BEGIN
RenderBuffers::RenderBuffers(Device *device_)
{
device = device_;
- width = 0;
- height = 0;
}
RenderBuffers::~RenderBuffers()
@@ -58,24 +56,23 @@ void RenderBuffers::device_free()
}
}
-void RenderBuffers::reset(Device *device, int width_, int height_)
+void RenderBuffers::reset(Device *device, BufferParams& params_)
{
- width = width_;
- height = height_;
+ params = params_;
/* free existing buffers */
device_free();
/* allocate buffer */
- buffer.resize(width, height);
+ buffer.resize(params.width, params.height);
device->mem_alloc(buffer, MEM_READ_WRITE);
device->mem_zero(buffer);
/* allocate rng state */
- rng_state.resize(width, height);
+ rng_state.resize(params.width, params.height);
- uint *init_state = rng_state.resize(width, height);
- int x, y;
+ uint *init_state = rng_state.resize(params.width, params.height);
+ int x, y, width = params.width, height = params.height;
for(x=0; x<width; x++)
for(y=0; y<height; y++)
@@ -92,11 +89,11 @@ float4 *RenderBuffers::copy_from_device(float exposure, int sample)
device->mem_copy_from(buffer, 0, buffer.memory_size());
- float4 *out = new float4[width*height];
+ float4 *out = new float4[params.width*params.height];
float4 *in = (float4*)buffer.data_pointer;
float scale = 1.0f/(float)sample;
- for(int i = width*height - 1; i >= 0; i--) {
+ for(int i = params.width*params.height - 1; i >= 0; i--) {
float4 rgba = in[i]*scale;
rgba.x = rgba.x*exposure;
@@ -117,8 +114,6 @@ float4 *RenderBuffers::copy_from_device(float exposure, int sample)
DisplayBuffer::DisplayBuffer(Device *device_)
{
device = device_;
- width = 0;
- height = 0;
draw_width = 0;
draw_height = 0;
transparent = true; /* todo: determine from background */
@@ -137,28 +132,27 @@ void DisplayBuffer::device_free()
}
}
-void DisplayBuffer::reset(Device *device, int width_, int height_)
+void DisplayBuffer::reset(Device *device, BufferParams& params_)
{
draw_width = 0;
draw_height = 0;
- width = width_;
- height = height_;
+ params = params_;
/* free existing buffers */
device_free();
/* allocate display pixels */
- rgba.resize(width, height);
+ rgba.resize(params.width, params.height);
device->pixels_alloc(rgba);
}
-void DisplayBuffer::draw_set(int width_, int height_)
+void DisplayBuffer::draw_set(int width, int height)
{
- assert(width_ <= width && height_ <= height);
+ assert(width <= params.width && height <= params.height);
- draw_width = width_;
- draw_height = height_;
+ draw_width = width;
+ draw_height = height;
}
void DisplayBuffer::draw_transparency_grid()
@@ -175,11 +169,11 @@ void DisplayBuffer::draw_transparency_grid()
};
glColor4ub(50, 50, 50, 255);
- glRectf(0, 0, width, height);
+ glRectf(0, 0, params.width, params.height);
glEnable(GL_POLYGON_STIPPLE);
glColor4ub(55, 55, 55, 255);
glPolygonStipple(checker_stipple_sml);
- glRectf(0, 0, width, height);
+ glRectf(0, 0, params.width, params.height);
glDisable(GL_POLYGON_STIPPLE);
}
@@ -189,7 +183,7 @@ void DisplayBuffer::draw(Device *device)
if(transparent)
draw_transparency_grid();
- device->draw_pixels(rgba, 0, draw_width, draw_height, width, height, transparent);
+ device->draw_pixels(rgba, 0, draw_width, draw_height, params.width, params.height, transparent);
}
}
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index d5eb8d7fa2f..f4a9b37c09b 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -30,12 +30,55 @@ CCL_NAMESPACE_BEGIN
class Device;
struct float4;
+/* Buffer Parameters
+ Size of render buffer and how it fits in the full image (border render). */
+
+class BufferParams {
+public:
+ /* width/height of the physical buffer */
+ int width;
+ int height;
+
+ /* offset into and width/height of the full buffer */
+ int full_x;
+ int full_y;
+ int full_width;
+ int full_height;
+
+ BufferParams()
+ {
+ width = 0;
+ height = 0;
+
+ full_x = 0;
+ full_y = 0;
+ full_width = 0;
+ full_height = 0;
+ }
+
+ void get_offset_stride(int& offset, int& stride)
+ {
+ offset = -(full_x + full_y*width);
+ stride = width;
+ }
+
+ bool modified(const BufferParams& params)
+ {
+ return !(full_x == params.full_x
+ && full_y == params.full_y
+ && width == params.width
+ && height == params.height
+ && full_width == params.full_width
+ && full_height == params.full_height);
+ }
+};
+
/* Render Buffers */
class RenderBuffers {
public:
- /* buffer dimensions */
- int width, height;
+ /* buffer parameters */
+ BufferParams params;
/* float buffer */
device_vector<float4> buffer;
/* random number generator state */
@@ -46,7 +89,7 @@ public:
RenderBuffers(Device *device);
~RenderBuffers();
- void reset(Device *device, int width, int height);
+ void reset(Device *device, BufferParams& params);
float4 *copy_from_device(float exposure, int sample);
protected:
@@ -62,8 +105,8 @@ protected:
class DisplayBuffer {
public:
- /* buffer dimensions */
- int width, height;
+ /* buffer parameters */
+ BufferParams params;
/* dimensions for how much of the buffer is actually ready for display.
with progressive render we can be using only a subset of the buffer.
if these are zero, it means nothing can be drawn yet */
@@ -78,7 +121,7 @@ public:
DisplayBuffer(Device *device);
~DisplayBuffer();
- void reset(Device *device, int width, int height);
+ void reset(Device *device, BufferParams& params);
void write(Device *device, const string& filename);
void draw_set(int width, int height);
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index e88c0a388bc..a83ae81844c 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -72,8 +72,9 @@ void Camera::update()
if(!need_update)
return;
+ /* ndc to raster */
Transform screentocamera;
- Transform ndctoraster = transform_scale((float)width, (float)height, 1.0f);
+ Transform ndctoraster = transform_scale(width, height, 1.0f);
/* raster to screen */
Transform screentoraster = ndctoraster *
@@ -148,13 +149,9 @@ void Camera::device_update(Device *device, DeviceScene *dscene)
/* type */
kcam->ortho = ortho;
- /* size */
- kcam->width = width;
- kcam->height = height;
-
/* store differentials */
- kcam->dx = dx;
- kcam->dy = dy;
+ kcam->dx = float3_to_float4(dx);
+ kcam->dy = float3_to_float4(dy);
/* clipping */
kcam->nearclip = nearclip;
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index cdded403cbe..cc29047f048 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -292,6 +292,42 @@ void ShaderGraph::copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNod
}
}
+void ShaderGraph::remove_proxy_nodes(vector<bool>& removed)
+{
+ foreach(ShaderNode *node, nodes) {
+ ProxyNode *proxy = dynamic_cast<ProxyNode*>(node);
+ if (proxy) {
+ ShaderInput *input = proxy->inputs[0];
+ ShaderOutput *output = proxy->outputs[0];
+
+ /* temp. copy of the output links list.
+ * output->links is modified when we disconnect!
+ */
+ vector<ShaderInput*> links(output->links);
+ ShaderOutput *from = input->link;
+
+ /* bypass the proxy node */
+ if (from) {
+ disconnect(input);
+ foreach(ShaderInput *to, links) {
+ disconnect(to);
+ connect(from, to);
+ }
+ }
+ else {
+ foreach(ShaderInput *to, links) {
+ disconnect(to);
+
+ /* transfer the default input value to the target socket */
+ to->set(input->value);
+ }
+ }
+
+ removed[proxy->id] = true;
+ }
+ }
+}
+
void ShaderGraph::break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack)
{
visited[node->id] = true;
@@ -322,15 +358,28 @@ void ShaderGraph::clean()
nodes that don't feed into the output. how cycles are broken is
undefined, they are invalid input, the important thing is to not crash */
+ vector<bool> removed(nodes.size(), false);
vector<bool> visited(nodes.size(), false);
vector<bool> on_stack(nodes.size(), false);
+
+ list<ShaderNode*> newnodes;
+
+ /* remove proxy nodes */
+ remove_proxy_nodes(removed);
+
+ foreach(ShaderNode *node, nodes) {
+ if(!removed[node->id])
+ newnodes.push_back(node);
+ else
+ delete node;
+ }
+ nodes = newnodes;
+ newnodes.clear();
/* break cycles */
break_cycles(output(), visited, on_stack);
/* remove unused nodes */
- list<ShaderNode*> newnodes;
-
foreach(ShaderNode *node, nodes) {
if(visited[node->id])
newnodes.push_back(node);
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index 2a2df5e1377..91ec83aba21 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -217,6 +217,7 @@ protected:
void find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
void copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNode*>& nnodemap);
+ void remove_proxy_nodes(vector<bool>& removed);
void break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack);
void clean();
void bump_from_displacement();
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index 9d129d8e8db..47059a0a009 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -41,9 +41,8 @@ Integrator::Integrator()
transparent_shadows = false;
no_caustics = false;
- blur_caustics = 0.0f;
-
seed = 0;
+ layer_flag = ~0;
need_update = true;
}
@@ -81,9 +80,8 @@ void Integrator::device_update(Device *device, DeviceScene *dscene)
kintegrator->transparent_shadows = transparent_shadows;
kintegrator->no_caustics = no_caustics;
- kintegrator->blur_caustics = blur_caustics;
-
kintegrator->seed = hash_int(seed);
+ kintegrator->layer_flag = layer_flag << PATH_RAY_LAYER_SHIFT;
/* sobol directions table */
int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
@@ -115,7 +113,7 @@ bool Integrator::modified(const Integrator& integrator)
transparent_probalistic == integrator.transparent_probalistic &&
transparent_shadows == integrator.transparent_shadows &&
no_caustics == integrator.no_caustics &&
- blur_caustics == integrator.blur_caustics &&
+ layer_flag == integrator.layer_flag &&
seed == integrator.seed);
}
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
index 52032fa1a26..e610d670142 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -41,9 +41,9 @@ public:
bool transparent_shadows;
bool no_caustics;
- float blur_caustics;
int seed;
+ int layer_flag;
bool need_update;
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 19992771c1d..5d65ce69a00 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -270,15 +270,19 @@ void Mesh::compute_bvh(SceneParams *params, Progress& progress)
void Mesh::tag_update(Scene *scene, bool rebuild)
{
need_update = true;
- if(rebuild)
+
+ if(rebuild) {
need_update_rebuild = true;
+ scene->light_manager->need_update = true;
+ }
+ else {
+ foreach(uint sindex, used_shaders)
+ if(scene->shaders[sindex]->has_surface_emission)
+ scene->light_manager->need_update = true;
+ }
scene->mesh_manager->need_update = true;
scene->object_manager->need_update = true;
-
- foreach(uint sindex, used_shaders)
- if(scene->shaders[sindex]->has_surface_emission)
- scene->light_manager->need_update = true;
}
/* Mesh Manager */
@@ -685,9 +689,9 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
if(!mesh->transform_applied) {
string msg = "Updating Mesh BVH ";
if(mesh->name == "")
- msg += string_printf("%ld/%ld", i+1, num_instance_bvh);
+ msg += string_printf("%u/%u", (uint)(i+1), (uint)num_instance_bvh);
else
- msg += string_printf("%s %ld/%ld", mesh->name.c_str(), i+1, num_instance_bvh);
+ msg += string_printf("%s %u/%u", mesh->name.c_str(), (uint)(i+1), (uint)num_instance_bvh);
progress.set_status(msg, "Building BVH");
mesh->compute_bvh(&scene->params, progress);
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
index e86bea59ec1..f0ddf4e8d7b 100644
--- a/intern/cycles/render/mesh_displace.cpp
+++ b/intern/cycles/render/mesh_displace.cpp
@@ -89,25 +89,26 @@ bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& p
return false;
/* run device task */
- device_vector<float3> d_offset;
- d_offset.resize(d_input.size());
+ device_vector<float3> d_output;
+ d_output.resize(d_input.size());
device->mem_alloc(d_input, MEM_READ_ONLY);
device->mem_copy_to(d_input);
- device->mem_alloc(d_offset, MEM_WRITE_ONLY);
+ device->mem_alloc(d_output, MEM_WRITE_ONLY);
- DeviceTask task(DeviceTask::DISPLACE);
- task.displace_input = d_input.device_pointer;
- task.displace_offset = d_offset.device_pointer;
- task.displace_x = 0;
- task.displace_w = d_input.size();
+ DeviceTask task(DeviceTask::SHADER);
+ task.shader_input = d_input.device_pointer;
+ task.shader_output = d_output.device_pointer;
+ task.shader_eval_type = SHADER_EVAL_DISPLACE;
+ task.shader_x = 0;
+ task.shader_w = d_input.size();
device->task_add(task);
device->task_wait();
- device->mem_copy_from(d_offset, 0, sizeof(float3)*d_offset.size());
+ device->mem_copy_from(d_output, 0, sizeof(float3)*d_output.size());
device->mem_free(d_input);
- device->mem_free(d_offset);
+ device->mem_free(d_output);
if(progress.get_cancel())
return false;
@@ -117,7 +118,7 @@ bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& p
done.resize(mesh->verts.size(), false);
int k = 0;
- float3 *offset = (float3*)d_offset.data_pointer;
+ float3 *offset = (float3*)d_output.data_pointer;
for(size_t i = 0; i < mesh->triangles.size(); i++) {
Mesh::Triangle t = mesh->triangles[i];
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index d7bd74c9ec7..81d156a079d 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -273,7 +273,6 @@ static void sky_texture_precompute(KernelSunSky *ksunsky, float3 dir, float turb
ksunsky->theta = theta;
ksunsky->phi = phi;
- ksunsky->dir = dir;
float theta2 = theta*theta;
float theta3 = theta*theta*theta;
@@ -713,6 +712,41 @@ void MagicTextureNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_magic_texture");
}
+/* Normal */
+
+NormalNode::NormalNode()
+: ShaderNode("normal")
+{
+ direction = make_float3(0.0f, 0.0f, 1.0f);
+
+ add_input("Normal", SHADER_SOCKET_NORMAL);
+ add_output("Normal", SHADER_SOCKET_NORMAL);
+ add_output("Dot", SHADER_SOCKET_FLOAT);
+}
+
+void NormalNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *normal_in = input("Normal");
+ ShaderOutput *normal_out = output("Normal");
+ ShaderOutput *dot_out = output("Dot");
+
+ compiler.stack_assign(normal_in);
+ compiler.stack_assign(normal_out);
+ compiler.stack_assign(dot_out);
+
+ compiler.add_node(NODE_NORMAL, normal_in->stack_offset, normal_out->stack_offset, dot_out->stack_offset);
+ compiler.add_node(
+ __float_as_int(direction.x),
+ __float_as_int(direction.y),
+ __float_as_int(direction.z));
+}
+
+void NormalNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter_vector("Direction", direction);
+ compiler.add(this, "node_normal");
+}
+
/* Mapping */
MappingNode::MappingNode()
@@ -834,6 +868,26 @@ void ConvertNode::compile(OSLCompiler& compiler)
assert(0);
}
+/* Proxy */
+
+ProxyNode::ProxyNode(ShaderSocketType from_, ShaderSocketType to_)
+: ShaderNode("proxy")
+{
+ from = from_;
+ to = to_;
+
+ add_input("Input", from);
+ add_output("Output", to);
+}
+
+void ProxyNode::compile(SVMCompiler& compiler)
+{
+}
+
+void ProxyNode::compile(OSLCompiler& compiler)
+{
+}
+
/* BSDF Closure */
BsdfNode::BsdfNode()
@@ -1566,6 +1620,34 @@ void MixClosureNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_mix_closure");
}
+/* Invert */
+
+InvertNode::InvertNode()
+: ShaderNode("invert")
+{
+ add_input("Fac", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Color", SHADER_SOCKET_COLOR);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void InvertNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *fac_in = input("Fac");
+ ShaderInput *color_in = input("Color");
+ ShaderOutput *color_out = output("Color");
+
+ compiler.stack_assign(fac_in);
+ compiler.stack_assign(color_in);
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_INVERT, fac_in->stack_offset, color_in->stack_offset, color_out->stack_offset);
+}
+
+void InvertNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_invert");
+}
+
/* Mix */
MixNode::MixNode()
@@ -1629,6 +1711,138 @@ void MixNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_mix");
}
+/* Combine RGB */
+CombineRGBNode::CombineRGBNode()
+: ShaderNode("combine_rgb")
+{
+ add_input("R", SHADER_SOCKET_FLOAT);
+ add_input("G", SHADER_SOCKET_FLOAT);
+ add_input("B", SHADER_SOCKET_FLOAT);
+ add_output("Image", SHADER_SOCKET_COLOR);
+}
+
+void CombineRGBNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *red_in = input("R");
+ ShaderInput *green_in = input("G");
+ ShaderInput *blue_in = input("B");
+ ShaderOutput *color_out = output("Image");
+
+ compiler.stack_assign(color_out);
+
+ compiler.stack_assign(red_in);
+ compiler.add_node(NODE_COMBINE_RGB, red_in->stack_offset, 0, color_out->stack_offset);
+
+ compiler.stack_assign(green_in);
+ compiler.add_node(NODE_COMBINE_RGB, green_in->stack_offset, 1, color_out->stack_offset);
+
+ compiler.stack_assign(blue_in);
+ compiler.add_node(NODE_COMBINE_RGB, blue_in->stack_offset, 2, color_out->stack_offset);
+}
+
+void CombineRGBNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_combine_rgb");
+}
+
+/* Gamma */
+GammaNode::GammaNode()
+: ShaderNode("gamma")
+{
+ add_input("Color", SHADER_SOCKET_COLOR);
+ add_input("Gamma", SHADER_SOCKET_FLOAT);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void GammaNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *color_in = input("Color");
+ ShaderInput *gamma_in = input("Gamma");
+ ShaderOutput *color_out = output("Color");
+
+ compiler.stack_assign(color_in);
+ compiler.stack_assign(gamma_in);
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_GAMMA, gamma_in->stack_offset, color_in->stack_offset, color_out->stack_offset);
+}
+
+void GammaNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_gamma");
+}
+
+/* Separate RGB */
+SeparateRGBNode::SeparateRGBNode()
+: ShaderNode("separate_rgb")
+{
+ add_input("Image", SHADER_SOCKET_COLOR);
+ add_output("R", SHADER_SOCKET_FLOAT);
+ add_output("G", SHADER_SOCKET_FLOAT);
+ add_output("B", SHADER_SOCKET_FLOAT);
+}
+
+void SeparateRGBNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *color_in = input("Image");
+ ShaderOutput *red_out = output("R");
+ ShaderOutput *green_out = output("G");
+ ShaderOutput *blue_out = output("B");
+
+ compiler.stack_assign(color_in);
+
+ compiler.stack_assign(red_out);
+ compiler.add_node(NODE_SEPARATE_RGB, color_in->stack_offset, 0, red_out->stack_offset);
+
+ compiler.stack_assign(green_out);
+ compiler.add_node(NODE_SEPARATE_RGB, color_in->stack_offset, 1, green_out->stack_offset);
+
+ compiler.stack_assign(blue_out);
+ compiler.add_node(NODE_SEPARATE_RGB, color_in->stack_offset, 2, blue_out->stack_offset);
+}
+
+void SeparateRGBNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_separate_rgb");
+}
+
+/* Separate RGB */
+HSVNode::HSVNode()
+: ShaderNode("hsv")
+{
+ add_input("Hue", SHADER_SOCKET_FLOAT);
+ add_input("Saturation", SHADER_SOCKET_FLOAT);
+ add_input("Value", SHADER_SOCKET_FLOAT);
+ add_input("Fac", SHADER_SOCKET_FLOAT);
+ add_input("Color", SHADER_SOCKET_COLOR);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void HSVNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *hue_in = input("Hue");
+ ShaderInput *saturation_in = input("Saturation");
+ ShaderInput *value_in = input("Value");
+ ShaderInput *fac_in = input("Fac");
+ ShaderInput *color_in = input("Color");
+ ShaderOutput *color_out = output("Color");
+
+ compiler.stack_assign(hue_in);
+ compiler.stack_assign(saturation_in);
+ compiler.stack_assign(value_in);
+ compiler.stack_assign(fac_in);
+ compiler.stack_assign(color_in);
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_HSV, color_in->stack_offset, fac_in->stack_offset, color_out->stack_offset);
+ compiler.add_node(NODE_HSV, hue_in->stack_offset, saturation_in->stack_offset, value_in->stack_offset);
+}
+
+void HSVNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_hsv");
+}
+
/* Attribute */
AttributeNode::AttributeNode()
@@ -1699,6 +1913,33 @@ void AttributeNode::compile(OSLCompiler& compiler)
compiler.add(this, "node_attribute");
}
+/* Camera */
+
+CameraNode::CameraNode()
+: ShaderNode("camera")
+{
+ add_output("View Vector", SHADER_SOCKET_VECTOR);
+ add_output("View Z Depth", SHADER_SOCKET_FLOAT);
+ add_output("View Distance", SHADER_SOCKET_FLOAT);
+}
+
+void CameraNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *vector_out = output("View Vector");
+ ShaderOutput *z_depth_out = output("View Z Depth");
+ ShaderOutput *distance_out = output("View Distance");
+
+ compiler.stack_assign(vector_out);
+ compiler.stack_assign(z_depth_out);
+ compiler.stack_assign(distance_out);
+ compiler.add_node(NODE_CAMERA, vector_out->stack_offset, z_depth_out->stack_offset, distance_out->stack_offset);
+}
+
+void CameraNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_camera");
+}
+
/* Fresnel */
FresnelNode::FresnelNode()
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index d9cbd7ff589..f0a669f3f87 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -158,6 +158,14 @@ public:
ShaderSocketType from, to;
};
+class ProxyNode : public ShaderNode {
+public:
+ ProxyNode(ShaderSocketType from, ShaderSocketType to);
+ SHADER_NODE_BASE_CLASS(ProxyNode)
+
+ ShaderSocketType from, to;
+};
+
class BsdfNode : public ShaderNode {
public:
SHADER_NODE_CLASS(BsdfNode)
@@ -284,6 +292,11 @@ public:
SHADER_NODE_CLASS(MixClosureNode)
};
+class InvertNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(InvertNode)
+};
+
class MixNode : public ShaderNode {
public:
SHADER_NODE_CLASS(MixNode)
@@ -292,6 +305,26 @@ public:
static ShaderEnum type_enum;
};
+class CombineRGBNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(CombineRGBNode)
+};
+
+class GammaNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(GammaNode)
+};
+
+class SeparateRGBNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(SeparateRGBNode)
+};
+
+class HSVNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(HSVNode)
+};
+
class AttributeNode : public ShaderNode {
public:
SHADER_NODE_CLASS(AttributeNode)
@@ -300,6 +333,11 @@ public:
ustring attribute;
};
+class CameraNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(CameraNode)
+};
+
class FresnelNode : public ShaderNode {
public:
SHADER_NODE_CLASS(FresnelNode)
@@ -318,6 +356,13 @@ public:
static ShaderEnum type_enum;
};
+class NormalNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(NormalNode)
+
+ float3 direction;
+};
+
class VectorMathNode : public ShaderNode {
public:
SHADER_NODE_CLASS(VectorMathNode)
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 73ac033623d..be2e493dc7f 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -51,8 +51,6 @@ Session::Session(const SessionParams& params_)
sample = 0;
delayed_reset.do_reset = false;
- delayed_reset.w = 0;
- delayed_reset.h = 0;
delayed_reset.samples = 0;
display_outdated = false;
@@ -108,7 +106,7 @@ bool Session::ready_to_reset()
/* GPU Session */
-void Session::reset_gpu(int w, int h, int samples)
+void Session::reset_gpu(BufferParams& buffer_params, int samples)
{
/* block for buffer acces and reset immediately. we can't do this
in the thread, because we need to allocate an OpenGL buffer, and
@@ -119,7 +117,7 @@ void Session::reset_gpu(int w, int h, int samples)
display_outdated = true;
reset_time = time_dt();
- reset_(w, h, samples);
+ reset_(buffer_params, samples);
gpu_need_tonemap = false;
gpu_need_tonemap_cond.notify_all();
@@ -127,7 +125,7 @@ void Session::reset_gpu(int w, int h, int samples)
pause_cond.notify_all();
}
-bool Session::draw_gpu(int w, int h)
+bool Session::draw_gpu(BufferParams& buffer_params)
{
/* block for buffer access */
thread_scoped_lock display_lock(display->mutex);
@@ -136,7 +134,7 @@ bool Session::draw_gpu(int w, int h)
if(gpu_draw_ready) {
/* then verify the buffers have the expected size, so we don't
draw previous results in a resized window */
- if(w == display->width && h == display->height) {
+ if(!buffer_params.modified(display->params)) {
/* for CUDA we need to do tonemapping still, since we can
only access GL buffers from the main thread */
if(gpu_need_tonemap) {
@@ -261,15 +259,14 @@ void Session::run_gpu()
/* CPU Session */
-void Session::reset_cpu(int w, int h, int samples)
+void Session::reset_cpu(BufferParams& buffer_params, int samples)
{
thread_scoped_lock reset_lock(delayed_reset.mutex);
display_outdated = true;
reset_time = time_dt();
- delayed_reset.w = w;
- delayed_reset.h = h;
+ delayed_reset.params = buffer_params;
delayed_reset.samples = samples;
delayed_reset.do_reset = true;
device->task_cancel();
@@ -277,7 +274,7 @@ void Session::reset_cpu(int w, int h, int samples)
pause_cond.notify_all();
}
-bool Session::draw_cpu(int w, int h)
+bool Session::draw_cpu(BufferParams& buffer_params)
{
thread_scoped_lock display_lock(display->mutex);
@@ -285,7 +282,7 @@ bool Session::draw_cpu(int w, int h)
if(display->draw_ready()) {
/* then verify the buffers have the expected size, so we don't
draw previous results in a resized window */
- if(w == display->width && h == display->height) {
+ if(!buffer_params.modified(display->params)) {
display->draw(device);
if(display_outdated && (time_dt() - reset_time) > params.text_timeout)
@@ -306,7 +303,7 @@ void Session::run_cpu()
thread_scoped_lock buffers_lock(buffers->mutex);
thread_scoped_lock display_lock(display->mutex);
- reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples);
+ reset_(delayed_reset.params, delayed_reset.samples);
delayed_reset.do_reset = false;
}
@@ -389,7 +386,7 @@ void Session::run_cpu()
if(delayed_reset.do_reset) {
/* reset rendering if request from main thread */
delayed_reset.do_reset = false;
- reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples);
+ reset_(delayed_reset.params, delayed_reset.samples);
}
else if(need_tonemap) {
/* tonemap only if we do not reset, we don't we don't
@@ -410,7 +407,7 @@ void Session::run()
/* load kernels */
progress.set_status("Loading render kernels (may take a few minutes the first time)");
- if(!device->load_kernels()) {
+ if(!device->load_kernels(params.experimental)) {
string message = device->error_message();
if(message == "")
message = "Failed loading render kernel, see console for errors";
@@ -438,23 +435,23 @@ void Session::run()
progress.set_update();
}
-bool Session::draw(int w, int h)
+bool Session::draw(BufferParams& buffer_params)
{
if(device_use_gl)
- return draw_gpu(w, h);
+ return draw_gpu(buffer_params);
else
- return draw_cpu(w, h);
+ return draw_cpu(buffer_params);
}
-void Session::reset_(int w, int h, int samples)
+void Session::reset_(BufferParams& buffer_params, int samples)
{
- if(w != buffers->width || h != buffers->height) {
+ if(buffer_params.modified(buffers->params)) {
gpu_draw_ready = false;
- buffers->reset(device, w, h);
- display->reset(device, w, h);
+ buffers->reset(device, buffer_params);
+ display->reset(device, buffer_params);
}
- tile_manager.reset(w, h, samples);
+ tile_manager.reset(buffer_params, samples);
start_time = time_dt();
preview_time = 0.0;
@@ -462,12 +459,12 @@ void Session::reset_(int w, int h, int samples)
sample = 0;
}
-void Session::reset(int w, int h, int samples)
+void Session::reset(BufferParams& buffer_params, int samples)
{
if(device_use_gl)
- reset_gpu(w, h, samples);
+ reset_gpu(buffer_params, samples);
else
- reset_cpu(w, h, samples);
+ reset_cpu(buffer_params, samples);
}
void Session::set_samples(int samples)
@@ -514,14 +511,16 @@ void Session::update_scene()
progress.set_status("Updating Scene");
- /* update camera if dimensions changed for progressive render */
+ /* update camera if dimensions changed for progressive render. the camera
+ knows nothing about progressive or cropped rendering, it just gets the
+ image dimensions passed in */
Camera *cam = scene->camera;
- int w = tile_manager.state.width;
- int h = tile_manager.state.height;
+ int width = tile_manager.state.buffer.full_width;
+ int height = tile_manager.state.buffer.full_height;
- if(cam->width != w || cam->height != h) {
- cam->width = w;
- cam->height = h;
+ if(width != cam->width || height != cam->height) {
+ cam->width = width;
+ cam->height = height;
cam->tag_update();
}
@@ -573,14 +572,15 @@ void Session::path_trace(Tile& tile)
/* add path trace task */
DeviceTask task(DeviceTask::PATH_TRACE);
- task.x = tile.x;
- task.y = tile.y;
+ task.x = tile_manager.state.buffer.full_x + tile.x;
+ task.y = tile_manager.state.buffer.full_y + tile.y;
task.w = tile.w;
task.h = tile.h;
task.buffer = buffers->buffer.device_pointer;
task.rng_state = buffers->rng_state.device_pointer;
task.sample = tile_manager.state.sample;
task.resolution = tile_manager.state.resolution;
+ tile_manager.state.buffer.get_offset_stride(task.offset, task.stride);
device->task_add(task);
}
@@ -590,14 +590,15 @@ void Session::tonemap()
/* add tonemap task */
DeviceTask task(DeviceTask::TONEMAP);
- task.x = 0;
- task.y = 0;
- task.w = tile_manager.state.width;
- task.h = tile_manager.state.height;
+ task.x = tile_manager.state.buffer.full_x;
+ task.y = tile_manager.state.buffer.full_y;
+ task.w = tile_manager.state.buffer.width;
+ task.h = tile_manager.state.buffer.height;
task.rgba = display->rgba.device_pointer;
task.buffer = buffers->buffer.device_pointer;
task.sample = tile_manager.state.sample;
task.resolution = tile_manager.state.resolution;
+ tile_manager.state.buffer.get_offset_stride(task.offset, task.stride);
if(task.w > 0 && task.h > 0) {
device->task_add(task);
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 82c14227d03..89979b8c451 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -19,6 +19,7 @@
#ifndef __SESSION_H__
#define __SESSION_H__
+#include "buffers.h"
#include "device.h"
#include "tile.h"
@@ -27,6 +28,7 @@
CCL_NAMESPACE_BEGIN
+class BufferParams;
class Device;
class DeviceScene;
class DisplayBuffer;
@@ -43,6 +45,7 @@ public:
string output_path;
bool progressive;
+ bool experimental;
int samples;
int tile_size;
int min_size;
@@ -59,6 +62,7 @@ public:
output_path = "";
progressive = false;
+ experimental = false;
samples = INT_MAX;
tile_size = 64;
min_size = 64;
@@ -75,6 +79,7 @@ public:
&& output_path == params.output_path
/* && samples == params.samples */
&& progressive == params.progressive
+ && experimental == params.experimental
&& tile_size == params.tile_size
&& min_size == params.min_size
&& threads == params.threads
@@ -103,11 +108,11 @@ public:
~Session();
void start();
- bool draw(int w, int h);
+ bool draw(BufferParams& params);
void wait();
bool ready_to_reset();
- void reset(int w, int h, int samples);
+ void reset(BufferParams& params, int samples);
void set_samples(int samples);
void set_pause(bool pause);
@@ -115,7 +120,7 @@ protected:
struct DelayedReset {
thread_mutex mutex;
bool do_reset;
- int w, h;
+ BufferParams params;
int samples;
} delayed_reset;
@@ -126,15 +131,15 @@ protected:
void tonemap();
void path_trace(Tile& tile);
- void reset_(int w, int h, int samples);
+ void reset_(BufferParams& params, int samples);
void run_cpu();
- bool draw_cpu(int w, int h);
- void reset_cpu(int w, int h, int samples);
+ bool draw_cpu(BufferParams& params);
+ void reset_cpu(BufferParams& params, int samples);
void run_gpu();
- bool draw_gpu(int w, int h);
- void reset_gpu(int w, int h, int samples);
+ bool draw_gpu(BufferParams& params);
+ void reset_gpu(BufferParams& params, int samples);
TileManager tile_manager;
bool device_use_gl;
diff --git a/intern/cycles/render/sobol.cpp b/intern/cycles/render/sobol.cpp
index be8939174b4..e3c2e802067 100644
--- a/intern/cycles/render/sobol.cpp
+++ b/intern/cycles/render/sobol.cpp
@@ -47,6 +47,7 @@
*/
#include "util_debug.h"
+#include "util_types.h"
#include "sobol.h"
@@ -55,8 +56,8 @@ CCL_NAMESPACE_BEGIN
#define SOBOL_MAX_NUMBER 32
typedef struct SobolDirectionNumbers {
- unsigned int d, s, a;
- unsigned int m[SOBOL_MAX_NUMBER];
+ uint d, s, a;
+ uint m[SOBOL_MAX_NUMBER];
} SobolDirectionNumbers;
static SobolDirectionNumbers SOBOL_NUMBERS[SOBOL_MAX_DIMENSIONS-1] = {
@@ -21262,38 +21263,38 @@ static SobolDirectionNumbers SOBOL_NUMBERS[SOBOL_MAX_DIMENSIONS-1] = {
{21201, 18, 131059, {1, 1, 7, 11, 15, 7, 37, 239, 337, 245, 1557, 3681, 7357, 9639, 27367, 26869, 114603, 86317}}
};
-void sobol_generate_direction_vectors(unsigned int vectors[][SOBOL_BITS], int dimensions)
+void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions)
{
assert(dimensions <= SOBOL_MAX_DIMENSIONS);
- const unsigned int L = SOBOL_BITS;
+ const uint L = SOBOL_BITS;
/* first dimension is exception */
- unsigned int *v = vectors[0];
+ uint *v = vectors[0];
- for(unsigned int i = 0; i < L; i++)
+ for(uint i = 0; i < L; i++)
v[i] = 1 << (31-i); // all m's = 1
for(int dim = 1; dim < dimensions; dim++) {
SobolDirectionNumbers *numbers = &SOBOL_NUMBERS[dim-1];
- unsigned int s = numbers->s;
- unsigned int a = numbers->a;
- unsigned int *m = numbers->m;
+ uint s = numbers->s;
+ uint a = numbers->a;
+ uint *m = numbers->m;
v = vectors[dim];
if(L <= s) {
- for(unsigned int i = 0; i < L; i++)
+ for(uint i = 0; i < L; i++)
v[i] = m[i] << (31-i);
}
else {
- for(unsigned int i = 0; i < s; i++)
+ for(uint i = 0; i < s; i++)
v[i] = m[i] << (31-i);
- for(unsigned int i = s; i < L; i++) {
+ for(uint i = s; i < L; i++) {
v[i] = v[i-s] ^ (v[i-s] >> s);
- for(unsigned int k = 1; k < s; k++)
+ for(uint k = 1; k < s; k++)
v[i] ^= (((a >> (s-1-k)) & 1) * v[i-k]);
}
}
diff --git a/intern/cycles/render/sobol.h b/intern/cycles/render/sobol.h
index bfc2f5512aa..0f52a5fee68 100644
--- a/intern/cycles/render/sobol.h
+++ b/intern/cycles/render/sobol.h
@@ -19,12 +19,14 @@
#ifndef __SOBOL_H__
#define __SOBOL_H__
+#include "util_types.h"
+
CCL_NAMESPACE_BEGIN
#define SOBOL_BITS 32
#define SOBOL_MAX_DIMENSIONS 21201
-void sobol_generate_direction_vectors(unsigned int vectors[][SOBOL_BITS], int dimensions);
+void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions);
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index ba437e74874..40833e5b08b 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -28,21 +28,21 @@ TileManager::TileManager(bool progressive_, int samples_, int tile_size_, int mi
tile_size = tile_size_;
min_size = min_size_;
- reset(0, 0, 0);
+ BufferParams buffer_params;
+ reset(buffer_params, 0);
}
TileManager::~TileManager()
{
}
-void TileManager::reset(int width_, int height_, int samples_)
+void TileManager::reset(BufferParams& params_, int samples_)
{
- full_width = width_;
- full_height = height_;
+ params = params_;
start_resolution = 1;
- int w = width_, h = height_;
+ int w = params.width, h = params.height;
if(min_size != INT_MAX) {
while(w*h > min_size*min_size) {
@@ -55,8 +55,7 @@ void TileManager::reset(int width_, int height_, int samples_)
samples = samples_;
- state.width = 0;
- state.height = 0;
+ state.buffer = BufferParams();
state.sample = -1;
state.resolution = start_resolution;
state.tiles.clear();
@@ -70,8 +69,8 @@ void TileManager::set_samples(int samples_)
void TileManager::set_tiles()
{
int resolution = state.resolution;
- int image_w = max(1, full_width/resolution);
- int image_h = max(1, full_height/resolution);
+ int image_w = max(1, params.width/resolution);
+ int image_h = max(1, params.height/resolution);
int tile_w = (image_w + tile_size - 1)/tile_size;
int tile_h = (image_h + tile_size - 1)/tile_size;
int sub_w = image_w/tile_w;
@@ -90,8 +89,13 @@ void TileManager::set_tiles()
}
}
- state.width = image_w;
- state.height = image_h;
+ state.buffer.width = image_w;
+ state.buffer.height = image_h;
+
+ state.buffer.full_x = params.full_x/resolution;
+ state.buffer.full_y = params.full_y/resolution;
+ state.buffer.full_width = max(1, params.full_width/resolution);
+ state.buffer.full_height = max(1, params.full_height/resolution);
}
bool TileManager::done()
diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h
index 5cd16eb8afa..b6e610c8d90 100644
--- a/intern/cycles/render/tile.h
+++ b/intern/cycles/render/tile.h
@@ -21,6 +21,7 @@
#include <limits.h>
+#include "buffers.h"
#include "util_list.h"
CCL_NAMESPACE_BEGIN
@@ -39,9 +40,10 @@ public:
class TileManager {
public:
+ BufferParams params;
+
struct State {
- int width;
- int height;
+ BufferParams buffer;
int sample;
int resolution;
list<Tile> tiles;
@@ -50,7 +52,7 @@ public:
TileManager(bool progressive, int samples, int tile_size, int min_size);
~TileManager();
- void reset(int width, int height, int samples);
+ void reset(BufferParams& params, int samples);
void set_samples(int samples);
bool next();
bool done();
@@ -63,8 +65,6 @@ protected:
int tile_size;
int min_size;
- int full_width;
- int full_height;
int start_resolution;
};
diff --git a/intern/cycles/subd/subd_mesh.cpp b/intern/cycles/subd/subd_mesh.cpp
index 8ed4854b786..3e6e0de48ea 100644
--- a/intern/cycles/subd/subd_mesh.cpp
+++ b/intern/cycles/subd/subd_mesh.cpp
@@ -88,7 +88,7 @@ SubdFace *SubdMesh::add_face(int *index, int num)
/* test non-manifold cases */
if(!can_add_face(index, num)) {
/* we could try to add face in opposite winding instead .. */
- fprintf(stderr, "Warning: non manifold mesh, invalid face '%lu'.\n", faces.size());
+ fprintf(stderr, "Warning: non manifold mesh, invalid face '%lu'.\n", (unsigned long)faces.size());
return NULL;
}
diff --git a/intern/cycles/util/util_boundbox.h b/intern/cycles/util/util_boundbox.h
index 34cc1d6e11c..0114a9a26a5 100644
--- a/intern/cycles/util/util_boundbox.h
+++ b/intern/cycles/util/util_boundbox.h
@@ -19,11 +19,15 @@
#ifndef __UTIL_BOUNDBOX_H__
#define __UTIL_BOUNDBOX_H__
+#include <math.h>
#include <float.h>
+#include "util_math.h"
#include "util_transform.h"
#include "util_types.h"
+using namespace std;
+
CCL_NAMESPACE_BEGIN
class BoundBox
@@ -71,7 +75,9 @@ public:
bool valid(void) const
{
- return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z);
+ return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
+ !(isnan(min.x) || isnan(min.y) || isnan(min.z)) &&
+ !(isnan(max.x) || isnan(max.y) || isnan(max.z));
}
BoundBox transformed(const Transform *tfm)
diff --git a/intern/cycles/util/util_cache.h b/intern/cycles/util/util_cache.h
index 91e8a94a584..6e3c7c47e39 100644
--- a/intern/cycles/util/util_cache.h
+++ b/intern/cycles/util/util_cache.h
@@ -106,7 +106,7 @@ public:
data.resize(size/sizeof(T));
if(!fread(&data[0], size, 1, f)) {
- fprintf(stderr, "Failed to read vector data from cache (%ld).\n", size);
+ fprintf(stderr, "Failed to read vector data from cache (%lu).\n", (unsigned long)size);
return;
}
}
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index 2f9e00dbfcb..0a1d8ff4555 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -63,6 +63,7 @@ CCL_NAMESPACE_BEGIN
#if(!defined(FREE_WINDOWS))
#define copysignf(x, y) ((float)_copysign(x, y))
#define hypotf(x, y) _hypotf(x, y)
+#define isnan(x) _isnan(x)
#endif
#endif
@@ -535,6 +536,11 @@ __device_inline float3 float4_to_float3(const float4 a)
return make_float3(a.x, a.y, a.z);
}
+__device_inline float4 float3_to_float4(const float3 a)
+{
+ return make_float4(a.x, a.y, a.z, 1.0f);
+}
+
#ifndef __KERNEL_GPU__
__device_inline void print_float3(const char *label, const float3& a)
diff --git a/intern/cycles/util/util_md5.cpp b/intern/cycles/util/util_md5.cpp
index b871fad3636..25a77f18d02 100644
--- a/intern/cycles/util/util_md5.cpp
+++ b/intern/cycles/util/util_md5.cpp
@@ -361,14 +361,15 @@ void MD5Hash::finish(uint8_t digest[16])
string MD5Hash::get_hex()
{
uint8_t digest[16];
- char buf[16*2];
+ char buf[16*2+1];
finish(digest);
for(int i=0; i<16; i++)
sprintf(buf + i*2, "%02X", digest[i]);
+ buf[sizeof(buf)-1] = '\0';
- return string(buf, sizeof(buf));
+ return string(buf);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/util/util_system.cpp b/intern/cycles/util/util_system.cpp
index abf5e08de97..e8c81e57654 100644
--- a/intern/cycles/util/util_system.cpp
+++ b/intern/cycles/util/util_system.cpp
@@ -142,15 +142,15 @@ bool system_cpu_support_optimized()
static bool caps_init = false;
if(!caps_init) {
- int result[4], num, num_ex;
+ int result[4], num; //, num_ex;
memset(&caps, 0, sizeof(caps));
__cpuid(result, 0);
num = result[0];
- __cpuid(result, 0x80000000);
- num_ex = result[0];
+ /*__cpuid(result, 0x80000000);
+ num_ex = result[0];*/
if(num >= 1){
__cpuid(result, 0x00000001);
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
index 8f4e2b46616..07db52f6392 100644
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@ -41,8 +41,9 @@ __device_inline float3 transform(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
+ float w = dot(t->w, b);
- return c/dot(t->w, b);
+ return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
}
__device_inline float3 transform_direction(const Transform *t, const float3 a)
@@ -208,6 +209,13 @@ __device_inline float3 transform_get_column(const Transform *t, int column)
return make_float3(t->x[column], t->y[column], t->z[column]);
}
+__device_inline void transform_set_column(Transform *t, int column, float3 value)
+{
+ t->x[column] = value.x;
+ t->y[column] = value.y;
+ t->z[column] = value.z;
+}
+
Transform transform_inverse(const Transform& a);
__device_inline bool transform_uniform_scale(const Transform& tfm, float& scale)
@@ -243,6 +251,17 @@ __device_inline bool transform_negative_scale(const Transform& tfm)
return (dot(cross(c0, c1), c2) < 0.0f);
}
+__device_inline Transform transform_clear_scale(const Transform& tfm)
+{
+ Transform ntfm = tfm;
+
+ transform_set_column(&ntfm, 0, normalize(transform_get_column(&ntfm, 0)));
+ transform_set_column(&ntfm, 1, normalize(transform_get_column(&ntfm, 1)));
+ transform_set_column(&ntfm, 2, normalize(transform_get_column(&ntfm, 2)));
+
+ return ntfm;
+}
+
#endif
CCL_NAMESPACE_END
diff --git a/intern/dualcon/CMakeLists.txt b/intern/dualcon/CMakeLists.txt
new file mode 100644
index 00000000000..caa1ea09b04
--- /dev/null
+++ b/intern/dualcon/CMakeLists.txt
@@ -0,0 +1,46 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+ .
+ intern
+ ../../extern/Eigen3
+)
+
+set(SRC
+ intern/manifold_table.cpp
+ intern/marching_cubes_table.cpp
+ intern/octree.cpp
+ intern/Projections.cpp
+
+ intern/cubes.h
+ intern/GeoCommon.h
+ intern/manifold_table.h
+ intern/marching_cubes_table.h
+ intern/MemoryAllocator.h
+ intern/ModelReader.h
+ intern/octree.h
+ intern/Projections.h
+ intern/Queue.h
+
+ intern/dualcon_c_api.cpp
+ dualcon.h
+)
+
+blender_add_lib(bf_intern_dualcon "${SRC}" "${INC}" "")
+
diff --git a/intern/dualcon/SConscript b/intern/dualcon/SConscript
new file mode 100644
index 00000000000..481e9ae7f5c
--- /dev/null
+++ b/intern/dualcon/SConscript
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('intern/*.cpp')
+
+incs = '. ../../extern/Eigen3'
+defs = ''
+
+env.BlenderLib ('bf_intern_dualcon', sources, Split(incs), Split(defs), libtype=['intern'], priority=[100] )
diff --git a/intern/dualcon/dualcon.h b/intern/dualcon/dualcon.h
new file mode 100644
index 00000000000..9346adc99b3
--- /dev/null
+++ b/intern/dualcon/dualcon.h
@@ -0,0 +1,95 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nicholas Bishop
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef DUALCON_H
+#define DUALCON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef float (*DualConCo)[3];
+typedef unsigned int (*DualConFaces)[4];
+struct DerivedMesh;
+
+typedef struct DualConInput {
+ DualConCo co;
+ int co_stride;
+ int totco;
+
+ DualConFaces faces;
+ int face_stride;
+ int totface;
+
+ float min[3], max[3];
+} DualConInput;
+
+/* callback for allocating memory for output */
+typedef void *(*DualConAllocOutput)(int totvert, int totquad);
+/* callback for adding a new vertex to the output */
+typedef void (*DualConAddVert)(void *output, const float co[3]);
+/* callback for adding a new quad to the output */
+typedef void (*DualConAddQuad)(void *output, const int vert_indices[4]);
+
+typedef enum {
+ DUALCON_FLOOD_FILL = 1,
+} DualConFlags;
+
+typedef enum {
+ /* blocky */
+ DUALCON_CENTROID,
+ /* smooth */
+ DUALCON_MASS_POINT,
+ /* keeps sharp edges */
+ DUALCON_SHARP_FEATURES,
+} DualConMode;
+
+/* Usage:
+
+ The three callback arguments are used for creating the output
+ mesh. The alloc_output callback takes the total number of vertices
+ and faces (quads) that will be in the output. It should allocate
+ and return a structure to hold the output mesh. The add_vert and
+ add_quad callbacks will then be called for each new vertex and
+ quad, and the callback should add the new mesh elements to the
+ structure.
+*/
+void *dualcon(const DualConInput *input_mesh,
+ /* callbacks for output */
+ DualConAllocOutput alloc_output,
+ DualConAddVert add_vert,
+ DualConAddQuad add_quad,
+
+ /* flags and settings to control the remeshing
+ algorithm */
+ DualConFlags flags,
+ DualConMode mode,
+ float threshold,
+ float hermite_num,
+ float scale,
+ int depth);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/intern/dualcon/intern/GeoCommon.h b/intern/dualcon/intern/GeoCommon.h
new file mode 100644
index 00000000000..3b2789bec87
--- /dev/null
+++ b/intern/dualcon/intern/GeoCommon.h
@@ -0,0 +1,69 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef GEOCOMMON_H
+#define GEOCOMMON_H
+
+#define UCHAR unsigned char
+#define USHORT unsigned short
+
+#define USE_MINIMIZER
+
+/**
+ * Structure definitions for points and triangles.
+ *
+ * @author Tao Ju
+ */
+
+
+// 3d point with integer coordinates
+typedef struct
+{
+ int x, y, z;
+} Point3i;
+
+typedef struct
+{
+ Point3i begin;
+ Point3i end;
+} BoundingBox;
+
+// triangle that points to three vertices
+typedef struct
+{
+ float vt[3][3] ;
+} Triangle;
+
+// 3d point with float coordinates
+typedef struct
+{
+ float x, y, z;
+} Point3f;
+
+typedef struct
+{
+ Point3f begin;
+ Point3f end;
+} BoundingBoxf;
+
+
+#endif
diff --git a/intern/dualcon/intern/MemoryAllocator.h b/intern/dualcon/intern/MemoryAllocator.h
new file mode 100644
index 00000000000..de9dca175a4
--- /dev/null
+++ b/intern/dualcon/intern/MemoryAllocator.h
@@ -0,0 +1,219 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef MEMORYALLOCATOR_H
+#define MEMORYALLOCATOR_H
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define HEAP_BASE 16
+#define UCHAR unsigned char
+
+/**
+ * Customized memory allocators that allocates/deallocates memory in chunks
+ *
+ * @author Tao Ju
+ */
+
+
+
+/**
+ * Base class of memory allocators
+ */
+class VirtualMemoryAllocator
+{
+public:
+ virtual UCHAR * allocate( ) = 0 ;
+ virtual void deallocate( UCHAR * obj ) = 0 ;
+ virtual void destroy( ) = 0 ;
+ virtual void printInfo( ) = 0 ;
+
+ virtual int getAllocated( ) = 0 ;
+ virtual int getAll( ) = 0 ;
+ virtual int getBytes( ) = 0 ;
+};
+
+/**
+ * Dynamic memory allocator - allows allocation/deallocation
+ *
+ * Note: there are 4 bytes overhead for each allocated yet unused object.
+ */
+template < int N >
+class MemoryAllocator : public VirtualMemoryAllocator
+{
+private:
+
+ /// Constants
+ int HEAP_UNIT, HEAP_MASK ;
+
+ /// Data array
+ UCHAR ** data ;
+
+ /// Allocation stack
+ UCHAR *** stack ;
+
+ /// Number of data blocks
+ int datablocknum ;
+
+ /// Number of stack blocks
+ int stackblocknum ;
+
+ /// Size of stack
+ int stacksize ;
+
+ /// Number of available objects on stack
+ int available ;
+
+ /**
+ * Allocate a memory block
+ */
+ void allocateDataBlock ( )
+ {
+ // Allocate a data block
+ datablocknum += 1 ;
+ data = ( UCHAR ** )realloc( data, sizeof ( UCHAR * ) * datablocknum ) ;
+ data[ datablocknum - 1 ] = ( UCHAR * )malloc( HEAP_UNIT * N ) ;
+
+ // Update allocation stack
+ for ( int i = 0 ; i < HEAP_UNIT ; i ++ )
+ {
+ stack[ 0 ][ i ] = ( data[ datablocknum - 1 ] + i * N ) ;
+ }
+ available = HEAP_UNIT ;
+ }
+
+ /**
+ * Allocate a stack block, to store more deallocated objects
+ */
+ void allocateStackBlock( )
+ {
+ // Allocate a stack block
+ stackblocknum += 1 ;
+ stacksize += HEAP_UNIT ;
+ stack = ( UCHAR *** )realloc( stack, sizeof ( UCHAR ** ) * stackblocknum ) ;
+ stack[ stackblocknum - 1 ] = ( UCHAR ** )malloc( HEAP_UNIT * sizeof ( UCHAR * ) ) ;
+ }
+
+
+public:
+ /**
+ * Constructor
+ */
+ MemoryAllocator( )
+ {
+ HEAP_UNIT = 1 << HEAP_BASE ;
+ HEAP_MASK = ( 1 << HEAP_BASE ) - 1 ;
+
+ data = ( UCHAR ** )malloc( sizeof( UCHAR * ) ) ;
+ data[ 0 ] = ( UCHAR * )malloc( HEAP_UNIT * N ) ;
+ datablocknum = 1 ;
+
+ stack = ( UCHAR *** )malloc( sizeof ( UCHAR ** ) ) ;
+ stack[ 0 ] = ( UCHAR ** )malloc( HEAP_UNIT * sizeof ( UCHAR * ) ) ;
+ stackblocknum = 1 ;
+ stacksize = HEAP_UNIT ;
+ available = HEAP_UNIT ;
+
+ for ( int i = 0 ; i < HEAP_UNIT ; i ++ )
+ {
+ stack[ 0 ][ i ] = ( data[ 0 ] + i * N ) ;
+ }
+ }
+
+ /**
+ * Destructor
+ */
+ void destroy( )
+ {
+ int i ;
+ for ( i = 0 ; i < datablocknum ; i ++ )
+ {
+ free( data[ i ] ) ;
+ }
+ for ( i = 0 ; i < stackblocknum ; i ++ )
+ {
+ free( stack[ i ] ) ;
+ }
+ free( data ) ;
+ free( stack ) ;
+ }
+
+ /**
+ * Allocation method
+ */
+ UCHAR * allocate ( )
+ {
+ if ( available == 0 )
+ {
+ allocateDataBlock ( ) ;
+ }
+
+ // printf("Allocating %d\n", header[ allocated ]) ;
+ available -- ;
+ return stack[ available >> HEAP_BASE ][ available & HEAP_MASK ] ;
+ }
+
+ /**
+ * De-allocation method
+ */
+ void deallocate ( UCHAR * obj )
+ {
+ if ( available == stacksize )
+ {
+ allocateStackBlock ( ) ;
+ }
+
+ // printf("De-allocating %d\n", ( obj - data ) / N ) ;
+ stack[ available >> HEAP_BASE ][ available & HEAP_MASK ] = obj ;
+ available ++ ;
+ // printf("%d %d\n", allocated, header[ allocated ]) ;
+ }
+
+ /**
+ * Print information
+ */
+ void printInfo ( )
+ {
+ printf("Bytes: %d Used: %d Allocated: %d Maxfree: %d\n", getBytes(), getAllocated(), getAll(), stacksize ) ;
+ }
+
+ /**
+ * Query methods
+ */
+ int getAllocated( )
+ {
+ return HEAP_UNIT * datablocknum - available ;
+ };
+
+ int getAll( )
+ {
+ return HEAP_UNIT * datablocknum ;
+ };
+
+ int getBytes( )
+ {
+ return N ;
+ };
+};
+
+#endif
diff --git a/intern/dualcon/intern/ModelReader.h b/intern/dualcon/intern/ModelReader.h
new file mode 100644
index 00000000000..e70a1586e03
--- /dev/null
+++ b/intern/dualcon/intern/ModelReader.h
@@ -0,0 +1,64 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef MODELREADER_H
+#define MODELREADER_H
+
+#include "GeoCommon.h"
+
+/*
+ * Virtual class for input file readers
+ *
+ * @author Tao Ju
+ */
+class ModelReader
+{
+public:
+ /// Constructor
+ ModelReader(){} ;
+
+ /// Get next triangle
+ virtual Triangle* getNextTriangle( ) = 0 ;
+ virtual int getNextTriangle( int t[3] ) = 0 ;
+
+ /// Get bounding box
+ virtual float getBoundingBox ( float origin[3] ) = 0 ;
+
+ /// Get number of triangles
+ virtual int getNumTriangles ( ) = 0 ;
+
+ /// Get storage size
+ virtual int getMemory ( ) = 0 ;
+
+ /// Reset file reading location
+ virtual void reset( ) = 0 ;
+
+ /// For explicit vertex models
+ virtual int getNumVertices( ) = 0 ;
+
+ virtual void getNextVertex( float v[3] ) = 0 ;
+
+ virtual void printInfo ( ) = 0 ;
+};
+
+
+#endif
diff --git a/intern/dualcon/intern/Projections.cpp b/intern/dualcon/intern/Projections.cpp
new file mode 100644
index 00000000000..1f0831ce973
--- /dev/null
+++ b/intern/dualcon/intern/Projections.cpp
@@ -0,0 +1,76 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include "Projections.h"
+
+const int vertmap[8][3] = {
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 1, 0},
+ {0, 1, 1},
+ {1, 0, 0},
+ {1, 0, 1},
+ {1, 1, 0},
+ {1, 1, 1}
+};
+
+const int centmap[3][3][3][2] = {
+ {{{0, 0}, {0, 1}, {1, 1}},
+ {{0, 2}, {0, 3}, {1, 3}},
+ {{2, 2}, {2, 3}, {3, 3}}
+ },
+
+ {{{0, 4}, {0, 5}, {1, 5}},
+ {{0, 6}, {0, 7}, {1, 7}},
+ {{2, 6}, {2, 7}, {3, 7}}
+ },
+
+ {{{4, 4}, {4, 5}, {5, 5}},
+ {{4, 6}, {4, 7}, {5, 7}},
+ {{6, 6}, {6, 7}, {7, 7}}
+ }
+};
+
+const int edgemap[12][2] = {
+ {0, 4},
+ {1, 5},
+ {2, 6},
+ {3, 7},
+ {0, 2},
+ {1, 3},
+ {4, 6},
+ {5, 7},
+ {0, 1},
+ {2, 3},
+ {4, 5},
+ {6, 7}
+};
+
+const int facemap[6][4] = {
+ {0, 1, 2, 3},
+ {4, 5, 6, 7},
+ {0, 1, 4, 5},
+ {2, 3, 6, 7},
+ {0, 2, 4, 6},
+ {1, 3, 5, 7}
+};
diff --git a/intern/dualcon/intern/Projections.h b/intern/dualcon/intern/Projections.h
new file mode 100644
index 00000000000..a01b4dffdb0
--- /dev/null
+++ b/intern/dualcon/intern/Projections.h
@@ -0,0 +1,845 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef PROJECTIONS_H
+#define PROJECTIONS_H
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CONTAINS_INDEX
+#define GRID_DIMENSION 20
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+#define LONG __int64
+#else
+#include <stdint.h>
+#define LONG int64_t
+#endif
+#define UCHAR unsigned char
+
+/**
+ * Structures and classes for computing projections of triangles
+ * onto separating axes during scan conversion
+ *
+ * @author Tao Ju
+ */
+
+
+extern const int vertmap[8][3];
+extern const int centmap[3][3][3][2];
+extern const int edgemap[12][2];
+extern const int facemap[6][4];
+
+/**
+ * Structure for the projections inheritable from parent
+ */
+struct InheritableProjections
+{
+ /// Projections of triangle
+ LONG trigProj[13][2] ;
+
+ /// Projections of triangle vertices on primary axes
+ LONG trigVertProj[13][3] ;
+
+ /// Projections of triangle edges
+ LONG trigEdgeProj[13][3][2] ;
+
+ /// Normal of the triangle
+ double norm[3] ;
+ double normA, normB ;
+
+ /// End points along each axis
+ //int cubeEnds[13][2] ;
+
+ /// Error range on each axis
+ /// LONG errorProj[13];
+
+#ifdef CONTAINS_INDEX
+ /// Index of polygon
+ int index ;
+#endif
+};
+
+
+/**
+ * Class for projections of cube / triangle vertices on the separating axes
+ */
+class Projections
+{
+public:
+ /// Inheritable portion
+ InheritableProjections* inherit ;
+
+ /// Projections of the cube vertices
+ LONG cubeProj[13][6] ;
+
+public:
+
+ Projections( )
+ {
+ }
+
+ /**
+ * Construction
+ * from a cube (axes aligned) and triangle
+ */
+ Projections( LONG cube[2][3], LONG trig[3][3], LONG error, int triind )
+ {
+ int i, j ;
+ inherit = new InheritableProjections ;
+#ifdef CONTAINS_INDEX
+ inherit->index = triind ;
+#endif
+ /// Create axes
+ LONG axes[13][3] ;
+
+ // Cube faces
+ axes[0][0] = 1 ;
+ axes[0][1] = 0 ;
+ axes[0][2] = 0 ;
+
+ axes[1][0] = 0 ;
+ axes[1][1] = 1 ;
+ axes[1][2] = 0 ;
+
+ axes[2][0] = 0 ;
+ axes[2][1] = 0 ;
+ axes[2][2] = 1 ;
+
+ // Triangle face
+ LONG trigedge[3][3] ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ trigedge[i][j] = trig[(i+1)%3][j] - trig[i][j] ;
+ }
+ }
+ crossProduct( trigedge[0], trigedge[1], axes[3] ) ;
+
+ /// Normalize face normal and store
+ double dedge1[] = { (double) trig[1][0] - (double) trig[0][0],
+ (double) trig[1][1] - (double) trig[0][1],
+ (double) trig[1][2] - (double) trig[0][2] } ;
+ double dedge2[] = { (double) trig[2][0] - (double) trig[1][0],
+ (double) trig[2][1] - (double) trig[1][1],
+ (double) trig[2][2] - (double) trig[1][2] } ;
+ crossProduct( dedge1, dedge2, inherit->norm ) ;
+ normalize( inherit->norm ) ;
+// inherit->normA = norm[ 0 ] ;
+// inherit->normB = norm[ 2 ] > 0 ? norm[ 1 ] : 2 + norm[ 1 ] ;
+
+ // Face edges and triangle edges
+ int ct = 4 ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ crossProduct( axes[j], trigedge[i], axes[ct] ) ;
+ ct ++ ;
+ }
+
+ /// Generate projections
+ LONG cubeedge[3][3] ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ cubeedge[i][j] = 0 ;
+ }
+ cubeedge[i][i] = cube[1][i] - cube[0][i] ;
+ }
+
+ for ( j = 0 ; j < 13 ; j ++ )
+ {
+ // Origin
+ cubeProj[j][0] = dotProduct( axes[j], cube[0] ) ;
+
+ // 3 direction vectors
+ for ( i = 1 ; i < 4 ; i ++ )
+ {
+ cubeProj[j][i] = dotProduct( axes[j], cubeedge[i-1] ) ;
+ }
+
+ // Offsets of 2 ends of cube projection
+ LONG max = 0 ;
+ LONG min = 0 ;
+ for ( i = 1 ; i < 8 ; i ++ )
+ {
+ LONG proj = vertmap[i][0] * cubeProj[j][1] + vertmap[i][1] * cubeProj[j][2] + vertmap[i][2] * cubeProj[j][3] ;
+ if ( proj > max )
+ {
+ max = proj ;
+ }
+ if ( proj < min )
+ {
+ min = proj ;
+ }
+ }
+ cubeProj[j][4] = min ;
+ cubeProj[j][5] = max ;
+
+ }
+
+ for ( j = 0 ; j < 13 ; j ++ )
+ {
+ LONG vts[3] = { dotProduct( axes[j], trig[0] ),
+ dotProduct( axes[j], trig[1] ),
+ dotProduct( axes[j], trig[2] ) } ;
+
+ // Vertex
+ inherit->trigVertProj[j][0] = vts[0] ;
+ inherit->trigVertProj[j][1] = vts[1] ;
+ inherit->trigVertProj[j][2] = vts[2] ;
+
+ // Edge
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( vts[i] < vts[(i+1) % 3] )
+ {
+ inherit->trigEdgeProj[j][i][0] = vts[i] ;
+ inherit->trigEdgeProj[j][i][1] = vts[(i+1) % 3] ;
+ }
+ else
+ {
+ inherit->trigEdgeProj[j][i][1] = vts[i] ;
+ inherit->trigEdgeProj[j][i][0] = vts[(i+1) % 3] ;
+ }
+ }
+
+ // Triangle
+ inherit->trigProj[j][0] = vts[0] ;
+ inherit->trigProj[j][1] = vts[0] ;
+ for ( i = 1 ; i < 3 ; i ++ )
+ {
+ if ( vts[i] < inherit->trigProj[j][0] )
+ {
+ inherit->trigProj[j][0] = vts[i] ;
+ }
+ if ( vts[i] > inherit->trigProj[j][1] )
+ {
+ inherit->trigProj[j][1] = vts[i] ;
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Construction
+ * from a parent Projections object and the index of the children
+ */
+ Projections ( Projections* parent )
+ {
+ // Copy inheritable projections
+ this->inherit = parent->inherit ;
+
+ // Shrink cube projections
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+ cubeProj[i][0] = parent->cubeProj[i][0] ;
+ for ( int j = 1 ; j < 6 ; j ++ )
+ {
+ cubeProj[i][j] = parent->cubeProj[i][j] >> 1 ;
+ }
+ }
+ };
+
+ Projections ( Projections* parent, int box[3], int depth )
+ {
+ int mask = ( 1 << depth ) - 1 ;
+ int nbox[3] = { box[0] & mask, box[1] & mask, box[2] & mask } ;
+
+ // Copy inheritable projections
+ this->inherit = parent->inherit ;
+
+ // Shrink cube projections
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+ for ( int j = 1 ; j < 6 ; j ++ )
+ {
+ cubeProj[i][j] = parent->cubeProj[i][j] >> depth ;
+ }
+
+ cubeProj[i][0] = parent->cubeProj[i][0] + nbox[0] * cubeProj[i][1] + nbox[1] * cubeProj[i][2] + nbox[2] * cubeProj[i][3] ;
+ }
+ };
+
+ /**
+ * Testing intersection based on vertex/edge masks
+ */
+ int getIntersectionMasks( UCHAR cedgemask, UCHAR& edgemask )
+ {
+ int i, j ;
+ edgemask = cedgemask ;
+
+ // Pre-processing
+ /*
+ if ( cvertmask & 1 )
+ {
+ edgemask |= 5 ;
+ }
+ if ( cvertmask & 2 )
+ {
+ edgemask |= 3 ;
+ }
+ if ( cvertmask & 4 )
+ {
+ edgemask |= 6 ;
+ }
+
+ */
+
+ // Test axes for edge intersection
+ UCHAR bit = 1 ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ if ( edgemask & bit )
+ {
+ for ( i = 0 ; i < 13 ; i ++ )
+ {
+ LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+
+ if ( proj0 > inherit->trigEdgeProj[i][j][1] ||
+ proj1 < inherit->trigEdgeProj[i][j][0] )
+ {
+ edgemask &= ( ~ bit ) ;
+ break ;
+ }
+ }
+ }
+ bit <<= 1 ;
+ }
+
+ /*
+ if ( edgemask != 0 )
+ {
+ printf("%d %d\n", cedgemask, edgemask) ;
+ }
+ */
+
+ // Test axes for triangle intersection
+ if ( edgemask )
+ {
+ return 1 ;
+ }
+
+ for ( i = 3 ; i < 13 ; i ++ )
+ {
+ LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+
+ if ( proj0 > inherit->trigProj[i][1] ||
+ proj1 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+
+ return 1 ;
+ }
+
+ /**
+ * Retrieving children masks using PRIMARY AXES
+ */
+ UCHAR getChildrenMasks( UCHAR cvertmask, UCHAR vertmask[8] )
+ {
+ int i, j, k ;
+ int bmask[3][2] = {{0,0},{0,0},{0,0}} ;
+ int vmask[3][3][2] = {{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}}} ;
+ UCHAR boxmask = 0 ;
+ LONG len = cubeProj[0][1] >> 1 ;
+
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ LONG mid = cubeProj[i][0] + len ;
+
+ // Check bounding box
+ if ( mid >= inherit->trigProj[i][0] )
+ {
+ bmask[i][0] = 1 ;
+ }
+ if ( mid <= inherit->trigProj[i][1] )
+ {
+ bmask[i][1] = 1 ;
+ }
+
+ // Check vertex mask
+ if ( cvertmask )
+ {
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ if ( cvertmask & ( 1 << j ) )
+ {
+ // Only check if it's contained this node
+ if ( mid >= inherit->trigVertProj[i][j] )
+ {
+ vmask[i][j][0] = 1 ;
+ }
+ if ( mid <= inherit->trigVertProj[i][j] )
+ {
+ vmask[i][j][1] = 1 ;
+ }
+ }
+ }
+ }
+
+ /*
+ // Check edge mask
+ if ( cedgemask )
+ {
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ if ( cedgemask & ( 1 << j ) )
+ {
+ // Only check if it's contained this node
+ if ( mid >= inherit->trigEdgeProj[i][j][0] )
+ {
+ emask[i][j][0] = 1 ;
+ }
+ if ( mid <= inherit->trigEdgeProj[i][j][1] )
+ {
+ emask[i][j][1] = 1 ;
+ }
+ }
+ }
+ }
+ */
+
+ }
+
+ // Fill in masks
+ int ct = 0 ;
+ for ( i = 0 ; i < 2 ; i ++ )
+ for ( j = 0 ; j < 2 ; j ++ )
+ for ( k = 0 ; k < 2 ; k ++ )
+ {
+ boxmask |= ( ( bmask[0][i] & bmask[1][j] & bmask[2][k] ) << ct ) ;
+ vertmask[ct] = (( vmask[0][0][i] & vmask[1][0][j] & vmask[2][0][k] ) |
+ (( vmask[0][1][i] & vmask[1][1][j] & vmask[2][1][k] ) << 1 ) |
+ (( vmask[0][2][i] & vmask[1][2][j] & vmask[2][2][k] ) << 2 ) ) ;
+ /*
+ edgemask[ct] = (( emask[0][0][i] & emask[1][0][j] & emask[2][0][k] ) |
+ (( emask[0][1][i] & emask[1][1][j] & emask[2][1][k] ) << 1 ) |
+ (( emask[0][2][i] & emask[1][2][j] & emask[2][2][k] ) << 2 ) ) ;
+ edgemask[ct] = cedgemask ;
+ */
+ ct ++ ;
+ }
+
+ // Return bounding box masks
+ return boxmask ;
+ }
+
+ UCHAR getBoxMask( )
+ {
+ int i, j, k ;
+ int bmask[3][2] = {{0,0},{0,0},{0,0}} ;
+ UCHAR boxmask = 0 ;
+ LONG len = cubeProj[0][1] >> 1 ;
+
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ LONG mid = cubeProj[i][0] + len ;
+
+ // Check bounding box
+ if ( mid >= inherit->trigProj[i][0] )
+ {
+ bmask[i][0] = 1 ;
+ }
+ if ( mid <= inherit->trigProj[i][1] )
+ {
+ bmask[i][1] = 1 ;
+ }
+
+ }
+
+ // Fill in masks
+ int ct = 0 ;
+ for ( i = 0 ; i < 2 ; i ++ )
+ for ( j = 0 ; j < 2 ; j ++ )
+ for ( k = 0 ; k < 2 ; k ++ )
+ {
+ boxmask |= ( ( bmask[0][i] & bmask[1][j] & bmask[2][k] ) << ct ) ;
+ ct ++ ;
+ }
+
+ // Return bounding box masks
+ return boxmask ;
+ }
+
+
+ /**
+ * Get projections for sub-cubes (simple axes)
+ */
+ void getSubProjectionsSimple( Projections* p[8] )
+ {
+ // Process the axes cooresponding to the triangle's normal
+ int ind = 3 ;
+ LONG len = cubeProj[ 0 ][ 1 ] >> 1 ;
+ LONG trigproj[3] = { cubeProj[ ind ][ 1 ] >> 1, cubeProj[ ind ][ 2 ] >> 1, cubeProj[ ind ][ 3 ] >> 1 } ;
+
+ int ct = 0 ;
+ for ( int i = 0 ; i < 2 ; i ++ )
+ for ( int j = 0 ; j < 2 ; j ++ )
+ for ( int k = 0 ; k < 2 ; k ++ )
+ {
+ p[ct] = new Projections( ) ;
+ p[ct]->inherit = inherit ;
+
+ p[ct]->cubeProj[ 0 ][ 0 ] = cubeProj[ 0 ][ 0 ] + i * len ;
+ p[ct]->cubeProj[ 1 ][ 0 ] = cubeProj[ 1 ][ 0 ] + j * len ;
+ p[ct]->cubeProj[ 2 ][ 0 ] = cubeProj[ 2 ][ 0 ] + k * len ;
+ p[ct]->cubeProj[ 0 ][ 1 ] = len ;
+
+ for ( int m = 1 ; m < 4 ; m ++ )
+ {
+ p[ct]->cubeProj[ ind ][ m ] = trigproj[ m - 1 ] ;
+ }
+ p[ct]->cubeProj[ ind ][ 0 ] = cubeProj[ ind ][0] + i * trigproj[0] + j * trigproj[1] + k * trigproj[2] ;
+
+ ct ++ ;
+ }
+ }
+
+ /**
+ * Shifting a cube to a new origin
+ */
+ void shift ( int off[3] )
+ {
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+ cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3] ;
+ }
+ }
+
+ void shiftNoPrimary ( int off[3] )
+ {
+ for ( int i = 3 ; i < 13 ; i ++ )
+ {
+ cubeProj[i][0] += off[0] * cubeProj[i][1] + off[1] * cubeProj[i][2] + off[2] * cubeProj[i][3] ;
+ }
+ }
+
+ /**
+ * Method to test intersection of the triangle and the cube
+ */
+ int isIntersecting ( )
+ {
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+ /*
+ LONG proj0 = cubeProj[i][0] +
+ vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] +
+ vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] +
+ vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
+ LONG proj1 = cubeProj[i][0] +
+ vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] +
+ vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] +
+ vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
+ */
+
+ LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+
+ if ( proj0 > inherit->trigProj[i][1] ||
+ proj1 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+
+ return 1 ;
+ };
+
+ int isIntersectingNoPrimary ( )
+ {
+ for ( int i = 3 ; i < 13 ; i ++ )
+ {
+ /*
+ LONG proj0 = cubeProj[i][0] +
+ vertmap[inherit->cubeEnds[i][0]][0] * cubeProj[i][1] +
+ vertmap[inherit->cubeEnds[i][0]][1] * cubeProj[i][2] +
+ vertmap[inherit->cubeEnds[i][0]][2] * cubeProj[i][3] ;
+ LONG proj1 = cubeProj[i][0] +
+ vertmap[inherit->cubeEnds[i][1]][0] * cubeProj[i][1] +
+ vertmap[inherit->cubeEnds[i][1]][1] * cubeProj[i][2] +
+ vertmap[inherit->cubeEnds[i][1]][2] * cubeProj[i][3] ;
+ */
+
+ LONG proj0 = cubeProj[i][0] + cubeProj[i][4] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][5] ;
+
+ if ( proj0 > inherit->trigProj[i][1] ||
+ proj1 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+
+ return 1 ;
+ };
+
+ /**
+ * Method to test intersection of the triangle and one edge
+ */
+ int isIntersecting ( int edgeInd )
+ {
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+
+ LONG proj0 = cubeProj[i][0] +
+ vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] +
+ vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] +
+ vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3] ;
+ LONG proj1 = cubeProj[i][0] +
+ vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] +
+ vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] +
+ vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3] ;
+
+
+ if ( proj0 < proj1 )
+ {
+ if ( proj0 > inherit->trigProj[i][1] ||
+ proj1 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+ else
+ {
+ if ( proj1 > inherit->trigProj[i][1] ||
+ proj0 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+ }
+
+ // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] ) ;
+ return 1 ;
+ };
+
+ /**
+ * Method to test intersection of one triangle edge and one cube face
+ */
+ int isIntersecting ( int edgeInd, int faceInd )
+ {
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+ LONG trigproj0 = inherit->trigVertProj[i][edgeInd] ;
+ LONG trigproj1 = inherit->trigVertProj[i][(edgeInd+1)%3] ;
+
+ if ( trigproj0 < trigproj1 )
+ {
+ int t1 = 1 , t2 = 1 ;
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ LONG proj = cubeProj[i][0] +
+ vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] +
+ vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] +
+ vertmap[facemap[faceInd][j]][2] * cubeProj[i][3] ;
+ if ( proj >= trigproj0 )
+ {
+ t1 = 0 ;
+ }
+ if ( proj <= trigproj1 )
+ {
+ t2 = 0 ;
+ }
+ }
+ if ( t1 || t2 )
+ {
+ return 0 ;
+ }
+ }
+ else
+ {
+ int t1 = 1 , t2 = 1 ;
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ LONG proj = cubeProj[i][0] +
+ vertmap[facemap[faceInd][j]][0] * cubeProj[i][1] +
+ vertmap[facemap[faceInd][j]][1] * cubeProj[i][2] +
+ vertmap[facemap[faceInd][j]][2] * cubeProj[i][3] ;
+ if ( proj >= trigproj1 )
+ {
+ t1 = 0 ;
+ }
+ if ( proj <= trigproj0 )
+ {
+ t2 = 0 ;
+ }
+ }
+ if ( t1 || t2 )
+ {
+ return 0 ;
+ }
+ }
+ }
+
+ return 1 ;
+ };
+
+
+ int isIntersectingPrimary ( int edgeInd )
+ {
+ for ( int i = 0 ; i < 13 ; i ++ )
+ {
+
+ LONG proj0 = cubeProj[i][0] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1] ;
+
+ if ( proj0 < proj1 )
+ {
+ if ( proj0 > inherit->trigProj[i][1] ||
+ proj1 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+ else
+ {
+ if ( proj1 > inherit->trigProj[i][1] ||
+ proj0 < inherit->trigProj[i][0] )
+ {
+ return 0 ;
+ }
+ }
+
+ }
+
+ // printf( "Intersecting: %d %d\n", edgemap[edgeInd][0], edgemap[edgeInd][1] ) ;
+ return 1 ;
+ };
+
+ double getIntersection ( int edgeInd )
+ {
+ int i = 3 ;
+
+ LONG proj0 = cubeProj[i][0] +
+ vertmap[edgemap[edgeInd][0]][0] * cubeProj[i][1] +
+ vertmap[edgemap[edgeInd][0]][1] * cubeProj[i][2] +
+ vertmap[edgemap[edgeInd][0]][2] * cubeProj[i][3] ;
+ LONG proj1 = cubeProj[i][0] +
+ vertmap[edgemap[edgeInd][1]][0] * cubeProj[i][1] +
+ vertmap[edgemap[edgeInd][1]][1] * cubeProj[i][2] +
+ vertmap[edgemap[edgeInd][1]][2] * cubeProj[i][3] ;
+ LONG proj2 = inherit->trigProj[i][1] ;
+
+ /*
+ if ( proj0 < proj1 )
+ {
+ if ( proj2 < proj0 || proj2 > proj1 )
+ {
+ return -1 ;
+ }
+ }
+ else
+ {
+ if ( proj2 < proj1 || proj2 > proj0 )
+ {
+ return -1 ;
+ }
+ }
+ */
+
+ double alpha = (double)( proj2 - proj0 ) / (double)( proj1 - proj0 ) ;
+ /*
+ if ( alpha < 0 )
+ {
+ alpha = 0.5 ;
+ }
+ else if ( alpha > 1 )
+ {
+ alpha = 0.5 ;
+ }
+ */
+
+ return alpha ;
+ };
+
+ float getIntersectionPrimary ( int edgeInd )
+ {
+ int i = 3 ;
+
+
+ LONG proj0 = cubeProj[i][0] ;
+ LONG proj1 = cubeProj[i][0] + cubeProj[i][edgeInd + 1] ;
+ LONG proj2 = inherit->trigProj[i][1] ;
+
+ // double alpha = (double)( ( proj2 - proj0 ) * cubeProj[edgeInd][edgeInd + 1] ) / (double)( proj1 - proj0 ) ;
+ double alpha = (double)( ( proj2 - proj0 ) ) / (double)( proj1 - proj0 ) ;
+
+ if ( alpha < 0 )
+ {
+ alpha = 0.5 ;
+ }
+ else if ( alpha > 1 )
+ {
+ alpha = 0.5 ;
+ }
+
+
+ return (float)alpha ;
+ };
+
+ /**
+ * Method to perform cross-product
+ */
+ void crossProduct ( LONG a[3], LONG b[3], LONG res[3] )
+ {
+ res[0] = a[1] * b[2] - a[2] * b[1] ;
+ res[1] = a[2] * b[0] - a[0] * b[2] ;
+ res[2] = a[0] * b[1] - a[1] * b[0] ;
+ }
+ void crossProduct ( double a[3], double b[3], double res[3] )
+ {
+ res[0] = a[1] * b[2] - a[2] * b[1] ;
+ res[1] = a[2] * b[0] - a[0] * b[2] ;
+ res[2] = a[0] * b[1] - a[1] * b[0] ;
+ }
+
+ /**
+ * Method to perform dot product
+ */
+ LONG dotProduct ( LONG a[3], LONG b[3] )
+ {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] ;
+ }
+
+ void normalize( double a[3] )
+ {
+ double mag = a[0] * a[0] + a[1] * a[1] + a[2] * a[2] ;
+ if ( mag > 0 )
+ {
+ mag = sqrt( mag ) ;
+ a[0] /= mag ;
+ a[1] /= mag ;
+ a[2] /= mag ;
+ }
+ }
+
+};
+
+#endif
diff --git a/intern/dualcon/intern/Queue.h b/intern/dualcon/intern/Queue.h
new file mode 100644
index 00000000000..61d7e2af2e8
--- /dev/null
+++ b/intern/dualcon/intern/Queue.h
@@ -0,0 +1,110 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef QUEUE_H
+#define QUEUE_H
+
+struct gridQueueEle
+{
+ int x, y, z;
+ UCHAR dir ;
+ gridQueueEle* next ;
+};
+
+class GridQueue
+{
+ gridQueueEle* head ;
+ gridQueueEle* tail ;
+ int numEles ;
+
+public:
+
+ GridQueue( )
+ {
+ head = NULL ;
+ tail = NULL ;
+ numEles = 0 ;
+ }
+
+ gridQueueEle* getHead( )
+ {
+ return head ;
+ }
+
+ int getNumElements( )
+ {
+ return numEles ;
+ }
+
+
+ void pushQueue( int st[3], int dir )
+ {
+ gridQueueEle* ele = new gridQueueEle ;
+ ele->x = st[0] ;
+ ele->y = st[1] ;
+ ele->z = st[2] ;
+ ele->dir = (UCHAR) dir ;
+ ele->next = NULL ;
+ if ( head == NULL )
+ {
+ head = ele ;
+ }
+ else
+ {
+ tail->next = ele ;
+ }
+ tail = ele ;
+ numEles ++ ;
+ }
+
+ int popQueue( int st[3], int& dir )
+ {
+ if ( head == NULL )
+ {
+ return 0 ;
+ }
+
+ st[0] = head->x ;
+ st[1] = head->y ;
+ st[2] = head->z ;
+ dir = (int) (head->dir) ;
+
+ gridQueueEle* temp = head ;
+ head = head->next ;
+ delete temp ;
+
+ if ( head == NULL )
+ {
+ tail = NULL ;
+ }
+ numEles -- ;
+
+ return 1 ;
+ }
+
+};
+
+
+
+
+
+#endif
diff --git a/intern/dualcon/intern/cubes.h b/intern/dualcon/intern/cubes.h
new file mode 100644
index 00000000000..0cdd791a649
--- /dev/null
+++ b/intern/dualcon/intern/cubes.h
@@ -0,0 +1,46 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef CUBES_H
+#define CUBES_H
+
+#include "marching_cubes_table.h"
+
+/* simple wrapper for auto-generated marching cubes data */
+class Cubes
+{
+public:
+ /// Get number of triangles
+ int getNumTriangle(int mask)
+ {
+ return marching_cubes_numtri[mask];
+ }
+
+ /// Get a triangle
+ void getTriangle(int mask, int index, int indices[3] )
+ {
+ for(int i = 0; i < 3; i++)
+ indices[i] = marching_cubes_tris[mask][index][i];
+ }
+};
+
+#endif
diff --git a/intern/dualcon/intern/dualcon_c_api.cpp b/intern/dualcon/intern/dualcon_c_api.cpp
new file mode 100644
index 00000000000..d710ada48bc
--- /dev/null
+++ b/intern/dualcon/intern/dualcon_c_api.cpp
@@ -0,0 +1,191 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nicholas Bishop
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <cassert>
+#include "dualcon.h"
+#include "ModelReader.h"
+#include "octree.h"
+
+#include <cstdio>
+
+void veccopy(float dst[3], const float src[3])
+{
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+}
+
+#define GET_FACE(_mesh, _n) \
+ (*(DualConFaces)(((char*)(_mesh)->faces) + ((_n) * (_mesh)->face_stride)))
+
+#define GET_CO(_mesh, _n) \
+ (*(DualConCo)(((char*)(_mesh)->co) + ((_n) * (_mesh)->co_stride)))
+
+class DualConInputReader : public ModelReader
+{
+private:
+ const DualConInput *input_mesh;
+ int tottri, curface, offset;
+ float min[3], max[3], maxsize;
+ float scale;
+public:
+ DualConInputReader(const DualConInput *mesh, float _scale)
+ : input_mesh(mesh), scale(_scale)
+ {
+ reset();
+ }
+
+ void reset()
+ {
+ tottri = 0;
+ curface = 0;
+ offset = 0;
+ maxsize = 0;
+
+ /* initialize tottri */
+ for(int i = 0; i < input_mesh->totface; i++)
+ tottri += GET_FACE(input_mesh, i)[3] ? 2 : 1;
+
+ veccopy(min, input_mesh->min);
+ veccopy(max, input_mesh->max);
+
+ /* initialize maxsize */
+ for(int i = 0; i < 3; i++) {
+ float d = max[i] - min[i];
+ if(d > maxsize)
+ maxsize = d;
+ }
+
+ /* redo the bounds */
+ for(int i = 0; i < 3; i++)
+ {
+ min[i] = (max[i] + min[i]) / 2 - maxsize / 2;
+ max[i] = (max[i] + min[i]) / 2 + maxsize / 2;
+ }
+
+ for(int i = 0; i < 3; i++)
+ min[i] -= maxsize * (1 / scale - 1) / 2;
+ maxsize *= 1 / scale;
+ }
+
+ Triangle* getNextTriangle()
+ {
+ if(curface == input_mesh->totface)
+ return 0;
+
+ Triangle* t = new Triangle();
+
+ unsigned int *f = GET_FACE(input_mesh, curface);
+ if(offset == 0) {
+ veccopy(t->vt[0], GET_CO(input_mesh, f[0]));
+ veccopy(t->vt[1], GET_CO(input_mesh, f[1]));
+ veccopy(t->vt[2], GET_CO(input_mesh, f[2]));
+ }
+ else {
+ veccopy(t->vt[0], GET_CO(input_mesh, f[2]));
+ veccopy(t->vt[1], GET_CO(input_mesh, f[3]));
+ veccopy(t->vt[2], GET_CO(input_mesh, f[0]));
+ }
+
+ if(offset == 0 && f[3])
+ offset++;
+ else {
+ offset = 0;
+ curface++;
+ }
+
+ return t;
+ }
+
+ int getNextTriangle(int t[3])
+ {
+ if(curface == input_mesh->totface)
+ return 0;
+
+ unsigned int *f = GET_FACE(input_mesh, curface);
+ if(offset == 0) {
+ t[0] = f[0];
+ t[1] = f[1];
+ t[2] = f[2];
+ }
+ else {
+ t[0] = f[2];
+ t[1] = f[3];
+ t[2] = f[0];
+ }
+
+ if(offset == 0 && f[3])
+ offset++;
+ else {
+ offset = 0;
+ curface++;
+ }
+
+ return 1;
+ }
+
+ int getNumTriangles()
+ {
+ return tottri;
+ }
+
+ int getNumVertices()
+ {
+ return input_mesh->totco;
+ }
+
+ float getBoundingBox(float origin[3])
+ {
+ veccopy(origin, min);
+ return maxsize ;
+ }
+
+ /* output */
+ void getNextVertex(float v[3])
+ {
+ /* not used */
+ }
+
+ /* stubs */
+ void printInfo() {}
+ int getMemory() { return sizeof(DualConInputReader); }
+};
+
+void *dualcon(const DualConInput *input_mesh,
+ /* callbacks for output */
+ DualConAllocOutput alloc_output,
+ DualConAddVert add_vert,
+ DualConAddQuad add_quad,
+
+ DualConFlags flags,
+ DualConMode mode,
+ float threshold,
+ float hermite_num,
+ float scale,
+ int depth)
+{
+ DualConInputReader r(input_mesh, scale);
+ Octree o(&r, alloc_output, add_vert, add_quad,
+ flags, mode, depth, threshold, hermite_num);
+ o.scanConvert();
+ return o.getOutputMesh();
+}
diff --git a/intern/dualcon/intern/manifold_table.cpp b/intern/dualcon/intern/manifold_table.cpp
new file mode 100644
index 00000000000..cebf38907d8
--- /dev/null
+++ b/intern/dualcon/intern/manifold_table.cpp
@@ -0,0 +1,282 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "manifold_table.h"
+
+const ManifoldIndices manifold_table[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}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}}},
+ {3, {{1, 1}, {2, 2}, {3, 3}, {0, 0}, {3, 3}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {3, 3}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {2, 2}, {0, 0}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {3, {{1, 1}, {2, 2}, {0, 0}, {3, 3}, {1, 1}, {3, 3}, {0, 0}, {2, 2}, {1, 1}, {3, 3}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 2}, {2, 2}, {2, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {1, 2}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}}},
+ {3, {{1, 1}, {0, 0}, {2, 2}, {3, 3}, {1, 1}, {3, 3}, {2, 2}, {0, 0}, {1, 1}, {3, 3}, {0, 0}, {2, 2}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {2, 2}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {1, 1}}},
+ {2, {{0, 0}, {1, 2}, {1, 1}, {2, 2}, {2, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{2, 2}, {1, 1}, {0, 0}, {1, 1}, {2, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 2}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {3, {{1, 1}, {2, 2}, {3, 3}, {0, 0}, {1, 1}, {0, 0}, {3, 3}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {3, 3}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {2, 2}, {0, 0}, {2, 2}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {2, 2}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {2, 2}, {1, 1}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {1, 1}}},
+ {2, {{2, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {1, 2}, {1, 1}, {2, 2}}},
+ {3, {{0, 0}, {1, 1}, {2, 2}, {3, 3}, {0, 0}, {3, 3}, {2, 2}, {1, 1}, {0, 0}, {3, 3}, {1, 1}, {2, 2}}},
+ {4, {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 1}, {4, 4}, {3, 3}, {2, 2}, {1, 1}, {4, 4}, {2, 2}, {3, 3}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {1, 1}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {2, 1}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {1, 2}, {0, 0}, {2, 2}, {1, 1}}},
+ {2, {{1, 2}, {0, 0}, {0, 0}, {2, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {2, 2}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{2, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 2}, {2, 2}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {1, 1}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}}},
+ {2, {{1, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {2, 1}, {1, 1}, {1, 1}, {0, 0}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 2}, {0, 0}, {0, 0}, {2, 1}, {0, 0}, {1, 1}, {0, 0}, {2, 2}}},
+ {2, {{1, 1}, {1, 1}, {0, 0}, {2, 2}, {1, 2}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {2, 1}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 2}, {0, 0}, {0, 0}, {2, 1}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{1, 1}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}}},
+ {2, {{1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}}},
+ {3, {{0, 0}, {1, 1}, {2, 2}, {3, 3}, {2, 2}, {1, 1}, {0, 0}, {3, 3}, {1, 1}, {2, 2}, {0, 0}, {3, 3}}},
+ {2, {{1, 1}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {2, 2}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}}},
+ {3, {{1, 1}, {2, 2}, {0, 0}, {3, 3}, {0, 0}, {2, 2}, {1, 1}, {3, 3}, {2, 2}, {0, 0}, {1, 1}, {3, 3}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {3, {{1, 1}, {0, 0}, {2, 2}, {3, 3}, {2, 2}, {0, 0}, {1, 1}, {3, 3}, {0, 0}, {2, 2}, {1, 1}, {3, 3}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {1, 1}, {2, 2}}},
+ {4, {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {3, 3}, {2, 2}, {1, 1}, {4, 4}, {2, 2}, {3, 3}, {1, 1}, {4, 4}}},
+ {2, {{0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {1, 1}, {2, 2}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {2, 1}, {0, 0}, {0, 0}, {1, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {2, 1}, {0, 0}, {0, 0}, {1, 2}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{1, 1}, {2, 2}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {2, 2}}},
+ {2, {{0, 0}, {1, 2}, {2, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {2, 2}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {2, 2}}},
+ {2, {{0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {2, 2}}},
+ {2, {{1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 2}, {2, 2}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {2, 2}}},
+ {1, {{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}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {2, {{2, 2}, {1, 1}, {1, 2}, {0, 0}, {0, 0}, {2, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 1}, {0, 0}, {1, 2}, {2, 2}, {0, 0}, {1, 1}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {1, 2}, {2, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {1, 1}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{0, 0}, {2, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 2}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}}},
+ {2, {{2, 2}, {1, 2}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 1}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {2, 2}}},
+ {2, {{2, 2}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 2}, {0, 0}, {0, 0}, {2, 1}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {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}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {2, 2}, {1, 1}, {1, 1}, {2, 2}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {2, {{1, 2}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 2}, {0, 0}, {2, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {1, 2}, {2, 2}, {1, 1}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {2, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 2}, {2, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {0, 0}, {2, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {1, 2}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {2, 1}, {2, 2}, {1, 2}, {1, 1}, {0, 0}}},
+ {2, {{0, 0}, {1, 1}, {2, 2}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {1, 2}, {0, 0}, {0, 0}, {2, 1}, {2, 2}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {2, 2}, {2, 2}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{2, 2}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {1, 2}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {2, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {1, 2}, {0, 0}, {0, 0}, {2, 1}, {0, 0}, {1, 1}, {1, 1}, {2, 2}, {0, 0}}},
+ {2, {{0, 0}, {0, 0}, {0, 0}, {2, 1}, {2, 2}, {1, 1}, {1, 2}, {0, 0}, {1, 1}, {2, 2}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {0, 0}, {2, 2}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {0, 0}, {1, 1}, {2, 2}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {0, 0}, {2, 2}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}, {0, 0}, {2, 1}, {1, 2}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {2, {{1, 1}, {2, 2}, {0, 0}, {0, 0}, {0, 0}, {1, 2}, {2, 1}, {0, 0}, {1, 1}, {0, 0}, {2, 2}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{1, 2}, {0, 0}, {0, 0}, {2, 1}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {2, 2}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {2, {{0, 0}, {1, 2}, {2, 1}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}, {2, 2}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {0, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}}},
+ {1, {{1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {0, 0}, {0, 0}, {0, 0}, {1, 1}, {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}}}
+};
diff --git a/intern/dualcon/intern/manifold_table.h b/intern/dualcon/intern/manifold_table.h
new file mode 100644
index 00000000000..1827623f5ff
--- /dev/null
+++ b/intern/dualcon/intern/manifold_table.h
@@ -0,0 +1,33 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef MANIFOLD_TABLE_H
+#define MANIFOLD_TABLE_H
+
+typedef struct {
+ int comps;
+ int pairs[12][2];
+} ManifoldIndices;
+
+extern const ManifoldIndices manifold_table[256];
+
+#endif
diff --git a/intern/dualcon/intern/marching_cubes_table.cpp b/intern/dualcon/intern/marching_cubes_table.cpp
new file mode 100644
index 00000000000..4c78108deb5
--- /dev/null
+++ b/intern/dualcon/intern/marching_cubes_table.cpp
@@ -0,0 +1,554 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "marching_cubes_table.h"
+
+/* number of triangles in each configuration */
+const int marching_cubes_numtri[TOTCONF] = {
+ 0, 1, 1, 2, 1, 2, 4, 3, 1, 4, 2, 3, 2, 3, 3, 2, 1, 2, 4, 3, 4, 3, 5, 4,
+ 6, 5, 5, 4, 5, 4, 4, 3, 1, 4, 2, 3, 6, 5, 5, 4, 4, 5, 3, 4, 5, 4, 4, 3,
+ 2, 3, 3, 2, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2, 1, 4, 6, 5, 2, 3, 5, 4,
+ 4, 5, 5, 4, 3, 4, 4, 3, 2, 3, 5, 4, 3, 2, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
+ 4, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2, 3, 4, 4, 3, 4, 3, 3, 2,
+ 4, 3, 3, 2, 3, 2, 2, 1, 1, 6, 4, 5, 4, 5, 5, 4, 2, 5, 3, 4, 3, 4, 4, 3,
+ 4, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2, 2, 5, 3, 4, 5, 4, 4, 3,
+ 3, 4, 2, 3, 4, 3, 3, 2, 3, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
+ 2, 5, 5, 4, 3, 4, 4, 3, 3, 4, 4, 3, 2, 3, 3, 2, 3, 4, 4, 3, 4, 3, 3, 2,
+ 4, 3, 3, 2, 3, 2, 2, 1, 3, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
+ 2, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0
+};
+
+/* table of triangles in each configuration */
+const int marching_cubes_tris[TOTCONF][MAX_TRIS][3] = {
+ {{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}},
+ {{4,0,8}, {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}},
+ {{8,1,5}, {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}},
+ {{4,0,1}, {4,1,5}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,9,2}, {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,8,9}, {0,9,2}, {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,5,9}, {1,9,2}, {1,2,4}, {1,4,8}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,1,5}, {0,5,9}, {0,9,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,3,9}, {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,8,5}, {0,5,3}, {0,3,9}, {0,9,4}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,1,3}, {8,3,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,0,1}, {4,1,3}, {4,3,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,5,3}, {4,3,2}, {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,8,5}, {0,5,3}, {0,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,1}, {4,1,3}, {4,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,1,3}, {0,3,2}, {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,6,10}, {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}},
+ {{8,4,6}, {8,6,10}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,10,1}, {6,1,5}, {6,5,8}, {6,8,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,6,10}, {4,10,1}, {4,1,5}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,4}, {10,4,9}, {10,9,2}, {10,2,6}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,10,8}, {6,8,9}, {6,9,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {6,10,1}, {6,1,5}, {6,5,9}, {6,9,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,10,1}, {6,1,5}, {6,5,9}, {6,9,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,5}, {0,6,9}, {9,5,0}, {6,10,3}, {5,3,10},
+ {3,9,6}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,3}, {9,4,6}, {6,10,3}, {6,3,9},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,3}, {9,8,0}, {9,0,6}, {6,10,3}, {6,3,9},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,6,10}, {4,10,1}, {4,1,3}, {4,3,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,4,5}, {3,2,6}, {3,6,10}, {10,0,5}, {10,5,3},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,10,8}, {6,8,5}, {6,5,3}, {6,3,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {6,10,1}, {6,1,3}, {6,3,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,10,1}, {6,1,3}, {6,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,7,1}, {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}},
+ {{4,0,10}, {4,10,7}, {4,7,1}, {4,1,8}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,7}, {8,7,5}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,0,10}, {4,10,7}, {4,7,5}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,2,4}, {10,4,1}, {7,2,10}, {1,9,7}, {1,4,9},
+ {9,2,7}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,8,9}, {2,0,10}, {2,10,7}, {7,1,9}, {7,9,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {7,5,9}, {7,9,2}, {2,4,10}, {2,10,7},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,7}, {0,7,5}, {0,5,9}, {0,9,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,7,3}, {10,3,9}, {10,9,5}, {10,5,1}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,0,10}, {4,10,7}, {4,7,3}, {4,3,9},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,7}, {8,7,3}, {8,3,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,0,10}, {4,10,7}, {4,7,3}, {4,3,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,5,1}, {4,1,10}, {7,3,2}, {2,4,10}, {2,10,7},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {0,10,7}, {0,7,3}, {0,3,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,7}, {4,7,3}, {4,3,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,7}, {0,7,3}, {0,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,6,7}, {0,7,1}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,4,6}, {8,6,7}, {8,7,1}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,6}, {8,6,7}, {8,7,5}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,6,7}, {4,7,5}, {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,0,4}, {1,4,9}, {2,6,7}, {7,1,9}, {7,9,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,7,1}, {6,1,8}, {6,8,9}, {6,9,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {6,7,5}, {6,5,9}, {6,9,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,7,5}, {6,5,9}, {6,9,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,0}, {6,7,3}, {6,3,9}, {9,5,0}, {9,0,6},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,6,7}, {4,7,3}, {4,3,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,6}, {8,6,7}, {8,7,3}, {8,3,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,6,7}, {4,7,3}, {4,3,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,4,5}, {0,5,1}, {6,7,3}, {6,3,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {6,7,3}, {6,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {6,7,3}, {6,3,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,7,3}, {6,3,2}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,2,11}, {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}},
+ {{8,4,2}, {8,2,11}, {8,11,6}, {8,6,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,1,6}, {6,1,11}, {11,1,5}, {2,11,5}, {2,5,8},
+ {6,2,8}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {5,4,2}, {5,2,11}, {11,6,1}, {11,1,5},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,9}, {6,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,8}, {6,8,9}, {6,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,8}, {6,8,1}, {5,9,11}, {11,6,1}, {11,1,5},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,5}, {6,5,9}, {6,9,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,2,9}, {6,9,5}, {6,5,3}, {6,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {6,0,8}, {6,8,5}, {6,5,3}, {6,3,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{2,9,8}, {1,3,11}, {1,11,6}, {6,2,8}, {6,8,1},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {6,0,1}, {6,1,3}, {6,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,5}, {6,5,3}, {6,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,8}, {6,8,5}, {6,5,3}, {6,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,8}, {6,8,1}, {6,1,3}, {6,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,3}, {6,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,2}, {10,2,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,4}, {10,4,2}, {10,2,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,2}, {11,10,1}, {11,1,5}, {5,8,2}, {5,2,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,5}, {10,5,4}, {10,4,2}, {10,2,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,4}, {10,4,9}, {10,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,9}, {10,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,5}, {10,5,9}, {10,9,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,5}, {10,5,9}, {10,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,2,9}, {0,9,5}, {3,11,10}, {10,0,5}, {10,5,3},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {10,8,5}, {10,5,3}, {10,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,2}, {8,2,9}, {10,1,3}, {10,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {10,1,3}, {10,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,4}, {10,4,5}, {10,5,3}, {10,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,3}, {10,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,3}, {10,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,3}, {10,3,11}, {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,10,6}, {1,6,2}, {1,2,11}, {1,11,7}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {7,1,8}, {7,8,4}, {7,4,2}, {7,2,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,6}, {8,6,2}, {11,7,5}, {5,8,2}, {5,2,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {7,5,4}, {7,4,2}, {7,2,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,6,4}, {9,11,7}, {9,7,1}, {1,10,4}, {1,4,9},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {7,1,8}, {7,8,9}, {7,9,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,6}, {7,5,9}, {7,9,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {7,5,9}, {7,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,10}, {5,10,6}, {5,6,2}, {5,2,9}, {7,3,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {8,5,1}, {4,2,9}, {7,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,6}, {8,6,2}, {8,2,9}, {7,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {4,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,6,4}, {10,4,5}, {10,5,1}, {7,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {8,5,1}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,6}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,1,0}, {7,0,2}, {7,2,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,1,8}, {7,8,4}, {7,4,2}, {7,2,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,5,8}, {7,8,0}, {7,0,2}, {7,2,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,5,4}, {7,4,2}, {7,2,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,1,0}, {7,0,4}, {7,4,9}, {7,9,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,1,8}, {7,8,9}, {7,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {7,5,9}, {7,9,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,5,9}, {7,9,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,0}, {5,0,2}, {5,2,9}, {7,3,11}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,2}, {8,2,9}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {7,3,11}, {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,4,5}, {0,5,1}, {7,3,11}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {7,3,11}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,3,11}, {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}},
+ {{7,11,3}, {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}},
+ {{7,11,0}, {7,0,8}, {0,11,4}, {8,3,7}, {11,3,4},
+ {3,8,4}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,1,7}, {8,7,11}, {8,11,3}, {8,3,5}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,1,7}, {0,7,11}, {3,5,4}, {4,0,11}, {4,11,3},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,9,3}, {4,3,7}, {4,7,11}, {4,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,9,3}, {8,3,7}, {11,2,0}, {0,8,7}, {0,7,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {4,8,1}, {4,1,7}, {4,7,11}, {4,11,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {0,1,7}, {0,7,11}, {0,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,7,11}, {5,11,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,7}, {11,9,4}, {11,4,0}, {0,8,7}, {0,7,11},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,1,7}, {8,7,11}, {8,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,0,1}, {4,1,7}, {4,7,11}, {4,11,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,5,7}, {4,7,11}, {4,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,8,5}, {0,5,7}, {0,7,11}, {0,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,1}, {4,1,7}, {4,7,11}, {4,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,1,7}, {0,7,11}, {0,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,6,11}, {0,11,3}, {0,3,7}, {0,7,10}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,8}, {4,6,11}, {4,11,3}, {3,7,8}, {3,8,4},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,8,0}, {5,0,6}, {5,6,11}, {5,11,3},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,4,6}, {5,6,11}, {5,11,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,0}, {7,0,4}, {7,4,9}, {7,9,3}, {6,11,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,8}, {7,8,9}, {7,9,3}, {6,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,7}, {5,9,3}, {6,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,7,10}, {5,10,0}, {6,11,9}, {9,5,0}, {9,0,6},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,7}, {4,6,11}, {4,11,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {8,0,6}, {8,6,11}, {8,11,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {4,6,11}, {4,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,4}, {10,4,5}, {10,5,7}, {6,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,7}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,7}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {6,11,2}, {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,10,11}, {1,11,3}, {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,10,11}, {3,1,8}, {3,8,4}, {4,0,11}, {4,11,3},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,8,10}, {5,10,11}, {5,11,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,4,0}, {5,0,10}, {5,10,11}, {5,11,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{9,3,1}, {10,11,2}, {10,2,4}, {4,9,1}, {4,1,10},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,8,9}, {1,9,3}, {0,10,11}, {0,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {4,8,10}, {4,10,11}, {4,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {0,10,11}, {0,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,10}, {5,10,11}, {5,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,0,10}, {4,10,11}, {4,11,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,11}, {8,11,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,0,10}, {4,10,11}, {4,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,5,1}, {4,1,10}, {4,10,11}, {4,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {0,10,11}, {0,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,11}, {4,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,11}, {0,11,2}, {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,0,6}, {1,6,11}, {1,11,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,8,4}, {1,4,6}, {1,6,11}, {1,11,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,8,0}, {5,0,6}, {5,6,11}, {5,11,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,4,6}, {5,6,11}, {5,11,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,0,4}, {1,4,9}, {1,9,3}, {6,11,2}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,8,9}, {1,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {5,9,3}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,0}, {5,0,6}, {5,6,11}, {5,11,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,6,11}, {4,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,6}, {8,6,11}, {8,11,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,6,11}, {4,11,9}, {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,4,5}, {0,5,1}, {6,11,2}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {6,11,2}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,11,2}, {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}},
+ {{7,6,2}, {7,2,3}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,6,0}, {7,0,8}, {4,2,3}, {3,7,8}, {3,8,4},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,7,6}, {2,3,5}, {2,5,8}, {8,1,6}, {8,6,2},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,7}, {5,4,2}, {5,2,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,6,4}, {7,4,9}, {7,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,6,0}, {7,0,8}, {7,8,9}, {7,9,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,8}, {6,8,1}, {6,1,7}, {5,9,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,7}, {5,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,7,6}, {5,6,2}, {5,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,8}, {6,8,5}, {6,5,7}, {4,2,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,1,7}, {8,7,6}, {8,6,2}, {8,2,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,7}, {4,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,5}, {6,5,7}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,8}, {6,8,5}, {6,5,7}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,4,8}, {6,8,1}, {6,1,7}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{6,0,1}, {6,1,7}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,0}, {7,0,2}, {7,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,8}, {7,8,4}, {7,4,2}, {7,2,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,8,0}, {5,0,2}, {5,2,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,4,2}, {5,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,0}, {7,0,4}, {7,4,9}, {7,9,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{7,10,8}, {7,8,9}, {7,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,7}, {5,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,7,10}, {5,10,0}, {5,0,2}, {5,2,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,7}, {4,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {8,0,2}, {8,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,0,4}, {10,4,5}, {10,5,7}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,8,5}, {10,5,7}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {10,1,7}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,1,7}, {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,10,6}, {1,6,2}, {1,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {1,8,4}, {1,4,2}, {1,2,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,8,10}, {5,10,6}, {5,6,2}, {5,2,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {5,4,2}, {5,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,10,6}, {1,6,4}, {1,4,9}, {1,9,3}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {1,8,9}, {1,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,6}, {5,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,1,10}, {5,10,6}, {5,6,2}, {5,2,9}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {8,5,1}, {4,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,10,6}, {8,6,2}, {8,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{10,6,4}, {10,4,5}, {10,5,1}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,10,6}, {8,5,1}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,10}, {4,10,6}, {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,10,6}, {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,0,2}, {1,2,3}, {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,8,4}, {1,4,2}, {1,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,8,0}, {5,0,2}, {5,2,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,4,2}, {5,2,3}, {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,0,4}, {1,4,9}, {1,9,3}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{1,8,9}, {1,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,8,0}, {5,9,3}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{5,9,3}, {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}},
+ {{5,1,0}, {5,0,2}, {5,2,9}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {4,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,0,2}, {8,2,9}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{4,2,9}, {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,4,5}, {0,5,1}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{8,5,1}, {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}},
+ {{4,8,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}},
+ {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}}
+};
diff --git a/intern/dualcon/intern/marching_cubes_table.h b/intern/dualcon/intern/marching_cubes_table.h
new file mode 100644
index 00000000000..e45e1c60924
--- /dev/null
+++ b/intern/dualcon/intern/marching_cubes_table.h
@@ -0,0 +1,38 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef MARCHING_CUBES_TABLE_H
+#define MARCHING_CUBES_TABLE_H
+
+/* number of configurations */
+#define TOTCONF 256
+
+/* maximum number of triangles per configuration */
+#define MAX_TRIS 10
+
+/* number of triangles in each configuration */
+extern const int marching_cubes_numtri[TOTCONF];
+
+/* table of triangles in each configuration */
+extern const int marching_cubes_tris[TOTCONF][MAX_TRIS][3];
+
+#endif
diff --git a/intern/dualcon/intern/octree.cpp b/intern/dualcon/intern/octree.cpp
new file mode 100644
index 00000000000..90dbf5376a2
--- /dev/null
+++ b/intern/dualcon/intern/octree.cpp
@@ -0,0 +1,4311 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "octree.h"
+#include <Eigen/Dense>
+#include <limits>
+#include <time.h>
+
+/**
+ * Implementations of Octree member functions.
+ *
+ * @author Tao Ju
+ */
+
+/* set to non-zero value to enable debugging output */
+#define DC_DEBUG 0
+
+#if DC_DEBUG
+/* enable debug printfs */
+#define dc_printf printf
+#else
+/* disable debug printfs */
+#define dc_printf(...) do {} while(0)
+#endif
+
+Octree::Octree( ModelReader* mr,
+ DualConAllocOutput alloc_output_func,
+ DualConAddVert add_vert_func,
+ DualConAddQuad add_quad_func,
+ DualConFlags flags, DualConMode dualcon_mode, int depth,
+ float threshold, float sharpness )
+ : use_flood_fill(flags & DUALCON_FLOOD_FILL),
+ /* note on `use_manifold':
+
+ After playing around with this option, the only case I could
+ find where this option gives different results is on
+ relatively thin corners. Sometimes along these corners two
+ vertices from seperate sides will be placed in the same
+ position, so hole gets filled with a 5-sided face, where two
+ of those vertices are in the same 3D location. If
+ `use_manifold' is disabled, then the modifier doesn't
+ generate two separate vertices so the results end up as all
+ quads.
+
+ Since the results are just as good with all quads, there
+ doesn't seem any reason to allow this to be toggled in
+ Blender. -nicholasbishop
+ */
+ use_manifold(false),
+ hermite_num(sharpness),
+ mode(dualcon_mode),
+ alloc_output(alloc_output_func),
+ add_vert(add_vert_func),
+ add_quad(add_quad_func)
+{
+ this->thresh = threshold ;
+ this->reader = mr ;
+ this->dimen = 1 << GRID_DIMENSION ;
+ this->range = reader->getBoundingBox( this->origin ) ;
+ this->nodeCount = this->nodeSpace = 0;
+ this->maxDepth = depth ;
+ this->mindimen = ( dimen >> maxDepth ) ;
+ this->minshift = ( GRID_DIMENSION - maxDepth ) ;
+ this->buildTable( ) ;
+
+ flood_bytes = use_flood_fill ? FLOOD_FILL_BYTES : 0;
+ leaf_extra_bytes = flood_bytes + CINDY_BYTES;
+
+#ifdef USE_HERMIT
+ leaf_node_bytes = 7 + leaf_extra_bytes;
+#else
+ leaf_node_bytes = 3 + leaf_extra_bytes;
+#endif
+
+#ifdef QIANYI
+ dc_printf("Origin: (%f %f %f), Dimension: %f\n", origin[0], origin[1], origin[2], range) ;
+#endif
+
+ this->maxTrianglePerCell = 0 ;
+
+ // Initialize memory
+#ifdef IN_VERBOSE_MODE
+ dc_printf("Range: %f origin: %f, %f,%f \n", range, origin[0], origin[1], origin[2] ) ;
+ dc_printf("Initialize memory...\n") ;
+#endif
+ initMemory( ) ;
+ this->root = createInternal( 0 ) ;
+
+ // Read MC table
+#ifdef IN_VERBOSE_MODE
+ dc_printf("Reading contour table...\n") ;
+#endif
+ this->cubes = new Cubes();
+
+}
+
+Octree::~Octree( )
+{
+ freeMemory( ) ;
+}
+
+void Octree::scanConvert()
+{
+ // Scan triangles
+#if DC_DEBUG
+ clock_t start, finish ;
+ start = clock( ) ;
+#endif
+
+ this->addTrian( ) ;
+ this->resetMinimalEdges( ) ;
+ this->preparePrimalEdgesMask( this->root ) ;
+
+#if DC_DEBUG
+ finish = clock( ) ;
+ dc_printf("Time taken: %f seconds \n",
+ (double)(finish - start) / CLOCKS_PER_SEC ) ;
+#endif
+
+ // Generate signs
+ // Find holes
+#if DC_DEBUG
+ dc_printf("Patching...\n") ;
+ start = clock( ) ;
+#endif
+ this->trace( ) ;
+#if DC_DEBUG
+ finish = clock( ) ;
+ dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC ) ;
+#ifdef IN_VERBOSE_MODE
+ dc_printf("Holes: %d Average Length: %f Max Length: %d \n", numRings, (float)totRingLengths / (float) numRings, maxRingLength ) ;
+#endif
+#endif
+
+ // Check again
+ int tnumRings = numRings ;
+ this->trace( ) ;
+#ifdef IN_VERBOSE_MODE
+ dc_printf("Holes after patching: %d \n", numRings) ;
+#endif
+ numRings = tnumRings ;
+
+#if DC_DEBUG
+ dc_printf("Building signs...\n") ;
+ start = clock( ) ;
+#endif
+ this->buildSigns( ) ;
+#if DC_DEBUG
+ finish = clock( ) ;
+ dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC ) ;
+#endif
+
+ if(use_flood_fill) {
+ /*
+ start = clock( ) ;
+ this->floodFill( ) ;
+ // Check again
+ tnumRings = numRings ;
+ this->trace( ) ;
+ dc_printf("Holes after filling: %d \n", numRings) ;
+ numRings = tnumRings ;
+ this->buildSigns( ) ;
+ finish = clock( ) ;
+ dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC ) ;
+ */
+#if DC_DEBUG
+ start = clock( ) ;
+ dc_printf("Removing components...\n");
+#endif
+ this->floodFill( ) ;
+ this->buildSigns( ) ;
+ // dc_printf("Checking...\n");
+ // this->floodFill( ) ;
+#if DC_DEBUG
+ finish = clock( ) ;
+ dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC ) ;
+#endif
+ }
+
+ // Output
+#ifdef OUTPUT_REPAIRED
+#if DC_DEBUG
+ start = clock( ) ;
+#endif
+ writeOut();
+#if DC_DEBUG
+ finish = clock( ) ;
+#endif
+ // dc_printf("Time taken: %f seconds \n", (double)(finish - start) / CLOCKS_PER_SEC ) ;
+#ifdef CINDY
+ this->writeTags( "tags.txt" ) ;
+ dc_printf("Tags output to tags.txt\n") ;
+#endif
+
+#endif
+
+ // Print info
+#ifdef IN_VERBOSE_MODE
+ printMemUsage( ) ;
+#endif
+}
+
+#if 0
+void Octree::writeOut( char* fname )
+{
+ dc_printf( "\n" ) ;
+ if ( strstr( fname, ".ply" ) != NULL )
+ {
+ dc_printf("Writing PLY file format.\n") ;
+ this->outType = 1 ;
+ writePLY( fname ) ;
+ }
+ else if ( strstr( fname, ".off" ) != NULL )
+ {
+ dc_printf("Writing OFF file format.\n") ;
+ this->outType = 0 ;
+ writeOFF( fname ) ;
+ }
+ else if ( strstr( fname, ".sof" ) != NULL )
+ {
+ dc_printf("Writing Signed Octree File format.\n") ;
+ this->outType = 2 ;
+ writeOctree( fname ) ;
+ }
+ else if ( strstr( fname, ".dcf" ) != NULL )
+ {
+#ifdef USE_HERMIT
+ dc_printf("Writing Dual Contouring File format.\n") ;
+ this->outType = 3 ;
+ writeDCF( fname ) ;
+#else
+ dc_printf("Can not write Dual Contouring File format in non-DC mode.\n") ;
+#endif
+ }
+#ifdef USE_HERMIT
+ else if ( strstr( fname, ".sog" ) != NULL )
+ {
+ dc_printf("Writing signed octree with geometry.\n") ;
+ this->outType = 4 ;
+ writeOctreeGeom( fname ) ;
+ }
+#endif
+ /*
+ else if ( strstr( fname, ".sof" ) != NULL )
+ {
+ dc_printf("Writing SOF file format.\n") ;
+ this->outType = 2 ;
+ writeOctree( fname ) ;
+ }
+ */
+ else
+ {
+ dc_printf("Unknown output format.\n") ;
+ }
+
+}
+#endif
+
+void Octree::initMemory( )
+{
+#ifdef USE_HERMIT
+ const int leaf_node_bytes = 7;
+#else
+ const int leaf_node_bytes = 3;
+#endif
+
+ if(use_flood_fill) {
+ const int bytes = leaf_node_bytes + CINDY_BYTES + FLOOD_FILL_BYTES;
+ this->leafalloc[ 0 ] = new MemoryAllocator< bytes > ( ) ;
+ this->leafalloc[ 1 ] = new MemoryAllocator< bytes + EDGE_BYTES > ( ) ;
+ this->leafalloc[ 2 ] = new MemoryAllocator< bytes + EDGE_BYTES * 2 > ( ) ;
+ this->leafalloc[ 3 ] = new MemoryAllocator< bytes + EDGE_BYTES * 3 > ( ) ;
+ }
+ else {
+ const int bytes = leaf_node_bytes + CINDY_BYTES;
+ this->leafalloc[ 0 ] = new MemoryAllocator< bytes > ( ) ;
+ this->leafalloc[ 1 ] = new MemoryAllocator< bytes + EDGE_BYTES > ( ) ;
+ this->leafalloc[ 2 ] = new MemoryAllocator< bytes + EDGE_BYTES * 2 > ( ) ;
+ this->leafalloc[ 3 ] = new MemoryAllocator< bytes + EDGE_BYTES * 3 > ( ) ;
+ }
+
+ this->alloc[ 0 ] = new MemoryAllocator< INTERNAL_NODE_BYTES > ( ) ;
+ this->alloc[ 1 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES > ( ) ;
+ this->alloc[ 2 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*2 > ( ) ;
+ this->alloc[ 3 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*3 > ( ) ;
+ this->alloc[ 4 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*4 > ( ) ;
+ this->alloc[ 5 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*5 > ( ) ;
+ this->alloc[ 6 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*6 > ( ) ;
+ this->alloc[ 7 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*7 > ( ) ;
+ this->alloc[ 8 ] = new MemoryAllocator< INTERNAL_NODE_BYTES + POINTER_BYTES*8 > ( ) ;
+}
+
+void Octree::freeMemory( )
+{
+ for ( int i = 0 ; i < 9 ; i ++ )
+ {
+ alloc[i]->destroy() ;
+ delete alloc[i] ;
+ }
+
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ leafalloc[i]->destroy() ;
+ delete leafalloc[i] ;
+ }
+}
+
+void Octree::printMemUsage( )
+{
+ int totalbytes = 0 ;
+ dc_printf("********* Internal nodes: \n") ;
+ for ( int i = 0 ; i < 9 ; i ++ )
+ {
+ this->alloc[ i ]->printInfo() ;
+
+ totalbytes += alloc[i]->getAll( ) * alloc[i]->getBytes() ;
+ }
+ dc_printf("********* Leaf nodes: \n") ;
+ int totalLeafs = 0 ;
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ this->leafalloc[ i ]->printInfo() ;
+
+ totalbytes += leafalloc[i]->getAll( ) * leafalloc[i]->getBytes() ;
+ totalLeafs += leafalloc[i]->getAllocated() ;
+ }
+
+ dc_printf("Total allocated bytes on disk: %d \n", totalbytes) ;
+ dc_printf("Total leaf nodes: %d\n", totalLeafs ) ;
+}
+
+void Octree::resetMinimalEdges( )
+{
+ this->cellProcParity( this->root, 0, maxDepth ) ;
+}
+
+void Octree::writeModel( char* fname )
+{
+ reader->reset() ;
+
+ int nFace = reader->getNumTriangles() ;
+ Triangle* trian ;
+ // int unitcount = 10000;
+ int count = 0 ;
+ int nVert = nFace * 3 ;
+ FILE* modelfout = fopen( "model.off", "w" ) ;
+ fprintf( modelfout, "OFF\n" ) ;
+ fprintf( modelfout, "%d %d 0\n", nVert, nFace ) ;
+
+ //int total = this->reader->getNumTriangles() ;
+ dc_printf( "Start writing model to OFF...\n" ) ;
+ srand(0) ;
+ while ( ( trian = reader->getNextTriangle() ) != NULL )
+ {
+ // Drop polygons
+ {
+ int i, j ;
+
+ // Blow up the triangle
+ float mid[3] = {0, 0, 0} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ trian->vt[i][j] = dimen * ( trian->vt[i][j] - origin[j] ) / range ;
+
+ mid[j] += trian->vt[i][j] / 3 ;
+ }
+
+ // Generate projections
+ // LONG cube[2][3] = { { 0, 0, 0 }, { dimen, dimen, dimen } } ;
+ int trig[3][3] ;
+
+ // Blowing up the triangle to the grid
+ for ( i = 0 ; i < 3 ; i ++ )
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ trig[i][j] = (int) (trian->vt[i][j]) ;
+ // Perturb end points, if set so
+ }
+
+
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ fprintf( modelfout, "%f %f %f\n",
+ (float)(((double) trig[i][0] / dimen) * range + origin[0]) ,
+ (float)(((double) trig[i][1] / dimen) * range + origin[1]) ,
+ (float)(((double) trig[i][2] / dimen) * range + origin[2]) ) ;
+ }
+ }
+ delete trian ;
+
+ count ++ ;
+
+ }
+
+ for ( int i = 0 ; i < nFace ; i ++ )
+ {
+ fprintf( modelfout, "3 %d %d %d\n", 3 * i + 2, 3 * i + 1, 3 * i ) ;
+ }
+
+ fclose( modelfout ) ;
+
+}
+
+#ifdef CINDY
+void Octree::writeTags( char* fname )
+{
+ FILE* fout = fopen( fname, "w" ) ;
+
+ clearCindyBits( root, maxDepth ) ;
+ readVertices() ;
+ outputTags( root, maxDepth, fout ) ;
+
+ fclose ( fout ) ;
+}
+
+void Octree::readVertices( )
+{
+ int total = this->reader->getNumVertices() ;
+ reader->reset() ;
+ float v[3] ;
+ int st[3] = {0,0,0};
+ int unitcount = 1000 ;
+ dc_printf( "\nRead in original %d vertices...\n", total ) ;
+
+ for ( int i = 0 ; i < total ; i ++ )
+ {
+ reader->getNextVertex( v ) ;
+ // Blowing up the triangle to the grid
+ float mid[3] = {0, 0, 0} ;
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ v[j] = dimen * ( v[j] - origin[j] ) / range ;
+ }
+
+// dc_printf("vertex: %f %f %f, dimen: %d\n", v[0], v[1], v[2], dimen ) ;
+ readVertex ( root, st, dimen, maxDepth, v, i ) ;
+
+
+ if ( i % unitcount == 0 )
+ {
+ putchar ( 13 ) ;
+
+ switch ( ( i / unitcount ) % 4 )
+ {
+ case 0 : dc_printf("-");
+ break ;
+ case 1 : dc_printf("/") ;
+ break ;
+ case 2 : dc_printf("|");
+ break ;
+ case 3 : dc_printf("\\") ;
+ break ;
+ }
+
+ float percent = (float) i / total ;
+ /*
+ int totbars = 50 ;
+ int bars = (int)( percent * totbars ) ;
+ for ( int i = 0 ; i < bars ; i ++ )
+ {
+ putchar( 219 ) ;
+ }
+ for ( i = bars ; i < totbars ; i ++ )
+ {
+ putchar( 176 ) ;
+ }
+ */
+
+ dc_printf(" %d vertices: ", i ) ;
+ dc_printf( " %f%% complete.", 100 * percent ) ;
+ }
+
+ }
+ putchar ( 13 ) ;
+ dc_printf(" \n");
+}
+
+void Octree::readVertex( UCHAR* node, int st[3], int len, int height, float v[3], int index )
+{
+ int nst[3] ;
+ nst[0] = ( (int) v[0] / mindimen ) * mindimen ;
+ nst[1] = ( (int) v[1] / mindimen ) * mindimen ;
+ nst[2] = ( (int) v[2] / mindimen ) * mindimen ;
+
+ UCHAR* cell = this->locateLeafCheck( nst ) ;
+ if ( cell == NULL )
+ {
+ dc_printf("Cell %d %d %d is not found!\n", nst[0]/ mindimen, nst[1]/ mindimen, nst[2]/ mindimen) ;
+ return ;
+ }
+
+ setOriginalIndex( cell, index ) ;
+
+
+ /*
+ int i ;
+ if ( height == 0 )
+ {
+ // Leaf cell, assign index
+ dc_printf("Setting: %d\n", index ) ;
+ setOriginalIndex( node, index ) ;
+ }
+ else
+ {
+ len >>= 1 ;
+ // Internal cell, check and recur
+ int x = ( v[0] > st[0] + len ) ? 1 : 0 ;
+ int y = ( v[1] > st[1] + len ) ? 1 : 0 ;
+ int z = ( v[2] > st[2] + len ) ? 1 : 0 ;
+ int child = x * 4 + y * 2 + z ;
+
+ int count = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( i == child && hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ dc_printf("Depth: %d -- child %d vertex: %f %f %f in %f %f %f\n", height - 1, child, v[0]/mindimen, v[1]/mindimen, v[2]/mindimen,
+ nst[0]/mindimen, nst[1]/mindimen, nst[2]/mindimen, len/mindimen ) ;
+
+ readVertex( getChild( node, count ), nst, len, height - 1, v, index ) ;
+ count ++ ;
+ }
+ }
+ }
+ */
+}
+
+void Octree::outputTags( UCHAR* node, int height, FILE* fout )
+{
+ int i ;
+
+ if ( height == 0 )
+ {
+ // Leaf cell, generate
+ int smask = getSignMask( node ) ;
+
+ if(use_manifold) {
+ int comps = manifold_table[ smask ].comps ;
+ if ( comps != 1 )
+ {
+ return ;
+ }
+ }
+ else
+ {
+ if ( smask == 0 || smask == 255 )
+ {
+ return ;
+ }
+ }
+
+ int rindex = getMinimizerIndex( node ) ;
+ int oindex = getOriginalIndex( node ) ;
+
+ if ( oindex >= 0 )
+ {
+ fprintf( fout, "%d: %d\n", rindex, oindex ) ;
+ }
+
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ outputTags( getChild( node, count ), height - 1, fout ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+
+void Octree::clearCindyBits( UCHAR* node, int height )
+{
+ int i;
+
+ if ( height == 0 )
+ {
+ // Leaf cell,
+ {
+ setOriginalIndex( node, - 1 ) ;
+ }
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ clearCindyBits( getChild( node, count ), height - 1 ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+#endif
+
+void Octree::addTrian( )
+{
+ Triangle* trian ;
+ int count = 0 ;
+
+#if DC_DEBUG
+ int total = this->reader->getNumTriangles() ;
+ int unitcount = 1000 ;
+ dc_printf( "\nScan converting to depth %d...\n", maxDepth ) ;
+#endif
+
+ srand(0) ;
+
+ while ( ( trian = reader->getNextTriangle() ) != NULL )
+ {
+ // Drop triangles
+ {
+ addTrian ( trian, count ) ;
+ }
+ delete trian ;
+
+ count ++ ;
+
+#if DC_DEBUG
+ if ( count % unitcount == 0 )
+ {
+ putchar ( 13 ) ;
+
+ switch ( ( count / unitcount ) % 4 )
+ {
+ case 0 : dc_printf("-");
+ break ;
+ case 1 : dc_printf("/") ;
+ break ;
+ case 2 : dc_printf("|");
+ break ;
+ case 3 : dc_printf("\\") ;
+ break ;
+ }
+
+ float percent = (float) count / total ;
+
+ /*
+ int totbars = 50 ;
+ int bars = (int)( percent * totbars ) ;
+ for ( int i = 0 ; i < bars ; i ++ )
+ {
+ putchar( 219 ) ;
+ }
+ for ( i = bars ; i < totbars ; i ++ )
+ {
+ putchar( 176 ) ;
+ }
+ */
+
+ dc_printf(" %d triangles: ", count ) ;
+ dc_printf( " %f%% complete.", 100 * percent ) ;
+ }
+#endif
+
+ }
+ putchar ( 13 ) ;
+}
+
+void Octree::addTrian( Triangle* trian, int triind )
+{
+ int i, j ;
+
+ // Blowing up the triangle to the grid
+ float mid[3] = {0, 0, 0} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ trian->vt[i][j] = dimen * ( trian->vt[i][j] - origin[j] ) / range ;
+ mid[j] += trian->vt[i][j] / 3 ;
+ }
+
+ // Generate projections
+ LONG cube[2][3] = { { 0, 0, 0 }, { dimen, dimen, dimen } } ;
+ LONG trig[3][3] ;
+
+ for ( i = 0 ; i < 3 ; i ++ )
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ trig[i][j] = (LONG) (trian->vt[i][j]) ;
+ // Perturb end points, if set so
+ }
+
+ // Add to the octree
+ // int start[3] = { 0, 0, 0 } ;
+ LONG errorvec = (LONG) ( 0 ) ;
+ Projections* proj = new Projections( cube, trig, errorvec, triind ) ;
+ root = addTrian( root, proj, maxDepth ) ;
+
+ delete proj->inherit ;
+ delete proj ;
+}
+
+
+UCHAR* Octree::addTrian( UCHAR* node, Projections* p, int height )
+{
+ int i ;
+ int vertdiff[8][3] = {{0,0,0},{0,0,1},{0,1,-1},{0,0,1},{1,-1,-1},{0,0,1},{0,1,-1},{0,0,1}} ;
+ UCHAR boxmask = p->getBoxMask( ) ;
+ Projections* subp = new Projections( p ) ;
+
+ int count = 0 ;
+ int tempdiff[3] = {0,0,0} ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ tempdiff[0] += vertdiff[i][0] ;
+ tempdiff[1] += vertdiff[i][1] ;
+ tempdiff[2] += vertdiff[i][2] ;
+
+ /* Quick pruning using bounding box */
+ if ( boxmask & ( 1 << i ) )
+ {
+ subp->shift( tempdiff ) ;
+ tempdiff[0] = tempdiff[1] = tempdiff[2] = 0 ;
+
+ /* Pruning using intersection test */
+ if ( subp->isIntersecting() )
+ // if ( subp->getIntersectionMasks( cedgemask, edgemask ) )
+ {
+ if ( ! hasChild( node, i ) )
+ {
+ if ( height == 1 )
+ {
+ node = addLeafChild( node, i, count, createLeaf(0) ) ;
+ }
+ else
+ {
+ node = addInternalChild( node, i, count, createInternal(0) ) ;
+ }
+ }
+ UCHAR* chd = getChild( node, count ) ;
+
+ if ( ! isLeaf( node, i ) )
+ {
+ // setChild( node, count, addTrian ( chd, subp, height - 1, vertmask[i], edgemask ) ) ;
+ setChild( node, count, addTrian ( chd, subp, height - 1 ) ) ;
+ }
+ else
+ {
+ setChild( node, count, updateCell( chd, subp ) ) ;
+ }
+ }
+ }
+
+ if ( hasChild( node, i ) )
+ {
+ count ++ ;
+ }
+ }
+
+ delete subp ;
+ return node ;
+}
+
+UCHAR* Octree::updateCell( UCHAR* node, Projections* p )
+{
+ int i ;
+
+ // Edge connectivity
+ int mask[3] = { 0, 4, 8 } ;
+ int oldc = 0, newc = 0 ;
+ float offs[3] ;
+#ifdef USE_HERMIT
+ float a[3], b[3], c[3] ;
+#endif
+
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( ! getEdgeParity( node, mask[i] ) )
+ {
+ if ( p->isIntersectingPrimary( i ) )
+ {
+ // this->actualQuads ++ ;
+ setEdge( node, mask[i] ) ;
+ offs[ newc ] = p->getIntersectionPrimary( i ) ;
+#ifdef USE_HERMIT
+ a[ newc ] = (float) p->inherit->norm[0] ;
+ b[ newc ] = (float) p->inherit->norm[1] ;
+ c[ newc ] = (float) p->inherit->norm[2] ;
+#endif
+ newc ++ ;
+ }
+ }
+ else
+ {
+#ifndef USE_HERMIT
+ offs[ newc ] = getEdgeOffset( node, oldc ) ;
+#else
+ offs[ newc ] = getEdgeOffsetNormal( node, oldc, a[ newc ], b[ newc ], c[ newc ] ) ;
+#endif
+
+// if ( p->isIntersectingPrimary( i ) )
+ {
+ // dc_printf("Multiple intersections!\n") ;
+
+// setPatchEdge( node, i ) ;
+ }
+
+ oldc ++ ;
+ newc ++ ;
+ }
+ }
+
+ if ( newc > oldc )
+ {
+ // New offsets added, update this node
+#ifndef USE_HERMIT
+ node = updateEdgeOffsets( node, oldc, newc, offs ) ;
+#else
+ node = updateEdgeOffsetsNormals( node, oldc, newc, offs, a, b, c ) ;
+#endif
+ }
+
+
+
+ return node ;
+}
+
+void Octree::preparePrimalEdgesMask( UCHAR* node )
+{
+ int count = 0 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ if ( isLeaf( node, i ) )
+ {
+ createPrimalEdgesMask( getChild( node, count ) ) ;
+ }
+ else
+ {
+ preparePrimalEdgesMask( getChild( node, count ) ) ;
+ }
+
+ count ++ ;
+ }
+ }
+}
+
+void Octree::trace( )
+{
+ int st[3] = { 0, 0, 0, } ;
+ this->numRings = 0 ;
+ this->totRingLengths = 0 ;
+ this->maxRingLength = 0 ;
+
+ PathList* chdpath = NULL ;
+ this->root = trace( this->root, st, dimen, maxDepth, chdpath ) ;
+
+ if ( chdpath != NULL )
+ {
+ dc_printf("there are incomplete rings.\n") ;
+ printPaths( chdpath ) ;
+ };
+}
+
+UCHAR* Octree::trace( UCHAR* node, int* st, int len, int depth, PathList*& paths)
+{
+ UCHAR* newnode = node ;
+ len >>= 1 ;
+ PathList* chdpaths[ 8 ] ;
+ UCHAR* chd[ 8 ] ;
+ int nst[ 8 ][ 3 ] ;
+ int i, j ;
+
+ // Get children paths
+ int chdleaf[ 8 ] ;
+ fillChildren( newnode, chd, chdleaf ) ;
+
+ // int count = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ nst[ i ][ j ] = st[ j ] + len * vertmap[ i ][ j ] ;
+ }
+
+ if ( chd[ i ] == NULL || isLeaf( node, i ) )
+ {
+ chdpaths[ i ] = NULL ;
+ }
+ else
+ {
+ trace( chd[ i ], nst[i], len, depth - 1, chdpaths[ i ] ) ;
+ }
+ }
+
+ // Get connectors on the faces
+ PathList* conn[ 12 ] ;
+ UCHAR* nf[2] ;
+ int lf[2] ;
+ int df[2] = { depth - 1, depth - 1 } ;
+ int* nstf[ 2 ];
+
+ fillChildren( newnode, chd, chdleaf ) ;
+
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ int c[ 2 ] = { cellProcFaceMask[ i ][ 0 ], cellProcFaceMask[ i ][ 1 ] };
+
+ for ( int j = 0 ; j < 2 ; j ++ )
+ {
+ lf[j] = chdleaf[ c[j] ] ;
+ nf[j] = chd[ c[j] ] ;
+ nstf[j] = nst[ c[j] ] ;
+ }
+
+ conn[ i ] = NULL ;
+
+ findPaths( nf, lf, df, nstf, depth - 1, cellProcFaceMask[ i ][ 2 ], conn[ i ] ) ;
+
+ //if ( conn[i] )
+ //{
+ // printPath( conn[i] ) ;
+ //}
+ }
+
+ // Connect paths
+ PathList* rings = NULL ;
+ combinePaths( chdpaths[0], chdpaths[1], conn[8], rings ) ;
+ combinePaths( chdpaths[2], chdpaths[3], conn[9], rings ) ;
+ combinePaths( chdpaths[4], chdpaths[5], conn[10], rings ) ;
+ combinePaths( chdpaths[6], chdpaths[7], conn[11], rings ) ;
+
+ combinePaths( chdpaths[0], chdpaths[2], conn[4], rings ) ;
+ combinePaths( chdpaths[4], chdpaths[6], conn[5], rings ) ;
+ combinePaths( chdpaths[0], NULL, conn[6], rings ) ;
+ combinePaths( chdpaths[4], NULL, conn[7], rings ) ;
+
+ combinePaths( chdpaths[0], chdpaths[4], conn[0], rings ) ;
+ combinePaths( chdpaths[0], NULL, conn[1], rings ) ;
+ combinePaths( chdpaths[0], NULL, conn[2], rings ) ;
+ combinePaths( chdpaths[0], NULL, conn[3], rings ) ;
+
+ // By now, only chdpaths[0] and rings have contents
+
+ // Process rings
+ if ( rings )
+ {
+ // printPath( rings ) ;
+
+ /* Let's count first */
+ PathList* trings = rings ;
+ while ( trings )
+ {
+ this->numRings ++ ;
+ this->totRingLengths += trings->length ;
+ if ( trings->length > this->maxRingLength )
+ {
+ this->maxRingLength = trings->length ;
+ }
+ trings = trings->next ;
+ }
+
+ // printPath( rings ) ;
+ newnode = patch( newnode, st, ( len << 1 ), rings ) ;
+ }
+
+ // Return incomplete paths
+ paths = chdpaths[0] ;
+ return newnode ;
+}
+
+void Octree::findPaths( UCHAR* node[2], int leaf[2], int depth[2], int* st[2], int maxdep, int dir, PathList*& paths )
+{
+ if ( ! ( node[0] && node[1] ) )
+ {
+ return ;
+ }
+
+ if ( ! ( leaf[0] && leaf[1] ) )
+ {
+ // Not at the bottom, recur
+
+ // Fill children nodes
+ int i, j ;
+ UCHAR* chd[ 2 ][ 8 ] ;
+ int chdleaf[ 2 ][ 8 ] ;
+ int nst[ 2 ][ 8 ][ 3 ] ;
+
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ if ( ! leaf[j] )
+ {
+ fillChildren( node[j], chd[j], chdleaf[j] ) ;
+
+ int len = ( dimen >> ( maxDepth - depth[j] + 1 ) ) ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ for ( int k = 0 ; k < 3 ; k ++ )
+ {
+ nst[ j ][ i ][ k ] = st[ j ][ k ] + len * vertmap[ i ][ k ] ;
+ }
+ }
+
+ }
+ }
+
+ // 4 face calls
+ UCHAR* nf[2] ;
+ int df[2] ;
+ int lf[2] ;
+ int* nstf[2] ;
+ for ( i = 0 ; i < 4 ; i ++ )
+ {
+ int c[2] = { faceProcFaceMask[ dir ][ i ][ 0 ], faceProcFaceMask[ dir ][ i ][ 1 ] };
+ for ( int j = 0 ; j < 2 ; j ++ )
+ {
+ if ( leaf[j] )
+ {
+ lf[j] = leaf[j] ;
+ nf[j] = node[j] ;
+ df[j] = depth[j] ;
+ nstf[j] = st[j] ;
+ }
+ else
+ {
+ lf[j] = chdleaf[ j ][ c[j] ] ;
+ nf[j] = chd[ j ][ c[j] ] ;
+ df[j] = depth[j] - 1 ;
+ nstf[j] = nst[ j ][ c[j] ] ;
+ }
+ }
+ findPaths( nf, lf, df, nstf, maxdep - 1, faceProcFaceMask[ dir ][ i ][ 2 ], paths ) ;
+ }
+
+ }
+ else
+ {
+ // At the bottom, check this face
+ int ind = ( depth[0] == maxdep ? 0 : 1 ) ;
+ int fcind = 2 * dir + ( 1 - ind ) ;
+ if ( getFaceParity( node[ ind ], fcind ) )
+ {
+ // Add into path
+ PathElement* ele1 = new PathElement ;
+ PathElement* ele2 = new PathElement ;
+
+ ele1->pos[0] = st[0][0] ;
+ ele1->pos[1] = st[0][1] ;
+ ele1->pos[2] = st[0][2] ;
+
+ ele2->pos[0] = st[1][0] ;
+ ele2->pos[1] = st[1][1] ;
+ ele2->pos[2] = st[1][2] ;
+
+ ele1->next = ele2 ;
+ ele2->next = NULL ;
+
+ PathList* lst = new PathList ;
+ lst->head = ele1 ;
+ lst->tail = ele2 ;
+ lst->length = 2 ;
+ lst->next = paths ;
+ paths = lst ;
+
+ // int l = ( dimen >> maxDepth ) ;
+ }
+ }
+
+}
+
+void Octree::combinePaths( PathList*& list1, PathList* list2, PathList* paths, PathList*& rings )
+{
+ // Make new list of paths
+ PathList* nlist = NULL ;
+
+ // Search for each connectors in paths
+ PathList* tpaths = paths ;
+ PathList* tlist, * pre ;
+ while ( tpaths )
+ {
+ PathList* singlist = tpaths ;
+ PathList* templist ;
+ tpaths = tpaths->next ;
+ singlist->next = NULL ;
+
+ // Look for hookup in list1
+ tlist = list1 ;
+ pre = NULL ;
+ while ( tlist )
+ {
+ if ( (templist = combineSinglePath( list1, pre, tlist, singlist, NULL, singlist )) != NULL )
+ {
+ singlist = templist ;
+ continue ;
+ }
+ pre = tlist ;
+ tlist = tlist->next ;
+ }
+
+ // Look for hookup in list2
+ tlist = list2 ;
+ pre = NULL ;
+ while ( tlist )
+ {
+ if ( (templist = combineSinglePath( list2, pre, tlist, singlist, NULL, singlist )) != NULL )
+ {
+ singlist = templist ;
+ continue ;
+ }
+ pre = tlist ;
+ tlist = tlist->next ;
+ }
+
+ // Look for hookup in nlist
+ tlist = nlist ;
+ pre = NULL ;
+ while ( tlist )
+ {
+ if ( (templist = combineSinglePath( nlist, pre, tlist, singlist, NULL, singlist )) != NULL )
+ {
+ singlist = templist ;
+ continue ;
+ }
+ pre = tlist ;
+ tlist = tlist->next ;
+ }
+
+ // Add to nlist or rings
+ if ( isEqual( singlist->head, singlist->tail ) )
+ {
+ PathElement* temp = singlist->head ;
+ singlist->head = temp->next ;
+ delete temp ;
+ singlist->length -- ;
+ singlist->tail->next = singlist->head ;
+
+ singlist->next = rings ;
+ rings = singlist ;
+ }
+ else
+ {
+ singlist->next = nlist ;
+ nlist = singlist ;
+ }
+
+ }
+
+ // Append list2 and nlist to the end of list1
+ tlist = list1 ;
+ if ( tlist != NULL )
+ {
+ while ( tlist->next != NULL )
+ {
+ tlist = tlist->next ;
+ }
+ tlist->next = list2 ;
+ }
+ else
+ {
+ tlist = list2 ;
+ list1 = list2 ;
+ }
+
+ if ( tlist != NULL )
+ {
+ while ( tlist->next != NULL )
+ {
+ tlist = tlist->next ;
+ }
+ tlist->next = nlist ;
+ }
+ else
+ {
+ tlist = nlist ;
+ list1 = nlist ;
+ }
+
+}
+
+PathList* Octree::combineSinglePath( PathList*& head1, PathList* pre1, PathList*& list1, PathList*& head2, PathList* pre2, PathList*& list2 )
+{
+ if ( isEqual( list1->head, list2->head ) || isEqual( list1->tail, list2->tail ) )
+ {
+ // Reverse the list
+ if ( list1->length < list2->length )
+ {
+ // Reverse list1
+ PathElement* prev = list1->head ;
+ PathElement* next = prev->next ;
+ prev->next = NULL ;
+ while ( next != NULL )
+ {
+ PathElement* tnext = next->next ;
+ next->next = prev ;
+
+ prev = next ;
+ next = tnext ;
+ }
+
+ list1->tail = list1->head ;
+ list1->head = prev ;
+ }
+ else
+ {
+ // Reverse list2
+ PathElement* prev = list2->head ;
+ PathElement* next = prev->next ;
+ prev->next = NULL ;
+ while ( next != NULL )
+ {
+ PathElement* tnext = next->next ;
+ next->next = prev ;
+
+ prev = next ;
+ next = tnext ;
+ }
+
+ list2->tail = list2->head ;
+ list2->head = prev ;
+ }
+ }
+
+ if ( isEqual( list1->head, list2->tail ) )
+ {
+
+ // Easy case
+ PathElement* temp = list1->head->next ;
+ delete list1->head ;
+ list2->tail->next = temp ;
+
+ PathList* nlist = new PathList ;
+ nlist->length = list1->length + list2->length - 1 ;
+ nlist->head = list2->head ;
+ nlist->tail = list1->tail ;
+ nlist->next = NULL ;
+
+ deletePath( head1, pre1, list1 ) ;
+ deletePath( head2, pre2, list2 ) ;
+
+ return nlist ;
+ }
+ else if ( isEqual( list1->tail, list2->head ) )
+ {
+ // Easy case
+ PathElement* temp = list2->head->next ;
+ delete list2->head ;
+ list1->tail->next = temp ;
+
+ PathList* nlist = new PathList ;
+ nlist->length = list1->length + list2->length - 1 ;
+ nlist->head = list1->head ;
+ nlist->tail = list2->tail ;
+ nlist->next = NULL ;
+
+ deletePath( head1, pre1, list1 ) ;
+ deletePath( head2, pre2, list2 ) ;
+
+ return nlist ;
+ }
+
+ return NULL ;
+}
+
+void Octree::deletePath( PathList*& head, PathList* pre, PathList*& curr )
+{
+ PathList* temp = curr ;
+ curr = temp->next ;
+ delete temp ;
+
+ if ( pre == NULL )
+ {
+ head = curr ;
+ }
+ else
+ {
+ pre->next = curr ;
+ }
+}
+
+void Octree::printElement( PathElement* ele )
+{
+ if ( ele != NULL )
+ {
+ dc_printf( " (%d %d %d)", ele->pos[0], ele->pos[1], ele->pos[2] ) ;
+ }
+}
+
+void Octree::printPath( PathList* path )
+{
+ PathElement* n = path->head;
+ int same = 0 ;
+
+#if DC_DEBUG
+ int len = ( dimen >> maxDepth ) ;
+#endif
+ while ( n && ( same == 0 || n != path->head ) )
+ {
+ same ++ ;
+ dc_printf( " (%d %d %d)", n->pos[0] / len, n->pos[1] / len, n->pos[2] / len ) ;
+ n = n->next ;
+ }
+
+ if ( n == path->head )
+ {
+ dc_printf(" Ring!\n") ;
+ }
+ else
+ {
+ dc_printf(" %p end!\n", n) ;
+ }
+}
+
+void Octree::printPath( PathElement* path )
+{
+ PathElement *n = path;
+ int same = 0 ;
+#if DC_DEBUG
+ int len = ( dimen >> maxDepth ) ;
+#endif
+ while ( n && ( same == 0 || n != path ) )
+ {
+ same ++ ;
+ dc_printf( " (%d %d %d)", n->pos[0] / len, n->pos[1] / len, n->pos[2] / len ) ;
+ n = n->next ;
+ }
+
+ if ( n == path )
+ {
+ dc_printf(" Ring!\n") ;
+ }
+ else
+ {
+ dc_printf(" %p end!\n", n) ;
+ }
+
+}
+
+
+void Octree::printPaths( PathList* path )
+{
+ PathList* iter = path ;
+ int i = 0 ;
+ while ( iter != NULL )
+ {
+ dc_printf("Path %d:\n", i) ;
+ printPath( iter ) ;
+ iter = iter->next ;
+ i ++ ;
+ }
+}
+
+UCHAR* Octree::patch( UCHAR* node, int st[3], int len, PathList* rings )
+{
+#ifdef IN_DEBUG_MODE
+ dc_printf("Call to PATCH with rings: \n");
+ printPaths( rings ) ;
+#endif
+
+ /* Do nothing but couting
+ PathList* tlist = rings ;
+ PathList* ttlist ;
+ PathElement* telem, * ttelem ;
+ while ( tlist!= NULL )
+ {
+ // printPath( tlist ) ;
+ this->numRings ++ ;
+ this->totRingLengths += tlist->length ;
+ if ( tlist->length > this->maxRingLength )
+ {
+ this->maxRingLength = tlist->length ;
+ }
+ ttlist = tlist ;
+ tlist = tlist->next ;
+ }
+ return node ;
+ */
+
+
+ /* Pass onto separate calls in each direction */
+ UCHAR* newnode = node ;
+ if ( len == mindimen )
+ {
+ dc_printf("Error! should have no list by now.\n") ;
+ exit(0) ;
+ }
+
+ // YZ plane
+ PathList* xlists[2] ;
+ newnode = patchSplit( newnode, st, len, rings, 0, xlists[0], xlists[1] ) ;
+
+ // XZ plane
+ PathList* ylists[4] ;
+ newnode = patchSplit( newnode, st, len, xlists[0], 1, ylists[0], ylists[1] ) ;
+ newnode = patchSplit( newnode, st, len, xlists[1], 1, ylists[2], ylists[3] ) ;
+
+ // XY plane
+ PathList* zlists[8] ;
+ newnode = patchSplit( newnode, st, len, ylists[0], 2, zlists[0], zlists[1] ) ;
+ newnode = patchSplit( newnode, st, len, ylists[1], 2, zlists[2], zlists[3] ) ;
+ newnode = patchSplit( newnode, st, len, ylists[2], 2, zlists[4], zlists[5] ) ;
+ newnode = patchSplit( newnode, st, len, ylists[3], 2, zlists[6], zlists[7] ) ;
+
+ // Recur
+ len >>= 1 ;
+ int count = 0 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ if ( zlists[i] != NULL )
+ {
+ int nori[3] = {
+ st[0] + len * vertmap[i][0] ,
+ st[1] + len * vertmap[i][1] ,
+ st[2] + len * vertmap[i][2] } ;
+ patch( getChild( newnode , count ), nori, len, zlists[i] ) ;
+ }
+
+ if ( hasChild( newnode, i ) )
+ {
+ count ++ ;
+ }
+ }
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from PATCH\n") ;
+#endif
+ return newnode ;
+
+}
+
+
+UCHAR* Octree::patchSplit( UCHAR* node, int st[3], int len, PathList* rings, int dir, PathList*& nrings1, PathList*& nrings2 )
+{
+#ifdef IN_DEBUG_MODE
+ dc_printf("Call to PATCHSPLIT with direction %d and rings: \n", dir);
+ printPaths( rings ) ;
+#endif
+
+ UCHAR* newnode = node ;
+ nrings1 = NULL ;
+ nrings2 = NULL ;
+ PathList* tmp ;
+ while ( rings != NULL )
+ {
+ // Process this ring
+ newnode = patchSplitSingle( newnode, st, len, rings->head, dir, nrings1, nrings2 ) ;
+
+ // Delete this ring from the group
+ tmp = rings ;
+ rings = rings->next ;
+ delete tmp ;
+ }
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from PATCHSPLIT with \n");
+ dc_printf("Rings gourp 1:\n") ;
+ printPaths( nrings1 ) ;
+ dc_printf("Rings group 2:\n") ;
+ printPaths( nrings2 ) ;
+#endif
+
+ return newnode ;
+}
+
+UCHAR* Octree::patchSplitSingle( UCHAR* node, int st[3], int len, PathElement* head, int dir, PathList*& nrings1, PathList*& nrings2 )
+{
+#ifdef IN_DEBUG_MODE
+ dc_printf("Call to PATCHSPLITSINGLE with direction %d and path: \n", dir );
+ printPath( head ) ;
+#endif
+
+ UCHAR* newnode = node ;
+
+ if ( head == NULL )
+ {
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from PATCHSPLITSINGLE with head==NULL.\n") ;
+#endif
+ return newnode;
+ }
+ else
+ {
+ // printPath( head ) ;
+ }
+
+ // Walk along the ring to find pair of intersections
+ PathElement* pre1 = NULL ;
+ PathElement* pre2 = NULL ;
+ int side = findPair ( head, st[ dir ] + len / 2 , dir, pre1, pre2 ) ;
+
+ /*
+ if ( pre1 == pre2 )
+ {
+ int edgelen = ( dimen >> maxDepth ) ;
+ dc_printf("Location: %d %d %d Direction: %d Reso: %d\n", st[0]/edgelen, st[1]/edgelen, st[2]/edgelen, dir, len/edgelen) ;
+ printPath( head ) ;
+ exit( 0 ) ;
+ }
+ */
+
+ if ( side )
+ {
+ // Entirely on one side
+ PathList* nring = new PathList( ) ;
+ nring->head = head ;
+
+ if ( side == -1 )
+ {
+ nring->next = nrings1 ;
+ nrings1 = nring ;
+ }
+ else
+ {
+ nring->next = nrings2 ;
+ nrings2 = nring ;
+ }
+ }
+ else
+ {
+ // Break into two parts
+ PathElement* nxt1 = pre1->next ;
+ PathElement* nxt2 = pre2->next ;
+ pre1->next = nxt2 ;
+ pre2->next = nxt1 ;
+
+ newnode = connectFace( newnode, st, len, dir, pre1, pre2 ) ;
+
+ if ( isEqual( pre1, pre1->next ) )
+ {
+ if ( pre1 == pre1->next )
+ {
+ delete pre1 ;
+ pre1 = NULL ;
+ }
+ else
+ {
+ PathElement* temp = pre1->next ;
+ pre1->next = temp->next ;
+ delete temp ;
+ }
+ }
+ if ( isEqual( pre2, pre2->next ) )
+ {
+ if ( pre2 == pre2->next )
+ {
+ delete pre2 ;
+ pre2 = NULL ;
+ }
+ else
+ {
+ PathElement* temp = pre2->next ;
+ pre2->next = temp->next ;
+ delete temp ;
+ }
+ }
+
+ compressRing ( pre1 ) ;
+ compressRing ( pre2 ) ;
+
+ // Recur
+ newnode = patchSplitSingle( newnode, st, len, pre1, dir, nrings1, nrings2 ) ;
+ newnode = patchSplitSingle( newnode, st, len, pre2, dir, nrings1, nrings2 ) ;
+
+ }
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from PATCHSPLITSINGLE with \n");
+ dc_printf("Rings gourp 1:\n") ;
+ printPaths( nrings1 ) ;
+ dc_printf("Rings group 2:\n") ;
+ printPaths( nrings2 ) ;
+#endif
+
+ return newnode ;
+}
+
+UCHAR* Octree::connectFace( UCHAR* node, int st[3], int len, int dir, PathElement* f1, PathElement* f2 )
+{
+#ifdef IN_DEBUG_MODE
+ dc_printf("Call to CONNECTFACE with direction %d and length %d path: \n", dir, len );
+ dc_printf("Path (low side): \n" ) ;
+ printPath( f1 ) ;
+// checkPath( f1 ) ;
+ dc_printf("Path (high side): \n" ) ;
+ printPath( f2 ) ;
+// checkPath( f2 ) ;
+#endif
+
+ UCHAR* newnode = node ;
+
+ // Setup 2D
+ int pos = st[ dir ] + len / 2 ;
+ int xdir = ( dir + 1 ) % 3 ;
+ int ydir = ( dir + 2 ) % 3 ;
+
+ // Use existing intersections on f1 and f2
+ int x1, y1, x2, y2 ;
+ float p1, q1, p2, q2 ;
+
+ getFacePoint( f2->next, dir, x1, y1, p1, q1 ) ;
+ getFacePoint( f2, dir, x2, y2, p2, q2 ) ;
+
+ float dx = x2 + p2 - x1 - p1 ;
+ float dy = y2 + q2 - y1 - q1 ;
+
+ // Do adapted Bresenham line drawing
+ float rx = p1, ry = q1 ;
+ int incx = 1, incy = 1 ;
+ int lx = x1, ly = y1 ;
+ int hx = x2, hy = y2 ;
+ int choice ;
+ if ( x2 < x1 )
+ {
+ incx = -1 ;
+ rx = 1 - rx ;
+ lx = x2 ;
+ hx = x1 ;
+ }
+ if ( y2 < y1 )
+ {
+ incy = -1 ;
+ ry = 1 - ry ;
+ ly = y2 ;
+ hy = y1 ;
+ }
+
+ float sx = dx * incx ;
+ float sy = dy * incy ;
+
+ int ori[3] ;
+ ori[ dir ] = pos / mindimen ;
+ ori[ xdir ] = x1 ;
+ ori[ ydir ] = y1 ;
+ int walkdir ;
+ int inc ;
+ float alpha ;
+
+ PathElement* curEleN = f1 ;
+ PathElement* curEleP = f2->next ;
+ UCHAR *nodeN = NULL, *nodeP = NULL ;
+ UCHAR *curN = locateLeaf( newnode, len, f1->pos ) ;
+ UCHAR *curP = locateLeaf( newnode, len, f2->next->pos ) ;
+ if ( curN == NULL || curP == NULL )
+ {
+ exit(0) ;
+ }
+ int stN[3], stP[3] ;
+ int lenN, lenP ;
+
+ /* Unused code, leaving for posterity
+
+ float stpt[3], edpt[3] ;
+ stpt[ dir ] = edpt[ dir ] = (float) pos ;
+ stpt[ xdir ] = ( x1 + p1 ) * mindimen ;
+ stpt[ ydir ] = ( y1 + q1 ) * mindimen ;
+ edpt[ xdir ] = ( x2 + p2 ) * mindimen ;
+ edpt[ ydir ] = ( y2 + q2 ) * mindimen ;
+ */
+ while( ori[ xdir ] != x2 || ori[ ydir ] != y2 )
+ {
+ int next ;
+ if ( sy * (1 - rx) > sx * (1 - ry) )
+ {
+ choice = 1 ;
+ next = ori[ ydir ] + incy ;
+ if ( next < ly || next > hy )
+ {
+ choice = 4 ;
+ next = ori[ xdir ] + incx ;
+ }
+ }
+ else
+ {
+ choice = 2 ;
+ next = ori[ xdir ] + incx ;
+ if ( next < lx || next > hx )
+ {
+ choice = 3 ;
+ next = ori[ ydir ] + incy ;
+ }
+ }
+
+ if ( choice & 1 )
+ {
+ ori[ ydir ] = next ;
+ if ( choice == 1 )
+ {
+ rx += ( sy == 0 ? 0 : (1 - ry) * sx / sy ) ;
+ ry = 0 ;
+ }
+
+ walkdir = 2 ;
+ inc = incy ;
+ alpha = x2 < x1 ? 1 - rx : rx ;
+ }
+ else
+ {
+ ori[ xdir ] = next ;
+ if ( choice == 2 )
+ {
+ ry += ( sx == 0 ? 0 : (1 - rx) * sy / sx ) ;
+ rx = 0 ;
+ }
+
+ walkdir = 1 ;
+ inc = incx ;
+ alpha = y2 < y1 ? 1 - ry : ry ;
+ }
+
+
+
+ // Get the exact location of the marcher
+ int nori[3] = { ori[0] * mindimen, ori[1] * mindimen, ori[2] * mindimen } ;
+ float spt[3] = { (float) nori[0], (float) nori[1], (float) nori[2] } ;
+ spt[ ( dir + ( 3 - walkdir ) ) % 3 ] += alpha * mindimen ;
+ if ( inc < 0 )
+ {
+ spt[ ( dir + walkdir ) % 3 ] += mindimen ;
+ }
+
+ // dc_printf("new x,y: %d %d\n", ori[ xdir ] / edgelen, ori[ ydir ] / edgelen ) ;
+ // dc_printf("nori: %d %d %d alpha: %f walkdir: %d\n", nori[0], nori[1], nori[2], alpha, walkdir ) ;
+ // dc_printf("%f %f %f\n", spt[0], spt[1], spt[2] ) ;
+
+ // Locate the current cells on both sides
+ newnode = locateCell( newnode, st, len, nori, dir, 1, nodeN, stN, lenN ) ;
+ newnode = locateCell( newnode, st, len, nori, dir, 0, nodeP, stP, lenP ) ;
+
+ updateParent( newnode, len, st ) ;
+
+ int flag = 0 ;
+ // Add the cells to the rings and fill in the patch
+ PathElement* newEleN ;
+ if ( curEleN->pos[0] != stN[0] || curEleN->pos[1] != stN[1] || curEleN->pos[2] != stN[2] )
+ {
+ if ( curEleN->next->pos[0] != stN[0] || curEleN->next->pos[1] != stN[1] || curEleN->next->pos[2] != stN[2] )
+ {
+ newEleN = new PathElement ;
+ newEleN->next = curEleN->next ;
+ newEleN->pos[0] = stN[0] ;
+ newEleN->pos[1] = stN[1] ;
+ newEleN->pos[2] = stN[2] ;
+
+ curEleN->next = newEleN ;
+ }
+ else
+ {
+ newEleN = curEleN->next ;
+ }
+ curN = patchAdjacent( newnode, len, curEleN->pos, curN, newEleN->pos, nodeN, walkdir, inc, dir, 1, alpha ) ;
+
+ curEleN = newEleN ;
+ flag ++ ;
+ }
+
+ PathElement* newEleP ;
+ if ( curEleP->pos[0] != stP[0] || curEleP->pos[1] != stP[1] || curEleP->pos[2] != stP[2] )
+ {
+ if ( f2->pos[0] != stP[0] || f2->pos[1] != stP[1] || f2->pos[2] != stP[2] )
+ {
+ newEleP = new PathElement ;
+ newEleP->next = curEleP ;
+ newEleP->pos[0] = stP[0] ;
+ newEleP->pos[1] = stP[1] ;
+ newEleP->pos[2] = stP[2] ;
+
+ f2->next = newEleP ;
+ }
+ else
+ {
+ newEleP = f2 ;
+ }
+ curP = patchAdjacent( newnode, len, curEleP->pos, curP, newEleP->pos, nodeP, walkdir, inc, dir, 0, alpha ) ;
+
+
+
+ curEleP = newEleP ;
+ flag ++ ;
+ }
+
+
+ /*
+ if ( flag == 0 )
+ {
+ dc_printf("error: non-synchronized patching! at \n") ;
+ }
+ */
+ }
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from CONNECTFACE with \n");
+ dc_printf("Path (low side):\n") ;
+ printPath( f1 ) ;
+ checkPath( f1 ) ;
+ dc_printf("Path (high side):\n") ;
+ printPath( f2 ) ;
+ checkPath( f2 ) ;
+#endif
+
+
+ return newnode ;
+}
+
+UCHAR* Octree::patchAdjacent( UCHAR* node, int len, int st1[3], UCHAR* leaf1, int st2[3], UCHAR* leaf2, int walkdir, int inc, int dir, int side, float alpha )
+{
+#ifdef IN_DEBUG_MODE
+ dc_printf("Before patching.\n") ;
+ printInfo( st1 ) ;
+ printInfo( st2 ) ;
+ dc_printf("-----------------%d %d %d ; %d %d %d\n", st1[0], st2[1], st1[2], st2[0], st2[1], st2[2] ) ;
+#endif
+
+ // Get edge index on each leaf
+ int edgedir = ( dir + ( 3 - walkdir ) ) % 3 ;
+ int incdir = ( dir + walkdir ) % 3 ;
+ int ind1 = ( edgedir == 1 ? ( dir + 3 - edgedir ) % 3 - 1 : 2 - ( dir + 3 - edgedir ) % 3 ) ;
+ int ind2 = ( edgedir == 1 ? ( incdir + 3 - edgedir ) % 3 - 1 : 2 - ( incdir + 3 - edgedir ) % 3 ) ;
+
+ int eind1 = ( ( edgedir << 2 ) | ( side << ind1 ) | ( ( inc > 0 ? 1 : 0 ) << ind2 ) ) ;
+ int eind2 = ( ( edgedir << 2 ) | ( side << ind1 ) | ( ( inc > 0 ? 0 : 1 ) << ind2 ) ) ;
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Index 1: %d Alpha 1: %f Index 2: %d Alpha 2: %f\n", eind1, alpha, eind2, alpha ) ;
+ /*
+ if ( alpha < 0 || alpha > 1 )
+ {
+ dc_printf("Index 1: %d Alpha 1: %f Index 2: %d Alpha 2: %f\n", eind1, alpha, eind2, alpha ) ;
+ printInfo( st1 ) ;
+ printInfo( st2 ) ;
+ }
+ */
+#endif
+
+ // Flip edge parity
+ UCHAR* nleaf1 = flipEdge( leaf1, eind1, alpha ) ;
+ UCHAR* nleaf2 = flipEdge( leaf2, eind2, alpha ) ;
+
+ // Update parent link
+ updateParent( node, len, st1, nleaf1 ) ;
+ updateParent( node, len, st2, nleaf2 ) ;
+ // updateParent( nleaf1, mindimen, st1 ) ;
+ // updateParent( nleaf2, mindimen, st2 ) ;
+
+ /*
+ float m[3] ;
+ dc_printf("Adding new point: %f %f %f\n", spt[0], spt[1], spt[2] ) ;
+ getMinimizer( leaf1, m ) ;
+ dc_printf("Cell %d now has minimizer %f %f %f\n", leaf1, m[0], m[1], m[2] ) ;
+ getMinimizer( leaf2, m ) ;
+ dc_printf("Cell %d now has minimizer %f %f %f\n", leaf2, m[0], m[1], m[2] ) ;
+ */
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("After patching.\n") ;
+ printInfo( st1 ) ;
+ printInfo( st2 ) ;
+#endif
+ return nleaf2 ;
+}
+
+UCHAR* Octree::locateCell( UCHAR* node, int st[3], int len, int ori[3], int dir, int side, UCHAR*& rleaf, int rst[3], int& rlen )
+{
+#ifdef IN_DEBUG_MODE
+ // dc_printf("Call to LOCATECELL with node ") ;
+ // printNode( node ) ;
+#endif
+ UCHAR* newnode = node ;
+ int i ;
+ len >>= 1 ;
+ int ind = 0 ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ ind <<= 1 ;
+ if ( i == dir && side == 1 )
+ {
+ ind |= ( ori[ i ] <= ( st[ i ] + len ) ? 0 : 1 ) ;
+ }
+ else
+ {
+ ind |= ( ori[ i ] < ( st[ i ] + len ) ? 0 : 1 ) ;
+ }
+ }
+
+#ifdef IN_DEBUG_MODE
+ // dc_printf("In LOCATECELL index of ori (%d %d %d) with dir %d side %d in st (%d %d %d, %d) is: %d\n",
+ // ori[0], ori[1], ori[2], dir, side, st[0], st[1], st[2], len, ind ) ;
+#endif
+
+ rst[0] = st[0] + vertmap[ ind ][ 0 ] * len ;
+ rst[1] = st[1] + vertmap[ ind ][ 1 ] * len ;
+ rst[2] = st[2] + vertmap[ ind ][ 2 ] * len ;
+
+ if ( hasChild( newnode, ind ) )
+ {
+ int count = getChildCount( newnode, ind ) ;
+ UCHAR* chd = getChild( newnode, count ) ;
+ if ( isLeaf( newnode, ind ) )
+ {
+ rleaf = chd ;
+ rlen = len ;
+ }
+ else
+ {
+ // Recur
+ setChild( newnode, count, locateCell( chd, rst, len, ori, dir, side, rleaf, rst, rlen ) ) ;
+ }
+ }
+ else
+ {
+ // Create a new child here
+ if ( len == this->mindimen )
+ {
+ UCHAR* chd = createLeaf( 0 ) ;
+ newnode = addChild( newnode, ind, chd, 1 ) ;
+ rleaf = chd ;
+ rlen = len ;
+ }
+ else
+ {
+ // Subdivide the empty cube
+ UCHAR* chd = createInternal( 0 ) ;
+ newnode = addChild( newnode, ind, locateCell( chd, rst, len, ori, dir, side, rleaf, rst, rlen ), 0 ) ;
+ }
+ }
+
+#ifdef IN_DEBUG_MODE
+ // dc_printf("Return from LOCATECELL with node ") ;
+ // printNode( newnode ) ;
+#endif
+ return newnode ;
+}
+
+void Octree::checkElement( PathElement* ele )
+{
+ /*
+ if ( ele != NULL && locateLeafCheck( ele->pos ) != ele->node )
+ {
+ dc_printf("Screwed! at pos: %d %d %d\n", ele->pos[0]>>minshift, ele->pos[1]>>minshift, ele->pos[2]>>minshift);
+ exit( 0 ) ;
+ }
+ */
+}
+
+void Octree::checkPath( PathElement* path )
+{
+ PathElement *n = path ;
+ int same = 0 ;
+ while ( n && ( same == 0 || n != path ) )
+ {
+ same ++ ;
+ checkElement( n ) ;
+ n = n->next ;
+ }
+
+}
+
+void Octree::testFacePoint( PathElement* e1, PathElement* e2 )
+{
+ int i ;
+ PathElement * e = NULL ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( e1->pos[i] != e2->pos[i] )
+ {
+ if ( e1->pos[i] < e2->pos[i] )
+ {
+ e = e2 ;
+ }
+ else
+ {
+ e = e1 ;
+ }
+ break ;
+ }
+ }
+
+ int x, y ;
+ float p, q ;
+ dc_printf("Test.") ;
+ getFacePoint( e, i, x, y, p, q ) ;
+}
+
+void Octree::getFacePoint( PathElement* leaf, int dir, int& x, int& y, float& p, float& q )
+{
+ // Find average intersections
+ float avg[3] = {0, 0, 0} ;
+ float off[3] ;
+ int num = 0, num2 = 0 ;
+
+ UCHAR* leafnode = locateLeaf( leaf->pos ) ;
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ int edgeind = faceMap[ dir * 2 ][ i ] ;
+ int nst[3] ;
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ nst[j] = leaf->pos[j] + mindimen * vertmap[ edgemap[ edgeind][ 0 ] ][ j ] ;
+ }
+
+ if ( getEdgeIntersectionByIndex( nst, edgeind / 4, off, 1 ) )
+ {
+ avg[0] += off[0] ;
+ avg[1] += off[1] ;
+ avg[2] += off[2] ;
+ num ++ ;
+ }
+ if ( getEdgeParity( leafnode, edgeind ) )
+ {
+ num2 ++ ;
+ }
+ }
+ if ( num == 0 )
+ {
+ dc_printf("Wrong! dir: %d pos: %d %d %d num: %d\n", dir, leaf->pos[0]>>minshift, leaf->pos[1]>>minshift, leaf->pos[2]>>minshift, num2);
+ avg[0] = (float) leaf->pos[0] ;
+ avg[1] = (float) leaf->pos[1] ;
+ avg[2] = (float) leaf->pos[2] ;
+ }
+ else
+ {
+
+ avg[0] /= num ;
+ avg[1] /= num ;
+ avg[2] /= num ;
+
+ //avg[0] = (float) leaf->pos[0];
+ //avg[1] = (float) leaf->pos[1];
+ //avg[2] = (float) leaf->pos[2];
+ }
+
+ int xdir = ( dir + 1 ) % 3 ;
+ int ydir = ( dir + 2 ) % 3 ;
+
+ float xf = avg[ xdir ] ;
+ float yf = avg[ ydir ] ;
+
+#ifdef IN_DEBUG_MODE
+ // Is it outside?
+ // PathElement* leaf = leaf1->len < leaf2->len ? leaf1 : leaf2 ;
+ /*
+ float* m = ( leaf == leaf1 ? m1 : m2 ) ;
+ if ( xf < leaf->pos[ xdir ] ||
+ yf < leaf->pos[ ydir ] ||
+ xf > leaf->pos[ xdir ] + leaf->len ||
+ yf > leaf->pos[ ydir ] + leaf->len)
+ {
+ dc_printf("Outside cube (%d %d %d), %d : %d %d %f %f\n", leaf->pos[ 0 ], leaf->pos[1], leaf->pos[2], leaf->len,
+ pos, dir, xf, yf) ;
+
+ // For now, snap to cell
+ xf = m[ xdir ] ;
+ yf = m[ ydir ] ;
+ }
+ */
+
+ /*
+ if ( alpha < 0 || alpha > 1 ||
+ xf < leaf->pos[xdir] || xf > leaf->pos[xdir] + leaf->len ||
+ yf < leaf->pos[ydir] || yf > leaf->pos[ydir] + leaf->len )
+ {
+ dc_printf("Alpha: %f Address: %d and %d\n", alpha, leaf1->node, leaf2->node ) ;
+ dc_printf("GETFACEPOINT result: (%d %d %d) %d min: (%f %f %f) ;(%d %d %d) %d min: (%f %f %f).\n",
+ leaf1->pos[0], leaf1->pos[1], leaf1->pos[2], leaf1->len, m1[0], m1[1], m1[2],
+ leaf2->pos[0], leaf2->pos[1], leaf2->pos[2], leaf2->len, m2[0], m2[1], m2[2]);
+ dc_printf("Face point at dir %d pos %d: %f %f\n", dir, pos, xf, yf ) ;
+ }
+ */
+#endif
+
+
+ // Get the integer and float part
+ x = ( ( leaf->pos[ xdir ] ) >> minshift ) ;
+ y = ( ( leaf->pos[ ydir ] ) >> minshift ) ;
+
+ p = ( xf - leaf->pos[ xdir ] ) / mindimen ;
+ q = ( yf - leaf->pos[ ydir ] ) / mindimen ;
+
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Face point at dir %d : %f %f\n", dir, xf, yf ) ;
+#endif
+}
+
+int Octree::findPair( PathElement* head, int pos, int dir, PathElement*& pre1, PathElement*& pre2 )
+{
+ int side = getSide ( head, pos, dir ) ;
+ PathElement* cur = head ;
+ PathElement* anchor ;
+ PathElement* ppre1, *ppre2 ;
+
+ // Start from this face, find a pair
+ anchor = cur ;
+ ppre1 = cur ;
+ cur = cur->next ;
+ while ( cur != anchor && ( getSide( cur, pos, dir ) == side ) )
+ {
+ ppre1 = cur ;
+ cur = cur->next ;
+ }
+ if ( cur == anchor )
+ {
+ // No pair found
+ return side ;
+ }
+
+ side = getSide( cur, pos, dir ) ;
+ ppre2 = cur ;
+ cur = cur->next ;
+ while ( getSide( cur, pos, dir ) == side )
+ {
+ ppre2 = cur ;
+ cur = cur->next ;
+ }
+
+
+ // Switch pre1 and pre2 if we start from the higher side
+ if ( side == -1 )
+ {
+ cur = ppre1 ;
+ ppre1 = ppre2 ;
+ ppre2 = cur ;
+ }
+
+ pre1 = ppre1 ;
+ pre2 = ppre2 ;
+
+ return 0 ;
+}
+
+int Octree::getSide( PathElement* e, int pos, int dir )
+{
+ return ( e->pos[ dir ] < pos ? -1 : 1 ) ;
+}
+
+int Octree::isEqual( PathElement* e1, PathElement* e2 )
+{
+ return ( e1->pos[0] == e2->pos[0] && e1->pos[1] == e2->pos[1] && e1->pos[2] == e2->pos[2] ) ;
+}
+
+void Octree::compressRing( PathElement*& ring )
+{
+ if ( ring == NULL )
+ {
+ return ;
+ }
+#ifdef IN_DEBUG_MODE
+ dc_printf("Call to COMPRESSRING with path: \n" );
+ printPath( ring ) ;
+#endif
+
+ PathElement* cur = ring->next->next ;
+ PathElement* pre = ring->next ;
+ PathElement* prepre = ring ;
+ PathElement* anchor = prepre ;
+
+ do
+ {
+ while ( isEqual( cur, prepre ) )
+ {
+ // Delete
+ if ( cur == prepre )
+ {
+ // The ring has shrinked to a point
+ delete pre ;
+ delete cur ;
+ anchor = NULL ;
+ break ;
+ }
+ else
+ {
+ prepre->next = cur->next ;
+ delete pre ;
+ delete cur ;
+ pre = prepre->next ;
+ cur = pre->next ;
+ anchor = prepre ;
+ }
+ }
+
+ if ( anchor == NULL )
+ {
+ break ;
+ }
+
+ prepre = pre ;
+ pre = cur ;
+ cur = cur->next ;
+ } while ( prepre != anchor ) ;
+
+ ring = anchor ;
+
+#ifdef IN_DEBUG_MODE
+ dc_printf("Return from COMPRESSRING with path: \n" );
+ printPath( ring ) ;
+#endif
+}
+
+void Octree::buildSigns( )
+{
+ // First build a lookup table
+ // dc_printf("Building up look up table...\n") ;
+ int size = 1 << 12 ;
+ unsigned char table[ 1 << 12 ] ;
+ for ( int i = 0 ; i < size ; i ++ )
+ {
+ table[i] = 0 ;
+ }
+ for ( int i = 0 ; i < 256 ; i ++ )
+ {
+ int ind = 0 ;
+ for ( int j = 11 ; j >= 0 ; j -- )
+ {
+ ind <<= 1 ;
+ if ( ( ( i >> edgemap[j][0] ) & 1 ) ^ ( ( i >> edgemap[j][1] ) & 1 ) )
+ {
+ ind |= 1 ;
+ }
+ }
+
+ table[ ind ] = i ;
+ }
+
+ // Next, traverse the grid
+ int sg = 1 ;
+ int cube[8] ;
+ buildSigns( table, this->root, 0, sg, cube ) ;
+}
+
+void Octree::buildSigns( unsigned char table[], UCHAR* node, int isLeaf, int sg, int rvalue[8] )
+{
+ if ( node == NULL )
+ {
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ rvalue[i] = sg ;
+ }
+ return ;
+ }
+
+ if ( isLeaf == 0 )
+ {
+ // Internal node
+ UCHAR* chd[8] ;
+ int leaf[8] ;
+ fillChildren( node, chd, leaf ) ;
+
+ // Get the signs at the corners of the first cube
+ rvalue[0] = sg ;
+ int oris[8] ;
+ buildSigns( table, chd[0], leaf[0], sg, oris ) ;
+
+ // Get the rest
+ int cube[8] ;
+ for ( int i = 1 ; i < 8 ; i ++ )
+ {
+ buildSigns( table, chd[i], leaf[i], oris[i], cube ) ;
+ rvalue[i] = cube[i] ;
+ }
+
+ }
+ else
+ {
+ // Leaf node
+ generateSigns( node, table, sg ) ;
+
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ rvalue[i] = getSign( node, i ) ;
+ }
+ }
+}
+
+void Octree::floodFill( )
+{
+ // int threshold = (int) ((dimen/mindimen) * (dimen/mindimen) * 0.5f) ;
+ int st[3] = { 0, 0, 0 } ;
+
+ // First, check for largest component
+ // size stored in -threshold
+ this->clearProcessBits( root, maxDepth ) ;
+ int threshold = this->floodFill( root, st, dimen, maxDepth, 0 ) ;
+
+ // Next remove
+ dc_printf("Largest component: %d\n", threshold);
+ threshold *= thresh ;
+ dc_printf("Removing all components smaller than %d\n", threshold) ;
+
+ int st2[3] = { 0, 0, 0 } ;
+ this->clearProcessBits( root, maxDepth ) ;
+ this->floodFill( root, st2, dimen, maxDepth, threshold ) ;
+
+}
+
+void Octree::clearProcessBits( UCHAR* node, int height )
+{
+ int i;
+
+ if ( height == 0 )
+ {
+ // Leaf cell,
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ setOutProcess( node, i ) ;
+ }
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ clearProcessBits( getChild( node, count ), height - 1 ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+
+/*
+void Octree::floodFill( UCHAR* node, int st[3], int len, int height, int threshold )
+{
+ int i, j;
+
+ if ( height == 0 )
+ {
+ // Leaf cell,
+ int par, inp ;
+
+ // Test if the leaf has intersection edges
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ par = getEdgeParity( node, i ) ;
+ inp = isInProcess( node, i ) ;
+
+ if ( par == 1 && inp == 0 )
+ {
+ // Intersection edge, hasn't been processed
+ // Let's start filling
+ GridQueue* queue = new GridQueue() ;
+ int total = 1 ;
+
+ // Set to in process
+ int mst[3] ;
+ mst[0] = st[0] + vertmap[edgemap[i][0]][0] * len ;
+ mst[1] = st[1] + vertmap[edgemap[i][0]][1] * len ;
+ mst[2] = st[2] + vertmap[edgemap[i][0]][2] * len;
+ int mdir = i / 4 ;
+ setInProcessAll( mst, mdir ) ;
+
+ // Put this edge into queue
+ queue->pushQueue( mst, mdir ) ;
+
+ // Queue processing
+ int nst[3], dir ;
+ while ( queue->popQueue( nst, dir ) == 1 )
+ {
+ // dc_printf("nst: %d %d %d, dir: %d\n", nst[0]/mindimen, nst[1]/mindimen, nst[2]/mindimen, dir) ;
+ // locations
+ int stMask[3][3] = {
+ { 0, 0 - len, 0 - len },
+ { 0 - len, 0, 0 - len },
+ { 0 - len, 0 - len, 0 }
+ };
+ int cst[2][3] ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ cst[0][j] = nst[j] ;
+ cst[1][j] = nst[j] + stMask[ dir ][ j ] ;
+ }
+
+ // cells
+ UCHAR* cs[2] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ cs[ j ] = locateLeaf( cst[j] ) ;
+ }
+
+ // Middle sign
+ int s = getSign( cs[0], 0 ) ;
+
+ // Masks
+ int fcCells[4] = {1,0,1,0};
+ int fcEdges[3][4][3] = {
+ {{9,2,11},{8,1,10},{5,1,7},{4,2,6}},
+ {{10,6,11},{8,5,9},{1,5,3},{0,6,2}},
+ {{6,10,7},{4,9,5},{2,9,3},{0,10,1}}
+ };
+
+ // Search for neighboring connected intersection edges
+ for ( int find = 0 ; find < 4 ; find ++ )
+ {
+ int cind = fcCells[find] ;
+ int eind, edge ;
+ if ( s == 0 )
+ {
+ // Original order
+ for ( eind = 0 ; eind < 3 ; eind ++ )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+ else
+ {
+ // Inverse order
+ for ( eind = 2 ; eind >= 0 ; eind -- )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+
+ if ( eind == 3 || eind == -1 )
+ {
+ dc_printf("Wrong! this is not a consistent sign. %d\n", eind );
+ }
+ else
+ {
+ int est[3] ;
+ est[0] = cst[cind][0] + vertmap[edgemap[edge][0]][0] * len ;
+ est[1] = cst[cind][1] + vertmap[edgemap[edge][0]][1] * len ;
+ est[2] = cst[cind][2] + vertmap[edgemap[edge][0]][2] * len ;
+ int edir = edge / 4 ;
+
+ if ( isInProcess( cs[cind], edge ) == 0 )
+ {
+ setInProcessAll( est, edir ) ;
+ queue->pushQueue( est, edir ) ;
+ // dc_printf("Pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ total ++ ;
+ }
+ else
+ {
+ // dc_printf("Processed, not pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ }
+ }
+
+ }
+
+ }
+
+ dc_printf("Size of component: %d ", total) ;
+
+ if ( total > threshold )
+ {
+ dc_printf("Maintained.\n") ;
+ continue ;
+ }
+ dc_printf("Less then %d, removing...\n", threshold) ;
+
+ // We have to remove this noise
+
+ // Flip parity
+ // setOutProcessAll( mst, mdir ) ;
+ flipParityAll( mst, mdir ) ;
+
+ // Put this edge into queue
+ queue->pushQueue( mst, mdir ) ;
+
+ // Queue processing
+ while ( queue->popQueue( nst, dir ) == 1 )
+ {
+ // dc_printf("nst: %d %d %d, dir: %d\n", nst[0]/mindimen, nst[1]/mindimen, nst[2]/mindimen, dir) ;
+ // locations
+ int stMask[3][3] = {
+ { 0, 0 - len, 0 - len },
+ { 0 - len, 0, 0 - len },
+ { 0 - len, 0 - len, 0 }
+ };
+ int cst[2][3] ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ cst[0][j] = nst[j] ;
+ cst[1][j] = nst[j] + stMask[ dir ][ j ] ;
+ }
+
+ // cells
+ UCHAR* cs[2] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ cs[ j ] = locateLeaf( cst[j] ) ;
+ }
+
+ // Middle sign
+ int s = getSign( cs[0], 0 ) ;
+
+ // Masks
+ int fcCells[4] = {1,0,1,0};
+ int fcEdges[3][4][3] = {
+ {{9,2,11},{8,1,10},{5,1,7},{4,2,6}},
+ {{10,6,11},{8,5,9},{1,5,3},{0,6,2}},
+ {{6,10,7},{4,9,5},{2,9,3},{0,10,1}}
+ };
+
+ // Search for neighboring connected intersection edges
+ for ( int find = 0 ; find < 4 ; find ++ )
+ {
+ int cind = fcCells[find] ;
+ int eind, edge ;
+ if ( s == 0 )
+ {
+ // Original order
+ for ( eind = 0 ; eind < 3 ; eind ++ )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( isInProcess( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+ else
+ {
+ // Inverse order
+ for ( eind = 2 ; eind >= 0 ; eind -- )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( isInProcess( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+
+ if ( eind == 3 || eind == -1 )
+ {
+ dc_printf("Wrong! this is not a consistent sign. %d\n", eind );
+ }
+ else
+ {
+ int est[3] ;
+ est[0] = cst[cind][0] + vertmap[edgemap[edge][0]][0] * len ;
+ est[1] = cst[cind][1] + vertmap[edgemap[edge][0]][1] * len ;
+ est[2] = cst[cind][2] + vertmap[edgemap[edge][0]][2] * len ;
+ int edir = edge / 4 ;
+
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ flipParityAll( est, edir ) ;
+ queue->pushQueue( est, edir ) ;
+ // dc_printf("Pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ total ++ ;
+ }
+ else
+ {
+ // dc_printf("Processed, not pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ }
+ }
+
+ }
+
+ }
+
+ }
+ }
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ len >>= 1 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ floodFill( getChild( node, count ), nst, len, height - 1, threshold ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+*/
+
+int Octree::floodFill( UCHAR* node, int st[3], int len, int height, int threshold )
+{
+ int i, j;
+ int maxtotal = 0 ;
+
+ if ( height == 0 )
+ {
+ // Leaf cell,
+ int par, inp ;
+
+ // Test if the leaf has intersection edges
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ par = getEdgeParity( node, i ) ;
+ inp = isInProcess( node, i ) ;
+
+ if ( par == 1 && inp == 0 )
+ {
+ // Intersection edge, hasn't been processed
+ // Let's start filling
+ GridQueue* queue = new GridQueue() ;
+ int total = 1 ;
+
+ // Set to in process
+ int mst[3] ;
+ mst[0] = st[0] + vertmap[edgemap[i][0]][0] * len ;
+ mst[1] = st[1] + vertmap[edgemap[i][0]][1] * len ;
+ mst[2] = st[2] + vertmap[edgemap[i][0]][2] * len;
+ int mdir = i / 4 ;
+ setInProcessAll( mst, mdir ) ;
+
+ // Put this edge into queue
+ queue->pushQueue( mst, mdir ) ;
+
+ // Queue processing
+ int nst[3], dir ;
+ while ( queue->popQueue( nst, dir ) == 1 )
+ {
+ // dc_printf("nst: %d %d %d, dir: %d\n", nst[0]/mindimen, nst[1]/mindimen, nst[2]/mindimen, dir) ;
+ // locations
+ int stMask[3][3] = {
+ { 0, 0 - len, 0 - len },
+ { 0 - len, 0, 0 - len },
+ { 0 - len, 0 - len, 0 }
+ };
+ int cst[2][3] ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ cst[0][j] = nst[j] ;
+ cst[1][j] = nst[j] + stMask[ dir ][ j ] ;
+ }
+
+ // cells
+ UCHAR* cs[2] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ cs[ j ] = locateLeaf( cst[j] ) ;
+ }
+
+ // Middle sign
+ int s = getSign( cs[0], 0 ) ;
+
+ // Masks
+ int fcCells[4] = {1,0,1,0};
+ int fcEdges[3][4][3] = {
+ {{9,2,11},{8,1,10},{5,1,7},{4,2,6}},
+ {{10,6,11},{8,5,9},{1,5,3},{0,6,2}},
+ {{6,10,7},{4,9,5},{2,9,3},{0,10,1}}
+ };
+
+ // Search for neighboring connected intersection edges
+ for ( int find = 0 ; find < 4 ; find ++ )
+ {
+ int cind = fcCells[find] ;
+ int eind, edge ;
+ if ( s == 0 )
+ {
+ // Original order
+ for ( eind = 0 ; eind < 3 ; eind ++ )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+ else
+ {
+ // Inverse order
+ for ( eind = 2 ; eind >= 0 ; eind -- )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+
+ if ( eind == 3 || eind == -1 )
+ {
+ dc_printf("Wrong! this is not a consistent sign. %d\n", eind );
+ }
+ else
+ {
+ int est[3] ;
+ est[0] = cst[cind][0] + vertmap[edgemap[edge][0]][0] * len ;
+ est[1] = cst[cind][1] + vertmap[edgemap[edge][0]][1] * len ;
+ est[2] = cst[cind][2] + vertmap[edgemap[edge][0]][2] * len ;
+ int edir = edge / 4 ;
+
+ if ( isInProcess( cs[cind], edge ) == 0 )
+ {
+ setInProcessAll( est, edir ) ;
+ queue->pushQueue( est, edir ) ;
+ // dc_printf("Pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ total ++ ;
+ }
+ else
+ {
+ // dc_printf("Processed, not pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ }
+ }
+
+ }
+
+ }
+
+ dc_printf("Size of component: %d ", total) ;
+
+ if ( threshold == 0 )
+ {
+ // Measuring stage
+ if ( total > maxtotal )
+ {
+ maxtotal = total ;
+ }
+ dc_printf(".\n") ;
+ continue ;
+ }
+
+ if ( total >= threshold )
+ {
+ dc_printf("Maintained.\n") ;
+ continue ;
+ }
+ dc_printf("Less then %d, removing...\n", threshold) ;
+
+ // We have to remove this noise
+
+ // Flip parity
+ // setOutProcessAll( mst, mdir ) ;
+ flipParityAll( mst, mdir ) ;
+
+ // Put this edge into queue
+ queue->pushQueue( mst, mdir ) ;
+
+ // Queue processing
+ while ( queue->popQueue( nst, dir ) == 1 )
+ {
+ // dc_printf("nst: %d %d %d, dir: %d\n", nst[0]/mindimen, nst[1]/mindimen, nst[2]/mindimen, dir) ;
+ // locations
+ int stMask[3][3] = {
+ { 0, 0 - len, 0 - len },
+ { 0 - len, 0, 0 - len },
+ { 0 - len, 0 - len, 0 }
+ };
+ int cst[2][3] ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ cst[0][j] = nst[j] ;
+ cst[1][j] = nst[j] + stMask[ dir ][ j ] ;
+ }
+
+ // cells
+ UCHAR* cs[2] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ cs[ j ] = locateLeaf( cst[j] ) ;
+ }
+
+ // Middle sign
+ int s = getSign( cs[0], 0 ) ;
+
+ // Masks
+ int fcCells[4] = {1,0,1,0};
+ int fcEdges[3][4][3] = {
+ {{9,2,11},{8,1,10},{5,1,7},{4,2,6}},
+ {{10,6,11},{8,5,9},{1,5,3},{0,6,2}},
+ {{6,10,7},{4,9,5},{2,9,3},{0,10,1}}
+ };
+
+ // Search for neighboring connected intersection edges
+ for ( int find = 0 ; find < 4 ; find ++ )
+ {
+ int cind = fcCells[find] ;
+ int eind, edge ;
+ if ( s == 0 )
+ {
+ // Original order
+ for ( eind = 0 ; eind < 3 ; eind ++ )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( isInProcess( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+ else
+ {
+ // Inverse order
+ for ( eind = 2 ; eind >= 0 ; eind -- )
+ {
+ edge = fcEdges[dir][find][eind] ;
+ if ( isInProcess( cs[cind], edge ) == 1 )
+ {
+ break ;
+ }
+ }
+ }
+
+ if ( eind == 3 || eind == -1 )
+ {
+ dc_printf("Wrong! this is not a consistent sign. %d\n", eind );
+ }
+ else
+ {
+ int est[3] ;
+ est[0] = cst[cind][0] + vertmap[edgemap[edge][0]][0] * len ;
+ est[1] = cst[cind][1] + vertmap[edgemap[edge][0]][1] * len ;
+ est[2] = cst[cind][2] + vertmap[edgemap[edge][0]][2] * len ;
+ int edir = edge / 4 ;
+
+ if ( getEdgeParity( cs[cind], edge ) == 1 )
+ {
+ flipParityAll( est, edir ) ;
+ queue->pushQueue( est, edir ) ;
+ // dc_printf("Pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ total ++ ;
+ }
+ else
+ {
+ // dc_printf("Processed, not pushed: est: %d %d %d, edir: %d\n", est[0]/len, est[1]/len, est[2]/len, edir) ;
+ }
+ }
+
+ }
+
+ }
+
+ }
+ }
+
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ len >>= 1 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ int d = floodFill( getChild( node, count ), nst, len, height - 1, threshold ) ;
+ if ( d > maxtotal)
+ {
+ maxtotal = d ;
+ }
+ count ++ ;
+ }
+ }
+ }
+
+
+ return maxtotal ;
+
+}
+
+void Octree::writeOut()
+{
+ int numQuads = 0 ;
+ int numVertices = 0 ;
+ int numEdges = 0 ;
+#ifdef USE_HERMIT
+ countIntersection( root, maxDepth, numQuads, numVertices, numEdges ) ;
+#else
+ countIntersection( root, maxDepth, numQuads, numVertices ) ;
+ numEdges = numQuads * 3 / 2 ;
+#endif
+ dc_printf("Vertices counted: %d Polys counted: %d \n", numVertices, numQuads ) ;
+ output_mesh = alloc_output(numVertices, numQuads);
+ int offset = 0 ;
+ int st[3] = { 0, 0, 0 } ;
+
+ // First, output vertices
+ offset = 0 ;
+ actualVerts = 0 ;
+ actualQuads = 0 ;
+#ifdef USE_HERMIT
+ generateMinimizer( root, st, dimen, maxDepth, offset ) ;
+ cellProcContour( this->root, 0, maxDepth ) ;
+ dc_printf("Vertices written: %d Quads written: %d \n", offset, actualQuads ) ;
+#else
+ writeVertex( root, st, dimen, maxDepth, offset, out ) ;
+ writeQuad( root, st, dimen, maxDepth, out ) ;
+ dc_printf("Vertices written: %d Triangles written: %d \n", offset, actualQuads ) ;
+#endif
+}
+
+#if 0
+void Octree::writePLY( char* fname )
+{
+ int numQuads = 0 ;
+ int numVertices = 0 ;
+ int numEdges = 0 ;
+#ifdef USE_HERMIT
+ countIntersection( root, maxDepth, numQuads, numVertices, numEdges ) ;
+#else
+ countIntersection( root, maxDepth, numQuads, numVertices ) ;
+ numEdges = numQuads * 3 / 2 ;
+#endif
+ // int euler = numVertices + numQuads - numEdges ;
+ // int genus = ( 2 - euler ) / 2 ;
+ // dc_printf("%d vertices %d quads %d edges\n", numVertices, numQuads, numEdges ) ;
+ // dc_printf("Genus: %d Euler: %d\n", genus, euler ) ;
+
+ FILE* fout = fopen ( fname, "wb" ) ;
+ dc_printf("Vertices counted: %d Polys counted: %d \n", numVertices, numQuads ) ;
+ PLYWriter::writeHeader( fout, numVertices, numQuads ) ;
+ int offset = 0 ;
+ int st[3] = { 0, 0, 0 } ;
+
+ // First, output vertices
+ offset = 0 ;
+ actualVerts = 0 ;
+ actualQuads = 0 ;
+#ifdef USE_HERMIT
+ generateMinimizer( root, st, dimen, maxDepth, offset, fout ) ;
+#ifdef TESTMANIFOLD
+ testfout = fopen("test.txt", "w");
+ fprintf(testfout, "{");
+#endif
+ cellProcContour( this->root, 0, maxDepth, fout ) ;
+#ifdef TESTMANIFOLD
+ fprintf(testfout, "}");
+ fclose( testfout ) ;
+#endif
+ dc_printf("Vertices written: %d Quads written: %d \n", offset, actualQuads ) ;
+#else
+ writeVertex( root, st, dimen, maxDepth, offset, fout ) ;
+ writeQuad( root, st, dimen, maxDepth, fout ) ;
+ dc_printf("Vertices written: %d Triangles written: %d \n", offset, actualQuads ) ;
+#endif
+
+
+ fclose( fout ) ;
+}
+#endif
+
+void Octree::writeOctree( char* fname )
+{
+ FILE* fout = fopen ( fname, "wb" ) ;
+
+ int sized = ( 1 << maxDepth ) ;
+ fwrite( &sized, sizeof( int ), 1, fout ) ;
+ writeOctree( fout, root, maxDepth ) ;
+ dc_printf("Grid dimension: %d\n", sized ) ;
+
+
+ fclose( fout ) ;
+}
+void Octree::writeOctree( FILE* fout, UCHAR* node, int depth )
+{
+ char type ;
+ if ( depth > 0 )
+ {
+ type = 0 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+
+ // Get sign at the center
+ char sg = (char) getSign( getChild( node, 0 ), depth - 1, 7 - getChildIndex( node, 0 ) ) ;
+
+ int t = 0 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ writeOctree( fout, getChild( node, t ), depth - 1 ) ;
+ t ++ ;
+ }
+ else
+ {
+ type = 1 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+ fwrite( &sg, sizeof( char ), 1, fout ) ;
+ }
+ }
+ }
+ else
+ {
+ type = 2 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+ fwrite( &(node[2]), sizeof ( UCHAR ), 1, fout );
+ }
+}
+
+#ifdef USE_HERMIT
+#if 0
+void Octree::writeOctreeGeom( char* fname )
+{
+ FILE* fout = fopen ( fname, "wb" ) ;
+
+ // Write header
+ char header[]="SOG.Format 1.0";
+ int nlen = 128 - 4 * 4 - strlen(header) - 1 ;
+ char* header2 = new char[ nlen ];
+ for ( int i = 0 ; i < nlen ; i ++ )
+ {
+ header2[i] = '\0';
+ }
+ fwrite( header, sizeof( char ), strlen(header) + 1, fout ) ;
+ fwrite( origin, sizeof( float ), 3, fout ) ;
+ fwrite( &range, sizeof( float ), 1, fout ) ;
+ fwrite( header2, sizeof( char ), nlen, fout ) ;
+
+
+ int sized = ( 1 << maxDepth ) ;
+ int st[3] = {0,0,0};
+ fwrite( &sized, sizeof( int ), 1, fout ) ;
+
+ writeOctreeGeom( fout, root, st, dimen, maxDepth ) ;
+ dc_printf("Grid dimension: %d\n", sized ) ;
+
+
+ fclose( fout ) ;
+}
+#endif
+void Octree::writeOctreeGeom( FILE* fout, UCHAR* node, int st[3], int len, int depth )
+{
+ char type ;
+ if ( depth > 0 )
+ {
+ type = 0 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+
+ // Get sign at the center
+ char sg = (char) getSign( getChild( node, 0 ), depth - 1, 7 - getChildIndex( node, 0 ) ) ;
+
+ int t = 0 ;
+ len >>= 1 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+ writeOctreeGeom( fout, getChild( node, t ), nst, len, depth - 1 ) ;
+ t ++ ;
+ }
+ else
+ {
+ type = 1 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+ fwrite( &sg, sizeof( char ), 1, fout ) ;
+ }
+ }
+ }
+ else
+ {
+ type = 2 ;
+ fwrite( &type, sizeof( char ), 1, fout ) ;
+ fwrite( &(node[2]), sizeof ( UCHAR ), 1, fout );
+
+ // Compute minimizer
+ // First, find minimizer
+ float rvalue[3] ;
+ rvalue[0] = (float) st[0] + len / 2 ;
+ rvalue[1] = (float) st[1] + len / 2 ;
+ rvalue[2] = (float) st[2] + len / 2 ;
+ computeMinimizer( node, st, len, rvalue ) ;
+
+ // Update
+ // float flen = len * range / dimen ;
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ rvalue[ j ] = rvalue[ j ] * range / dimen + origin[ j ] ;
+ }
+
+ fwrite( rvalue, sizeof ( float ), 3, fout );
+ }
+}
+#endif
+
+#ifdef USE_HERMIT
+void Octree::writeDCF( char* fname )
+{
+ FILE* fout = fopen ( fname, "wb" ) ;
+
+ // Writing out version
+ char version[10] = "multisign";
+ fwrite ( &version, sizeof ( char ), 10, fout );
+
+ // Writing out size
+ int sized = ( 1 << maxDepth ) ;
+ fwrite( &sized, sizeof( int ), 1, fout ) ;
+ fwrite( &sized, sizeof( int ), 1, fout ) ;
+ fwrite( &sized, sizeof( int ), 1, fout ) ;
+
+ int st[3] = {0, 0, 0} ;
+ writeDCF( fout, root, maxDepth, st, dimen ) ;
+
+ dc_printf("Grid dimension: %d\n", sized ) ;
+ fclose( fout ) ;
+}
+
+void Octree::writeDCF( FILE* fout, UCHAR* node, int height, int st[3], int len )
+{
+ nodetype type ;
+ if ( height > 0 )
+ {
+ type = 0 ;
+ len >>= 1 ;
+ fwrite( &type, sizeof( nodetype ), 1, fout ) ;
+
+ // Get sign at the center
+ signtype sg = 1 - (signtype) getSign( getChild( node, 0 ), height - 1, 7 - getChildIndex( node, 0 ) ) ;
+
+ int t = 0 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+
+ writeDCF( fout, getChild( node, t ), height - 1, nst, len ) ;
+ t ++ ;
+ }
+ else
+ {
+ type = 1 ;
+ fwrite( &type, sizeof( nodetype ), 1, fout ) ;
+ fwrite ( &(sg), sizeof ( signtype ), 1, fout );
+ }
+ }
+ }
+ else
+ {
+ type = 2 ;
+ fwrite( &type, sizeof( nodetype ), 1, fout ) ;
+
+ // Write signs
+ signtype sgn[8] ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ sgn[ i ] = 1 - (signtype) getSign( node, i ) ;
+ }
+ fwrite (sgn, sizeof (signtype), 8, fout );
+
+ // Write edge data
+ float pts[12], norms[12][3] ;
+ int parity[12] ;
+ fillEdgeOffsetsNormals( node, st, len, pts, norms, parity ) ;
+
+ numtype zero = 0, one = 1 ;
+ for ( int i = 0 ; i < 12 ; i ++ )
+ {
+ int par = getEdgeParity( node, i ) ;
+ // Let's check first
+ if ( par )
+ {
+ if ( sgn[ edgemap[i][0] ] == sgn[ edgemap[i][1] ] )
+ {
+ dc_printf("Wrong! Parity: %d Sign: %d %d\n", parity[i], sgn[ edgemap[i][0] ], sgn[ edgemap[i][1] ]);
+ exit(0) ;
+ }
+ if ( parity[ i ] == 0 )
+ {
+ dc_printf("Wrong! No intersection found.\n");
+ exit(0) ;
+ }
+ fwrite( &one, sizeof ( numtype ) , 1, fout ) ;
+ fwrite( &(pts[i]), sizeof( float ), 1, fout ) ;
+ fwrite( norms[i], sizeof( float ), 3, fout ) ;
+
+ }
+ else
+ {
+ if ( sgn[ edgemap[i][0] ] != sgn[ edgemap[i][1] ] )
+ {
+ dc_printf("Wrong! Parity: %d Sign: %d %d\n", parity[i], sgn[ edgemap[i][0] ], sgn[ edgemap[i][1] ]);
+ exit(0) ;
+ }
+ fwrite ( &zero, sizeof ( numtype ) , 1, fout );
+ }
+ }
+ }
+}
+#endif
+
+
+void Octree::writeOpenEdges( FILE* fout )
+{
+ // Total number of rings
+ fprintf( fout, "%d\n", numRings ) ;
+ dc_printf("Number of rings to write: %d\n", numRings) ;
+
+ // Write each ring
+ PathList* tlist = ringList ;
+ for ( int i = 0 ; i < numRings ; i ++ )
+ {
+ fprintf(fout, "%d\n", tlist->length) ;
+ // dc_printf("Ring length: %d\n", tlist->length ) ;
+ PathElement* cur = tlist->head ;
+ for ( int j = 0 ; j < tlist->length ; j ++ )
+ {
+ float cent[3] ;
+ float flen = mindimen * range / dimen ;
+ for ( int k = 0 ; k < 3 ; k ++ )
+ {
+ cent[ k ] = cur->pos[ k ] * range / dimen + origin[ k ] + flen / 2 ;
+ }
+ fprintf(fout, "%f %f %f\n", cent[0], cent[1], cent[2]) ;
+ cur = cur->next ;
+ }
+
+ tlist = tlist->next ;
+ }
+}
+
+#ifndef USE_HERMIT
+void Octree::countIntersection( UCHAR* node, int height, int& nquad, int& nvert )
+{
+ if ( height > 0 )
+ {
+ int total = getNumChildren( node ) ;
+ for ( int i = 0 ; i < total ; i ++ )
+ {
+ countIntersection( getChild( node, i ), height - 1, nquad, nvert ) ;
+ }
+ }
+ else
+ {
+ int mask = getSignMask( node ) ;
+ nvert += getNumEdges2( node ) ;
+ nquad += cubes->getNumTriangle( mask ) ;
+
+ }
+}
+
+void Octree::writeVertex( UCHAR* node, int st[3], int len, int height, int& offset, FILE* fout )
+{
+ int i ;
+
+ if ( height == 0 )
+ {
+ // Leaf cell, generate
+ int emap[] = { 0, 4, 8 } ;
+ for ( int i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getEdgeParity( node, emap[i] ) )
+ {
+ // Get intersection location
+ int count = getEdgeCount( node, i ) ;
+ float off = getEdgeOffset( node, count ) ;
+
+ float rvalue[3] ;
+ rvalue[0] = (float) st[0] ;
+ rvalue[1] = (float) st[1] ;
+ rvalue[2] = (float) st[2] ;
+ rvalue[i] += off * mindimen ;
+
+ // Update
+ float fnst[3] ;
+ float flen = len * range / dimen ;
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ rvalue[ j ] = rvalue[ j ] * range / dimen + origin[ j ] ;
+ fnst[ j ] = st[ j ] * range / dimen + origin[ j ] ;
+ }
+
+ if ( this->outType == 0 )
+ {
+ fprintf( fout, "%f %f %f\n", rvalue[0], rvalue[1], rvalue[2] ) ;
+ }
+ else if ( this->outType == 1 )
+ {
+ PLYWriter::writeVertex( fout, rvalue ) ;
+ }
+
+ // Store the index
+ setEdgeIntersectionIndex( node, count, offset ) ;
+ offset ++ ;
+ }
+ }
+
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ len >>= 1 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ writeVertex( getChild( node, count ), nst, len, height - 1, offset, fout ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+
+void Octree::writeQuad( UCHAR* node, int st[3], int len, int height, FILE* fout )
+{
+ int i ;
+ if ( height == 0 )
+ {
+ int mask = getSignMask( node ) ;
+ int num = cubes->getNumTriangle( mask ) ;
+ int indices[12] ;
+ fillEdgeIntersectionIndices( node, st, len, indices ) ;
+ int einds[3], ind[3] ;
+
+ //int flag1 = 0 ;
+ //int flag2 = 0 ;
+ for ( i = 0 ; i < num ; i ++ )
+ {
+ int color = 0 ;
+ cubes->getTriangle( mask, i, einds ) ;
+ // dc_printf("(%d %d %d) ", einds[0], einds[1], einds[2] ) ;
+
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ ind[j] = indices[ einds[j] ] ;
+ /*
+ if ( ind[j] == 78381 )
+ {
+ flag1 = 1 ;
+ }
+ if ( ind[j] == 78384 )
+ {
+ flag2 = 1 ;
+ }
+ */
+ }
+
+ if ( this->outType == 0 )
+ {
+ // OFF
+ int numpoly = ( color ? -3 : 3 ) ;
+ fprintf(fout, "%d %d %d %d\n", numpoly, ind[0], ind[1], ind[2] ) ;
+ actualQuads ++ ;
+ }
+ else if ( this->outType == 1 )
+ {
+ // PLY
+ PLYWriter::writeFace( fout, 3, ind ) ;
+ actualQuads ++ ;
+ }
+ }
+
+ /*
+ if (flag1 && flag2)
+ {
+ dc_printf("%d\n", mask);
+ cubes->printTriangles( mask ) ;
+ }
+ */
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ len >>= 1 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ writeQuad( getChild( node, count ), nst, len, height - 1, fout ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+
+#endif
+
+
+#ifdef USE_HERMIT
+void Octree::countIntersection( UCHAR* node, int height, int& nedge, int& ncell, int& nface )
+{
+ if ( height > 0 )
+ {
+ int total = getNumChildren( node ) ;
+ for ( int i = 0 ; i < total ; i ++ )
+ {
+ countIntersection( getChild( node, i ), height - 1, nedge, ncell, nface ) ;
+ }
+ }
+ else
+ {
+ nedge += getNumEdges2( node ) ;
+
+ int smask = getSignMask( node ) ;
+
+ if(use_manifold)
+ {
+ int comps = manifold_table[ smask ].comps ;
+ ncell += comps ;
+ }
+ else {
+ if ( smask > 0 && smask < 255 )
+ {
+ ncell ++ ;
+ }
+ }
+
+ for ( int i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getFaceEdgeNum( node, i * 2 ) )
+ {
+ nface ++ ;
+ }
+ }
+ }
+}
+
+/* from http://eigen.tuxfamily.org/bz/show_bug.cgi?id=257 */
+template<typename _Matrix_Type_>
+void pseudoInverse(const _Matrix_Type_ &a,
+ _Matrix_Type_ &result,
+ double epsilon = std::numeric_limits<typename _Matrix_Type_::Scalar>::epsilon())
+{
+ Eigen::JacobiSVD< _Matrix_Type_ > svd = a.jacobiSvd(Eigen::ComputeFullU |
+ Eigen::ComputeFullV);
+
+ typename _Matrix_Type_::Scalar tolerance = epsilon * std::max(a.cols(),
+ a.rows()) *
+ svd.singularValues().array().abs().maxCoeff();
+
+ result = svd.matrixV() *
+ _Matrix_Type_((svd.singularValues().array().abs() >
+ tolerance).select(svd.singularValues().
+ array().inverse(), 0)).asDiagonal() *
+ svd.matrixU().adjoint();
+}
+
+void solve_least_squares(const float halfA[], const float b[],
+ const float midpoint[], float rvalue[])
+{
+ /* calculate pseudo-inverse */
+ Eigen::MatrixXf A(3, 3), pinv(3, 3);
+ A << halfA[0], halfA[1], halfA[2],
+ halfA[1], halfA[3], halfA[4],
+ halfA[2], halfA[4], halfA[5];
+ pseudoInverse(A, pinv);
+
+ Eigen::Vector3f b2(b), mp(midpoint), result;
+ b2 = b2 + A * -mp;
+ result = pinv * b2 + mp;
+
+ for(int i = 0; i < 3; i++)
+ rvalue[i] = result(i);
+}
+
+void minimize(float rvalue[3], float mp[3], const float pts[12][3],
+ const float norms[12][3], const int parity[12])
+{
+ float ata[6] = { 0, 0, 0, 0, 0, 0 };
+ float atb[3] = { 0, 0, 0 } ;
+ int ec = 0 ;
+
+ for ( int i = 0 ; i < 12 ; i ++ )
+ {
+ // if ( getEdgeParity( leaf, i) )
+ if ( parity[ i ] )
+ {
+ const float* norm = norms[i] ;
+ const float* p = pts[i] ;
+
+ // QEF
+ ata[ 0 ] += (float) ( norm[ 0 ] * norm[ 0 ] );
+ ata[ 1 ] += (float) ( norm[ 0 ] * norm[ 1 ] );
+ ata[ 2 ] += (float) ( norm[ 0 ] * norm[ 2 ] );
+ ata[ 3 ] += (float) ( norm[ 1 ] * norm[ 1 ] );
+ ata[ 4 ] += (float) ( norm[ 1 ] * norm[ 2 ] );
+ ata[ 5 ] += (float) ( norm[ 2 ] * norm[ 2 ] );
+
+ double pn = p[0] * norm[0] + p[1] * norm[1] + p[2] * norm[2] ;
+
+ atb[ 0 ] += (float) ( norm[ 0 ] * pn ) ;
+ atb[ 1 ] += (float) ( norm[ 1 ] * pn ) ;
+ atb[ 2 ] += (float) ( norm[ 2 ] * pn ) ;
+
+ // Minimizer
+ mp[0] += p[0] ;
+ mp[1] += p[1] ;
+ mp[2] += p[2] ;
+
+ ec ++ ;
+ }
+ }
+
+ if ( ec == 0 )
+ {
+ return ;
+ }
+ mp[0] /= ec ;
+ mp[1] /= ec ;
+ mp[2] /= ec ;
+
+ // Solve least squares
+ solve_least_squares(ata, atb, mp, rvalue);
+}
+
+void Octree::computeMinimizer( UCHAR* leaf, int st[3], int len, float rvalue[3] )
+{
+ // First, gather all edge intersections
+ float pts[12][3], norms[12][3] ;
+ // fillEdgeIntersections( leaf, st, len, pts, norms ) ;
+ int parity[12] ;
+ fillEdgeIntersections( leaf, st, len, pts, norms, parity ) ;
+
+ // Next, construct QEF and minimizer
+ float mp[3] = {0, 0, 0};
+ minimize(rvalue, mp, pts, norms, parity);
+
+ /* Restraining the location of the minimizer */
+ float nh1 = hermite_num * len ;
+ float nh2 = ( 1 + hermite_num ) * len ;
+ if((mode == DUALCON_MASS_POINT || mode == DUALCON_CENTROID) ||
+ ( rvalue[0] < st[0] - nh1 || rvalue[1] < st[1] - nh1 || rvalue[2] < st[2] - nh1 ||
+ rvalue[0] > st[0] + nh2 || rvalue[1] > st[1] + nh2 || rvalue[2] > st[2] + nh2 ))
+ {
+ if(mode == DUALCON_CENTROID) {
+ // Use centroids
+ rvalue[0] = (float) st[0] + len / 2 ;
+ rvalue[1] = (float) st[1] + len / 2 ;
+ rvalue[2] = (float) st[2] + len / 2 ;
+ }
+ else {
+ // Use mass point instead
+ rvalue[0] = mp[0] ;
+ rvalue[1] = mp[1] ;
+ rvalue[2] = mp[2] ;
+ }
+ }
+}
+
+void Octree::generateMinimizer( UCHAR* node, int st[3], int len, int height, int& offset )
+{
+ int i, j ;
+
+ if ( height == 0 )
+ {
+ // Leaf cell, generate
+
+ // First, find minimizer
+ float rvalue[3] ;
+ rvalue[0] = (float) st[0] + len / 2 ;
+ rvalue[1] = (float) st[1] + len / 2 ;
+ rvalue[2] = (float) st[2] + len / 2 ;
+ computeMinimizer( node, st, len, rvalue ) ;
+
+ // Update
+ //float fnst[3] ;
+ for ( j = 0 ; j < 3 ; j ++ )
+ {
+ rvalue[ j ] = rvalue[ j ] * range / dimen + origin[ j ] ;
+ //fnst[ j ] = st[ j ] * range / dimen + origin[ j ] ;
+ }
+
+ int mult = 0, smask = getSignMask( node ) ;
+
+ if(use_manifold)
+ {
+ mult = manifold_table[ smask ].comps ;
+ }
+ else
+ {
+ if ( smask > 0 && smask < 255 )
+ {
+ mult = 1 ;
+ }
+ }
+
+ for ( j = 0 ; j < mult ; j ++ )
+ {
+ add_vert(output_mesh, rvalue);
+ }
+
+ // Store the index
+ setMinimizerIndex( node, offset ) ;
+
+ offset += mult ;
+ }
+ else
+ {
+ // Internal cell, recur
+ int count = 0 ;
+ len >>= 1 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( hasChild( node, i ) )
+ {
+ int nst[3] ;
+ nst[0] = st[0] + vertmap[i][0] * len ;
+ nst[1] = st[1] + vertmap[i][1] * len ;
+ nst[2] = st[2] + vertmap[i][2] * len ;
+
+ generateMinimizer( getChild( node, count ), nst, len, height - 1, offset ) ;
+ count ++ ;
+ }
+ }
+ }
+}
+
+void Octree::processEdgeWrite( UCHAR* node[4], int depth[4], int maxdep, int dir )
+{
+ //int color = 0 ;
+
+ int i = 3 ;
+ {
+ if ( getEdgeParity( node[i], processEdgeMask[dir][i] ) )
+ {
+ int flip = 0 ;
+ int edgeind = processEdgeMask[dir][i] ;
+ if ( getSign( node[i], edgemap[ edgeind ][ 1 ] ) > 0 )
+ {
+ flip = 1 ;
+ }
+
+ int num = 0 ;
+ {
+ int ind[8];
+ if(use_manifold)
+ {
+ /* Deprecated
+ int ind[4] = {
+ getMinimizerIndex( node[0], processEdgeMask[dir][0] ),
+ getMinimizerIndex( node[1], processEdgeMask[dir][1] ),
+ getMinimizerIndex( node[3], processEdgeMask[dir][3] ),
+ getMinimizerIndex( node[2], processEdgeMask[dir][2] )
+ } ;
+ num = 4 ;
+ */
+ int vind[2] ;
+ int seq[4] = {0,1,3,2};
+ for ( int k = 0 ; k < 4 ; k ++ )
+ {
+ getMinimizerIndices( node[seq[k]], processEdgeMask[dir][seq[k]], vind ) ;
+ ind[num] = vind[0] ;
+ num ++ ;
+
+ if ( vind[1] != -1 )
+ {
+ ind[num] = vind[1] ;
+ num ++ ;
+ if ( flip == 0 )
+ {
+ ind[num-1] = vind[0] ;
+ ind[num-2] = vind[1] ;
+ }
+ }
+ }
+#ifdef TESTMANIFOLD
+ if ( num != 4 )
+ {
+ dc_printf("Polygon: %d\n", num);
+ }
+ for ( k = 0 ; k < num ; k ++ )
+ {
+ fprintf(testfout, "{%d,%d},", ind[k], ind[(k+1)%num] );
+ }
+#endif
+
+ /* we don't use the manifold option, but if it is
+ ever enabled again note that it can output
+ non-quads */
+ }
+ else {
+ if(flip) {
+ ind[0] = getMinimizerIndex( node[2] );
+ ind[1] = getMinimizerIndex( node[3] );
+ ind[2] = getMinimizerIndex( node[1] );
+ ind[3] = getMinimizerIndex( node[0] );
+ }
+ else {
+ ind[0] = getMinimizerIndex( node[0] );
+ ind[1] = getMinimizerIndex( node[1] );
+ ind[2] = getMinimizerIndex( node[3] );
+ ind[3] = getMinimizerIndex( node[2] );
+ }
+
+ add_quad(output_mesh, ind);
+ }
+ /*
+ if ( this->outType == 0 )
+ {
+ // OFF
+
+ num = ( color ? -num : num ) ;
+
+ fprintf(fout, "%d ", num);
+
+ if ( flip )
+ {
+ for ( int k = num - 1 ; k >= 0 ; k -- )
+ {
+ fprintf(fout, "%d ", ind[k] ) ;
+ }
+ }
+ else
+ {
+ for ( int k = 0 ; k < num ; k ++ )
+ {
+ fprintf(fout, "%d ", ind[k] ) ;
+ }
+ }
+
+ fprintf( fout, "\n") ;
+
+ actualQuads ++ ;
+ }
+ else if ( this->outType == 1 )
+ {
+ // PLY
+
+ if ( flip )
+ {
+ int tind[8];
+ for ( int k = num - 1 ; k >= 0 ; k -- )
+ {
+ tind[k] = ind[num-1-k] ;
+ }
+ // PLYWriter::writeFace( fout, num, tind ) ;
+ }
+ else
+ {
+ // PLYWriter::writeFace( fout, num, ind ) ;
+ }
+
+ actualQuads ++ ;
+ }*/
+ }
+ return ;
+ }
+ else
+ {
+ return ;
+ }
+ }
+}
+
+
+void Octree::edgeProcContour( UCHAR* node[4], int leaf[4], int depth[4], int maxdep, int dir )
+{
+ if ( ! ( node[0] && node[1] && node[2] && node[3] ) )
+ {
+ return ;
+ }
+ if ( leaf[0] && leaf[1] && leaf[2] && leaf[3] )
+ {
+ processEdgeWrite( node, depth, maxdep, dir ) ;
+ }
+ else
+ {
+ int i, j ;
+ UCHAR* chd[ 4 ][ 8 ] ;
+ for ( j = 0 ; j < 4 ; j ++ )
+ {
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ j ][ i ] = ((!leaf[j]) && hasChild( node[j], i ) )? getChild( node[j], getChildCount( node[j], i ) ) : NULL ;
+ }
+ }
+
+ // 2 edge calls
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] ;
+ for ( i = 0 ; i < 2 ; i ++ )
+ {
+ int c[ 4 ] = { edgeProcEdgeMask[ dir ][ i ][ 0 ],
+ edgeProcEdgeMask[ dir ][ i ][ 1 ],
+ edgeProcEdgeMask[ dir ][ i ][ 2 ],
+ edgeProcEdgeMask[ dir ][ i ][ 3 ] } ;
+
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ if ( leaf[j] )
+ {
+ le[j] = leaf[j] ;
+ ne[j] = node[j] ;
+ de[j] = depth[j] ;
+ }
+ else
+ {
+ le[j] = isLeaf( node[j], c[j] ) ;
+ ne[j] = chd[ j ][ c[j] ] ;
+ de[j] = depth[j] - 1 ;
+ }
+ }
+
+ edgeProcContour( ne, le, de, maxdep - 1, edgeProcEdgeMask[ dir ][ i ][ 4 ] ) ;
+ }
+
+ }
+}
+
+void Octree::faceProcContour( UCHAR* node[2], int leaf[2], int depth[2], int maxdep, int dir )
+{
+ if ( ! ( node[0] && node[1] ) )
+ {
+ return ;
+ }
+
+ if ( ! ( leaf[0] && leaf[1] ) )
+ {
+ int i, j ;
+ // Fill children nodes
+ UCHAR* chd[ 2 ][ 8 ] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ j ][ i ] = ((!leaf[j]) && hasChild( node[j], i )) ? getChild( node[j], getChildCount( node[j], i ) ) : NULL ;
+ }
+ }
+
+ // 4 face calls
+ UCHAR* nf[2] ;
+ int df[2] ;
+ int lf[2] ;
+ for ( i = 0 ; i < 4 ; i ++ )
+ {
+ int c[2] = { faceProcFaceMask[ dir ][ i ][ 0 ], faceProcFaceMask[ dir ][ i ][ 1 ] };
+ for ( int j = 0 ; j < 2 ; j ++ )
+ {
+ if ( leaf[j] )
+ {
+ lf[j] = leaf[j] ;
+ nf[j] = node[j] ;
+ df[j] = depth[j] ;
+ }
+ else
+ {
+ lf[j] = isLeaf( node[j], c[j] ) ;
+ nf[j] = chd[ j ][ c[j] ] ;
+ df[j] = depth[j] - 1 ;
+ }
+ }
+ faceProcContour( nf, lf, df, maxdep - 1, faceProcFaceMask[ dir ][ i ][ 2 ] ) ;
+ }
+
+ // 4 edge calls
+ int orders[2][4] = {{ 0, 0, 1, 1 }, { 0, 1, 0, 1 }} ;
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] ;
+
+ for ( i = 0 ; i < 4 ; i ++ )
+ {
+ int c[4] = { faceProcEdgeMask[ dir ][ i ][ 1 ], faceProcEdgeMask[ dir ][ i ][ 2 ],
+ faceProcEdgeMask[ dir ][ i ][ 3 ], faceProcEdgeMask[ dir ][ i ][ 4 ] };
+ int* order = orders[ faceProcEdgeMask[ dir ][ i ][ 0 ] ] ;
+
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ if ( leaf[order[j]] )
+ {
+ le[j] = leaf[order[j]] ;
+ ne[j] = node[order[j]] ;
+ de[j] = depth[order[j]] ;
+ }
+ else
+ {
+ le[j] = isLeaf( node[order[j]], c[j] ) ;
+ ne[j] = chd[ order[ j ] ][ c[j] ] ;
+ de[j] = depth[order[j]] - 1 ;
+ }
+ }
+
+ edgeProcContour( ne, le, de, maxdep - 1, faceProcEdgeMask[ dir ][ i ][ 5 ] ) ;
+ }
+ }
+}
+
+
+void Octree::cellProcContour( UCHAR* node, int leaf, int depth )
+{
+ if ( node == NULL )
+ {
+ return ;
+ }
+
+ if ( ! leaf )
+ {
+ int i ;
+
+ // Fill children nodes
+ UCHAR* chd[ 8 ] ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ i ] = ((!leaf) && hasChild( node, i )) ? getChild( node, getChildCount( node, i ) ) : NULL ;
+ }
+
+ // 8 Cell calls
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ cellProcContour( chd[ i ], isLeaf( node, i ), depth - 1 ) ;
+ }
+
+ // 12 face calls
+ UCHAR* nf[2] ;
+ int lf[2] ;
+ int df[2] = { depth - 1, depth - 1 } ;
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ int c[ 2 ] = { cellProcFaceMask[ i ][ 0 ], cellProcFaceMask[ i ][ 1 ] };
+
+ lf[0] = isLeaf( node, c[0] ) ;
+ lf[1] = isLeaf( node, c[1] ) ;
+
+ nf[0] = chd[ c[0] ] ;
+ nf[1] = chd[ c[1] ] ;
+
+ faceProcContour( nf, lf, df, depth - 1, cellProcFaceMask[ i ][ 2 ] ) ;
+ }
+
+ // 6 edge calls
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] = { depth - 1, depth - 1, depth - 1, depth - 1 } ;
+ for ( i = 0 ; i < 6 ; i ++ )
+ {
+ int c[ 4 ] = { cellProcEdgeMask[ i ][ 0 ], cellProcEdgeMask[ i ][ 1 ], cellProcEdgeMask[ i ][ 2 ], cellProcEdgeMask[ i ][ 3 ] };
+
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ le[j] = isLeaf( node, c[j] ) ;
+ ne[j] = chd[ c[j] ] ;
+ }
+
+ edgeProcContour( ne, le, de, depth - 1, cellProcEdgeMask[ i ][ 4 ] ) ;
+ }
+ }
+
+}
+
+#endif
+
+
+
+void Octree::processEdgeParity( UCHAR* node[4], int depth[4], int maxdep, int dir )
+{
+ int con = 0 ;
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ // Minimal cell
+ // if ( op == 0 )
+ {
+ if ( getEdgeParity( node[i], processEdgeMask[dir][i] ) )
+ {
+ con = 1 ;
+ break ;
+ }
+ }
+ }
+
+ if ( con == 1 )
+ {
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ setEdge( node[ i ], processEdgeMask[dir][i] ) ;
+ }
+ }
+
+}
+
+void Octree::edgeProcParity( UCHAR* node[4], int leaf[4], int depth[4], int maxdep, int dir )
+{
+ if ( ! ( node[0] && node[1] && node[2] && node[3] ) )
+ {
+ return ;
+ }
+ if ( leaf[0] && leaf[1] && leaf[2] && leaf[3] )
+ {
+ processEdgeParity( node, depth, maxdep, dir ) ;
+ }
+ else
+ {
+ int i, j ;
+ UCHAR* chd[ 4 ][ 8 ] ;
+ for ( j = 0 ; j < 4 ; j ++ )
+ {
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ j ][ i ] = ((!leaf[j]) && hasChild( node[j], i ) )? getChild( node[j], getChildCount( node[j], i ) ) : NULL ;
+ }
+ }
+
+ // 2 edge calls
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] ;
+ for ( i = 0 ; i < 2 ; i ++ )
+ {
+ int c[ 4 ] = { edgeProcEdgeMask[ dir ][ i ][ 0 ],
+ edgeProcEdgeMask[ dir ][ i ][ 1 ],
+ edgeProcEdgeMask[ dir ][ i ][ 2 ],
+ edgeProcEdgeMask[ dir ][ i ][ 3 ] } ;
+
+ // int allleaf = 1 ;
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+
+ if ( leaf[j] )
+ {
+ le[j] = leaf[j] ;
+ ne[j] = node[j] ;
+ de[j] = depth[j] ;
+ }
+ else
+ {
+ le[j] = isLeaf( node[j], c[j] ) ;
+ ne[j] = chd[ j ][ c[j] ] ;
+ de[j] = depth[j] - 1 ;
+
+ }
+
+ }
+
+ edgeProcParity( ne, le, de, maxdep - 1, edgeProcEdgeMask[ dir ][ i ][ 4 ] ) ;
+ }
+
+ }
+}
+
+void Octree::faceProcParity( UCHAR* node[2], int leaf[2], int depth[2], int maxdep, int dir )
+{
+ if ( ! ( node[0] && node[1] ) )
+ {
+ return ;
+ }
+
+ if ( ! ( leaf[0] && leaf[1] ) )
+ {
+ int i, j ;
+ // Fill children nodes
+ UCHAR* chd[ 2 ][ 8 ] ;
+ for ( j = 0 ; j < 2 ; j ++ )
+ {
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ j ][ i ] = ((!leaf[j]) && hasChild( node[j], i )) ? getChild( node[j], getChildCount( node[j], i ) ) : NULL ;
+ }
+ }
+
+ // 4 face calls
+ UCHAR* nf[2] ;
+ int df[2] ;
+ int lf[2] ;
+ for ( i = 0 ; i < 4 ; i ++ )
+ {
+ int c[2] = { faceProcFaceMask[ dir ][ i ][ 0 ], faceProcFaceMask[ dir ][ i ][ 1 ] };
+ for ( int j = 0 ; j < 2 ; j ++ )
+ {
+ if ( leaf[j] )
+ {
+ lf[j] = leaf[j] ;
+ nf[j] = node[j] ;
+ df[j] = depth[j] ;
+ }
+ else
+ {
+ lf[j] = isLeaf( node[j], c[j] ) ;
+ nf[j] = chd[ j ][ c[j] ] ;
+ df[j] = depth[j] - 1 ;
+ }
+ }
+ faceProcParity( nf, lf, df, maxdep - 1, faceProcFaceMask[ dir ][ i ][ 2 ] ) ;
+ }
+
+ // 4 edge calls
+ int orders[2][4] = {{ 0, 0, 1, 1 }, { 0, 1, 0, 1 }} ;
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] ;
+
+ for ( i = 0 ; i < 4 ; i ++ )
+ {
+ int c[4] = { faceProcEdgeMask[ dir ][ i ][ 1 ], faceProcEdgeMask[ dir ][ i ][ 2 ],
+ faceProcEdgeMask[ dir ][ i ][ 3 ], faceProcEdgeMask[ dir ][ i ][ 4 ] };
+ int* order = orders[ faceProcEdgeMask[ dir ][ i ][ 0 ] ] ;
+
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ if ( leaf[order[j]] )
+ {
+ le[j] = leaf[order[j]] ;
+ ne[j] = node[order[j]] ;
+ de[j] = depth[order[j]] ;
+ }
+ else
+ {
+ le[j] = isLeaf( node[order[j]], c[j] ) ;
+ ne[j] = chd[ order[ j ] ][ c[j] ] ;
+ de[j] = depth[order[j]] - 1 ;
+ }
+ }
+
+ edgeProcParity( ne, le, de, maxdep - 1, faceProcEdgeMask[ dir ][ i ][ 5 ] ) ;
+ }
+ }
+}
+
+
+void Octree::cellProcParity( UCHAR* node, int leaf, int depth )
+{
+ if ( node == NULL )
+ {
+ return ;
+ }
+
+ if ( ! leaf )
+ {
+ int i ;
+
+ // Fill children nodes
+ UCHAR* chd[ 8 ] ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ chd[ i ] = ((!leaf) && hasChild( node, i )) ? getChild( node, getChildCount( node, i ) ) : NULL ;
+ }
+
+ // 8 Cell calls
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ cellProcParity( chd[ i ], isLeaf( node, i ), depth - 1 ) ;
+ }
+
+ // 12 face calls
+ UCHAR* nf[2] ;
+ int lf[2] ;
+ int df[2] = { depth - 1, depth - 1 } ;
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ int c[ 2 ] = { cellProcFaceMask[ i ][ 0 ], cellProcFaceMask[ i ][ 1 ] };
+
+ lf[0] = isLeaf( node, c[0] ) ;
+ lf[1] = isLeaf( node, c[1] ) ;
+
+ nf[0] = chd[ c[0] ] ;
+ nf[1] = chd[ c[1] ] ;
+
+ faceProcParity( nf, lf, df, depth - 1, cellProcFaceMask[ i ][ 2 ] ) ;
+ }
+
+ // 6 edge calls
+ UCHAR* ne[4] ;
+ int le[4] ;
+ int de[4] = { depth - 1, depth - 1, depth - 1, depth - 1 } ;
+ for ( i = 0 ; i < 6 ; i ++ )
+ {
+ int c[ 4 ] = { cellProcEdgeMask[ i ][ 0 ], cellProcEdgeMask[ i ][ 1 ], cellProcEdgeMask[ i ][ 2 ], cellProcEdgeMask[ i ][ 3 ] };
+
+ for ( int j = 0 ; j < 4 ; j ++ )
+ {
+ le[j] = isLeaf( node, c[j] ) ;
+ ne[j] = chd[ c[j] ] ;
+ }
+
+ edgeProcParity( ne, le, de, depth - 1, cellProcEdgeMask[ i ][ 4 ] ) ;
+ }
+ }
+
+}
+
+/* definitions for global arrays */
+const int edgemask[3] = {5, 3, 6};
+
+const int faceMap[6][4] = {
+ {4, 8, 5, 9},
+ {6, 10, 7, 11},
+ {0, 8, 1, 10},
+ {2, 9, 3, 11},
+ {0, 4, 2, 6},
+ {1, 5, 3, 7}
+};
+
+const int cellProcFaceMask[12][3] = {
+ {0, 4, 0},
+ {1, 5, 0},
+ {2, 6, 0},
+ {3, 7, 0},
+ {0, 2, 1},
+ {4, 6, 1},
+ {1, 3, 1},
+ {5, 7, 1},
+ {0, 1, 2},
+ {2, 3, 2},
+ {4, 5, 2},
+ {6, 7, 2}
+};
+
+const int cellProcEdgeMask[6][5] = {
+ {0, 1, 2, 3, 0},
+ {4, 5, 6, 7, 0},
+ {0, 4, 1, 5, 1},
+ {2, 6, 3, 7, 1},
+ {0, 2, 4, 6, 2},
+ {1, 3, 5, 7, 2}
+};
+
+const int faceProcFaceMask[3][4][3] = {
+ {{4, 0, 0},
+ {5, 1, 0},
+ {6, 2, 0},
+ {7, 3, 0}},
+ {{2, 0, 1},
+ {6, 4, 1},
+ {3, 1, 1},
+ {7, 5, 1}},
+ {{1, 0, 2},
+ {3, 2, 2},
+ {5, 4, 2},
+ {7, 6, 2}}
+};
+
+const int faceProcEdgeMask[3][4][6] = {
+ {{1, 4, 0, 5, 1, 1},
+ {1, 6, 2, 7, 3, 1},
+ {0, 4, 6, 0, 2, 2},
+ {0, 5, 7, 1, 3, 2}},
+ {{0, 2, 3, 0, 1, 0},
+ {0, 6, 7, 4, 5, 0},
+ {1, 2, 0, 6, 4, 2},
+ {1, 3, 1, 7, 5, 2}},
+ {{1, 1, 0, 3, 2, 0},
+ {1, 5, 4, 7, 6, 0},
+ {0, 1, 5, 0, 4, 1},
+ {0, 3, 7, 2, 6, 1}}
+};
+
+const int edgeProcEdgeMask[3][2][5] = {
+ {{3, 2, 1, 0, 0},
+ {7, 6, 5, 4, 0}},
+ {{5, 1, 4, 0, 1},
+ {7, 3, 6, 2, 1}},
+ {{6, 4, 2, 0, 2},
+ {7, 5, 3, 1, 2}},
+};
+
+const int processEdgeMask[3][4] = {
+ {3, 2, 1, 0},
+ {7, 5, 6, 4},
+ {11, 10, 9, 8}
+};
+
+const int dirCell[3][4][3] = {
+ {{0, -1, -1},
+ {0, -1, 0},
+ {0, 0, -1},
+ {0, 0, 0}},
+ {{-1, 0, -1},
+ {-1, 0, 0},
+ {0, 0, -1},
+ {0, 0, 0}},
+ {{-1, -1, 0},
+ {-1, 0, 0},
+ {0, -1, 0},
+ {0, 0, 0}}
+};
+
+const int dirEdge[3][4] = {
+ {3, 2, 1, 0},
+ {7, 6, 5, 4},
+ {11, 10, 9, 8}
+};
diff --git a/intern/dualcon/intern/octree.h b/intern/dualcon/intern/octree.h
new file mode 100644
index 00000000000..7b5a626bddc
--- /dev/null
+++ b/intern/dualcon/intern/octree.h
@@ -0,0 +1,1596 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Tao Ju
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef OCTREE_H
+#define OCTREE_H
+
+#include <stdio.h>
+#include <math.h>
+#include "GeoCommon.h"
+#include "Projections.h"
+#include "ModelReader.h"
+#include "MemoryAllocator.h"
+#include "cubes.h"
+#include "Queue.h"
+#include "manifold_table.h"
+#include "dualcon.h"
+
+/**
+ * Main class and structures for scan-convertion, sign-generation,
+ * and surface reconstruction.
+ *
+ * @author Tao Ju
+ */
+
+
+/* Global defines */
+// Uncomment to see debug information
+// #define IN_DEBUG_MODE
+
+// Uncomment to see more output messages during repair
+// #define IN_VERBOSE_MODE
+
+/* Set scan convert params */
+// Uncomment to use Dual Contouring on Hermit representation
+// for better sharp feature reproduction, but more mem is required
+// The number indicates how far do we allow the minimizer to shoot
+// outside the cell
+#define USE_HERMIT 1.0f
+
+#ifdef USE_HERMIT
+//#define CINDY
+#endif
+
+///#define QIANYI
+
+//#define TESTMANIFOLD
+
+
+/* Set output options */
+// Comment out to prevent writing output files
+#define OUTPUT_REPAIRED
+
+
+/* Set node bytes */
+#ifdef USE_HERMIT
+#define EDGE_BYTES 16
+#define EDGE_FLOATS 4
+#else
+#define EDGE_BYTES 4
+#define EDGE_FLOATS 1
+#endif
+
+#define CINDY_BYTES 0
+
+/*#define LEAF_EXTRA_BYTES FLOOD_BYTES + CINDY_BYTES
+
+#ifdef USE_HERMIT
+#define LEAF_NODE_BYTES 7 + LEAF_EXTRA_BYTES
+#else
+#define LEAF_NODE_BYTES 3 + LEAF_EXTRA_BYTES
+#endif*/
+
+#define INTERNAL_NODE_BYTES 2
+#define POINTER_BYTES 8
+#define FLOOD_FILL_BYTES 2
+
+#define signtype short
+#define nodetype int
+#define numtype int
+
+/* Global variables */
+extern const int edgemask[3];
+extern const int faceMap[6][4];
+extern const int cellProcFaceMask[12][3];
+extern const int cellProcEdgeMask[6][5];
+extern const int faceProcFaceMask[3][4][3];
+extern const int edgeProcEdgeMask[3][2][5];
+extern const int faceProcEdgeMask[3][4][6];
+extern const int processEdgeMask[3][4];
+extern const int dirCell[3][4][3];
+extern const int dirEdge[3][4];
+
+/**
+ * Structures for detecting/patching open cycles on the dual surface
+ */
+
+struct PathElement
+{
+ // Origin
+ int pos[3] ;
+
+ // link
+ PathElement* next ;
+};
+
+struct PathList
+{
+ // Head
+ PathElement* head ;
+ PathElement* tail ;
+
+ // Length of the list
+ int length ;
+
+ // Next list
+ PathList* next ;
+};
+
+
+/**
+ * Class for building and processing an octree
+ */
+class Octree
+{
+public:
+ /* Public members */
+
+ /// Memory allocators
+ VirtualMemoryAllocator * alloc[ 9 ] ;
+ VirtualMemoryAllocator * leafalloc[ 4 ] ;
+
+ /// Root node
+ UCHAR* root ;
+
+ /// Model reader
+ ModelReader* reader ;
+
+ /// Marching cubes table
+ Cubes* cubes ;
+
+ /// Length of grid
+ int dimen ;
+ int mindimen, minshift ;
+
+ /// Maximum depth
+ int maxDepth ;
+
+ /// The lower corner of the bounding box and the size
+ float origin[3];
+ float range;
+
+ /// Counting information
+ int nodeCount ;
+ int nodeSpace ;
+ int nodeCounts[ 9 ] ;
+
+ int actualQuads, actualVerts ;
+
+ PathList* ringList ;
+
+ int maxTrianglePerCell ;
+ int outType ; // 0 for OFF, 1 for PLY, 2 for VOL
+
+ // For flood filling
+ int use_flood_fill;
+ float thresh ;
+
+ int use_manifold;
+
+ // testing
+ FILE* testfout ;
+
+ float hermite_num;
+
+ DualConMode mode;
+
+ int leaf_node_bytes;
+ int leaf_extra_bytes;
+ int flood_bytes;
+
+public:
+ /**
+ * Construtor
+ */
+ Octree ( ModelReader* mr,
+ DualConAllocOutput alloc_output_func,
+ DualConAddVert add_vert_func,
+ DualConAddQuad add_quad_func,
+ DualConFlags flags, DualConMode mode, int depth,
+ float threshold, float hermite_num ) ;
+
+ /**
+ * Destructor
+ */
+ ~Octree ( ) ;
+
+ /**
+ * Scan convert
+ */
+ void scanConvert() ;
+
+ void *getOutputMesh() { return output_mesh; }
+
+private:
+ /* Helper functions */
+
+ /**
+ * Initialize memory allocators
+ */
+ void initMemory ( ) ;
+
+ /**
+ * Release memory
+ */
+ void freeMemory ( ) ;
+
+ /**
+ * Print memory usage
+ */
+ void printMemUsage( ) ;
+
+
+ /**
+ * Methods to set / restore minimum edges
+ */
+ void resetMinimalEdges( ) ;
+
+ void cellProcParity ( UCHAR* node, int leaf, int depth ) ;
+ void faceProcParity ( UCHAR* node[2], int leaf[2], int depth[2], int maxdep, int dir ) ;
+ void edgeProcParity ( UCHAR* node[4], int leaf[4], int depth[4], int maxdep, int dir ) ;
+
+ void processEdgeParity ( UCHAR* node[4], int depths[4], int maxdep, int dir ) ;
+
+ /**
+ * Add triangles to the tree
+ */
+ void addTrian ( );
+ void addTrian ( Triangle* trian, int triind );
+ UCHAR* addTrian ( UCHAR* node, Projections* p, int height );
+
+ /**
+ * Method to update minimizer in a cell: update edge intersections instead
+ */
+ UCHAR* updateCell( UCHAR* node, Projections* p ) ;
+
+ /* Routines to detect and patch holes */
+ int numRings ;
+ int totRingLengths ;
+ int maxRingLength ;
+
+ /**
+ * Entry routine.
+ */
+ void trace ( ) ;
+ /**
+ * Trace the given node, find patches and fill them in
+ */
+ UCHAR* trace ( UCHAR* node, int* st, int len, int depth, PathList*& paths ) ;
+ /**
+ * Look for path on the face and add to paths
+ */
+ void findPaths ( UCHAR* node[2], int leaf[2], int depth[2], int* st[2], int maxdep, int dir, PathList*& paths ) ;
+ /**
+ * Combine two list1 and list2 into list1 using connecting paths list3,
+ * while closed paths are appended to rings
+ */
+ void combinePaths ( PathList*& list1, PathList* list2, PathList* paths, PathList*& rings ) ;
+ /**
+ * Helper function: combine current paths in list1 and list2 to a single path and append to list3
+ */
+ PathList* combineSinglePath ( PathList*& head1, PathList* pre1, PathList*& list1, PathList*& head2, PathList* pre2, PathList*& list2 ) ;
+
+ /**
+ * Functions to patch rings in a node
+ */
+ UCHAR* patch ( UCHAR* node, int st[3], int len, PathList* rings ) ;
+ UCHAR* patchSplit ( UCHAR* node, int st[3], int len, PathList* rings, int dir, PathList*& nrings1, PathList*& nrings2 ) ;
+ UCHAR* patchSplitSingle ( UCHAR* node, int st[3], int len, PathElement* head, int dir, PathList*& nrings1, PathList*& nrings2 ) ;
+ UCHAR* connectFace ( UCHAR* node, int st[3], int len, int dir, PathElement* f1, PathElement* f2 ) ;
+ UCHAR* locateCell( UCHAR* node, int st[3], int len, int ori[3], int dir, int side, UCHAR*& rleaf, int rst[3], int& rlen ) ;
+ void compressRing ( PathElement*& ring ) ;
+ void getFacePoint( PathElement* leaf, int dir, int& x, int& y, float& p, float& q ) ;
+ UCHAR* patchAdjacent( UCHAR* node, int len, int st1[3], UCHAR* leaf1, int st2[3], UCHAR* leaf2, int walkdir, int inc, int dir, int side, float alpha ) ;
+ int findPair ( PathElement* head, int pos, int dir, PathElement*& pre1, PathElement*& pre2 ) ;
+ int getSide( PathElement* e, int pos, int dir ) ;
+ int isEqual( PathElement* e1, PathElement* e2 ) ;
+ void preparePrimalEdgesMask( UCHAR* node ) ;
+ void testFacePoint( PathElement* e1, PathElement* e2 ) ;
+
+ /**
+ * Path-related functions
+ */
+ void deletePath ( PathList*& head, PathList* pre, PathList*& curr ) ;
+ void printPath( PathList* path ) ;
+ void printPath( PathElement* path ) ;
+ void printElement( PathElement* ele ) ;
+ void printPaths( PathList* path ) ;
+ void checkElement ( PathElement* ele ) ;
+ void checkPath( PathElement* path ) ;
+
+
+ /**
+ * Routines to build signs to create a partitioned volume
+ * (after patching rings)
+ */
+ void buildSigns( ) ;
+ void buildSigns( unsigned char table[], UCHAR* node, int isLeaf, int sg, int rvalue[8] ) ;
+
+ /************************************************************************/
+ /* To remove disconnected components */
+ /************************************************************************/
+ void floodFill( ) ;
+ void clearProcessBits( UCHAR* node, int height ) ;
+ int floodFill( UCHAR* node, int st[3], int len, int height, int threshold ) ;
+
+ /**
+ * Write out polygon file
+ */
+ void writeOut();
+ void writeOFF ( char* fname ) ;
+ void writePLY ( char* fname ) ;
+ void writeOpenEdges( FILE* fout ) ;
+ void writeAllEdges( FILE* fout, int mode ) ;
+ void writeAllEdges( FILE* fout, UCHAR* node, int height, int st[3], int len, int mode ) ;
+
+ void writeOctree( char* fname ) ;
+ void writeOctree( FILE* fout, UCHAR* node, int depth ) ;
+#ifdef USE_HERMIT
+ void writeOctreeGeom( char* fname ) ;
+ void writeOctreeGeom( FILE* fout, UCHAR* node, int st[3], int len, int depth ) ;
+#endif
+#ifdef USE_HERMIT
+ void writeDCF ( char* fname ) ;
+ void writeDCF ( FILE* fout, UCHAR* node, int height, int st[3], int len ) ;
+ void countEdges ( UCHAR* node, int height, int& nedge, int mode ) ;
+ void countIntersection( UCHAR* node, int height, int& nedge, int& ncell, int& nface ) ;
+ void generateMinimizer( UCHAR* node, int st[3], int len, int height, int& offset ) ;
+ void computeMinimizer( UCHAR* leaf, int st[3], int len, float rvalue[3] ) ;
+ /**
+ * Traversal functions to generate polygon model
+ * op: 0 for counting, 1 for writing OBJ, 2 for writing OFF, 3 for writing PLY
+ */
+ void cellProcContour ( UCHAR* node, int leaf, int depth ) ;
+ void faceProcContour ( UCHAR* node[2], int leaf[2], int depth[2], int maxdep, int dir ) ;
+ void edgeProcContour ( UCHAR* node[4], int leaf[4], int depth[4], int maxdep, int dir ) ;
+ void processEdgeWrite ( UCHAR* node[4], int depths[4], int maxdep, int dir ) ;
+#else
+ void countIntersection( UCHAR* node, int height, int& nquad, int& nvert ) ;
+ void writeVertex( UCHAR* node, int st[3], int len, int height, int& offset, FILE* fout ) ;
+ void writeQuad( UCHAR* node, int st[3], int len, int height, FILE* fout ) ;
+#endif
+
+ /**
+ * Write out original model
+ */
+ void writeModel( char* fname ) ;
+
+ /************************************************************************/
+ /* Write out original vertex tags */
+ /************************************************************************/
+#ifdef CINDY
+ void writeTags( char* fname ) ;
+ void readVertices( ) ;
+ void readVertex( UCHAR* node, int st[3], int len, int height, float v[3], int index ) ;
+ void outputTags( UCHAR* node, int height, FILE* fout ) ;
+ void clearCindyBits( UCHAR* node, int height ) ;
+#endif
+
+ /* output callbacks/data */
+ DualConAllocOutput alloc_output;
+ DualConAddVert add_vert;
+ DualConAddQuad add_quad;
+ void *output_mesh;
+
+private:
+ /************ Operators for all nodes ************/
+
+ /**
+ * Bits order
+ *
+ * Leaf node:
+ * Byte 0,1 (0-11): edge parity
+ * Byte 1 (4,5,6): mask of primary edges intersections stored
+ * Byte 1 (7): in flood fill mode, whether the cell is in process
+ * Byte 2 (0-8): signs
+ * Byte 3 (or 5) -- : edge intersections ( 4 bytes per inter, or 12 bytes if USE_HERMIT )
+ * Byte 3,4: in coloring mode, the mask for edges
+ *
+ * Internal node:
+ * Byte 0: child mask
+ * Byte 1: leaf child mask
+ */
+
+ /// Lookup table
+ int numChildrenTable[ 256 ] ;
+ int childrenCountTable[ 256 ][ 8 ] ;
+ int childrenIndexTable[ 256 ][ 8 ] ;
+ int numEdgeTable[ 8 ] ;
+ int edgeCountTable[ 8 ][ 3 ] ;
+
+ /// Build up lookup table
+ void buildTable ( )
+ {
+ for ( int i = 0 ; i < 256 ; i ++ )
+ {
+ numChildrenTable[ i ] = 0 ;
+ int count = 0 ;
+ for ( int j = 0 ; j < 8 ; j ++ )
+ {
+ numChildrenTable[ i ] += ( ( i >> j ) & 1 ) ;
+ childrenCountTable[ i ][ j ] = count ;
+ childrenIndexTable[ i ][ count ] = j ;
+ count += ( ( i >> j ) & 1 ) ;
+ }
+ }
+
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ numEdgeTable[ i ] = 0 ;
+ int count = 0 ;
+ for ( int j = 0 ; j < 3 ; j ++ )
+ {
+ numEdgeTable[ i ] += ( ( i >> j ) & 1 ) ;
+ edgeCountTable[ i ][ j ] = count ;
+ count += ( ( i >> j ) & 1 ) ;
+ }
+ }
+ };
+
+ int getSign( UCHAR* node, int height, int index )
+ {
+ if ( height == 0 )
+ {
+ return getSign( node, index ) ;
+ }
+ else
+ {
+ if ( hasChild( node, index ) )
+ {
+ return getSign( getChild( node, getChildCount( node, index ) ), height - 1, index ) ;
+ }
+ else
+ {
+ return getSign( getChild( node, 0 ), height - 1, 7 - getChildIndex( node, 0 ) ) ;
+ }
+ }
+ }
+
+ /************ Operators for leaf nodes ************/
+
+ void printInfo( int st[3] )
+ {
+ printf("INFO AT: %d %d %d\n", st[0] >> minshift, st[1] >>minshift, st[2] >> minshift ) ;
+ UCHAR* leaf = locateLeafCheck( st ) ;
+ if ( leaf == NULL )
+ {
+ printf("Leaf not exists!\n") ;
+ }
+ else
+ {
+ printInfo( leaf ) ;
+ }
+ }
+
+ void printInfo( UCHAR* leaf )
+ {
+ /*
+ printf("Edge mask: ") ;
+ for ( int i = 0 ; i < 12 ; i ++ )
+ {
+ printf("%d ", getEdgeParity( leaf, i ) ) ;
+ }
+ printf("\n") ;
+ printf("Stored edge mask: ") ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ printf("%d ", getStoredEdgesParity( leaf, i ) ) ;
+ }
+ printf("\n") ;
+ */
+ printf("Sign mask: ") ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ printf("%d ", getSign( leaf, i ) ) ;
+ }
+ printf("\n") ;
+
+ }
+
+ /// Retrieve signs
+ int getSign ( UCHAR* leaf, int index )
+ {
+ return (( leaf[2] >> index ) & 1 );
+ };
+
+ /// Set sign
+ void setSign ( UCHAR* leaf, int index )
+ {
+ leaf[2] |= ( 1 << index ) ;
+ };
+
+ void setSign ( UCHAR* leaf, int index, int sign )
+ {
+ leaf[2] &= ( ~ ( 1 << index ) ) ;
+ leaf[2] |= ( ( sign & 1 ) << index ) ;
+ };
+
+ int getSignMask( UCHAR* leaf )
+ {
+ return leaf[2] ;
+ }
+
+ void setInProcessAll( int st[3], int dir )
+ {
+ int nst[3], eind ;
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ nst[0] = st[0] + dirCell[dir][i][0] * mindimen ;
+ nst[1] = st[1] + dirCell[dir][i][1] * mindimen ;
+ nst[2] = st[2] + dirCell[dir][i][2] * mindimen ;
+ eind = dirEdge[dir][i] ;
+
+ UCHAR* cell = locateLeafCheck( nst ) ;
+ if ( cell == NULL )
+ {
+ printf("Wrong!\n") ;
+ }
+ setInProcess( cell, eind ) ;
+ }
+ }
+
+ void flipParityAll( int st[3], int dir )
+ {
+ int nst[3], eind ;
+ for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ nst[0] = st[0] + dirCell[dir][i][0] * mindimen ;
+ nst[1] = st[1] + dirCell[dir][i][1] * mindimen ;
+ nst[2] = st[2] + dirCell[dir][i][2] * mindimen ;
+ eind = dirEdge[dir][i] ;
+
+ UCHAR* cell = locateLeaf( nst ) ;
+ flipEdge( cell, eind ) ;
+ }
+ }
+
+ void setInProcess( UCHAR* leaf, int eind )
+ {
+ // leaf[1] |= ( 1 << 7 ) ;
+ ( (USHORT*) (leaf + leaf_node_bytes - (flood_bytes + CINDY_BYTES)))[0] |= ( 1 << eind ) ;
+ }
+ void setOutProcess( UCHAR* leaf, int eind )
+ {
+ // leaf[1] &= ( ~ ( 1 << 7 ) ) ;
+ ( (USHORT*) (leaf + leaf_node_bytes - (flood_bytes + CINDY_BYTES)))[0] &= ( ~ ( 1 << eind ) ) ;
+ }
+
+ int isInProcess( UCHAR* leaf, int eind )
+ {
+ //int a = ( ( leaf[1] >> 7 ) & 1 ) ;
+ int a = ( ( ( (USHORT*) (leaf + leaf_node_bytes - (flood_bytes + CINDY_BYTES)))[0] >> eind ) & 1 ) ;
+ return a ;
+ }
+
+#ifndef USE_HERMIT
+ /// Set minimizer index
+ void setEdgeIntersectionIndex( UCHAR* leaf, int count, int index )
+ {
+ ((int *)( leaf + leaf_node_bytes ))[ count ] = index ;
+ }
+
+ /// Get minimizer index
+ int getEdgeIntersectionIndex( UCHAR* leaf, int count )
+ {
+ return ((int *)( leaf + leaf_node_bytes ))[ count ] ;
+ }
+
+ /// Get all intersection indices associated with a cell
+ void fillEdgeIntersectionIndices( UCHAR* leaf, int st[3], int len, int inds[12] )
+ {
+ int i ;
+
+ // The three primal edges are easy
+ int pmask[3] = { 0, 4, 8 } ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getEdgeParity( leaf, pmask[i] ) )
+ {
+ inds[pmask[i]] = getEdgeIntersectionIndex( leaf, getEdgeCount( leaf, i ) ) ;
+ }
+ }
+
+ // 3 face adjacent cubes
+ int fmask[3][2] = {{6,10},{2,9},{1,5}} ;
+ int femask[3][2] = {{1,2},{0,2},{0,1}} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ int e1 = getEdgeParity( leaf, fmask[i][0] ) ;
+ int e2 = getEdgeParity( leaf, fmask[i][1] ) ;
+ if ( e1 || e2 )
+ {
+ int nst[3] = {st[0], st[1], st[2]} ;
+ nst[ i ] += len ;
+ // int nstt[3] = {0, 0, 0} ;
+ // nstt[ i ] += 1 ;
+ UCHAR* node = locateLeaf( nst ) ;
+
+ if ( e1 )
+ {
+ inds[ fmask[i][0] ] = getEdgeIntersectionIndex( node, getEdgeCount( node, femask[i][0] ) ) ;
+ }
+ if ( e2 )
+ {
+ inds[ fmask[i][1] ] = getEdgeIntersectionIndex( node, getEdgeCount( node, femask[i][1] ) ) ;
+ }
+ }
+ }
+
+ // 3 edge adjacent cubes
+ int emask[3] = {3, 7, 11} ;
+ int eemask[3] = {0, 1, 2} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getEdgeParity( leaf, emask[i] ) )
+ {
+ int nst[3] = {st[0] + len, st[1] + len, st[2] + len} ;
+ nst[ i ] -= len ;
+ // int nstt[3] = {1, 1, 1} ;
+ // nstt[ i ] -= 1 ;
+ UCHAR* node = locateLeaf( nst ) ;
+
+ inds[ emask[i] ] = getEdgeIntersectionIndex( node, getEdgeCount( node, eemask[i] ) ) ;
+ }
+ }
+ }
+
+
+#endif
+
+ /// Generate signs at the corners from the edge parity
+ void generateSigns ( UCHAR* leaf, UCHAR table[], int start )
+ {
+ leaf[2] = table[ ( ((USHORT *) leaf)[ 0 ] ) & ( ( 1 << 12 ) - 1 ) ] ;
+
+ if ( ( start ^ leaf[2] ) & 1 )
+ {
+ leaf[2] = ~ ( leaf[2] ) ;
+ }
+ }
+
+ /// Get edge parity
+ int getEdgeParity( UCHAR* leaf, int index )
+ {
+ int a = ( ( ((USHORT *) leaf)[ 0 ] >> index ) & 1 ) ;
+ return a ;
+ };
+
+ /// Get edge parity on a face
+ int getFaceParity ( UCHAR* leaf, int index )
+ {
+ int a = getEdgeParity( leaf, faceMap[ index ][ 0 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 1 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 2 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 3 ] ) ;
+ return ( a & 1 ) ;
+ }
+ int getFaceEdgeNum ( UCHAR* leaf, int index )
+ {
+ int a = getEdgeParity( leaf, faceMap[ index ][ 0 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 1 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 2 ] ) +
+ getEdgeParity( leaf, faceMap[ index ][ 3 ] ) ;
+ return a ;
+ }
+
+ /// Set edge parity
+ void flipEdge( UCHAR* leaf, int index )
+ {
+ ((USHORT *) leaf)[ 0 ] ^= ( 1 << index ) ;
+ };
+ /// Set 1
+ void setEdge( UCHAR* leaf, int index )
+ {
+ ((USHORT *) leaf)[ 0 ] |= ( 1 << index ) ;
+ };
+ /// Set 0
+ void resetEdge( UCHAR* leaf, int index )
+ {
+ ((USHORT *) leaf)[ 0 ] &= ( ~ ( 1 << index ) ) ;
+ };
+
+ /// Flipping with a new intersection offset
+ void createPrimalEdgesMask( UCHAR* leaf )
+ {
+ int mask = (( leaf[0] & 1 ) | ( (leaf[0] >> 3) & 2 ) | ( (leaf[1] & 1) << 2 ) ) ;
+ leaf[1] |= ( mask << 4 ) ;
+
+ }
+
+ void setStoredEdgesParity( UCHAR* leaf, int pindex )
+ {
+ leaf[1] |= ( 1 << ( 4 + pindex ) ) ;
+ }
+ int getStoredEdgesParity( UCHAR* leaf, int pindex )
+ {
+ return ( ( leaf[1] >> ( 4 + pindex ) ) & 1 ) ;
+ }
+
+ UCHAR* flipEdge( UCHAR* leaf, int index, float alpha )
+ {
+ flipEdge( leaf, index ) ;
+
+ if ( ( index & 3 ) == 0 )
+ {
+ int ind = index / 4 ;
+ if ( getEdgeParity( leaf, index ) && ! getStoredEdgesParity( leaf, ind ) )
+ {
+ // Create a new node
+ int num = getNumEdges( leaf ) + 1 ;
+ setStoredEdgesParity( leaf, ind ) ;
+ int count = getEdgeCount( leaf, ind ) ;
+ UCHAR* nleaf = createLeaf( num ) ;
+ for ( int i = 0 ; i < leaf_node_bytes ; i ++ )
+ {
+ nleaf[i] = leaf[i] ;
+ }
+
+ setEdgeOffset( nleaf, alpha, count ) ;
+
+ if ( num > 1 )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+ float * npts = ( float * ) ( nleaf + leaf_node_bytes ) ;
+ for ( int i = 0 ; i < count ; i ++ )
+ {
+ for ( int j = 0 ; j < EDGE_FLOATS ; j ++ )
+ {
+ npts[i * EDGE_FLOATS + j] = pts[i * EDGE_FLOATS + j] ;
+ }
+ }
+ for ( int i = count + 1 ; i < num ; i ++ )
+ {
+ for ( int j = 0 ; j < EDGE_FLOATS ; j ++ )
+ {
+ npts[i * EDGE_FLOATS + j] = pts[ (i - 1) * EDGE_FLOATS + j] ;
+ }
+ }
+ }
+
+
+ removeLeaf( num-1, leaf ) ;
+ leaf = nleaf ;
+ }
+ }
+
+ return leaf ;
+ };
+
+ /// Update parent link
+ void updateParent( UCHAR* node, int len, int st[3], UCHAR* leaf )
+ {
+ // First, locate the parent
+ int count ;
+ UCHAR* parent = locateParent( node, len, st, count ) ;
+
+ // UPdate
+ setChild( parent, count, leaf ) ;
+ }
+
+ void updateParent( UCHAR* node, int len, int st[3] )
+ {
+ if ( len == dimen )
+ {
+ root = node ;
+ return ;
+ }
+
+ // First, locate the parent
+ int count ;
+ UCHAR* parent = locateParent( len, st, count ) ;
+
+ // UPdate
+ setChild( parent, count, node ) ;
+ }
+
+ /// Find edge intersection on a given edge
+ int getEdgeIntersectionByIndex( int st[3], int index, float pt[3], int check )
+ {
+ // First, locat the leaf
+ UCHAR* leaf ;
+ if ( check )
+ {
+ leaf = locateLeafCheck( st ) ;
+ }
+ else
+ {
+ leaf = locateLeaf( st ) ;
+ }
+
+ if ( leaf && getStoredEdgesParity( leaf, index ) )
+ {
+ float off = getEdgeOffset( leaf, getEdgeCount( leaf, index ) ) ;
+ pt[0] = (float) st[0] ;
+ pt[1] = (float) st[1] ;
+ pt[2] = (float) st[2] ;
+ pt[index] += off * mindimen ;
+
+ return 1 ;
+ }
+ else
+ {
+ return 0 ;
+ }
+ }
+
+ /// Retrieve number of edges intersected
+ int getPrimalEdgesMask( UCHAR* leaf )
+ {
+ // return (( leaf[0] & 1 ) | ( (leaf[0] >> 3) & 2 ) | ( (leaf[1] & 1) << 2 ) ) ;
+ return ( ( leaf[1] >> 4 ) & 7 ) ;
+ }
+
+ int getPrimalEdgesMask2( UCHAR* leaf )
+ {
+ return (( leaf[0] & 1 ) | ( (leaf[0] >> 3) & 2 ) | ( (leaf[1] & 1) << 2 ) ) ;
+ }
+
+ /// Get the count for a primary edge
+ int getEdgeCount( UCHAR* leaf, int index )
+ {
+ return edgeCountTable[ getPrimalEdgesMask( leaf ) ][ index ] ;
+ }
+ int getNumEdges( UCHAR* leaf )
+ {
+ return numEdgeTable[ getPrimalEdgesMask( leaf ) ] ;
+ }
+
+ int getNumEdges2( UCHAR* leaf )
+ {
+ return numEdgeTable[ getPrimalEdgesMask2( leaf ) ] ;
+ }
+
+ /// Set edge intersection
+ void setEdgeOffset( UCHAR* leaf, float pt, int count )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+#ifdef USE_HERMIT
+ pts[ EDGE_FLOATS * count ] = pt ;
+ pts[ EDGE_FLOATS * count + 1 ] = 0 ;
+ pts[ EDGE_FLOATS * count + 2 ] = 0 ;
+ pts[ EDGE_FLOATS * count + 3 ] = 0 ;
+#else
+ pts[ count ] = pt ;
+#endif
+ }
+
+ /// Set multiple edge intersections
+ void setEdgeOffsets( UCHAR* leaf, float pt[3], int len )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+ for ( int i = 0 ; i < len ; i ++ )
+ {
+ pts[i] = pt[i] ;
+ }
+ }
+
+ /// Retrieve edge intersection
+ float getEdgeOffset( UCHAR* leaf, int count )
+ {
+#ifdef USE_HERMIT
+ return (( float * ) ( leaf + leaf_node_bytes ))[ 4 * count ] ;
+#else
+ return (( float * ) ( leaf + leaf_node_bytes ))[ count ] ;
+#endif
+ }
+
+ /// Update method
+ UCHAR* updateEdgeOffsets( UCHAR* leaf, int oldlen, int newlen, float offs[3] )
+ {
+ // First, create a new leaf node
+ UCHAR* nleaf = createLeaf( newlen ) ;
+ for ( int i = 0 ; i < leaf_node_bytes ; i ++ )
+ {
+ nleaf[i] = leaf[i] ;
+ }
+
+ // Next, fill in the offsets
+ setEdgeOffsets( nleaf, offs, newlen ) ;
+
+ // Finally, delete the old leaf
+ removeLeaf( oldlen, leaf ) ;
+
+ return nleaf ;
+ }
+
+ /// Set original vertex index
+ void setOriginalIndex( UCHAR* leaf, int index )
+ {
+ ((int *)( leaf + leaf_node_bytes ))[ 0 ] = index ;
+ }
+ int getOriginalIndex( UCHAR* leaf )
+ {
+ return ((int *)( leaf + leaf_node_bytes ))[ 0 ] ;
+ }
+#ifdef USE_HERMIT
+ /// Set minimizer index
+ void setMinimizerIndex( UCHAR* leaf, int index )
+ {
+ ((int *)( leaf + leaf_node_bytes - leaf_extra_bytes - 4 ))[ 0 ] = index ;
+ }
+
+ /// Get minimizer index
+ int getMinimizerIndex( UCHAR* leaf )
+ {
+ return ((int *)( leaf + leaf_node_bytes - leaf_extra_bytes - 4 ))[ 0 ] ;
+ }
+
+ int getMinimizerIndex( UCHAR* leaf, int eind )
+ {
+ int add = manifold_table[ getSignMask( leaf ) ].pairs[ eind ][ 0 ] - 1 ;
+ if ( add < 0 )
+ {
+ printf("Manifold components wrong!\n") ;
+ }
+ return ((int *)( leaf + leaf_node_bytes - leaf_extra_bytes - 4 ))[ 0 ] + add ;
+ }
+
+ void getMinimizerIndices( UCHAR* leaf, int eind, int inds[2] )
+ {
+ const int* add = manifold_table[ getSignMask( leaf ) ].pairs[ eind ] ;
+ inds[0] = ((int *)( leaf + leaf_node_bytes - leaf_extra_bytes - 4 ))[ 0 ] + add[0] - 1 ;
+ if ( add[0] == add[1] )
+ {
+ inds[1] = -1 ;
+ }
+ else
+ {
+ inds[1] = ((int *)( leaf + leaf_node_bytes - leaf_extra_bytes - 4 ))[ 0 ] + add[1] - 1 ;
+ }
+ }
+
+
+ /// Set edge intersection
+ void setEdgeOffsetNormal( UCHAR* leaf, float pt, float a, float b, float c, int count )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+ pts[ 4 * count ] = pt ;
+ pts[ 4 * count + 1 ] = a ;
+ pts[ 4 * count + 2 ] = b ;
+ pts[ 4 * count + 3 ] = c ;
+ }
+
+ float getEdgeOffsetNormal( UCHAR* leaf, int count, float& a, float& b, float& c )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+ a = pts[ 4 * count + 1 ] ;
+ b = pts[ 4 * count + 2 ] ;
+ c = pts[ 4 * count + 3 ] ;
+ return pts[ 4 * count ] ;
+ }
+
+ /// Set multiple edge intersections
+ void setEdgeOffsetsNormals( UCHAR* leaf, float pt[], float a[], float b[], float c[], int len )
+ {
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+ for ( int i = 0 ; i < len ; i ++ )
+ {
+ if ( pt[i] > 1 || pt[i] < 0 )
+ {
+ printf("\noffset: %f\n", pt[i]) ;
+ }
+ pts[ i * 4 ] = pt[i] ;
+ pts[ i * 4 + 1 ] = a[i] ;
+ pts[ i * 4 + 2 ] = b[i] ;
+ pts[ i * 4 + 3 ] = c[i] ;
+ }
+ }
+
+ /// Retrieve complete edge intersection
+ void getEdgeIntersectionByIndex( UCHAR* leaf, int index, int st[3], int len, float pt[3], float nm[3] )
+ {
+ int count = getEdgeCount( leaf, index ) ;
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+
+ float off = pts[ 4 * count ] ;
+
+ pt[0] = (float) st[0] ;
+ pt[1] = (float) st[1] ;
+ pt[2] = (float) st[2] ;
+ pt[ index ] += ( off * len ) ;
+
+ nm[0] = pts[ 4 * count + 1 ] ;
+ nm[1] = pts[ 4 * count + 2 ] ;
+ nm[2] = pts[ 4 * count + 3 ] ;
+ }
+
+ float getEdgeOffsetNormalByIndex( UCHAR* leaf, int index, float nm[3] )
+ {
+ int count = getEdgeCount( leaf, index ) ;
+ float * pts = ( float * ) ( leaf + leaf_node_bytes ) ;
+
+ float off = pts[ 4 * count ] ;
+
+ nm[0] = pts[ 4 * count + 1 ] ;
+ nm[1] = pts[ 4 * count + 2 ] ;
+ nm[2] = pts[ 4 * count + 3 ] ;
+
+ return off ;
+ }
+
+ void fillEdgeIntersections( UCHAR* leaf, int st[3], int len, float pts[12][3], float norms[12][3] )
+ {
+ int i ;
+ // int stt[3] = { 0, 0, 0 } ;
+
+ // The three primal edges are easy
+ int pmask[3] = { 0, 4, 8 } ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getEdgeParity( leaf, pmask[i] ) )
+ {
+ // getEdgeIntersectionByIndex( leaf, i, stt, 1, pts[ pmask[i] ], norms[ pmask[i] ] ) ;
+ getEdgeIntersectionByIndex( leaf, i, st, len, pts[ pmask[i] ], norms[ pmask[i] ] ) ;
+ }
+ }
+
+ // 3 face adjacent cubes
+ int fmask[3][2] = {{6,10},{2,9},{1,5}} ;
+ int femask[3][2] = {{1,2},{0,2},{0,1}} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ int e1 = getEdgeParity( leaf, fmask[i][0] ) ;
+ int e2 = getEdgeParity( leaf, fmask[i][1] ) ;
+ if ( e1 || e2 )
+ {
+ int nst[3] = {st[0], st[1], st[2]} ;
+ nst[ i ] += len ;
+ // int nstt[3] = {0, 0, 0} ;
+ // nstt[ i ] += 1 ;
+ UCHAR* node = locateLeaf( nst ) ;
+
+ if ( e1 )
+ {
+ // getEdgeIntersectionByIndex( node, femask[i][0], nstt, 1, pts[ fmask[i][0] ], norms[ fmask[i][0] ] ) ;
+ getEdgeIntersectionByIndex( node, femask[i][0], nst, len, pts[ fmask[i][0] ], norms[ fmask[i][0] ] ) ;
+ }
+ if ( e2 )
+ {
+ // getEdgeIntersectionByIndex( node, femask[i][1], nstt, 1, pts[ fmask[i][1] ], norms[ fmask[i][1] ] ) ;
+ getEdgeIntersectionByIndex( node, femask[i][1], nst, len, pts[ fmask[i][1] ], norms[ fmask[i][1] ] ) ;
+ }
+ }
+ }
+
+ // 3 edge adjacent cubes
+ int emask[3] = {3, 7, 11} ;
+ int eemask[3] = {0, 1, 2} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getEdgeParity( leaf, emask[i] ) )
+ {
+ int nst[3] = {st[0] + len, st[1] + len, st[2] + len} ;
+ nst[ i ] -= len ;
+ // int nstt[3] = {1, 1, 1} ;
+ // nstt[ i ] -= 1 ;
+ UCHAR* node = locateLeaf( nst ) ;
+
+ // getEdgeIntersectionByIndex( node, eemask[i], nstt, 1, pts[ emask[i] ], norms[ emask[i] ] ) ;
+ getEdgeIntersectionByIndex( node, eemask[i], nst, len, pts[ emask[i] ], norms[ emask[i] ] ) ;
+ }
+ }
+ }
+
+
+ void fillEdgeIntersections( UCHAR* leaf, int st[3], int len, float pts[12][3], float norms[12][3], int parity[12] )
+ {
+ int i ;
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ parity[ i ] = 0 ;
+ }
+ // int stt[3] = { 0, 0, 0 } ;
+
+ // The three primal edges are easy
+ int pmask[3] = { 0, 4, 8 } ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getStoredEdgesParity( leaf, i ) )
+ {
+ // getEdgeIntersectionByIndex( leaf, i, stt, 1, pts[ pmask[i] ], norms[ pmask[i] ] ) ;
+ getEdgeIntersectionByIndex( leaf, i, st, len, pts[ pmask[i] ], norms[ pmask[i] ] ) ;
+ parity[ pmask[i] ] = 1 ;
+ }
+ }
+
+ // 3 face adjacent cubes
+ int fmask[3][2] = {{6,10},{2,9},{1,5}} ;
+ int femask[3][2] = {{1,2},{0,2},{0,1}} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ {
+ int nst[3] = {st[0], st[1], st[2]} ;
+ nst[ i ] += len ;
+ // int nstt[3] = {0, 0, 0} ;
+ // nstt[ i ] += 1 ;
+ UCHAR* node = locateLeafCheck( nst ) ;
+ if ( node == NULL )
+ {
+ continue ;
+ }
+
+ int e1 = getStoredEdgesParity( node, femask[i][0] ) ;
+ int e2 = getStoredEdgesParity( node, femask[i][1] ) ;
+
+ if ( e1 )
+ {
+ // getEdgeIntersectionByIndex( node, femask[i][0], nstt, 1, pts[ fmask[i][0] ], norms[ fmask[i][0] ] ) ;
+ getEdgeIntersectionByIndex( node, femask[i][0], nst, len, pts[ fmask[i][0] ], norms[ fmask[i][0] ] ) ;
+ parity[ fmask[i][0] ] = 1 ;
+ }
+ if ( e2 )
+ {
+ // getEdgeIntersectionByIndex( node, femask[i][1], nstt, 1, pts[ fmask[i][1] ], norms[ fmask[i][1] ] ) ;
+ getEdgeIntersectionByIndex( node, femask[i][1], nst, len, pts[ fmask[i][1] ], norms[ fmask[i][1] ] ) ;
+ parity[ fmask[i][1] ] = 1 ;
+ }
+ }
+ }
+
+ // 3 edge adjacent cubes
+ int emask[3] = {3, 7, 11} ;
+ int eemask[3] = {0, 1, 2} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+// if ( getEdgeParity( leaf, emask[i] ) )
+ {
+ int nst[3] = {st[0] + len, st[1] + len, st[2] + len} ;
+ nst[ i ] -= len ;
+ // int nstt[3] = {1, 1, 1} ;
+ // nstt[ i ] -= 1 ;
+ UCHAR* node = locateLeafCheck( nst ) ;
+ if ( node == NULL )
+ {
+ continue ;
+ }
+
+ if ( getStoredEdgesParity( node, eemask[i] ) )
+ {
+ // getEdgeIntersectionByIndex( node, eemask[i], nstt, 1, pts[ emask[i] ], norms[ emask[i] ] ) ;
+ getEdgeIntersectionByIndex( node, eemask[i], nst, len, pts[ emask[i] ], norms[ emask[i] ] ) ;
+ parity[ emask[ i ] ] = 1 ;
+ }
+ }
+ }
+ }
+
+ void fillEdgeOffsetsNormals( UCHAR* leaf, int st[3], int len, float pts[12], float norms[12][3], int parity[12] )
+ {
+ int i ;
+ for ( i = 0 ; i < 12 ; i ++ )
+ {
+ parity[ i ] = 0 ;
+ }
+ // int stt[3] = { 0, 0, 0 } ;
+
+ // The three primal edges are easy
+ int pmask[3] = { 0, 4, 8 } ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ if ( getStoredEdgesParity( leaf, i ) )
+ {
+ pts[ pmask[i] ] = getEdgeOffsetNormalByIndex( leaf, i, norms[ pmask[i] ] ) ;
+ parity[ pmask[i] ] = 1 ;
+ }
+ }
+
+ // 3 face adjacent cubes
+ int fmask[3][2] = {{6,10},{2,9},{1,5}} ;
+ int femask[3][2] = {{1,2},{0,2},{0,1}} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+ {
+ int nst[3] = {st[0], st[1], st[2]} ;
+ nst[ i ] += len ;
+ // int nstt[3] = {0, 0, 0} ;
+ // nstt[ i ] += 1 ;
+ UCHAR* node = locateLeafCheck( nst ) ;
+ if ( node == NULL )
+ {
+ continue ;
+ }
+
+ int e1 = getStoredEdgesParity( node, femask[i][0] ) ;
+ int e2 = getStoredEdgesParity( node, femask[i][1] ) ;
+
+ if ( e1 )
+ {
+ pts[ fmask[i][0] ] = getEdgeOffsetNormalByIndex( node, femask[i][0], norms[ fmask[i][0] ] ) ;
+ parity[ fmask[i][0] ] = 1 ;
+ }
+ if ( e2 )
+ {
+ pts[ fmask[i][1] ] = getEdgeOffsetNormalByIndex( node, femask[i][1], norms[ fmask[i][1] ] ) ;
+ parity[ fmask[i][1] ] = 1 ;
+ }
+ }
+ }
+
+ // 3 edge adjacent cubes
+ int emask[3] = {3, 7, 11} ;
+ int eemask[3] = {0, 1, 2} ;
+ for ( i = 0 ; i < 3 ; i ++ )
+ {
+// if ( getEdgeParity( leaf, emask[i] ) )
+ {
+ int nst[3] = {st[0] + len, st[1] + len, st[2] + len} ;
+ nst[ i ] -= len ;
+ // int nstt[3] = {1, 1, 1} ;
+ // nstt[ i ] -= 1 ;
+ UCHAR* node = locateLeafCheck( nst ) ;
+ if ( node == NULL )
+ {
+ continue ;
+ }
+
+ if ( getStoredEdgesParity( node, eemask[i] ) )
+ {
+ pts[ emask[i] ] = getEdgeOffsetNormalByIndex( node, eemask[i], norms[ emask[i] ] ) ;
+ parity[ emask[ i ] ] = 1 ;
+ }
+ }
+ }
+ }
+
+
+ /// Update method
+ UCHAR* updateEdgeOffsetsNormals( UCHAR* leaf, int oldlen, int newlen, float offs[3], float a[3], float b[3], float c[3] )
+ {
+ // First, create a new leaf node
+ UCHAR* nleaf = createLeaf( newlen ) ;
+ for ( int i = 0 ; i < leaf_node_bytes ; i ++ )
+ {
+ nleaf[i] = leaf[i] ;
+ }
+
+ // Next, fill in the offsets
+ setEdgeOffsetsNormals( nleaf, offs, a, b, c, newlen ) ;
+
+ // Finally, delete the old leaf
+ removeLeaf( oldlen, leaf ) ;
+
+ return nleaf ;
+ }
+#endif
+
+ /// Locate a leaf
+ /// WARNING: assuming this leaf already exists!
+
+ UCHAR* locateLeaf( int st[3] )
+ {
+ UCHAR* node = root ;
+ for ( int i = GRID_DIMENSION - 1 ; i > GRID_DIMENSION - maxDepth - 1 ; i -- )
+ {
+ int index = ( ( ( st[0] >> i ) & 1 ) << 2 ) |
+ ( ( ( st[1] >> i ) & 1 ) << 1 ) |
+ ( ( ( st[2] >> i ) & 1 ) ) ;
+ node = getChild( node, getChildCount( node, index ) ) ;
+ }
+
+ return node ;
+ }
+
+ UCHAR* locateLeaf( UCHAR* node, int len, int st[3] )
+ {
+ int index ;
+ for ( int i = len / 2 ; i >= mindimen ; i >>= 1 )
+ {
+ index = ( ( ( st[0] & i ) ? 4 : 0 ) |
+ ( ( st[1] & i ) ? 2 : 0 ) |
+ ( ( st[2] & i ) ? 1 : 0 ) ) ;
+ node = getChild( node, getChildCount( node, index ) ) ;
+ }
+
+ return node ;
+ }
+ UCHAR* locateLeafCheck( int st[3] )
+ {
+ UCHAR* node = root ;
+ for ( int i = GRID_DIMENSION - 1 ; i > GRID_DIMENSION - maxDepth - 1 ; i -- )
+ {
+ int index = ( ( ( st[0] >> i ) & 1 ) << 2 ) |
+ ( ( ( st[1] >> i ) & 1 ) << 1 ) |
+ ( ( ( st[2] >> i ) & 1 ) ) ;
+ if ( ! hasChild( node, index ) )
+ {
+ return NULL ;
+ }
+ node = getChild( node, getChildCount( node, index ) ) ;
+ }
+
+ return node ;
+ }
+ UCHAR* locateParent( int len, int st[3], int& count )
+ {
+ UCHAR* node = root ;
+ UCHAR* pre = NULL ;
+ int index = 0 ;
+ for ( int i = dimen / 2 ; i >= len ; i >>= 1 )
+ {
+ index = ( ( ( st[0] & i ) ? 4 : 0 ) |
+ ( ( st[1] & i ) ? 2 : 0 ) |
+ ( ( st[2] & i ) ? 1 : 0 ) ) ;
+ pre = node ;
+ node = getChild( node, getChildCount( node, index ) ) ;
+ }
+
+ count = getChildCount( pre, index ) ;
+ return pre ;
+ }
+ UCHAR* locateParent( UCHAR* papa, int len, int st[3], int& count )
+ {
+ UCHAR* node = papa ;
+ UCHAR* pre = NULL ;
+ int index = 0;
+ for ( int i = len / 2 ; i >= mindimen ; i >>= 1 )
+ {
+ index = ( ( ( st[0] & i ) ? 4 : 0 ) |
+ ( ( st[1] & i ) ? 2 : 0 ) |
+ ( ( st[2] & i ) ? 1 : 0 ) ) ;
+ pre = node ;
+ node = getChild( node, getChildCount( node, index ) ) ;
+ }
+
+ count = getChildCount( pre, index ) ;
+ return pre ;
+ }
+ /************ Operators for internal nodes ************/
+
+ /// Print the node information
+ void printNode( UCHAR* node )
+ {
+ printf("Address: %p ", node ) ;
+ printf("Leaf Mask: ") ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ printf( "%d ", isLeaf( node, i ) ) ;
+ }
+ printf("Child Mask: ") ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ printf( "%d ", hasChild( node, i ) ) ;
+ }
+ printf("\n") ;
+ }
+
+ /// Get size of an internal node
+ int getSize ( int length )
+ {
+ return INTERNAL_NODE_BYTES + length * 4 ;
+ };
+
+ /// If child index exists
+ int hasChild( UCHAR* node, int index )
+ {
+ return ( node[0] >> index ) & 1 ;
+ };
+
+ /// Test if child is leaf
+ int isLeaf ( UCHAR* node, int index )
+ {
+ return ( node[1] >> index ) & 1 ;
+ };
+
+ /// Get the pointer to child index
+ UCHAR* getChild ( UCHAR* node, int count )
+ {
+ return (( UCHAR ** ) ( node + INTERNAL_NODE_BYTES )) [ count ] ;
+ };
+
+ /// Get total number of children
+ int getNumChildren( UCHAR* node )
+ {
+ return numChildrenTable[ node[0] ] ;
+ };
+
+ /// Get the count of children
+ int getChildCount( UCHAR* node, int index )
+ {
+ return childrenCountTable[ node[0] ][ index ] ;
+ }
+ int getChildIndex( UCHAR* node, int count )
+ {
+ return childrenIndexTable[ node[0] ][ count ] ;
+ }
+ int* getChildCounts( UCHAR* node )
+ {
+ return childrenCountTable[ node[0] ] ;
+ }
+
+ /// Get all children
+ void fillChildren( UCHAR* node, UCHAR* chd[ 8 ], int leaf[ 8 ] )
+ {
+ int count = 0 ;
+ for ( int i = 0 ; i < 8 ; i ++ )
+ {
+ leaf[ i ] = isLeaf( node, i ) ;
+ if ( hasChild( node, i ) )
+ {
+ chd[ i ] = getChild( node, count ) ;
+ count ++ ;
+ }
+ else
+ {
+ chd[ i ] = NULL ;
+ leaf[ i ] = 0 ;
+ }
+ }
+ }
+
+ /// Sets the child pointer
+ void setChild ( UCHAR* node, int count, UCHAR* chd )
+ {
+ (( UCHAR ** ) ( node + INTERNAL_NODE_BYTES )) [ count ] = chd ;
+ }
+ void setInternalChild ( UCHAR* node, int index, int count, UCHAR* chd )
+ {
+ setChild( node, count, chd ) ;
+ node[0] |= ( 1 << index ) ;
+ };
+ void setLeafChild ( UCHAR* node, int index, int count, UCHAR* chd )
+ {
+ setChild( node, count, chd ) ;
+ node[0] |= ( 1 << index ) ;
+ node[1] |= ( 1 << index ) ;
+ };
+
+ /// Add a kid to an existing internal node
+ /// Fix me: can we do this without wasting memory ?
+ /// Fixed: using variable memory
+ UCHAR* addChild( UCHAR* node, int index, UCHAR* chd, int aLeaf )
+ {
+ // Create new internal node
+ int num = getNumChildren( node ) ;
+ UCHAR* rnode = createInternal( num + 1 ) ;
+
+ // Establish children
+ int i ;
+ int count1 = 0, count2 = 0 ;
+ for ( i = 0 ; i < 8 ; i ++ )
+ {
+ if ( i == index )
+ {
+ if ( aLeaf )
+ {
+ setLeafChild( rnode, i, count2, chd ) ;
+ }
+ else
+ {
+ setInternalChild( rnode, i, count2, chd ) ;
+ }
+ count2 ++ ;
+ }
+ else if ( hasChild( node, i ) )
+ {
+ if ( isLeaf( node, i ) )
+ {
+ setLeafChild( rnode, i, count2, getChild( node, count1 ) ) ;
+ }
+ else
+ {
+ setInternalChild( rnode, i, count2, getChild( node, count1 ) ) ;
+ }
+ count1 ++ ;
+ count2 ++ ;
+ }
+ }
+
+ removeInternal( num, node ) ;
+ return rnode ;
+ }
+
+ /// Allocate a node
+ UCHAR* createInternal( int length )
+ {
+ UCHAR* inode = alloc[ length ]->allocate( ) ;
+ inode[0] = inode[1] = 0 ;
+ return inode ;
+ };
+ UCHAR* createLeaf( int length )
+ {
+ if ( length > 3 )
+ {
+ printf("wierd");
+ }
+ UCHAR* lnode = leafalloc[ length ]->allocate( ) ;
+ lnode[0] = lnode[1] = lnode[2] = 0 ;
+
+ return lnode ;
+ };
+
+ void removeInternal ( int num, UCHAR* node )
+ {
+ alloc[ num ]->deallocate( node ) ;
+ }
+
+ void removeLeaf ( int num, UCHAR* leaf )
+ {
+ if ( num > 3 || num < 0 )
+ {
+ printf("wierd");
+ }
+ leafalloc[ num ]->deallocate( leaf ) ;
+ }
+
+ /// Add a leaf (by creating a new par node with the leaf added)
+ UCHAR* addLeafChild ( UCHAR* par, int index, int count, UCHAR* leaf )
+ {
+ int num = getNumChildren( par ) + 1 ;
+ UCHAR* npar = createInternal( num ) ;
+ npar[0] = par[0] ;
+ npar[1] = par[1] ;
+
+ if ( num == 1 )
+ {
+ setLeafChild( npar, index, 0, leaf ) ;
+ }
+ else
+ {
+ int i ;
+ for ( i = 0 ; i < count ; i ++ )
+ {
+ setChild( npar, i, getChild( par, i ) ) ;
+ }
+ setLeafChild( npar, index, count, leaf ) ;
+ for ( i = count + 1 ; i < num ; i ++ )
+ {
+ setChild( npar, i, getChild( par, i - 1 ) ) ;
+ }
+ }
+
+ removeInternal( num-1, par ) ;
+ return npar ;
+ };
+
+ UCHAR* addInternalChild ( UCHAR* par, int index, int count, UCHAR* node )
+ {
+ int num = getNumChildren( par ) + 1 ;
+ UCHAR* npar = createInternal( num ) ;
+ npar[0] = par[0] ;
+ npar[1] = par[1] ;
+
+ if ( num == 1 )
+ {
+ setInternalChild( npar, index, 0, node ) ;
+ }
+ else
+ {
+ int i ;
+ for ( i = 0 ; i < count ; i ++ )
+ {
+ setChild( npar, i, getChild( par, i ) ) ;
+ }
+ setInternalChild( npar, index, count, node ) ;
+ for ( i = count + 1 ; i < num ; i ++ )
+ {
+ setChild( npar, i, getChild( par, i - 1 ) ) ;
+ }
+ }
+
+ removeInternal( num-1, par ) ;
+ return npar ;
+ };
+};
+
+
+
+#endif
diff --git a/intern/dualcon/intern/readme.txt b/intern/dualcon/intern/readme.txt
new file mode 100644
index 00000000000..fc88eca25c7
--- /dev/null
+++ b/intern/dualcon/intern/readme.txt
@@ -0,0 +1,112 @@
+PolyMender program for robustly repairing a polygonal model.
+
+Author: Tao Ju (jutao@cs.wustl.edu)
+
+Version: 1.6 (Updated: Oct. 12, 2006)
+
+Platform: Windows
+
+
+I. What's new in v1.6:
+
+
+> Removal of disconnected components
+
+> Topologically manifold dual contouring
+
+> Output signed octree with geometry
+
+
+
+II. Introduction
+
+
+PolyMender is based on the algorithm presented in the paper "Robust Repair of Polygonal Models" (SIGGRAPH 2004). The program reads in a polygonal model (i.e., a bag of polygons) and produces a closed surface that approximates the original model. PolyMender consumes a small amount of time and memory space, and can accurately reproduce the original geometry. PolyMender is suitable for repairing CAD models and gigantic polygonal models. Alternatively, PolyMender can also be used to generate a signed volume from any polygonal models.
+
+
+
+III. How to run
+
+
+The executable package contains three programs:
+
+1. PolyMender, PolyMender-clean
+
+Purpose: repairs general purpose models, such as those created from range scanners. The repaired surface is constructed using Marching Cubes. Consumes minimal memory and time and generates closed, manifold triangular surfaces. The -clean option removes isolated pieces.
+
+2. PolyMender-qd, PolyMender-qd-clean
+
+Purpose: same as PolyMender and PolyMender-clean, but outputs a quad-mesh.
+
+3. PolyMender-dc, PolyMender-dc-clean
+
+Purpose: repairs models containing sharp features, such as CAD models. The repaired surface is constructed using Dual Contouring with a manifold topology, which is capable of reproducing sharp edges and corners. However, more memory is required. Generates closed triangular and quadrilateral surfaces. The -clean option removes isolated pieces.
+
+
+Type the program names (e.g., PolyMender) on the DOS prompt and you will see their usages:
+
+Usage: PolyMender <input_file> <octree_depth> <scale> <output_file>
+
+Example: PolyMender bunny.ply 6 0.9 closedbunny.ply
+
+Description:
+
+<input_file> Polygonal file of format STL (binary only), ASC, or PLY.
+
+<octree_depth> Integer depth of octree. The dimension of the volumetric
+ grid is 2^<octree_depth> on each side.
+
+<scale> Floating point number between 0 and 1 denoting the ratio of
+ the largest dimension of the model over the size of the grid.
+
+<output_file> Output in polygonal format PLY or signed-octree format SOF (or SOG).
+
+
+Additional notes:
+
+1. STL(binary) is preferred input format, since the program does not need to store the model in memory at all. ASC or PLY formats require additional storage of vertices, due to their topology-geometry file structure.
+
+2. The running time and memory consumption of the program depends on several factors: the number of input polygons, the depth of the octree, and the surface area of the model (hence the number of leaf nodes on the octree). To give an idea, processing the David model with 56 million triangles at depth 13 takes 45 minutes using 500 MB RAM (excluding the mem allocated for storing vertices when reading PLY format) on a PC with AMD 1.5Hz CPU.
+
+3. The number of output polygons can be finely controlled using the scale argument. The large the scale, the more polygons are generated, since the model occupies a larger portion of the volume grid.
+
+4. As an alternative of output repaired models, the intermediate signed octree can be generated as a SOF or SOG file. The signed octree can be used for generating signed distance field, extracting isosurfaces, or multiresolution spatial representation of the polygonal model.
+
+
+IV SOF format
+
+SOF (Signed Octree Format) records an octree grid with signes attached to the 8 corners of each leaf node. All leaf nodes appear at the same depth that is specified by the <octree_depth> argument to the program. The tree is recorded in SOF file using pre-order traversal. Here is the structure of a SOF file (binary):
+
+<header>
+
+<node>
+
+<header> is a 4-bytes integer that equals 2 ^ octree_depth. The first byte of a <node> is either 0 (denoting an intermediate node) or 1 (denoting an empty node) or 2 (denoting a leaf node). After the first byte, an intermediate node <node> contains (after the first byte) eight <node> structures for its eight children; an empty node <node> contains one byte of value 0 or 1 denoting if it is inside or outside; and a leaf node contains one byte whose eight bits correspond to the signs at its eight corners (0 for inside and 1 for outside). The order of enumeration of the eight children nodes in an intermediate nodeis the following (expressed in coordinates <x,y,z> ): <0,0,0>,<0,0,1>,<0,1,0>,<0,1,1>,<1,0,0>,<1,0,1>,<1,1,0>,<1,1,1>. The enumeration of the eight corners in a leaf node follows the same order (e.g., the lowest bit records the sign at <0,0,0>).
+
+
+
+V SOG format
+
+SOF (Signed Octree with Geometry) has the same data structure with SOG, with the addition of following features:
+
+1. The file starts with a 128-byte long header. Currently, the header begins with the string "SOG.Format 1.0" followed by 3 floats representing the lower-left-near corner of the octree follwed by 1 float denoting the length of the octree (in one direction). The locations and lengths are in the input model's coordinate space. The rest of the header is left empty.
+
+2. Each leaf node has additioanl three floats {x,y,z} (following the signs) denoting the geometric location of a feature vertex within the cell.
+
+
+
+VI Test data
+
+Three models are included in the testmodels package. (Suggested arguments are provided in the parathesis).
+
+bunny.ply (octree depth: 7, scale: 0.9)
+
+- The Stanford Bunny (containing big holes at the bottom)
+
+horse.stl (octree depth: 8, scale: 0.9)
+
+- The horse model with 1/3 of all polygons removed and vertices randomly perturbed.
+
+mechanic.asc (octree depth: 6, scale: 0.9)
+
+- A mechanic part with hanging triangles
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index a84ff5825a9..35b617e5452 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -234,6 +234,13 @@ elseif(UNIX)
)
endif()
+ if(WITH_X11_XF86VMODE)
+ add_definitions(-DWITH_X11_XF86VMODE)
+ list(APPEND INC_SYS
+ ${X11_xf86vmode_INCLUDE_PATH}
+ )
+ endif()
+
if(WITH_INPUT_NDOF)
list(APPEND SRC
intern/GHOST_NDOFManagerX11.cpp
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index 8d06bdbba65..db66a68799e 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -81,7 +81,8 @@ extern GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle);
* @param eventCallback The event callback routine.
* @param userdata Pointer to user data returned to the callback routine.
*/
-extern GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr userdata);
+extern GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback,
+ GHOST_TUserDataPtr userdata);
/**
* Disposes an event consumer object
diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h
index 04dc8717637..d451cb16df6 100644
--- a/intern/ghost/GHOST_ISystem.h
+++ b/intern/ghost/GHOST_ISystem.h
@@ -181,7 +181,10 @@ public:
* @param userData Placeholder for user data.
* @return A timer task (0 if timer task installation failed).
*/
- virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0) = 0;
+ virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay,
+ GHOST_TUns64 interval,
+ GHOST_TimerProcPtr timerProc,
+ GHOST_TUserDataPtr userData = 0) = 0;
/**
* Removes a timer.
diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h
index 12a11d838dc..6438059287d 100644
--- a/intern/ghost/GHOST_IWindow.h
+++ b/intern/ghost/GHOST_IWindow.h
@@ -303,7 +303,7 @@ public:
* @param grab The new grab state of the cursor.
* @return Indication of success.
*/
- virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; };
+ virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; }
#ifdef WITH_CXX_GUARDEDALLOC
public:
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 35a97b6d416..6edfc4287ae 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -65,7 +65,8 @@ GHOST_TSuccess GHOST_DisposeSystem(GHOST_SystemHandle systemhandle)
}
-GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr userdata)
+GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback,
+ GHOST_TUserDataPtr userdata)
{
return (GHOST_EventConsumerHandle) new GHOST_CallbackEventConsumer (eventCallback, userdata);
}
diff --git a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp
index 50000421bfd..49590c77eaa 100644
--- a/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp
+++ b/intern/ghost/intern/GHOST_CallbackEventConsumer.cpp
@@ -42,7 +42,7 @@
#include "GHOST_CallbackEventConsumer.h"
GHOST_CallbackEventConsumer::GHOST_CallbackEventConsumer(GHOST_EventCallbackProcPtr eventCallback,
- GHOST_TUserDataPtr userData)
+ GHOST_TUserDataPtr userData)
{
m_eventCallback = eventCallback;
m_userData = userData;
diff --git a/intern/ghost/intern/GHOST_Debug.h b/intern/ghost/intern/GHOST_Debug.h
index f2e16259c57..38512f6ce2b 100644
--- a/intern/ghost/intern/GHOST_Debug.h
+++ b/intern/ghost/intern/GHOST_Debug.h
@@ -34,35 +34,42 @@
#define _GHOST_DEBUG_H_
#if defined(WIN32) && !defined(FREE_WINDOWS)
- #ifdef DEBUG
- #pragma warning (disable:4786) // suppress stl-MSVC debug info warning
- // #define GHOST_DEBUG
- #endif // DEBUG
+# ifdef DEBUG
+# pragma warning (disable:4786) // suppress stl-MSVC debug info warning
+ // #define GHOST_DEBUG
+# endif // DEBUG
#endif // WIN32
#ifdef WITH_GHOST_DEBUG
- #define GHOST_DEBUG // spit ghost events to stdout
+# define GHOST_DEBUG // spit ghost events to stdout
#endif // WITH_GHOST_DEBUG
#ifdef GHOST_DEBUG
- #include <iostream>
- #include <stdio.h> //for printf()
+# include <iostream>
+# include <stdio.h> //for printf()
#endif // GHOST_DEBUG
#ifdef GHOST_DEBUG
- #define GHOST_PRINT(x) { std::cout << x; }
- #define GHOST_PRINTF(x, ...) { printf(x, __VA_ARGS__); }
+# define GHOST_PRINT(x) { std::cout << x; }
+# define GHOST_PRINTF(x, ...) { printf(x, __VA_ARGS__); }
#else // GHOST_DEBUG
- #define GHOST_PRINT(x)
- #define GHOST_PRINTF(x, ...)
+# define GHOST_PRINT(x)
+# define GHOST_PRINTF(x, ...)
#endif // GHOST_DEBUG
#ifdef GHOST_DEBUG
- #define GHOST_ASSERT(x, info) { if (!(x)) {GHOST_PRINT("assertion failed: "); GHOST_PRINT(info); GHOST_PRINT("\n"); } }
+# define GHOST_ASSERT(x, info) \
+ { \
+ if (!(x)) { \
+ GHOST_PRINT("assertion failed: "); \
+ GHOST_PRINT(info); \
+ GHOST_PRINT("\n"); \
+ } \
+ }
#else // GHOST_DEBUG
- #define GHOST_ASSERT(x, info)
+# define GHOST_ASSERT(x, info)
#endif // GHOST_DEBUG
#endif // _GHOST_DEBUG_H_
diff --git a/intern/ghost/intern/GHOST_DisplayManager.h b/intern/ghost/intern/GHOST_DisplayManager.h
index d7a9b151d14..b89f303c734 100644
--- a/intern/ghost/intern/GHOST_DisplayManager.h
+++ b/intern/ghost/intern/GHOST_DisplayManager.h
@@ -75,7 +75,8 @@ public:
* @param numSettings The number of settings of the display device with this index.
* @return Indication of success.
*/
- virtual GHOST_TSuccess getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const;
+ virtual GHOST_TSuccess getNumDisplaySettings(GHOST_TUns8 display,
+ GHOST_TInt32& numSettings) const;
/**
* Returns the current setting for this display device.
@@ -84,7 +85,9 @@ public:
* @param setting The setting of the display device with this index.
* @return Indication of success.
*/
- virtual GHOST_TSuccess getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const;
+ virtual GHOST_TSuccess getDisplaySetting(GHOST_TUns8 display,
+ GHOST_TInt32 index,
+ GHOST_DisplaySetting& setting) const;
/**
* Returns the current setting for this display device.
@@ -92,7 +95,8 @@ public:
* @param setting The current setting of the display device with this index.
* @return Indication of success.
*/
- virtual GHOST_TSuccess getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const;
+ virtual GHOST_TSuccess getCurrentDisplaySetting(GHOST_TUns8 display,
+ GHOST_DisplaySetting& setting) const;
/**
* Changes the current setting for this display device.
@@ -102,7 +106,8 @@ public:
* @param setting The setting of the display device to be matched and activated.
* @return Indication of success.
*/
- virtual GHOST_TSuccess setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting);
+ virtual GHOST_TSuccess setCurrentDisplaySetting(GHOST_TUns8 display,
+ const GHOST_DisplaySetting& setting);
protected:
typedef std::vector<GHOST_DisplaySetting> GHOST_DisplaySettings;
@@ -114,7 +119,9 @@ protected:
* @param match The optimal display setting.
* @return Indication of success.
*/
- GHOST_TSuccess findMatch(GHOST_TUns8 display, const GHOST_DisplaySetting& setting, GHOST_DisplaySetting& match) const;
+ GHOST_TSuccess findMatch(GHOST_TUns8 display,
+ const GHOST_DisplaySetting& setting,
+ GHOST_DisplaySetting& match) const;
/**
* Retrieves settings for each display device and stores them.
diff --git a/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp b/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp
index 1b73329f8bb..4c67616a4c4 100644
--- a/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp
@@ -36,7 +36,7 @@ GHOST_DisplayManagerSDL::GHOST_DisplayManagerSDL(GHOST_SystemSDL *system)
}
GHOST_TSuccess
-GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays)
+GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays) const
{
numDisplays= SDL_GetNumVideoDisplays();
return GHOST_kSuccess;
@@ -44,7 +44,7 @@ GHOST_DisplayManagerSDL::getNumDisplays(GHOST_TUns8& numDisplays)
GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplaySettings(GHOST_TUns8 display,
- GHOST_TInt32& numSettings)
+ GHOST_TInt32& numSettings) const
{
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
numSettings= GHOST_TInt32(1);
@@ -54,7 +54,7 @@ GHOST_TSuccess GHOST_DisplayManagerSDL::getNumDisplaySettings(GHOST_TUns8 displa
GHOST_TSuccess
GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display,
GHOST_TInt32 index,
- GHOST_DisplaySetting& setting)
+ GHOST_DisplaySetting& setting) const
{
GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
@@ -74,7 +74,7 @@ GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display,
GHOST_TSuccess
GHOST_DisplayManagerSDL::getCurrentDisplaySetting(GHOST_TUns8 display,
- GHOST_DisplaySetting& setting)
+ GHOST_DisplaySetting& setting) const
{
return getDisplaySetting(display,GHOST_TInt32(0),setting);
}
diff --git a/intern/ghost/intern/GHOST_DisplayManagerSDL.h b/intern/ghost/intern/GHOST_DisplayManagerSDL.h
index ff8ab13c4fa..297a61f41ff 100644
--- a/intern/ghost/intern/GHOST_DisplayManagerSDL.h
+++ b/intern/ghost/intern/GHOST_DisplayManagerSDL.h
@@ -46,20 +46,20 @@ public:
GHOST_DisplayManagerSDL(GHOST_SystemSDL *system);
GHOST_TSuccess
- getNumDisplays(GHOST_TUns8& numDisplays);
+ getNumDisplays(GHOST_TUns8& numDisplays) const;
GHOST_TSuccess
getNumDisplaySettings(GHOST_TUns8 display,
- GHOST_TInt32& numSettings);
+ GHOST_TInt32& numSettings) const;
GHOST_TSuccess
getDisplaySetting(GHOST_TUns8 display,
GHOST_TInt32 index,
- GHOST_DisplaySetting& setting);
+ GHOST_DisplaySetting& setting) const;
GHOST_TSuccess
getCurrentDisplaySetting(GHOST_TUns8 display,
- GHOST_DisplaySetting& setting);
+ GHOST_DisplaySetting& setting) const;
GHOST_TSuccess
setCurrentDisplaySetting(GHOST_TUns8 display,
diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
index 34f5fda2a16..411203b6475 100644
--- a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
@@ -20,7 +20,9 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Video mode switching
+ * Copyright (C) 1997-2001 Id Software, Inc.
+ * Ported from Quake 2 by Alex Fraser <alex@phatcore.com>
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -29,6 +31,10 @@
* \ingroup GHOST
*/
+#ifdef WITH_X11_XF86VMODE
+# include <X11/Xlib.h>
+# include <X11/extensions/xf86vmode.h>
+#endif
#include "GHOST_DisplayManagerX11.h"
#include "GHOST_SystemX11.h"
@@ -112,12 +118,74 @@ setCurrentDisplaySetting(
GHOST_TUns8 display,
const GHOST_DisplaySetting& setting
){
- // This is never going to work robustly in X
- // but it's currently part of the full screen interface
+#ifdef WITH_X11_XF86VMODE
+ //
+ // Mode switching code ported from Quake 2:
+ // ftp://ftp.idsoftware.com/idstuff/source/q2source-3.21.zip
+ // See linux/gl_glx.c:GLimp_SetMode
+ //
+ int majorVersion, minorVersion;
+ XF86VidModeModeInfo **vidmodes;
+ Display *dpy = m_system->getXDisplay();
+ int scrnum, num_vidmodes;
+ int best_fit, best_dist, dist, x, y;
+
+ scrnum = DefaultScreen(dpy);
+
+ // Get video mode list
+ majorVersion = minorVersion = 0;
+ if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
+ fprintf(stderr, "Error: XF86VidMode extension missing!\n");
+ return GHOST_kFailure;
+ }
+# ifdef _DEBUG
+ printf("Using XFree86-VidModeExtension Version %d.%d\n",
+ majorVersion, minorVersion);
+# endif
+
+ XF86VidModeGetAllModeLines(dpy, scrnum, &num_vidmodes, &vidmodes);
+
+ best_dist = 9999999;
+ best_fit = -1;
+
+ for (int i = 0; i < num_vidmodes; i++) {
+ if (setting.xPixels > vidmodes[i]->hdisplay ||
+ setting.yPixels > vidmodes[i]->vdisplay)
+ continue;
+
+ x = setting.xPixels - vidmodes[i]->hdisplay;
+ y = setting.yPixels - vidmodes[i]->vdisplay;
+ dist = (x * x) + (y * y);
+ if (dist < best_dist) {
+ best_dist = dist;
+ best_fit = i;
+ }
+ }
- // we fudge it for now.
+ if (best_fit != -1) {
+# ifdef _DEBUG
+ int actualWidth, actualHeight;
+ actualWidth = vidmodes[best_fit]->hdisplay;
+ actualHeight = vidmodes[best_fit]->vdisplay;
+ printf("Switching to video mode %dx%d\n",
+ actualWidth, actualHeight);
+# endif
+
+ // change to the mode
+ XF86VidModeSwitchToMode(dpy, scrnum, vidmodes[best_fit]);
+
+ // Move the viewport to top left
+ XF86VidModeSetViewPort(dpy, scrnum, 0, 0);
+ } else
+ return GHOST_kFailure;
+
+ XFlush(dpy);
+ return GHOST_kSuccess;
+#else
+ // Just pretend the request was successful.
return GHOST_kSuccess;
+#endif
}
diff --git a/intern/ghost/intern/GHOST_EventDragnDrop.h b/intern/ghost/intern/GHOST_EventDragnDrop.h
index 650a109a668..330635de50a 100644
--- a/intern/ghost/intern/GHOST_EventDragnDrop.h
+++ b/intern/ghost/intern/GHOST_EventDragnDrop.h
@@ -44,19 +44,21 @@ extern "C" {
*
* The dragging sequence is performed in four phases:
*
- * <li> Start sequence (GHOST_kEventDraggingEntered) that tells a drag'n'drop operation has started. Already gives the object data type,
- * and the entering mouse location
+ * <li> Start sequence (GHOST_kEventDraggingEntered) that tells a drag'n'drop operation has started.
+ * Already gives the object data type, and the entering mouse location
*
- * <li> Update mouse position (GHOST_kEventDraggingUpdated) sent upon each mouse move until the drag'n'drop operation stops, to give the updated mouse position.
- * Useful to highlight a potential destination, and update the status (through GHOST_setAcceptDragOperation) telling if the object can be dropped at
+ * <li> Update mouse position (GHOST_kEventDraggingUpdated) sent upon each mouse move until the drag'n'drop operation
+ * stops, to give the updated mouse position. Useful to highlight a potential destination, and update the status
+ * (through GHOST_setAcceptDragOperation) telling if the object can be dropped at
* the current cursor position.
*
* <li> Abort drag'n'drop sequence (GHOST_kEventDraggingExited) sent when the user moved the mouse outside the window.
*
* <li> Send the dropped data (GHOST_kEventDraggingDropDone)
*
- * <li> Outside of the normal sequence, dropped data can be sent (GHOST_kEventDraggingDropOnIcon). This can happen when the user drops an object
- * on the application icon. (Also used in OSX to pass the filename of the document the user doubled-clicked in the finder)
+ * <li> Outside of the normal sequence, dropped data can be sent (GHOST_kEventDraggingDropOnIcon).
+ * This can happen when the user drops an object on the application icon.
+ * (Also used in OSX to pass the filename of the document the user doubled-clicked in the finder)
*
* <br><br>Note that the mouse positions are given in Blender coordinates (y=0 at bottom)
*
@@ -78,7 +80,10 @@ public:
* @param y The y-coordinate of the location the cursor was at at the time of the event.
* @param data The "content" dropped in the window
*/
- GHOST_EventDragnDrop(GHOST_TUns64 time, GHOST_TEventType type, GHOST_TDragnDropTypes dataType, GHOST_IWindow* window,
+ GHOST_EventDragnDrop(GHOST_TUns64 time,
+ GHOST_TEventType type,
+ GHOST_TDragnDropTypes dataType,
+ GHOST_IWindow* window,
int x, int y, GHOST_TEventDataPtr data)
: GHOST_Event(time, type, window)
{
diff --git a/intern/ghost/intern/GHOST_EventKey.h b/intern/ghost/intern/GHOST_EventKey.h
index 5410b1eda16..a602bd65e5a 100644
--- a/intern/ghost/intern/GHOST_EventKey.h
+++ b/intern/ghost/intern/GHOST_EventKey.h
@@ -49,7 +49,10 @@ public:
* @param type The type of key event.
* @param key The key code of the key.
*/
- GHOST_EventKey(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TKey key)
+ GHOST_EventKey(GHOST_TUns64 msec,
+ GHOST_TEventType type,
+ GHOST_IWindow* window,
+ GHOST_TKey key)
: GHOST_Event(msec, type, window)
{
m_keyEventData.key = key;
@@ -65,7 +68,12 @@ public:
* @param key The key code of the key.
* @param ascii The ascii code for the key event.
*/
- GHOST_EventKey(GHOST_TUns64 msec, GHOST_TEventType type, GHOST_IWindow* window, GHOST_TKey key, char ascii, const char utf8_buf[6])
+ GHOST_EventKey(GHOST_TUns64 msec,
+ GHOST_TEventType type,
+ GHOST_IWindow* window,
+ GHOST_TKey key,
+ char ascii,
+ const char utf8_buf[6])
: GHOST_Event(msec, type, window)
{
m_keyEventData.key = key;
diff --git a/intern/ghost/intern/GHOST_EventNDOF.h b/intern/ghost/intern/GHOST_EventNDOF.h
index 394aff0493f..fceacce0805 100644
--- a/intern/ghost/intern/GHOST_EventNDOF.h
+++ b/intern/ghost/intern/GHOST_EventNDOF.h
@@ -19,7 +19,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-
+
+/** \file ghost/intern/GHOST_EventNDOF.h
+ * \ingroup GHOST
+ * Declaration of GHOST_EventManager class.
+ */
#ifndef _GHOST_EVENT_NDOF_H_
#define _GHOST_EVENT_NDOF_H_
diff --git a/intern/ghost/intern/GHOST_EventTrackpad.h b/intern/ghost/intern/GHOST_EventTrackpad.h
index 06706ea5ff3..55517f0a76c 100644
--- a/intern/ghost/intern/GHOST_EventTrackpad.h
+++ b/intern/ghost/intern/GHOST_EventTrackpad.h
@@ -50,7 +50,11 @@ public:
* @param x The x-delta of the pan event.
* @param y The y-delta of the pan event.
*/
- GHOST_EventTrackpad(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TTrackpadEventSubTypes subtype, GHOST_TInt32 x, GHOST_TInt32 y, GHOST_TInt32 deltaX, GHOST_TInt32 deltaY)
+ GHOST_EventTrackpad(GHOST_TUns64 msec,
+ GHOST_IWindow* window,
+ GHOST_TTrackpadEventSubTypes subtype,
+ GHOST_TInt32 x, GHOST_TInt32 y,
+ GHOST_TInt32 deltaX, GHOST_TInt32 deltaY)
: GHOST_Event(msec, GHOST_kEventTrackpad, window)
{
m_trackpadEventData.subtype = subtype;
diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp
index afc54d3c6a0..b0b693e2f8f 100644
--- a/intern/ghost/intern/GHOST_System.cpp
+++ b/intern/ghost/intern/GHOST_System.cpp
@@ -73,7 +73,10 @@ GHOST_TUns64 GHOST_System::getMilliSeconds() const
}
-GHOST_ITimerTask* GHOST_System::installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData)
+GHOST_ITimerTask* GHOST_System::installTimer(GHOST_TUns64 delay,
+ GHOST_TUns64 interval,
+ GHOST_TimerProcPtr timerProc,
+ GHOST_TUserDataPtr userData)
{
GHOST_TUns64 millis = getMilliSeconds();
GHOST_TimerTask* timer = new GHOST_TimerTask(millis+delay, interval, timerProc, userData);
diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h
index afd2a8cbae3..30082643118 100644
--- a/intern/ghost/intern/GHOST_System.h
+++ b/intern/ghost/intern/GHOST_System.h
@@ -97,7 +97,10 @@ public:
* @param userData Placeholder for user data.
* @return A timer task (0 if timer task installation failed).
*/
- virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0);
+ virtual GHOST_ITimerTask* installTimer(GHOST_TUns64 delay,
+ GHOST_TUns64 interval,
+ GHOST_TimerProcPtr timerProc,
+ GHOST_TUserDataPtr userData = 0);
/**
* Removes a timer.
diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp
index be58d179aa4..5db392e1706 100644
--- a/intern/ghost/intern/GHOST_SystemCarbon.cpp
+++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp
@@ -579,7 +579,8 @@ GHOST_TSuccess GHOST_SystemCarbon::getButtons(GHOST_Buttons& buttons) const
static bool g_hasFirstFile = false;
static char g_firstFileBuf[512];
-extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) {
+extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
+{
if (g_hasFirstFile) {
strncpy(buf, g_firstFileBuf, FIRSTFILEBUFLG - 1);
buf[FIRSTFILEBUFLG - 1] = '\0';
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.h b/intern/ghost/intern/GHOST_SystemCocoa.h
index 470fea7969c..581535e82b8 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.h
+++ b/intern/ghost/intern/GHOST_SystemCocoa.h
@@ -241,7 +241,9 @@ protected:
/**
* Handles a tablet event.
* @param eventPtr An NSEvent pointer (casted to void* to enable compilation in standard C++)
- * @param eventType The type of the event. It needs to be passed separately as it can be either directly in the event type, or as a subtype if combined with a mouse button event
+ * @param eventType The type of the event.
+ * It needs to be passed separately as it can be either directly in the event type,
+ * or as a subtype if combined with a mouse button event.
* @return Indication whether the event was handled.
*/
GHOST_TSuccess handleTabletEvent(void *eventPtr, short eventType);
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 12a732e59ef..50d8cfd074b 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -451,7 +451,8 @@ static bool g_hasFirstFile = false;
static char g_firstFileBuf[512];
//TODO:Need to investigate this. Function called too early in creator.c to have g_hasFirstFile == true
-extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG]) {
+extern "C" int GHOST_HACK_getFirstFile(char buf[FIRSTFILEBUFLG])
+{
if (g_hasFirstFile) {
strncpy(buf, g_firstFileBuf, FIRSTFILEBUFLG - 1);
buf[FIRSTFILEBUFLG - 1] = '\0';
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index 78afe0bd680..4ae87da4efe 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -438,8 +438,12 @@ GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, RAWINPUT const& raw
GHOST_ModifierKeys modifiers;
system->retrieveModifierKeys(modifiers);
-
- *keyDown = !(raw.data.keyboard.Flags & RI_KEY_BREAK);
+
+ // RI_KEY_BREAK doesn't work for sticky keys release, so we also
+ // check for the up message
+ unsigned int msg = raw.data.keyboard.Message;
+ *keyDown = !(raw.data.keyboard.Flags & RI_KEY_BREAK) && msg != WM_KEYUP && msg != WM_SYSKEYUP;
+
key = this->convertKey(window, raw.data.keyboard.VKey, raw.data.keyboard.MakeCode, (raw.data.keyboard.Flags&(RI_KEY_E1|RI_KEY_E0)));
// extra handling of modifier keys: don't send repeats out from GHOST
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 2547006ef28..d701f9264b8 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -296,7 +296,8 @@ findGhostWindow(
}
-static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep) {
+static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep)
+{
int fd = ConnectionNumber(display);
fd_set fds;
@@ -790,9 +791,11 @@ GHOST_SystemX11::processEvent(XEvent *xe)
/*Check to see if the requestor is asking for String*/
if(xse->target == string || xse->target == compound_text || xse->target == c_string) {
if (xse->selection == XInternAtom(m_display, "PRIMARY", False)) {
- XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace, (unsigned char*)txt_select_buffer, strlen(txt_select_buffer));
+ XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace,
+ (unsigned char*)txt_select_buffer, strlen(txt_select_buffer));
} else if (xse->selection == XInternAtom(m_display, "CLIPBOARD", False)) {
- XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace, (unsigned char*)txt_cut_buffer, strlen(txt_cut_buffer));
+ XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 8, PropModeReplace,
+ (unsigned char*)txt_cut_buffer, strlen(txt_cut_buffer));
}
} else if (xse->target == target) {
Atom alist[4];
@@ -800,7 +803,8 @@ GHOST_SystemX11::processEvent(XEvent *xe)
alist[1] = string;
alist[2] = compound_text;
alist[3] = c_string;
- XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 32, PropModeReplace, (unsigned char*)alist, 4);
+ XChangeProperty(m_display, xse->requestor, xse->property, xse->target, 32, PropModeReplace,
+ (unsigned char*)alist, 4);
XFlush(m_display);
} else {
//Change property to None because we do not support anything but STRING
diff --git a/intern/ghost/intern/GHOST_TimerTask.h b/intern/ghost/intern/GHOST_TimerTask.h
index 01bf0053343..ac86d6c1ce6 100644
--- a/intern/ghost/intern/GHOST_TimerTask.h
+++ b/intern/ghost/intern/GHOST_TimerTask.h
@@ -51,8 +51,16 @@ public:
* @param timerProc The callbak invoked when the interval expires.
* @param data The timer user data.
*/
- GHOST_TimerTask(GHOST_TUns64 start, GHOST_TUns64 interval, GHOST_TimerProcPtr timerProc, GHOST_TUserDataPtr userData = 0)
- : m_start(start), m_interval(interval), m_next(start), m_timerProc(timerProc), m_userData(userData), m_auxData(0)
+ GHOST_TimerTask(GHOST_TUns64 start,
+ GHOST_TUns64 interval,
+ GHOST_TimerProcPtr timerProc,
+ GHOST_TUserDataPtr userData = 0)
+ : m_start(start),
+ m_interval(interval),
+ m_next(start),
+ m_timerProc(timerProc),
+ m_userData(userData),
+ m_auxData(0)
{
}
diff --git a/intern/ghost/intern/GHOST_Window.cpp b/intern/ghost/intern/GHOST_Window.cpp
index 0545b309f4b..b560b04b5df 100644
--- a/intern/ghost/intern/GHOST_Window.cpp
+++ b/intern/ghost/intern/GHOST_Window.cpp
@@ -145,15 +145,15 @@ GHOST_TSuccess GHOST_Window::setCursorShape(GHOST_TStandardCursor cursorShape)
}
GHOST_TSuccess GHOST_Window::setCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2],
- int hotX, int hotY)
+ int hotX, int hotY)
{
- return setCustomCursorShape( (GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask,
- 16, 16, hotX, hotY, 0, 1 );
+ return setCustomCursorShape((GHOST_TUns8 *)bitmap, (GHOST_TUns8 *)mask,
+ 16, 16, hotX, hotY, 0, 1 );
}
GHOST_TSuccess GHOST_Window::setCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
- int sizex, int sizey, int hotX, int hotY,
- int fg_color, int bg_color )
+ int sizex, int sizey, int hotX, int hotY,
+ int fg_color, int bg_color)
{
if (setWindowCustomCursorShape(bitmap, mask, sizex, sizey,hotX, hotY, fg_color, bg_color)) {
m_cursorShape = GHOST_kStandardCursorCustom;
diff --git a/intern/ghost/intern/GHOST_Window.h b/intern/ghost/intern/GHOST_Window.h
index a9f070b8951..646097d42c4 100644
--- a/intern/ghost/intern/GHOST_Window.h
+++ b/intern/ghost/intern/GHOST_Window.h
@@ -289,8 +289,9 @@ protected:
* Sets the cursor shape on the window using
* native window system calls.
*/
- virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2],
- int hotX, int hotY) = 0;
+ virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2],
+ GHOST_TUns8 mask[16][2],
+ int hotX, int hotY) = 0;
virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask,
int szx, int szy, int hotX, int hotY, int fg, int bg) = 0;
diff --git a/intern/ghost/intern/GHOST_WindowCarbon.cpp b/intern/ghost/intern/GHOST_WindowCarbon.cpp
index b226d5ec83e..ab7325fcef8 100644
--- a/intern/ghost/intern/GHOST_WindowCarbon.cpp
+++ b/intern/ghost/intern/GHOST_WindowCarbon.cpp
@@ -70,7 +70,8 @@ const EventTypeSpec kWEvents[] = {
{ kEventClassWindow, kEventWindowZoom }, /* for new zoom behaviour */
};
-static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData) {
+static OSStatus myWEventHandlerProc(EventHandlerCallRef handler, EventRef event, void* userData)
+{
WindowRef mywindow;
GHOST_WindowCarbon *ghost_window;
OSStatus err;
diff --git a/intern/ghost/intern/GHOST_WindowCocoa.mm b/intern/ghost/intern/GHOST_WindowCocoa.mm
index 01217dfd17a..fbb474cb20a 100644
--- a/intern/ghost/intern/GHOST_WindowCocoa.mm
+++ b/intern/ghost/intern/GHOST_WindowCocoa.mm
@@ -34,6 +34,7 @@
#endif
#include <OpenGL/gl.h>
+#include <OpenGL/CGLRenderers.h>
/***** Multithreaded opengl code : uncomment for enabling
#include <OpenGL/OpenGL.h>
*/
@@ -485,7 +486,14 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
// needed for 'Draw Overlap' drawing method
pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore;
- pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
+ // Force software OpenGL, for debugging
+ if(getenv("BLENDER_SOFTWAREGL")) {
+ pixelFormatAttrsWindow[i++] = NSOpenGLPFARendererID;
+ pixelFormatAttrsWindow[i++] = kCGLRendererGenericID;
+ }
+ else
+ pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
+
//pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway
pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize;
@@ -521,7 +529,14 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
// needed for 'Draw Overlap' drawing method
pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore;
- pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
+ // Force software OpenGL, for debugging
+ if(getenv("BLENDER_SOFTWAREGL")) {
+ pixelFormatAttrsWindow[i++] = NSOpenGLPFARendererID;
+ pixelFormatAttrsWindow[i++] = kCGLRendererGenericID;
+ }
+ else
+ pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
+
//pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway
pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize;
diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index a363130c897..8e37d1832df 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -1196,10 +1196,11 @@ static GHOST_TUns16 uns16ReverseBits(GHOST_TUns16 shrt)
return shrt;
}
GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2],
- GHOST_TUns8 mask[16][2], int hotX, int hotY)
+ GHOST_TUns8 mask[16][2],
+ int hotX, int hotY)
{
return setWindowCustomCursorShape((GHOST_TUns8*)bitmap, (GHOST_TUns8*)mask,
- 16, 16, hotX, hotY, 0, 1);
+ 16, 16, hotX, hotY, 0, 1);
}
GHOST_TSuccess GHOST_WindowWin32::setWindowCustomCursorShape(GHOST_TUns8 *bitmap,
@@ -1268,7 +1269,8 @@ GHOST_TSuccess GHOST_WindowWin32::endProgressBar()
/* Ron Fosner's code for weighting pixel formats and forcing software.
See http://www.opengl.org/resources/faq/technical/weight.cpp */
-static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) {
+static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd)
+{
int weight = 0;
/* assume desktop color depth is 32 bits per pixel */
@@ -1301,7 +1303,8 @@ static int WeightPixelFormat(PIXELFORMATDESCRIPTOR& pfd) {
/* A modification of Ron Fosner's replacement for ChoosePixelFormat */
/* returns 0 on error, else returns the pixel format number to be used */
-static int EnumPixelFormats(HDC hdc) {
+static int EnumPixelFormats(HDC hdc)
+{
int iPixelFormat;
int i, n, w, weight = 0;
PIXELFORMATDESCRIPTOR pfd;
diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h
index b24f37aa264..190966ee485 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.h
+++ b/intern/ghost/intern/GHOST_WindowWin32.h
@@ -309,7 +309,9 @@ protected:
* Sets the cursor shape on the window using
* native window system calls.
*/
- virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2], GHOST_TUns8 mask[16][2], int hotX, int hotY);
+ virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2],
+ GHOST_TUns8 mask[16][2],
+ int hotX, int hotY);
virtual GHOST_TSuccess setWindowCustomCursorShape(
GHOST_TUns8 *bitmap,
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index c379e4c7e48..71e3f7b3340 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -239,7 +239,8 @@ GHOST_WindowX11(
}
} else {
if (m_numOfAASamples && (m_numOfAASamples > samples)) {
- printf("%s:%d: oversampling requested %i but using %i samples\n", __FILE__, __LINE__, m_numOfAASamples, samples);
+ printf("%s:%d: oversampling requested %i but using %i samples\n",
+ __FILE__, __LINE__, m_numOfAASamples, samples);
}
break;
}
@@ -471,7 +472,8 @@ GHOST_WindowX11(
is configured but not plugged in.
*/
-static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent) {
+static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
+{
fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
theEvent->error_code, theEvent->request_code) ;
@@ -1343,7 +1345,9 @@ installDrawingContext(
if (!s_firstContext) {
s_firstContext = m_context;
}
- glXMakeCurrent(m_display, m_window,m_context);
+ glXMakeCurrent(m_display, m_window,m_context);
+ glClearColor(0.447, 0.447, 0.447, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
success = GHOST_kSuccess;
} else {
success = GHOST_kFailure;
@@ -1491,7 +1495,8 @@ setWindowCursorGrab(
}
#ifdef GHOST_X11_GRAB
- XGrabPointer(m_display, m_window, False, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+ XGrabPointer(m_display, m_window, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
+ GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
#endif
}
else {
diff --git a/intern/guardedalloc/MEM_sys_types.h b/intern/guardedalloc/MEM_sys_types.h
index 345df5b16cf..764d7c6cfa2 100644
--- a/intern/guardedalloc/MEM_sys_types.h
+++ b/intern/guardedalloc/MEM_sys_types.h
@@ -93,6 +93,16 @@ typedef unsigned long uintptr_t;
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
+/* XXX */
+
+#ifndef UINT64_MAX
+# define UINT64_MAX 18446744073709551615
+typedef uint8_t u_int8_t;
+typedef uint16_t u_int16_t;
+typedef uint32_t u_int32_t;
+typedef uint64_t u_int64_t;
+#endif
+
#elif defined (__APPLE__)
#include <inttypes.h>
diff --git a/intern/iksolver/intern/IK_Solver.cpp b/intern/iksolver/intern/IK_Solver.cpp
index af49b07d064..3876f26362c 100644
--- a/intern/iksolver/intern/IK_Solver.cpp
+++ b/intern/iksolver/intern/IK_Solver.cpp
@@ -225,11 +225,12 @@ void IK_SetStiffness(IK_Segment *seg, IK_SegmentAxis axis, float stiffness)
void IK_GetBasisChange(IK_Segment *seg, float basis_change[][3])
{
IK_QSegment *qseg = (IK_QSegment*)seg;
- const MT_Matrix3x3& change = qseg->BasisChange();
if (qseg->Translational() && qseg->Composite())
qseg = qseg->Composite();
+ const MT_Matrix3x3& change = qseg->BasisChange();
+
// convert from moto row major to blender column major
basis_change[0][0] = (float)change[0][0];
basis_change[1][0] = (float)change[0][1];
diff --git a/intern/mikktspace/mikktspace.c b/intern/mikktspace/mikktspace.c
index ff857e82d8f..2036e601bcb 100644
--- a/intern/mikktspace/mikktspace.c
+++ b/intern/mikktspace/mikktspace.c
@@ -1350,7 +1350,6 @@ static tbool GenerateTSpaces(STSpace psTspace[], const STriInfo pTriInfos[], con
for(s=0; s<iUniqueSubGroups; s++)
free(pUniSubGroups[s].pTriMembers);
iUniqueTspaces += iUniqueSubGroups;
- iUniqueSubGroups = 0;
}
// clean up
diff --git a/intern/opennl/intern/opennl.c b/intern/opennl/intern/opennl.c
index c3fb7135fcb..20b4c0a6681 100644
--- a/intern/opennl/intern/opennl.c
+++ b/intern/opennl/intern/opennl.c
@@ -1137,7 +1137,7 @@ static NLboolean __nlInvert_SUPERLU(__NLContext *context) {
/* SuperLU variables */
SuperMatrix B;
- NLint info;
+ NLint info = 0;
for(j=0; j<context->nb_rhs; j++, b+=n, x+=n) {
/* Create superlu array for B */
diff --git a/intern/opennl/superlu/get_perm_c.c b/intern/opennl/superlu/get_perm_c.c
index 2eb0aea678e..320fe3471f4 100644
--- a/intern/opennl/superlu/get_perm_c.c
+++ b/intern/opennl/superlu/get_perm_c.c
@@ -368,7 +368,7 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
int m, n, bnz, *b_colptr, i;
int delta, maxint, nofsub, *invp;
int *b_rowind, *dhead, *qsize, *llist, *marker;
- double t, SuperLU_timer_();
+ /* double t, SuperLU_timer_(); */
/* make gcc happy */
b_rowind=NULL;
@@ -377,7 +377,7 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
m = A->nrow;
n = A->ncol;
- t = SuperLU_timer_();
+ /* t = SuperLU_timer_(); */
switch ( ispec ) {
case 0: /* Natural ordering */
for (i = 0; i < n; ++i) perm_c[i] = i;
@@ -391,8 +391,8 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
#if ( PRNTlevel>=1 )
printf("Use minimum degree ordering on A'*A.\n");
#endif
- t = SuperLU_timer_() - t;
- /*printf("Form A'*A time = %8.3f\n", t);*/
+ /*t = SuperLU_timer_() - t;
+ printf("Form A'*A time = %8.3f\n", t);*/
break;
case 2: /* Minimum degree ordering on A'+A */
if ( m != n ) ABORT("Matrix is not square");
@@ -401,8 +401,8 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
#if ( PRNTlevel>=1 )
printf("Use minimum degree ordering on A'+A.\n");
#endif
- t = SuperLU_timer_() - t;
- /*printf("Form A'+A time = %8.3f\n", t);*/
+ /*t = SuperLU_timer_() - t;
+ printf("Form A'+A time = %8.3f\n", t);*/
break;
case 3: /* Approximate minimum degree column ordering. */
get_colamd(m, n, Astore->nnz, Astore->colptr, Astore->rowind,
@@ -417,7 +417,7 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
}
if ( bnz != 0 ) {
- t = SuperLU_timer_();
+ /* t = SuperLU_timer_(); */
/* Initialize and allocate storage for GENMMD. */
delta = 1; /* DELTA is a parameter to allow the choice of nodes
@@ -452,8 +452,8 @@ get_perm_c(int ispec, SuperMatrix *A, int *perm_c)
SUPERLU_FREE(llist);
SUPERLU_FREE(marker);
- t = SuperLU_timer_() - t;
- /* printf("call GENMMD time = %8.3f\n", t);*/
+ /* t = SuperLU_timer_() - t;
+ printf("call GENMMD time = %8.3f\n", t);*/
} else { /* Empty adjacency structure */
for (i = 0; i < n; ++i) perm_c[i] = i;
diff --git a/intern/opennl/superlu/scolumn_bmod.c b/intern/opennl/superlu/scolumn_bmod.c
index cb8d83686be..3d4f5968778 100644
--- a/intern/opennl/superlu/scolumn_bmod.c
+++ b/intern/opennl/superlu/scolumn_bmod.c
@@ -303,7 +303,6 @@ scolumn_bmod (
d_fsupc=0 if fsupc >= fpanelc. */
d_fsupc = fst_col - fsupc;
- lptr = xlsub[fsupc] + d_fsupc;
luptr = xlusup[fst_col] + d_fsupc;
nsupr = xlsub[fsupc+1] - xlsub[fsupc]; /* Leading dimension */
nsupc = jcol - fst_col; /* Excluding jcol */
diff --git a/intern/opennl/superlu/strsv.c b/intern/opennl/superlu/strsv.c
index a1d66ed7341..da904ba3e9d 100644
--- a/intern/opennl/superlu/strsv.c
+++ b/intern/opennl/superlu/strsv.c
@@ -9,9 +9,6 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
{
- /* System generated locals */
- int i__1, i__2;
-
/* Local variables */
static int info;
static float temp;
@@ -213,14 +210,12 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
}
} else {
if (*incx == 1) {
- i__1 = *n;
for (j = 1; j <= *n; ++j) {
if (X(j) != 0.f) {
if (nounit) {
X(j) /= A(j,j);
}
temp = X(j);
- i__2 = *n;
for (i = j + 1; i <= *n; ++i) {
X(i) -= temp * A(i,j);
/* L50: */
@@ -230,7 +225,6 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
}
} else {
jx = kx;
- i__1 = *n;
for (j = 1; j <= *n; ++j) {
if (X(jx) != 0.f) {
if (nounit) {
@@ -238,7 +232,6 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
}
temp = X(jx);
ix = jx;
- i__2 = *n;
for (i = j + 1; i <= *n; ++i) {
ix += *incx;
X(ix) -= temp * A(i,j);
@@ -256,10 +249,8 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
if (lsame_(uplo, "U")) {
if (*incx == 1) {
- i__1 = *n;
for (j = 1; j <= *n; ++j) {
temp = X(j);
- i__2 = j - 1;
for (i = 1; i <= j-1; ++i) {
temp -= A(i,j) * X(i);
/* L90: */
@@ -272,11 +263,9 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
}
} else {
jx = kx;
- i__1 = *n;
for (j = 1; j <= *n; ++j) {
temp = X(jx);
ix = kx;
- i__2 = j - 1;
for (i = 1; i <= j-1; ++i) {
temp -= A(i,j) * X(ix);
ix += *incx;
@@ -294,7 +283,6 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
if (*incx == 1) {
for (j = *n; j >= 1; --j) {
temp = X(j);
- i__1 = j + 1;
for (i = *n; i >= j+1; --i) {
temp -= A(i,j) * X(i);
/* L130: */
@@ -311,7 +299,6 @@ int strsv_(char *, char *, char *, int *, float *, int *, float *, int *);
for (j = *n; j >= 1; --j) {
temp = X(jx);
ix = kx;
- i__1 = j + 1;
for (i = *n; i >= j+1; --i) {
temp -= A(i,j) * X(ix);
ix -= *incx;
diff --git a/intern/opennl/superlu/sutil.c b/intern/opennl/superlu/sutil.c
index 510ade8233c..a77e87b9c65 100644
--- a/intern/opennl/superlu/sutil.c
+++ b/intern/opennl/superlu/sutil.c
@@ -370,8 +370,6 @@ void
sFillRHS(trans_t trans, int nrhs, float *x, int ldx,
SuperMatrix *A, SuperMatrix *B)
{
- NCformat *Astore;
- float *Aval;
DNformat *Bstore;
float *rhs;
float one = 1.0;
@@ -379,8 +377,6 @@ sFillRHS(trans_t trans, int nrhs, float *x, int ldx,
int ldc;
char transc[1];
- Astore = A->Store;
- Aval = (float *) Astore->nzval;
Bstore = B->Store;
rhs = Bstore->nzval;
ldc = Bstore->lda;
diff --git a/intern/opennl/superlu/util.h b/intern/opennl/superlu/util.h
index f13108b2256..c4c478cec2b 100644
--- a/intern/opennl/superlu/util.h
+++ b/intern/opennl/superlu/util.h
@@ -24,7 +24,8 @@
#define NUM_TEMPV(m,w,t,b) ( SUPERLU_MAX(m, (t + b)*w) )
#ifndef USER_ABORT
-#define USER_ABORT(msg) superlu_abort_and_exit(msg)
+#define USER_ABORT(msg) \
+ { fprintf(stderr, "%s", msg); exit (-1); }
#endif
#define ABORT(err_msg) \
diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp
index f34051dea76..a2f3c21bbbf 100644
--- a/intern/smoke/intern/smoke_API.cpp
+++ b/intern/smoke/intern/smoke_API.cpp
@@ -211,7 +211,8 @@ extern "C" void smoke_initWaveletBlenderRNA(WTURBULENCE *wt, float *strength)
wt->initBlenderRNA(strength);
}
-template < class T > inline T ABS( T a ) {
+template < class T > inline T ABS( T a )
+{
return (0 < a) ? a : -a ;
}
diff --git a/release/datafiles/blender_icons.png b/release/datafiles/blender_icons.png
index caff03b107b..dc4e7652057 100644
--- a/release/datafiles/blender_icons.png
+++ b/release/datafiles/blender_icons.png
Binary files differ
diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png
index 5de3f868d1a..852a389b390 100644
--- a/release/datafiles/splash.png
+++ b/release/datafiles/splash.png
Binary files differ
diff --git a/release/plugins/sequence/color-correction-hsv.c b/release/plugins/sequence/color-correction-hsv.c
index 1ee58e256d2..1dcf0096efa 100644
--- a/release/plugins/sequence/color-correction-hsv.c
+++ b/release/plugins/sequence/color-correction-hsv.c
@@ -62,7 +62,8 @@ int plugin_seq_getversion(void) { return B_PLUGIN_VERSION;}
void plugin_but_changed(int but) {}
void plugin_init() {}
-void plugin_getinfo(PluginInfo *info) {
+void plugin_getinfo(PluginInfo *info)
+{
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;
diff --git a/release/plugins/sequence/color-correction-yuv.c b/release/plugins/sequence/color-correction-yuv.c
index 1a78fc7d4b6..cc6c6198431 100644
--- a/release/plugins/sequence/color-correction-yuv.c
+++ b/release/plugins/sequence/color-correction-yuv.c
@@ -62,7 +62,8 @@ int plugin_seq_getversion(void) { return B_PLUGIN_VERSION;}
void plugin_but_changed(int but) {}
void plugin_init() {}
-void plugin_getinfo(PluginInfo *info) {
+void plugin_getinfo(PluginInfo *info)
+{
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;
@@ -74,7 +75,8 @@ void plugin_getinfo(PluginInfo *info) {
info->callback= plugin_but_changed;
}
-static void rgb_to_yuv(float rgb[3], float yuv[3]) {
+static void rgb_to_yuv(float rgb[3], float yuv[3])
+{
yuv[0]= 0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2];
yuv[1]= 0.492*(rgb[2] - yuv[0]);
yuv[2]= 0.877*(rgb[0] - yuv[0]);
@@ -84,7 +86,8 @@ static void rgb_to_yuv(float rgb[3], float yuv[3]) {
yuv[2] /= 0.615;
}
-static void yuv_to_rgb(float yuv[3], float rgb[3]) {
+static void yuv_to_rgb(float yuv[3], float rgb[3])
+{
yuv[1] *= 0.436;
yuv[2] *= 0.615;
diff --git a/release/plugins/sequence/dnr.c b/release/plugins/sequence/dnr.c
index 74b3a06ccbb..ab47361ea73 100644
--- a/release/plugins/sequence/dnr.c
+++ b/release/plugins/sequence/dnr.c
@@ -90,7 +90,8 @@ void plugin_seq_free_private_data(void * data)
free(d);
}
-void plugin_getinfo(PluginInfo *info) {
+void plugin_getinfo(PluginInfo *info)
+{
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;
diff --git a/release/plugins/sequence/gamma.c b/release/plugins/sequence/gamma.c
index 1560c5805df..596c98646f3 100644
--- a/release/plugins/sequence/gamma.c
+++ b/release/plugins/sequence/gamma.c
@@ -67,7 +67,8 @@ int plugin_seq_getversion(void) { return B_PLUGIN_VERSION; }
void plugin_but_changed(int but) {}
void plugin_init() {}
-void plugin_getinfo(PluginInfo *info) {
+void plugin_getinfo(PluginInfo *info)
+{
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;
diff --git a/release/scripts/modules/animsys_refactor.py b/release/scripts/modules/animsys_refactor.py
index f97ba3c2a50..8db21e357d9 100644
--- a/release/scripts/modules/animsys_refactor.py
+++ b/release/scripts/modules/animsys_refactor.py
@@ -38,6 +38,7 @@ class DataPathBuilder(object):
""" Dummy class used to parse fcurve and driver data paths.
"""
__slots__ = ("data_path", )
+
def __init__(self, attrs):
self.data_path = attrs
diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py
index 4173d71b39c..98a3c81d65a 100644
--- a/release/scripts/modules/bpy/path.py
+++ b/release/scripts/modules/bpy/path.py
@@ -54,7 +54,7 @@ def abspath(path, start=None, library=None):
"""
if path.startswith("//"):
if library:
- start = abspath(_os.path.dirname(library.filepath))
+ start = _os.path.dirname(abspath(library.filepath))
return _os.path.join(_os.path.dirname(_bpy.data.filepath)
if start is None else start,
path[2:],
diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py
index cf3e92bdcbf..6fd15c146f2 100644
--- a/release/scripts/modules/bpy/utils.py
+++ b/release/scripts/modules/bpy/utils.py
@@ -349,6 +349,14 @@ def preset_paths(subdir):
raise Exception("invalid subdir given %r" % subdir)
elif _os.path.isdir(directory):
dirs.append(directory)
+
+ # Find addons preset paths
+ import addon_utils
+ for path in addon_utils.paths():
+ directory = _os.path.join(path, "presets", subdir)
+ if _os.path.isdir(directory):
+ dirs.append(directory)
+
return dirs
diff --git a/release/scripts/modules/bpy_extras/image_utils.py b/release/scripts/modules/bpy_extras/image_utils.py
index 52050b08bc7..7d409510c85 100644
--- a/release/scripts/modules/bpy_extras/image_utils.py
+++ b/release/scripts/modules/bpy_extras/image_utils.py
@@ -65,19 +65,45 @@ def load_image(imagepath,
# TODO: recursive
+ # -------------------------------------------------------------------------
+ # Utility Functions
+
+ def _image_load_placeholder(path):
+ name = bpy.path.basename(path)
+ if type(name) == bytes:
+ name = name.decode('utf-8', "replace")
+ image = bpy.data.images.new(name, 128, 128)
+ # allow the path to be resolved later
+ image.filepath = path
+ image.source = 'FILE'
+ return image
+
def _image_load(path):
import bpy
if convert_callback:
path = convert_callback(path)
- image = bpy.data.images.load(path)
+ try:
+ image = bpy.data.images.load(path)
+ except RuntimeError:
+ image = None
if verbose:
- print(" image loaded '%s'" % path)
+ if image:
+ print(" image loaded '%s'" % path)
+ else:
+ print(" image load failed '%s'" % path)
+
+ # image path has been checked so the path could not be read for some
+ # reason, so be sure to return a placeholder
+ if place_holder:
+ image = _image_load_placeholder(path)
return image
+ # -------------------------------------------------------------------------
+
if verbose:
print("load_image('%s', '%s', ...)" % (imagepath, dirname))
@@ -103,11 +129,9 @@ def load_image(imagepath,
if os.path.exists(nfilepath):
return _image_load(nfilepath)
+ # None of the paths exist so return placeholder
if place_holder:
- image = bpy.data.images.new(bpy.path.basename(imagepath), 128, 128)
- # allow the path to be resolved later
- image.filepath = imagepath
- return image
+ return _image_load_placeholder(imagepath)
# TODO comprehensiveImageLoad also searched in bpy.config.textureDir
return None
diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py
index 3d71feaf79e..38fdb8f5fec 100644
--- a/release/scripts/modules/bpy_extras/io_utils.py
+++ b/release/scripts/modules/bpy_extras/io_utils.py
@@ -121,24 +121,24 @@ _axis_convert_matrix = (
((-1.0, 0.0, 0.0), (0.0, 0.0, 1.0), (0.0, 1.0, 0.0)),
((-1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, -1.0)),
((0.0, -1.0, 0.0), (-1.0, 0.0, 0.0), (0.0, 0.0, -1.0)),
- ((0.0, -1.0, 0.0), (0.0, 0.0, -1.0), (1.0, 0.0, 0.0)),
- ((0.0, -1.0, 0.0), (0.0, 0.0, 1.0), (-1.0, 0.0, 0.0)),
- ((0.0, -1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 1.0)),
+ ((0.0, 0.0, 1.0), (-1.0, 0.0, 0.0), (0.0, -1.0, 0.0)),
((0.0, 0.0, -1.0), (-1.0, 0.0, 0.0), (0.0, 1.0, 0.0)),
+ ((0.0, 1.0, 0.0), (-1.0, 0.0, 0.0), (0.0, 0.0, 1.0)),
+ ((0.0, -1.0, 0.0), (0.0, 0.0, 1.0), (-1.0, 0.0, 0.0)),
((0.0, 0.0, -1.0), (0.0, -1.0, 0.0), (-1.0, 0.0, 0.0)),
- ((0.0, 0.0, -1.0), (0.0, 1.0, 0.0), (1.0, 0.0, 0.0)),
- ((0.0, 0.0, -1.0), (1.0, 0.0, 0.0), (0.0, -1.0, 0.0)),
- ((0.0, 0.0, 1.0), (-1.0, 0.0, 0.0), (0.0, -1.0, 0.0)),
- ((0.0, 0.0, 1.0), (0.0, -1.0, 0.0), (1.0, 0.0, 0.0)),
((0.0, 0.0, 1.0), (0.0, 1.0, 0.0), (-1.0, 0.0, 0.0)),
- ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)),
- ((0.0, 1.0, 0.0), (-1.0, 0.0, 0.0), (0.0, 0.0, 1.0)),
((0.0, 1.0, 0.0), (0.0, 0.0, -1.0), (-1.0, 0.0, 0.0)),
+ ((0.0, -1.0, 0.0), (0.0, 0.0, -1.0), (1.0, 0.0, 0.0)),
+ ((0.0, 0.0, 1.0), (0.0, -1.0, 0.0), (1.0, 0.0, 0.0)),
+ ((0.0, 0.0, -1.0), (0.0, 1.0, 0.0), (1.0, 0.0, 0.0)),
((0.0, 1.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
+ ((0.0, -1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, 1.0)),
+ ((0.0, 0.0, -1.0), (1.0, 0.0, 0.0), (0.0, -1.0, 0.0)),
+ ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)),
((0.0, 1.0, 0.0), (1.0, 0.0, 0.0), (0.0, 0.0, -1.0)),
((1.0, 0.0, 0.0), (0.0, -1.0, 0.0), (0.0, 0.0, -1.0)),
- ((1.0, 0.0, 0.0), (0.0, 0.0, -1.0), (0.0, 1.0, 0.0)),
((1.0, 0.0, 0.0), (0.0, 0.0, 1.0), (0.0, -1.0, 0.0)),
+ ((1.0, 0.0, 0.0), (0.0, 0.0, -1.0), (0.0, 1.0, 0.0)),
)
# store args as a single int
@@ -269,8 +269,6 @@ def axis_conversion_ensure(operator, forward_attr, up_attr):
return axis_forward, axis_up
- change = False
-
axis = getattr(operator, forward_attr), getattr(operator, up_attr)
axis_new = validate(*axis)
diff --git a/release/scripts/modules/bpy_extras/keyconfig_utils.py b/release/scripts/modules/bpy_extras/keyconfig_utils.py
index fab6886b314..a9eb86aaf79 100644
--- a/release/scripts/modules/bpy_extras/keyconfig_utils.py
+++ b/release/scripts/modules/bpy_extras/keyconfig_utils.py
@@ -89,7 +89,6 @@ KM_HIERARCHY = [
('Property Editor', 'PROPERTIES', 'WINDOW', []), # align context menu
- ('Script', 'SCRIPTS_WINDOW', 'WINDOW', []),
('Text', 'TEXT_EDITOR', 'WINDOW', []),
('Console', 'CONSOLE', 'WINDOW', []),
('Clip', 'CLIP_EDITOR', 'WINDOW', [
diff --git a/release/scripts/modules/bpy_extras/view3d_utils.py b/release/scripts/modules/bpy_extras/view3d_utils.py
index 32f7b654690..edc17c36c36 100644
--- a/release/scripts/modules/bpy_extras/view3d_utils.py
+++ b/release/scripts/modules/bpy_extras/view3d_utils.py
@@ -42,6 +42,7 @@ def region_2d_to_vector_3d(region, rv3d, coord):
"""
from mathutils import Vector
+ viewinv = rv3d.view_matrix.inverted()
if rv3d.is_perspective:
persinv = rv3d.perspective_matrix.inverted()
@@ -50,13 +51,11 @@ def region_2d_to_vector_3d(region, rv3d, coord):
-0.5
))
- w = ((out[0] * persinv[0][3]) +
- (out[1] * persinv[1][3]) +
- (out[2] * persinv[2][3]) + persinv[3][3])
+ w = out.dot(persinv[3].xyz) + persinv[3][3]
- return ((persinv * out) / w) - rv3d.view_matrix.inverted()[3].xyz
+ return ((persinv * out) / w) - viewinv.translation
else:
- return rv3d.view_matrix.inverted()[2].xyz.normalized()
+ return viewinv.col[2].xyz.normalized()
def region_2d_to_location_3d(region, rv3d, coord, depth_location):
@@ -81,15 +80,16 @@ def region_2d_to_location_3d(region, rv3d, coord, depth_location):
from mathutils.geometry import intersect_point_line
persmat = rv3d.perspective_matrix.copy()
+ viewinv = rv3d.view_matrix.inverted()
coord_vec = region_2d_to_vector_3d(region, rv3d, coord)
depth_location = Vector(depth_location)
if rv3d.is_perspective:
from mathutils.geometry import intersect_line_plane
- origin_start = rv3d.view_matrix.inverted()[3].to_3d()
+ origin_start = viewinv.translation.copy()
origin_end = origin_start + coord_vec
- view_vec = rv3d.view_matrix.inverted()[2]
+ view_vec = viewinv.col[2].copy()
return intersect_line_plane(origin_start,
origin_end,
depth_location,
@@ -100,8 +100,9 @@ def region_2d_to_location_3d(region, rv3d, coord, depth_location):
dy = (2.0 * coord[1] / region.height) - 1.0
persinv = persmat.inverted()
viewinv = rv3d.view_matrix.inverted()
- origin_start = ((persinv[0].xyz * dx) +
- (persinv[1].xyz * dy) + viewinv[3].xyz)
+ origin_start = ((persinv.col[0].xyz * dx) +
+ (persinv.col[1].xyz * dy) +
+ viewinv.translation)
origin_end = origin_start + coord_vec
return intersect_point_line(depth_location,
origin_start,
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index 388ae2b0e13..32c8ed11bc5 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -145,11 +145,11 @@ def draw(layout, context, context_member, property_type, use_edit=True):
if use_edit:
row = split.row(align=True)
- prop = row.operator("wm.properties_edit", text="edit")
- assign_props(prop, val_draw, key)
+ props = row.operator("wm.properties_edit", text="edit")
+ assign_props(props, val_draw, key)
- prop = row.operator("wm.properties_remove", text="", icon='ZOOMOUT')
- assign_props(prop, val_draw, key)
+ props = row.operator("wm.properties_remove", text="", icon='ZOOMOUT')
+ assign_props(props, val_draw, key)
class PropertyPanel():
diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py
new file mode 100644
index 00000000000..1a0cf4bab9d
--- /dev/null
+++ b/release/scripts/modules/rna_xml.py
@@ -0,0 +1,300 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Contributor(s): Campbell Barton
+#
+# ***** END GPL LICENSE BLOCK *****
+
+# <pep8 compliant>
+
+import bpy
+
+
+def build_property_typemap(skip_classes):
+
+ property_typemap = {}
+
+ for attr in dir(bpy.types):
+ cls = getattr(bpy.types, attr)
+ if issubclass(cls, skip_classes):
+ continue
+
+ properties = cls.bl_rna.properties.keys()
+ properties.remove("rna_type")
+ property_typemap[attr] = properties
+
+ return property_typemap
+
+
+def print_ln(data):
+ print(data, end="")
+
+
+def rna2xml(fw=print_ln,
+ root_node="",
+ root_rna=None, # must be set
+ root_rna_skip=set(),
+ ident_val=" ",
+ skip_classes=(bpy.types.Operator,
+ bpy.types.Panel,
+ bpy.types.KeyingSet,
+ bpy.types.Header,
+ ),
+ pretty_format=True,
+ method='DATA'):
+
+ from xml.sax.saxutils import quoteattr
+ property_typemap = build_property_typemap(skip_classes)
+
+ def number_to_str(val, val_type):
+ if val_type == int:
+ return "%d" % val
+ elif val_type == float:
+ return "%.6g" % val
+ elif val_type == bool:
+ return "TRUE" if val else "FALSE"
+ else:
+ raise NotImplemented("this type is not a number %s" % val_type)
+
+ def rna2xml_node(ident, value, parent):
+ ident_next = ident + ident_val
+
+ # divide into attrs and nodes.
+ node_attrs = []
+ nodes_items = []
+ nodes_lists = []
+
+ value_type = type(value)
+
+ if issubclass(value_type, skip_classes):
+ return
+
+ # XXX, fixme, pointcache has eternal nested pointer to its self.
+ if value == parent:
+ return
+
+ value_type_name = value_type.__name__
+ for prop in property_typemap[value_type_name]:
+
+ subvalue = getattr(value, prop)
+ subvalue_type = type(subvalue)
+
+ if subvalue_type in (int, bool, float):
+ node_attrs.append("%s=\"%s\"" % (prop, number_to_str(subvalue, subvalue_type)))
+ elif subvalue_type is str:
+ node_attrs.append("%s=%s" % (prop, quoteattr(subvalue)))
+ elif subvalue_type == set:
+ node_attrs.append("%s=%s" % (prop, quoteattr("{" + ",".join(list(subvalue)) + "}")))
+ elif subvalue is None:
+ node_attrs.append("%s=\"NONE\"" % prop)
+ elif issubclass(subvalue_type, bpy.types.ID):
+ # special case, ID's are always referenced.
+ node_attrs.append("%s=%s" % (prop, quoteattr(subvalue_type.__name__ + "::" + subvalue.name)))
+ else:
+ try:
+ subvalue_ls = list(subvalue)
+ except:
+ subvalue_ls = None
+
+ if subvalue_ls is None:
+ nodes_items.append((prop, subvalue, subvalue_type))
+ else:
+ # check if the list contains native types
+ subvalue_rna = value.path_resolve(prop, False)
+ if type(subvalue_rna).__name__ == "bpy_prop_array":
+ # check if this is a 0-1 color (rgb, rgba)
+ # in that case write as a hexidecimal
+ prop_rna = value.bl_rna.properties[prop]
+ if (prop_rna.subtype == 'COLOR_GAMMA' and
+ prop_rna.hard_min == 0.0 and
+ prop_rna.hard_max == 1.0 and
+ prop_rna.array_length in {3, 4}):
+ # -----
+ # color
+ array_value = "#" + "".join(("%.2x" % int(v * 255) for v in subvalue_rna))
+
+ else:
+ # default
+ def str_recursive(s):
+ subsubvalue_type = type(s)
+ if subsubvalue_type in (int, float, bool):
+ return number_to_str(s, subsubvalue_type)
+ else:
+ return " ".join([str_recursive(si) for si in s])
+
+ array_value = " ".join(str_recursive(v) for v in subvalue_rna)
+
+ node_attrs.append("%s=\"%s\"" % (prop, array_value))
+ else:
+ nodes_lists.append((prop, subvalue_ls, subvalue_type))
+
+ # declare + attributes
+ if pretty_format:
+ tmp_str = "<%s " % value_type_name
+ tmp_ident = "\n" + ident + (" " * len(tmp_str))
+
+ fw("%s%s%s>\n" % (ident, tmp_str, tmp_ident.join(node_attrs)))
+
+ del tmp_str
+ del tmp_ident
+ else:
+ fw("%s<%s %s>\n" % (ident, value_type_name, " ".join(node_attrs)))
+
+ # unique members
+ for prop, subvalue, subvalue_type in nodes_items:
+ fw("%s<%s>\n" % (ident_next, prop)) # XXX, this is awkward, how best to solve?
+ rna2xml_node(ident_next + ident_val, subvalue, value)
+ fw("%s</%s>\n" % (ident_next, prop)) # XXX, need to check on this.
+
+ # list members
+ for prop, subvalue, subvalue_type in nodes_lists:
+ fw("%s<%s>\n" % (ident_next, prop))
+ for subvalue_item in subvalue:
+ if subvalue_item is not None:
+ rna2xml_node(ident_next + ident_val, subvalue_item, value)
+ fw("%s</%s>\n" % (ident_next, prop))
+
+ fw("%s</%s>\n" % (ident, value_type_name))
+
+ # -------------------------------------------------------------------------
+ # needs re-workign to be generic
+
+ if root_node:
+ fw("<%s>\n" % root_node)
+
+ # bpy.data
+ if method == 'DATA':
+ for attr in dir(root_rna):
+
+ # exceptions
+ if attr.startswith("_"):
+ continue
+ elif attr in root_rna_skip:
+ continue
+
+ value = getattr(root_rna, attr)
+ try:
+ ls = value[:]
+ except:
+ ls = None
+
+ if type(ls) == list:
+ fw("%s<%s>\n" % (ident_val, attr))
+ for blend_id in ls:
+ rna2xml_node(ident_val + ident_val, blend_id, None)
+ fw("%s</%s>\n" % (ident_val, attr))
+ # any attribute
+ elif method == 'ATTR':
+ rna2xml_node("", root_rna, None)
+
+ if root_node:
+ fw("</%s>\n" % root_node)
+
+
+def xml2rna(root_xml,
+ root_rna=None, # must be set
+ ):
+
+ def rna2xml_node(xml_node, value):
+# print("evaluating:", xml_node.nodeName)
+
+ # ---------------------------------------------------------------------
+ # Simple attributes
+
+ for attr in xml_node.attributes.keys():
+# print(" ", attr)
+ subvalue = getattr(value, attr, Ellipsis)
+
+ if subvalue is Ellipsis:
+ print("%s.%s not found" % (type(value).__name__, attr))
+ else:
+ value_xml = xml_node.attributes[attr].value
+
+ subvalue_type = type(subvalue)
+ tp_name = 'UNKNOWN'
+ if subvalue_type == float:
+ value_xml_coerce = float(value_xml)
+ tp_name = 'FLOAT'
+ elif subvalue_type == int:
+ value_xml_coerce = int(value_xml)
+ tp_name = 'INT'
+ elif subvalue_type == bool:
+ value_xml_coerce = {'TRUE': True, 'FALSE': False}[value_xml]
+ tp_name = 'BOOL'
+ elif subvalue_type == str:
+ value_xml_coerce = value_xml
+ tp_name = 'STR'
+ elif hasattr(subvalue, "__len__"):
+ if value_xml.startswith("#"):
+ # read hexidecimal value as float array
+ value_xml_split = value_xml[1:]
+ value_xml_coerce = [int(value_xml_split[i:i + 2], 16) / 255 for i in range(0, len(value_xml_split), 2)]
+ del value_xml_split
+ else:
+ value_xml_split = value_xml.split()
+ try:
+ value_xml_coerce = [int(v) for v in value_xml_split]
+ except ValueError:
+ value_xml_coerce = [float(v) for v in value_xml_split]
+ del value_xml_split
+ tp_name = 'ARRAY'
+
+# print(" %s.%s (%s) --- %s" % (type(value).__name__, attr, tp_name, subvalue_type))
+ setattr(value, attr, value_xml_coerce)
+
+ # ---------------------------------------------------------------------
+ # Complex attributes
+ for child_xml in xml_node.childNodes:
+ if child_xml.nodeType == child_xml.ELEMENT_NODE:
+ # print()
+ # print(child_xml.nodeName)
+ subvalue = getattr(value, child_xml.nodeName, None)
+ if subvalue is not None:
+
+ elems = []
+ for child_xml_real in child_xml.childNodes:
+ if child_xml_real.nodeType == child_xml_real.ELEMENT_NODE:
+ elems.append(child_xml_real)
+ del child_xml_real
+
+ if hasattr(subvalue, "__len__"):
+ # Collection
+ if len(elems) != len(subvalue):
+ print("Size Mismatch! collection:", child_xml.nodeName)
+ else:
+ for i in range(len(elems)):
+ child_xml_real = elems[i]
+ subsubvalue = subvalue[i]
+
+ if child_xml_real is None or subsubvalue is None:
+ print("None found %s - %d collection:", (child_xml.nodeName, i))
+ else:
+ rna2xml_node(child_xml_real, subsubvalue)
+
+ else:
+# print(elems)
+
+ if len(elems) == 1:
+ # sub node named by its type
+ child_xml_real, = elems
+
+ # print(child_xml_real, subvalue)
+ rna2xml_node(child_xml_real, subvalue)
+ else:
+ # empty is valid too
+ pass
+
+ rna2xml_node(root_xml, root_rna)
diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py
index 1272d81872d..10aba96afd0 100644
--- a/release/scripts/modules/sys_info.py
+++ b/release/scripts/modules/sys_info.py
@@ -94,6 +94,16 @@ def write_sysinfo(op):
output.write('autosave: {}\n'.format(bpy.utils.user_resource('AUTOSAVE')))
output.write('tempdir: {}\n'.format(bpy.app.tempdir))
+ output.write('\nFFmpeg:\n')
+ output.write(lilies)
+ ffmpeg = bpy.app.ffmpeg
+ if ffmpeg.supported:
+ for lib in ['avcodec', 'avdevice', 'avformat', 'avutil', 'swscale']:
+ output.write('{}:{}{}\n'.format(lib, " " * (10 - len(lib)),
+ getattr(ffmpeg, lib + '_version_string')))
+ else:
+ output.write('Blender was built without FFmpeg support\n')
+
if bpy.app.background:
output.write('\nOpenGL: missing, background mode\n')
else:
diff --git a/release/scripts/presets/ffmpeg/DV.py b/release/scripts/presets/ffmpeg/DV.py
index 926fb241747..241d6938a5f 100644
--- a/release/scripts/presets/ffmpeg/DV.py
+++ b/release/scripts/presets/ffmpeg/DV.py
@@ -11,4 +11,4 @@ else:
bpy.context.scene.render.ffmpeg_audio_mixrate = 48000
bpy.context.scene.render.ffmpeg_audio_codec = "PCM"
-bpy.context.scene.render.ffmpeg_audio_channels = 2
+bpy.context.scene.render.ffmpeg_audio_channels = "STEREO"
diff --git a/release/scripts/presets/ffmpeg/DVD.py b/release/scripts/presets/ffmpeg/DVD.py
index 196b5d68406..07828a755cd 100644
--- a/release/scripts/presets/ffmpeg/DVD.py
+++ b/release/scripts/presets/ffmpeg/DVD.py
@@ -21,4 +21,4 @@ bpy.context.scene.render.ffmpeg_muxrate = 10080000
bpy.context.scene.render.ffmpeg_audio_codec = "AC3"
bpy.context.scene.render.ffmpeg_audio_bitrate = 448
bpy.context.scene.render.ffmpeg_audio_mixrate = 48000
-bpy.context.scene.render.ffmpeg_audio_channels = 6
+bpy.context.scene.render.ffmpeg_audio_channels = "SURROUND51"
diff --git a/release/scripts/presets/ffmpeg/SVCD.py b/release/scripts/presets/ffmpeg/SVCD.py
index e4459ab5c5c..584f192c3d8 100644
--- a/release/scripts/presets/ffmpeg/SVCD.py
+++ b/release/scripts/presets/ffmpeg/SVCD.py
@@ -21,4 +21,4 @@ bpy.context.scene.render.ffmpeg_muxrate = 0
bpy.context.scene.render.ffmpeg_audio_bitrate = 224
bpy.context.scene.render.ffmpeg_audio_mixrate = 44100
bpy.context.scene.render.ffmpeg_audio_codec = "MP2"
-bpy.context.scene.render.ffmpeg_audio_channels = 2
+bpy.context.scene.render.ffmpeg_audio_channels = "STEREO"
diff --git a/release/scripts/presets/ffmpeg/VCD.py b/release/scripts/presets/ffmpeg/VCD.py
index c2b73e682a2..35dda07a064 100644
--- a/release/scripts/presets/ffmpeg/VCD.py
+++ b/release/scripts/presets/ffmpeg/VCD.py
@@ -21,4 +21,4 @@ bpy.context.scene.render.ffmpeg_muxrate = 2352 * 75 * 8
bpy.context.scene.render.ffmpeg_audio_bitrate = 224
bpy.context.scene.render.ffmpeg_audio_mixrate = 44100
bpy.context.scene.render.ffmpeg_audio_codec = "MP2"
-bpy.context.scene.render.ffmpeg_audio_channels = 2
+bpy.context.scene.render.ffmpeg_audio_channels = "STEREO"
diff --git a/release/scripts/presets/tracking_settings/blurry_footage.py b/release/scripts/presets/tracking_settings/blurry_footage.py
new file mode 100644
index 00000000000..c805301df78
--- /dev/null
+++ b/release/scripts/presets/tracking_settings/blurry_footage.py
@@ -0,0 +1,11 @@
+import bpy
+settings = bpy.context.edit_movieclip.tracking.settings
+
+settings.default_tracker = 'Hybrid'
+settings.default_pyramid_levels = 2
+settings.default_correlation_min = 0.75
+settings.default_pattern_size = 21
+settings.default_search_size = 100
+settings.default_frames_limit = 0
+settings.default_pattern_match = 'PREV_FRAME'
+settings.default_margin = 0
diff --git a/release/scripts/presets/tracking_settings/blurry_movie.py b/release/scripts/presets/tracking_settings/blurry_movie.py
deleted file mode 100644
index 8a503bec9bd..00000000000
--- a/release/scripts/presets/tracking_settings/blurry_movie.py
+++ /dev/null
@@ -1,11 +0,0 @@
-import bpy
-settings = bpy.context.edit_movieclip.tracking.settings
-
-settings.default_tracker = 'KLT'
-settings.default_pyramid_levels = 4
-settings.default_correlation_min = 0.75
-settings.default_pattern_size = 11
-settings.default_search_size = 202
-settings.default_frames_limit = 25
-settings.default_pattern_match = 'KEYFRAME'
-settings.default_margin = 0
diff --git a/release/scripts/presets/tracking_settings/default.py b/release/scripts/presets/tracking_settings/default.py
index 4b2d41bf292..3846f92d828 100644
--- a/release/scripts/presets/tracking_settings/default.py
+++ b/release/scripts/presets/tracking_settings/default.py
@@ -1,11 +1,11 @@
import bpy
settings = bpy.context.edit_movieclip.tracking.settings
-settings.default_tracker = 'KLT'
+settings.default_tracker = 'Hybrid'
settings.default_pyramid_levels = 2
settings.default_correlation_min = 0.75
settings.default_pattern_size = 11
-settings.default_search_size = 51
+settings.default_search_size = 61
settings.default_frames_limit = 0
settings.default_pattern_match = 'KEYFRAME'
settings.default_margin = 0
diff --git a/release/scripts/presets/tracking_settings/fast_motion.py b/release/scripts/presets/tracking_settings/fast_motion.py
index a3d382e6700..f99fd7f0c42 100644
--- a/release/scripts/presets/tracking_settings/fast_motion.py
+++ b/release/scripts/presets/tracking_settings/fast_motion.py
@@ -1,11 +1,11 @@
import bpy
settings = bpy.context.edit_movieclip.tracking.settings
-settings.default_tracker = 'KLT'
+settings.default_tracker = 'Hybrid'
settings.default_pyramid_levels = 2
-settings.default_correlation_min = 0.75
-settings.default_pattern_size = 11
-settings.default_search_size = 121
+settings.default_correlation_min = 0.7
+settings.default_pattern_size = 31
+settings.default_search_size = 300
settings.default_frames_limit = 0
-settings.default_pattern_match = 'KEYFRAME'
-settings.default_margin = 0
+settings.default_pattern_match = 'PREV_FRAME'
+settings.default_margin = 5
diff --git a/release/scripts/presets/tracking_track_color/object.py b/release/scripts/presets/tracking_track_color/object.py
new file mode 100644
index 00000000000..5cb663d3f97
--- /dev/null
+++ b/release/scripts/presets/tracking_track_color/object.py
@@ -0,0 +1,5 @@
+import bpy
+track = bpy.context.edit_movieclip.tracking.tracks.active
+
+track.color = (1.0, 0.0, 1.0)
+track.use_custom_color = True
diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py
index e1d33198142..29e8a396088 100644
--- a/release/scripts/startup/bl_operators/anim.py
+++ b/release/scripts/startup/bl_operators/anim.py
@@ -38,7 +38,7 @@ class ANIM_OT_keying_set_export(Operator):
bl_label = "Export Keying Set..."
filepath = StringProperty(
- name="File Path",
+ subtype='FILE_PATH',
)
filter_folder = BoolProperty(
name="Filter folders",
@@ -239,7 +239,7 @@ class ClearUselessActions(Operator):
@classmethod
def poll(cls, context):
- return len(bpy.data.actions) != 0
+ return bool(bpy.data.actions)
def execute(self, context):
removed = 0
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
index 11d545849ef..cb21f17cff5 100644
--- a/release/scripts/startup/bl_operators/clip.py
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -188,7 +188,7 @@ class CLIP_OT_delete_proxy(Operator):
proxydir = clip.proxy.directory
else:
clipdir = os.path.dirname(clip.filepath)
- proxydir = os.path.join(clipdir, 'BL_proxy')
+ proxydir = os.path.join(clipdir, "BL_proxy")
clipfile = os.path.basename(clip.filepath)
proxy = os.path.join(proxydir, clipfile)
@@ -196,15 +196,15 @@ class CLIP_OT_delete_proxy(Operator):
# proxy_<quality>[_undostorted]
for x in (25, 50, 75, 100):
- d = os.path.join(absproxy, 'proxy_' + str(x))
+ d = os.path.join(absproxy, "proxy_%d" % x)
self._rmproxy(d)
- self._rmproxy(d + '_undistorted')
- self._rmproxy(os.path.join(absproxy, 'proxy_' + str(x) + '.avi'))
+ self._rmproxy(d + "_undistorted")
+ self._rmproxy(os.path.join(absproxy, "proxy_%d.avi" % x))
- tc = ('free_run.blen_tc',
- 'interp_free_run.blen_tc',
- 'record_run.blen_tc')
+ tc = ("free_run.blen_tc",
+ "interp_free_run.blen_tc",
+ "record_run.blen_tc")
for x in tc:
self._rmproxy(os.path.join(absproxy, x))
@@ -269,7 +269,7 @@ object's movement caused by this constraint"""
# TODO: several camera solvers and track followers would fail,
# but can't think about eal workflow where it'll be useful
for x in ob.constraints:
- if x.type in ('CAMERA_SOLVER', 'FOLLOW_TRACK'):
+ if x.type in {'CAMERA_SOLVER', 'FOLLOW_TRACK'}:
con = x
if not con:
@@ -340,7 +340,8 @@ object's movement caused by this constraint"""
def execute(self, context):
scene = context.scene
-
+ # XXX, should probably use context.selected_editable_objects
+ # since selected objects can be from a lib or in hidden layer!
for ob in scene.objects:
if ob.select:
self._bake_object(scene, ob)
@@ -413,7 +414,12 @@ class CLIP_OT_setup_tracking_scene(Operator):
@staticmethod
def _setupCamera(context):
+ sc = context.space_data
+ clip = sc.clip
+ tracking = clip.tracking
+
camob = CLIP_OT_setup_tracking_scene._findOrCreateCamera(context)
+ cam = camob.data
# Remove all constraints to be sure motion is fine
camob.constraints.clear()
@@ -423,6 +429,9 @@ class CLIP_OT_setup_tracking_scene(Operator):
con.use_active_clip = True
con.influence = 1.0
+ cam.sensor_width = tracking.camera.sensor_width
+ cam.lens = tracking.camera.focal_length
+
@staticmethod
def _setupViewport(context):
sc = context.space_data
diff --git a/release/scripts/startup/bl_operators/image.py b/release/scripts/startup/bl_operators/image.py
index c97f6eae6c7..55ad8a77d43 100644
--- a/release/scripts/startup/bl_operators/image.py
+++ b/release/scripts/startup/bl_operators/image.py
@@ -30,9 +30,7 @@ class EditExternally(Operator):
bl_options = {'REGISTER'}
filepath = StringProperty(
- name="File Path",
- description="Path to an image file",
- maxlen=1024,
+ subtype='FILE_PATH',
)
def _editor_guess(self, context):
diff --git a/release/scripts/startup/bl_operators/object_randomize_transform.py b/release/scripts/startup/bl_operators/object_randomize_transform.py
index 7aea18487f3..d3d70f892b8 100644
--- a/release/scripts/startup/bl_operators/object_randomize_transform.py
+++ b/release/scripts/startup/bl_operators/object_randomize_transform.py
@@ -20,13 +20,13 @@
import bpy
from bpy.types import Operator
+from mathutils import Vector
-def randomize_selected(seed, delta, loc, rot, scale, scale_even):
+def randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min):
import random
from random import uniform
- from mathutils import Vector
random.seed(seed)
@@ -43,8 +43,13 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even):
else: # otherwise the values change under us
uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
- if rot: # TODO, non euler's
+ if rot:
vec = rand_vec(rot)
+
+ rotation_mode = obj.rotation_mode
+ if rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}:
+ obj.rotation_mode = 'XYZ'
+
if delta:
obj.delta_rotation_euler[0] += vec[0]
obj.delta_rotation_euler[1] += vec[1]
@@ -53,6 +58,7 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even):
obj.rotation_euler[0] += vec[0]
obj.rotation_euler[1] += vec[1]
obj.rotation_euler[2] += vec[2]
+ obj.rotation_mode = rotation_mode
else:
uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
@@ -62,20 +68,18 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even):
else:
org_sca_x, org_sca_y, org_sca_z = obj.scale
- if scale_even:
- sca_x = sca_y = sca_z = uniform(scale[0], - scale[0])
- uniform(0.0, 0.0), uniform(0.0, 0.0)
- else:
- sca_x, sca_y, sca_z = rand_vec(scale)
+ sca_x, sca_y, sca_z = (uniform(-scale[0] + 2.0, scale[0]),
+ uniform(-scale[1] + 2.0, scale[1]),
+ uniform(-scale[2] + 2.0, scale[2]))
if scale_even:
- aX = -(sca_x * org_sca_x) + org_sca_x
- aY = -(sca_x * org_sca_y) + org_sca_y
- aZ = -(sca_x * org_sca_z) + org_sca_z
+ aX = sca_x * org_sca_x
+ aY = sca_x * org_sca_y
+ aZ = sca_x * org_sca_z
else:
- aX = sca_x + org_sca_x
- aY = sca_y + org_sca_y
- aZ = sca_z + org_sca_z
+ aX = sca_x * org_sca_x
+ aY = sca_y * org_sca_y
+ aZ = sca_z * org_sca_z
if delta:
obj.delta_scale = aX, aY, aZ
@@ -85,7 +89,10 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even):
uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
-from bpy.props import IntProperty, BoolProperty, FloatVectorProperty
+from bpy.props import (IntProperty,
+ BoolProperty,
+ FloatVectorProperty)
+from math import pi
class RandomizeLocRotSize(Operator):
@@ -98,7 +105,7 @@ class RandomizeLocRotSize(Operator):
name="Random Seed",
description="Seed value for the random generator",
min=0,
- max=1000,
+ max=10000,
default=0,
)
use_delta = BoolProperty(
@@ -129,10 +136,10 @@ class RandomizeLocRotSize(Operator):
rot = FloatVectorProperty(
name="Rotation",
description="Maximun rotation over each axis",
- min=-180.0,
- max=180.0,
+ min=-pi,
+ max=pi,
default=(0.0, 0.0, 0.0),
- subtype='TRANSLATION',
+ subtype='EULER',
)
use_scale = BoolProperty(
name="Randomize Scale",
@@ -157,24 +164,23 @@ class RandomizeLocRotSize(Operator):
description="Maximum scale randomization over each axis",
min=-100.0,
max=100.0,
- default=(0.0, 0.0, 0.0),
+ default=(1.0, 1.0, 1.0),
subtype='TRANSLATION',
)
def execute(self, context):
- from math import radians
-
seed = self.random_seed
delta = self.use_delta
loc = None if not self.use_loc else self.loc
- rot = None if not self.use_rot else self.rot * radians(1.0)
+ rot = None if not self.use_rot else Vector(self.rot)
scale = None if not self.use_scale else self.scale
scale_even = self.scale_even
#scale_min = self.scale_min
+ scale_min = 0
- randomize_selected(seed, delta, loc, rot, scale, scale_even)
+ randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min)
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index a5c8c280616..308c46ca416 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -76,6 +76,7 @@ class AddPresetBase():
if hasattr(self, "add"):
self.add(context, filepath)
else:
+ print("Writing Preset: %r" % filepath)
file_preset = open(filepath, 'w')
file_preset.write("import bpy\n")
diff --git a/release/scripts/startup/bl_operators/sequencer.py b/release/scripts/startup/bl_operators/sequencer.py
index 67b9be59f2a..39c73f20664 100644
--- a/release/scripts/startup/bl_operators/sequencer.py
+++ b/release/scripts/startup/bl_operators/sequencer.py
@@ -60,14 +60,14 @@ class SequencerCrossfadeSounds(Operator):
if seq1.frame_final_end > seq2.frame_final_start:
tempcfra = context.scene.frame_current
context.scene.frame_current = seq2.frame_final_start
- seq1.keyframe_insert('volume')
+ seq1.keyframe_insert("volume")
context.scene.frame_current = seq1.frame_final_end
seq1.volume = 0
- seq1.keyframe_insert('volume')
- seq2.keyframe_insert('volume')
+ seq1.keyframe_insert("volume")
+ seq2.keyframe_insert("volume")
context.scene.frame_current = seq2.frame_final_start
seq2.volume = 0
- seq2.keyframe_insert('volume')
+ seq2.keyframe_insert("volume")
context.scene.frame_current = tempcfra
return {'FINISHED'}
else:
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
index 17e353ff238..b79fc0c01b3 100644
--- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -756,7 +756,7 @@ def VectoQuat(vec):
class thickface(object):
- __slost__= 'v', 'uv', 'no', 'area', 'edge_keys'
+ __slost__= "v", "uv", "no", "area", "edge_keys"
def __init__(self, face, uvface, mesh_verts):
self.v = [mesh_verts[i] for i in face.vertices]
if len(self.v)==4:
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 14c9a090529..11326377a79 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -29,6 +29,9 @@ from bpy.props import (StringProperty,
from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear
+import subprocess
+import os
+
class MESH_OT_delete_edgeloop(Operator):
'''Delete an edge loop by merging the faces on each side to a single face loop'''
@@ -457,8 +460,8 @@ class WM_OT_context_cycle_enum(Operator):
class WM_OT_context_cycle_array(Operator):
- '''Set a context array value.
- Useful for cycling the active mesh edit mode'''
+ '''Set a context array value. '''
+ '''Useful for cycling the active mesh edit mode'''
bl_idname = "wm.context_cycle_array"
bl_label = "Context Array Cycle"
bl_options = {'UNDO', 'INTERNAL'}
@@ -499,9 +502,9 @@ class WM_MT_context_menu_enum(Menu):
values = [(i.name, i.identifier) for i in value_base.bl_rna.properties[prop_string].enum_items]
for name, identifier in values:
- prop = self.layout.operator("wm.context_set_enum", text=name)
- prop.data_path = data_path
- prop.value = identifier
+ props = self.layout.operator("wm.context_set_enum", text=name)
+ props.data_path = data_path
+ props.value = identifier
class WM_OT_context_menu_enum(Operator):
@@ -748,8 +751,6 @@ class WM_OT_path_open(Operator):
bl_label = ""
filepath = StringProperty(
- name="File Path",
- maxlen=1024,
subtype='FILE_PATH',
)
@@ -766,12 +767,12 @@ class WM_OT_path_open(Operator):
return {'CANCELLED'}
if sys.platform[:3] == "win":
- subprocess.Popen(['start', filepath], shell=True)
- elif sys.platform == 'darwin':
- subprocess.Popen(['open', filepath])
+ subprocess.Popen(["start", filepath], shell=True)
+ elif sys.platform == "darwin":
+ subprocess.Popen(["open", filepath])
else:
try:
- subprocess.Popen(['xdg-open', filepath])
+ subprocess.Popen(["xdg-open", filepath])
except OSError:
# xdg-open *should* be supported by recent Gnome, KDE, Xfce
pass
@@ -847,8 +848,8 @@ class WM_OT_doc_edit(Operator):
print("sending data:", data_dict)
import xmlrpc.client
- user = 'blenderuser'
- pwd = 'blender>user'
+ user = "blenderuser"
+ pwd = "blender>user"
docblog = xmlrpc.client.ServerProxy(self._url)
docblog.metaWeblog.newPost(1, user, pwd, data_dict, 1)
@@ -986,9 +987,8 @@ class WM_OT_properties_edit(Operator):
prop_ui = rna_idprop_ui_prop_get(item, prop)
if prop_type in {float, int}:
-
- prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.min)
- prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.max)
+ prop_ui["soft_min"] = prop_ui["min"] = prop_type(self.min)
+ prop_ui["soft_max"] = prop_ui["max"] = prop_type(self.max)
prop_ui['description'] = self.description
@@ -1035,7 +1035,7 @@ class WM_OT_properties_add(Operator):
item = eval("context.%s" % data_path)
def unique_name(names):
- prop = 'prop'
+ prop = "prop"
prop_new = prop
i = 1
while prop_new in names:
@@ -1085,8 +1085,7 @@ class WM_OT_keyconfig_activate(Operator):
bl_label = "Activate Keyconfig"
filepath = StringProperty(
- name="File Path",
- maxlen=1024,
+ subtype='FILE_PATH',
)
def execute(self, context):
@@ -1116,8 +1115,7 @@ class WM_OT_appconfig_activate(Operator):
bl_label = "Activate Application Configuration"
filepath = StringProperty(
- name="File Path",
- maxlen=1024,
+ subtype='FILE_PATH',
)
def execute(self, context):
@@ -1165,10 +1163,10 @@ class WM_OT_copy_prev_settings(Operator):
# in 2.57 and earlier windows installers, system scripts were copied
# into the configuration directory, don't want to copy those
- system_script = os.path.join(path_dst, 'scripts/modules/bpy_types.py')
+ system_script = os.path.join(path_dst, "scripts/modules/bpy_types.py")
if os.path.isfile(system_script):
- shutil.rmtree(os.path.join(path_dst, 'scripts'))
- shutil.rmtree(os.path.join(path_dst, 'plugins'))
+ shutil.rmtree(os.path.join(path_dst, "scripts"))
+ shutil.rmtree(os.path.join(path_dst, "plugins"))
# don't loose users work if they open the splash later.
if bpy.data.is_saved is bpy.data.is_dirty is False:
@@ -1180,6 +1178,28 @@ class WM_OT_copy_prev_settings(Operator):
return {'CANCELLED'}
+class WM_OT_blenderplayer_start(bpy.types.Operator):
+ '''Launch the Blenderplayer with the current blendfile'''
+ bl_idname = "wm.blenderplayer_start"
+ bl_label = "Start"
+
+ blender_bin_path = bpy.app.binary_path
+ blender_bin_dir = os.path.dirname(blender_bin_path)
+ ext = os.path.splitext(blender_bin_path)[-1]
+ player_path = os.path.join(blender_bin_dir, "blenderplayer" + ext)
+
+ def execute(self, context):
+ import sys
+
+ if sys.platform == "darwin":
+ self.player_path = os.path.join(self.blender_bin_dir, "../../../blenderplayer.app/Contents/MacOS/blenderplayer")
+
+ filepath = bpy.app.tempdir + "game.blend"
+ bpy.ops.wm.save_as_mainfile(filepath=filepath, check_existing=False, copy=True)
+ subprocess.call([self.player_path, filepath])
+ return {'FINISHED'}
+
+
class WM_OT_keyconfig_test(Operator):
"Test keyconfig for conflicts"
bl_idname = "wm.keyconfig_test"
@@ -1203,8 +1223,7 @@ class WM_OT_keyconfig_import(Operator):
bl_label = "Import Key Configuration..."
filepath = StringProperty(
- name="File Path",
- description="Filepath to write file to",
+ subtype='FILE_PATH',
default="keymap.py",
)
filter_folder = BoolProperty(
@@ -1270,8 +1289,7 @@ class WM_OT_keyconfig_export(Operator):
bl_label = "Export Key Configuration..."
filepath = StringProperty(
- name="File Path",
- description="Filepath to write file to",
+ subtype='FILE_PATH',
default="keymap.py",
)
filter_folder = BoolProperty(
@@ -1435,7 +1453,7 @@ class WM_OT_operator_cheat_sheet(Operator):
for op_submodule_name in dir(op_module):
op = getattr(op_module, op_submodule_name)
text = repr(op)
- if text.split("\n")[-1].startswith('bpy.ops.'):
+ if text.split("\n")[-1].startswith("bpy.ops."):
op_strings.append(text)
tot += 1
@@ -1448,6 +1466,9 @@ class WM_OT_operator_cheat_sheet(Operator):
return {'FINISHED'}
+# -----------------------------------------------------------------------------
+# Addon Operators
+
class WM_OT_addon_enable(Operator):
"Enable an addon"
bl_idname = "wm.addon_enable"
@@ -1513,8 +1534,7 @@ class WM_OT_addon_install(Operator):
)
filepath = StringProperty(
- name="File Path",
- description="File path to write file to",
+ subtype='FILE_PATH',
)
filter_folder = BoolProperty(
name="Filter folders",
@@ -1748,3 +1768,61 @@ class WM_OT_addon_expand(Operator):
info = addon_utils.module_bl_info(mod)
info["show_expanded"] = not info["show_expanded"]
return {'FINISHED'}
+
+
+# -----------------------------------------------------------------------------
+# Theme IO
+from bpy_extras.io_utils import (ImportHelper,
+ ExportHelper,
+ )
+
+
+class WM_OT_theme_import(Operator, ImportHelper):
+ bl_idname = "wm.theme_import"
+ bl_label = "Import Theme"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ filename_ext = ".xml"
+ filter_glob = StringProperty(default="*.xml", options={'HIDDEN'})
+
+ def execute(self, context):
+ import rna_xml
+ import xml.dom.minidom
+
+ filepath = self.filepath
+
+ xml_nodes = xml.dom.minidom.parse(filepath)
+ theme_xml = xml_nodes.getElementsByTagName("Theme")[0]
+
+ # XXX, why always 0?, allow many?
+ theme = context.user_preferences.themes[0]
+
+ rna_xml.xml2rna(theme_xml,
+ root_rna=theme,
+ )
+
+ return {'FINISHED'}
+
+
+class WM_OT_theme_export(Operator, ExportHelper):
+ bl_idname = "wm.theme_export"
+ bl_label = "Export Theme"
+
+ filename_ext = ".xml"
+ filter_glob = StringProperty(default="*.xml", options={'HIDDEN'})
+
+ def execute(self, context):
+ import rna_xml
+
+ filepath = self.filepath
+ file = open(filepath, 'w', encoding='utf-8')
+
+ # XXX, why always 0?, allow many?
+ theme = context.user_preferences.themes[0]
+
+ rna_xml.rna2xml(file.write,
+ root_rna=theme,
+ method='ATTR',
+ )
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index fa59cc0ac53..5be9e57356c 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -158,7 +158,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel):
row = layout.row()
row.prop(group, "name")
- if ob.mode == 'EDIT' and len(ob.vertex_groups) > 0:
+ if ob.vertex_groups and (ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex)):
row = layout.row()
sub = row.row(align=True)
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 5e9f863d22b..d6f2173306a 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -813,6 +813,20 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "width", slider=True)
col.prop(md, "narrowness", slider=True)
+ def REMESH(self, layout, ob, md):
+ layout.prop(md, "mode")
+
+ layout.prop(md, "octree_depth")
+ layout.prop(md, "scale")
+ row = layout.row()
+ row.active = md.mode == "SHARP"
+ row.prop(md, "sharpness")
+
+ layout.prop(md, "remove_disconnected_pieces")
+ row = layout.row()
+ row.active = md.remove_disconnected_pieces
+ row.prop(md, "threshold")
+
@staticmethod
def vertex_weight_mask(layout, ob, md):
layout.label(text="Influence/Mask Options:")
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index db65b0ff669..b7b2acc6b08 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -244,16 +244,23 @@ class RenderButtonsPanel():
return (rd.engine in cls.COMPAT_ENGINES)
-class RENDER_PT_game(RenderButtonsPanel, Panel):
- bl_label = "Game"
+class RENDER_PT_embedded(RenderButtonsPanel, bpy.types.Panel):
+ bl_label = "Embedded Player"
COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
+ rd = context.scene.render
+
row = layout.row()
row.operator("view3d.game_start", text="Start")
row.label()
+ row = layout.row()
+ row.label(text="Resolution:")
+ row = layout.row(align=True)
+ row.prop(rd, "resolution_x", slider=False, text="X")
+ row.prop(rd, "resolution_y", slider=False, text="Y")
class RENDER_PT_game_player(RenderButtonsPanel, Panel):
@@ -265,28 +272,21 @@ class RENDER_PT_game_player(RenderButtonsPanel, Panel):
gs = context.scene.game_settings
- layout.prop(gs, "show_fullscreen")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Resolution:")
- sub = col.column(align=True)
- sub.prop(gs, "resolution_x", slider=False, text="X")
- sub.prop(gs, "resolution_y", slider=False, text="Y")
+ row = layout.row()
+ row.operator("wm.blenderplayer_start", text="Start")
+ row.prop(gs, "show_fullscreen")
- col = split.column()
- col.label(text="Quality:")
- sub = col.column(align=True)
- sub.prop(gs, "depth", text="Bit Depth", slider=False)
- sub.prop(gs, "frequency", text="FPS", slider=False)
+ row = layout.row()
+ row.label(text="Resolution:")
+ row = layout.row(align=True)
+ row.prop(gs, "resolution_x", slider=False, text="X")
+ row.prop(gs, "resolution_y", slider=False, text="Y")
- # framing:
col = layout.column()
- col.label(text="Framing:")
- col.row().prop(gs, "frame_type", expand=True)
- if gs.frame_type == 'LETTERBOX':
- col.prop(gs, "frame_color", text="")
+ col.label(text="Quality:")
+ col = layout.column(align=True)
+ col.prop(gs, "depth", text="Bit Depth", slider=False)
+ col.prop(gs, "frequency", text="Refresh Rate", slider=False)
class RENDER_PT_game_stereo(RenderButtonsPanel, Panel):
@@ -368,20 +368,24 @@ class RENDER_PT_game_shading(RenderButtonsPanel, Panel):
col.prop(gs, "use_glsl_extra_textures", text="Extra Textures")
-class RENDER_PT_game_performance(RenderButtonsPanel, Panel):
- bl_label = "Performance"
+class RENDER_PT_game_system(RenderButtonsPanel, Panel):
+ bl_label = "System"
COMPAT_ENGINES = {'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
gs = context.scene.game_settings
- col = layout.column()
- row = col.row()
+ row = layout.row()
row.prop(gs, "use_frame_rate")
+ row.prop(gs, "restrict_animation_updates")
+
+ row = layout.row()
row.prop(gs, "use_display_lists")
- col.prop(gs, "restrict_animation_updates")
+ row = layout.row()
+ row.label("Exit Key")
+ row.prop(gs, "exit_key", text="", event=True)
class RENDER_PT_game_display(RenderButtonsPanel, Panel):
@@ -391,6 +395,9 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ row = layout.row()
+ row.prop(context.scene.render, "fps", text="Animation Frame Rate", slider=False)
+
gs = context.scene.game_settings
flow = layout.column_flow()
flow.prop(gs, "show_debug_properties", text="Debug Properties")
@@ -399,6 +406,12 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
flow.prop(gs, "use_deprecation_warnings")
flow.prop(gs, "show_mouse", text="Mouse Cursor")
+ col = layout.column()
+ col.label(text="Framing:")
+ col.row().prop(gs, "frame_type", expand=True)
+ if gs.frame_type == 'LETTERBOX':
+ col.prop(gs, "frame_color", text="")
+
class SceneButtonsPanel():
bl_space_type = 'PROPERTIES'
@@ -464,6 +477,22 @@ class SCENE_PT_game_navmesh(SceneButtonsPanel, Panel):
row.prop(rd, "sample_max_error")
+class RENDER_PT_game_sound(RenderButtonsPanel, Panel):
+ bl_label = "Sound"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+
+ layout.prop(scene, "audio_distance_model")
+
+ col = layout.column(align=True)
+ col.prop(scene, "audio_doppler_speed", text="Speed")
+ col.prop(scene, "audio_doppler_factor")
+
+
class WorldButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@@ -533,10 +562,14 @@ class WORLD_PT_game_mist(WorldButtonsPanel, Panel):
world = context.world
layout.active = world.mist_settings.use_mist
-
row = layout.row()
+ row.prop(world.mist_settings, "falloff")
+
+ row = layout.row(align=True)
row.prop(world.mist_settings, "start")
row.prop(world.mist_settings, "depth")
+ row = layout.row()
+ row.prop(world.mist_settings, "intensity", text="Minimum Intensity")
class WORLD_PT_game_physics(WorldButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 27b6aa721a4..f01c2ba45e0 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -181,9 +181,9 @@ class OBJECT_PT_groups(ObjectButtonsPanel, Panel):
col = split.column()
col.prop(group, "dupli_offset", text="")
- prop = col.operator("wm.context_set_value", text="From Cursor")
- prop.data_path = "object.users_group[%d].dupli_offset" % index
- prop.value = value
+ props = col.operator("wm.context_set_value", text="From Cursor")
+ props.data_path = "object.users_group[%d].dupli_offset" % index
+ props.value = value
index += 1
diff --git a/release/scripts/startup/bl_ui/properties_object_constraint.py b/release/scripts/startup/bl_ui/properties_object_constraint.py
index 038d7a38fd6..32ed1c3f1b1 100644
--- a/release/scripts/startup/bl_ui/properties_object_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_object_constraint.py
@@ -755,7 +755,16 @@ class ConstraintButtonsPanel():
col = layout.column()
col.prop(con, "rotation_range", text="Pivot When")
+ @staticmethod
+ def _getConstraintClip(context, con):
+ if not con.use_active_clip:
+ return con.clip
+ else:
+ return context.scene.active_clip
+
def FOLLOW_TRACK(self, context, layout, con):
+ clip = self._getConstraintClip(context, con)
+
row = layout.row()
row.prop(con, "use_active_clip")
row.prop(con, "use_3d_position")
@@ -763,7 +772,11 @@ class ConstraintButtonsPanel():
if not con.use_active_clip:
layout.prop(con, "clip")
- layout.prop(con, "track")
+ if clip:
+ layout.prop_search(con, "object", clip.tracking, "objects", icon='OBJECT_DATA')
+ layout.prop_search(con, "track", clip.tracking, "tracks", icon='ANIMATION_DATA')
+
+ layout.prop(con, "camera")
layout.operator("clip.constraint_to_fcurve")
@@ -775,6 +788,26 @@ class ConstraintButtonsPanel():
layout.operator("clip.constraint_to_fcurve")
+ def OBJECT_SOLVER(self, context, layout, con):
+ scene = context.scene
+ clip = self._getConstraintClip(context, con)
+
+ layout.prop(con, "use_active_clip")
+
+ if not con.use_active_clip:
+ layout.prop(con, "clip")
+
+ if clip:
+ layout.prop_search(con, "object", clip.tracking, "objects", icon='OBJECT_DATA')
+
+ layout.prop(con, "camera")
+
+ row = layout.row()
+ row.operator("constraint.objectsolver_set_inverse")
+ row.operator("constraint.objectsolver_clear_inverse")
+
+ layout.operator("clip.constraint_to_fcurve")
+
def SCRIPT(self, context, layout, con):
layout.label("Blender 2.5 has no py-constraints")
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index f7f67527b63..5e68351d9e6 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -76,7 +76,7 @@ class ParticleButtonsPanel():
class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
bl_label = ""
bl_options = {'HIDE_HEADER'}
- COMPAT_ENGINES = {'BLENDER_RENDER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
@classmethod
def poll(cls, context):
@@ -86,6 +86,10 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ if context.scene.render.engine == "BLENDER_GAME":
+ layout.label("Not available in the Game Engine")
+ return
+
ob = context.object
psys = context.particle_system
part = 0
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index d5350e81a88..7887998b90f 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -51,7 +51,7 @@ class RenderButtonsPanel():
@classmethod
def poll(cls, context):
rd = context.scene.render
- return (context.scene and rd.use_game_engine is False) and (rd.engine in cls.COMPAT_ENGINES)
+ return context.scene and (rd.engine in cls.COMPAT_ENGINES)
class RENDER_PT_render(RenderButtonsPanel, Panel):
@@ -316,6 +316,9 @@ class RENDER_PT_shading(RenderButtonsPanel, Panel):
col = split.column()
col.prop(rd, "use_raytrace", text="Ray Tracing")
col.prop(rd, "use_color_management")
+ sub = col.row()
+ sub.active = rd.use_color_management == True
+ sub.prop(rd, "use_color_unpremultiply")
col.prop(rd, "alpha_mode", text="Alpha")
@@ -453,7 +456,7 @@ class RENDER_PT_output(RenderButtonsPanel, Panel):
rd = context.scene.render
image_settings = rd.image_settings
- file_format = rd.image_settings.file_format
+ file_format = image_settings.file_format
layout.prop(rd, "filepath", text="")
@@ -462,7 +465,7 @@ class RENDER_PT_output(RenderButtonsPanel, Panel):
flow.prop(rd, "use_placeholder")
flow.prop(rd, "use_file_extension")
- layout.template_image_settings(rd.image_settings)
+ layout.template_image_settings(image_settings)
if file_format == 'QUICKTIME_CARBON':
layout.operator("scene.render_data_set_quicktime_codec")
@@ -553,7 +556,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, Panel):
class RENDER_PT_bake(RenderButtonsPanel, Panel):
bl_label = "Bake"
bl_options = {'DEFAULT_CLOSED'}
- COMPAT_ENGINES = {'BLENDER_RENDER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 05f4887a542..b7218e4ba47 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -29,12 +29,13 @@ class SceneButtonsPanel():
@classmethod
def poll(cls, context):
- return context.scene
+ rd = context.scene.render
+ return context.scene and (rd.engine in cls.COMPAT_ENGINES)
class SCENE_PT_scene(SceneButtonsPanel, Panel):
bl_label = "Scene"
- COMPAT_ENGINES = {'BLENDER_RENDER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -75,7 +76,7 @@ class SCENE_PT_audio(SceneButtonsPanel, Panel):
class SCENE_PT_unit(SceneButtonsPanel, Panel):
bl_label = "Units"
- COMPAT_ENGINES = {'BLENDER_RENDER'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -93,6 +94,7 @@ class SCENE_PT_unit(SceneButtonsPanel, Panel):
class SCENE_PT_keying_sets(SceneButtonsPanel, Panel):
bl_label = "Keying Sets"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
def draw(self, context):
layout = self.layout
@@ -125,6 +127,7 @@ class SCENE_PT_keying_sets(SceneButtonsPanel, Panel):
class SCENE_PT_keying_set_paths(SceneButtonsPanel, Panel):
bl_label = "Active Keying Set"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
@classmethod
def poll(cls, context):
diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index 9f67edd7653..c7f94bb4a3d 100644
--- a/release/scripts/startup/bl_ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -167,6 +167,10 @@ class TEXTURE_PT_preview(TextureButtonsPanel, Panel):
else:
layout.template_preview(tex, slot=slot)
+ #Show Alpha Button for Brush Textures, see #29502
+ if context.space_data.texture_context == 'BRUSH':
+ layout.prop(tex, "use_preview_alpha")
+
class TEXTURE_PT_colors(TextureButtonsPanel, Panel):
bl_label = "Colors"
@@ -1052,7 +1056,7 @@ class TEXTURE_PT_influence(TextureSlotPanel, Panel):
# the space setting is supported for: derivative-maps + bump-maps (DEFAULT,BEST_QUALITY), not for normal-maps
sub = row.row()
- sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) and ((tex.bump_method in {'BUMP_DEFAULT', 'BUMP_BEST_QUALITY'}) or (tex.texture.type == 'IMAGE' and tex.texture.use_derivative_map))
+ sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) and ((tex.bump_method in {'BUMP_LOW_QUALITY', 'BUMP_MEDIUM_QUALITY', 'BUMP_BEST_QUALITY'}) or (tex.texture.type == 'IMAGE' and tex.texture.use_derivative_map))
sub.prop(tex, "bump_objectspace", text="Space")
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index cacf61249dc..0da022dd8db 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -16,7 +16,8 @@
#
# ##### END GPL LICENSE BLOCK #####
-# <pep8 compliant>
+# <pep8-80 compliant>
+
import bpy
from bpy.types import Panel, Header, Menu
@@ -70,7 +71,13 @@ class CLIP_HT_header(Header):
row.template_ID(sc, "clip", open='clip.open')
if clip:
- r = clip.tracking.reconstruction
+ tracking = clip.tracking
+ active = tracking.objects.active
+
+ if active and not active.is_camera:
+ r = active.reconstruction
+ else:
+ r = tracking.reconstruction
if r.is_valid:
layout.label(text="Average solve error: %.4f" %
@@ -114,7 +121,7 @@ class CLIP_PT_tools_marker(Panel):
row.menu('CLIP_MT_tracking_settings_presets', text=label)
row.operator("clip.tracking_settings_preset_add",
text="", icon='ZOOMIN')
- props = row.operator("clip.track_color_preset_add",
+ props = row.operator("clip.tracking_settings_preset_add",
text="", icon='ZOOMOUT')
props.remove_active = True
@@ -129,8 +136,7 @@ class CLIP_PT_tools_marker(Panel):
if settings.default_tracker == 'KLT':
col.prop(settings, "default_pyramid_levels")
- else:
- col.prop(settings, "default_correlation_min")
+ col.prop(settings, "default_correlation_min")
col.separator()
@@ -156,7 +162,7 @@ class CLIP_PT_tools_tracking(Panel):
def draw(self, context):
layout = self.layout
- clip = context.space_data.clip
+ # clip = context.space_data.clip # UNUSED
row = layout.row(align=True)
@@ -198,10 +204,15 @@ class CLIP_PT_tools_solve(Panel):
def draw(self, context):
layout = self.layout
clip = context.space_data.clip
- settings = clip.tracking.settings
+ tracking = clip.tracking
+ settings = tracking.settings
+ tracking_object = tracking.objects.active
col = layout.column(align=True)
- col.operator("clip.solve_camera", text="Camera Motion")
+
+ col.operator("clip.solve_camera",
+ text="Camera Motion" if tracking_object.is_camera
+ else "Object Motion")
col.operator("clip.clear_solution")
col = layout.column(align=True)
@@ -209,6 +220,7 @@ class CLIP_PT_tools_solve(Panel):
col.prop(settings, "keyframe_b")
col = layout.column(align=True)
+ col.active = tracking_object.is_camera
col.label(text="Refine:")
col.prop(settings, "refine_intrinsics", text="")
@@ -288,6 +300,39 @@ class CLIP_PT_tools_orientation(Panel):
col.prop(settings, "distance")
+class CLIP_PT_tools_object(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'TOOLS'
+ bl_label = "Object"
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+ clip = sc.clip
+
+ if clip and sc.mode == 'RECONSTRUCTION':
+ tracking_object = clip.tracking.objects.active
+ return not tracking_object.is_camera
+
+ return False
+
+ def draw(self, context):
+ sc = context.space_data
+ clip = sc.clip
+ layout = self.layout
+ tracking_object = clip.tracking.objects.active
+ settings = sc.clip.tracking.settings
+
+ col = layout.column()
+
+ col.prop(tracking_object, "scale")
+
+ col.separator()
+
+ col.operator("clip.set_solution_scale", text="Set Scale")
+ col.prop(settings, "object_distance")
+
+
class CLIP_PT_tools_grease_pencil(Panel):
bl_space_type = 'CLIP_EDITOR'
bl_region_type = 'TOOLS'
@@ -317,6 +362,38 @@ class CLIP_PT_tools_grease_pencil(Panel):
row.prop(context.tool_settings, "use_grease_pencil_sessions")
+class CLIP_PT_objects(Panel):
+ bl_space_type = 'CLIP_EDITOR'
+ bl_region_type = 'UI'
+ bl_label = "Objects"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ sc = context.space_data
+
+ return sc.clip
+
+ def draw(self, context):
+ layout = self.layout
+ sc = context.space_data
+ clip = sc.clip
+ tracking = clip.tracking
+
+ row = layout.row()
+ row.template_list(tracking, "objects",
+ tracking, "active_object_index", rows=3)
+
+ sub = row.column(align=True)
+
+ sub.operator("clip.tracking_object_new", icon='ZOOMIN', text="")
+ sub.operator("clip.tracking_object_remove", icon='ZOOMOUT', text="")
+
+ active = tracking.objects.active
+ if active:
+ layout.prop(active, "name")
+
+
class CLIP_PT_track(Panel):
bl_space_type = 'CLIP_EDITOR'
bl_region_type = 'UI'
@@ -353,9 +430,15 @@ class CLIP_PT_track(Panel):
layout.template_track(sc, "scopes")
row = layout.row(align=True)
- row.prop(act_track, "use_red_channel", text="R", toggle=True)
- row.prop(act_track, "use_green_channel", text="G", toggle=True)
- row.prop(act_track, "use_blue_channel", text="B", toggle=True)
+ sub = row.row()
+ sub.prop(act_track, "use_red_channel", text="R", toggle=True)
+ sub.prop(act_track, "use_green_channel", text="G", toggle=True)
+ sub.prop(act_track, "use_blue_channel", text="B", toggle=True)
+
+ row.separator()
+
+ sub = row.row()
+ sub.prop(act_track, "use_grayscale_preview", text="B/W", toggle=True)
layout.separator()
@@ -388,7 +471,7 @@ class CLIP_PT_tracking_camera(Panel):
def poll(cls, context):
sc = context.space_data
- return sc.mode in ['TRACKING', 'DISTORTION'] and sc.clip
+ return sc.mode in {'TRACKING', 'DISTORTION'} and sc.clip
def draw(self, context):
layout = self.layout
@@ -423,7 +506,7 @@ class CLIP_PT_tracking_camera(Panel):
col.operator("clip.set_center_principal", text="Center")
col = layout.column(align=True)
- col.label(text="Undistortion:")
+ col.label(text="Lens Distortion:")
col.prop(clip.tracking.camera, "k1")
col.prop(clip.tracking.camera, "k2")
col.prop(clip.tracking.camera, "k3")
@@ -497,8 +580,7 @@ class CLIP_PT_track_settings(Panel):
if active.tracker == 'KLT':
col.prop(active, "pyramid_levels")
- elif active.tracker == 'SAD':
- col.prop(active, "correlation_min")
+ col.prop(active, "correlation_min")
col.separator()
col.prop(active, "frames_limit")
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 81526797109..4ccdef747ce 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -298,34 +298,34 @@ class IMAGE_MT_uvs_select_mode(Menu):
# do smart things depending on whether uv_select_sync is on
if toolsettings.use_uv_select_sync:
- prop = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL')
- prop.value = "(True, False, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL')
+ props.value = "(True, False, False)"
+ props.data_path = "tool_settings.mesh_select_mode"
- prop = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL')
- prop.value = "(False, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL')
+ props.value = "(False, True, False)"
+ props.data_path = "tool_settings.mesh_select_mode"
- prop = layout.operator("wm.context_set_value", text="Face", icon='FACESEL')
- prop.value = "(False, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Face", icon='FACESEL')
+ props.value = "(False, False, True)"
+ props.data_path = "tool_settings.mesh_select_mode"
else:
- prop = layout.operator("wm.context_set_string", text="Vertex", icon='UV_VERTEXSEL')
- prop.value = 'VERTEX'
- prop.data_path = "tool_settings.uv_select_mode"
+ props = layout.operator("wm.context_set_string", text="Vertex", icon='UV_VERTEXSEL')
+ props.value = 'VERTEX'
+ props.data_path = "tool_settings.uv_select_mode"
- prop = layout.operator("wm.context_set_string", text="Edge", icon='UV_EDGESEL')
- prop.value = 'EDGE'
- prop.data_path = "tool_settings.uv_select_mode"
+ props = layout.operator("wm.context_set_string", text="Edge", icon='UV_EDGESEL')
+ props.value = 'EDGE'
+ props.data_path = "tool_settings.uv_select_mode"
- prop = layout.operator("wm.context_set_string", text="Face", icon='UV_FACESEL')
- prop.value = 'FACE'
- prop.data_path = "tool_settings.uv_select_mode"
+ props = layout.operator("wm.context_set_string", text="Face", icon='UV_FACESEL')
+ props.value = 'FACE'
+ props.data_path = "tool_settings.uv_select_mode"
- prop = layout.operator("wm.context_set_string", text="Island", icon='UV_ISLANDSEL')
- prop.value = 'ISLAND'
- prop.data_path = "tool_settings.uv_select_mode"
+ props = layout.operator("wm.context_set_string", text="Island", icon='UV_ISLANDSEL')
+ props.value = 'ISLAND'
+ props.data_path = "tool_settings.uv_select_mode"
class IMAGE_HT_header(Header):
diff --git a/release/scripts/startup/bl_ui/space_logic.py b/release/scripts/startup/bl_ui/space_logic.py
index 1ae8095fab3..1fc58475ace 100644
--- a/release/scripts/startup/bl_ui/space_logic.py
+++ b/release/scripts/startup/bl_ui/space_logic.py
@@ -70,7 +70,9 @@ class LOGIC_HT_header(Header):
layout.template_header()
if context.area.show_menus:
- layout.menu("LOGIC_MT_view")
+ row = layout.row(align=True)
+ row.menu("LOGIC_MT_view")
+ row.menu("LOGIC_MT_logicbricks_add")
class LOGIC_MT_view(Menu):
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 38d2f232286..23d6154d1f5 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -156,6 +156,7 @@ class NODE_MT_node(Menu):
layout.operator("node.mute_toggle")
layout.operator("node.preview_toggle")
layout.operator("node.hide_socket_toggle")
+ layout.operator("node.options_toggle")
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py
index c3b2e30cb12..7249e9522ff 100644
--- a/release/scripts/startup/bl_ui/space_text.py
+++ b/release/scripts/startup/bl_ui/space_text.py
@@ -174,9 +174,7 @@ class TEXT_MT_text(Menu):
st = context.space_data
text = st.text
- layout.operator_context = 'EXEC_AREA'
layout.operator("text.new")
- layout.operator_context = 'INVOKE_AREA'
layout.operator("text.open")
if text:
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index d71d57509c1..046026a3b6e 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -89,13 +89,15 @@ class USERPREF_HT_header(Header):
layout.operator_context = 'INVOKE_DEFAULT'
if userpref.active_section == 'INPUT':
- layout.operator("wm.keyconfig_export")
layout.operator("wm.keyconfig_import")
+ layout.operator("wm.keyconfig_export")
elif userpref.active_section == 'ADDONS':
layout.operator("wm.addon_install")
layout.menu("USERPREF_MT_addons_dev_guides")
elif userpref.active_section == 'THEMES':
layout.operator("ui.reset_default_theme")
+ layout.operator("wm.theme_import")
+ layout.operator("wm.theme_export")
class USERPREF_PT_tabs(Panel):
@@ -889,6 +891,8 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel):
sub.label(text="NDOF Device:")
sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity")
+ col.prop(inputs, "tweak_threshold")
+
row.separator()
def draw(self, context):
diff --git a/release/scripts/startup/bl_ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py
index d738e806320..6fa3aabaeb8 100644
--- a/release/scripts/startup/bl_ui/space_userpref_keymap.py
+++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py
@@ -219,7 +219,7 @@ class InputKeyMapPanel:
filtered_items = [kmi for kmi in km.keymap_items if filter_text in kmi.name.lower()]
- if len(filtered_items) != 0:
+ if filtered_items:
col = layout.column()
row = col.row()
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index ce0d56b9fca..58816f8e8be 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -255,7 +255,7 @@ class VIEW3D_MT_uv_map(Menu):
layout.separator()
- layout.operator_context = 'EXEC_DEFAULT'
+ layout.operator_context = 'EXEC_REGION_WIN'
layout.operator("uv.cube_project")
layout.operator("uv.cylinder_project")
layout.operator("uv.sphere_project")
@@ -993,6 +993,7 @@ class VIEW3D_MT_object_game(Menu):
layout = self.layout
layout.operator("object.logic_bricks_copy", text="Copy Logic Bricks")
+ layout.operator("object.game_physics_copy", text="Copy Physics Properties")
layout.separator()
@@ -1051,7 +1052,7 @@ class VIEW3D_MT_vertex_group(Menu):
layout.operator("object.vertex_group_assign", text="Assign to New Group").new = True
ob = context.active_object
- if ob.mode == 'EDIT':
+ if ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex):
if ob.vertex_groups.active:
layout.separator()
layout.operator("object.vertex_group_assign", text="Assign to Active Group")
@@ -1522,17 +1523,17 @@ class VIEW3D_MT_edit_mesh_select_mode(Menu):
layout.operator_context = 'INVOKE_REGION_WIN'
- prop = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL')
- prop.value = "(True, False, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Vertex", icon='VERTEXSEL')
+ props.value = "(True, False, False)"
+ props.data_path = "tool_settings.mesh_select_mode"
- prop = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL')
- prop.value = "(False, True, False)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Edge", icon='EDGESEL')
+ props.value = "(False, True, False)"
+ props.data_path = "tool_settings.mesh_select_mode"
- prop = layout.operator("wm.context_set_value", text="Face", icon='FACESEL')
- prop.value = "(False, False, True)"
- prop.data_path = "tool_settings.mesh_select_mode"
+ props = layout.operator("wm.context_set_value", text="Face", icon='FACESEL')
+ props.value = "(False, False, True)"
+ props.data_path = "tool_settings.mesh_select_mode"
class VIEW3D_MT_edit_mesh_extrude(Menu):
@@ -2246,6 +2247,8 @@ class VIEW3D_PT_view3d_meshdisplay(Panel):
col.prop(mesh, "show_extra_edge_length")
col.prop(mesh, "show_extra_face_angle")
col.prop(mesh, "show_extra_face_area")
+ if bpy.app.debug:
+ col.prop(mesh, "show_extra_indices")
class VIEW3D_PT_view3d_curvedisplay(Panel):
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index ddea7bd00fd..25f81f2cde1 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -546,6 +546,11 @@ class VIEW3D_PT_tools_brush(PaintPanel, Panel):
row.prop(brush, "strength", text="Strength", slider=True)
row.prop(brush, "use_pressure_strength", text="")
+ if tool == 'ROTATE':
+ row = col.row(align=True)
+ row.prop(brush, "strength", text="Strength", slider=True)
+ row.prop(brush, "use_pressure_strength", text="")
+
if tool != 'SMOOTH':
col.separator()
@@ -1193,9 +1198,9 @@ class VIEW3D_MT_tools_projectpaint_clone(Menu):
def draw(self, context):
layout = self.layout
for i, tex in enumerate(context.active_object.data.uv_textures):
- prop = layout.operator("wm.context_set_int", text=tex.name)
- prop.data_path = "active_object.data.uv_texture_clone_index"
- prop.value = i
+ props = layout.operator("wm.context_set_int", text=tex.name)
+ props.data_path = "active_object.data.uv_texture_clone_index"
+ props.value = i
class VIEW3D_MT_tools_projectpaint_stencil(Menu):
@@ -1204,9 +1209,9 @@ class VIEW3D_MT_tools_projectpaint_stencil(Menu):
def draw(self, context):
layout = self.layout
for i, tex in enumerate(context.active_object.data.uv_textures):
- prop = layout.operator("wm.context_set_int", text=tex.name)
- prop.data_path = "active_object.data.uv_texture_stencil_index"
- prop.value = i
+ props = layout.operator("wm.context_set_int", text=tex.name)
+ props.data_path = "active_object.data.uv_texture_stencil_index"
+ props.value = i
class VIEW3D_PT_tools_particlemode(View3DPanel, Panel):
diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py
index c7922a0dfa1..bc0252aa616 100644
--- a/release/scripts/startup/keyingsets_builtins.py
+++ b/release/scripts/startup/keyingsets_builtins.py
@@ -354,7 +354,7 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
# custom properties
def doCustomProps(ksi, ks, bone):
- prop_type_compat = {bpy.types.BooleanProperty,
+ prop_type_compat = {bpy.types.BoolProperty,
bpy.types.IntProperty,
bpy.types.FloatProperty}
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index aaad55558d2..2b587877a89 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -38,6 +38,7 @@ set(SRC_DNA_INC
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_controller_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_curve_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_customdata_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_defs.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_dynamicpaint_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_effect_types.h
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index a021695b7c9..c6fdd2e1adc 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -63,7 +63,8 @@ char *tcc_to_char (unsigned int tcc);
/* implemetation */
-unsigned int GET_FCC (FILE *fp) {
+unsigned int GET_FCC (FILE *fp)
+{
unsigned char tmp[4];
tmp[0] = getc(fp);
@@ -74,7 +75,8 @@ unsigned int GET_FCC (FILE *fp) {
return FCC (tmp);
}
-unsigned int GET_TCC (FILE *fp) {
+unsigned int GET_TCC (FILE *fp)
+{
char tmp[5];
tmp[0] = getc(fp);
@@ -85,7 +87,8 @@ unsigned int GET_TCC (FILE *fp) {
return FCC (tmp);
}
-char *fcc_to_char (unsigned int fcc) {
+char *fcc_to_char (unsigned int fcc)
+{
DEBUG_FCC[0]= (fcc)&127;
DEBUG_FCC[1]= (fcc>>8)&127;
DEBUG_FCC[2]= (fcc>>16)&127;
@@ -94,7 +97,8 @@ char *fcc_to_char (unsigned int fcc) {
return DEBUG_FCC;
}
-char *tcc_to_char (unsigned int tcc) {
+char *tcc_to_char (unsigned int tcc)
+{
DEBUG_FCC[0]= (tcc)&127;
DEBUG_FCC[1]= (tcc>>8)&127;
DEBUG_FCC[2]= 0;
@@ -103,7 +107,8 @@ char *tcc_to_char (unsigned int tcc) {
return DEBUG_FCC;
}
-int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num) {
+int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num)
+{
int cur_stream;
if (movie == NULL)
@@ -121,7 +126,8 @@ int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num) {
return -AVI_ERROR_FOUND;
}
-static int fcc_get_stream (int fcc) {
+static int fcc_get_stream (int fcc)
+{
char fccs[4];
fccs[0] = fcc;
@@ -132,7 +138,8 @@ static int fcc_get_stream (int fcc) {
return 10*(fccs[0]-'0') + (fccs[1]-'0');
}
-static int fcc_is_data (int fcc) {
+static int fcc_is_data (int fcc)
+{
char fccs[4];
fccs[0] = fcc;
@@ -148,7 +155,8 @@ static int fcc_is_data (int fcc) {
return 1;
}
-AviError AVI_print_error (AviError in_error) {
+AviError AVI_print_error (AviError in_error)
+{
int error;
if ((int) in_error < 0)
@@ -190,12 +198,14 @@ AviError AVI_print_error (AviError in_error) {
return in_error;
}
/*
-void AVI_set_debug (int mode) {
+void AVI_set_debug (int mode)
+{
AVI_DEBUG= mode;
}
*/
/*
-int AVI_is_avi (char *name) {
+int AVI_is_avi (char *name)
+{
FILE *fp;
int ret;
@@ -216,7 +226,8 @@ int AVI_is_avi (char *name) {
}
*/
-int AVI_is_avi (const char *name) {
+int AVI_is_avi (const char *name)
+{
int temp, fcca, j;
AviMovie movie= {NULL};
AviMainHeader header;
@@ -407,7 +418,8 @@ int AVI_is_avi (const char *name) {
}
-AviError AVI_open_movie (const char *name, AviMovie *movie) {
+AviError AVI_open_movie (const char *name, AviMovie *movie)
+{
int temp, fcca, size, j;
DEBUG_PRINT("opening movie\n");
@@ -619,7 +631,11 @@ AviError AVI_open_movie (const char *name, AviMovie *movie) {
movie->entries[temp].Offset = GET_FCC (movie->fp);
movie->entries[temp].Size = GET_FCC (movie->fp);
- if (AVI_DEBUG) printf ("Index entry %04d: ChunkId:%s Flags:%d Offset:%d Size:%d\n", temp, fcc_to_char(movie->entries[temp].ChunkId), movie->entries[temp].Flags, movie->entries[temp].Offset, movie->entries[temp].Size);
+ if (AVI_DEBUG) {
+ printf("Index entry %04d: ChunkId:%s Flags:%d Offset:%d Size:%d\n",
+ temp, fcc_to_char(movie->entries[temp].ChunkId), movie->entries[temp].Flags,
+ movie->entries[temp].Offset, movie->entries[temp].Size);
+ }
}
/* Some AVI's have offset entries in absolute coordinates
@@ -637,7 +653,8 @@ AviError AVI_open_movie (const char *name, AviMovie *movie) {
return AVI_ERROR_NONE;
}
-void *AVI_read_frame (AviMovie *movie, AviFormat format, int frame, int stream) {
+void *AVI_read_frame (AviMovie *movie, AviFormat format, int frame, int stream)
+{
int cur_frame=-1, temp, i=0, rewind=1;
void *buffer;
@@ -681,7 +698,8 @@ void *AVI_read_frame (AviMovie *movie, AviFormat format, int frame, int stream)
return buffer;
}
-AviError AVI_close (AviMovie *movie) {
+AviError AVI_close (AviMovie *movie)
+{
int i;
fclose (movie->fp);
@@ -703,7 +721,8 @@ AviError AVI_close (AviMovie *movie) {
return AVI_ERROR_NONE;
}
-AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) {
+AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...)
+{
va_list ap;
AviList list;
AviChunk chunk;
@@ -892,7 +911,8 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) {
return AVI_ERROR_NONE;
}
-AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) {
+AviError AVI_write_frame (AviMovie *movie, int frame_num, ...)
+{
AviList list;
AviChunk chunk;
AviIndexEntry *temp;
@@ -999,7 +1019,8 @@ AviError AVI_write_frame (AviMovie *movie, int frame_num, ...) {
return AVI_ERROR_NONE;
}
-AviError AVI_close_compress (AviMovie *movie) {
+AviError AVI_close_compress (AviMovie *movie)
+{
int temp, movi_size, i;
fseek (movie->fp, 0L, SEEK_END);
diff --git a/source/blender/avi/intern/codecs.c b/source/blender/avi/intern/codecs.c
index 78d8d4a32b2..73af7097994 100644
--- a/source/blender/avi/intern/codecs.c
+++ b/source/blender/avi/intern/codecs.c
@@ -40,7 +40,8 @@
#include "mjpeg.h"
#include "rgb32.h"
-void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size) {
+void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat from, AviFormat to, int *size)
+{
if (from == to)
return buffer;
@@ -82,7 +83,8 @@ void *avi_format_convert (AviMovie *movie, int stream, void *buffer, AviFormat f
return buffer;
}
-int avi_get_data_id (AviFormat format, int stream) {
+int avi_get_data_id (AviFormat format, int stream)
+{
char fcc[5];
if (avi_get_format_type (format) == FCC("vids"))
@@ -95,7 +97,8 @@ int avi_get_data_id (AviFormat format, int stream) {
return FCC(fcc);
}
-int avi_get_format_type (AviFormat format) {
+int avi_get_format_type (AviFormat format)
+{
switch (format) {
case AVI_FORMAT_RGB24:
case AVI_FORMAT_RGB32:
@@ -109,7 +112,8 @@ int avi_get_format_type (AviFormat format) {
}
}
-int avi_get_format_fcc (AviFormat format) {
+int avi_get_format_fcc (AviFormat format)
+{
switch (format) {
case AVI_FORMAT_RGB24:
case AVI_FORMAT_RGB32:
@@ -125,7 +129,8 @@ int avi_get_format_fcc (AviFormat format) {
}
}
-int avi_get_format_compression (AviFormat format) {
+int avi_get_format_compression (AviFormat format)
+{
switch (format) {
case AVI_FORMAT_RGB24:
case AVI_FORMAT_RGB32:
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 194880605b6..29b3047eca4 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -43,7 +43,8 @@
#include "avi_intern.h"
#ifdef __BIG_ENDIAN__
-static void invert (int *num) {
+static void invert (int *num)
+{
int new=0,i,j;
for (j=0; j < 4; j++) {
@@ -55,7 +56,8 @@ static void invert (int *num) {
*num = new;
}
-static void sinvert (short int *num) {
+static void sinvert (short int *num)
+{
short int new=0;
int i,j;
@@ -68,20 +70,23 @@ static void sinvert (short int *num) {
*num = new;
}
-static void Ichunk (AviChunk *chunk) {
+static void Ichunk (AviChunk *chunk)
+{
invert (&chunk->fcc);
invert (&chunk->size);
}
#endif
#ifdef __BIG_ENDIAN__
-static void Ilist (AviList *list){
+static void Ilist (AviList *list)
+{
invert (&list->fcc);
invert (&list->size);
invert (&list->ids);
}
-static void Imainh (AviMainHeader *mainh) {
+static void Imainh (AviMainHeader *mainh)
+{
invert (&mainh->fcc);
invert (&mainh->size);
invert (&mainh->MicroSecPerFrame);
@@ -100,7 +105,8 @@ static void Imainh (AviMainHeader *mainh) {
invert (&mainh->Reserved[3]);
}
-static void Istreamh (AviStreamHeader *streamh) {
+static void Istreamh (AviStreamHeader *streamh)
+{
invert (&streamh->fcc);
invert (&streamh->size);
invert (&streamh->Type);
@@ -122,7 +128,8 @@ static void Istreamh (AviStreamHeader *streamh) {
sinvert (&streamh->bottom);
}
-static void Ibitmaph (AviBitmapInfoHeader *bitmaph) {
+static void Ibitmaph (AviBitmapInfoHeader *bitmaph)
+{
invert (&bitmaph->fcc);
invert (&bitmaph->size);
invert (&bitmaph->Size);
@@ -138,7 +145,8 @@ static void Ibitmaph (AviBitmapInfoHeader *bitmaph) {
invert (&bitmaph->ClrImportant);
}
-static void Imjpegu (AviMJPEGUnknown *mjpgu) {
+static void Imjpegu (AviMJPEGUnknown *mjpgu)
+{
invert (&mjpgu->a);
invert (&mjpgu->b);
invert (&mjpgu->c);
@@ -148,7 +156,8 @@ static void Imjpegu (AviMJPEGUnknown *mjpgu) {
invert (&mjpgu->g);
}
-static void Iindexe (AviIndexEntry *indexe) {
+static void Iindexe (AviIndexEntry *indexe)
+{
invert (&indexe->ChunkId);
invert (&indexe->Flags);
invert (&indexe->Offset);
@@ -156,7 +165,8 @@ static void Iindexe (AviIndexEntry *indexe) {
}
#endif /* __BIG_ENDIAN__ */
-void awrite (AviMovie *movie, void *datain, int block, int size, FILE *fp, int type) {
+void awrite (AviMovie *movie, void *datain, int block, int size, FILE *fp, int type)
+{
#ifdef __BIG_ENDIAN__
void *data;
diff --git a/source/blender/avi/intern/mjpeg.c b/source/blender/avi/intern/mjpeg.c
index e55549bd05e..dab0b213d95 100644
--- a/source/blender/avi/intern/mjpeg.c
+++ b/source/blender/avi/intern/mjpeg.c
@@ -50,7 +50,8 @@ static void jpegmemsrcmgr_build (j_decompress_ptr dinfo, unsigned char *buffer,
static int numbytes;
-static void add_huff_table (j_decompress_ptr dinfo, JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) {
+static void add_huff_table (j_decompress_ptr dinfo, JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
+{
if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) dinfo);
@@ -64,7 +65,8 @@ static void add_huff_table (j_decompress_ptr dinfo, JHUFF_TBL **htblptr, const U
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
/* IMPORTANT: these are only valid for 8-bit data precision! */
-static void std_huff_tables (j_decompress_ptr dinfo) {
+static void std_huff_tables (j_decompress_ptr dinfo)
+{
static const UINT8 bits_dc_luminance[17] =
{ /* 0-base */
0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
@@ -142,7 +144,8 @@ static void std_huff_tables (j_decompress_ptr dinfo) {
bits_ac_chrominance, val_ac_chrominance);
}
-static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsigned int width, unsigned int height, int bufsize) {
+static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsigned int width, unsigned int height, int bufsize)
+{
int rowstride;
unsigned int y;
struct jpeg_decompress_struct dinfo;
@@ -194,7 +197,8 @@ static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsign
return 1;
}
-static void Compress_JPEG(int quality, unsigned char *outbuffer, unsigned char *inBuffer, int width, int height, int bufsize) {
+static void Compress_JPEG(int quality, unsigned char *outbuffer, unsigned char *inBuffer, int width, int height, int bufsize)
+{
int i, rowstride;
unsigned int y;
struct jpeg_compress_struct cinfo;
@@ -255,7 +259,8 @@ static void Compress_JPEG(int quality, unsigned char *outbuffer, unsigned char *
jpeg_destroy_compress(&cinfo);
}
-static void interlace(unsigned char *to, unsigned char *from, int width, int height) {
+static void interlace(unsigned char *to, unsigned char *from, int width, int height)
+{
int i, rowstride= width*3;
for (i=0; i<height; i++) {
@@ -266,7 +271,8 @@ static void interlace(unsigned char *to, unsigned char *from, int width, int hei
}
}
-static void deinterlace(int odd, unsigned char *to, unsigned char *from, int width, int height) {
+static void deinterlace(int odd, unsigned char *to, unsigned char *from, int width, int height)
+{
int i, rowstride= width*3;
for (i=0; i<height; i++) {
@@ -277,7 +283,8 @@ static void deinterlace(int odd, unsigned char *to, unsigned char *from, int wid
}
}
-static int check_and_decode_jpeg(unsigned char *inbuf, unsigned char *outbuf, int width, int height, int bufsize) {
+static int check_and_decode_jpeg(unsigned char *inbuf, unsigned char *outbuf, int width, int height, int bufsize)
+{
/* JPEG's are always multiples of 16, extra is cropped out AVI's */
if ((width&0xF) || (height&0xF)) {
int i, rrowstride, jrowstride;
@@ -299,7 +306,8 @@ static int check_and_decode_jpeg(unsigned char *inbuf, unsigned char *outbuf, in
}
}
-static void check_and_compress_jpeg(int quality, unsigned char *outbuf, unsigned char *inbuf, int width, int height, int bufsize) {
+static void check_and_compress_jpeg(int quality, unsigned char *outbuf, unsigned char *inbuf, int width, int height, int bufsize)
+{
/* JPEG's are always multiples of 16, extra is ignored in AVI's */
if ((width&0xF) || (height&0xF)) {
int i, rrowstride, jrowstride;
@@ -326,7 +334,8 @@ static void check_and_compress_jpeg(int quality, unsigned char *outbuf, unsigned
}
}
-void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
+void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size)
+{
int deint;
unsigned char *buf;
@@ -349,7 +358,8 @@ void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buff
return buf;
}
-void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
+void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size)
+{
unsigned char *buf;
int bufsize= *size;
@@ -380,22 +390,26 @@ void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer
/* Compression from memory */
-static void jpegmemdestmgr_init_destination(j_compress_ptr cinfo) {
+static void jpegmemdestmgr_init_destination(j_compress_ptr cinfo)
+{
(void)cinfo; /* unused */
}
-static boolean jpegmemdestmgr_empty_output_buffer(j_compress_ptr cinfo) {
+static boolean jpegmemdestmgr_empty_output_buffer(j_compress_ptr cinfo)
+{
(void)cinfo; /* unused */
return TRUE;
}
-static void jpegmemdestmgr_term_destination(j_compress_ptr cinfo) {
+static void jpegmemdestmgr_term_destination(j_compress_ptr cinfo)
+{
numbytes-= cinfo->dest->free_in_buffer;
MEM_freeN(cinfo->dest);
}
-static void jpegmemdestmgr_build(j_compress_ptr cinfo, unsigned char *buffer, int bufsize) {
+static void jpegmemdestmgr_build(j_compress_ptr cinfo, unsigned char *buffer, int bufsize)
+{
cinfo->dest= MEM_mallocN(sizeof(*(cinfo->dest)), "avi.jpegmemdestmgr_build");
cinfo->dest->init_destination= jpegmemdestmgr_init_destination;
@@ -410,11 +424,13 @@ static void jpegmemdestmgr_build(j_compress_ptr cinfo, unsigned char *buffer, in
/* Decompression from memory */
-static void jpegmemsrcmgr_init_source(j_decompress_ptr dinfo) {
+static void jpegmemsrcmgr_init_source(j_decompress_ptr dinfo)
+{
(void)dinfo;
}
-static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo) {
+static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo)
+{
unsigned char *buf= (unsigned char*) dinfo->src->next_input_byte-2;
/* if we get called, must have run out of data */
@@ -429,7 +445,8 @@ static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo) {
return TRUE;
}
-static void jpegmemsrcmgr_skip_input_data(j_decompress_ptr dinfo, long skipcnt) {
+static void jpegmemsrcmgr_skip_input_data(j_decompress_ptr dinfo, long skipcnt)
+{
if (dinfo->src->bytes_in_buffer<skipcnt)
skipcnt= dinfo->src->bytes_in_buffer;
@@ -437,13 +454,15 @@ static void jpegmemsrcmgr_skip_input_data(j_decompress_ptr dinfo, long skipcnt)
dinfo->src->bytes_in_buffer-= skipcnt;
}
-static void jpegmemsrcmgr_term_source(j_decompress_ptr dinfo) {
+static void jpegmemsrcmgr_term_source(j_decompress_ptr dinfo)
+{
numbytes-= dinfo->src->bytes_in_buffer;
MEM_freeN(dinfo->src);
}
-static void jpegmemsrcmgr_build(j_decompress_ptr dinfo, unsigned char *buffer, int bufsize) {
+static void jpegmemsrcmgr_build(j_decompress_ptr dinfo, unsigned char *buffer, int bufsize)
+{
dinfo->src= MEM_mallocN(sizeof(*(dinfo->src)), "avi.jpegmemsrcmgr_build");
dinfo->src->init_source= jpegmemsrcmgr_init_source;
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index bda153d0cd3..483b708bee6 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -43,7 +43,8 @@
/* avi_set_compress_options gets its own file... now don't WE feel important? */
-AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) {
+AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data)
+{
int i;
int useconds;
diff --git a/source/blender/avi/intern/rgb32.c b/source/blender/avi/intern/rgb32.c
index 4d088377c9e..e3be082cca6 100644
--- a/source/blender/avi/intern/rgb32.c
+++ b/source/blender/avi/intern/rgb32.c
@@ -40,7 +40,8 @@
#include "MEM_guardedalloc.h"
#include "rgb32.h"
-void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
+void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size)
+{
int y, x, rowstridea, rowstrideb;
unsigned char *buf;
@@ -65,7 +66,8 @@ void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buff
return buf;
}
-void *avi_converter_to_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
+void *avi_converter_to_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size)
+{
int i;
unsigned char *buf;
unsigned char *to, *from;
diff --git a/source/blender/blenfont/BLF_translation.h b/source/blender/blenfont/BLF_translation.h
index ddbc9a6a760..ce53b76da01 100644
--- a/source/blender/blenfont/BLF_translation.h
+++ b/source/blender/blenfont/BLF_translation.h
@@ -33,6 +33,8 @@
#ifndef BLF_TRANSLATION_H
#define BLF_TRANSLATION_H
+#define TEXT_DOMAIN_NAME "blender"
+
/* blf_translation.c */
#ifdef WITH_INTERNATIONAL
@@ -40,7 +42,8 @@ unsigned char *BLF_get_unifont(int *unifont_size);
void BLF_free_unifont(void);
#endif
-const char* BLF_gettext(const char *msgid);
+const char *BLF_gettext(const char *msgid);
+const char *BLF_pgettext(const char *context, const char *message);
/* blf_lang.c */
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 2ba23e501b4..6c27beb14a7 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -32,6 +32,8 @@
#include <stdlib.h>
#include <string.h>
+#include "BKE_global.h"
+
#include "BLF_api.h"
#include "BLF_translation.h" /* own include */
@@ -58,7 +60,6 @@
#include "BLI_utildefines.h"
#include "BLI_path_util.h"
-#define DOMAIN_NAME "blender"
#define SYSTEM_ENCODING_DEFAULT "UTF-8"
#define FONT_SIZE_DEFAULT 12
@@ -82,8 +83,13 @@ static const char *locales[] = {
"catalan", "ca_AD",
"czech", "cs_CZ",
"ptb", "pt_BR",
+#if defined (_WIN32) && !defined(FREE_WINDOWS)
"Chinese (Simplified)_China.1252", "zh_CN",
"Chinese (Traditional)_China.1252", "zh_TW",
+#else
+ "chs", "zh_CN",
+ "cht", "zh_TW",
+#endif
"russian", "ru_RU",
"croatian", "hr_HR",
"serbian", "sr_RS",
@@ -96,7 +102,8 @@ static const char *locales[] = {
"korean", "ko_KR",
"nepali", "ne_NP",
"persian", "fa_PE",
- "indonesian", "id_ID"
+ "indonesian", "id_ID",
+ "serbian (latin)", "sr_RS@latin",
};
void BLF_lang_init(void)
@@ -115,15 +122,50 @@ void BLF_lang_init(void)
}
+/* get LANG/LANGUAGE environment variable */
+static void get_language_variable(const char *varname, char *var, int maxlen)
+{
+ char *env= getenv(varname);
+
+ if(env) {
+ char *s;
+
+ /* store defaul locale */
+ BLI_strncpy(var, env, maxlen);
+
+ /* use first language as default */
+ s= strchr(var, ':');
+ if(s)
+ s[0]= 0;
+ }
+}
+
+/* get language to be used based on locale(which might be empty when using default language) and
+ * LANG environment variable
+ */
+static void get_language(const char *locale, const char *lang, char *language, int maxlen)
+{
+ if(locale[0]) {
+ BLI_strncpy(language, locale, maxlen);
+ }
+ else {
+ char *s;
+
+ BLI_strncpy(language, lang, maxlen);
+
+ s= strchr(language, '.');
+ if(s)
+ s[0]= 0;
+ }
+}
+
/* XXX WARNING!!! IN osx somehow the previous function call jumps in this one??? (ton, ppc) */
void BLF_lang_set(const char *str)
{
char *locreturn;
const char *short_locale;
int ok= 1;
-#if defined (_WIN32) && !defined(FREE_WINDOWS)
- const char *long_locale = locales[ 2 * U.language];
-#endif
+ const char *long_locale = locales[2 * U.language];
if((U.transopts&USER_DOTRANSLATE)==0)
return;
@@ -149,50 +191,72 @@ void BLF_lang_set(const char *str)
locreturn= setlocale(LC_ALL, long_locale);
if (locreturn == NULL) {
- printf("Could not change locale to %s\n", long_locale);
+ if(G.f & G_DEBUG)
+ printf("Could not change locale to %s\n", long_locale);
+
ok= 0;
}
#else
{
- const char *locale;
- static char default_locale[64]="\0";
+ static char default_lang[64]="\0";
+ static char default_language[64]="\0";
- if(default_locale[0]==0) {
- char *env_language= getenv("LANGUAGE");
+ if(default_lang[0]==0)
+ get_language_variable("LANG", default_lang, sizeof(default_lang));
- if(env_language) {
- char *s;
+ if(default_language[0]==0)
+ get_language_variable("LANGUAGE", default_language, sizeof(default_language));
- /* store defaul locale */
- BLI_strncpy(default_locale, env_language, sizeof(default_locale));
+ if(short_locale[0]) {
+ if(G.f & G_DEBUG)
+ printf("Setting LANG= and LANGUAGE to %s\n", short_locale);
- /* use first language as default */
- s= strchr(default_locale, ':');
- if(s) s[0]= 0;
- }
+ BLI_setenv("LANG", short_locale);
+ BLI_setenv("LANGUAGE", short_locale);
}
+ else {
+ if(G.f & G_DEBUG)
+ printf("Setting LANG=%s and LANGUAGE=%s\n", default_lang, default_language);
- if(short_locale[0])
- locale= short_locale;
- else
- locale= default_locale;
-
- BLI_setenv("LANG", locale);
- BLI_setenv("LANGUAGE", locale);
+ BLI_setenv("LANG", default_lang);
+ BLI_setenv("LANGUAGE", default_language);
+ }
- locreturn= setlocale(LC_ALL, locale);
+ locreturn= setlocale(LC_ALL, short_locale);
- if (locreturn == NULL) {
- char *short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale);
+ if(locreturn == NULL) {
+ char *short_locale_utf8= NULL;
- locreturn= setlocale(LC_ALL, short_locale_utf8);
+ if(short_locale[0]) {
+ short_locale_utf8= BLI_sprintfN("%s.UTF-8", short_locale);
+ locreturn= setlocale(LC_ALL, short_locale_utf8);
+ }
if (locreturn == NULL) {
- printf("Could not change locale to %s nor %s\n", short_locale, short_locale_utf8);
+ char language[65];
+
+ get_language(long_locale, default_lang, language, sizeof(language));
+
+ if(G.f & G_DEBUG) {
+ if(short_locale[0])
+ printf("Could not change locale to %s nor %s\n", short_locale, short_locale_utf8);
+ else
+ printf("Could not reset locale\n");
+
+ printf("Fallback to LANG=%s and LANGUAGE=%s\n", default_lang, language);
+ }
+
+ /* fallback to default settings */
+ BLI_setenv("LANG", default_lang);
+ BLI_setenv("LANGUAGE", language);
+
+ locreturn= setlocale(LC_ALL, "");
+
ok= 0;
}
- MEM_freeN(short_locale_utf8);
+ if(short_locale_utf8)
+ MEM_freeN(short_locale_utf8);
}
}
#endif
@@ -204,15 +268,15 @@ void BLF_lang_set(const char *str)
setlocale(LC_NUMERIC, "C");
- textdomain(DOMAIN_NAME);
- bindtextdomain(DOMAIN_NAME, global_messagepath);
- bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name);
+ textdomain(TEXT_DOMAIN_NAME);
+ bindtextdomain(TEXT_DOMAIN_NAME, global_messagepath);
+ bind_textdomain_codeset(TEXT_DOMAIN_NAME, global_encoding_name);
}
void BLF_lang_encoding(const char *str)
{
BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name));
- /* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */
+ /* bind_textdomain_codeset(TEXT_DOMAIN_NAME, encoding_name); */
}
#else /* ! WITH_INTERNATIONAL */
diff --git a/source/blender/blenfont/intern/blf_translation.c b/source/blender/blenfont/intern/blf_translation.c
index fe14f5d4d1c..0ddb6549717 100644
--- a/source/blender/blenfont/intern/blf_translation.c
+++ b/source/blender/blenfont/intern/blf_translation.c
@@ -29,9 +29,19 @@
*/
#include <stdlib.h>
+#include <string.h>
#ifdef WITH_INTERNATIONAL
#include <libintl.h>
+#include <locale.h>
+
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* needed for windows version of gettext */
+#ifndef LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
#endif
#include "MEM_guardedalloc.h"
@@ -91,6 +101,41 @@ const char* BLF_gettext(const char *msgid)
#endif
}
+const char *BLF_pgettext(const char *context, const char *message)
+{
+#ifdef WITH_INTERNATIONAL
+ char static_msg_ctxt_id[1024];
+ char *dynamic_msg_ctxt_id = NULL;
+ char *msg_ctxt_id;
+ const char *translation;
+
+ size_t overall_length = strlen(context) + strlen(message) + sizeof(GETTEXT_CONTEXT_GLUE) + 1;
+
+ if (overall_length > sizeof(static_msg_ctxt_id)) {
+ dynamic_msg_ctxt_id = malloc(overall_length);
+ msg_ctxt_id = dynamic_msg_ctxt_id;
+ }
+ else {
+ msg_ctxt_id = static_msg_ctxt_id;
+ }
+
+ sprintf(msg_ctxt_id, "%s%s%s", context, GETTEXT_CONTEXT_GLUE, message);
+
+ translation = (char*)dcgettext(TEXT_DOMAIN_NAME, msg_ctxt_id, LC_MESSAGES);
+
+ if (dynamic_msg_ctxt_id)
+ free(dynamic_msg_ctxt_id);
+
+ if (translation == msg_ctxt_id)
+ translation = message;
+
+ return translation;
+#else
+ (void)context;
+ return message;
+#endif
+}
+
int BLF_translate_iface(void)
{
#ifdef WITH_INTERNATIONAL
@@ -132,4 +177,3 @@ const char *BLF_translate_do_tooltip(const char *msgid)
return msgid;
#endif
}
-
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 84f1bf75a3f..5f451ce7821 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -94,6 +94,7 @@ struct DerivedMesh {
BVHCache bvhCache;
struct GPUDrawObject *drawObject;
DerivedMeshType type;
+ float auto_bump_scale;
/* Misc. Queries */
@@ -255,7 +256,11 @@ struct DerivedMesh {
*/
void (*drawFacesTex)(DerivedMesh *dm,
int (*setDrawOptions)(struct MTFace *tface,
- int has_mcol, int matnr));
+ int has_mcol, int matnr),
+ int (*compareDrawOptions)(void *userData,
+ int cur_index,
+ int next_index),
+ void *userData);
/* Draw all faces with GLSL materials
* o setMaterial is called for every different material nr
@@ -280,9 +285,11 @@ struct DerivedMesh {
void (*drawMappedFaces)(DerivedMesh *dm,
int (*setDrawOptions)(void *userData, int index,
int *drawSmooth_r),
- void *userData, int useColors,
int (*setMaterial)(int, void *attribs),
- int (*compareDrawOptions)(void *userData, int cur_index, int next_index));
+ int (*compareDrawOptions)(void *userData,
+ int cur_index,
+ int next_index),
+ void *userData, int useColors);
/* Draw mapped faces using MTFace
* o Drawing options too complicated to enumerate, look at code.
@@ -290,6 +297,9 @@ struct DerivedMesh {
void (*drawMappedFacesTex)(DerivedMesh *dm,
int (*setDrawOptions)(void *userData,
int index),
+ int (*compareDrawOptions)(void *userData,
+ int cur_index,
+ int next_index),
void *userData);
/* Draw mapped faces with GLSL materials
@@ -299,7 +309,8 @@ struct DerivedMesh {
*/
void (*drawMappedFacesGLSL)(DerivedMesh *dm,
int (*setMaterial)(int, void *attribs),
- int (*setDrawOptions)(void *userData, int index), void *userData);
+ int (*setDrawOptions)(void *userData, int index),
+ void *userData);
/* Draw mapped edges as lines
* o Only if !setDrawOptions or setDrawOptions(userData, mapped-edge)
@@ -554,10 +565,21 @@ typedef struct DMVertexAttribs {
int tottface, totmcol, tottang, totorco;
} DMVertexAttribs;
+/* should be local, bmesh replaces this */
+typedef struct {
+ DerivedMesh dm;
+
+ struct EditMesh *em;
+ float (*vertexCos)[3];
+ float (*vertexNos)[3];
+ float (*faceNos)[3];
+} EditMeshDerivedMesh;
+
void DM_vertex_attributes_from_gpu(DerivedMesh *dm,
struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
void DM_add_tangent_layer(DerivedMesh *dm);
+void DM_calc_auto_bump_scale(DerivedMesh *dm);
/* Set object's bounding box based on DerivedMesh min/max data */
void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
diff --git a/source/blender/blenkernel/BKE_array_mallocn.h b/source/blender/blenkernel/BKE_array_mallocn.h
index 45ca4a5e694..0f312360521 100644
--- a/source/blender/blenkernel/BKE_array_mallocn.h
+++ b/source/blender/blenkernel/BKE_array_mallocn.h
@@ -34,28 +34,28 @@
*/
/* example of usage:
-
-int *arr = NULL;
-V_DECLARE(arr);
-int i;
-
-for (i=0; i<10; i++) {
- V_GROW(arr);
- arr[i] = something;
-}
-V_FREE(arr);
-
-arrays are buffered, using double-buffering (so on each reallocation,
-the array size is doubled). supposedly this should give good Big Oh
-behaviour, though it may not be the best in practice.
-*/
+ *
+ * int *arr = NULL;
+ * V_DECLARE(arr);
+ * int i;
+ *
+ * for (i=0; i<10; i++) {
+ * V_GROW(arr);
+ * arr[i] = something;
+ * }
+ * V_FREE(arr);
+ *
+ * arrays are buffered, using double-buffering (so on each reallocation,
+ * the array size is doubled). supposedly this should give good Big Oh
+ * behaviour, though it may not be the best in practice.
+ */
#define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
-/*in the future, I plan on having V_DECLARE allocate stack memory it'll
- use at first, and switch over to heap when it needs more. that'll mess
- up cases where you'd want to use this API to build a dynamic list for
- non-local use, so all such cases should use this macro.*/
+/* in the future, I plan on having V_DECLARE allocate stack memory it'll
+ * use at first, and switch over to heap when it needs more. that'll mess
+ * up cases where you'd want to use this API to build a dynamic list for
+ * non-local use, so all such cases should use this macro.*/
#define V_DYNDECLARE(vec) V_DECLARE(vec)
/*this returns the entire size of the array, including any buffering.*/
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 8738dc0830a..cb4fba43f8d 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -41,17 +41,17 @@ extern "C" {
/* these lines are grep'd, watch out for our not-so-awesome regex
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
-#define BLENDER_VERSION 260
-#define BLENDER_SUBVERSION 6
+#define BLENDER_VERSION 261
+#define BLENDER_SUBVERSION 0
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
/* used by packaging tools */
/* can be left blank, otherwise a,b,c... etc with no quotes */
-#define BLENDER_VERSION_CHAR a
+#define BLENDER_VERSION_CHAR
/* alpha/beta/rc/release, docs use this */
-#define BLENDER_VERSION_CYCLE beta
+#define BLENDER_VERSION_CYCLE alpha
extern char versionstr[]; /* from blender.c */
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index fd3a3fea2bb..b358209a0f4 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -45,9 +45,6 @@ struct rctf;
# define DO_INLINE static inline
#endif
-void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w);
-void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w);
-
struct CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, float maxy);
void curvemapping_free(struct CurveMapping *cumap);
struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 5497866b9df..1af2f014ef4 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -38,10 +38,12 @@
extern "C" {
#endif
+#include "../blenloader/BLO_sys_types.h" /* XXX, should have a more generic include for this */
+
struct ID;
struct CustomData;
struct CustomDataLayer;
-typedef unsigned int CustomDataMask;
+typedef uint64_t CustomDataMask;
extern const CustomDataMask CD_MASK_BAREMESH;
extern const CustomDataMask CD_MASK_MESH;
@@ -65,12 +67,17 @@ extern const CustomDataMask CD_MASK_FACECORNERS;
#define CD_DUPLICATE 4 /* do a full copy of all layers, only allowed if source
has same number of elements */
+#define CD_TYPE_AS_MASK(_type) (CustomDataMask)(1 << (CustomDataMask)(_type))
+
/* initialises a CustomData object with the same layer setup as source.
* mask is a bitfield where (mask & (1 << (layer type))) indicates
* if a layer should be copied or not. alloctype must be one of the above. */
void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
CustomDataMask mask, int alloctype, int totelem);
+/* BMESH_TODO, not really a public function but readfile.c needs it */
+void CustomData_update_typemap(struct CustomData *data);
+
/* same as the above, except that this will preserve existing layers, and only
* add the layers that were not there yet */
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
@@ -121,9 +128,10 @@ int CustomData_number_of_layers(const struct CustomData *data, int type);
/* duplicate data of a layer with flag NOFREE, and remove that flag.
* returns the layer data */
-void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type);
+void *CustomData_duplicate_referenced_layer(struct CustomData *data, const int type, const int totelem);
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, const char *name);
+ const int type, const char *name, const int totelem);
+int CustomData_is_referenced_layer(struct CustomData *data, int type);
/* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
* zero for the layer type, so only layer types specified by the mask
@@ -140,12 +148,13 @@ void CustomData_set_only_copy(const struct CustomData *data,
void CustomData_copy_data(const struct CustomData *source,
struct CustomData *dest, int source_index,
int dest_index, int count);
+void CustomData_copy_elements(int type, void *source, void *dest, int count);
void CustomData_em_copy_data(const struct CustomData *source,
struct CustomData *dest, void *src_block,
void **dest_block);
void CustomData_bmesh_copy_data(const struct CustomData *source,
- struct CustomData *dest,void *src_block,
- void **dest_block);
+ struct CustomData *dest, void *src_block,
+ void **dest_block);
void CustomData_em_validate_data(struct CustomData *data, void *block, int sub_elements);
/* frees data in a CustomData object
@@ -187,11 +196,18 @@ void CustomData_swap(struct CustomData *data, int index, const int *corner_indic
* returns NULL if there is no layer of type
*/
void *CustomData_get(const struct CustomData *data, int index, int type);
+void *CustomData_get_n(const struct CustomData *data, int type, int index, int n);
void *CustomData_em_get(const struct CustomData *data, void *block, int type);
void *CustomData_em_get_n(const struct CustomData *data, void *block, int type, int n);
void *CustomData_bmesh_get(const struct CustomData *data, void *block, int type);
void *CustomData_bmesh_get_n(const struct CustomData *data, void *block, int type, int n);
+/* gets the layer at physical index n, with no type checking.
+ */
+void *CustomData_bmesh_get_layer_n(const struct CustomData *data, void *block, int n);
+
+int CustomData_set_layer_name(const struct CustomData *data, int type, int n, const char *name);
+
/* gets a pointer to the active or first layer of type
* returns NULL if there is no layer of type
*/
@@ -201,6 +217,7 @@ void *CustomData_get_layer_named(const struct CustomData *data, int type,
const char *name);
int CustomData_get_layer_index(const struct CustomData *data, int type);
+int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n);
int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name);
int CustomData_get_active_layer_index(const struct CustomData *data, int type);
int CustomData_get_render_layer_index(const struct CustomData *data, int type);
@@ -227,6 +244,11 @@ void CustomData_bmesh_set(const struct CustomData *data, void *block, int type,
void CustomData_bmesh_set_n(struct CustomData *data, void *block, int type, int n,
void *source);
+/*sets the data of the block at physical layer n. no real type checking
+ *is performed.
+ */
+void CustomData_bmesh_set_layer_n(struct CustomData *data, void *block, int n,
+ void *source);
/* set the pointer of to the first layer of type. the old data is not freed.
* returns the value of ptr if the layer is found, NULL otherwise
@@ -285,7 +307,8 @@ void CustomData_validate_layer_name(const struct CustomData *data, int type, cha
int CustomData_verify_versions(struct CustomData *data, int index);
/*BMesh specific customdata stuff*/
-void CustomData_to_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
+void CustomData_to_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata,
+ struct CustomData *ldata);
void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata, int total);
void CustomData_bmesh_init_pool(struct CustomData *data, int allocsize);
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index ed8ea691134..9a27f292f36 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -43,7 +43,6 @@ struct MDeformVert;
void defgroup_copy_list(struct ListBase *lb1, struct ListBase *lb2);
struct bDeformGroup *defgroup_duplicate(struct bDeformGroup *ingroup);
struct bDeformGroup *defgroup_find_name(struct Object *ob, const char *name);
-int defgroup_find_index(struct Object *ob, struct bDeformGroup *dg);
int *defgroup_flip_map(struct Object *ob, int *flip_map_len, int use_default);
int *defgroup_flip_map_single(struct Object *ob, int *flip_map_len, int use_default, int defgroup);
int defgroup_flip_index(struct Object *ob, int index, int use_default);
@@ -52,7 +51,8 @@ void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, const int defgroup);
struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, const int defgroup);
-void defvert_remove_index(struct MDeformVert *dvert, int defgroup, struct MDeformWeight *dw);
+void defvert_add_index_notest(struct MDeformVert *dv, int defgroup, const float weight);
+void defvert_remove_group(struct MDeformVert *dvert, struct MDeformWeight *dw);
float defvert_find_weight(const struct MDeformVert *dvert, const int defgroup);
float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup);
@@ -62,9 +62,10 @@ void defvert_copy_index(struct MDeformVert *dvert_dst, const struct MDeformVert
void defvert_sync(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src, int use_verify);
void defvert_sync_mapped(struct MDeformVert *dvert_dst, const struct MDeformVert *dvert_src,
const int *flip_map, const int flip_map_len, const int use_verify);
-void defvert_remap (struct MDeformVert *dvert, int *map);
+void defvert_remap (struct MDeformVert *dvert, int *map, const int map_len);
void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
void defvert_normalize(struct MDeformVert *dvert);
+void defvert_normalize_lock(struct MDeformVert *dvert, const int def_nr_lock);
/* utility function, note that 32 chars is the maximum string length since its only
* used with defgroups currently */
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 7f4e809718c..3ebd57dde39 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -109,15 +109,10 @@ typedef struct EffectorCache {
int flag;
} EffectorCache;
-void free_effect(struct Effect *eff);
-void free_effects(struct ListBase *lb);
struct Effect *copy_effect(struct Effect *eff);
void copy_effects(struct ListBase *lbn, struct ListBase *lb);
void deselectall_eff(struct Object *ob);
-struct PartEff *give_parteff(struct Object *ob);
-
-
void free_partdeflect(struct PartDeflect *pd);
struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights);
void pdEndEffectors(struct ListBase **effectors);
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 5ccdd7c04af..7668d5392da 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -141,6 +141,7 @@ typedef struct Global {
#define G_FILE_RECOVER (1 << 23)
#define G_FILE_RELATIVE_REMAP (1 << 24)
#define G_FILE_HISTORY (1 << 25)
+#define G_FILE_MESH_COMPAT (1 << 26) /* BMesh option to save as older mesh format */
/* G.windowstate */
#define G_WINDOWSTATE_USERDEF 0
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index 554314c419a..044a40658c3 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -52,8 +52,10 @@ int group_is_animated(struct Object *parent, struct Group *group);
void group_tag_recalc(struct Group *group);
void group_handle_recalc_and_update(struct Scene *scene, struct Object *parent, struct Group *group);
+#if 0 /* UNUSED */
struct Object *group_get_member_with_action(struct Group *group, struct bAction *act);
void group_relink_nla_objects(struct Object *ob);
+#endif
#endif
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 900835940c7..53ff7d873ad 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -37,11 +37,13 @@ struct BoundBox;
struct DispList;
struct ListBase;
struct EditMesh;
-struct MDeformVert;
struct Mesh;
+struct MPoly;
+struct MLoop;
struct MFace;
struct MEdge;
struct MVert;
+struct MDeformVert;
struct MCol;
struct Object;
struct MTFace;
@@ -49,6 +51,7 @@ struct VecNor;
struct CustomData;
struct DerivedMesh;
struct Scene;
+struct MLoopUV;
#ifdef __cplusplus
extern "C" {
@@ -57,6 +60,11 @@ extern "C" {
struct EditMesh *BKE_mesh_get_editmesh(struct Mesh *me);
void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
+/* for forwards compat only quad->tri polys to mface, skip ngons.
+ */
+int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
+ struct CustomData *pdata, int totface, int totloop, int totpoly);
+
void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me);
struct Mesh *add_mesh(const char *name);
@@ -127,17 +135,11 @@ typedef struct IndexNode {
struct IndexNode *next, *prev;
int index;
} IndexNode;
-void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
+void create_vert_face_map(struct ListBase **map, IndexNode **mem, const struct MFace *mface,
const int totvert, const int totface);
-void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
+void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge,
const int totvert, const int totedge);
-/* Partial Mesh Visibility */
-struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *);
-void mesh_pmv_free(struct PartialVisibility *);
-void mesh_pmv_revert(struct Mesh *me);
-void mesh_pmv_off(struct Mesh *me);
-
/* functions for making menu's from customdata layers */
int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
@@ -151,7 +153,13 @@ int mesh_center_bounds(struct Mesh *me, float cent[3]);
void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
/* mesh_validate.c */
-int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, unsigned int totvert, struct MEdge *medges, unsigned int totedge, struct MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes);
+int BKE_mesh_validate_arrays(
+ struct Mesh *me,
+ struct MVert *mverts, unsigned int totvert,
+ struct MEdge *medges, unsigned int totedge,
+ struct MFace *mfaces, unsigned int totface,
+ struct MDeformVert *dverts, /* assume totvert length */
+ const short do_verbose, const short do_fixes);
int BKE_mesh_validate(struct Mesh *me, int do_verbose);
int BKE_mesh_validate_dm(struct DerivedMesh *dm);
@@ -159,6 +167,12 @@ void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
void BKE_mesh_ensure_navmesh(struct Mesh *me);
+/*convert a triangle of loop facedata to mface facedata*/
+void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
+ struct CustomData *pdata, int lindex[4], int findex,
+ const int polyindex, const int mf_len,
+ const int numTex, const int numCol, const int hasWCol);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 84f8995b480..23073a2d8eb 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -65,6 +65,11 @@ typedef enum {
* unless it's a mesh and can be exploded -> curve can also emit particles
*/
eModifierTypeType_DeformOrConstruct,
+
+ /* Like eModifierTypeType_Nonconstructive, but does not affect the geometry
+ * of the object, rather some of its CustomData layers.
+ * E.g. UVProject and WeightVG modifiers. */
+ eModifierTypeType_NonGeometrical,
} ModifierTypeType;
typedef enum {
@@ -311,6 +316,7 @@ int modifier_supportsMapping(struct ModifierData *md);
int modifier_couldBeCage(struct Scene *scene, struct ModifierData *md);
int modifier_isCorrectableDeformed(struct ModifierData *md);
int modifier_sameTopology(ModifierData *md);
+int modifier_nonGeometrical(ModifierData *md);
int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
void modifier_setError(struct ModifierData *md, const char *format, ...)
#ifdef __GNUC__
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h
index 4d16df8afa3..b41f038941d 100644
--- a/source/blender/blenkernel/BKE_movieclip.h
+++ b/source/blender/blenkernel/BKE_movieclip.h
@@ -60,7 +60,7 @@ void BKE_movieclip_update_scopes(struct MovieClip *clip, struct MovieClipUser *u
void BKE_movieclip_get_cache_segments(struct MovieClip *clip, struct MovieClipUser *user, int *totseg_r, int **points_r);
-void BKE_movieclip_build_proxy_frame(struct MovieClip *clip, struct MovieDistortion *distortion,
+void BKE_movieclip_build_proxy_frame(struct MovieClip *clip, int clip_flag, struct MovieDistortion *distortion,
int cfra, int *build_sizes, int build_count, int undistorted);
#define TRACK_CLEAR_UPTO 0
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 0c07c4a57e0..01cc84237d6 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -307,8 +307,6 @@ void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sc
void ntreeMakeLocal(struct bNodeTree *ntree);
int ntreeHasType(struct bNodeTree *ntree, int type);
-void ntreeSocketUseFlags(struct bNodeTree *ntree);
-
void ntreeUpdateTree(struct bNodeTree *ntree);
/* XXX Currently each tree update call does call to ntreeVerifyNodes too.
* Some day this should be replaced by a decent depsgraph automatism!
@@ -523,6 +521,7 @@ struct ShadeResult;
#define SH_NODE_LAYER_WEIGHT 160
#define SH_NODE_VOLUME_TRANSPARENT 161
#define SH_NODE_VOLUME_ISOTROPIC 162
+#define SH_NODE_GAMMA 163
/* custom defines options for Material node */
#define SH_NODE_MAT_DIFF 1
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 5eb9529b2fc..828b0b47e3a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -120,6 +120,8 @@ void BKE_scene_foreach_display_point(
const short flag,
void (*func_cb)(const float[3], void *), void *user_data);
+int BKE_object_parent_loop_check(const struct Object *parent, const struct Object *ob);
+
void solve_tracking (struct Object *ob, float targetmat[][4]);
int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]);
@@ -128,7 +130,7 @@ void object_tfm_restore(struct Object *ob, void *obtfm_pt);
typedef struct ObjectTfmProtectedChannels {
float loc[3], dloc[3];
- float size[3], dsize[3];
+ float size[3], dscale[3];
float rot[3], drot[3];
float quat[4], dquat[4];
float rotAxis[3], drotAxis[3];
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index f491761f3f2..dbefbd95a15 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -63,7 +63,8 @@ struct BVHTreeRayHit;
#define LOOP_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
#define LOOP_EXISTING_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & PARS_UNEXIST))
#define LOOP_SHOWN_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
-#define LOOP_DYNAMIC_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(pa->state.time > 0.f)
+/* OpenMP: Can only advance one variable within loop definition. */
+#define LOOP_DYNAMIC_PARTICLES for(p=0; p<psys->totpart; p++ ) if((pa=psys->particles+p)->state.time > 0.f)
#define PSYS_FRAND_COUNT 1024
#define PSYS_FRAND(seed) psys->frand[(seed) % PSYS_FRAND_COUNT]
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index 52fa52a5899..7f321abf48e 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -67,7 +67,7 @@ void free_plugin_tex(struct PluginTex *pit);
void init_colorband(struct ColorBand *coba, int rangetype);
struct ColorBand *add_colorband(int rangetype);
-int do_colorband(struct ColorBand *coba, float in, float out[4]);
+int do_colorband(const struct ColorBand *coba, float in, float out[4]);
void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
int vergcband(const void *a1, const void *a2);
struct CBData *colorband_element_add(struct ColorBand *coba, float position);
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index e55d40ebfe5..7b3cb3f69bb 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -34,11 +34,13 @@
struct bGPDlayer;
struct ImBuf;
+struct ListBase;
struct MovieReconstructContext;
struct MovieTrackingTrack;
struct MovieTrackingMarker;
struct MovieTracking;
struct MovieTrackingContext;
+struct MovieTrackingObject;
struct MovieClipUser;
struct MovieDistortion;
struct Camera;
@@ -49,8 +51,8 @@ void BKE_tracking_init_settings(struct MovieTracking *tracking);
void BKE_tracking_clamp_track(struct MovieTrackingTrack *track, int event);
void BKE_tracking_track_flag(struct MovieTrackingTrack *track, int area, int flag, int clear);
-struct MovieTrackingTrack *BKE_tracking_add_track(struct MovieTracking *tracking, float x, float y,
- int framenr, int width, int height);
+struct MovieTrackingTrack *BKE_tracking_add_track(struct MovieTracking *tracking, struct ListBase *tracksbase,
+ float x, float y, int framenr, int width, int height);
void BKE_tracking_insert_marker(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
void BKE_tracking_delete_marker(struct MovieTrackingTrack *track, int framenr);
@@ -72,40 +74,54 @@ struct ImBuf *BKE_tracking_get_pattern_imbuf(struct ImBuf *ibuf, struct MovieTra
struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
struct MovieTrackingMarker *marker, int margin, int anchored, float pos[2], int origin[2]);
-void BKE_track_unique_name(struct MovieTracking *tracking, struct MovieTrackingTrack *track);
+void BKE_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
-struct MovieTrackingTrack *BKE_tracking_named_track(struct MovieTracking *tracking, const char *name);
-struct MovieTrackingTrack *BKE_tracking_indexed_track(struct MovieTracking *tracking, int tracknr);
+struct MovieTrackingTrack *BKE_tracking_named_track(struct MovieTracking *tracking, struct MovieTrackingObject *object, const char *name);
+struct MovieTrackingTrack *BKE_tracking_indexed_track(struct MovieTracking *tracking, int tracknr, struct ListBase **tracksbase_r);
void BKE_tracking_camera_shift(struct MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty);
void BKE_tracking_camera_to_blender(struct MovieTracking *tracking, struct Scene *scene, struct Camera *camera, int width, int height);
void BKE_get_tracking_mat(struct Scene *scene, struct Object *ob, float mat[4][4]);
-void BKE_tracking_projection_matrix(struct MovieTracking *tracking, int framenr, int winx, int winy, float mat[4][4]);
+void BKE_tracking_projection_matrix(struct MovieTracking *tracking, struct MovieTrackingObject *object,
+ int framenr, int winx, int winy, float mat[4][4]);
+
+struct ListBase *BKE_tracking_get_tracks(struct MovieTracking *tracking);
+struct MovieTrackingReconstruction *BKE_tracking_get_reconstruction(struct MovieTracking *tracking);
+
+struct MovieTrackingTrack *BKE_tracking_active_track(struct MovieTracking *tracking);
+struct MovieTrackingObject *BKE_tracking_active_object(struct MovieTracking *tracking);
+struct MovieTrackingObject *BKE_tracking_get_camera_object(struct MovieTracking *tracking);
+struct ListBase *BKE_tracking_object_tracks(struct MovieTracking *tracking, struct MovieTrackingObject *object);
+struct MovieTrackingReconstruction *BKE_tracking_object_reconstruction(struct MovieTracking *tracking,
+ struct MovieTrackingObject *object);
/* 2D tracking */
struct MovieTrackingContext *BKE_tracking_context_new(struct MovieClip *clip, struct MovieClipUser *user,
- short backwards, short disable_failed);
+ short backwards, short sequence);
void BKE_tracking_context_free(struct MovieTrackingContext *context);
void BKE_tracking_sync(struct MovieTrackingContext *context);
void BKE_tracking_sync_user(struct MovieClipUser *user, struct MovieTrackingContext *context);
int BKE_tracking_next(struct MovieTrackingContext *context);
/* Camera solving */
-int BKE_tracking_can_reconstruct(struct MovieTracking *tracking, char *error_msg, int error_size);
+int BKE_tracking_can_reconstruct(struct MovieTracking *tracking, struct MovieTrackingObject *object,
+ char *error_msg, int error_size);
struct MovieReconstructContext* BKE_tracking_reconstruction_context_new(struct MovieTracking *tracking,
- int keyframe1, int keyframe2, int width, int height);
+ struct MovieTrackingObject *object, int keyframe1, int keyframe2, int width, int height);
void BKE_tracking_reconstruction_context_free(struct MovieReconstructContext *context);
void BKE_tracking_solve_reconstruction(struct MovieReconstructContext *context,
short *stop, short *do_update, float *progress, char *stats_message, int message_size);
int BKE_tracking_finish_reconstruction(struct MovieReconstructContext *context, struct MovieTracking *tracking);
-struct MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(struct MovieTracking *tracking, int framenr);
-void BKE_tracking_get_interpolated_camera(struct MovieTracking *tracking, int framenr, float mat[4][4]);
+struct MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(struct MovieTracking *tracking,
+ struct MovieTrackingObject *object, int framenr);
+void BKE_tracking_get_interpolated_camera(struct MovieTracking *tracking,
+ struct MovieTrackingObject *object, int framenr, float mat[4][4]);
/* Feature detection */
-void BKE_tracking_detect_fast(struct MovieTracking *tracking, struct ImBuf *imbuf,
+void BKE_tracking_detect_fast(struct MovieTracking *tracking, struct ListBase *tracksbase, struct ImBuf *imbuf,
int framenr, int margin, int min_trackness, int min_distance, struct bGPDlayer *layer,
int place_outside_layer);
@@ -127,8 +143,14 @@ void BKE_tracking_distortion_destroy(struct MovieDistortion *distortion);
struct ImBuf *BKE_tracking_undistort(struct MovieTracking *tracking, struct ImBuf *ibuf, int width, int height, float overscan);
struct ImBuf *BKE_tracking_distort(struct MovieTracking *tracking, struct ImBuf *ibuf, int width, int height, float overscan);
+/* Object tracking */
+struct MovieTrackingObject *BKE_tracking_new_object(struct MovieTracking *tracking, const char *name);
+void BKE_tracking_remove_object(struct MovieTracking *tracking, struct MovieTrackingObject *object);
+void BKE_tracking_object_unique_name(struct MovieTracking *tracking, struct MovieTrackingObject *object);
+struct MovieTrackingObject *BKE_tracking_named_object(struct MovieTracking *tracking, const char *name);
+
/* Select */
-void BKE_tracking_select_track(struct MovieTracking *tracking, struct MovieTrackingTrack *track, int area, int extend);
+void BKE_tracking_select_track(struct ListBase *tracksbase, struct MovieTrackingTrack *track, int area, int extend);
void BKE_tracking_deselect_track(struct MovieTrackingTrack *track, int area);
#define TRACK_SELECTED(track) ((((track)->flag&TRACK_HIDDEN)==0) && ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT))
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 3222167c56e..b5b3c7e67eb 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -36,6 +36,10 @@
#ifndef BKE_UTILDEFINES_H
#define BKE_UTILDEFINES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* these values need to be hardcoded in structs, dna does not recognize defines */
/* also defined in DNA_space_types.h */
#ifndef FILE_MAXDIR
@@ -81,6 +85,8 @@
/* bit-row */
#define BROW(min, max) (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
-#define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
+#ifdef __cplusplus
+}
+#endif
#endif // BKE_UTILDEFINES_H
diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h
index 3263a1659f3..257ed0ba15f 100644
--- a/source/blender/blenkernel/BKE_writeffmpeg.h
+++ b/source/blender/blenkernel/BKE_writeffmpeg.h
@@ -72,7 +72,7 @@ extern int append_ffmpeg(struct RenderData *rd, int frame, int *pixels, int rect
void filepath_ffmpeg(char* string, struct RenderData* rd);
extern void ffmpeg_set_preset(struct RenderData *rd, int preset);
-extern void ffmpeg_verify_image_type(struct RenderData *rd);
+extern void ffmpeg_verify_image_type(struct RenderData *rd, struct ImageFormatData *imf);
extern struct IDProperty *ffmpeg_property_add(struct RenderData *Rd, const char *type, int opt_index, int parent_index);
extern int ffmpeg_property_add_string(struct RenderData *rd, const char *type, const char *str);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b4745669ff0..9135f3e39f0 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -91,6 +91,7 @@ set(SRC
intern/displist.c
intern/dynamicpaint.c
intern/effect.c
+ intern/editderivedmesh.c
intern/fcurve.c
intern/fluidsim.c
intern/fmodifier.c
diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h
index 2dd14281253..0338d10a66d 100644
--- a/source/blender/blenkernel/depsgraph_private.h
+++ b/source/blender/blenkernel/depsgraph_private.h
@@ -69,7 +69,7 @@ typedef struct DagNode
int ancestor_count;
unsigned int lay; // accumulated layers of its relations + itself
unsigned int scelay; // layers due to being in scene
- unsigned int customdata_mask; // customdata mask
+ uint64_t customdata_mask; // customdata mask
int lasttime; // if lasttime != DagForest->time, this node was not evaluated yet for flushing
int BFS_dist; // BFS distance
int DFS_dist; // DFS distance
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 140f596f78c..3ab52a7c17b 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -218,7 +218,7 @@ static CCGAllocatorIFC *_getStandardAllocatorIFC(void) {
/***/
-static int VertDataEqual(float *a, float *b) {
+static int VertDataEqual(const float *a, const float *b) {
return a[0]==b[0] && a[1]==b[1] && a[2]==b[2];
}
#define VertDataZero(av) { float *_a = (float*) av; _a[0] = _a[1] = _a[2] = 0.0f; }
@@ -238,7 +238,7 @@ static int VertDataEqual(float *a, float *b) {
#define NormAdd(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0]+=_b[0]; _a[1]+=_b[1]; _a[2]+=_b[2]; }
-static int _edge_isBoundary(CCGEdge *e);
+static int _edge_isBoundary(const CCGEdge *e);
/***/
@@ -392,7 +392,7 @@ static void _vert_addFace(CCGVert *v, CCGFace *f, CCGSubSurf *ss) {
v->faces = CCGSUBSURF_realloc(ss, v->faces, (v->numFaces+1)*sizeof(*v->faces), v->numFaces*sizeof(*v->faces));
v->faces[v->numFaces++] = f;
}
-static CCGEdge *_vert_findEdgeTo(CCGVert *v, CCGVert *vQ) {
+static CCGEdge *_vert_findEdgeTo(const CCGVert *v, const CCGVert *vQ) {
int i;
for (i=0; i<v->numEdges; i++) {
CCGEdge *e = v->edges[v->numEdges-1-i]; // XXX, note reverse
@@ -402,7 +402,7 @@ static CCGEdge *_vert_findEdgeTo(CCGVert *v, CCGVert *vQ) {
}
return NULL;
}
-static int _vert_isBoundary(CCGVert *v) {
+static int _vert_isBoundary(const CCGVert *v) {
int i;
for (i=0; i<v->numEdges; i++)
if (_edge_isBoundary(v->edges[i]))
@@ -423,7 +423,7 @@ static void _vert_free(CCGVert *v, CCGSubSurf *ss) {
CCGSUBSURF_free(ss, v);
}
-static int VERT_seam(CCGVert *v) {
+static int VERT_seam(const CCGVert *v) {
return ((v->flags & Vert_eSeam) != 0);
}
@@ -462,7 +462,7 @@ static void _edge_addFace(CCGEdge *e, CCGFace *f, CCGSubSurf *ss) {
e->faces = CCGSUBSURF_realloc(ss, e->faces, (e->numFaces+1)*sizeof(*e->faces), e->numFaces*sizeof(*e->faces));
e->faces[e->numFaces++] = f;
}
-static int _edge_isBoundary(CCGEdge *e) {
+static int _edge_isBoundary(const CCGEdge *e) {
return e->numFaces<2;
}
@@ -900,7 +900,7 @@ CCGError ccgSubSurf_syncFaceDel(CCGSubSurf *ss, CCGFaceHDL fHDL) {
return eCCGError_None;
}
-CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, void *vertData, int seam, CCGVert **v_r) {
+CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertData, int seam, CCGVert **v_r) {
void **prevp;
CCGVert *v = NULL;
short seamflag = (seam)? Vert_eSeam: 0;
@@ -2484,13 +2484,13 @@ CCGError ccgSubSurf_updateLevels(CCGSubSurf *ss, int lvl, CCGFace **effectedF, i
/*** External API accessor functions ***/
-int ccgSubSurf_getNumVerts(CCGSubSurf *ss) {
+int ccgSubSurf_getNumVerts(const CCGSubSurf *ss) {
return ss->vMap->numEntries;
}
-int ccgSubSurf_getNumEdges(CCGSubSurf *ss) {
+int ccgSubSurf_getNumEdges(const CCGSubSurf *ss) {
return ss->eMap->numEntries;
}
-int ccgSubSurf_getNumFaces(CCGSubSurf *ss) {
+int ccgSubSurf_getNumFaces(const CCGSubSurf *ss) {
return ss->fMap->numEntries;
}
@@ -2504,23 +2504,23 @@ CCGFace *ccgSubSurf_getFace(CCGSubSurf *ss, CCGFaceHDL f) {
return (CCGFace*) _ehash_lookup(ss->fMap, f);
}
-int ccgSubSurf_getSubdivisionLevels(CCGSubSurf *ss) {
+int ccgSubSurf_getSubdivisionLevels(const CCGSubSurf *ss) {
return ss->subdivLevels;
}
-int ccgSubSurf_getEdgeSize(CCGSubSurf *ss) {
+int ccgSubSurf_getEdgeSize(const CCGSubSurf *ss) {
return ccgSubSurf_getEdgeLevelSize(ss, ss->subdivLevels);
}
-int ccgSubSurf_getEdgeLevelSize(CCGSubSurf *ss, int level) {
+int ccgSubSurf_getEdgeLevelSize(const CCGSubSurf *ss, int level) {
if (level<1 || level>ss->subdivLevels) {
return -1;
} else {
return 1 + (1<<level);
}
}
-int ccgSubSurf_getGridSize(CCGSubSurf *ss) {
+int ccgSubSurf_getGridSize(const CCGSubSurf *ss) {
return ccgSubSurf_getGridLevelSize(ss, ss->subdivLevels);
}
-int ccgSubSurf_getGridLevelSize(CCGSubSurf *ss, int level) {
+int ccgSubSurf_getGridLevelSize(const CCGSubSurf *ss, int level) {
if (level<1 || level>ss->subdivLevels) {
return -1;
} else {
@@ -2736,19 +2736,19 @@ void ccgFaceIterator_free(CCGFaceIterator *vi) {
/*** Extern API final vert/edge/face interface ***/
-int ccgSubSurf_getNumFinalVerts(CCGSubSurf *ss) {
+int ccgSubSurf_getNumFinalVerts(const CCGSubSurf *ss) {
int edgeSize = 1 + (1<<ss->subdivLevels);
int gridSize = 1 + (1<<(ss->subdivLevels-1));
int numFinalVerts = ss->vMap->numEntries + ss->eMap->numEntries*(edgeSize-2) + ss->fMap->numEntries + ss->numGrids*((gridSize-2) + ((gridSize-2)*(gridSize-2)));
return numFinalVerts;
}
-int ccgSubSurf_getNumFinalEdges(CCGSubSurf *ss) {
+int ccgSubSurf_getNumFinalEdges(const CCGSubSurf *ss) {
int edgeSize = 1 + (1<<ss->subdivLevels);
int gridSize = 1 + (1<<(ss->subdivLevels-1));
int numFinalEdges = ss->eMap->numEntries*(edgeSize-1) + ss->numGrids*((gridSize-1) + 2*((gridSize-2)*(gridSize-1)));
return numFinalEdges;
}
-int ccgSubSurf_getNumFinalFaces(CCGSubSurf *ss) {
+int ccgSubSurf_getNumFinalFaces(const CCGSubSurf *ss) {
int gridSize = 1 + (1<<(ss->subdivLevels-1));
int numFinalFaces = ss->numGrids*((gridSize-1)*(gridSize-1));
return numFinalFaces;
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 457ad2af353..543411f26f4 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -56,7 +56,7 @@ CCGError ccgSubSurf_sync (CCGSubSurf *ss);
CCGError ccgSubSurf_initFullSync (CCGSubSurf *ss);
CCGError ccgSubSurf_initPartialSync (CCGSubSurf *ss);
-CCGError ccgSubSurf_syncVert (CCGSubSurf *ss, CCGVertHDL vHDL, void *vertData, int seam, CCGVert **v_r);
+CCGError ccgSubSurf_syncVert (CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertData, int seam, CCGVert **v_r);
CCGError ccgSubSurf_syncEdge (CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0, CCGVertHDL e_vHDL1, float crease, CCGEdge **e_r);
CCGError ccgSubSurf_syncFace (CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGVertHDL *vHDLs, CCGFace **f_r);
@@ -84,15 +84,15 @@ CCGError ccgSubSurf_setCalcVertexNormals (CCGSubSurf *ss, int useVertNormals, i
/***/
-int ccgSubSurf_getNumVerts (CCGSubSurf *ss);
-int ccgSubSurf_getNumEdges (CCGSubSurf *ss);
-int ccgSubSurf_getNumFaces (CCGSubSurf *ss);
+int ccgSubSurf_getNumVerts (const CCGSubSurf *ss);
+int ccgSubSurf_getNumEdges (const CCGSubSurf *ss);
+int ccgSubSurf_getNumFaces (const CCGSubSurf *ss);
-int ccgSubSurf_getSubdivisionLevels (CCGSubSurf *ss);
-int ccgSubSurf_getEdgeSize (CCGSubSurf *ss);
-int ccgSubSurf_getEdgeLevelSize (CCGSubSurf *ss, int level);
-int ccgSubSurf_getGridSize (CCGSubSurf *ss);
-int ccgSubSurf_getGridLevelSize (CCGSubSurf *ss, int level);
+int ccgSubSurf_getSubdivisionLevels (const CCGSubSurf *ss);
+int ccgSubSurf_getEdgeSize (const CCGSubSurf *ss);
+int ccgSubSurf_getEdgeLevelSize (const CCGSubSurf *ss, int level);
+int ccgSubSurf_getGridSize (const CCGSubSurf *ss);
+int ccgSubSurf_getGridLevelSize (const CCGSubSurf *ss, int level);
CCGVert* ccgSubSurf_getVert (CCGSubSurf *ss, CCGVertHDL v);
CCGVertHDL ccgSubSurf_getVertVertHandle (CCGVert *v);
@@ -135,9 +135,9 @@ void* ccgSubSurf_getFaceGridEdgeData (CCGSubSurf *ss, CCGFace *f, int gridInde
void* ccgSubSurf_getFaceGridDataArray (CCGSubSurf *ss, CCGFace *f, int gridIndex);
void* ccgSubSurf_getFaceGridData (CCGSubSurf *ss, CCGFace *f, int gridIndex, int x, int y);
-int ccgSubSurf_getNumFinalVerts (CCGSubSurf *ss);
-int ccgSubSurf_getNumFinalEdges (CCGSubSurf *ss);
-int ccgSubSurf_getNumFinalFaces (CCGSubSurf *ss);
+int ccgSubSurf_getNumFinalVerts (const CCGSubSurf *ss);
+int ccgSubSurf_getNumFinalEdges (const CCGSubSurf *ss);
+int ccgSubSurf_getNumFinalFaces (const CCGSubSurf *ss);
/***/
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 4e26078a2c5..d0ef517e2ae 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -60,6 +60,7 @@
#include "BKE_texture.h"
#include "BKE_multires.h"
#include "BKE_armature.h"
+#include "BKE_deform.h"
#ifdef WITH_GAMEENGINE
#include "BKE_navmesh_conversion.h"
@@ -183,6 +184,7 @@ void DM_init(DerivedMesh *dm, DerivedMeshType type,
DM_init_funcs(dm);
dm->needsFree = 1;
+ dm->auto_bump_scale = -1.0f;
}
void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type,
@@ -456,1180 +458,6 @@ DerivedMesh *mesh_create_derived(Mesh *me, Object *ob, float (*vertCos)[3])
return dm;
}
-///
-
-typedef struct {
- DerivedMesh dm;
-
- EditMesh *em;
- float (*vertexCos)[3];
- float (*vertexNos)[3];
- float (*faceNos)[3];
-} EditMeshDerivedMesh;
-
-static void emDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
- int i;
-
- for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
- if (emdm->vertexCos) {
- func(userData, i, emdm->vertexCos[i], emdm->vertexNos[i], NULL);
- } else {
- func(userData, i, eve->co, eve->no, NULL);
- }
- }
-}
-static void emDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData, int index, float *v0co, float *v1co), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditEdge *eed;
- int i;
-
- if (emdm->vertexCos) {
- EditVert *eve;
-
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
- for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
- func(userData, i, emdm->vertexCos[(int) eed->v1->tmp.l], emdm->vertexCos[(int) eed->v2->tmp.l]);
- } else {
- for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
- func(userData, i, eed->v1->co, eed->v2->co);
- }
-}
-static void emDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditEdge *eed;
- int i;
-
- if (emdm->vertexCos) {
- EditVert *eve;
-
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
- glBegin(GL_LINES);
- for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
- if(!setDrawOptions || setDrawOptions(userData, i)) {
- glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
- }
- }
- glEnd();
- } else {
- glBegin(GL_LINES);
- for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
- if(!setDrawOptions || setDrawOptions(userData, i)) {
- glVertex3fv(eed->v1->co);
- glVertex3fv(eed->v2->co);
- }
- }
- glEnd();
- }
-}
-static void emDM_drawEdges(DerivedMesh *dm, int UNUSED(drawLooseEdges), int UNUSED(drawAllEdges))
-{
- emDM_drawMappedEdges(dm, NULL, NULL);
-}
-static void emDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void (*setDrawInterpOptions)(void *userData, int index, float t), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditEdge *eed;
- int i;
-
- if (emdm->vertexCos) {
- EditVert *eve;
-
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
- glBegin(GL_LINES);
- for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
- if(!setDrawOptions || setDrawOptions(userData, i)) {
- setDrawInterpOptions(userData, i, 0.0);
- glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
- setDrawInterpOptions(userData, i, 1.0);
- glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
- }
- }
- glEnd();
- } else {
- glBegin(GL_LINES);
- for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
- if(!setDrawOptions || setDrawOptions(userData, i)) {
- setDrawInterpOptions(userData, i, 0.0);
- glVertex3fv(eed->v1->co);
- setDrawInterpOptions(userData, i, 1.0);
- glVertex3fv(eed->v2->co);
- }
- }
- glEnd();
- }
-}
-
-static void emDM_drawUVEdges(DerivedMesh *dm)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditFace *efa;
- MTFace *tf;
-
- glBegin(GL_LINES);
- for(efa= emdm->em->faces.first; efa; efa= efa->next) {
- tf = CustomData_em_get(&emdm->em->fdata, efa->data, CD_MTFACE);
-
- if(tf && !(efa->h)) {
- glVertex2fv(tf->uv[0]);
- glVertex2fv(tf->uv[1]);
-
- glVertex2fv(tf->uv[1]);
- glVertex2fv(tf->uv[2]);
-
- if (!efa->v4) {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[0]);
- } else {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[3]);
- glVertex2fv(tf->uv[3]);
- glVertex2fv(tf->uv[0]);
- }
- }
- }
- glEnd();
-}
-
-static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3])
-{
- if (vertexCos) {
- copy_v3_v3(cent, vertexCos[(int) efa->v1->tmp.l]);
- add_v3_v3(cent, vertexCos[(int) efa->v2->tmp.l]);
- add_v3_v3(cent, vertexCos[(int) efa->v3->tmp.l]);
- if (efa->v4) add_v3_v3(cent, vertexCos[(int) efa->v4->tmp.l]);
- } else {
- copy_v3_v3(cent, efa->v1->co);
- add_v3_v3(cent, efa->v2->co);
- add_v3_v3(cent, efa->v3->co);
- if (efa->v4) add_v3_v3(cent, efa->v4->co);
- }
-
- if (efa->v4) {
- mul_v3_fl(cent, 0.25f);
- } else {
- mul_v3_fl(cent, 0.33333333333f);
- }
-}
-static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
- EditFace *efa;
- float cent[3];
- int i;
-
- if (emdm->vertexCos) {
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
- }
-
- for(i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
- emDM__calcFaceCent(efa, cent, emdm->vertexCos);
- func(userData, i, cent, emdm->vertexCos?emdm->faceNos[i]:efa->n);
- }
-}
-
-/* note, material function is ignored for now. */
-static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int UNUSED(useColors), int (*setMaterial)(int, void *attribs),
- int (*compareDrawOptions)(void *userData, int cur_index, int next_index))
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditFace *efa;
- int i, draw;
- const int skip_normals= !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */
-
- /* GL_ZERO is used to detect if drawing has started or not */
- GLenum poly_prev= GL_ZERO;
- GLenum shade_prev= GL_ZERO;
-
- (void)setMaterial; /* unused */
-
- /* currently unused -- each original face is handled separately */
- (void)compareDrawOptions;
-
- if (emdm->vertexCos) {
- /* add direct access */
- float (*vertexCos)[3]= emdm->vertexCos;
- float (*vertexNos)[3]= emdm->vertexNos;
- float (*faceNos)[3]= emdm->faceNos;
- EditVert *eve;
-
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
- for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
- int drawSmooth = (efa->flag & ME_SMOOTH);
- draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
- if(draw) {
- const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
- if (draw==2) { /* enabled with stipple */
-
- if(poly_prev != GL_ZERO) glEnd();
- poly_prev= GL_ZERO; /* force glBegin */
-
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_quarttone);
- }
-
- if(skip_normals) {
- if(poly_type != poly_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glBegin((poly_prev= poly_type));
- }
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- if(poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- else {
- const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
- if (shade_type != shade_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glShadeModel((shade_prev= shade_type)); /* same as below but switch shading */
- glBegin((poly_prev= poly_type));
- }
- else if(poly_type != poly_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glBegin((poly_prev= poly_type));
- }
-
- if (!drawSmooth) {
- glNormal3fv(faceNos[i]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- if(poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- } else {
- glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- if(poly_type == GL_QUADS) {
- glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- }
- }
-
-
- if (draw==2) {
- glEnd();
- poly_prev= GL_ZERO; /* force glBegin */
-
- glDisable(GL_POLYGON_STIPPLE);
- }
- }
- }
- }
- else {
- for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
- int drawSmooth = (efa->flag & ME_SMOOTH);
- draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
- if(draw) {
- const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
- if (draw==2) { /* enabled with stipple */
-
- if(poly_prev != GL_ZERO) glEnd();
- poly_prev= GL_ZERO; /* force glBegin */
-
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_quarttone);
- }
-
- if(skip_normals) {
- if(poly_type != poly_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glBegin((poly_prev= poly_type));
- }
- glVertex3fv(efa->v1->co);
- glVertex3fv(efa->v2->co);
- glVertex3fv(efa->v3->co);
- if(poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
- }
- else {
- const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
- if (shade_type != shade_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glShadeModel((shade_prev= shade_type)); /* same as below but switch shading */
- glBegin((poly_prev= poly_type));
- }
- else if(poly_type != poly_prev) {
- if(poly_prev != GL_ZERO) glEnd();
- glBegin((poly_prev= poly_type));
- }
-
- if (!drawSmooth) {
- glNormal3fv(efa->n);
- glVertex3fv(efa->v1->co);
- glVertex3fv(efa->v2->co);
- glVertex3fv(efa->v3->co);
- if(poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
- } else {
- glNormal3fv(efa->v1->no);
- glVertex3fv(efa->v1->co);
- glNormal3fv(efa->v2->no);
- glVertex3fv(efa->v2->co);
- glNormal3fv(efa->v3->no);
- glVertex3fv(efa->v3->co);
- if(poly_type == GL_QUADS) {
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
- }
- }
- }
-
-
- if (draw==2) {
- glEnd();
- poly_prev= GL_ZERO;
-
- glDisable(GL_POLYGON_STIPPLE);
- }
- }
- }
- }
-
- /* if non zero we know a face was rendered */
- if(poly_prev != GL_ZERO) glEnd();
-}
-
-static void emDM_drawFacesTex_common(DerivedMesh *dm,
- int (*drawParams)(MTFace *tface, int has_mcol, int matnr),
- int (*drawParamsMapped)(void *userData, int index),
- void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditMesh *em= emdm->em;
- float (*vertexCos)[3]= emdm->vertexCos;
- float (*vertexNos)[3]= emdm->vertexNos;
- EditFace *efa;
- int i;
-
- /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
- glShadeModel(GL_SMOOTH);
-
- if (vertexCos) {
- EditVert *eve;
-
- for (i=0,eve=em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
- for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
- MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
- unsigned char *cp= NULL;
- int drawSmooth= (efa->flag & ME_SMOOTH);
- int flag;
-
- if(drawParams)
- flag= drawParams(tf, (mcol != NULL), efa->mat_nr);
- else if(drawParamsMapped)
- flag= drawParamsMapped(userData, i);
- else
- flag= 1;
-
- if(flag != 0) { /* flag 0 == the face is hidden or invisible */
-
- /* we always want smooth here since otherwise vertex colors dont interpolate */
- if (mcol) {
- if (flag==1) {
- cp= (unsigned char*)mcol;
- }
- } else {
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- }
-
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- glNormal3fv(emdm->faceNos[i]);
-
- if(tf) glTexCoord2fv(tf->uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
-
- if(tf) glTexCoord2fv(tf->uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
-
- if(tf) glTexCoord2fv(tf->uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
-
- if(efa->v4) {
- if(tf) glTexCoord2fv(tf->uv[3]);
- if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- } else {
- if(tf) glTexCoord2fv(tf->uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
-
- if(tf) glTexCoord2fv(tf->uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
-
- if(tf) glTexCoord2fv(tf->uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
-
- if(efa->v4) {
- if(tf) glTexCoord2fv(tf->uv[3]);
- if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- }
- glEnd();
- }
- }
- } else {
- for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
- MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
- unsigned char *cp= NULL;
- int drawSmooth= (efa->flag & ME_SMOOTH);
- int flag;
-
- if(drawParams)
- flag= drawParams(tf, (mcol != NULL), efa->mat_nr);
- else if(drawParamsMapped)
- flag= drawParamsMapped(userData, i);
- else
- flag= 1;
-
- if(flag != 0) { /* flag 0 == the face is hidden or invisible */
- /* we always want smooth here since otherwise vertex colors dont interpolate */
- if (mcol) {
- if (flag==1) {
- cp= (unsigned char*)mcol;
- }
- } else {
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- }
-
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- glNormal3fv(efa->n);
-
- if(tf) glTexCoord2fv(tf->uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(efa->v1->co);
-
- if(tf) glTexCoord2fv(tf->uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(efa->v2->co);
-
- if(tf) glTexCoord2fv(tf->uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(efa->v3->co);
-
- if(efa->v4) {
- if(tf) glTexCoord2fv(tf->uv[3]);
- if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3fv(efa->v4->co);
- }
- } else {
- if(tf) glTexCoord2fv(tf->uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- glNormal3fv(efa->v1->no);
- glVertex3fv(efa->v1->co);
-
- if(tf) glTexCoord2fv(tf->uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- glNormal3fv(efa->v2->no);
- glVertex3fv(efa->v2->co);
-
- if(tf) glTexCoord2fv(tf->uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- glNormal3fv(efa->v3->no);
- glVertex3fv(efa->v3->co);
-
- if(efa->v4) {
- if(tf) glTexCoord2fv(tf->uv[3]);
- if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
- }
- }
- glEnd();
- }
- }
- }
-}
-
-static void emDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr))
-{
- emDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
-}
-
-static void emDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
-{
- emDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
-}
-
-static void emDM_drawMappedFacesGLSL(DerivedMesh *dm,
- int (*setMaterial)(int, void *attribs),
- int (*setDrawOptions)(void *userData, int index), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditMesh *em= emdm->em;
- float (*vertexCos)[3]= emdm->vertexCos;
- float (*vertexNos)[3]= emdm->vertexNos;
- EditVert *eve;
- EditFace *efa;
- DMVertexAttribs attribs= {{{0}}};
- GPUVertexAttribs gattribs;
- /* int tfoffset; */ /* UNUSED */
- int i, b, matnr, new_matnr, dodraw /* , layer */ /* UNUSED */;
-
- dodraw = 0;
- matnr = -1;
-
- /* layer = CustomData_get_layer_index(&em->fdata, CD_MTFACE); */ /* UNUSED */
- /* tfoffset = (layer == -1)? -1: em->fdata.layers[layer].offset; */ /* UNUSED */
-
- /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
- glShadeModel(GL_SMOOTH);
-
- for (i=0,eve=em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
-#define PASSATTRIB(efa, eve, vert) { \
- if(attribs.totorco) { \
- float *orco = attribs.orco.array[eve->tmp.l]; \
- glVertexAttrib3fvARB(attribs.orco.glIndex, orco); \
- } \
- for(b = 0; b < attribs.tottface; b++) { \
- MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
- glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]); \
- } \
- for(b = 0; b < attribs.totmcol; b++) { \
- MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset); \
- GLubyte col[4]; \
- col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a; \
- glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col); \
- } \
- if(attribs.tottang) { \
- float *tang = attribs.tang.array[i*4 + vert]; \
- glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
- } \
-}
-
- for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
- int drawSmooth= (efa->flag & ME_SMOOTH);
-
- if(setDrawOptions && !setDrawOptions(userData, i))
- continue;
-
- new_matnr = efa->mat_nr + 1;
- if(new_matnr != matnr) {
- dodraw = setMaterial(matnr = new_matnr, &gattribs);
- if(dodraw)
- DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
- }
-
- if(dodraw) {
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- if(vertexCos) glNormal3fv(emdm->faceNos[i]);
- else glNormal3fv(efa->n);
-
- PASSATTRIB(efa, efa->v1, 0);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- else glVertex3fv(efa->v1->co);
-
- PASSATTRIB(efa, efa->v2, 1);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- else glVertex3fv(efa->v2->co);
-
- PASSATTRIB(efa, efa->v3, 2);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- else glVertex3fv(efa->v3->co);
-
- if(efa->v4) {
- PASSATTRIB(efa, efa->v4, 3);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- else glVertex3fv(efa->v4->co);
- }
- } else {
- PASSATTRIB(efa, efa->v1, 0);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- }
- else {
- glNormal3fv(efa->v1->no);
- glVertex3fv(efa->v1->co);
- }
-
- PASSATTRIB(efa, efa->v2, 1);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- }
- else {
- glNormal3fv(efa->v2->no);
- glVertex3fv(efa->v2->co);
- }
-
- PASSATTRIB(efa, efa->v3, 2);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- }
- else {
- glNormal3fv(efa->v3->no);
- glVertex3fv(efa->v3->co);
- }
-
- if(efa->v4) {
- PASSATTRIB(efa, efa->v4, 3);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- else {
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
- }
- }
- }
- glEnd();
- }
- }
-#undef PASSATTRIB
-}
-
-static void emDM_drawFacesGLSL(DerivedMesh *dm,
- int (*setMaterial)(int, void *attribs))
-{
- dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
-}
-
-static void emDM_drawMappedFacesMat(DerivedMesh *dm,
- void (*setMaterial)(void *userData, int, void *attribs),
- int (*setFace)(void *userData, int index), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditMesh *em= emdm->em;
- float (*vertexCos)[3]= emdm->vertexCos;
- float (*vertexNos)[3]= emdm->vertexNos;
- EditVert *eve;
- EditFace *efa;
- DMVertexAttribs attribs= {{{0}}};
- GPUVertexAttribs gattribs;
- int i, b, matnr, new_matnr;
-
- matnr = -1;
-
- /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
- glShadeModel(GL_SMOOTH);
-
- for (i=0,eve=em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
-#define PASSATTRIB(efa, eve, vert) { \
- if(attribs.totorco) { \
- float *orco = attribs.orco.array[eve->tmp.l]; \
- if(attribs.orco.glTexco) \
- glTexCoord3fv(orco); \
- else \
- glVertexAttrib3fvARB(attribs.orco.glIndex, orco); \
- } \
- for(b = 0; b < attribs.tottface; b++) { \
- MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
- if(attribs.tface[b].glTexco) \
- glTexCoord2fv(_tf->uv[vert]); \
- else \
- glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]); \
- } \
- for(b = 0; b < attribs.totmcol; b++) { \
- MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset); \
- GLubyte col[4]; \
- col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a; \
- glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col); \
- } \
- if(attribs.tottang) { \
- float *tang = attribs.tang.array[i*4 + vert]; \
- glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
- } \
-}
-
- for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
- int drawSmooth= (efa->flag & ME_SMOOTH);
-
- /* face hiding */
- if(setFace && !setFace(userData, i))
- continue;
-
- /* material */
- new_matnr = efa->mat_nr + 1;
- if(new_matnr != matnr) {
- setMaterial(userData, matnr = new_matnr, &gattribs);
- DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
- }
-
- /* face */
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- if(vertexCos) glNormal3fv(emdm->faceNos[i]);
- else glNormal3fv(efa->n);
-
- PASSATTRIB(efa, efa->v1, 0);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- else glVertex3fv(efa->v1->co);
-
- PASSATTRIB(efa, efa->v2, 1);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- else glVertex3fv(efa->v2->co);
-
- PASSATTRIB(efa, efa->v3, 2);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- else glVertex3fv(efa->v3->co);
-
- if(efa->v4) {
- PASSATTRIB(efa, efa->v4, 3);
- if(vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- else glVertex3fv(efa->v4->co);
- }
- } else {
- PASSATTRIB(efa, efa->v1, 0);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
- }
- else {
- glNormal3fv(efa->v1->no);
- glVertex3fv(efa->v1->co);
- }
-
- PASSATTRIB(efa, efa->v2, 1);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
- }
- else {
- glNormal3fv(efa->v2->no);
- glVertex3fv(efa->v2->co);
- }
-
- PASSATTRIB(efa, efa->v3, 2);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
- }
- else {
- glNormal3fv(efa->v3->no);
- glVertex3fv(efa->v3->co);
- }
-
- if(efa->v4) {
- PASSATTRIB(efa, efa->v4, 3);
- if(vertexCos) {
- glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
- glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
- }
- else {
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
- }
- }
- }
- glEnd();
- }
-#undef PASSATTRIB
-}
-
-static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
- int i;
-
- if (emdm->em->verts.first) {
- for (i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) {
- if (emdm->vertexCos) {
- DO_MINMAX(emdm->vertexCos[i], min_r, max_r);
- } else {
- DO_MINMAX(eve->co, min_r, max_r);
- }
- }
- } else {
- min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
- }
-}
-static int emDM_getNumVerts(DerivedMesh *dm)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
-
- return BLI_countlist(&emdm->em->verts);
-}
-
-static int emDM_getNumEdges(DerivedMesh *dm)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
-
- return BLI_countlist(&emdm->em->edges);
-}
-
-static int emDM_getNumFaces(DerivedMesh *dm)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
-
- return BLI_countlist(&emdm->em->faces);
-}
-
-static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
- int i;
-
- for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
- if (emdm->vertexCos) {
- copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
- } else {
- copy_v3_v3(cos_r[i], eve->co);
- }
- }
-}
-
-static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
-{
- EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
- int i;
-
- for(i = 0; i < index; ++i) ev = ev->next;
-
- copy_v3_v3(vert_r->co, ev->co);
-
- normal_float_to_short_v3(vert_r->no, ev->no);
-
- /* TODO what to do with vert_r->flag? */
- vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
-}
-
-static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
-{
- EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
- EditEdge *ee = em->edges.first;
- EditVert *ev, *v1, *v2;
- int i;
-
- for(i = 0; i < index; ++i) ee = ee->next;
-
- edge_r->crease = (unsigned char) (ee->crease*255.0f);
- edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
- /* TODO what to do with edge_r->flag? */
- edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
- if (ee->seam) edge_r->flag |= ME_SEAM;
- if (ee->sharp) edge_r->flag |= ME_SHARP;
-#if 0
- /* this needs setup of f2 field */
- if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
-#endif
-
- /* goddamn, we have to search all verts to find indices */
- v1 = ee->v1;
- v2 = ee->v2;
- for(i = 0, ev = em->verts.first; v1 || v2; i++, ev = ev->next) {
- if(ev == v1) {
- edge_r->v1 = i;
- v1 = NULL;
- }
- if(ev == v2) {
- edge_r->v2 = i;
- v2 = NULL;
- }
- }
-}
-
-static void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
-{
- EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
- EditFace *ef = em->faces.first;
- EditVert *ev, *v1, *v2, *v3, *v4;
- int i;
-
- for(i = 0; i < index; ++i) ef = ef->next;
-
- face_r->mat_nr = ef->mat_nr;
- face_r->flag = ef->flag;
-
- /* goddamn, we have to search all verts to find indices */
- v1 = ef->v1;
- v2 = ef->v2;
- v3 = ef->v3;
- v4 = ef->v4;
- if(!v4) face_r->v4 = 0;
-
- for(i = 0, ev = em->verts.first; v1 || v2 || v3 || v4;
- i++, ev = ev->next) {
- if(ev == v1) {
- face_r->v1 = i;
- v1 = NULL;
- }
- if(ev == v2) {
- face_r->v2 = i;
- v2 = NULL;
- }
- if(ev == v3) {
- face_r->v3 = i;
- v3 = NULL;
- }
- if(ev == v4) {
- face_r->v4 = i;
- v4 = NULL;
- }
- }
-
- test_index_face(face_r, NULL, 0, ef->v4?4:3);
-}
-
-static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *ev = emdm->em->verts.first;
- int i;
-
- for(i=0; ev; ev = ev->next, ++vert_r, ++i) {
- if(emdm->vertexCos)
- copy_v3_v3(vert_r->co, emdm->vertexCos[i]);
- else
- copy_v3_v3(vert_r->co, ev->co);
-
- normal_float_to_short_v3(vert_r->no, ev->no);
-
- /* TODO what to do with vert_r->flag? */
- vert_r->flag = 0;
- vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
- }
-}
-
-static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
-{
- EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
- EditEdge *ee = em->edges.first;
- EditVert *ev;
- int i;
-
- /* store vertex indices in tmp union */
- for(ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
- ev->tmp.l = (intptr_t) i;
-
- for( ; ee; ee = ee->next, ++edge_r) {
- edge_r->crease = (unsigned char) (ee->crease*255.0f);
- edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
- /* TODO what to do with edge_r->flag? */
- edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
- if (ee->seam) edge_r->flag |= ME_SEAM;
- if (ee->sharp) edge_r->flag |= ME_SHARP;
-#if 0
- /* this needs setup of f2 field */
- if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
-#endif
-
- edge_r->v1 = (int)ee->v1->tmp.l;
- edge_r->v2 = (int)ee->v2->tmp.l;
- }
-}
-
-static void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
-{
- EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
- EditFace *ef = em->faces.first;
- EditVert *ev;
- int i;
-
- /* store vertexes indices in tmp union */
- for(ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
- ev->tmp.l = (intptr_t) i;
-
- for( ; ef; ef = ef->next, ++face_r) {
- face_r->mat_nr = ef->mat_nr;
- face_r->flag = ef->flag;
-
- face_r->v1 = (int)ef->v1->tmp.l;
- face_r->v2 = (int)ef->v2->tmp.l;
- face_r->v3 = (int)ef->v3->tmp.l;
- if(ef->v4) face_r->v4 = (int)ef->v4->tmp.l;
- else face_r->v4 = 0;
-
- test_index_face(face_r, NULL, 0, ef->v4?4:3);
- }
-}
-
-static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditMesh *em= emdm->em;
- EditFace *efa;
- char *data, *emdata;
- void *datalayer;
- int index, size;
-
- datalayer = DM_get_face_data_layer(dm, type);
- if(datalayer)
- return datalayer;
-
- /* layers are store per face for editmesh, we convert to a temporary
- * data layer array in the derivedmesh when these are requested */
- if(type == CD_MTFACE || type == CD_MCOL) {
- index = CustomData_get_layer_index(&em->fdata, type);
-
- if(index != -1) {
- /* int offset = em->fdata.layers[index].offset; */ /* UNUSED */
- size = CustomData_sizeof(type);
-
- DM_add_face_layer(dm, type, CD_CALLOC, NULL);
- index = CustomData_get_layer_index(&dm->faceData, type);
- dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
-
- data = datalayer = DM_get_face_data_layer(dm, type);
- for(efa=em->faces.first; efa; efa=efa->next, data+=size) {
- emdata = CustomData_em_get(&em->fdata, efa->data, type);
- memcpy(data, emdata, size);
- }
- }
- }
-
- return datalayer;
-}
-
-static void emDM_release(DerivedMesh *dm)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
-
- if (DM_release(dm)) {
- if (emdm->vertexCos) {
- MEM_freeN(emdm->vertexCos);
- MEM_freeN(emdm->vertexNos);
- MEM_freeN(emdm->faceNos);
- }
-
- MEM_freeN(emdm);
- }
-}
-
-DerivedMesh *editmesh_get_derived(EditMesh *em, float (*vertexCos)[3])
-{
- EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm");
-
- DM_init(&emdm->dm, DM_TYPE_EDITMESH, BLI_countlist(&em->verts),
- BLI_countlist(&em->edges), BLI_countlist(&em->faces));
-
- emdm->dm.getMinMax = emDM_getMinMax;
-
- emdm->dm.getNumVerts = emDM_getNumVerts;
- emdm->dm.getNumEdges = emDM_getNumEdges;
- emdm->dm.getNumFaces = emDM_getNumFaces;
-
- emdm->dm.getVertCos = emDM_getVertCos;
-
- emdm->dm.getVert = emDM_getVert;
- emdm->dm.getEdge = emDM_getEdge;
- emdm->dm.getFace = emDM_getFace;
- emdm->dm.copyVertArray = emDM_copyVertArray;
- emdm->dm.copyEdgeArray = emDM_copyEdgeArray;
- emdm->dm.copyFaceArray = emDM_copyFaceArray;
- emdm->dm.getFaceDataArray = emDM_getFaceDataArray;
-
- emdm->dm.foreachMappedVert = emDM_foreachMappedVert;
- emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
- emdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
-
- emdm->dm.drawEdges = emDM_drawEdges;
- emdm->dm.drawMappedEdges = emDM_drawMappedEdges;
- emdm->dm.drawMappedEdgesInterp = emDM_drawMappedEdgesInterp;
- emdm->dm.drawMappedFaces = emDM_drawMappedFaces;
- emdm->dm.drawMappedFacesTex = emDM_drawMappedFacesTex;
- emdm->dm.drawMappedFacesGLSL = emDM_drawMappedFacesGLSL;
- emdm->dm.drawFacesTex = emDM_drawFacesTex;
- emdm->dm.drawFacesGLSL = emDM_drawFacesGLSL;
- emdm->dm.drawMappedFacesMat = emDM_drawMappedFacesMat;
- emdm->dm.drawUVEdges = emDM_drawUVEdges;
-
- emdm->dm.release = emDM_release;
-
- emdm->em = em;
- emdm->vertexCos = vertexCos;
-
- if(CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
- EditVert *eve;
- int i;
-
- DM_add_vert_layer(&emdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
-
- for(eve = em->verts.first, i = 0; eve; eve = eve->next, ++i)
- DM_set_vert_data(&emdm->dm, i, CD_MDEFORMVERT,
- CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT));
- }
-
- if(vertexCos) {
- EditVert *eve;
- EditFace *efa;
- int totface = BLI_countlist(&em->faces);
- int i;
-
- for (i=0,eve=em->verts.first; eve; eve= eve->next)
- eve->tmp.l = (intptr_t) i++;
-
- emdm->vertexNos = MEM_callocN(sizeof(*emdm->vertexNos)*i, "emdm_vno");
- emdm->faceNos = MEM_mallocN(sizeof(*emdm->faceNos)*totface, "emdm_vno");
-
- for(i=0, efa= em->faces.first; efa; i++, efa=efa->next) {
- float *v1 = vertexCos[(int) efa->v1->tmp.l];
- float *v2 = vertexCos[(int) efa->v2->tmp.l];
- float *v3 = vertexCos[(int) efa->v3->tmp.l];
- float *no = emdm->faceNos[i];
-
- if(efa->v4) {
- float *v4 = vertexCos[(int) efa->v4->tmp.l];
-
- normal_quad_v3( no,v1, v2, v3, v4);
- add_v3_v3(emdm->vertexNos[(int) efa->v4->tmp.l], no);
- }
- else {
- normal_tri_v3( no,v1, v2, v3);
- }
-
- add_v3_v3(emdm->vertexNos[(int) efa->v1->tmp.l], no);
- add_v3_v3(emdm->vertexNos[(int) efa->v2->tmp.l], no);
- add_v3_v3(emdm->vertexNos[(int) efa->v3->tmp.l], no);
- }
-
- for(i=0, eve= em->verts.first; eve; i++, eve=eve->next) {
- float *no = emdm->vertexNos[i];
- /* following Mesh convention; we use vertex coordinate itself
- * for normal in this case */
- if (normalize_v3(no) == 0.0f) {
- normalize_v3_v3(no, vertexCos[i]);
- }
- }
- }
-
- return (DerivedMesh*) emdm;
-}
-
-/***/
-
DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, ModifierData *md)
{
Mesh *me = ob->data;
@@ -1799,75 +627,87 @@ void weight_to_rgb(float r_rgb[3], const float weight)
r_rgb[1]= blend * (1.0f-((weight-0.75f)*4.0f));
r_rgb[2]= 0.0f;
}
+ else {
+ /* exceptional value, unclamped or nan,
+ * avoid uninitialized memory use */
+ r_rgb[0]= 1.0f;
+ r_rgb[1]= 0.0f;
+ r_rgb[2]= 1.0f;
+ }
}
/* draw_flag's for calc_weightpaint_vert_color */
enum {
CALC_WP_MULTIPAINT= (1<<0),
- CALC_WP_AUTO_NORMALIZE= (1<<1),
+ CALC_WP_AUTO_NORMALIZE= (1<<1)
};
-static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col, char *dg_flags, int selected, int UNUSED(unselected), const int draw_flag)
+static void weightpaint_color(unsigned char r_col[4], ColorBand *coba, const float input)
{
- Mesh *me = ob->data;
- float colf[4], input = 0.0f;
- int i;
+ float colf[4];
+
+ if(coba) do_colorband(coba, input, colf);
+ else weight_to_rgb(colf, input);
+
+ r_col[3] = (unsigned char)(colf[0] * 255.0f);
+ r_col[2] = (unsigned char)(colf[1] * 255.0f);
+ r_col[1] = (unsigned char)(colf[2] * 255.0f);
+ r_col[0] = 255;
+}
+
+static void calc_weightpaint_vert_color(
+ unsigned char r_col[4],
+ MDeformVert *dv, ColorBand *coba,
+ const int defbase_tot, const int defbase_act,
+ const char *dg_flags,
+ const int selected, const int draw_flag)
+{
+ float input = 0.0f;
int make_black= FALSE;
- if (me->dvert) {
- if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) {
-
- int was_a_nonzero= FALSE;
- for (i=0; i<me->dvert[vert].totweight; i++) {
- /* in multipaint, get the average if auto normalize is inactive
- * get the sum if it is active */
- if(dg_flags[me->dvert[vert].dw[i].def_nr]) {
- if(me->dvert[vert].dw[i].weight) {
- input+= me->dvert[vert].dw[i].weight;
+ if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) {
+ int was_a_nonzero= FALSE;
+ unsigned int i;
+
+ MDeformWeight *dw= dv->dw;
+ for (i = dv->totweight; i != 0; i--, dw++) {
+ /* in multipaint, get the average if auto normalize is inactive
+ * get the sum if it is active */
+ if (dw->def_nr < defbase_tot) {
+ if (dg_flags[dw->def_nr]) {
+ if (dw->weight) {
+ input += dw->weight;
was_a_nonzero= TRUE;
}
}
}
+ }
- /* make it black if the selected groups have no weight on a vertex */
- if(was_a_nonzero == FALSE) {
- make_black = TRUE;
- }
- else if ((draw_flag & CALC_WP_AUTO_NORMALIZE) == FALSE) {
- input /= selected; /* get the average */
- }
+ /* make it black if the selected groups have no weight on a vertex */
+ if (was_a_nonzero == FALSE) {
+ make_black = TRUE;
}
- else {
- /* default, non tricky behavior */
- for (i=0; i<me->dvert[vert].totweight; i++) {
- if (me->dvert[vert].dw[i].def_nr==ob->actdef-1) {
- input+=me->dvert[vert].dw[i].weight;
- }
- }
+ else if ((draw_flag & CALC_WP_AUTO_NORMALIZE) == FALSE) {
+ input /= selected; /* get the average */
}
}
-
- if (make_black) {
- col[3] = 0;
- col[2] = 0;
- col[1] = 0;
- col[0] = 255;
- return;
+ else {
+ /* default, non tricky behavior */
+ input= defvert_find_weight(dv, defbase_act);
}
- CLAMP(input, 0.0f, 1.0f);
-
- if(coba)
- do_colorband(coba, input, colf);
- else
- weight_to_rgb(colf, input);
-
- col[3] = (unsigned char)(colf[0] * 255.0f);
- col[2] = (unsigned char)(colf[1] * 255.0f);
- col[1] = (unsigned char)(colf[2] * 255.0f);
- col[0] = 255;
+ if (make_black) { /* TODO, theme color */
+ r_col[3] = 0;
+ r_col[2] = 0;
+ r_col[1] = 0;
+ r_col[0] = 255;
+ }
+ else {
+ CLAMP(input, 0.0f, 1.0f);
+ weightpaint_color(r_col, coba, input);
+ }
}
static ColorBand *stored_cb= NULL;
@@ -1877,33 +717,65 @@ void vDM_ColorBand_store(ColorBand *coba)
stored_cb= coba;
}
+/* return an array of vertex weight colors, caller must free.
+ *
+ * note that we could save some memory and allocate RGB only but then we'd need to
+ * re-arrange the colors when copying to the face since MCol has odd ordering,
+ * so leave this as is - campbell */
+static unsigned char *calc_weightpaint_vert_array(Object *ob, int const draw_flag, ColorBand *coba)
+{
+ Mesh *me = ob->data;
+ unsigned char *wtcol_v = MEM_mallocN (sizeof(unsigned char) * me->totvert * 4, "weightmap_v");
+
+ if (me->dvert) {
+ unsigned char *wc = wtcol_v;
+ MDeformVert *dv= me->dvert;
+ unsigned int i;
+
+ /* varisbles for multipaint */
+ const int defbase_tot = BLI_countlist(&ob->defbase);
+ const int defbase_act = ob->actdef-1;
+ char *dg_flags = MEM_mallocN(defbase_tot * sizeof(char), __func__);
+ const int selected = get_selected_defgroups(ob, dg_flags, defbase_tot);
+ /* const int unselected = defbase_tot - selected; */ /* UNUSED */
+
+ for (i = me->totvert; i != 0; i--, wc += 4, dv++) {
+ calc_weightpaint_vert_color(wc, dv, coba, defbase_tot, defbase_act, dg_flags, selected, draw_flag);
+ }
+
+ MEM_freeN(dg_flags);
+ }
+ else {
+ int col_i;
+ weightpaint_color((unsigned char *)&col_i, coba, 0.0f);
+ fill_vn_i((int *)wtcol_v, me->totvert, col_i);
+ }
+
+ return wtcol_v;
+}
+
static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm, int const draw_flag)
{
+ ColorBand *coba= stored_cb; /* warning, not a local var */
+
Mesh *me = ob->data;
+ unsigned char *wtcol_v = calc_weightpaint_vert_array(ob, draw_flag, coba);
+ unsigned char *wtcol_f = MEM_mallocN (sizeof(unsigned char) * me->totface*4*4, "weightmap_f");
+
MFace *mf = me->mface;
- ColorBand *coba= stored_cb; /* warning, not a local var */
- unsigned char *wtcol;
int i;
-
- int defbase_len = BLI_countlist(&ob->defbase);
- char *defbase_sel = MEM_mallocN(defbase_len * sizeof(char), __func__);
- int selected = get_selected_defgroups(ob, defbase_sel, defbase_len);
- int unselected = defbase_len - selected;
- wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, "weightmap");
-
- memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
for (i=0; i<me->totface; i++, mf++) {
- calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4], defbase_sel, selected, unselected, draw_flag);
- calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4], defbase_sel, selected, unselected, draw_flag);
- calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4], defbase_sel, selected, unselected, draw_flag);
- if (mf->v4)
- calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4], defbase_sel, selected, unselected, draw_flag);
+ unsigned int fidx= mf->v4 ? 3:2;
+ do {
+ copy_v4_v4_char((char *)&wtcol_f[(4 * i + fidx) * 4],
+ (char *)&wtcol_v[4 * (*(&mf->v1 + fidx))]);
+ } while (fidx--);
}
-
- MEM_freeN(defbase_sel);
- CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, dm->numFaceData);
+ MEM_freeN(wtcol_v);
+
+ CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol_f, dm->numFaceData);
}
/* new value for useDeform -1 (hack for the gameengine):
@@ -2996,6 +1868,159 @@ void DM_add_tangent_layer(DerivedMesh *dm)
MEM_freeN(vtangents);
}
+void DM_calc_auto_bump_scale(DerivedMesh *dm)
+{
+ /* int totvert= dm->getNumVerts(dm); */ /* UNUSED */
+ int totface= dm->getNumFaces(dm);
+
+ MVert * mvert = dm->getVertArray(dm);
+ MFace * mface = dm->getFaceArray(dm);
+ MTFace * mtface = dm->getFaceDataArray(dm, CD_MTFACE);
+
+ if(mtface)
+ {
+ double dsum = 0.0;
+ int nr_accumulated = 0;
+ int f;
+
+ for ( f=0; f<totface; f++ )
+ {
+ {
+ float * verts[4], * tex_coords[4];
+ const int nr_verts = mface[f].v4!=0 ? 4 : 3;
+ int i, is_degenerate;
+
+ verts[0]=mvert[mface[f].v1].co; verts[1]=mvert[mface[f].v2].co; verts[2]=mvert[mface[f].v3].co;
+ tex_coords[0]=mtface[f].uv[0]; tex_coords[1]=mtface[f].uv[1]; tex_coords[2]=mtface[f].uv[2];
+ if(nr_verts==4)
+ {
+ verts[3]=mvert[mface[f].v4].co;
+ tex_coords[3]=mtface[f].uv[3];
+ }
+
+ // discard degenerate faces
+ is_degenerate = 0;
+ if( equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
+ equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]) )
+ {
+ is_degenerate = 1;
+ }
+
+ // verify last vertex as well if this is a quad
+ if ( is_degenerate==0 && nr_verts==4 )
+ {
+ if( equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
+ equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]) )
+ {
+ is_degenerate = 1;
+ }
+
+ // verify the winding is consistent
+ if ( is_degenerate==0 )
+ {
+ float prev_edge[2];
+ int is_signed = 0;
+ sub_v2_v2v2(prev_edge, tex_coords[0], tex_coords[3]);
+
+ i = 0;
+ while ( is_degenerate==0 && i<4 )
+ {
+ float cur_edge[2], signed_area;
+ sub_v2_v2v2(cur_edge, tex_coords[(i+1)&0x3], tex_coords[i]);
+ signed_area = prev_edge[0]*cur_edge[1] - prev_edge[1]*cur_edge[0];
+ if ( i==0 ) is_signed = signed_area<0.0f ? 1 : 0;
+ else if((is_signed!=0)!=(signed_area<0.0f)) is_degenerate=1;
+
+ if ( is_degenerate==0 )
+ {
+ copy_v2_v2(prev_edge, cur_edge);
+ ++i;
+ }
+ }
+ }
+ }
+
+ // proceed if not a degenerate face
+ if ( is_degenerate==0 )
+ {
+ int nr_tris_to_pile=0;
+ // quads split at shortest diagonal
+ int offs = 0; // initial triangulation is 0,1,2 and 0, 2, 3
+ if ( nr_verts==4 )
+ {
+ float pos_len_diag0, pos_len_diag1;
+ float vtmp[3];
+ sub_v3_v3v3(vtmp, verts[2], verts[0]);
+ pos_len_diag0 = dot_v3v3(vtmp, vtmp);
+ sub_v3_v3v3(vtmp, verts[3], verts[1]);
+ pos_len_diag1 = dot_v3v3(vtmp, vtmp);
+
+ if(pos_len_diag1<pos_len_diag0)
+ offs=1; // alter split
+ else if(pos_len_diag0==pos_len_diag1) // do UV check instead
+ {
+ float tex_len_diag0, tex_len_diag1;
+
+ sub_v2_v2v2(vtmp, tex_coords[2], tex_coords[0]);
+ tex_len_diag0 = dot_v2v2(vtmp, vtmp);
+ sub_v2_v2v2(vtmp, tex_coords[3], tex_coords[1]);
+ tex_len_diag1 = dot_v2v2(vtmp, vtmp);
+
+ if(tex_len_diag1<tex_len_diag0)
+ {
+ offs=1; // alter split
+ }
+ }
+ }
+ nr_tris_to_pile = nr_verts-2 ;
+ if ( nr_tris_to_pile==1 || nr_tris_to_pile==2 )
+ {
+ const int indices[] = {offs+0, offs+1, offs+2, offs+0, offs+2, (offs+3)&0x3 };
+ int t;
+ for ( t=0; t<nr_tris_to_pile; t++ )
+ {
+ float f2x_area_uv;
+ float * p0 = verts[indices[t*3+0]];
+ float * p1 = verts[indices[t*3+1]];
+ float * p2 = verts[indices[t*3+2]];
+
+ float edge_t0[2], edge_t1[2];
+ sub_v2_v2v2(edge_t0, tex_coords[indices[t*3+1]], tex_coords[indices[t*3+0]]);
+ sub_v2_v2v2(edge_t1, tex_coords[indices[t*3+2]], tex_coords[indices[t*3+0]]);
+
+ f2x_area_uv = fabsf(edge_t0[0]*edge_t1[1] - edge_t0[1]*edge_t1[0]);
+ if ( f2x_area_uv>FLT_EPSILON )
+ {
+ float norm[3], v0[3], v1[3], f2x_surf_area, fsurf_ratio;
+ sub_v3_v3v3(v0, p1, p0);
+ sub_v3_v3v3(v1, p2, p0);
+ cross_v3_v3v3(norm, v0, v1);
+
+ f2x_surf_area = len_v3(norm);
+ fsurf_ratio = f2x_surf_area/f2x_area_uv; // tri area divided by texture area
+
+ ++nr_accumulated;
+ dsum += (double)(fsurf_ratio);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // finalize
+ {
+ const float avg_area_ratio = (nr_accumulated>0) ? ((float)(dsum / nr_accumulated)) : 1.0f;
+ const float use_as_render_bump_scale = sqrtf(avg_area_ratio); // use width of average surface ratio as your bump scale
+ dm->auto_bump_scale = use_as_render_bump_scale;
+ }
+ }
+ else
+ {
+ dm->auto_bump_scale = 1.0f;
+ }
+}
+
void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, DMVertexAttribs *attribs)
{
CustomData *vdata, *fdata, *tfdata = NULL;
@@ -3011,11 +2036,15 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
/* ugly hack, editmesh derivedmesh doesn't copy face data, this way we
* can use offsets instead */
- if(dm->release == emDM_release)
+ if(dm->type == DM_TYPE_EDITMESH)
tfdata = &((EditMeshDerivedMesh*)dm)->em->fdata;
else
tfdata = fdata;
+ /* calc auto bump scale if necessary */
+ if(dm->auto_bump_scale<=0.0f)
+ DM_calc_auto_bump_scale(dm);
+
/* add a tangent layer if necessary */
for(b = 0; b < gattribs->totlayer; b++)
if(gattribs->layer[b].type == CD_TANGENT)
@@ -3168,9 +2197,14 @@ static void navmesh_drawColored(DerivedMesh *dm)
glEnable(GL_LIGHTING);
}
-static void navmesh_DM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr))
+static void navmesh_DM_drawFacesTex(DerivedMesh *dm,
+ int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
{
(void) setDrawOptions;
+ (void) compareDrawOptions;
+ (void) userData;
navmesh_drawColored(dm);
}
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 0cd8845c53b..89bad72044e 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -726,10 +726,10 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i
if(!is_zero_v3(group->dupli_ofs)) {
copy_m4_m4(tmat, go->ob->obmat);
sub_v3_v3v3(tmat[3], tmat[3], group->dupli_ofs);
- mul_m4_m4m4(mat, tmat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, tmat);
}
else {
- mul_m4_m4m4(mat, go->ob->obmat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, go->ob->obmat);
}
dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP, animated);
@@ -955,7 +955,7 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl
when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
*/
if(par_space_mat)
- mul_m4_m4m4(vdd.obmat, ob->obmat, par_space_mat);
+ mult_m4_m4m4(vdd.obmat, par_space_mat, ob->obmat);
else
copy_m4_m4(vdd.obmat, ob->obmat);
@@ -1084,7 +1084,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa
when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
*/
if(par_space_mat)
- mul_m4_m4m4(ob__obmat, ob->obmat, par_space_mat);
+ mult_m4_m4m4(ob__obmat, par_space_mat, ob->obmat);
else
copy_m4_m4(ob__obmat, ob->obmat);
@@ -1143,21 +1143,17 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa
madd_v3_v3v3fl(dob->orco, dob->orco, orco[mv1], w);
madd_v3_v3v3fl(dob->orco, dob->orco, orco[mv2], w);
madd_v3_v3v3fl(dob->orco, dob->orco, orco[mv3], w);
- if(mv4)
+ if (mv4) {
madd_v3_v3v3fl(dob->orco, dob->orco, orco[mv4], w);
+ }
}
if(mtface) {
- dob->uv[0] += w*mtface[a].uv[0][0];
- dob->uv[1] += w*mtface[a].uv[0][1];
- dob->uv[0] += w*mtface[a].uv[1][0];
- dob->uv[1] += w*mtface[a].uv[1][1];
- dob->uv[0] += w*mtface[a].uv[2][0];
- dob->uv[1] += w*mtface[a].uv[2][1];
-
- if(mv4) {
- dob->uv[0] += w*mtface[a].uv[3][0];
- dob->uv[1] += w*mtface[a].uv[3][1];
+ madd_v2_v2v2fl(dob->uv, dob->uv, mtface[a].uv[0], w);
+ madd_v2_v2v2fl(dob->uv, dob->uv, mtface[a].uv[1], w);
+ madd_v2_v2v2fl(dob->uv, dob->uv, mtface[a].uv[2], w);
+ if (mv4) {
+ madd_v2_v2v2fl(dob->uv, dob->uv, mtface[a].uv[3], w);
}
}
}
@@ -1396,15 +1392,15 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
if(!is_zero_v3(part->dup_group->dupli_ofs)) {
copy_m4_m4(tmat, oblist[b]->obmat);
sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs);
- mul_m4_m4m4(tmat, tmat, pamat);
+ mult_m4_m4m4(tmat, pamat, tmat);
}
else {
- mul_m4_m4m4(tmat, oblist[b]->obmat, pamat);
+ mult_m4_m4m4(tmat, pamat, oblist[b]->obmat);
}
mul_mat3_m4_fl(tmat, size*scale);
if(par_space_mat)
- mul_m4_m4m4(mat, tmat, par_space_mat);
+ mult_m4_m4m4(mat, par_space_mat, tmat);
else
copy_m4_m4(mat, tmat);
@@ -1435,15 +1431,15 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
* remove the real emitter's transformation before 2nd order duplication.
*/
if(par_space_mat && GS(id->name) != ID_GR)
- mul_m4_m4m4(mat, pamat, psys->imat);
+ mult_m4_m4m4(mat, psys->imat, pamat);
else
copy_m4_m4(mat, pamat);
- mul_m4_m4m4(tmat, obmat, mat);
+ mult_m4_m4m4(tmat, mat, obmat);
mul_mat3_m4_fl(tmat, size*scale);
if(par_space_mat)
- mul_m4_m4m4(mat, tmat, par_space_mat);
+ mult_m4_m4m4(mat, par_space_mat, tmat);
else
copy_m4_m4(mat, tmat);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 2157bd5999b..ae04b7760c2 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -505,9 +505,9 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
if(prev->bone->segments==1) {
/* find the previous roll to interpolate */
if(rest)
- mul_m4_m4m4(difmat, prev->bone->arm_mat, imat);
+ mult_m4_m4m4(difmat, imat, prev->bone->arm_mat);
else
- mul_m4_m4m4(difmat, prev->pose_mat, imat);
+ mult_m4_m4m4(difmat, imat, prev->pose_mat);
copy_m3_m4(result, difmat); // the desired rotation at beginning of next bone
vec_roll_to_mat3(h1, 0.0f, mat3); // the result of vec_roll without roll
@@ -538,9 +538,9 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
/* find the next roll to interpolate as well */
if(rest)
- mul_m4_m4m4(difmat, next->bone->arm_mat, imat);
+ mult_m4_m4m4(difmat, imat, next->bone->arm_mat);
else
- mul_m4_m4m4(difmat, next->pose_mat, imat);
+ mult_m4_m4m4(difmat, imat, next->pose_mat);
copy_m3_m4(result, difmat); // the desired rotation at beginning of next bone
vec_roll_to_mat3(h2, 0.0f, mat3); // the result of vec_roll without roll
@@ -827,7 +827,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
const short use_envelope = deformflag & ARM_DEF_ENVELOPE;
const short use_quaternion = deformflag & ARM_DEF_QUATERNION;
const short invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
- int numGroups = 0; /* safety for vertexgroup index overflow */
+ int defbase_tot = 0; /* safety for vertexgroup index overflow */
int i, target_totvert = 0; /* safety for vertexgroup overflow */
int use_dverts = 0;
int armature_def_nr;
@@ -837,7 +837,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
invert_m4_m4(obinv, target->obmat);
copy_m4_m4(premat, target->obmat);
- mul_m4_m4m4(postmat, armOb->obmat, obinv);
+ mult_m4_m4m4(postmat, obinv, armOb->obmat);
invert_m4_m4(premat, postmat);
/* bone defmats are already in the channels, chan_mat */
@@ -869,7 +869,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
armature_def_nr= defgroup_name_index(target, defgrp_name);
if(ELEM(target->type, OB_MESH, OB_LATTICE)) {
- numGroups = BLI_countlist(&target->defbase);
+ defbase_tot = BLI_countlist(&target->defbase);
if(target->type==OB_MESH) {
Mesh *me= target->data;
@@ -896,8 +896,8 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
else if(dverts) use_dverts = 1;
if(use_dverts) {
- defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups, "defnrToBone");
- defnrToPCIndex = MEM_callocN(sizeof(*defnrToPCIndex) * numGroups, "defnrToIndex");
+ defnrToPC = MEM_callocN(sizeof(*defnrToPC) * defbase_tot, "defnrToBone");
+ defnrToPCIndex = MEM_callocN(sizeof(*defnrToPCIndex) * defbase_tot, "defnrToIndex");
for(i = 0, dg = target->defbase.first; dg;
i++, dg = dg->next) {
defnrToPC[i] = get_pose_channel(armOb->pose, dg->name);
@@ -924,7 +924,6 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
float contrib = 0.0f;
float armature_weight = 1.0f; /* default to 1 if no overall def group */
float prevco_weight = 1.0f; /* weight for optional cached vertexcos */
- int j;
if(use_quaternion) {
memset(&sumdq, 0, sizeof(DualQuat));
@@ -971,12 +970,14 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
mul_m4_v3(premat, co);
if(use_dverts && dvert && dvert->totweight) { // use weight groups ?
+ MDeformWeight *dw= dvert->dw;
int deformed = 0;
+ unsigned int j;
- for(j = 0; j < dvert->totweight; j++){
- int index = dvert->dw[j].def_nr;
- if(index < numGroups && (pchan= defnrToPC[index])) {
- float weight = dvert->dw[j].weight;
+ for (j= dvert->totweight; j != 0; j--, dw++) {
+ const int index = dw->def_nr;
+ if(index < defbase_tot && (pchan= defnrToPC[index])) {
+ float weight = dw->weight;
Bone *bone= pchan->bone;
pdef_info= pdef_info_array + defnrToPCIndex[index];
@@ -1102,7 +1103,7 @@ void armature_mat_world_to_pose(Object *ob, float inmat[][4], float outmat[][4])
invert_m4_m4(obmat, ob->obmat);
/* multiply given matrix by object's-inverse to find pose-space matrix */
- mul_m4_m4m4(outmat, obmat, inmat);
+ mult_m4_m4m4(outmat, inmat, obmat);
}
/* Convert Wolrd-Space Location to Pose-Space Location
@@ -1173,7 +1174,7 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
* This should leave behind the effects of restpose +
* parenting + constraints
*/
- mul_m4_m4m4(pc_posemat, inv_trans, pose_mat);
+ mult_m4_m4m4(pc_posemat, pose_mat, inv_trans);
/* get the inverse of the leftovers so that we can remove
* that component from the supplied matrix
@@ -1181,7 +1182,7 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
invert_m4_m4(inv_posemat, pc_posemat);
/* get the new matrix */
- mul_m4_m4m4(outmat, inmat, inv_posemat);
+ mult_m4_m4m4(outmat, inv_posemat, inmat);
}
/* Convert Pose-Space Location to Bone-Space Location
@@ -1236,7 +1237,7 @@ void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float
float imat[4][4];
invert_m4_m4(imat, arm_mat);
- mul_m4_m4m4(delta_mat, pose_mat, imat);
+ mult_m4_m4m4(delta_mat, imat, pose_mat);
}
/* **************** Rotation Mode Conversions ****************************** */
@@ -1409,7 +1410,7 @@ void where_is_armature_bone(Bone *bone, Bone *prevbone)
offs_bone[3][1]+= prevbone->length;
/* Compose the matrix for this bone */
- mul_m4_m4m4(bone->arm_mat, offs_bone, prevbone->arm_mat);
+ mult_m4_m4m4(bone->arm_mat, prevbone->arm_mat, offs_bone);
}
else {
copy_m4_m3(bone->arm_mat, bone->bone_mat);
@@ -2120,6 +2121,8 @@ void pchan_calc_mat(bPoseChannel *pchan)
pchan_to_mat4(pchan, pchan->chan_mat);
}
+#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
+
/* NLA strip modifiers */
static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseChannel *pchan)
{
@@ -2242,6 +2245,8 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
}
}
+#endif
+
/* calculate tail of posechannel */
void where_is_pose_bone_tail(bPoseChannel *pchan)
{
@@ -2305,7 +2310,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
/* extract the scale of the parent matrix */
mat4_to_size(tscale, parchan->pose_mat);
size_to_mat4(tsmat, tscale);
- mul_m4_m4m4(tmat, tmat, tsmat);
+ mult_m4_m4m4(tmat, tsmat, tmat);
mul_serie_m4(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
@@ -2339,7 +2344,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
}
}
else {
- mul_m4_m4m4(pchan->pose_mat, pchan->chan_mat, bone->arm_mat);
+ mult_m4_m4m4(pchan->pose_mat, bone->arm_mat, pchan->chan_mat);
/* optional location without arm_mat rotation */
if(bone->flag & BONE_NO_LOCAL_LOCATION)
@@ -2351,9 +2356,12 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
}
if(do_extra) {
+
+#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
/* do NLA strip modifiers - i.e. curve follow */
do_strip_modifiers(scene, ob, bone, pchan);
-
+#endif
+
/* Do constraints */
if (pchan->constraints.first) {
bConstraintOb *cob;
@@ -2458,7 +2466,7 @@ void where_is_pose (Scene *scene, Object *ob)
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone) {
invert_m4_m4(imat, pchan->bone->arm_mat);
- mul_m4_m4m4(pchan->chan_mat, imat, pchan->pose_mat);
+ mult_m4_m4m4(pchan->chan_mat, pchan->pose_mat, imat);
}
}
}
@@ -2466,7 +2474,7 @@ void where_is_pose (Scene *scene, Object *ob)
/* Returns total selected vgroups,
* wpi.defbase_sel is assumed malloc'd, all values are set */
-int get_selected_defgroups(Object *ob, char *dg_selection, int defbase_len)
+int get_selected_defgroups(Object *ob, char *dg_selection, int defbase_tot)
{
bDeformGroup *defgroup;
unsigned int i;
@@ -2475,7 +2483,7 @@ int get_selected_defgroups(Object *ob, char *dg_selection, int defbase_len)
if(armob) {
bPose *pose= armob->pose;
- for (i= 0, defgroup= ob->defbase.first; i < defbase_len && defgroup; defgroup = defgroup->next, i++) {
+ for (i= 0, defgroup= ob->defbase.first; i < defbase_tot && defgroup; defgroup = defgroup->next, i++) {
bPoseChannel *pchan= get_pose_channel(pose, defgroup->name);
if(pchan && (pchan->bone->flag & BONE_SELECTED)) {
dg_selection[i]= TRUE;
@@ -2487,7 +2495,7 @@ int get_selected_defgroups(Object *ob, char *dg_selection, int defbase_len)
}
}
else {
- memset(dg_selection, FALSE, sizeof(char) * defbase_len);
+ memset(dg_selection, FALSE, sizeof(char) * defbase_tot);
}
return dg_flags_sel_tot;
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index 6656d06e72e..ec2e6b3c078 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -1514,7 +1514,8 @@ BoidState *boid_new_state(BoidSettings *boids)
return state;
}
-BoidState *boid_duplicate_state(BoidSettings *boids, BoidState *state) {
+BoidState *boid_duplicate_state(BoidSettings *boids, BoidState *state)
+{
BoidState *staten = MEM_dupallocN(state);
BLI_duplicatelist(&staten->rules, &state->rules);
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 7fac273ef77..61064bede7e 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -384,6 +384,7 @@ void brush_reset_sculpt(Brush *br)
br->sub_col[1] = 1.000000;
break;
case SCULPT_TOOL_ROTATE:
+ br->alpha = 1.0;
break;
case SCULPT_TOOL_SMOOTH:
br->flag &= ~BRUSH_SPACE_ATTEN;
@@ -1215,6 +1216,9 @@ struct ImBuf *brush_gen_radial_control_imbuf(Brush *br)
/* Unified Size and Strength */
+/* XXX, wouldnt it be better to only pass the active scene?
+ * this can return any old scene! - campbell*/
+
static void set_unified_settings(Brush *brush, short flag, int value)
{
Scene *sce;
@@ -1368,7 +1372,9 @@ static float unified_unprojected_radius(Brush *brush)
}
void brush_set_size(Brush *brush, int size)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE)
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE)
set_unified_size(brush, size);
else
brush->size= size;
@@ -1378,12 +1384,16 @@ void brush_set_size(Brush *brush, int size)
int brush_size(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? unified_size(brush) : brush->size;
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) ? unified_size(brush) : brush->size;
}
void brush_set_use_locked_size(Brush *brush, int value)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) {
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) {
set_unified_settings(brush, SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE, value);
}
else {
@@ -1398,12 +1408,18 @@ void brush_set_use_locked_size(Brush *brush, int value)
int brush_use_locked_size(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE) : (brush->flag & BRUSH_LOCK_SIZE);
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) ?
+ (us_flag & SCULPT_PAINT_UNIFIED_LOCK_BRUSH_SIZE) :
+ (brush->flag & BRUSH_LOCK_SIZE);
}
void brush_set_use_size_pressure(Brush *brush, int value)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) {
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) {
set_unified_settings(brush, SCULPT_PAINT_UNIFIED_SIZE_PRESSURE, value);
}
else {
@@ -1418,12 +1434,18 @@ void brush_set_use_size_pressure(Brush *brush, int value)
int brush_use_size_pressure(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_SIZE_PRESSURE) : (brush->flag & BRUSH_SIZE_PRESSURE);
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) ?
+ (us_flag & SCULPT_PAINT_UNIFIED_SIZE_PRESSURE) :
+ (brush->flag & BRUSH_SIZE_PRESSURE);
}
void brush_set_use_alpha_pressure(Brush *brush, int value)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) {
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_ALPHA) {
set_unified_settings(brush, SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE, value);
}
else {
@@ -1438,12 +1460,18 @@ void brush_set_use_alpha_pressure(Brush *brush, int value)
int brush_use_alpha_pressure(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) ? (unified_settings(brush) & SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE) : (brush->flag & BRUSH_ALPHA_PRESSURE);
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_ALPHA) ?
+ (us_flag & SCULPT_PAINT_UNIFIED_ALPHA_PRESSURE) :
+ (brush->flag & BRUSH_ALPHA_PRESSURE);
}
void brush_set_unprojected_radius(Brush *brush, float unprojected_radius)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE)
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE)
set_unified_unprojected_radius(brush, unprojected_radius);
else
brush->unprojected_radius= unprojected_radius;
@@ -1453,12 +1481,18 @@ void brush_set_unprojected_radius(Brush *brush, float unprojected_radius)
float brush_unprojected_radius(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_SIZE) ? unified_unprojected_radius(brush) : brush->unprojected_radius;
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_SIZE) ?
+ unified_unprojected_radius(brush) :
+ brush->unprojected_radius;
}
void brush_set_alpha(Brush *brush, float alpha)
{
- if (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA)
+ const short us_flag = unified_settings(brush);
+
+ if (us_flag & SCULPT_PAINT_USE_UNIFIED_ALPHA)
set_unified_alpha(brush, alpha);
else
brush->alpha= alpha;
@@ -1468,5 +1502,9 @@ void brush_set_alpha(Brush *brush, float alpha)
float brush_alpha(Brush *brush)
{
- return (unified_settings(brush) & SCULPT_PAINT_USE_UNIFIED_ALPHA) ? unified_alpha(brush) : brush->alpha;
+ const short us_flag = unified_settings(brush);
+
+ return (us_flag & SCULPT_PAINT_USE_UNIFIED_ALPHA) ?
+ unified_alpha(brush) :
+ brush->alpha;
}
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 1100c1c0ef5..1aad0a242f9 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -52,7 +52,7 @@ float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_d
{
float dist;
- if(isect_ray_tri_v3(ray->origin, ray->direction, v0, v1, v2, &dist, NULL))
+ if(isect_ray_tri_epsilon_v3(ray->origin, ray->direction, v0, v1, v2, &dist, NULL, FLT_EPSILON))
return dist;
return FLT_MAX;
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 2bd973d7799..f55ceab7de8 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -159,7 +159,7 @@ float object_camera_dof_distance(Object *ob)
copy_m4_m4(obmat, ob->obmat);
normalize_m4(obmat);
invert_m4_m4(imat, obmat);
- mul_m4_m4m4(mat, cam->dof_ob->obmat, imat);
+ mult_m4_m4m4(mat, imat, cam->dof_ob->obmat);
return fabsf(mat[3][2]);
}
return cam->YF_dofdist;
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 0f9033ca461..5af3dc15704 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -647,6 +647,7 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
static void cdDM_drawFacesTex_common(DerivedMesh *dm,
int (*drawParams)(MTFace *tface, int has_mcol, int matnr),
int (*drawParamsMapped)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
void *userData)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
@@ -656,7 +657,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
int i, j, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
- int startFace = 0, lastFlag = 0xdeadbeef;
+ int startFace = 0 /*, lastFlag = 0xdeadbeef */ /* UNUSED */;
MCol *mcol = dm->getFaceDataArray(dm, CD_WEIGHT_MCOL);
if(!mcol)
mcol = dm->getFaceDataArray(dm, CD_MCOL);
@@ -771,24 +772,18 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
}
if( !GPU_buffer_legacy(dm) ) {
- /* warning!, this logic is incorrect, see bug [#27175]
- * firstly, there are no checks for changes in context, such as texface image.
- * secondly, drawParams() sets the GL context, so checking if there is a change
- * from lastFlag is too late once glDrawArrays() runs, since drawing the arrays
- * will use the modified, OpenGL settings.
- *
- * However its tricky to fix this without duplicating the internal logic
- * of drawParams(), perhaps we need an argument like...
- * drawParams(..., keep_gl_state_but_return_when_changed) ?.
- *
- * We could also just disable VBO's here, since texface may be deprecated - campbell.
- */
-
+ int tottri = dm->drawObject->tot_triangle_point/3;
+ int next_actualFace= dm->drawObject->triangle_to_mface[0];
+
glShadeModel( GL_SMOOTH );
- lastFlag = 0;
- for(i = 0; i < dm->drawObject->tot_triangle_point/3; i++) {
- int actualFace = dm->drawObject->triangle_to_mface[i];
+ /* lastFlag = 0; */ /* UNUSED */
+ for(i = 0; i < tottri; i++) {
+ int actualFace = next_actualFace;
int flag = 1;
+ int flush = 0;
+
+ if(i != tottri-1)
+ next_actualFace= dm->drawObject->triangle_to_mface[i+1];
if(drawParams) {
flag = drawParams(tf? &tf[actualFace]: NULL, (mcol != NULL), mf[actualFace].mat_nr);
@@ -804,27 +799,30 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
if(drawParamsMapped)
flag = drawParamsMapped(userData, actualFace);
}
- if( flag != lastFlag ) {
- if( startFace < i ) {
- if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
- if (lastFlag==1 && col)
- GPU_color_switch(1);
- else
- GPU_color_switch(0);
- glDrawArrays(GL_TRIANGLES,startFace*3,(i-startFace)*3);
- }
- }
- lastFlag = flag;
- startFace = i;
+
+ /* flush buffer if current triangle isn't drawable or it's last triangle */
+ flush= !flag || i == tottri - 1;
+
+ if(!flush && compareDrawOptions) {
+ /* also compare draw options and flush buffer if they're different
+ need for face selection highlight in edit mode */
+ flush|= compareDrawOptions(userData, actualFace, next_actualFace) == 0;
}
- }
- if( startFace < dm->drawObject->tot_triangle_point/3 ) {
- if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
- if (lastFlag==1 && col)
- GPU_color_switch(1);
- else
- GPU_color_switch(0);
- glDrawArrays(GL_TRIANGLES, startFace*3, dm->drawObject->tot_triangle_point - startFace*3);
+
+ if(flush) {
+ int first= startFace*3;
+ int count= (i-startFace+(flag ? 1 : 0))*3; /* Add one to the length if we're drawing at the end of the array */
+
+ if(count) {
+ if (col)
+ GPU_color_switch(1);
+ else
+ GPU_color_switch(0);
+
+ glDrawArrays(GL_TRIANGLES, first, count);
+ }
+
+ startFace = i + 1;
}
}
}
@@ -834,13 +832,19 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
}
}
-static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr))
+static void cdDM_drawFacesTex(DerivedMesh *dm,
+ int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
{
- cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
+ cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, compareDrawOptions, userData);
}
-static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs),
- int (*compareDrawOptions)(void *userData, int cur_index, int next_index))
+static void cdDM_drawMappedFaces(DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r),
+ int (*setMaterial)(int, void *attribs),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData, int useColors)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mv = cddm->mvert;
@@ -980,15 +984,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
flush|= mf[actualFace].mat_nr != mf[next_actualFace].mat_nr;
if(!flush && compareDrawOptions) {
- int next_orig= (index==NULL) ? next_actualFace : index[next_actualFace];
-
- if(orig==ORIGINDEX_NONE || next_orig==ORIGINDEX_NONE) {
- flush= 1;
- } else {
- /* also compare draw options and flush buffer if they're different
- need for face selection highlight in edit mode */
- flush|= compareDrawOptions(userData, orig, next_orig) == 0;
- }
+ flush|= compareDrawOptions(userData, actualFace, next_actualFace) == 0;
}
if(flush) {
@@ -1009,9 +1005,12 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
}
}
-static void cdDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
+static void cdDM_drawMappedFacesTex(DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
{
- cdDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
+ cdDM_drawFacesTex_common(dm, NULL, setDrawOptions, compareDrawOptions, userData);
}
static void cddm_draw_attrib_vertex(DMVertexAttribs *attribs, MVert *mvert, int a, int index, int vert, int smoothnormal)
@@ -1058,7 +1057,10 @@ static void cddm_draw_attrib_vertex(DMVertexAttribs *attribs, MVert *mvert, int
glVertex3fv(mvert[index].co);
}
-static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs), int (*setDrawOptions)(void *userData, int index), void *userData)
+static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
+ int (*setMaterial)(int, void *attribs),
+ int (*setDrawOptions)(void *userData, int index),
+ void *userData)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
GPUVertexAttribs gattribs;
@@ -1241,11 +1243,8 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
}
}
- if(!dodraw) {
- continue;
- }
- if( numdata != 0 ) {
+ if(dodraw && numdata != 0 ) {
offset = 0;
if(attribs.totorco) {
copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v1]);
@@ -1287,7 +1286,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
curface++;
if(mface->v4) {
- if( numdata != 0 ) {
+ if(dodraw && numdata != 0 ) {
offset = 0;
if(attribs.totorco) {
copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v3]);
@@ -1348,7 +1347,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
glShadeModel(GL_FLAT);
}
-static void cdDM_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs))
+static void cdDM_drawFacesGLSL(DerivedMesh *dm,int (*setMaterial)(int, void *attribs))
{
dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
}
@@ -1871,7 +1870,7 @@ void CDDM_apply_vert_coords(DerivedMesh *dm, float (*vertCoords)[3])
int i;
/* this will just return the pointer if it wasn't a referenced layer */
- vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
cddm->mvert = vert;
for(i = 0; i < dm->numVertData; ++i, ++vert)
@@ -1885,7 +1884,7 @@ void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
int i;
/* this will just return the pointer if it wasn't a referenced layer */
- vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
cddm->mvert = vert;
for(i = 0; i < dm->numVertData; ++i, ++vert)
@@ -1900,7 +1899,7 @@ void CDDM_calc_normals(DerivedMesh *dm)
if(dm->numVertData == 0) return;
/* we don't want to overwrite any referenced layers */
- cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
/* make a face normal layer if not present */
face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
@@ -1951,7 +1950,7 @@ void CDDM_calc_edges(DerivedMesh *dm)
index = CustomData_get_layer(&edgeData, CD_ORIGINDEX);
for(i = 0; !BLI_edgehashIterator_isDone(ehi);
BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
- BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+ BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
med->flag = ME_EDGEDRAW|ME_EDGERENDER;
*index = ORIGINDEX_NONE;
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 2f568aa01eb..67bd6a22348 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -52,45 +52,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-
-void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
-{
- int x, y;
- float *rf= rectf;
- float srgb[3];
- unsigned char *rc= rectc;
-
- for(y=y1; y<y2; y++) {
- for(x=x1; x<x2; x++, rf+=4, rc+=4) {
- srgb[0]= linearrgb_to_srgb(rf[0]);
- srgb[1]= linearrgb_to_srgb(rf[1]);
- srgb[2]= linearrgb_to_srgb(rf[2]);
-
- rc[0]= FTOCHAR(srgb[0]);
- rc[1]= FTOCHAR(srgb[1]);
- rc[2]= FTOCHAR(srgb[2]);
- rc[3]= FTOCHAR(rf[3]);
- }
- }
-}
-
-void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
-{
- int x, y;
- float *rf= rectf;
- unsigned char *rc= rectc;
-
- for(y=y1; y<y2; y++) {
- for(x=x1; x<x2; x++, rf+=4, rc+=4) {
- rc[0]= FTOCHAR(rf[0]);
- rc[1]= FTOCHAR(rf[1]);
- rc[2]= FTOCHAR(rf[2]);
- rc[3]= FTOCHAR(rf[3]);
- }
- }
-}
-
-
/* ********************************* color curve ********************* */
/* ***************** operations on full struct ************* */
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 6f29594f811..878db6b3ed1 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -153,7 +153,7 @@ bConstraintOb *constraints_make_evalob (Scene *scene, Object *ob, void *subdata,
}
/* matrix in world-space */
- mul_m4_m4m4(cob->matrix, cob->pchan->pose_mat, ob->obmat);
+ mult_m4_m4m4(cob->matrix, ob->obmat, cob->pchan->pose_mat);
}
else
unit_m4(cob->matrix);
@@ -182,7 +182,7 @@ void constraints_clear_evalob (bConstraintOb *cob)
/* calculate delta of constraints evaluation */
invert_m4_m4(imat, cob->startmat);
- mul_m4_m4m4(delta, imat, cob->matrix);
+ mult_m4_m4m4(delta, cob->matrix, imat);
/* copy matrices back to source */
switch (cob->type) {
@@ -203,7 +203,7 @@ void constraints_clear_evalob (bConstraintOb *cob)
/* cob->ob or cob->pchan might not exist */
if (cob->ob && cob->pchan) {
/* copy new pose-matrix back to owner */
- mul_m4_m4m4(cob->pchan->pose_mat, cob->matrix, cob->ob->imat);
+ mult_m4_m4m4(cob->pchan->pose_mat, cob->ob->imat, cob->matrix);
/* copy inverse of delta back to owner */
invert_m4_m4(cob->pchan->constinv, delta);
@@ -242,7 +242,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* world to pose */
invert_m4_m4(imat, ob->obmat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, imat);
+ mult_m4_m4m4(mat, imat, tempmat);
/* use pose-space as stepping stone for other spaces... */
if (ELEM(to, CONSTRAINT_SPACE_LOCAL, CONSTRAINT_SPACE_PARLOCAL)) {
@@ -256,7 +256,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* pose to world */
if (to == CONSTRAINT_SPACE_WORLD) {
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, tempmat);
}
/* pose to local */
else if (to == CONSTRAINT_SPACE_LOCAL) {
@@ -281,12 +281,12 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
- mul_m4_m4m4(diff_mat, offs_bone, tmat);
+ mult_m4_m4m4(diff_mat, tmat, offs_bone);
invert_m4_m4(imat, diff_mat);
}
else {
/* pose_mat = par_pose_mat * bone_mat * chan_mat */
- mul_m4_m4m4(diff_mat, offs_bone, pchan->parent->pose_mat);
+ mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone);
invert_m4_m4(imat, diff_mat);
}
}
@@ -296,7 +296,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
}
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, imat);
+ mult_m4_m4m4(mat, imat, tempmat);
}
}
/* pose to local with parent */
@@ -304,7 +304,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
if (pchan->bone) {
invert_m4_m4(imat, pchan->bone->arm_mat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, imat);
+ mult_m4_m4m4(mat, imat, tempmat);
}
}
}
@@ -334,22 +334,22 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
zero_v3(offs_bone[3]);
mul_m4_v3(pchan->parent->pose_mat, tmat[3]);
- mul_m4_m4m4(diff_mat, offs_bone, tmat);
+ mult_m4_m4m4(diff_mat, tmat, offs_bone);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, diff_mat);
+ mult_m4_m4m4(mat, diff_mat, tempmat);
}
else {
/* pose_mat = par_pose_mat * bone_mat * chan_mat */
- mul_m4_m4m4(diff_mat, offs_bone, pchan->parent->pose_mat);
+ mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, diff_mat);
+ mult_m4_m4m4(mat, diff_mat, tempmat);
}
}
else {
copy_m4_m4(diff_mat, pchan->bone->arm_mat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, diff_mat);
+ mult_m4_m4m4(mat, diff_mat, tempmat);
}
}
@@ -366,7 +366,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
if (pchan->bone) {
copy_m4_m4(diff_mat, pchan->bone->arm_mat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, diff_mat, tempmat);
+ mult_m4_m4m4(mat, tempmat, diff_mat);
}
/* use pose-space as stepping stone for other spaces */
@@ -384,10 +384,10 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* check if object has a parent */
if (ob->parent) {
/* 'subtract' parent's effects from owner */
- mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
+ mult_m4_m4m4(diff_mat, ob->parent->obmat, ob->parentinv);
invert_m4_m4(imat, diff_mat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, imat);
+ mult_m4_m4m4(mat, imat, tempmat);
}
else {
/* Local space in this case will have to be defined as local to the owner's
@@ -399,7 +399,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
invert_m4_m4(imat, diff_mat);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, imat);
+ mult_m4_m4m4(mat, imat, tempmat);
}
}
else if (from==CONSTRAINT_SPACE_LOCAL && to==CONSTRAINT_SPACE_WORLD) {
@@ -407,8 +407,8 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
if (ob->parent) {
/* 'add' parent's effect back to owner */
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
- mul_m4_m4m4(mat, tempmat, diff_mat);
+ mult_m4_m4m4(diff_mat, ob->parent->obmat, ob->parentinv);
+ mult_m4_m4m4(mat, diff_mat, tempmat);
}
else {
/* Local space in this case will have to be defined as local to the owner's
@@ -419,7 +419,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
zero_v3(diff_mat[3]);
copy_m4_m4(tempmat, mat);
- mul_m4_m4m4(mat, tempmat, diff_mat);
+ mult_m4_m4m4(mat, diff_mat, tempmat);
}
}
}
@@ -436,16 +436,15 @@ static void contarget_get_mesh_mat (Object *ob, const char *substring, float mat
float vec[3] = {0.0f, 0.0f, 0.0f};
float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
float imat[3][3], tmat[3][3];
- int dgroup;
+ const int defgroup= defgroup_name_index(ob, substring);
short freeDM = 0;
/* initialize target matrix using target matrix */
copy_m4_m4(mat, ob->obmat);
/* get index of vertex group */
- dgroup = defgroup_name_index(ob, substring);
- if (dgroup < 0) return;
-
+ if (defgroup == -1) return;
+
/* get DerivedMesh */
if (em) {
/* target is in editmode, so get a special derived mesh */
@@ -463,28 +462,25 @@ static void contarget_get_mesh_mat (Object *ob, const char *substring, float mat
if (dm) {
MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
int numVerts = dm->getNumVerts(dm);
- int i, j, count = 0;
+ int i, count = 0;
float co[3], nor[3];
/* check that dvert is a valid pointers (just in case) */
if (dvert) {
+ MDeformVert *dv= dvert;
/* get the average of all verts with that are in the vertex-group */
- for (i = 0; i < numVerts; i++) {
- for (j = 0; j < dvert[i].totweight; j++) {
- /* does this vertex belong to nominated vertex group? */
- if (dvert[i].dw[j].def_nr == dgroup) {
- dm->getVertCo(dm, i, co);
- dm->getVertNo(dm, i, nor);
- add_v3_v3(vec, co);
- add_v3_v3(normal, nor);
- count++;
- break;
- }
+ for (i = 0; i < numVerts; i++, dv++) {
+ MDeformWeight *dw= defvert_find_index(dv, defgroup);
+ if (dw && dw->weight != 0.0f) {
+ dm->getVertCo(dm, i, co);
+ dm->getVertNo(dm, i, nor);
+ add_v3_v3(vec, co);
+ add_v3_v3(normal, nor);
+ count++;
}
}
-
-
+
/* calculate averages of normal and coordinates */
if (count > 0) {
mul_v3_fl(vec, 1.0f / count);
@@ -535,43 +531,38 @@ static void contarget_get_lattice_mat (Object *ob, const char *substring, float
float *co = dl?dl->verts:NULL;
BPoint *bp = lt->def;
- MDeformVert *dvert = lt->dvert;
+ MDeformVert *dv = lt->dvert;
int tot_verts= lt->pntsu*lt->pntsv*lt->pntsw;
float vec[3]= {0.0f, 0.0f, 0.0f}, tvec[3];
- int dgroup=0, grouped=0;
+ int grouped=0;
int i, n;
+ const int defgroup= defgroup_name_index(ob, substring);
/* initialize target matrix using target matrix */
copy_m4_m4(mat, ob->obmat);
-
+
/* get index of vertex group */
- dgroup = defgroup_name_index(ob, substring);
- if (dgroup < 0) return;
- if (dvert == NULL) return;
+ if (defgroup == -1) return;
+ if (dv == NULL) return;
/* 1. Loop through control-points checking if in nominated vertex-group.
* 2. If it is, add it to vec to find the average point.
*/
- for (i=0; i < tot_verts; i++, dvert++) {
- for (n= 0; n < dvert->totweight; n++) {
- /* found match - vert is in vgroup */
- if (dvert->dw[n].def_nr == dgroup) {
+ for (i=0; i < tot_verts; i++, dv++) {
+ for (n= 0; n < dv->totweight; n++) {
+ MDeformWeight *dw= defvert_find_index(dv, defgroup);
+ if (dw && dw->weight > 0.0f) {
/* copy coordinates of point to temporary vector, then add to find average */
- if (co)
- memcpy(tvec, co, 3*sizeof(float));
- else
- memcpy(tvec, bp->vec, 3*sizeof(float));
-
+ memcpy(tvec, co ? co : bp->vec, 3 * sizeof(float));
+
add_v3_v3(vec, tvec);
grouped++;
-
- break;
}
}
/* advance pointer to coordinate data */
- if (co) co+= 3;
- else bp++;
+ if (co) co += 3;
+ else bp++;
}
/* find average location, then multiply by ob->obmat to find world-space location */
@@ -621,7 +612,7 @@ static void constraint_target_to_mat4 (Object *ob, const char *substring, float
*/
if (headtail < 0.000001f) {
/* skip length interpolation if set to head */
- mul_m4_m4m4(mat, pchan->pose_mat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, pchan->pose_mat);
}
else {
float tempmat[4][4], loc[3];
@@ -633,7 +624,7 @@ static void constraint_target_to_mat4 (Object *ob, const char *substring, float
copy_m4_m4(tempmat, pchan->pose_mat);
copy_v3_v3(tempmat[3], loc);
- mul_m4_m4m4(mat, tempmat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, tempmat);
}
}
else
@@ -834,7 +825,7 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
{
bChildOfConstraint *data= con->data;
bConstraintTarget *ct= targets->first;
-
+
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct)) {
float parmat[4][4];
@@ -845,12 +836,12 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* multiply target (parent matrix) by offset (parent inverse) to get
* the effect of the parent that will be exherted on the owner
*/
- mul_m4_m4m4(parmat, data->invmat, ct->matrix);
+ mult_m4_m4m4(parmat, ct->matrix, data->invmat);
/* now multiply the parent matrix by the owner matrix to get the
* the effect of this constraint (i.e. owner is 'parented' to parent)
*/
- mul_m4_m4m4(cob->matrix, cob->matrix, parmat);
+ mult_m4_m4m4(cob->matrix, parmat, cob->matrix);
}
else {
float invmat[4][4], tempmat[4][4];
@@ -887,13 +878,13 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* multiply target (parent matrix) by offset (parent inverse) to get
* the effect of the parent that will be exherted on the owner
*/
- mul_m4_m4m4(parmat, invmat, ct->matrix);
+ mult_m4_m4m4(parmat, ct->matrix, invmat);
/* now multiply the parent matrix by the owner matrix to get the
* the effect of this constraint (i.e. owner is 'parented' to parent)
*/
copy_m4_m4(tempmat, cob->matrix);
- mul_m4_m4m4(cob->matrix, tempmat, parmat);
+ mult_m4_m4m4(cob->matrix, parmat, tempmat);
/* without this, changes to scale and rotation can change location
* of a parentless bone or a disconnected bone. Even though its set
@@ -1106,10 +1097,10 @@ static void kinematic_new_data (void *cdata)
{
bKinematicConstraint *data= (bKinematicConstraint *)cdata;
- data->weight= (float)1.0;
- data->orientweight= (float)1.0;
+ data->weight= 1.0f;
+ data->orientweight= 1.0f;
data->iterations = 500;
- data->dist= (float)1.0;
+ data->dist= 1.0f;
data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_STRETCH|CONSTRAINT_IK_POS;
}
@@ -1264,6 +1255,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
float quat[4];
if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
/* animated position along curve depending on time */
+ Nurb *nu = cu->nurb.first;
curvetime= cu->ctime - data->offset;
/* ctime is now a proper var setting of Curve which gets set by Animato like any other var that's animated,
@@ -1273,7 +1265,18 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
* factor, which then gets clamped to lie within 0.0 - 1.0 range
*/
curvetime /= cu->pathlen;
- CLAMP(curvetime, 0.0f, 1.0f);
+
+ if (nu && nu->flagu & CU_NURB_CYCLIC) {
+ /* If the curve is cyclic, enable looping around if the time is
+ * outside the bounds 0..1 */
+ if ((curvetime < 0.0f) || (curvetime > 1.0f)) {
+ curvetime -= floor(curvetime);
+ }
+ }
+ else {
+ /* The curve is not cyclic, so clamp to the begin/end points. */
+ CLAMP(curvetime, 0.0f, 1.0f);
+ }
}
else {
/* fixed position along curve */
@@ -1303,7 +1306,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
if (data->followflag & FOLLOWPATH_RADIUS) {
float tmat[4][4], rmat[4][4];
scale_m4_fl(tmat, radius);
- mul_m4_m4m4(rmat, totmat, tmat);
+ mult_m4_m4m4(rmat, tmat, totmat);
copy_m4_m4(totmat, rmat);
}
@@ -2246,7 +2249,7 @@ static void actcon_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListB
* function has already taken care of everything else.
*/
copy_m4_m4(temp, cob->matrix);
- mul_m4_m4m4(cob->matrix, ct->matrix, temp);
+ mult_m4_m4m4(cob->matrix, temp, ct->matrix);
}
}
@@ -2937,7 +2940,7 @@ static void minmax_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *tar
if (data->flag & MINMAX_USEROT) {
/* take rotation of target into account by doing the transaction in target's localspace */
invert_m4_m4(imat, tarmat);
- mul_m4_m4m4(tmat, obmat, imat);
+ mult_m4_m4m4(tmat, imat, obmat);
copy_m4_m4(obmat, tmat);
unit_m4(tarmat);
}
@@ -2990,7 +2993,7 @@ static void minmax_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *tar
}
if (data->flag & MINMAX_USEROT) {
/* get out of localspace */
- mul_m4_m4m4(tmat, obmat, ct->matrix);
+ mult_m4_m4m4(tmat, ct->matrix, obmat);
copy_m4_m4(cob->matrix, tmat);
}
else {
@@ -3946,6 +3949,7 @@ static void followtrack_id_looper (bConstraint *con, ConstraintIDFunc func, void
bFollowTrackConstraint *data= con->data;
func(con, (ID**)&data->clip, userdata);
+ func(con, (ID**)&data->camera, userdata);
}
static void followtrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
@@ -3953,105 +3957,126 @@ static void followtrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
Scene *scene= cob->scene;
bFollowTrackConstraint *data= con->data;
MovieClip *clip= data->clip;
+ MovieTracking *tracking;
MovieTrackingTrack *track;
-
+ MovieTrackingObject *tracking_object;
+ Object *camob= data->camera ? data->camera : scene->camera;
+
if (data->flag & FOLLOWTRACK_ACTIVECLIP)
clip= scene->clip;
-
- if (!clip || !data->track[0])
+
+ if (!clip || !data->track[0] || !camob)
return;
-
- track= BKE_tracking_named_track(&clip->tracking, data->track);
-
+
+ tracking= &clip->tracking;
+
+ if(data->object[0])
+ tracking_object= BKE_tracking_named_object(tracking, data->object);
+ else
+ tracking_object= BKE_tracking_get_camera_object(tracking);
+
+ if(!tracking_object)
+ return;
+
+ track= BKE_tracking_named_track(tracking, tracking_object, data->track);
+
if (!track)
return;
-
+
if (data->flag & FOLLOWTRACK_USE_3D_POSITION) {
if (track->flag & TRACK_HAS_BUNDLE) {
- float pos[3], mat[4][4], obmat[4][4];
-
+ MovieTracking *tracking= &clip->tracking;
+ float obmat[4][4], mat[4][4];
+
copy_m4_m4(obmat, cob->matrix);
-
- BKE_get_tracking_mat(cob->scene, NULL, mat);
- mul_v3_m4v3(pos, mat, track->bundle_pos);
-
- cob->matrix[3][0] += pos[0];
- cob->matrix[3][1] += pos[1];
- cob->matrix[3][2] += pos[2];
+
+ if((tracking_object->flag&TRACKING_OBJECT_CAMERA)==0) {
+ float imat[4][4];
+
+ copy_m4_m4(mat, camob->obmat);
+
+ BKE_tracking_get_interpolated_camera(tracking, tracking_object, scene->r.cfra, imat);
+ invert_m4(imat);
+
+ mul_serie_m4(cob->matrix, obmat, mat, imat, NULL, NULL, NULL, NULL, NULL);
+ translate_m4(cob->matrix, track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
+ }
+ else {
+ BKE_get_tracking_mat(cob->scene, camob, mat);
+
+ mult_m4_m4m4(cob->matrix, obmat, mat);
+ translate_m4(cob->matrix, track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
+ }
}
}
else {
- Object *camob= cob->scene->camera;
-
- if (camob) {
- MovieClipUser user;
- MovieTrackingMarker *marker;
- float vec[3], disp[3], axis[3], mat[4][4];
- float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
- float len, d;
-
- where_is_object_mat(scene, camob, mat);
-
- /* camera axis */
- vec[0]= 0.0f;
- vec[1]= 0.0f;
- vec[2]= 1.0f;
- mul_v3_m4v3(axis, mat, vec);
-
- /* distance to projection plane */
- copy_v3_v3(vec, cob->matrix[3]);
- sub_v3_v3(vec, mat[3]);
- project_v3_v3v3(disp, vec, axis);
-
- len= len_v3(disp);
-
- if (len > FLT_EPSILON) {
- CameraParams params;
- float pos[2], rmat[4][4];
-
- user.framenr= scene->r.cfra;
- marker= BKE_tracking_get_marker(track, user.framenr);
-
- add_v2_v2v2(pos, marker->pos, track->offset);
-
- camera_params_init(&params);
- camera_params_from_object(&params, camob);
+ MovieClipUser user;
+ MovieTrackingMarker *marker;
+ float vec[3], disp[3], axis[3], mat[4][4];
+ float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
+ float len, d;
- if (params.is_ortho) {
- vec[0]= params.ortho_scale * (pos[0]-0.5f+params.shiftx);
- vec[1]= params.ortho_scale * (pos[1]-0.5f+params.shifty);
- vec[2]= -len;
-
- if (aspect > 1.0f) vec[1] /= aspect;
- else vec[0] *= aspect;
-
- mul_v3_m4v3(disp, camob->obmat, vec);
-
- copy_m4_m4(rmat, camob->obmat);
- zero_v3(rmat[3]);
- mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
-
- copy_v3_v3(cob->matrix[3], disp);
- }
- else {
- d= (len*params.sensor_x) / (2.0f*params.lens);
-
- vec[0]= d*(2.0f*(pos[0]+params.shiftx)-1.0f);
- vec[1]= d*(2.0f*(pos[1]+params.shifty)-1.0f);
- vec[2]= -len;
-
- if (aspect > 1.0f) vec[1] /= aspect;
- else vec[0] *= aspect;
-
- mul_v3_m4v3(disp, camob->obmat, vec);
-
- /* apply camera rotation so Z-axis would be co-linear */
- copy_m4_m4(rmat, camob->obmat);
- zero_v3(rmat[3]);
- mul_m4_m4m4(cob->matrix, rmat, cob->matrix);
-
- copy_v3_v3(cob->matrix[3], disp);
- }
+ where_is_object_mat(scene, camob, mat);
+
+ /* camera axis */
+ vec[0]= 0.0f;
+ vec[1]= 0.0f;
+ vec[2]= 1.0f;
+ mul_v3_m4v3(axis, mat, vec);
+
+ /* distance to projection plane */
+ copy_v3_v3(vec, cob->matrix[3]);
+ sub_v3_v3(vec, mat[3]);
+ project_v3_v3v3(disp, vec, axis);
+
+ len= len_v3(disp);
+
+ if (len > FLT_EPSILON) {
+ CameraParams params;
+ float pos[2], rmat[4][4];
+
+ user.framenr= scene->r.cfra;
+ marker= BKE_tracking_get_marker(track, user.framenr);
+
+ add_v2_v2v2(pos, marker->pos, track->offset);
+
+ camera_params_init(&params);
+ camera_params_from_object(&params, camob);
+
+ if (params.is_ortho) {
+ vec[0]= params.ortho_scale * (pos[0]-0.5f+params.shiftx);
+ vec[1]= params.ortho_scale * (pos[1]-0.5f+params.shifty);
+ vec[2]= -len;
+
+ if (aspect > 1.0f) vec[1] /= aspect;
+ else vec[0] *= aspect;
+
+ mul_v3_m4v3(disp, camob->obmat, vec);
+
+ copy_m4_m4(rmat, camob->obmat);
+ zero_v3(rmat[3]);
+ mult_m4_m4m4(cob->matrix, cob->matrix, rmat);
+
+ copy_v3_v3(cob->matrix[3], disp);
+ }
+ else {
+ d= (len*params.sensor_x) / (2.0f*params.lens);
+
+ vec[0]= d*(2.0f*(pos[0]+params.shiftx)-1.0f);
+ vec[1]= d*(2.0f*(pos[1]+params.shifty)-1.0f);
+ vec[2]= -len;
+
+ if (aspect > 1.0f) vec[1] /= aspect;
+ else vec[0] *= aspect;
+
+ mul_v3_m4v3(disp, camob->obmat, vec);
+
+ /* apply camera rotation so Z-axis would be co-linear */
+ copy_m4_m4(rmat, camob->obmat);
+ zero_v3(rmat[3]);
+ mult_m4_m4m4(cob->matrix, cob->matrix, rmat);
+
+ copy_v3_v3(cob->matrix[3], disp);
}
}
}
@@ -4095,17 +4120,20 @@ static void camerasolver_evaluate (bConstraint *con, bConstraintOb *cob, ListBas
Scene *scene= cob->scene;
bCameraSolverConstraint *data= con->data;
MovieClip *clip= data->clip;
-
+
if (data->flag & CAMERASOLVER_ACTIVECLIP)
clip= scene->clip;
-
+
if (clip) {
float mat[4][4], obmat[4][4];
-
- BKE_tracking_get_interpolated_camera(&clip->tracking, scene->r.cfra, mat);
-
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *object= BKE_tracking_get_camera_object(tracking);
+
+ BKE_tracking_get_interpolated_camera(tracking, object, scene->r.cfra, mat);
+
copy_m4_m4(obmat, cob->matrix);
- mul_m4_m4m4(cob->matrix, mat, obmat);
+
+ mult_m4_m4m4(cob->matrix, obmat, mat);
}
}
@@ -4125,6 +4153,80 @@ static bConstraintTypeInfo CTI_CAMERASOLVER = {
camerasolver_evaluate /* evaluate */
};
+/* ----------- Object Solver ------------- */
+
+static void objectsolver_new_data (void *cdata)
+{
+ bObjectSolverConstraint *data= (bObjectSolverConstraint *)cdata;
+
+ data->clip = NULL;
+ data->flag |= OBJECTSOLVER_ACTIVECLIP;
+ unit_m4(data->invmat);
+}
+
+static void objectsolver_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata)
+{
+ bObjectSolverConstraint *data= con->data;
+
+ func(con, (ID**)&data->clip, userdata);
+ func(con, (ID**)&data->camera, userdata);
+}
+
+static void objectsolver_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
+{
+ Scene *scene= cob->scene;
+ bObjectSolverConstraint *data= con->data;
+ MovieClip *clip= data->clip;
+ Object *camob= data->camera ? data->camera : scene->camera;
+
+ if (data->flag & OBJECTSOLVER_ACTIVECLIP)
+ clip= scene->clip;
+
+ if(!camob || !clip)
+ return;
+
+ if (clip) {
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *object;
+
+ object= BKE_tracking_named_object(tracking, data->object);
+
+ if(object) {
+ float mat[4][4], obmat[4][4], imat[4][4], cammat[4][4], camimat[4][4], parmat[4][4];
+
+ where_is_object_mat(scene, camob, cammat);
+
+ BKE_tracking_get_interpolated_camera(tracking, object, scene->r.cfra, mat);
+
+ invert_m4_m4(camimat, cammat);
+ mult_m4_m4m4(parmat, cammat, data->invmat);
+
+ copy_m4_m4(cammat, camob->obmat);
+ copy_m4_m4(obmat, cob->matrix);
+
+ invert_m4_m4(imat, mat);
+
+ mul_serie_m4(cob->matrix, cammat, imat, camimat, parmat, obmat, NULL, NULL, NULL);
+ }
+ }
+}
+
+static bConstraintTypeInfo CTI_OBJECTSOLVER = {
+ CONSTRAINT_TYPE_OBJECTSOLVER, /* type */
+ sizeof(bObjectSolverConstraint), /* size */
+ "Object Solver", /* name */
+ "bObjectSolverConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ objectsolver_id_looper, /* id looper */
+ NULL, /* copy data */
+ objectsolver_new_data, /* new data */
+ NULL, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ NULL, /* get target matrix */
+ objectsolver_evaluate /* evaluate */
+};
+
/* ************************* Constraints Type-Info *************************** */
/* All of the constraints api functions use bConstraintTypeInfo structs to carry out
* and operations that involve constraint specific code.
@@ -4165,6 +4267,7 @@ static void constraints_init_typeinfo (void)
constraintsTypeInfo[25]= &CTI_PIVOT; /* Pivot Constraint */
constraintsTypeInfo[26]= &CTI_FOLLOWTRACK; /* Follow Track Constraint */
constraintsTypeInfo[27]= &CTI_CAMERASOLVER; /* Camera Solver Constraint */
+ constraintsTypeInfo[28]= &CTI_OBJECTSOLVER; /* Object Solver Constraint */
}
/* This function should be used for getting the appropriate type-info when only
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 6efd0a2727f..35b2499bea5 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -99,6 +99,14 @@ typedef struct LayerTypeInfo {
default is assumed to be all zeros */
void (*set_default)(void *data, int count);
+ /* functions necassary for geometry collapse*/
+ int (*equal)(void *data1, void *data2);
+ void (*multiply)(void *data, float fac);
+ void (*initminmax)(void *min, void *max);
+ void (*add)(void *data1, void *data2);
+ void (*dominmax)(void *data1, void *min, void *max);
+ void (*copyvalue)(void *source, void *dest);
+
/* a function to read data from a cdf file */
int (*read)(CDataFile *cdf, void *data, int count);
@@ -226,13 +234,11 @@ static void layerInterp_msticky(void **sources, float *weights,
w = weights ? weights[i] : 1.0f;
mst = (MSticky*)sources[i];
- co[0] += w*mst->co[0];
- co[1] += w*mst->co[1];
+ madd_v2_v2fl(co, mst->co, w);
}
mst = (MSticky*)dest;
- mst->co[0] = co[0];
- mst->co[1] = co[1];
+ copy_v2_v2(mst->co, co);
}
@@ -251,13 +257,11 @@ static void layerInterp_tface(void **sources, float *weights,
{
MTFace *tf = dest;
int i, j, k;
- float uv[4][2];
+ float uv[4][2] = {{0.0f}};
float *sub_weight;
if(count <= 0) return;
- memset(uv, 0, sizeof(uv));
-
sub_weight = sub_weights;
for(i = 0; i < count; ++i) {
float weight = weights ? weights[i] : 1;
@@ -266,24 +270,17 @@ static void layerInterp_tface(void **sources, float *weights,
for(j = 0; j < 4; ++j) {
if(sub_weights) {
for(k = 0; k < 4; ++k, ++sub_weight) {
- float w = (*sub_weight) * weight;
- float *tmp_uv = src->uv[k];
-
- uv[j][0] += tmp_uv[0] * w;
- uv[j][1] += tmp_uv[1] * w;
+ madd_v2_v2fl(uv[j], src->uv[k], (*sub_weight) * weight);
}
- } else {
- uv[j][0] += src->uv[j][0] * weight;
- uv[j][1] += src->uv[j][1] * weight;
+ }
+ else {
+ madd_v2_v2fl(uv[j], src->uv[j], weight);
}
}
}
- *tf = *(MTFace *)sources[0];
- for(j = 0; j < 4; ++j) {
- tf->uv[j][0] = uv[j][0];
- tf->uv[j][1] = uv[j][1];
- }
+ *tf = *(MTFace *)(*sources);
+ memcpy(tf->uv, uv, sizeof(tf->uv));
}
static void layerSwap_tface(void *data, const int *corner_indices)
@@ -299,10 +296,9 @@ static void layerSwap_tface(void *data, const int *corner_indices)
int j;
for(j = 0; j < 4; ++j) {
- int source_index = corner_indices[j];
+ const int source_index = corner_indices[j];
- uv[j][0] = tf->uv[source_index][0];
- uv[j][1] = tf->uv[source_index][1];
+ copy_v2_v2(uv[j], tf->uv[source_index]);
// swap pinning flags around
if(tf->unwrap & pin_flags[source_index]) {
@@ -331,6 +327,24 @@ static void layerDefault_tface(void *data, int count)
tf[i] = default_tf;
}
+static void layerCopy_propFloat(const void *source, void *dest,
+ int count)
+{
+ memcpy(dest, source, sizeof(MFloatProperty)*count);
+}
+
+static void layerCopy_propInt(const void *source, void *dest,
+ int count)
+{
+ memcpy(dest, source, sizeof(MIntProperty)*count);
+}
+
+static void layerCopy_propString(const void *source, void *dest,
+ int count)
+{
+ memcpy(dest, source, sizeof(MStringProperty)*count);
+}
+
static void layerCopy_origspace_face(const void *source, void *dest, int count)
{
const OrigSpaceFace *source_tf = (const OrigSpaceFace*)source;
@@ -346,13 +360,11 @@ static void layerInterp_origspace_face(void **sources, float *weights,
{
OrigSpaceFace *osf = dest;
int i, j, k;
- float uv[4][2];
+ float uv[4][2] = {{0.0f}};
float *sub_weight;
if(count <= 0) return;
- memset(uv, 0, sizeof(uv));
-
sub_weight = sub_weights;
for(i = 0; i < count; ++i) {
float weight = weights ? weights[i] : 1;
@@ -361,24 +373,18 @@ static void layerInterp_origspace_face(void **sources, float *weights,
for(j = 0; j < 4; ++j) {
if(sub_weights) {
for(k = 0; k < 4; ++k, ++sub_weight) {
- float w = (*sub_weight) * weight;
- float *tmp_uv = src->uv[k];
-
- uv[j][0] += tmp_uv[0] * w;
- uv[j][1] += tmp_uv[1] * w;
+ madd_v2_v2fl(uv[j], src->uv[k], (*sub_weight) * weight);
}
} else {
- uv[j][0] += src->uv[j][0] * weight;
- uv[j][1] += src->uv[j][1] * weight;
+ madd_v2_v2fl(uv[j], src->uv[j], weight);
}
}
}
- *osf = *(OrigSpaceFace *)sources[0];
- for(j = 0; j < 4; ++j) {
- osf->uv[j][0] = uv[j][0];
- osf->uv[j][1] = uv[j][1];
- }
+#if 0 /* no need, this ONLY contains UV's */
+ *osf = *(OrigSpaceFace *)(*sources);
+#endif
+ memcpy(osf->uv, uv, sizeof(osf->uv));
}
static void layerSwap_origspace_face(void *data, const int *corner_indices)
@@ -388,8 +394,7 @@ static void layerSwap_origspace_face(void *data, const int *corner_indices)
int j;
for(j = 0; j < 4; ++j) {
- uv[j][0] = osf->uv[corner_indices[j]][0];
- uv[j][1] = osf->uv[corner_indices[j]][1];
+ copy_v2_v2(uv[j], osf->uv[corner_indices[j]]);
}
memcpy(osf->uv, uv, sizeof(osf->uv));
}
@@ -640,10 +645,83 @@ static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), void *data, int count
}
/* --------- */
+static void layerCopyValue_mloopcol(void *source, void *dest)
+{
+ MLoopCol *m1 = source, *m2 = dest;
+
+ m2->r = m1->r;
+ m2->g = m1->g;
+ m2->b = m1->b;
+ m2->a = m1->a;
+}
+
+static int layerEqual_mloopcol(void *data1, void *data2)
+{
+ MLoopCol *m1 = data1, *m2 = data2;
+ float r, g, b, a;
+
+ r = m1->r - m2->r;
+ g = m1->g - m2->g;
+ b = m1->b - m2->b;
+ a = m1->a - m2->a;
+
+ return r*r + g*g + b*b + a*a < 0.001;
+}
+
+static void layerMultiply_mloopcol(void *data, float fac)
+{
+ MLoopCol *m = data;
+
+ m->r = (float)m->r * fac;
+ m->g = (float)m->g * fac;
+ m->b = (float)m->b * fac;
+ m->a = (float)m->a * fac;
+}
+
+static void layerAdd_mloopcol(void *data1, void *data2)
+{
+ MLoopCol *m = data1, *m2 = data2;
+
+ m->r += m2->r;
+ m->g += m2->g;
+ m->b += m2->b;
+ m->a += m2->a;
+}
+
+static void layerDoMinMax_mloopcol(void *data, void *vmin, void *vmax)
+{
+ MLoopCol *m = data;
+ MLoopCol *min = vmin, *max = vmax;
+
+ if (m->r < min->r) min->r = m->r;
+ if (m->g < min->g) min->g = m->g;
+ if (m->b < min->b) min->b = m->b;
+ if (m->a < min->a) min->a = m->a;
+
+ if (m->r > max->r) max->r = m->r;
+ if (m->g > max->g) max->g = m->g;
+ if (m->b > max->b) max->b = m->b;
+ if (m->a > max->a) max->a = m->a;
+}
+
+static void layerInitMinMax_mloopcol(void *vmin, void *vmax)
+{
+ MLoopCol *min = vmin, *max = vmax;
+
+ min->r = 255;
+ min->g = 255;
+ min->b = 255;
+ min->a = 255;
+
+ max->r = 0;
+ max->g = 0;
+ max->b = 0;
+ max->a = 0;
+}
static void layerDefault_mloopcol(void *data, int count)
{
- static MLoopCol default_mloopcol = {255,255,255,255};
+ MLoopCol default_mloopcol = {255,255,255,255};
MLoopCol *mlcol = (MLoopCol*)data;
int i;
for(i = 0; i < count; i++)
@@ -674,7 +752,7 @@ static void layerInterp_mloopcol(void **sources, float *weights,
col.r += src->r * (*sub_weight) * weight;
col.g += src->g * (*sub_weight) * weight;
col.b += src->b * (*sub_weight) * weight;
- sub_weight++;
+ sub_weight++;
} else {
col.a += src->a * weight;
col.r += src->r * weight;
@@ -695,33 +773,74 @@ static void layerInterp_mloopcol(void **sources, float *weights,
mc->g = (int)col.g;
mc->b = (int)col.b;
}
+
+static void layerCopyValue_mloopuv(void *source, void *dest)
+{
+ MLoopUV *luv1 = source, *luv2 = dest;
+
+ copy_v2_v2(luv2->uv, luv1->uv);
+}
+
+static int layerEqual_mloopuv(void *data1, void *data2)
+{
+ MLoopUV *luv1 = data1, *luv2 = data2;
+
+ return len_squared_v2v2(luv1->uv, luv2->uv) < 0.00001f;
+}
+
+static void layerMultiply_mloopuv(void *data, float fac)
+{
+ MLoopUV *luv = data;
+
+ mul_v2_fl(luv->uv, fac);
+}
+
+static void layerInitMinMax_mloopuv(void *vmin, void *vmax)
+{
+ MLoopUV *min = vmin, *max = vmax;
+
+ INIT_MINMAX2(min->uv, max->uv);
+}
+
+static void layerDoMinMax_mloopuv(void *data, void *vmin, void *vmax)
+{
+ MLoopUV *min = vmin, *max = vmax, *luv = data;
+
+ DO_MINMAX2(luv->uv, min->uv, max->uv);
+}
+
+static void layerAdd_mloopuv(void *data1, void *data2)
+{
+ MLoopUV *l1 = data1, *l2 = data2;
+
+ add_v2_v2(l1->uv, l2->uv);
+}
+
static void layerInterp_mloopuv(void **sources, float *weights,
- float *sub_weights, int count, void *dest)
+ float *sub_weights, int count, void *dest)
{
MLoopUV *mluv = dest;
+ float *uv= mluv->uv;
int i;
- float *sub_weight;
- struct {
- float u;
- float v;
- }uv;
- uv.u = uv.v = 0.0;
- sub_weight = sub_weights;
- for(i = 0; i < count; ++i){
- float weight = weights ? weights[i] : 1;
- MLoopUV *src = sources[i];
- if(sub_weights){
- uv.u += src->uv[0] * (*sub_weight) * weight;
- uv.v += src->uv[1] * (*sub_weight) * weight;
- sub_weight++;
- } else {
- uv.u += src->uv[0] * weight;
- uv.v += src->uv[1] * weight;
+ zero_v2(uv);
+
+ if (sub_weights) {
+ const float *sub_weight = sub_weights;
+ for(i = 0; i < count; i++) {
+ float weight = weights ? weights[i] : 1.0f;
+ MLoopUV *src = sources[i];
+ madd_v2_v2fl(uv, src->uv, (*sub_weight) * weight);
+ sub_weight++;
+ }
+ }
+ else {
+ for(i = 0; i < count; i++) {
+ float weight = weights ? weights[i] : 1;
+ MLoopUV *src = sources[i];
+ madd_v2_v2fl(uv, src->uv, weight);
}
}
- mluv->uv[0] = uv.u;
- mluv->uv[1] = uv.v;
}
static void layerInterp_mcol(void **sources, float *weights,
@@ -734,12 +853,11 @@ static void layerInterp_mcol(void **sources, float *weights,
float r;
float g;
float b;
- } col[4];
+ } col[4] = {{0.0f}};
+
float *sub_weight;
if(count <= 0) return;
-
- memset(col, 0, sizeof(col));
sub_weight = sub_weights;
for(i = 0; i < count; ++i) {
@@ -749,10 +867,11 @@ static void layerInterp_mcol(void **sources, float *weights,
if(sub_weights) {
MCol *src = sources[i];
for(k = 0; k < 4; ++k, ++sub_weight, ++src) {
- col[j].a += src->a * (*sub_weight) * weight;
- col[j].r += src->r * (*sub_weight) * weight;
- col[j].g += src->g * (*sub_weight) * weight;
- col[j].b += src->b * (*sub_weight) * weight;
+ const float w= (*sub_weight) * weight;
+ col[j].a += src->a * w;
+ col[j].r += src->r * w;
+ col[j].g += src->g * w;
+ col[j].b += src->b * w;
}
} else {
MCol *src = sources[i];
@@ -798,11 +917,56 @@ static void layerDefault_mcol(void *data, int count)
MCol *mcol = (MCol*)data;
int i;
- for(i = 0; i < 4*count; i++)
+ for(i = 0; i < 4*count; i++) {
mcol[i] = default_mcol;
+ }
+}
+
+static void layerInterp_bweight(void **sources, float *weights,
+ float *UNUSED(sub_weights), int count, void *dest)
+{
+ float *f = dest;
+ float **in = (float **)sources;
+ int i;
+
+ if(count <= 0) return;
+
+ *f = 0.0f;
+
+ if (weights) {
+ for(i = 0; i < count; ++i) {
+ *f += *in[i] * weights[i];
+ }
+ }
+ else {
+ for(i = 0; i < count; ++i) {
+ *f += *in[i];
+ }
+ }
}
+static void layerInterp_shapekey(void **sources, float *weights,
+ float *UNUSED(sub_weights), int count, void *dest)
+{
+ float *co = dest;
+ float **in = (float **)sources;
+ int i;
+
+ if(count <= 0) return;
+ zero_v3(co);
+
+ if (weights) {
+ for(i = 0; i < count; ++i) {
+ madd_v3_v3fl(co, in[i], weights[i]);
+ }
+ }
+ else {
+ for(i = 0; i < count; ++i) {
+ add_v3_v3(co, in[i]);
+ }
+ }
+}
static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
/* 0: CD_MVERT */
@@ -829,14 +993,14 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
/* 8: CD_NORMAL */
/* 3 floats per normal vector */
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
- /* 9: CD_FLAGS */
- {sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 9: CD_POLYINDEX */
+ {sizeof(int), "MIntProperty", 1, NULL, NULL, NULL, NULL, NULL, NULL},
/* 10: CD_PROP_FLT */
- {sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
+ {sizeof(MFloatProperty), "MFloatProperty",1,"Float", layerCopy_propFloat,NULL,NULL,NULL},
/* 11: CD_PROP_INT */
- {sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
+ {sizeof(MIntProperty), "MIntProperty",1,"Int",layerCopy_propInt,NULL,NULL,NULL},
/* 12: CD_PROP_STR */
- {sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
+ {sizeof(MStringProperty), "MStringProperty",1,"String",layerCopy_propString,NULL,NULL,NULL},
/* 13: CD_ORIGSPACE */
{sizeof(OrigSpaceFace), "OrigSpaceFace", 1, "UVMap", layerCopy_origspace_face, NULL,
layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
@@ -845,15 +1009,20 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
/* 15: CD_MTEXPOLY */
{sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
/* 16: CD_MLOOPUV */
- {sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL},
+ {sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL,
+ layerEqual_mloopuv, layerMultiply_mloopuv, layerInitMinMax_mloopuv,
+ layerAdd_mloopuv, layerDoMinMax_mloopuv, layerCopyValue_mloopuv},
/* 17: CD_MLOOPCOL */
- {sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol},
+ {sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL,
+ layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol,
+ layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
/* 18: CD_TANGENT */
{sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
/* 19: CD_MDISPS */
{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
- layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps,
- layerFilesize_mdisps, layerValidate_mdisps},
+ layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL,
+ layerRead_mdisps, layerWrite_mdisps, layerFilesize_mdisps, layerValidate_mdisps},
/* 20: CD_WEIGHT_MCOL */
{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
@@ -867,6 +1036,30 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
/* 24: CD_RECAST */
{sizeof(MRecast), "MRecast", 1,"Recast",NULL,NULL,NULL,NULL}
+
+#ifdef USE_BMESH_FORWARD_COMPAT
+ ,
+/* BMESH ONLY */
+ /* 25: CD_MPOLY */
+ {sizeof(MPoly), "MPoly", 1, "NGon Face", NULL, NULL, NULL, NULL, NULL},
+ /* 26: CD_MLOOP */
+ {sizeof(MLoop), "MLoop", 1, "NGon Face-Vertex", NULL, NULL, NULL, NULL, NULL},
+ /* 27: CD_SHAPE_KEYINDEX */
+ {sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 28: CD_SHAPEKEY */
+ {sizeof(float)*3, "", 0, "ShapeKey", NULL, NULL, layerInterp_shapekey},
+ /* 29: CD_BWEIGHT */
+ {sizeof(float), "", 0, "BevelWeight", NULL, NULL, layerInterp_bweight},
+ /* 30: CD_CREASE */
+ {sizeof(float), "", 0, "SubSurfCrease", NULL, NULL, layerInterp_bweight},
+ /* 31: CD_WEIGHT_MLOOPCOL */
+ {sizeof(MLoopCol), "MLoopCol", 1, "WeightLoopCol", NULL, NULL, layerInterp_mloopcol, NULL,
+ layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol,
+ layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
+/* END BMESH ONLY */
+
+#endif /* USE_BMESH_FORWARD_COMPAT */
+
};
static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
@@ -875,6 +1068,13 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
/* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco",
/* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps",
/* 20-24 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDMRecast"
+
+#ifdef USE_BMESH_FORWARD_COMPAT
+ ,
+ /* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight",
+ /* 30-31 */ "CDSubSurfCrease", "CDWeightLoopCol"
+
+#endif /* USE_BMESH_FORWARD_COMPAT */
};
const CustomDataMask CD_MASK_BAREMESH =
@@ -896,7 +1096,6 @@ const CustomDataMask CD_MASK_FACECORNERS =
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
CD_MASK_MLOOPCOL;
-
static const LayerTypeInfo *layerType_getInfo(int type)
{
if(type < 0 || type >= CD_NUMTYPES) return NULL;
@@ -917,6 +1116,25 @@ static void customData_update_offsets(CustomData *data);
static CustomDataLayer *customData_add_layer__internal(CustomData *data,
int type, int alloctype, void *layerdata, int totelem, const char *name);
+void CustomData_update_typemap(CustomData *data)
+{
+ int i, lasttype = -1;
+
+ /* since we cant do in a pre-processor do here as an assert */
+ BLI_assert(sizeof(data->typemap) / sizeof(int) >= CD_NUMTYPES);
+
+ for (i=0; i<CD_NUMTYPES; i++) {
+ data->typemap[i] = -1;
+ }
+
+ for (i=0; i<data->totlayer; i++) {
+ if (data->layers[i].type != lasttype) {
+ data->typemap[data->layers[i].type] = i;
+ }
+ lasttype = data->layers[i].type;
+ }
+}
+
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
CustomDataMask mask, int alloctype, int totelem)
{
@@ -943,7 +1161,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
number++;
if(lastflag & CD_FLAG_NOCOPY) continue;
- else if(!((int)mask & (int)(1 << (int)type))) continue;
+ else if(!(mask & CD_TYPE_AS_MASK(type))) continue;
else if(number < CustomData_number_of_layers(dest, type)) continue;
if((alloctype == CD_ASSIGN) && (lastflag & CD_FLAG_NOFREE))
@@ -961,6 +1179,8 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
newlayer->flag |= lastflag & (CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY);
}
}
+
+ CustomData_update_typemap(dest);
}
void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
@@ -1025,6 +1245,7 @@ static void customData_update_offsets(CustomData *data)
}
data->totsize = offset;
+ CustomData_update_typemap(data);
}
int CustomData_get_layer_index(const CustomData *data, int type)
@@ -1038,6 +1259,17 @@ int CustomData_get_layer_index(const CustomData *data, int type)
return -1;
}
+int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n)
+{
+ int i = CustomData_get_layer_index(data, type);
+
+ if (i != -1) {
+ i = (data->layers[i + n].type == type) ? (i + n) : (-1);
+ }
+
+ return i;
+}
+
int CustomData_get_named_layer_index(const CustomData *data, int type, const char *name)
{
int i;
@@ -1051,11 +1283,12 @@ int CustomData_get_named_layer_index(const CustomData *data, int type, const cha
int CustomData_get_active_layer_index(const CustomData *data, int type)
{
- int i;
+ if (!data->totlayer)
+ return -1;
- for(i=0; i < data->totlayer; ++i)
- if(data->layers[i].type == type)
- return i + data->layers[i].active;
+ if (data->typemap[type] != -1) {
+ return data->typemap[type] + data->layers[data->typemap[type]].active;
+ }
return -1;
}
@@ -1284,6 +1517,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
data->layers[index].type = type;
data->layers[index].flag = flag;
data->layers[index].data = newlayerdata;
+
if(name || (name=typeInfo->defaultname)) {
BLI_strncpy(data->layers[index].name, name, 32);
CustomData_set_layer_unique_name(data, index);
@@ -1316,6 +1550,7 @@ void *CustomData_add_layer(CustomData *data, int type, int alloctype,
layer = customData_add_layer__internal(data, type, alloctype, layerdata,
totelem, typeInfo->defaultname);
+ CustomData_update_typemap(data);
if(layer)
return layer->data;
@@ -1331,6 +1566,7 @@ void *CustomData_add_layer_named(CustomData *data, int type, int alloctype,
layer = customData_add_layer__internal(data, type, alloctype, layerdata,
totelem, name);
+ CustomData_update_typemap(data);
if(layer)
return layer->data;
@@ -1369,6 +1605,7 @@ int CustomData_free_layer(CustomData *data, int type, int totelem, int index)
customData_resize(data, -CUSTOMDATA_GROW);
customData_update_offsets(data);
+ CustomData_update_typemap(data);
return 1;
}
@@ -1404,7 +1641,7 @@ int CustomData_number_of_layers(const CustomData *data, int type)
return number;
}
-void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
+void *CustomData_duplicate_referenced_layer(struct CustomData *data, const int type, const int totelem)
{
CustomDataLayer *layer;
int layer_index;
@@ -1416,7 +1653,20 @@ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
layer = &data->layers[layer_index];
if (layer->flag & CD_FLAG_NOFREE) {
- layer->data = MEM_dupallocN(layer->data);
+ /* MEM_dupallocN won’t work in case of complex layers, like e.g.
+ * CD_MDEFORMVERT, which has pointers to allocated data...
+ * So in case a custom copy function is defined, use it!
+ */
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
+
+ if(typeInfo->copy) {
+ char *dest_data = MEM_mallocN(typeInfo->size * totelem, "CD duplicate ref layer");
+ typeInfo->copy(layer->data, dest_data, totelem);
+ layer->data = dest_data;
+ }
+ else
+ layer->data = MEM_dupallocN(layer->data);
+
layer->flag &= ~CD_FLAG_NOFREE;
}
@@ -1424,7 +1674,7 @@ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
}
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, const char *name)
+ const int type, const char *name, const int totelem)
{
CustomDataLayer *layer;
int layer_index;
@@ -1436,13 +1686,40 @@ void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
layer = &data->layers[layer_index];
if (layer->flag & CD_FLAG_NOFREE) {
- layer->data = MEM_dupallocN(layer->data);
+ /* MEM_dupallocN won’t work in case of complex layers, like e.g.
+ * CD_MDEFORMVERT, which has pointers to allocated data...
+ * So in case a custom copy function is defined, use it!
+ */
+ const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
+
+ if(typeInfo->copy) {
+ char *dest_data = MEM_mallocN(typeInfo->size * totelem, "CD duplicate ref layer");
+ typeInfo->copy(layer->data, dest_data, totelem);
+ layer->data = dest_data;
+ }
+ else
+ layer->data = MEM_dupallocN(layer->data);
+
layer->flag &= ~CD_FLAG_NOFREE;
}
return layer->data;
}
+int CustomData_is_referenced_layer(struct CustomData *data, int type)
+{
+ CustomDataLayer *layer;
+ int layer_index;
+
+ /* get the layer index of the first layer of type */
+ layer_index = CustomData_get_active_layer_index(data, type);
+ if(layer_index < 0) return 0;
+
+ layer = &data->layers[layer_index];
+
+ return (layer->flag & CD_FLAG_NOFREE) != 0;
+}
+
void CustomData_free_temporary(CustomData *data, int totelem)
{
CustomDataLayer *layer;
@@ -1469,15 +1746,25 @@ void CustomData_free_temporary(CustomData *data, int totelem)
}
void CustomData_set_only_copy(const struct CustomData *data,
- CustomDataMask mask)
+ CustomDataMask mask)
{
int i;
for(i = 0; i < data->totlayer; ++i)
- if(!((int)mask & (int)(1 << (int)data->layers[i].type)))
+ if(!(mask & CD_TYPE_AS_MASK(data->layers[i].type)))
data->layers[i].flag |= CD_FLAG_NOCOPY;
}
+void CustomData_copy_elements(int type, void *source, void *dest, int count)
+{
+ const LayerTypeInfo *typeInfo = layerType_getInfo(type);
+
+ if (typeInfo->copy)
+ typeInfo->copy(source, dest, count);
+ else
+ memcpy(dest, source, typeInfo->size*count);
+}
+
void CustomData_copy_data(const CustomData *source, CustomData *dest,
int source_index, int dest_index, int count)
{
@@ -1509,7 +1796,14 @@ void CustomData_copy_data(const CustomData *source, CustomData *dest,
src_offset = source_index * typeInfo->size;
dest_offset = dest_index * typeInfo->size;
-
+
+ if (!src_data || !dest_data) {
+ printf("%s: warning null data for %s type (%p --> %p), skipping\n",
+ __func__, layerType_getName(source->layers[src_i].type),
+ (void *)src_data, (void *)dest_data);
+ continue;
+ }
+
if(typeInfo->copy)
typeInfo->copy(src_data + src_offset,
dest_data + dest_offset,
@@ -1637,6 +1931,19 @@ void *CustomData_get(const CustomData *data, int index, int type)
return (char *)data->layers[layer_index].data + offset;
}
+void *CustomData_get_n(const CustomData *data, int type, int index, int n)
+{
+ int layer_index;
+ int offset;
+
+ /* get the layer index of the first layer of type */
+ layer_index = data->typemap[type];
+ if(layer_index < 0) return NULL;
+
+ offset = layerType_getInfo(type)->size * index;
+ return (char *)data->layers[layer_index+n].data + offset;
+}
+
void *CustomData_get_layer(const CustomData *data, int type)
{
/* get the layer index of the active layer of type */
@@ -1649,10 +1956,10 @@ void *CustomData_get_layer(const CustomData *data, int type)
void *CustomData_get_layer_n(const CustomData *data, int type, int n)
{
/* get the layer index of the active layer of type */
- int layer_index = CustomData_get_layer_index(data, type);
+ int layer_index = CustomData_get_layer_index_n(data, type, n);
if(layer_index < 0) return NULL;
- return data->layers[layer_index+n].data;
+ return data->layers[layer_index].data;
}
void *CustomData_get_layer_named(const struct CustomData *data, int type,
@@ -1664,6 +1971,20 @@ void *CustomData_get_layer_named(const struct CustomData *data, int type,
return data->layers[layer_index].data;
}
+
+int CustomData_set_layer_name(const CustomData *data, int type, int n, const char *name)
+{
+ /* get the layer index of the first layer of type */
+ int layer_index = CustomData_get_layer_index_n(data, type, n);
+
+ if(layer_index < 0) return 0;
+ if (!name) return 0;
+
+ strcpy(data->layers[layer_index].name, name);
+
+ return 1;
+}
+
void *CustomData_set_layer(const CustomData *data, int type, void *ptr)
{
/* get the layer index of the first layer of type */
@@ -1679,10 +2000,10 @@ void *CustomData_set_layer(const CustomData *data, int type, void *ptr)
void *CustomData_set_layer_n(const struct CustomData *data, int type, int n, void *ptr)
{
/* get the layer index of the first layer of type */
- int layer_index = CustomData_get_layer_index(data, type);
+ int layer_index = CustomData_get_layer_index_n(data, type, n);
if(layer_index < 0) return NULL;
- data->layers[layer_index+n].data = ptr;
+ data->layers[layer_index].data = ptr;
return ptr;
}
@@ -1810,10 +2131,10 @@ void *CustomData_em_get_n(const CustomData *data, void *block, int type, int n)
int layer_index;
/* get the layer index of the first layer of type */
- layer_index = CustomData_get_layer_index(data, type);
+ layer_index = CustomData_get_layer_index_n(data, type, n);
if(layer_index < 0) return NULL;
- return (char *)block + data->layers[layer_index+n].offset;
+ return (char *)block + data->layers[layer_index].offset;
}
void CustomData_em_set(CustomData *data, void *block, int type, void *source)
@@ -1995,7 +2316,8 @@ void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *l
CustomData_add_layer(ldata, CD_MLOOPCOL, CD_CALLOC, &(fdata->layers[i].name), 0);
}
}
-void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata, int total){
+void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata, int total)
+{
int i;
for(i=0; i < pdata->totlayer; i++){
if(pdata->layers[i].type == CD_MTEXPOLY)
@@ -2008,7 +2330,8 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData
}
-void CustomData_bmesh_init_pool(CustomData *data, int allocsize){
+void CustomData_bmesh_init_pool(CustomData *data, int allocsize)
+{
if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, FALSE, FALSE);
}
@@ -2113,6 +2436,15 @@ void *CustomData_bmesh_get_n(const CustomData *data, void *block, int type, int
return (char *)block + data->layers[layer_index+n].offset;
}
+/*gets from the layer at physical index n, note: doesn't check type.*/
+void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n)
+{
+ if(n < 0 || n >= data->totlayer) return NULL;
+
+ return (char *)block + data->layers[n].offset;
+}
+
+
void CustomData_bmesh_set(const CustomData *data, void *block, int type, void *source)
{
void *dest = CustomData_bmesh_get(data, block, type);
@@ -2139,6 +2471,19 @@ void CustomData_bmesh_set_n(CustomData *data, void *block, int type, int n, void
memcpy(dest, source, typeInfo->size);
}
+void CustomData_bmesh_set_layer_n(CustomData *data, void *block, int n, void *source)
+{
+ void *dest = CustomData_bmesh_get_layer_n(data, block, n);
+ const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
+
+ if(!dest) return;
+
+ if(typeInfo->copy)
+ typeInfo->copy(source, dest, 1);
+ else
+ memcpy(dest, source, typeInfo->size);
+}
+
void CustomData_bmesh_interp(CustomData *data, void **src_blocks, float *weights,
float *sub_weights, int count, void *dest_block)
{
@@ -2184,6 +2529,7 @@ void CustomData_bmesh_set_default(CustomData *data, void **block)
if(typeInfo->set_default)
typeInfo->set_default((char*)*block + offset, 1);
+ else memset((char*)*block + offset, 0, typeInfo->size);
}
}
@@ -2413,7 +2759,7 @@ void CustomData_external_reload(CustomData *data, ID *UNUSED(id), CustomDataMask
layer = &data->layers[i];
typeInfo = layerType_getInfo(layer->type);
- if(!(mask & (1<<layer->type)));
+ if(!(mask & CD_TYPE_AS_MASK(layer->type)));
else if((layer->flag & CD_FLAG_EXTERNAL) && (layer->flag & CD_FLAG_IN_MEMORY)) {
if(typeInfo->free)
typeInfo->free(layer->data, totelem, typeInfo->size);
@@ -2439,7 +2785,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
layer = &data->layers[i];
typeInfo = layerType_getInfo(layer->type);
- if(!(mask & (1<<layer->type)));
+ if(!(mask & CD_TYPE_AS_MASK(layer->type)));
else if(layer->flag & CD_FLAG_IN_MEMORY);
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->read)
update= 1;
@@ -2460,7 +2806,7 @@ void CustomData_external_read(CustomData *data, ID *id, CustomDataMask mask, int
layer = &data->layers[i];
typeInfo = layerType_getInfo(layer->type);
- if(!(mask & (1<<layer->type)));
+ if(!(mask & CD_TYPE_AS_MASK(layer->type)));
else if(layer->flag & CD_FLAG_IN_MEMORY);
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->read) {
blay= cdf_layer_find(cdf, layer->type, layer->name);
@@ -2499,7 +2845,7 @@ void CustomData_external_write(CustomData *data, ID *id, CustomDataMask mask, in
layer = &data->layers[i];
typeInfo = layerType_getInfo(layer->type);
- if(!(mask & (1<<layer->type)));
+ if(!(mask & CD_TYPE_AS_MASK(layer->type)));
else if((layer->flag & CD_FLAG_EXTERNAL) && typeInfo->write)
update= 1;
}
@@ -2613,7 +2959,7 @@ void CustomData_external_remove(CustomData *data, ID *id, int type, int totelem)
if(layer->flag & CD_FLAG_EXTERNAL) {
if(!(layer->flag & CD_FLAG_IN_MEMORY))
- CustomData_external_read(data, id, (1<<layer->type), totelem);
+ CustomData_external_read(data, id, CD_TYPE_AS_MASK(layer->type), totelem);
layer->flag &= ~CD_FLAG_EXTERNAL;
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 1f09d98d697..6fb4164d6c6 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -161,33 +161,87 @@ void defvert_sync_mapped(MDeformVert *dvert_dst, const MDeformVert *dvert_src,
}
/* be sure all flip_map values are valid */
-void defvert_remap(MDeformVert *dvert, int *map)
+void defvert_remap(MDeformVert *dvert, int *map, const int map_len)
{
- MDeformWeight *dw;
- int i;
- for (i=0, dw=dvert->dw; i<dvert->totweight; i++, dw++) {
- dw->def_nr= map[dw->def_nr];
+ MDeformWeight *dw= dvert->dw;
+ unsigned int i;
+ for (i= dvert->totweight; i != 0; i--, dw++) {
+ if (dw->def_nr < map_len) {
+ dw->def_nr= map[dw->def_nr];
+
+ /* just incase */
+ BLI_assert(dw->def_nr >= 0);
+ }
}
}
void defvert_normalize(MDeformVert *dvert)
{
- if (dvert->totweight<=0) {
+ if (dvert->totweight <= 0) {
/* nothing */
}
else if (dvert->totweight==1) {
dvert->dw[0].weight= 1.0f;
}
else {
- int i;
- float tot= 0.0f;
MDeformWeight *dw;
- for (i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++)
- tot += dw->weight;
+ unsigned int i;
+ float tot_weight= 0.0f;
+
+ for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
+ tot_weight += dw->weight;
+ }
+
+ if (tot_weight > 0.0f) {
+ float scalar= 1.0f / tot_weight;
+ for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
+ dw->weight *= scalar;
+
+ /* incase of division errors with very low weights */
+ CLAMP(dw->weight, 0.0f, 1.0f);
+ }
+ }
+ }
+}
+
+void defvert_normalize_lock(MDeformVert *dvert, const int def_nr_lock)
+{
+ if (dvert->totweight <= 0) {
+ /* nothing */
+ }
+ else if (dvert->totweight==1) {
+ dvert->dw[0].weight= 1.0f;
+ }
+ else {
+ MDeformWeight *dw_lock = NULL;
+ MDeformWeight *dw;
+ unsigned int i;
+ float tot_weight= 0.0f;
+ float lock_iweight= 1.0f;
- if (tot > 0.0f) {
- for (i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++)
- dw->weight /= tot;
+ for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
+ if(dw->def_nr != def_nr_lock) {
+ tot_weight += dw->weight;
+ }
+ else {
+ dw_lock= dw;
+ lock_iweight = (1.0f - dw_lock->weight);
+ CLAMP(lock_iweight, 0.0f, 1.0f);
+ }
+ }
+
+ if (tot_weight > 0.0f) {
+ /* paranoid, should be 1.0 but incase of float error clamp anyway */
+
+ float scalar= (1.0f / tot_weight) * lock_iweight;
+ for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
+ if(dw != dw_lock) {
+ dw->weight *= scalar;
+
+ /* incase of division errors with very low weights */
+ CLAMP(dw->weight, 0.0f, 1.0f);
+ }
+ }
}
}
}
@@ -198,8 +252,10 @@ void defvert_flip(MDeformVert *dvert, const int *flip_map, const int flip_map_le
int i;
for (dw= dvert->dw, i=0; i<dvert->totweight; dw++, i++) {
- if ((dw->def_nr < flip_map_len) && (flip_map[dw->def_nr] >= 0)) {
- dw->def_nr= flip_map[dw->def_nr];
+ if (dw->def_nr < flip_map_len) {
+ if (flip_map[dw->def_nr] >= 0) {
+ dw->def_nr= flip_map[dw->def_nr];
+ }
}
}
}
@@ -223,7 +279,7 @@ bDeformGroup *defgroup_find_name(Object *ob, const char *name)
int defgroup_name_index(Object *ob, const char *name)
{
/* Return the location of the named deform group within the list of
- * deform groups. This function is a combination of defgroup_find_index and
+ * deform groups. This function is a combination of BLI_findlink and
* defgroup_find_name. The other two could be called instead, but that
* require looping over the vertexgroups twice.
*/
@@ -240,60 +296,20 @@ int defgroup_name_index(Object *ob, const char *name)
return -1;
}
-int defgroup_find_index(Object *ob, bDeformGroup *dg)
-{
- /* Fetch the location of this deform group
- * within the linked list of deform groups.
- * (this number is stored in the deform
- * weights of the deform verts to link them
- * to this deform group).
- *
- * note: this is zero based, ob->actdef starts at 1.
- */
-
- bDeformGroup *eg;
- int def_nr;
-
- eg = ob->defbase.first;
- def_nr = 0;
-
- /* loop through all deform groups */
- while (eg != NULL) {
-
- /* if the current deform group is
- * the one we are after, return
- * def_nr
- */
- if (eg == dg) {
- break;
- }
- ++def_nr;
- eg = eg->next;
- }
-
- /* if there was no deform group found then
- * return -1 (should set up a nice symbolic
- * constant for this)
- */
- if (eg == NULL) return -1;
-
- return def_nr;
-}
-
/* note, must be freed */
int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
{
- int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
+ int defbase_tot= *flip_map_len= BLI_countlist(&ob->defbase);
- if (totdg==0) {
+ if (defbase_tot==0) {
return NULL;
}
else {
bDeformGroup *dg;
char name[sizeof(dg->name)];
- int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
+ int i, flip_num, *map= MEM_mallocN(defbase_tot * sizeof(int), __func__);
- for (i=0; i < totdg; i++) {
+ for (i=0; i < defbase_tot; i++) {
map[i]= -1;
}
@@ -321,17 +337,17 @@ int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
/* note, must be freed */
int *defgroup_flip_map_single(Object *ob, int *flip_map_len, int use_default, int defgroup)
{
- int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
+ int defbase_tot= *flip_map_len= BLI_countlist(&ob->defbase);
- if (totdg==0) {
+ if (defbase_tot==0) {
return NULL;
}
else {
bDeformGroup *dg;
char name[sizeof(dg->name)];
- int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
+ int i, flip_num, *map= MEM_mallocN(defbase_tot * sizeof(int), __func__);
- for (i=0; i < totdg; i++) {
+ for (i=0; i < defbase_tot; i++) {
if (use_default) map[i]= i;
else map[i]= -1;
}
@@ -410,11 +426,15 @@ void flip_side_name(char name[MAX_VGROUP_NAME], const char from_name[MAX_VGROUP_
char number[MAX_VGROUP_NAME]= ""; /* The number extension string */
char *index=NULL;
- len= BLI_strnlen(from_name, MAX_VGROUP_NAME);
- if (len < 3) return; // we don't do names like .R or .L
-
+ /* always copy the name, since this can be called with an uninitialized string */
BLI_strncpy(name, from_name, MAX_VGROUP_NAME);
+ len= BLI_strnlen(from_name, MAX_VGROUP_NAME);
+ if (len < 3) {
+ /* we don't do names like .R or .L */
+ return;
+ }
+
/* We first check the case with a .### extension, let's find the last period */
if (isdigit(name[len-1])) {
index= strrchr(name, '.'); // last occurrence
@@ -519,6 +539,12 @@ float defvert_find_weight(const struct MDeformVert *dvert, const int defgroup)
return dw ? dw->weight : 0.0f;
}
+/* take care with this the rationale is:
+ * - if the object has no vertex group. act like vertex group isnt set and return 1.0,
+ * - if the vertex group exists but the 'defgroup' isnt found on this vertex, _still_ return 0.0
+ *
+ * This is a bit confusing, just saves some checks from the caller.
+ */
float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup)
{
if (defgroup == -1 || dvert == NULL)
@@ -532,9 +558,9 @@ MDeformWeight *defvert_find_index(const MDeformVert *dvert, const int defgroup)
{
if (dvert && defgroup >= 0) {
MDeformWeight *dw = dvert->dw;
- int i;
+ unsigned int i;
- for (i=dvert->totweight; i>0; i--, dw++) {
+ for (i= dvert->totweight; i != 0; i--, dw++) {
if (dw->def_nr == defgroup) {
return dw;
}
@@ -574,46 +600,68 @@ MDeformWeight *defvert_verify_index(MDeformVert *dvert, const int defgroup)
return dw_new;
}
-/* Removes the given vertex from the vertex group, specified either by its defgrp_idx,
- * or directly by its MDeformWeight pointer, if dw is not NULL.
- * WARNING: This function frees the given MDeformWeight, do not use it afterward! */
-void defvert_remove_index(MDeformVert *dvert, int defgroup, MDeformWeight *dw)
+/* TODO. merge with code above! */
+
+/* Adds the given vertex to the specified vertex group, with given weight.
+ * warning, this does NOT check for existign, assume caller already knows its not there */
+void defvert_add_index_notest(MDeformVert *dvert, int defgroup, const float weight)
{
MDeformWeight *dw_new;
- int i;
- /* Get index of removed MDeformWeight. */
- if (dw == NULL) {
- dw = dvert->dw;
- for (i = dvert->totweight; i > 0; i--, dw++) {
- if (dw->def_nr == defgroup)
- break;
- }
- i--;
+ /* do this check always, this function is used to check for it */
+ if (!dvert || defgroup < 0)
+ return;
+
+ dw_new = MEM_callocN(sizeof(MDeformWeight)*(dvert->totweight+1), "defvert_add_to group, new deformWeight");
+ if(dvert->dw) {
+ memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*dvert->totweight);
+ MEM_freeN(dvert->dw);
}
- else {
- i = dw - dvert->dw;
+ dvert->dw = dw_new;
+ dw_new += dvert->totweight;
+ dw_new->weight = weight;
+ dw_new->def_nr = defgroup;
+ dvert->totweight++;
+}
+
+
+/* Removes the given vertex from the vertex group.
+ * WARNING: This function frees the given MDeformWeight, do not use it afterward! */
+void defvert_remove_group(MDeformVert *dvert, MDeformWeight *dw)
+{
+ if (dvert && dw) {
+ MDeformWeight *dw_new;
+ int i = dw - dvert->dw;
+
/* Security check! */
- if(i < 0 || i >= dvert->totweight)
+ if(i < 0 || i >= dvert->totweight) {
return;
- }
+ }
- dvert->totweight--;
- /* If there are still other deform weights attached to this vert then remove
- * this deform weight, and reshuffle the others.
- */
- if (dvert->totweight) {
- dw_new = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), __func__);
- if (dvert->dw){
- memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i);
- memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
+ dvert->totweight--;
+ /* If there are still other deform weights attached to this vert then remove
+ * this deform weight, and reshuffle the others.
+ */
+ if (dvert->totweight) {
+ dw_new = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), __func__);
+ if (dvert->dw) {
+#if 1 /* since we dont care about order, swap this with the last, save a memcpy */
+ if (i != dvert->totweight) {
+ dvert->dw[i]= dvert->dw[dvert->totweight];
+ }
+ memcpy(dw_new, dvert->dw, sizeof(MDeformWeight) * dvert->totweight);
+ MEM_freeN(dvert->dw);
+#else
+ memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i);
+ memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
+#endif
+ }
+ dvert->dw = dw_new;
+ }
+ else {
+ /* If there are no other deform weights left then just remove this one. */
MEM_freeN(dvert->dw);
+ dvert->dw = NULL;
}
- dvert->dw = dw_new;
- }
- else {
- /* If there are no other deform weights left then just remove this one. */
- MEM_freeN(dvert->dw);
- dvert->dw = NULL;
}
}
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 4eaf49dc679..3cb2f8ce738 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -269,7 +269,8 @@ DagNode * pop_queue(DagNodeQueue *queue)
}
}
-void *pop_ob_queue(struct DagNodeQueue *queue) {
+void *pop_ob_queue(struct DagNodeQueue *queue)
+{
return(pop_queue(queue)->ob);
}
@@ -278,7 +279,8 @@ DagNode * get_top_node_queue(DagNodeQueue *queue)
return queue->first->node;
}
-int queue_count(struct DagNodeQueue *queue){
+int queue_count(struct DagNodeQueue *queue)
+{
return queue->count;
}
@@ -647,16 +649,21 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
continue;
/* special case for camera tracking -- it doesn't use targets to define relations */
- if(ELEM(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER)) {
+ if(ELEM3(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER, CONSTRAINT_TYPE_OBJECTSOLVER)) {
+ int depends_on_camera= 0;
+
if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
bFollowTrackConstraint *data= (bFollowTrackConstraint *)con->data;
- if((data->clip || data->flag&FOLLOWTRACK_ACTIVECLIP) && data->track[0]) {
- if(scene->camera) {
- node2 = dag_get_node(dag, scene->camera);
- dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB, cti->name);
- }
- }
+ if((data->clip || data->flag&FOLLOWTRACK_ACTIVECLIP) && data->track[0])
+ depends_on_camera= 1;
+ }
+ else if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER)
+ depends_on_camera= 1;
+
+ if(depends_on_camera && scene->camera) {
+ node2 = dag_get_node(dag, scene->camera);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB, cti->name);
}
dag_add_relation(dag,scenenode,node,DAG_RL_SCENE, "Scene Relation");
@@ -1155,7 +1162,8 @@ void graph_bfs(void)
queue_delete(nqueue);
}
-int pre_and_post_BFS(DagForest *dag, short mask, graph_action_func pre_func, graph_action_func post_func, void **data) {
+int pre_and_post_BFS(DagForest *dag, short mask, graph_action_func pre_func, graph_action_func post_func, void **data)
+{
DagNode *node;
node = dag->DagNode.first;
@@ -1341,7 +1349,8 @@ DagNodeQueue * graph_dfs(void)
}
/* unused */
-int pre_and_post_DFS(DagForest *dag, short mask, graph_action_func pre_func, graph_action_func post_func, void **data) {
+int pre_and_post_DFS(DagForest *dag, short mask, graph_action_func pre_func, graph_action_func post_func, void **data)
+{
DagNode *node;
node = dag->DagNode.first;
@@ -1552,7 +1561,8 @@ struct DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob)
}
/* unused */
-short are_obs_related(struct DagForest *dag, void *ob1, void *ob2) {
+short are_obs_related(struct DagForest *dag, void *ob1, void *ob2)
+{
DagNode * node;
DagAdjList *itA;
@@ -1568,7 +1578,8 @@ short are_obs_related(struct DagForest *dag, void *ob1, void *ob2) {
return DAG_NO_RELATION;
}
-int is_acyclic( DagForest *dag) {
+int is_acyclic( DagForest *dag)
+{
return dag->is_acyclic;
}
@@ -1704,7 +1715,7 @@ static void scene_sort_groups(Main *bmain, Scene *sce)
/* sort the base list on dependency order */
void DAG_scene_sort(Main *bmain, Scene *sce)
{
- DagNode *node;
+ DagNode *node, *rootnode;
DagNodeQueue *nqueue;
DagAdjList *itA;
int time;
@@ -1726,11 +1737,10 @@ void DAG_scene_sort(Main *bmain, Scene *sce)
time = 1;
- node = sce->theDag->DagNode.first;
-
- node->color = DAG_GRAY;
+ rootnode = sce->theDag->DagNode.first;
+ rootnode->color = DAG_GRAY;
time++;
- push_stack(nqueue,node);
+ push_stack(nqueue,rootnode);
while(nqueue->count) {
@@ -2160,7 +2170,7 @@ static void dag_object_time_update_flags(Object *ob)
if (cti) {
/* special case for camera tracking -- it doesn't use targets to define relations */
- if(ELEM(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER)) {
+ if(ELEM3(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER, CONSTRAINT_TYPE_OBJECTSOLVER)) {
ob->recalc |= OB_RECALC_OB;
}
else if (cti->get_constraint_targets) {
@@ -2554,7 +2564,9 @@ static void dag_id_flush_update(Scene *sce, ID *id)
bConstraint *con;
for (con = obt->constraints.first; con; con=con->next) {
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
- if(ELEM(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER)) {
+ if(ELEM3(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_CAMERASOLVER,
+ CONSTRAINT_TYPE_OBJECTSOLVER))
+ {
obt->recalc |= OB_RECALC_OB;
break;
}
@@ -2848,10 +2860,8 @@ void DAG_pose_sort(Object *ob)
for(node = dag->DagNode.first; node; node= node->next)
node->color = DAG_WHITE;
- node = dag->DagNode.first;
-
- node->color = DAG_GRAY;
- push_stack(nqueue, node);
+ rootnode->color = DAG_GRAY;
+ push_stack(nqueue, rootnode);
while(nqueue->count) {
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 9a5bbf8e6b8..567cc5ce07f 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -24,6 +24,7 @@
#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_constraint_types.h"
#include "DNA_dynamicpaint_types.h"
#include "DNA_group_types.h" /*GroupObject*/
#include "DNA_material_types.h"
@@ -39,6 +40,7 @@
#include "BKE_bvhutils.h" /* bvh tree */
#include "BKE_blender.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_colortools.h"
@@ -453,15 +455,35 @@ static void object_cacheIgnoreClear(Object *ob, int state)
static void subframe_updateObject(Scene *scene, Object *ob, int flags, float frame)
{
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
+ bConstraint *con;
/* if other is dynamic paint canvas, dont update */
if (pmd && pmd->canvas)
return;
- /* if object has parent, update it too */
- if ((flags & UPDATE_PARENTS) && ob->parent) subframe_updateObject(scene, ob->parent, 0, frame);
- if ((flags & UPDATE_PARENTS) && ob->track) subframe_updateObject(scene, ob->track, 0, frame);
-
+ /* if object has parents, update them too */
+ if (flags & UPDATE_PARENTS) {
+ if (ob->parent) subframe_updateObject(scene, ob->parent, 0, frame);
+ if (ob->track) subframe_updateObject(scene, ob->track, 0, frame);
+
+ /* also update constraint targets */
+ for (con = ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+
+ if (cti && cti->get_constraint_targets) {
+ bConstraintTarget *ct;
+ cti->get_constraint_targets(con, &targets);
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar)
+ subframe_updateObject(scene, ct->tar, 0, frame);
+ }
+ /* free temp targets */
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+ }
+ }
/* for curve following objects, parented curve has to be updated too */
if(ob->type==OB_CURVE) {
Curve *cu= ob->data;
@@ -488,8 +510,6 @@ static void scene_setSubframe(Scene *scene, float subframe)
scene->r.subframe = subframe;
}
-#define BRUSH_USES_VELOCITY (1<<0)
-
static int surface_getBrushFlags(DynamicPaintSurface *surface, Scene *scene)
{
Base *base = NULL;
@@ -2269,7 +2289,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
tPoint->quad = (isInside == 2) ? 1 : 0; /* quad or tri part*/
/* save vertex indexes */
- tPoint->v1 = mface[i].v1; /* (isInside == 2) ? mface[i].v1 : mface[i].v1; */ /* same! */
+ tPoint->v1 = mface[i].v1;
tPoint->v2 = (isInside == 2) ? mface[i].v3 : mface[i].v2;
tPoint->v3 = (isInside == 2) ? mface[i].v4 : mface[i].v3;
@@ -2349,7 +2369,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
tPoint->quad = tempPoints[ind].quad; // quad or tri
/* save vertex indexes */
- tPoint->v1 = (tPoint->quad) ? mface[i].v1 : mface[i].v1;
+ tPoint->v1 = mface[i].v1;
tPoint->v2 = (tPoint->quad) ? mface[i].v3 : mface[i].v2;
tPoint->v3 = (tPoint->quad) ? mface[i].v4 : mface[i].v3;
@@ -2379,10 +2399,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
}
}
- /* If any effect enabled, create surface effect / wet layer
- * neighbour lists. Processes possibly moving data. */
- if (surface_usesAdjData(surface)) {
-
+ /* Generate surface adjacency data. */
+ {
int i, cursor=0;
/* Create a temporary array of final indexes (before unassigned
@@ -2395,12 +2413,11 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
}
/* allocate memory */
sData->total_points = w*h;
- dynamicPaint_initAdjacencyData(surface, 0);
+ dynamicPaint_initAdjacencyData(surface, 1);
if (sData->adj_data) {
PaintAdjData *ed = sData->adj_data;
unsigned int n_pos = 0;
- //#pragma omp parallel for schedule(static)
for (ty = 0; ty < h; ty++)
{
int tx;
@@ -3198,7 +3215,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface,
/* hit data */
float hitCoord[3];
int hitFace = -1;
- short hitQuad;
+ short hitQuad = 0;
/* Supersampling factor */
if (samples > 1 && surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
@@ -3572,7 +3589,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
float radius = 0.0f;
float strength = 0.0f;
float velocity_val = 0.0f;
- int part_index;
+ int part_index= -1;
/*
* With predefined radius, there is no variation between particles.
@@ -3644,10 +3661,12 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
part_index = nearest[n].index;
/* If inside solid range and no disp depth required, no need to seek further */
- if (s_range < 0.0f)
- if (surface->type != MOD_DPAINT_SURFACE_T_DISPLACE &&
- surface->type != MOD_DPAINT_SURFACE_T_WAVE)
+ if ( (s_range < 0.0f) &&
+ (surface->type != MOD_DPAINT_SURFACE_T_DISPLACE) &&
+ (surface->type != MOD_DPAINT_SURFACE_T_WAVE))
+ {
break;
+ }
}
if (nearest) MEM_freeN(nearest);
@@ -3675,7 +3694,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
float depth = 0.0f;
/* apply velocity */
- if (brush->flags & MOD_DPAINT_USES_VELOCITY) {
+ if ((brush->flags & MOD_DPAINT_USES_VELOCITY) && (part_index != -1)) {
float velocity[3];
ParticleData *pa = psys->particles + part_index;
mul_v3_v3fl(velocity, pa->state.vel, particle_timestep);
@@ -3687,8 +3706,9 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
velocity_val = len_v3(velocity);
/* store brush velocity for smudge */
- if (surface->type == MOD_DPAINT_SURFACE_T_PAINT &&
- brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
+ if ( (surface->type == MOD_DPAINT_SURFACE_T_PAINT) &&
+ (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity))
+ {
copy_v3_v3(&bData->brush_velocity[index*4], velocity);
mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
bData->brush_velocity[index*4+3] = velocity_val;
@@ -3696,12 +3716,11 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
}
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
- paintColor[0] = brush->r;
- paintColor[1] = brush->g;
- paintColor[2] = brush->b;
+ copy_v3_v3(paintColor, &brush->r);
}
- else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
- surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ else if ( (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) ||
+ (surface->type == MOD_DPAINT_SURFACE_T_WAVE))
+ {
/* get displace depth */
disp_intersect = (1.0f - sqrtf(disp_intersect / radius)) * radius;
depth = (radius - disp_intersect) / bData->bNormal[index].normal_scale;
@@ -4623,7 +4642,7 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc
#pragma omp parallel for schedule(static)
for (index=0; index<sData->total_points; index++)
{
- float prev_point[3];
+ float prev_point[3] = {0.0f, 0.0f, 0.0f};
if (do_velocity_data && !new_bdata) {
copy_v3_v3(prev_point, bData->realCoord[bData->s_pos[index]].v);
}
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
new file mode 100644
index 00000000000..bb1d20f0187
--- /dev/null
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -0,0 +1,1294 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/editderivedmesh.c
+ * \ingroup bke
+ */
+
+#include "GL/glew.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_blenlib.h"
+#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_pbvh.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_global.h"
+#include "BKE_mesh.h"
+#include "BKE_paint.h"
+
+
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_curve_types.h" /* for Curve */
+
+#include "MEM_guardedalloc.h"
+
+#include "GPU_buffers.h"
+#include "GPU_draw.h"
+#include "GPU_extensions.h"
+#include "GPU_material.h"
+
+#include <string.h>
+#include <limits.h>
+#include <math.h>
+
+extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
+
+static void emDM_foreachMappedVert(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, float *co, float *no_f, short *no_s),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+ int i;
+
+ for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
+ if (emdm->vertexCos) {
+ func(userData, i, emdm->vertexCos[i], emdm->vertexNos[i], NULL);
+ }
+ else {
+ func(userData, i, eve->co, eve->no, NULL);
+ }
+ }
+}
+static void emDM_foreachMappedEdge(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, float *v0co, float *v1co),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditEdge *eed;
+ int i;
+
+ if (emdm->vertexCos) {
+ EditVert *eve;
+
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
+ func(userData, i, emdm->vertexCos[(int) eed->v1->tmp.l], emdm->vertexCos[(int) eed->v2->tmp.l]);
+ }
+ else {
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next)
+ func(userData, i, eed->v1->co, eed->v2->co);
+ }
+}
+
+static void emDM_drawMappedEdges(
+ DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditEdge *eed;
+ int i;
+
+ if (emdm->vertexCos) {
+ EditVert *eve;
+
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+ glBegin(GL_LINES);
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if (!setDrawOptions || setDrawOptions(userData, i)) {
+ glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
+ glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
+ }
+ }
+ glEnd();
+ }
+ else {
+ glBegin(GL_LINES);
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if (!setDrawOptions || setDrawOptions(userData, i)) {
+ glVertex3fv(eed->v1->co);
+ glVertex3fv(eed->v2->co);
+ }
+ }
+ glEnd();
+ }
+}
+static void emDM_drawEdges(
+ DerivedMesh *dm,
+ int UNUSED(drawLooseEdges),
+ int UNUSED(drawAllEdges))
+{
+ emDM_drawMappedEdges(dm, NULL, NULL);
+}
+
+static void emDM_drawMappedEdgesInterp(
+ DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index),
+ void (*setDrawInterpOptions)(void *userData, int index, float t),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditEdge *eed;
+ int i;
+
+ if (emdm->vertexCos) {
+ EditVert *eve;
+
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+ glBegin(GL_LINES);
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if (!setDrawOptions || setDrawOptions(userData, i)) {
+ setDrawInterpOptions(userData, i, 0.0);
+ glVertex3fv(emdm->vertexCos[(int) eed->v1->tmp.l]);
+ setDrawInterpOptions(userData, i, 1.0);
+ glVertex3fv(emdm->vertexCos[(int) eed->v2->tmp.l]);
+ }
+ }
+ glEnd();
+ }
+ else {
+ glBegin(GL_LINES);
+ for (i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+ if (!setDrawOptions || setDrawOptions(userData, i)) {
+ setDrawInterpOptions(userData, i, 0.0);
+ glVertex3fv(eed->v1->co);
+ setDrawInterpOptions(userData, i, 1.0);
+ glVertex3fv(eed->v2->co);
+ }
+ }
+ glEnd();
+ }
+}
+
+static void emDM_drawUVEdges(DerivedMesh *dm)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditFace *efa;
+ MTFace *tf;
+
+ glBegin(GL_LINES);
+ for (efa= emdm->em->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&emdm->em->fdata, efa->data, CD_MTFACE);
+
+ if (tf && !(efa->h)) {
+ glVertex2fv(tf->uv[0]);
+ glVertex2fv(tf->uv[1]);
+
+ glVertex2fv(tf->uv[1]);
+ glVertex2fv(tf->uv[2]);
+
+ if (!efa->v4) {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[0]);
+ }
+ else {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[0]);
+ }
+ }
+ }
+ glEnd();
+}
+
+static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3])
+{
+ if (vertexCos) {
+ copy_v3_v3(cent, vertexCos[(int) efa->v1->tmp.l]);
+ add_v3_v3(cent, vertexCos[(int) efa->v2->tmp.l]);
+ add_v3_v3(cent, vertexCos[(int) efa->v3->tmp.l]);
+ if (efa->v4) add_v3_v3(cent, vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ copy_v3_v3(cent, efa->v1->co);
+ add_v3_v3(cent, efa->v2->co);
+ add_v3_v3(cent, efa->v3->co);
+ if (efa->v4) add_v3_v3(cent, efa->v4->co);
+ }
+
+ if (efa->v4) {
+ mul_v3_fl(cent, 0.25f);
+ }
+ else {
+ mul_v3_fl(cent, 0.33333333333f);
+ }
+}
+
+static void emDM_foreachMappedFaceCenter(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, float *co, float *no),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+ EditFace *efa;
+ float cent[3];
+ int i;
+
+ if (emdm->vertexCos) {
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+ }
+
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ emDM__calcFaceCent(efa, cent, emdm->vertexCos);
+ func(userData, i, cent, emdm->vertexCos?emdm->faceNos[i]:efa->n);
+ }
+}
+
+/* note, material function is ignored for now. */
+static void emDM_drawMappedFaces(
+ DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r),
+ int (*setMaterial)(int, void *attribs),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData, int UNUSED(useColors))
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditFace *efa;
+ int i, draw, flush;
+ const int skip_normals= !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */
+
+ /* GL_ZERO is used to detect if drawing has started or not */
+ GLenum poly_prev= GL_ZERO;
+ GLenum shade_prev= GL_ZERO;
+
+ (void)setMaterial; /* UNUSED */
+
+ /* currently unused -- each original face is handled separately */
+ (void)compareDrawOptions;
+
+ if (emdm->vertexCos) {
+ /* add direct access */
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ float (*faceNos)[3]= emdm->faceNos;
+ EditVert *eve;
+
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth = (efa->flag & ME_SMOOTH);
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if (draw) {
+ const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
+ if (draw==2) { /* enabled with stipple */
+
+ if (poly_prev != GL_ZERO) glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
+ }
+
+ if (skip_normals) {
+ if (poly_type != poly_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if (poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
+ if (shade_type != shade_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glShadeModel((shade_prev= shade_type)); /* same as below but switch shading */
+ glBegin((poly_prev= poly_type));
+ }
+ else if (poly_type != poly_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+
+ if (!drawSmooth) {
+ glNormal3fv(faceNos[i]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if (poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if (poly_type == GL_QUADS) {
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ }
+ }
+
+ flush= (draw==2);
+ if (!skip_normals && !flush && efa->next)
+ flush|= efa->mat_nr != efa->next->mat_nr;
+
+ if (flush) {
+ glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ }
+ }
+ }
+ else {
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth = (efa->flag & ME_SMOOTH);
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if (draw) {
+ const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
+ if (draw==2) { /* enabled with stipple */
+
+ if (poly_prev != GL_ZERO) glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
+ }
+
+ if (skip_normals) {
+ if (poly_type != poly_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+ glVertex3fv(efa->v1->co);
+ glVertex3fv(efa->v2->co);
+ glVertex3fv(efa->v3->co);
+ if (poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
+ }
+ else {
+ const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
+ if (shade_type != shade_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glShadeModel((shade_prev= shade_type)); /* same as below but switch shading */
+ glBegin((poly_prev= poly_type));
+ }
+ else if (poly_type != poly_prev) {
+ if (poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+
+ if (!drawSmooth) {
+ glNormal3fv(efa->n);
+ glVertex3fv(efa->v1->co);
+ glVertex3fv(efa->v2->co);
+ glVertex3fv(efa->v3->co);
+ if (poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
+ }
+ else {
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+ if (poly_type == GL_QUADS) {
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ }
+
+ flush= (draw==2);
+ if (!skip_normals && !flush && efa->next)
+ flush|= efa->mat_nr != efa->next->mat_nr;
+
+ if (flush) {
+ glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ }
+ }
+ }
+
+ /* if non zero we know a face was rendered */
+ if (poly_prev != GL_ZERO) glEnd();
+}
+
+static void emDM_drawFacesTex_common(
+ DerivedMesh *dm,
+ int (*drawParams)(MTFace *tface, int has_mcol, int matnr),
+ int (*drawParamsMapped)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditMesh *em= emdm->em;
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ EditFace *efa;
+ int i;
+
+ (void) compareDrawOptions;
+
+ /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
+ glShadeModel(GL_SMOOTH);
+
+ if (vertexCos) {
+ EditVert *eve;
+
+ for (i=0,eve=em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ unsigned char *cp= NULL;
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+ int flag;
+
+ if (drawParams)
+ flag= drawParams(tf, (mcol != NULL), efa->mat_nr);
+ else if (drawParamsMapped)
+ flag= drawParamsMapped(userData, i);
+ else
+ flag= 1;
+
+ if (flag != 0) { /* flag 0 == the face is hidden or invisible */
+
+ /* we always want smooth here since otherwise vertex colors dont interpolate */
+ if (mcol) {
+ if (flag==1) {
+ cp= (unsigned char*)mcol;
+ }
+ }
+ else {
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ }
+
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ glNormal3fv(emdm->faceNos[i]);
+
+ if (tf) glTexCoord2fv(tf->uv[0]);
+ if (cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+
+ if (tf) glTexCoord2fv(tf->uv[1]);
+ if (cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+
+ if (tf) glTexCoord2fv(tf->uv[2]);
+ if (cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+
+ if (efa->v4) {
+ if (tf) glTexCoord2fv(tf->uv[3]);
+ if (cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ }
+ else {
+ if (tf) glTexCoord2fv(tf->uv[0]);
+ if (cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+
+ if (tf) glTexCoord2fv(tf->uv[1]);
+ if (cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+
+ if (tf) glTexCoord2fv(tf->uv[2]);
+ if (cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+
+ if (efa->v4) {
+ if (tf) glTexCoord2fv(tf->uv[3]);
+ if (cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ }
+ glEnd();
+ }
+ }
+ }
+ else {
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ unsigned char *cp= NULL;
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+ int flag;
+
+ if (drawParams)
+ flag= drawParams(tf, (mcol != NULL), efa->mat_nr);
+ else if (drawParamsMapped)
+ flag= drawParamsMapped(userData, i);
+ else
+ flag= 1;
+
+ if (flag != 0) { /* flag 0 == the face is hidden or invisible */
+
+ /* we always want smooth here since otherwise vertex colors dont interpolate */
+ if (mcol) {
+ if (flag==1) {
+ cp= (unsigned char*)mcol;
+ }
+ }
+ else {
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ }
+
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ glNormal3fv(efa->n);
+
+ if (tf) glTexCoord2fv(tf->uv[0]);
+ if (cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3fv(efa->v1->co);
+
+ if (tf) glTexCoord2fv(tf->uv[1]);
+ if (cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3fv(efa->v2->co);
+
+ if (tf) glTexCoord2fv(tf->uv[2]);
+ if (cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3fv(efa->v3->co);
+
+ if (efa->v4) {
+ if (tf) glTexCoord2fv(tf->uv[3]);
+ if (cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ else {
+ if (tf) glTexCoord2fv(tf->uv[0]);
+ if (cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+
+ if (tf) glTexCoord2fv(tf->uv[1]);
+ if (cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+
+ if (tf) glTexCoord2fv(tf->uv[2]);
+ if (cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+
+ if (efa->v4) {
+ if (tf) glTexCoord2fv(tf->uv[3]);
+ if (cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ glEnd();
+ }
+ }
+ }
+}
+
+static void emDM_drawFacesTex(
+ DerivedMesh *dm,
+ int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
+{
+ emDM_drawFacesTex_common(dm, setDrawOptions, NULL, compareDrawOptions, userData);
+}
+
+static void emDM_drawMappedFacesTex(
+ DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
+{
+ emDM_drawFacesTex_common(dm, NULL, setDrawOptions, compareDrawOptions, userData);
+}
+
+static void emDM_drawMappedFacesGLSL(
+ DerivedMesh *dm,
+ int (*setMaterial)(int, void *attribs),
+ int (*setDrawOptions)(void *userData, int index),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditMesh *em= emdm->em;
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ EditVert *eve;
+ EditFace *efa;
+ DMVertexAttribs attribs= {{{0}}};
+ GPUVertexAttribs gattribs;
+ /* int tfoffset; */ /* UNUSED */
+ int i, b, matnr, new_matnr, dodraw /* , layer */ /* UNUSED */;
+
+ dodraw = 0;
+ matnr = -1;
+
+ /* layer = CustomData_get_layer_index(&em->fdata, CD_MTFACE); */ /* UNUSED */
+ /* tfoffset = (layer == -1)? -1: em->fdata.layers[layer].offset; */ /* UNUSED */
+
+ /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
+ glShadeModel(GL_SMOOTH);
+
+ for (i=0,eve=em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+#define PASSATTRIB(efa, eve, vert) { \
+ if (attribs.totorco) { \
+ float *orco = attribs.orco.array[eve->tmp.l]; \
+ glVertexAttrib3fvARB(attribs.orco.glIndex, orco); \
+ } \
+ for (b = 0; b < attribs.tottface; b++) { \
+ MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
+ glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]); \
+ } \
+ for (b = 0; b < attribs.totmcol; b++) { \
+ MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset); \
+ GLubyte col[4]; \
+ col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a; \
+ glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col); \
+ } \
+ if (attribs.tottang) { \
+ float *tang = attribs.tang.array[i*4 + vert]; \
+ glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
+ } \
+}
+
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+
+ if (setDrawOptions && !setDrawOptions(userData, i))
+ continue;
+
+ new_matnr = efa->mat_nr + 1;
+ if (new_matnr != matnr) {
+ dodraw = setMaterial(matnr = new_matnr, &gattribs);
+ if (dodraw)
+ DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
+ }
+
+ if (dodraw) {
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ if (vertexCos) glNormal3fv(emdm->faceNos[i]);
+ else glNormal3fv(efa->n);
+
+ PASSATTRIB(efa, efa->v1, 0);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ else glVertex3fv(efa->v1->co);
+
+ PASSATTRIB(efa, efa->v2, 1);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ else glVertex3fv(efa->v2->co);
+
+ PASSATTRIB(efa, efa->v3, 2);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ else glVertex3fv(efa->v3->co);
+
+ if (efa->v4) {
+ PASSATTRIB(efa, efa->v4, 3);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ else glVertex3fv(efa->v4->co);
+ }
+ }
+ else {
+ PASSATTRIB(efa, efa->v1, 0);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+ }
+
+ PASSATTRIB(efa, efa->v2, 1);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+ }
+
+ PASSATTRIB(efa, efa->v3, 2);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+ }
+
+ if (efa->v4) {
+ PASSATTRIB(efa, efa->v4, 3);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ }
+ glEnd();
+ }
+ }
+#undef PASSATTRIB
+}
+
+static void emDM_drawFacesGLSL(
+ DerivedMesh *dm,
+ int (*setMaterial)(int, void *attribs))
+{
+ dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
+}
+
+static void emDM_drawMappedFacesMat(
+ DerivedMesh *dm,
+ void (*setMaterial)(void *userData, int, void *attribs),
+ int (*setFace)(void *userData, int index), void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditMesh *em= emdm->em;
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ EditVert *eve;
+ EditFace *efa;
+ DMVertexAttribs attribs= {{{0}}};
+ GPUVertexAttribs gattribs;
+ int i, b, matnr, new_matnr;
+
+ matnr = -1;
+
+ /* always use smooth shading even for flat faces, else vertex colors wont interpolate */
+ glShadeModel(GL_SMOOTH);
+
+ for (i=0,eve=em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+#define PASSATTRIB(efa, eve, vert) { \
+ if (attribs.totorco) { \
+ float *orco = attribs.orco.array[eve->tmp.l]; \
+ if (attribs.orco.glTexco) \
+ glTexCoord3fv(orco); \
+ else \
+ glVertexAttrib3fvARB(attribs.orco.glIndex, orco); \
+ } \
+ for (b = 0; b < attribs.tottface; b++) { \
+ MTFace *_tf = (MTFace*)((char*)efa->data + attribs.tface[b].emOffset); \
+ if (attribs.tface[b].glTexco) \
+ glTexCoord2fv(_tf->uv[vert]); \
+ else \
+ glVertexAttrib2fvARB(attribs.tface[b].glIndex, _tf->uv[vert]); \
+ } \
+ for (b = 0; b < attribs.totmcol; b++) { \
+ MCol *cp = (MCol*)((char*)efa->data + attribs.mcol[b].emOffset); \
+ GLubyte col[4]; \
+ col[0]= cp->b; col[1]= cp->g; col[2]= cp->r; col[3]= cp->a; \
+ glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col); \
+ } \
+ if (attribs.tottang) { \
+ float *tang = attribs.tang.array[i*4 + vert]; \
+ glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
+ } \
+}
+
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+
+ /* face hiding */
+ if (setFace && !setFace(userData, i))
+ continue;
+
+ /* material */
+ new_matnr = efa->mat_nr + 1;
+ if (new_matnr != matnr) {
+ setMaterial(userData, matnr = new_matnr, &gattribs);
+ DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
+ }
+
+ /* face */
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ if (vertexCos) glNormal3fv(emdm->faceNos[i]);
+ else glNormal3fv(efa->n);
+
+ PASSATTRIB(efa, efa->v1, 0);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ else glVertex3fv(efa->v1->co);
+
+ PASSATTRIB(efa, efa->v2, 1);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ else glVertex3fv(efa->v2->co);
+
+ PASSATTRIB(efa, efa->v3, 2);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ else glVertex3fv(efa->v3->co);
+
+ if (efa->v4) {
+ PASSATTRIB(efa, efa->v4, 3);
+ if (vertexCos) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ else glVertex3fv(efa->v4->co);
+ }
+ }
+ else {
+ PASSATTRIB(efa, efa->v1, 0);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+ }
+
+ PASSATTRIB(efa, efa->v2, 1);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+ }
+
+ PASSATTRIB(efa, efa->v3, 2);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+ }
+
+ if (efa->v4) {
+ PASSATTRIB(efa, efa->v4, 3);
+ if (vertexCos) {
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ }
+ glEnd();
+ }
+#undef PASSATTRIB
+}
+
+static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+ int i;
+
+ if (emdm->em->verts.first) {
+ for (i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) {
+ if (emdm->vertexCos) {
+ DO_MINMAX(emdm->vertexCos[i], min_r, max_r);
+ }
+ else {
+ DO_MINMAX(eve->co, min_r, max_r);
+ }
+ }
+ }
+ else {
+ min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
+ }
+}
+static int emDM_getNumVerts(DerivedMesh *dm)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+
+ return BLI_countlist(&emdm->em->verts);
+}
+
+static int emDM_getNumEdges(DerivedMesh *dm)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+
+ return BLI_countlist(&emdm->em->edges);
+}
+
+static int emDM_getNumFaces(DerivedMesh *dm)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+
+ return BLI_countlist(&emdm->em->faces);
+}
+
+static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+ int i;
+
+ for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
+ if (emdm->vertexCos) {
+ copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
+ }
+ else {
+ copy_v3_v3(cos_r[i], eve->co);
+ }
+ }
+}
+
+static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
+{
+ EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
+ int i;
+
+ for (i = 0; i < index; ++i) ev = ev->next;
+
+ copy_v3_v3(vert_r->co, ev->co);
+
+ normal_float_to_short_v3(vert_r->no, ev->no);
+
+ /* TODO what to do with vert_r->flag? */
+ vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
+}
+
+static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
+{
+ EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
+ EditEdge *ee = em->edges.first;
+ EditVert *ev, *v1, *v2;
+ int i;
+
+ for (i = 0; i < index; ++i) ee = ee->next;
+
+ edge_r->crease = (unsigned char) (ee->crease*255.0f);
+ edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
+ /* TODO what to do with edge_r->flag? */
+ edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
+ if (ee->seam) edge_r->flag |= ME_SEAM;
+ if (ee->sharp) edge_r->flag |= ME_SHARP;
+#if 0
+ /* this needs setup of f2 field */
+ if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
+#endif
+
+ /* goddamn, we have to search all verts to find indices */
+ v1 = ee->v1;
+ v2 = ee->v2;
+ for (i = 0, ev = em->verts.first; v1 || v2; i++, ev = ev->next) {
+ if (ev == v1) {
+ edge_r->v1 = i;
+ v1 = NULL;
+ }
+ if (ev == v2) {
+ edge_r->v2 = i;
+ v2 = NULL;
+ }
+ }
+}
+
+static void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
+{
+ EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
+ EditFace *ef = em->faces.first;
+ EditVert *ev, *v1, *v2, *v3, *v4;
+ int i;
+
+ for (i = 0; i < index; ++i) ef = ef->next;
+
+ face_r->mat_nr = ef->mat_nr;
+ face_r->flag = ef->flag;
+
+ /* goddamn, we have to search all verts to find indices */
+ v1 = ef->v1;
+ v2 = ef->v2;
+ v3 = ef->v3;
+ v4 = ef->v4;
+ if (!v4) face_r->v4 = 0;
+
+ for (i = 0, ev = em->verts.first; v1 || v2 || v3 || v4;
+ i++, ev = ev->next) {
+ if (ev == v1) {
+ face_r->v1 = i;
+ v1 = NULL;
+ }
+ if (ev == v2) {
+ face_r->v2 = i;
+ v2 = NULL;
+ }
+ if (ev == v3) {
+ face_r->v3 = i;
+ v3 = NULL;
+ }
+ if (ev == v4) {
+ face_r->v4 = i;
+ v4 = NULL;
+ }
+ }
+
+ test_index_face(face_r, NULL, 0, ef->v4?4:3);
+}
+
+static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *ev = emdm->em->verts.first;
+ int i;
+
+ for (i=0; ev; ev = ev->next, ++vert_r, ++i) {
+ if (emdm->vertexCos)
+ copy_v3_v3(vert_r->co, emdm->vertexCos[i]);
+ else
+ copy_v3_v3(vert_r->co, ev->co);
+
+ normal_float_to_short_v3(vert_r->no, ev->no);
+
+ /* TODO what to do with vert_r->flag? */
+ vert_r->flag = 0;
+ vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
+ }
+}
+
+static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
+{
+ EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
+ EditEdge *ee = em->edges.first;
+ EditVert *ev;
+ int i;
+
+ /* store vertex indices in tmp union */
+ for (ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
+ ev->tmp.l = (intptr_t) i;
+
+ for ( ; ee; ee = ee->next, ++edge_r) {
+ edge_r->crease = (unsigned char) (ee->crease*255.0f);
+ edge_r->bweight = (unsigned char) (ee->bweight*255.0f);
+ /* TODO what to do with edge_r->flag? */
+ edge_r->flag = ME_EDGEDRAW|ME_EDGERENDER;
+ if (ee->seam) edge_r->flag |= ME_SEAM;
+ if (ee->sharp) edge_r->flag |= ME_SHARP;
+#if 0
+ /* this needs setup of f2 field */
+ if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE;
+#endif
+
+ edge_r->v1 = (int)ee->v1->tmp.l;
+ edge_r->v2 = (int)ee->v2->tmp.l;
+ }
+}
+
+static void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
+{
+ EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
+ EditFace *ef = em->faces.first;
+ EditVert *ev;
+ int i;
+
+ /* store vertexes indices in tmp union */
+ for (ev = em->verts.first, i = 0; ev; ev = ev->next, ++i)
+ ev->tmp.l = (intptr_t) i;
+
+ for ( ; ef; ef = ef->next, ++face_r) {
+ face_r->mat_nr = ef->mat_nr;
+ face_r->flag = ef->flag;
+
+ face_r->v1 = (int)ef->v1->tmp.l;
+ face_r->v2 = (int)ef->v2->tmp.l;
+ face_r->v3 = (int)ef->v3->tmp.l;
+ if (ef->v4) face_r->v4 = (int)ef->v4->tmp.l;
+ else face_r->v4 = 0;
+
+ test_index_face(face_r, NULL, 0, ef->v4?4:3);
+ }
+}
+
+static void *emDM_getFaceDataArray(DerivedMesh *dm, int type)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditMesh *em= emdm->em;
+ EditFace *efa;
+ char *data, *emdata;
+ void *datalayer;
+ int index, size;
+
+ datalayer = DM_get_face_data_layer(dm, type);
+ if (datalayer)
+ return datalayer;
+
+ /* layers are store per face for editmesh, we convert to a temporary
+ * data layer array in the derivedmesh when these are requested */
+ if (type == CD_MTFACE || type == CD_MCOL) {
+ index = CustomData_get_layer_index(&em->fdata, type);
+
+ if (index != -1) {
+ /* int offset = em->fdata.layers[index].offset; */ /* UNUSED */
+ size = CustomData_sizeof(type);
+
+ DM_add_face_layer(dm, type, CD_CALLOC, NULL);
+ index = CustomData_get_layer_index(&dm->faceData, type);
+ dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
+
+ data = datalayer = DM_get_face_data_layer(dm, type);
+ for (efa=em->faces.first; efa; efa=efa->next, data+=size) {
+ emdata = CustomData_em_get(&em->fdata, efa->data, type);
+ memcpy(data, emdata, size);
+ }
+ }
+ }
+
+ return datalayer;
+}
+
+static void emDM_release(DerivedMesh *dm)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+
+ if (DM_release(dm)) {
+ if (emdm->vertexCos) {
+ MEM_freeN(emdm->vertexCos);
+ MEM_freeN(emdm->vertexNos);
+ MEM_freeN(emdm->faceNos);
+ }
+
+ MEM_freeN(emdm);
+ }
+}
+
+DerivedMesh *editmesh_get_derived(
+ EditMesh *em,
+ float (*vertexCos)[3])
+{
+ EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm");
+
+ DM_init(&emdm->dm, DM_TYPE_EDITMESH, BLI_countlist(&em->verts),
+ BLI_countlist(&em->edges), BLI_countlist(&em->faces));
+
+ emdm->dm.getMinMax = emDM_getMinMax;
+
+ emdm->dm.getNumVerts = emDM_getNumVerts;
+ emdm->dm.getNumEdges = emDM_getNumEdges;
+ emdm->dm.getNumFaces = emDM_getNumFaces;
+
+ emdm->dm.getVertCos = emDM_getVertCos;
+
+ emdm->dm.getVert = emDM_getVert;
+ emdm->dm.getEdge = emDM_getEdge;
+ emdm->dm.getFace = emDM_getFace;
+ emdm->dm.copyVertArray = emDM_copyVertArray;
+ emdm->dm.copyEdgeArray = emDM_copyEdgeArray;
+ emdm->dm.copyFaceArray = emDM_copyFaceArray;
+ emdm->dm.getFaceDataArray = emDM_getFaceDataArray;
+
+ emdm->dm.foreachMappedVert = emDM_foreachMappedVert;
+ emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
+ emdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
+
+ emdm->dm.drawEdges = emDM_drawEdges;
+ emdm->dm.drawMappedEdges = emDM_drawMappedEdges;
+ emdm->dm.drawMappedEdgesInterp = emDM_drawMappedEdgesInterp;
+ emdm->dm.drawMappedFaces = emDM_drawMappedFaces;
+ emdm->dm.drawMappedFacesTex = emDM_drawMappedFacesTex;
+ emdm->dm.drawMappedFacesGLSL = emDM_drawMappedFacesGLSL;
+ emdm->dm.drawFacesTex = emDM_drawFacesTex;
+ emdm->dm.drawFacesGLSL = emDM_drawFacesGLSL;
+ emdm->dm.drawMappedFacesMat = emDM_drawMappedFacesMat;
+ emdm->dm.drawUVEdges = emDM_drawUVEdges;
+
+ emdm->dm.release = emDM_release;
+
+ emdm->em = em;
+ emdm->vertexCos = vertexCos;
+
+ if (CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
+ EditVert *eve;
+ int i;
+
+ DM_add_vert_layer(&emdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
+
+ for (eve = em->verts.first, i = 0; eve; eve = eve->next, ++i)
+ DM_set_vert_data(&emdm->dm, i, CD_MDEFORMVERT,
+ CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT));
+ }
+
+ if (vertexCos) {
+ EditVert *eve;
+ EditFace *efa;
+ int totface = BLI_countlist(&em->faces);
+ int i;
+
+ for (i=0,eve=em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (intptr_t) i++;
+
+ emdm->vertexNos = MEM_callocN(sizeof(*emdm->vertexNos)*i, "emdm_vno");
+ emdm->faceNos = MEM_mallocN(sizeof(*emdm->faceNos)*totface, "emdm_vno");
+
+ for (i=0, efa= em->faces.first; efa; i++, efa=efa->next) {
+ float *v1 = vertexCos[(int) efa->v1->tmp.l];
+ float *v2 = vertexCos[(int) efa->v2->tmp.l];
+ float *v3 = vertexCos[(int) efa->v3->tmp.l];
+ float *no = emdm->faceNos[i];
+
+ if (efa->v4) {
+ float *v4 = vertexCos[(int) efa->v4->tmp.l];
+
+ normal_quad_v3( no,v1, v2, v3, v4);
+ add_v3_v3(emdm->vertexNos[(int) efa->v4->tmp.l], no);
+ }
+ else {
+ normal_tri_v3( no,v1, v2, v3);
+ }
+
+ add_v3_v3(emdm->vertexNos[(int) efa->v1->tmp.l], no);
+ add_v3_v3(emdm->vertexNos[(int) efa->v2->tmp.l], no);
+ add_v3_v3(emdm->vertexNos[(int) efa->v3->tmp.l], no);
+ }
+
+ for (i=0, eve= em->verts.first; eve; i++, eve=eve->next) {
+ float *no = emdm->vertexNos[i];
+ /* following Mesh convention; we use vertex coordinate itself
+ * for normal in this case */
+ if (normalize_v3(no) == 0.0f) {
+ normalize_v3_v3(no, vertexCos[i]);
+ }
+ }
+ }
+
+ return (DerivedMesh*) emdm;
+}
+
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 7b58c0bc00b..dcb8533d7a1 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -154,43 +154,6 @@ typedef struct VeNoCo {
/* ***************** PARTICLES ***************** */
-/* deprecated, only keep this for readfile.c */
-PartEff *give_parteff(Object *ob)
-{
- PartEff *paf;
-
- paf= ob->effect.first;
- while(paf) {
- if(paf->type==EFF_PARTICLE) return paf;
- paf= paf->next;
- }
- return NULL;
-}
-
-void free_effect(Effect *eff)
-{
- PartEff *paf;
-
- if(eff->type==EFF_PARTICLE) {
- paf= (PartEff *)eff;
- if(paf->keys) MEM_freeN(paf->keys);
- }
- MEM_freeN(eff);
-}
-
-
-void free_effects(ListBase *lb)
-{
- Effect *eff;
-
- eff= lb->first;
- while(eff) {
- BLI_remlink(lb, eff);
- free_effect(eff);
- eff= lb->first;
- }
-}
-
/* -------------------------- Effectors ------------------ */
void free_partdeflect(PartDeflect *pd)
{
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index d01e3de0796..318165af804 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1283,7 +1283,7 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
}
else {
/* worldspace matrix */
- mul_m4_m4m4(mat, pchan->pose_mat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, pchan->pose_mat);
}
}
else {
@@ -1414,10 +1414,7 @@ void driver_free_variable (ChannelDriver *driver, DriverVar *dvar)
DRIVER_TARGETS_LOOPER_END
/* remove the variable from the driver */
- if (driver)
- BLI_freelinkN(&driver->variables, dvar);
- else
- MEM_freeN(dvar);
+ BLI_freelinkN(&driver->variables, dvar);
#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 76c3e6e5502..7ac395212ab 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -108,23 +108,28 @@ void unlink_group(Group *group)
}
for(ob= bmain->object.first; ob; ob= ob->id.next) {
- bActionStrip *strip;
if(ob->dup_group==group) {
ob->dup_group= NULL;
-
- /* duplicator strips use a group object, we remove it */
- for(strip= ob->nlastrips.first; strip; strip= strip->next) {
- if(strip->object)
- strip->object= NULL;
+#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
+ {
+ bActionStrip *strip;
+ /* duplicator strips use a group object, we remove it */
+ for(strip= ob->nlastrips.first; strip; strip= strip->next) {
+ if(strip->object)
+ strip->object= NULL;
+ }
}
+#endif
}
for(psys=ob->particlesystem.first; psys; psys=psys->next){
if(psys->part->dup_group==group)
psys->part->dup_group= NULL;
+#if 0 /* not used anymore, only keps for readfile.c, no need to account for this */
if(psys->part->eff_group==group)
psys->part->eff_group= NULL;
+#endif
}
}
@@ -273,13 +278,14 @@ void group_tag_recalc(Group *group)
}
}
-int group_is_animated(Object *parent, Group *group)
+int group_is_animated(Object *UNUSED(parent), Group *group)
{
GroupObject *go;
-
- // XXX: old animsys depreceated...
+
+#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
if(parent->nlastrips.first)
return 1;
+#endif
for(go= group->gobject.first; go; go= go->next)
if(go->ob && go->ob->proxy)
@@ -381,6 +387,7 @@ void group_handle_recalc_and_update(Scene *scene, Object *UNUSED(parent), Group
}
}
+#if 0
Object *group_get_member_with_action(Group *group, bAction *act)
{
GroupObject *go;
@@ -432,3 +439,4 @@ void group_relink_nla_objects(Object *ob)
}
}
+#endif
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index a44957ddc01..d9fe0138784 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -692,7 +692,11 @@ IDProperty *IDP_New(const int type, const IDPropertyTemplate *val, const char *n
case IDP_ARRAY:
{
/*for now, we only support float and int and double arrays*/
- if (val->array.type == IDP_FLOAT || val->array.type == IDP_INT || val->array.type == IDP_DOUBLE || val->array.type == IDP_GROUP) {
+ if ( (val->array.type == IDP_FLOAT) ||
+ (val->array.type == IDP_INT) ||
+ (val->array.type == IDP_DOUBLE) ||
+ (val->array.type == IDP_GROUP) )
+ {
prop = MEM_callocN(sizeof(IDProperty), "IDProperty array");
prop->subtype = val->array.type;
if (val->array.len)
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index fb734ea4f3d..a5c8f5c905d 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -285,6 +285,10 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
break;
ibuf->index= index;
+ if(ima->flag & IMA_CM_PREDIVIDE)
+ ibuf->flags |= IB_cm_predivide;
+ else
+ ibuf->flags &= ~IB_cm_predivide;
/* this function accepts link==NULL */
BLI_insertlinkbefore(&ima->ibufs, link, ibuf);
@@ -1508,10 +1512,7 @@ int BKE_write_ibuf(ImBuf *ibuf, const char *name, ImageFormatData *imf)
int ok;
- if(imtype == -1) {
- /* use whatever existing image type is set by 'ibuf' */
- }
- else if(imtype== R_IMF_IMTYPE_IRIS) {
+ if(imtype== R_IMF_IMTYPE_IRIS) {
ibuf->ftype= IMAGIC;
}
#ifdef WITH_HDR
@@ -1547,7 +1548,7 @@ int BKE_write_ibuf(ImBuf *ibuf, const char *name, ImageFormatData *imf)
ibuf->ftype= OPENEXR;
if(imf->depth == R_IMF_CHAN_DEPTH_16)
ibuf->ftype |= OPENEXR_HALF;
- ibuf->ftype |= (quality & OPENEXR_COMPRESS);
+ ibuf->ftype |= (imf->exr_codec & OPENEXR_COMPRESS);
if(!(imf->flag & R_IMF_FLAG_ZBUF))
ibuf->zbuf_float = NULL; /* signal for exr saving */
@@ -2277,7 +2278,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
ibuf->x= rres.rectx;
ibuf->y= rres.recty;
- if(ibuf->rect_float!=rectf || rect) /* ensure correct redraw */
+ /* free rect buffer if float buffer changes, so it can be recreated with
+ the updated result, and also in case we got byte buffer from sequencer,
+ so we don't keep reference to freed buffer */
+ if(ibuf->rect_float!=rectf || rect || !rectf)
imb_freerectImBuf(ibuf);
if(rect)
@@ -2304,9 +2308,17 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
/* since its possible to access the buffer from the image directly, set the profile [#25073] */
ibuf->profile= (iuser->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_NONE;
-
ibuf->dither= dither;
+ if(iuser->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE) {
+ ibuf->flags |= IB_cm_predivide;
+ ima->flag |= IMA_CM_PREDIVIDE;
+ }
+ else {
+ ibuf->flags &= ~IB_cm_predivide;
+ ima->flag &= ~IMA_CM_PREDIVIDE;
+ }
+
ima->ok= IMA_OK_LOADED;
return ibuf;
diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c
index 751980f61e8..a93d0221cf0 100644
--- a/source/blender/blenkernel/intern/image_gen.c
+++ b/source/blender/blenkernel/intern/image_gen.c
@@ -30,6 +30,7 @@
#include "BKE_image.h"
#include "BLI_math_color.h"
+#include "BLI_math_base.h"
#include "BLF_api.h"
void BKE_image_buf_fill_color(unsigned char *rect, float *rect_float, int width, int height, float color[4])
@@ -161,21 +162,6 @@ void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int widt
#define BLEND_FLOAT(real, add) (real+add <= 1.0f) ? (real+add) : 1.0f
#define BLEND_CHAR(real, add) ((real + (char)(add * 255.0f)) <= 255) ? (real + (char)(add * 255.0f)) : 255
-static int is_pow2(int n)
-{
- return ((n)&(n-1))==0;
-}
-static int larger_pow2(int n)
-{
- if (is_pow2(n))
- return n;
-
- while(!is_pow2(n))
- n= n&(n-1);
-
- return n*2;
-}
-
static void checker_board_color_fill(unsigned char *rect, float *rect_float, int width, int height)
{
int hue_step, y, x;
@@ -183,7 +169,7 @@ static void checker_board_color_fill(unsigned char *rect, float *rect_float, int
sat= 1.0;
- hue_step= larger_pow2(width / 8);
+ hue_step= power_of_2_max_i(width / 8);
if(hue_step < 8) hue_step= 8;
for(y= 0; y < height; y++)
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 034f4a96879..9890a2629fc 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -43,7 +43,8 @@
#include <string.h>
#include <stddef.h>
-#include "MEM_guardedalloc.h"
+/* since we have versioning code here */
+#define DNA_DEPRECATED_ALLOW
#include "DNA_anim_types.h"
#include "DNA_constraint_types.h"
@@ -73,6 +74,7 @@
#include "BKE_nla.h"
#include "BKE_sequencer.h"
+#include "MEM_guardedalloc.h"
/* *************************************************** */
/* Old-Data Freeing Tools */
@@ -907,8 +909,10 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
if (array_index)
*array_index= dummy_index;
}
-
+
+ /* 'buf' _must_ be initialized in this block */
/* append preceding bits to path */
+ /* note, strings are not escapted and they should be! */
if ((actname && actname[0]) && (constname && constname[0])) {
/* Constraint in Pose-Channel */
sprintf(buf, "pose.bones[\"%s\"].constraints[\"%s\"]", actname, constname);
@@ -916,6 +920,7 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
else if (actname && actname[0]) {
if ((blocktype == ID_OB) && strcmp(actname, "Object")==0) {
/* Actionified "Object" IPO's... no extra path stuff needed */
+ buf[0]= '\0'; /* empty string */
}
else if ((blocktype == ID_KE) && strcmp(actname, "Shape")==0) {
/* Actionified "Shape" IPO's - these are forced onto object level via the action container there... */
@@ -934,8 +939,10 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
/* Sequence names in Scene */
sprintf(buf, "sequence_editor.sequences_all[\"%s\"]", seq->name+2);
}
- else
+ else {
buf[0]= '\0'; /* empty string */
+ }
+
BLI_dynstr_append(path, buf);
/* need to add dot before property if there was anything precceding this */
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 4f02fdd1f46..4c30789db73 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -316,7 +316,7 @@ void init_latt_deform(Object *oblatt, Object *ob)
else {
/* in deformspace, calc matrix */
invert_m4_m4(imat, oblatt->obmat);
- mul_m4_m4m4(lt->latmat, ob->obmat, imat);
+ mult_m4_m4m4(lt->latmat, imat, ob->obmat);
/* back: put in deform array */
invert_m4_m4(imat, lt->latmat);
@@ -462,7 +462,7 @@ void end_latt_deform(Object *ob)
so we store in latmat transform from path coord inside object
*/
typedef struct {
- float dmin[3], dmax[3], dsize, dloc[3];
+ float dmin[3], dmax[3], dscale, dloc[3];
float curvespace[4][4], objectspace[4][4], objectspace3[3][3];
int no_rot_axis;
} CurveDeform;
@@ -470,7 +470,7 @@ typedef struct {
static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd, int dloc)
{
invert_m4_m4(ob->imat, ob->obmat);
- mul_m4_m4m4(cd->objectspace, par->obmat, ob->imat);
+ mult_m4_m4m4(cd->objectspace, ob->imat, par->obmat);
invert_m4_m4(cd->curvespace, cd->objectspace);
copy_m3_m4(cd->objectspace3, cd->objectspace);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 7a4780eb984..cb1c7dbec5c 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1319,19 +1319,23 @@ static void lib_indirect_test_id(ID *id, Library *lib)
if(GS(id->name)==ID_OB) {
Object *ob= (Object *)id;
- bActionStrip *strip;
Mesh *me;
int a;
-
+
+#if 0 /* XXX OLD ANIMSYS, NLASTRIPS ARE NO LONGER USED */
// XXX old animation system! --------------------------------------
- for (strip=ob->nlastrips.first; strip; strip=strip->next){
- LIBTAG(strip->object);
- LIBTAG(strip->act);
- LIBTAG(strip->ipo);
+ {
+ bActionStrip *strip;
+ for (strip=ob->nlastrips.first; strip; strip=strip->next){
+ LIBTAG(strip->object);
+ LIBTAG(strip->act);
+ LIBTAG(strip->ipo);
+ }
}
// XXX: new animation system needs something like this?
-
+#endif
+
for(a=0; a<ob->totcol; a++) {
LIBTAG(ob->mat[a]);
}
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 60ae86063e8..4fda85a3247 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -903,7 +903,7 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
/* always get derivatives for these textures */
if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
- else if(mtex->texflag & (MTEX_COMPAT_BUMP|MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) ma->texco |= TEXCO_OSA;
+ else if(mtex->texflag & (MTEX_COMPAT_BUMP|MTEX_3TAP_BUMP|MTEX_5TAP_BUMP|MTEX_BICUBIC_BUMP)) ma->texco |= TEXCO_OSA;
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
else if(ma->texco & (TEXCO_GLOB|TEXCO_UV|TEXCO_OBJECT|TEXCO_SPEED)) needuv= 1;
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 0883ec121d6..57fc7473860 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -1679,7 +1679,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
temp2[3][1]= ml->y;
temp2[3][2]= ml->z;
- mul_m4_m4m4(temp1, temp3, temp2);
+ mult_m4_m4m4(temp1, temp2, temp3);
/* make a copy because of duplicates */
mainb[a]= new_pgn_element(sizeof(MetaElem));
@@ -1691,9 +1691,9 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
/* mat is the matrix to transform from mball into the basis-mball */
invert_m4_m4(obinv, obmat);
- mul_m4_m4m4(temp2, bob->obmat, obinv);
+ mult_m4_m4m4(temp2, obinv, bob->obmat);
/* MetaBall transformation */
- mul_m4_m4m4(mat, temp1, temp2);
+ mult_m4_m4m4(mat, temp2, temp1);
invert_m4_m4(imat,mat);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index ab45aeed8c3..408a141608d 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -65,6 +65,10 @@
/* -- */
#include "BKE_object.h"
+#ifdef USE_BMESH_FORWARD_COMPAT
+#include "BLI_array.h"
+#endif
+
EditMesh *BKE_mesh_get_editmesh(Mesh *me)
{
@@ -106,32 +110,18 @@ void unlink_mesh(Mesh *me)
}
if(me->key) {
- me->key->id.us--;
- if (me->key->id.us == 0 && me->key->ipo )
- me->key->ipo->id.us--;
+ me->key->id.us--;
}
me->key= NULL;
if(me->texcomesh) me->texcomesh= NULL;
}
-
/* do not free mesh itself */
void free_mesh(Mesh *me)
{
unlink_mesh(me);
- if(me->pv) {
- if(me->pv->vert_map) MEM_freeN(me->pv->vert_map);
- if(me->pv->edge_map) MEM_freeN(me->pv->edge_map);
- if(me->pv->old_faces) MEM_freeN(me->pv->old_faces);
- if(me->pv->old_edges) MEM_freeN(me->pv->old_edges);
- me->totvert= me->pv->totvert;
- me->totedge= me->pv->totedge;
- me->totface= me->pv->totface;
- MEM_freeN(me->pv);
- }
-
CustomData_free(&me->vdata, me->totvert);
CustomData_free(&me->edata, me->totedge);
CustomData_free(&me->fdata, me->totface);
@@ -232,7 +222,6 @@ Mesh *copy_mesh(Mesh *me)
men->mselect= NULL;
men->edit_mesh= NULL;
- men->pv= NULL; /* looks like this is no-longer supported but NULL just incase */
men->bb= MEM_dupallocN(men->bb);
@@ -381,9 +370,9 @@ void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r)
tex_space_mesh(me);
}
- if (loc_r) VECCOPY(loc_r, me->loc);
- if (rot_r) VECCOPY(rot_r, me->rot);
- if (size_r) VECCOPY(size_r, me->size);
+ if (loc_r) copy_v3_v3(loc_r, me->loc);
+ if (rot_r) copy_v3_v3(rot_r, me->rot);
+ if (size_r) copy_v3_v3(size_r, me->size);
}
float *get_mesh_orco_verts(Object *ob)
@@ -481,8 +470,8 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
if(mface->v3==0) {
static int corner_indices[4] = {1, 2, 0, 3};
- SWAP(int, mface->v1, mface->v2);
- SWAP(int, mface->v2, mface->v3);
+ SWAP(unsigned int, mface->v1, mface->v2);
+ SWAP(unsigned int, mface->v2, mface->v3);
if(fdata)
CustomData_swap(fdata, mfindex, corner_indices);
@@ -492,8 +481,8 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
if(mface->v3==0 || mface->v4==0) {
static int corner_indices[4] = {2, 3, 0, 1};
- SWAP(int, mface->v1, mface->v3);
- SWAP(int, mface->v2, mface->v4);
+ SWAP(unsigned int, mface->v1, mface->v3);
+ SWAP(unsigned int, mface->v2, mface->v4);
if(fdata)
CustomData_swap(fdata, mfindex, corner_indices);
@@ -535,12 +524,14 @@ void set_mesh(Object *ob, Mesh *me)
/* ************** make edges in a Mesh, for outside of editmode */
struct edgesort {
- int v1, v2;
+ unsigned int v1, v2;
short is_loose, is_draw;
};
/* edges have to be added with lowest index first for sorting */
-static void to_edgesort(struct edgesort *ed, int v1, int v2, short is_loose, short is_draw)
+static void to_edgesort(struct edgesort *ed,
+ unsigned int v1, unsigned int v2,
+ short is_loose, short is_draw)
{
if(v1<v2) {
ed->v1= v1; ed->v2= v2;
@@ -642,7 +633,7 @@ static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, int UNUSED(
/* order is swapped so extruding this edge as a surface wont flip face normals
* with cyclic curves */
if(ed->v1+1 != ed->v2) {
- SWAP(int, medge->v1, medge->v2);
+ SWAP(unsigned int, medge->v1, medge->v2);
}
medge++;
}
@@ -739,7 +730,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
nors= dl->nors;
verts= dl->verts;
while(a--) {
- VECCOPY(mvert->co, verts);
+ copy_v3_v3(mvert->co, verts);
normal_float_to_short_v3(mvert->no, nors);
mvert++;
nors+= 3;
@@ -838,7 +829,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
a= dl->parts*dl->nr;
data= dl->verts;
while(a--) {
- VECCOPY(mvert->co, data);
+ copy_v3_v3(mvert->co, data);
data+=3;
vertcount++;
mvert++;
@@ -861,7 +852,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
a= dl->parts*dl->nr;
data= dl->verts;
while(a--) {
- VECCOPY(mvert->co, data);
+ copy_v3_v3(mvert->co, data);
data+=3;
vertcount++;
mvert++;
@@ -884,7 +875,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
a= dl->nr;
data= dl->verts;
while(a--) {
- VECCOPY(mvert->co, data);
+ copy_v3_v3(mvert->co, data);
data+=3;
vertcount++;
mvert++;
@@ -912,7 +903,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
a= dl->parts*dl->nr;
data= dl->verts;
while(a--) {
- VECCOPY(mvert->co, data);
+ copy_v3_v3(mvert->co, data);
data+=3;
vertcount++;
mvert++;
@@ -1001,8 +992,8 @@ void nurbs_to_mesh(Object *ob)
me->totedge= totedge;
me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, allvert, me->totvert);
- me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, allface, me->totface);
me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, alledge, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, allface, me->totface);
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
} else {
@@ -1044,17 +1035,17 @@ typedef struct EdgeLink {
typedef struct VertLink {
Link *next, *prev;
- int index;
+ unsigned int index;
} VertLink;
-static void prependPolyLineVert(ListBase *lb, int index)
+static void prependPolyLineVert(ListBase *lb, unsigned int index)
{
VertLink *vl= MEM_callocN(sizeof(VertLink), "VertLink");
vl->index = index;
BLI_addhead(lb, vl);
}
-static void appendPolyLineVert(ListBase *lb, int index)
+static void appendPolyLineVert(ListBase *lb, unsigned int index)
{
VertLink *vl= MEM_callocN(sizeof(VertLink), "VertLink");
vl->index = index;
@@ -1126,8 +1117,8 @@ void mesh_to_curve(Scene *scene, Object *ob)
int closed = FALSE;
int totpoly= 0;
MEdge *med_current= ((EdgeLink *)edges.last)->edge;
- int startVert= med_current->v1;
- int endVert= med_current->v2;
+ unsigned int startVert= med_current->v1;
+ unsigned int endVert= med_current->v2;
int ok= TRUE;
appendPolyLineVert(&polyline, startVert); totpoly++;
@@ -1458,72 +1449,184 @@ void create_vert_edge_map(ListBase **map, IndexNode **mem, const MEdge *medge, c
}
}
-/* Partial Mesh Visibility */
-PartialVisibility *mesh_pmv_copy(PartialVisibility *pmv)
-{
- PartialVisibility *n= MEM_dupallocN(pmv);
- n->vert_map= MEM_dupallocN(pmv->vert_map);
- n->edge_map= MEM_dupallocN(pmv->edge_map);
- n->old_edges= MEM_dupallocN(pmv->old_edges);
- n->old_faces= MEM_dupallocN(pmv->old_faces);
- return n;
-}
+#ifdef USE_BMESH_FORWARD_COMPAT
-void mesh_pmv_free(PartialVisibility *pv)
-{
- MEM_freeN(pv->vert_map);
- MEM_freeN(pv->edge_map);
- MEM_freeN(pv->old_faces);
- MEM_freeN(pv->old_edges);
- MEM_freeN(pv);
-}
+void mesh_loops_to_mface_corners(CustomData *fdata, CustomData *ldata,
+ CustomData *pdata, int lindex[4], int findex,
+ const int polyindex,
+ const int mf_len, /* 3 or 4 */
-void mesh_pmv_revert(Mesh *me)
+ /* cache values to avoid lookups every time */
+ const int numTex, /* CustomData_number_of_layers(pdata, CD_MTEXPOLY) */
+ const int numCol, /* CustomData_number_of_layers(ldata, CD_MLOOPCOL) */
+ const int hasWCol /* CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL) */
+ )
{
- if(me->pv) {
- unsigned i;
- MVert *nve, *old_verts;
+ MTFace *texface;
+ MTexPoly *texpoly;
+ MCol *mcol;
+ MLoopCol *mloopcol;
+ MLoopUV *mloopuv;
+ int i, j;
+
+ for(i=0; i < numTex; i++){
+ texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
+ texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
- /* Reorder vertices */
- nve= me->mvert;
- old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
- for(i=0; i<me->pv->totvert; ++i)
- old_verts[i]= nve[me->pv->vert_map[i]];
-
- /* Restore verts, edges and faces */
- CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
- CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
- CustomData_free_layer_active(&me->fdata, CD_MFACE, me->totface);
-
- CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, old_verts, me->pv->totvert);
- CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, me->pv->old_edges, me->pv->totedge);
- CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, me->pv->old_faces, me->pv->totface);
- mesh_update_customdata_pointers(me);
-
- me->totvert= me->pv->totvert;
- me->totedge= me->pv->totedge;
- me->totface= me->pv->totface;
-
- me->pv->old_edges= NULL;
- me->pv->old_faces= NULL;
-
- /* Free maps */
- MEM_freeN(me->pv->edge_map);
- me->pv->edge_map= NULL;
- MEM_freeN(me->pv->vert_map);
- me->pv->vert_map= NULL;
+ texface->tpage = texpoly->tpage;
+ texface->flag = texpoly->flag;
+ texface->transp = texpoly->transp;
+ texface->mode = texpoly->mode;
+ texface->tile = texpoly->tile;
+ texface->unwrap = texpoly->unwrap;
+
+ for (j=0; j < mf_len; j++) {
+ mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
+ texface->uv[j][0] = mloopuv->uv[0];
+ texface->uv[j][1] = mloopuv->uv[1];
+ }
+ }
+
+ for(i=0; i < numCol; i++){
+ mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
+
+ for (j=0; j < mf_len; j++) {
+ mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
+ mcol[j].r = mloopcol->r;
+ mcol[j].g = mloopcol->g;
+ mcol[j].b = mloopcol->b;
+ mcol[j].a = mloopcol->a;
+ }
+ }
+
+ if (hasWCol) {
+ mcol = CustomData_get(fdata, findex, CD_WEIGHT_MCOL);
+
+ for (j=0; j < mf_len; j++) {
+ mloopcol = CustomData_get(ldata, lindex[j], CD_WEIGHT_MLOOPCOL);
+ mcol[j].r = mloopcol->r;
+ mcol[j].g = mloopcol->g;
+ mcol[j].b = mloopcol->b;
+ mcol[j].a = mloopcol->a;
+ }
}
}
-void mesh_pmv_off(Mesh *me)
+
+/*
+ * this function recreates a tesselation.
+ * returns number of tesselation faces.
+ */
+int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
+ struct CustomData *pdata, int totface, int UNUSED(totloop), int totpoly)
{
- if(me->pv) {
- mesh_pmv_revert(me);
- MEM_freeN(me->pv);
- me->pv= NULL;
+ MLoop *mloop;
+
+ int lindex[4];
+ int i;
+ int k;
+
+ MPoly *mp, *mpoly;
+ MFace *mface = NULL, *mf;
+ BLI_array_declare(mface);
+
+ const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+ const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+ const int hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
+
+ mpoly = CustomData_get_layer(pdata, CD_MPOLY);
+ mloop = CustomData_get_layer(ldata, CD_MLOOP);
+
+ mp = mpoly;
+ k = 0;
+ for (i = 0; i<totpoly; i++, mp++) {
+ if (ELEM(mp->totloop, 3, 4)) {
+ BLI_array_growone(mface);
+ mf = &mface[k];
+
+ mf->mat_nr = mp->mat_nr;
+ mf->flag = mp->flag;
+
+ mf->v1 = mp->loopstart + 0;
+ mf->v2 = mp->loopstart + 1;
+ mf->v3 = mp->loopstart + 2;
+ mf->v4 = (mp->totloop == 4) ? (mp->loopstart + 3) : 0;
+
+ /* abuse edcode for temp storage and clear next loop */
+ mf->edcode = (char)mp->totloop; /* only ever 3 or 4 */
+
+ k++;
+ }
}
+
+ CustomData_free(fdata, totface);
+ memset(fdata, 0, sizeof(CustomData));
+
+ totface= k;
+
+ CustomData_add_layer(fdata, CD_MFACE, CD_ASSIGN, mface, totface);
+
+ CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
+
+ mp = mpoly;
+ k = 0;
+ for (i = 0; i<totpoly; i++, mp++) {
+ if (ELEM(mp->totloop, 3, 4)) {
+ mf = &mface[k];
+
+ if (mf->edcode == 3) {
+ /*sort loop indices to ensure winding is correct*/
+ /* NO SORT - looks like we can skip this */
+
+ lindex[0] = mf->v1;
+ lindex[1] = mf->v2;
+ lindex[2] = mf->v3;
+ lindex[3] = 0; /* unused */
+
+ /*transform loop indices to vert indices*/
+ mf->v1 = mloop[mf->v1].v;
+ mf->v2 = mloop[mf->v2].v;
+ mf->v3 = mloop[mf->v3].v;
+
+ mesh_loops_to_mface_corners(fdata, ldata, pdata,
+ lindex, k, i, 3,
+ numTex, numCol, hasWCol);
+ test_index_face(mf, fdata, totface, 3);
+ }
+ else {
+ /*sort loop indices to ensure winding is correct*/
+ /* NO SORT - looks like we can skip this */
+
+ lindex[0] = mf->v1;
+ lindex[1] = mf->v2;
+ lindex[2] = mf->v3;
+ lindex[3] = mf->v4;
+
+ /*transform loop indices to vert indices*/
+ mf->v1 = mloop[mf->v1].v;
+ mf->v2 = mloop[mf->v2].v;
+ mf->v3 = mloop[mf->v3].v;
+ mf->v4 = mloop[mf->v4].v;
+
+ mesh_loops_to_mface_corners(fdata, ldata, pdata,
+ lindex, k, i, 4,
+ numTex, numCol, hasWCol);
+ test_index_face(mf, fdata, totface, 4);
+ }
+
+ mf->edcode= 0;
+
+ k++;
+ }
+ }
+
+ return k;
}
+#endif /* USE_BMESH_FORWARD_COMPAT */
+
+
+
/* basic vertex data functions */
int minmax_mesh(Mesh *me, float min[3], float max[3])
{
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index ec24f72874d..ed9b63fe98d 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -38,12 +38,14 @@
#include "BLI_utildefines.h"
#include "BLI_edgehash.h"
+#include "BLI_math_base.h"
#include "BKE_DerivedMesh.h"
#include "MEM_guardedalloc.h"
#include "BKE_mesh.h"
+#include "BKE_deform.h"
#define SELECT 1
@@ -117,7 +119,12 @@ static int search_face_cmp(const void *v1, const void *v2)
#define PRINT if(do_verbose) printf
-int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes)
+int BKE_mesh_validate_arrays( Mesh *me,
+ MVert *mverts, unsigned int totvert,
+ MEdge *medges, unsigned int totedge,
+ MFace *mfaces, unsigned int totface,
+ MDeformVert *dverts, /* assume totvert length */
+ const short do_verbose, const short do_fixes)
{
# define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
# define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; }
@@ -126,10 +133,14 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
MEdge *med;
MFace *mf;
MFace *mf_prev;
+ MVert *mvert= mverts;
unsigned int i;
- int do_face_free= FALSE;
- int do_edge_free= FALSE;
+ short do_face_free= FALSE;
+ short do_edge_free= FALSE;
+
+ short verts_fixed= FALSE;
+ short vert_weights_fixed= FALSE;
int do_edge_recalc= FALSE;
@@ -149,6 +160,34 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
do_edge_recalc= TRUE;
}
+ for(i=1; i<totvert; i++, mvert++) {
+ int j;
+ int fix_normal= TRUE;
+
+ for(j=0; j<3; j++) {
+ if(!finite(mvert->co[j])) {
+ PRINT(" vertex %u: has invalid coordinate\n", i);
+
+ if (do_fixes) {
+ zero_v3(mvert->co);
+
+ verts_fixed= TRUE;
+ }
+ }
+
+ if(mvert->no[j]!=0)
+ fix_normal= FALSE;
+ }
+
+ if(fix_normal) {
+ PRINT(" vertex %u: has zero normal, assuming Z-up normal\n", i);
+ if (do_fixes) {
+ mvert->no[2]= SHRT_MAX;
+ verts_fixed= TRUE;
+ }
+ }
+ }
+
for(i=0, med= medges; i<totedge; i++, med++) {
int remove= FALSE;
if(med->v1 == med->v2) {
@@ -281,6 +320,53 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
BLI_edgehash_free(edge_hash, NULL);
MEM_freeN(sort_faces);
+
+ /* fix deform verts */
+ if (dverts) {
+ MDeformVert *dv;
+ for(i=0, dv= dverts; i<totvert; i++, dv++) {
+ MDeformWeight *dw;
+ unsigned int j;
+
+ for(j=0, dw= dv->dw; j < dv->totweight; j++, dw++) {
+ /* note, greater then max defgroups is accounted for in our code, but not < 0 */
+ if (!finite(dw->weight)) {
+ PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
+ if (do_fixes) {
+ dw->weight= 0.0f;
+ vert_weights_fixed= TRUE;
+ }
+ }
+ else if (dw->weight < 0.0f || dw->weight > 1.0f) {
+ PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
+ if (do_fixes) {
+ CLAMP(dw->weight, 0.0f, 1.0f);
+ vert_weights_fixed= TRUE;
+ }
+ }
+
+ if (dw->def_nr < 0) {
+ PRINT(" vertex deform %u, has invalid group %d\n", i, dw->def_nr);
+ if (do_fixes) {
+ defvert_remove_group(dv, dw);
+ if (dv->dw) {
+ /* re-allocated, the new values compensate for stepping
+ * within the for loop and may not be valid */
+ j--;
+ dw= dv->dw + j;
+
+ vert_weights_fixed= TRUE;
+ }
+ else { /* all freed */
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+
PRINT("BKE_mesh_validate: finished\n\n");
# undef REMOVE_EDGE_TAG
@@ -300,7 +386,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
}
}
- return (do_face_free || do_edge_free || do_edge_recalc);
+ return (verts_fixed || vert_weights_fixed || do_face_free || do_edge_free || do_edge_recalc);
}
static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
@@ -309,7 +395,7 @@ static int mesh_validate_customdata(CustomData *data, short do_verbose, const sh
while(i<data->totlayer) {
CustomDataLayer *layer= &data->layers[i];
- int mask= 1 << layer->type;
+ CustomDataMask mask= CD_TYPE_AS_MASK(layer->type);
int ok= 1;
if((mask&CD_MASK_MESH)==0) {
@@ -331,7 +417,8 @@ static int mesh_validate_customdata(CustomData *data, short do_verbose, const sh
#undef PRINT
-static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes)
+static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata,
+ short do_verbose, const short do_fixes)
{
int vfixed= 0, efixed= 0, ffixed= 0;
@@ -351,14 +438,24 @@ int BKE_mesh_validate(Mesh *me, int do_verbose)
}
layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE);
- arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+ arrays_fixed= BKE_mesh_validate_arrays(me,
+ me->mvert, me->totvert,
+ me->medge, me->totedge,
+ me->mface, me->totface,
+ me->dvert,
+ do_verbose, TRUE);
return layers_fixed || arrays_fixed;
}
int BKE_mesh_validate_dm(DerivedMesh *dm)
{
- return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getFaceArray(dm), dm->getNumFaces(dm), TRUE, FALSE);
+ return BKE_mesh_validate_arrays(NULL,
+ dm->getVertArray(dm), dm->getNumVerts(dm),
+ dm->getEdgeArray(dm), dm->getNumEdges(dm),
+ dm->getFaceArray(dm), dm->getNumFaces(dm),
+ dm->getVertDataArray(dm, CD_MDEFORMVERT),
+ TRUE, FALSE);
}
void BKE_mesh_calc_edges(Mesh *mesh, int update)
@@ -412,7 +509,7 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
*med= *med_orig; /* copy from the original */
} else {
- BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+ BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
}
}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index f09be8c34ad..5a389019519 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -239,7 +239,14 @@ int modifier_couldBeCage(struct Scene *scene, ModifierData *md)
int modifier_sameTopology(ModifierData *md)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
+ return ELEM3(mti->type, eModifierTypeType_OnlyDeform, eModifierTypeType_Nonconstructive,
+ eModifierTypeType_NonGeometrical);
+}
+
+int modifier_nonGeometrical(ModifierData *md)
+{
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ return (mti->type == eModifierTypeType_NonGeometrical);
}
void modifier_setError(ModifierData *md, const char *format, ...)
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 75d8ec584e8..ab963f1e78c 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -372,7 +372,10 @@ static MovieClip *movieclip_alloc(const char *name)
BKE_tracking_init_settings(&clip->tracking);
clip->proxy.build_size_flag= IMB_PROXY_25;
- clip->proxy.build_tc_flag= IMB_TC_RECORD_RUN|IMB_TC_FREE_RUN|IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN;
+ clip->proxy.build_tc_flag= IMB_TC_RECORD_RUN |
+ IMB_TC_FREE_RUN |
+ IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN |
+ IMB_TC_RECORD_RUN_NO_GAPS;
clip->proxy.quality= 90;
return clip;
@@ -813,7 +816,8 @@ void BKE_movieclip_reload(MovieClip *clip)
void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClipScopes *scopes)
{
- if(scopes->ok) return;
+ if(scopes->ok)
+ return;
if(scopes->track_preview) {
IMB_freeImBuf(scopes->track_preview);
@@ -824,8 +828,10 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
scopes->track= NULL;
if(clip) {
- if(clip->tracking.act_track) {
- MovieTrackingTrack *track= clip->tracking.act_track;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(&clip->tracking);
+
+ if(act_track) {
+ MovieTrackingTrack *track= act_track;
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, user->framenr);
if(marker->flag&MARKER_DISABLED) {
@@ -915,15 +921,17 @@ static void movieclip_build_proxy_ibuf(MovieClip *clip, ImBuf *ibuf, int cfra, i
IMB_freeImBuf(scaleibuf);
}
-void BKE_movieclip_build_proxy_frame(MovieClip *clip, struct MovieDistortion *distortion,
+void BKE_movieclip_build_proxy_frame(MovieClip *clip, int clip_flag, struct MovieDistortion *distortion,
int cfra, int *build_sizes, int build_count, int undistorted)
{
ImBuf *ibuf;
MovieClipUser user;
user.framenr= cfra;
+ user.render_flag= 0;
+ user.render_size= MCLIP_PROXY_RENDER_SIZE_FULL;
- ibuf= BKE_movieclip_get_ibuf_flag(clip, &user, 0);
+ ibuf= BKE_movieclip_get_ibuf_flag(clip, &user, clip_flag);
if(ibuf) {
ImBuf *tmpibuf= ibuf;
@@ -985,9 +993,9 @@ void unlink_movieclip(Main *bmain, MovieClip *clip)
}
for(ob= bmain->object.first; ob; ob= ob->id.next) {
- bConstraint *con= ob->constraints.first;
+ bConstraint *con;
- for (con= ob->constraints.first; con; con= con->next) {
+ for(con= ob->constraints.first; con; con= con->next) {
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index ae0774eb34f..458fb895b64 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -32,6 +32,9 @@
#include "MEM_guardedalloc.h"
+/* for reading old multires */
+#define DNA_DEPRECATED_ALLOW
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 4f51ef9a275..9befb46674f 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1325,32 +1325,6 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
node->flag |= NODE_ACTIVE_TEXTURE;
}
-/* use flags are not persistent yet, groups might need different tagging, so we do it each time
- when we need to get this info */
-void ntreeSocketUseFlags(bNodeTree *ntree)
-{
- bNode *node;
- bNodeSocket *sock;
- bNodeLink *link;
-
- /* clear flags */
- for(node= ntree->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- }
-
- /* tag all thats in use */
- for(link= ntree->links.first; link; link= link->next) {
-
- if(link->fromsock) // FIXME, see below
- link->fromsock->flag |= SOCK_IN_USE;
- if(link->tosock) // FIXME This can be NULL, when dragging a new link in the UI, should probably copy the node tree for preview render - campbell
- link->tosock->flag |= SOCK_IN_USE;
- }
-}
-
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
@@ -1425,16 +1399,27 @@ static void ntree_update_link_pointers(bNodeTree *ntree)
/* first clear data */
for(node= ntree->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
+ for(sock= node->inputs.first; sock; sock= sock->next) {
sock->link= NULL;
+ sock->flag &= ~SOCK_IN_USE;
+ }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ sock->flag &= ~SOCK_IN_USE;
+ }
+ }
+ for(sock= ntree->inputs.first; sock; sock= sock->next) {
+ sock->flag &= ~SOCK_IN_USE;
}
- /* clear socket links */
- for(sock= ntree->outputs.first; sock; sock= sock->next)
+ for(sock= ntree->outputs.first; sock; sock= sock->next) {
sock->link= NULL;
+ sock->flag &= ~SOCK_IN_USE;
+ }
for(link= ntree->links.first; link; link= link->next) {
- if (link->tosock)
- link->tosock->link= link;
+ link->tosock->link= link;
+
+ link->fromsock->flag |= SOCK_IN_USE;
+ link->tosock->flag |= SOCK_IN_USE;
}
}
@@ -1907,6 +1892,7 @@ static void registerShaderNodes(bNodeTreeType *ttype)
register_node_type_sh_output(ttype);
register_node_type_sh_material(ttype);
register_node_type_sh_camera(ttype);
+ register_node_type_sh_gamma(ttype);
register_node_type_sh_value(ttype);
register_node_type_sh_rgb(ttype);
register_node_type_sh_mix_rgb(ttype);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f2df16c8100..8251c4796ea 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -120,7 +120,7 @@ void clear_workob(Object *workob)
memset(workob, 0, sizeof(Object));
workob->size[0]= workob->size[1]= workob->size[2]= 1.0f;
- workob->dsize[0]= workob->dsize[1]= workob->dsize[2]= 1.0f;
+ workob->dscale[0]= workob->dscale[1]= workob->dscale[2]= 1.0f;
workob->rotmode= ROT_MODE_EUL;
}
@@ -775,7 +775,7 @@ Object *add_only_object(int type, const char *name)
ob->col[3]= 1.0;
ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- ob->dsize[0]= ob->dsize[1]= ob->dsize[2]= 1.0;
+ ob->dscale[0]= ob->dscale[1]= ob->dscale[2]= 1.0;
/* objects should default to having Euler XYZ rotations,
* but rotations default to quaternions
@@ -1363,7 +1363,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
* this is closer to making a copy of the object - in-place. */
if(gob) {
ob->rotmode= target->rotmode;
- mul_m4_m4m4(ob->obmat, target->obmat, gob->obmat);
+ mult_m4_m4m4(ob->obmat, gob->obmat, target->obmat);
if(gob->dup_group) { /* should always be true */
float tvec[3];
copy_v3_v3(tvec, gob->dup_group->dupli_ofs);
@@ -1397,7 +1397,6 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->matbits= NULL;
if ((target->totcol) && (target->mat) && OB_TYPE_SUPPORT_MATERIAL(ob->type)) {
int i;
- ob->colbits = target->colbits;
ob->actcol= target->actcol;
ob->totcol= target->totcol;
@@ -1443,7 +1442,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
void object_scale_to_mat3(Object *ob, float mat[][3])
{
float vec[3];
- mul_v3_v3v3(vec, ob->size, ob->dsize);
+ mul_v3_v3v3(vec, ob->size, ob->dscale);
size_to_mat3( mat,vec);
}
@@ -1529,7 +1528,7 @@ void object_tfm_protected_backup(const Object *ob,
TFMCPY3D(loc);
TFMCPY3D(dloc);
TFMCPY3D(size);
- TFMCPY3D(dsize);
+ TFMCPY3D(dscale);
TFMCPY3D(rot);
TFMCPY3D(drot);
TFMCPY4D(quat);
@@ -1559,7 +1558,7 @@ void object_tfm_protected_restore(Object *ob,
if (protectflag & (OB_LOCK_SCALEX<<i)) {
ob->size[i]= obtfm->size[i];
- ob->dsize[i]= obtfm->dsize[i];
+ ob->dscale[i]= obtfm->dscale[i];
}
if (protectflag & (OB_LOCK_ROTX<<i)) {
@@ -1590,9 +1589,9 @@ void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const
if(use_parent && ob->parent) {
float rmat[4][4], diff_mat[4][4], imat[4][4];
- mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
+ mult_m4_m4m4(diff_mat, ob->parent->obmat, ob->parentinv);
invert_m4_m4(imat, diff_mat);
- mul_m4_m4m4(rmat, mat, imat); /* get the parent relative matrix */
+ mult_m4_m4m4(rmat, imat, mat); /* get the parent relative matrix */
object_apply_mat4(ob, rmat, use_compat, FALSE);
/* same as below, use rmat rather than mat */
@@ -1606,9 +1605,9 @@ void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const
sub_v3_v3(ob->loc, ob->dloc);
- if (ob->dsize[0] != 0.0f) ob->size[0] /= ob->dsize[0];
- if (ob->dsize[1] != 0.0f) ob->size[1] /= ob->dsize[1];
- if (ob->dsize[2] != 0.0f) ob->size[2] /= ob->dsize[2];
+ if (ob->dscale[0] != 0.0f) ob->size[0] /= ob->dscale[0];
+ if (ob->dscale[1] != 0.0f) ob->size[1] /= ob->dscale[1];
+ if (ob->dscale[2] != 0.0f) ob->size[2] /= ob->dscale[2];
/* object_mat3_to_rot handles delta rotations */
}
@@ -1716,7 +1715,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
if(cu->flag & CU_PATH_RADIUS) {
float tmat[4][4], rmat[4][4];
scale_m4_fl(tmat, radius);
- mul_m4_m4m4(rmat, mat, tmat);
+ mult_m4_m4m4(rmat, tmat, mat);
copy_m4_m4(mat, rmat);
}
@@ -2417,7 +2416,7 @@ void BKE_scene_foreach_display_point(
/* copied from DNA_object_types.h */
typedef struct ObTfmBack {
float loc[3], dloc[3], orig[3];
- float size[3], dsize[3]; /* scale and delta scale */
+ float size[3], dscale[3]; /* scale and delta scale */
float rot[3], drot[3]; /* euler rotation */
float quat[4], dquat[4]; /* quaternion rotation */
float rotAxis[3], drotAxis[3]; /* axis angle rotation - axis part */
@@ -2435,7 +2434,7 @@ void *object_tfm_backup(Object *ob)
copy_v3_v3(obtfm->dloc, ob->dloc);
copy_v3_v3(obtfm->orig, ob->orig);
copy_v3_v3(obtfm->size, ob->size);
- copy_v3_v3(obtfm->dsize, ob->dsize);
+ copy_v3_v3(obtfm->dscale, ob->dscale);
copy_v3_v3(obtfm->rot, ob->rot);
copy_v3_v3(obtfm->drot, ob->drot);
copy_qt_qt(obtfm->quat, ob->quat);
@@ -2459,7 +2458,7 @@ void object_tfm_restore(Object *ob, void *obtfm_pt)
copy_v3_v3(ob->dloc, obtfm->dloc);
copy_v3_v3(ob->orig, obtfm->orig);
copy_v3_v3(ob->size, obtfm->size);
- copy_v3_v3(ob->dsize, obtfm->dsize);
+ copy_v3_v3(ob->dscale, obtfm->dscale);
copy_v3_v3(ob->rot, obtfm->rot);
copy_v3_v3(ob->drot, obtfm->drot);
copy_qt_qt(ob->quat, obtfm->quat);
@@ -2474,6 +2473,14 @@ void object_tfm_restore(Object *ob, void *obtfm_pt)
copy_m4_m4(ob->imat, obtfm->imat);
}
+int BKE_object_parent_loop_check(const Object *par, const Object *ob)
+{
+ /* test if 'ob' is a parent somewhere in par's parents */
+ if(par == NULL) return 0;
+ if(ob == par) return 1;
+ return BKE_object_parent_loop_check(par->parent, ob);
+}
+
/* proxy rule: lib_object->proxy_from == the one we borrow from, only set temporal and cleared here */
/* local_object->proxy == pointer to library object, saved in files and read */
@@ -2513,7 +2520,7 @@ void object_handle_update(Scene *scene, Object *ob)
if(ob->proxy_from->proxy_group) {/* transform proxy into group space */
Object *obg= ob->proxy_from->proxy_group;
invert_m4_m4(obg->imat, obg->obmat);
- mul_m4_m4m4(ob->obmat, ob->proxy_from->obmat, obg->imat);
+ mult_m4_m4m4(ob->obmat, obg->imat, ob->proxy_from->obmat);
if(obg->dup_group) { /* should always be true */
add_v3_v3(ob->obmat[3], obg->dup_group->dupli_ofs);
}
@@ -2556,7 +2563,7 @@ void object_handle_update(Scene *scene, Object *ob)
#else /* ensure CD_MASK_BAREMESH for now */
EditMesh *em = (ob == scene->obedit)? BKE_mesh_get_editmesh(ob->data): NULL;
- unsigned int data_mask= scene->customdata_mask | ob->customdata_mask | CD_MASK_BAREMESH;
+ uint64_t data_mask= scene->customdata_mask | ob->customdata_mask | CD_MASK_BAREMESH;
if(em) {
makeDerivedMesh(scene, ob, em, data_mask); /* was CD_MASK_BAREMESH */
BKE_mesh_end_editmesh(ob->data, em);
diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c
index ae622358fd2..15ce2e377b6 100644
--- a/source/blender/blenkernel/intern/ocean.c
+++ b/source/blender/blenkernel/intern/ocean.c
@@ -1343,7 +1343,8 @@ typedef struct Ocean {
} Ocean;
-float BKE_ocean_jminus_to_foam(float UNUSED(jminus), float UNUSED(coverage)) {
+float BKE_ocean_jminus_to_foam(float UNUSED(jminus), float UNUSED(coverage))
+{
return 0.0f;
}
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 56ce853bfb9..fe848f3d76c 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -90,15 +90,28 @@ void paint_brush_set(Paint *p, Brush *br)
}
}
+/* are we in vertex paint or weight pain face select mode? */
int paint_facesel_test(Object *ob)
{
- return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_MASK) && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)));
+ return ( (ob != NULL) &&
+ (ob->type == OB_MESH) &&
+ (ob->data != NULL) &&
+ (((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_MASK) &&
+ (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))
+ );
}
+/* are we in weight paint vertex select mode? */
int paint_vertsel_test(Object *ob)
{
- return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_VERT_SEL) && (ob->mode & OB_MODE_WEIGHT_PAINT));
+ return ( (ob != NULL) &&
+ (ob->type == OB_MESH) &&
+ (ob->data != NULL) &&
+ (((Mesh *)ob->data)->editflag & ME_EDIT_VERT_SEL) &&
+ (ob->mode & OB_MODE_WEIGHT_PAINT)
+ );
}
+
void paint_init(Paint *p, const char col[3])
{
Brush *brush;
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 0f2d14e3858..ce50c58a6e1 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -79,6 +79,7 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "BKE_deform.h"
#include "RE_render_ext.h"
@@ -89,7 +90,8 @@ static void do_child_modifiers(ParticleSimulationData *sim,
float *orco, float mat[4][4], ParticleKey *state, float t);
/* few helpers for countall etc. */
-int count_particles(ParticleSystem *psys){
+int count_particles(ParticleSystem *psys)
+{
ParticleSettings *part=psys->part;
PARTICLE_P;
int tot=0;
@@ -101,7 +103,8 @@ int count_particles(ParticleSystem *psys){
}
return tot;
}
-int count_particles_mod(ParticleSystem *psys, int totgr, int cur){
+int count_particles_mod(ParticleSystem *psys, int totgr, int cur)
+{
ParticleSettings *part=psys->part;
PARTICLE_P;
int tot=0;
@@ -708,8 +711,8 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float
psys->childcachebufs.first = psys->childcachebufs.last = NULL;
copy_m4_m4(data->winmat, winmat);
- mul_m4_m4m4(data->viewmat, ob->obmat, viewmat);
- mul_m4_m4m4(data->mat, data->viewmat, winmat);
+ mult_m4_m4m4(data->viewmat, viewmat, ob->obmat);
+ mult_m4_m4m4(data->mat, winmat, data->viewmat);
data->winx= winx;
data->winy= winy;
@@ -1122,7 +1125,8 @@ static int get_pointcache_times_for_particle(PointCache *cache, int index, float
return ret == 2;
}
-float psys_get_dietime_from_cache(PointCache *cache, int index) {
+float psys_get_dietime_from_cache(PointCache *cache, int index)
+{
PTCacheMem *pm;
int dietime = 10000000; /* some max value so that we can default to pa->time+lifetime */
@@ -1365,7 +1369,9 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
/* Particles on a dm */
/************************************************/
/* interpolate a location on a face based on face coordinates */
-void psys_interpolate_face(MVert *mvert, MFace *mface, MTFace *tface, float (*orcodata)[3], float *w, float *vec, float *nor, float *utan, float *vtan, float *orco,float *ornor){
+void psys_interpolate_face(MVert *mvert, MFace *mface, MTFace *tface, float (*orcodata)[3],
+ float *w, float *vec, float *nor, float *utan, float *vtan, float *orco,float *ornor)
+{
float *v1=0, *v2=0, *v3=0, *v4=0;
float e1[3],e2[3],s1,s2,t1,t2;
float *uv1, *uv2, *uv3, *uv4;
@@ -1827,7 +1833,8 @@ static void psys_particle_on_shape(int UNUSED(distr), int UNUSED(index), float *
/************************************************/
/* Particles on emitter */
/************************************************/
-void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor){
+void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+{
if(psmd){
if(psmd->psys->part->distr==PART_DISTR_GRID && psmd->psys->part->from != PART_FROM_VERT){
if(vec)
@@ -1847,20 +1854,6 @@ void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int in
/************************************************/
/* Path Cache */
/************************************************/
-static float vert_weight(MDeformVert *dvert, int group)
-{
- MDeformWeight *dw;
- int i;
-
- if(dvert) {
- dw= dvert->dw;
- for(i= dvert->totweight; i>0; i--, dw++) {
- if(dw->def_nr == group) return dw->weight;
- if(i==1) break; /*otherwise dw will point to somewhere it shouldn't*/
- }
- }
- return 0.0;
-}
static void do_kink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, float flat, short type, short axis, float obmat[][4], int smooth_start)
{
@@ -2308,11 +2301,11 @@ float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
vg=MEM_callocN(sizeof(float)*totvert, "vg_cache");
if(psys->vg_neg&(1<<vgroup)){
for(i=0; i<totvert; i++)
- vg[i]=1.0f-vert_weight(dvert+i,psys->vgroup[vgroup]-1);
+ vg[i]= 1.0f - defvert_find_weight(&dvert[i], psys->vgroup[vgroup] - 1);
}
else{
for(i=0; i<totvert; i++)
- vg[i]=vert_weight(dvert+i,psys->vgroup[vgroup]-1);
+ vg[i]= defvert_find_weight(&dvert[i], psys->vgroup[vgroup] - 1);
}
}
}
@@ -3244,7 +3237,8 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
/************************************************/
/* Particle Key handling */
/************************************************/
-void copy_particle_key(ParticleKey *to, ParticleKey *from, int time){
+void copy_particle_key(ParticleKey *to, ParticleKey *from, int time)
+{
if(time){
memcpy(to,from,sizeof(ParticleKey));
}
@@ -3254,7 +3248,8 @@ void copy_particle_key(ParticleKey *to, ParticleKey *from, int time){
to->time=to_time;
}
}
-void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, float *time){
+void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, float *time)
+{
if(loc) copy_v3_v3(loc,key->co);
if(vel) copy_v3_v3(vel,key->vel);
if(rot) copy_qt_qt(rot,key->rot);
@@ -3262,7 +3257,8 @@ void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, flo
}
/*-------changing particle keys from space to another-------*/
#if 0
-static void key_from_object(Object *ob, ParticleKey *key){
+static void key_from_object(Object *ob, ParticleKey *key)
+{
float q[4];
add_v3_v3(key->vel, key->co);
@@ -3387,7 +3383,7 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
psys_mat_hair_to_object(ob, dm, from, pa, facemat);
- mul_m4_m4m4(hairmat, facemat, ob->obmat);
+ mult_m4_m4m4(hairmat, ob->obmat, facemat);
}
/************************************************/
@@ -4190,7 +4186,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
}
}
/* gets particle's state at a time, returns 1 if particle exists and can be seen and 0 if not */
-int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *state, int always){
+int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *state, int always)
+{
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
ParticleData *pa = NULL;
@@ -4528,7 +4525,8 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3]
}
-void psys_apply_hair_lattice(Scene *scene, Object *ob, ParticleSystem *psys) {
+void psys_apply_hair_lattice(Scene *scene, Object *ob, ParticleSystem *psys)
+{
ParticleSimulationData sim= {0};
sim.scene= scene;
sim.ob= ob;
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index a955643cbcc..4afe9412786 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -39,6 +39,10 @@
#include <math.h>
#include <string.h>
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
@@ -107,7 +111,8 @@
/* Reacting to system events */
/************************************************/
-static int particles_are_dynamic(ParticleSystem *psys) {
+static int particles_are_dynamic(ParticleSystem *psys)
+{
if(psys->pointcache->flag & PTCACHE_BAKED)
return 0;
@@ -2240,7 +2245,8 @@ static void sph_spring_delete(ParticleSystem *psys, int j)
psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
}
}
-static void sph_springs_modify(ParticleSystem *psys, float dtime){
+static void sph_springs_modify(ParticleSystem *psys, float dtime)
+{
SPHFluidSettings *fluid = psys->part->fluid;
ParticleData *pa1, *pa2;
ParticleSpring *spring = psys->fluid_springs;
@@ -2299,6 +2305,7 @@ static EdgeHash *sph_springhash_build(ParticleSystem *psys)
return springhash;
}
+#define SPH_NEIGHBORS 512
typedef struct SPHNeighbor
{
ParticleSystem *psys;
@@ -2306,7 +2313,7 @@ typedef struct SPHNeighbor
} SPHNeighbor;
typedef struct SPHRangeData
{
- SPHNeighbor neighbors[128];
+ SPHNeighbor neighbors[SPH_NEIGHBORS];
int tot_neighbors;
float density, near_density;
@@ -2317,10 +2324,6 @@ typedef struct SPHRangeData
float massfac;
int use_size;
-
- /* Same as SPHData::element_size */
- float element_size;
- float flow[3];
} SPHRangeData;
typedef struct SPHData {
ParticleSystem *psys[10];
@@ -2330,9 +2333,15 @@ typedef struct SPHData {
float *gravity;
/* Average distance to neighbours (other particles in the support domain),
for calculating the Courant number (adaptive time step). */
+ int pass;
float element_size;
float flow[3];
+
+ /* Integrator callbacks. This allows different SPH implementations. */
+ void (*force_cb) (void *sphdata_v, ParticleKey *state, float *force, float *impulse);
+ void (*density_cb) (void *rangedata_v, int index, float squared_dist);
}SPHData;
+
static void sph_density_accum_cb(void *userdata, int index, float squared_dist)
{
SPHRangeData *pfr = (SPHRangeData *)userdata;
@@ -2343,11 +2352,13 @@ static void sph_density_accum_cb(void *userdata, int index, float squared_dist)
if(npa == pfr->pa || squared_dist < FLT_EPSILON)
return;
- /* Ugh! One particle has over 128 neighbors! Really shouldn't happen,
- * but even if it does it shouldn't do any terrible harm if all are
- * not taken into account - jahka
+ /* Ugh! One particle has too many neighbors! If some aren't taken into
+ * account, the forces will be biased by the tree search order. This
+ * effectively adds enery to the system, and results in a churning motion.
+ * But, we have to stop somewhere, and it's not the end of the world.
+ * - jahka and z0r
*/
- if(pfr->tot_neighbors >= 128)
+ if(pfr->tot_neighbors >= SPH_NEIGHBORS)
return;
pfr->neighbors[pfr->tot_neighbors].index = index;
@@ -2357,15 +2368,38 @@ static void sph_density_accum_cb(void *userdata, int index, float squared_dist)
dist = sqrtf(squared_dist);
q = (1.f - dist/pfr->h) * pfr->massfac;
- add_v3_v3(pfr->flow, npa->state.vel);
- pfr->element_size += dist;
-
if(pfr->use_size)
q *= npa->size;
pfr->density += q*q;
pfr->near_density += q*q*q;
}
+/*
+ * Find the Courant number for an SPH particle (used for adaptive time step).
+ */
+static void sph_particle_courant(SPHData *sphdata, SPHRangeData *pfr) {
+ ParticleData *pa, *npa;
+ int i;
+ float flow[3], offset[3], dist;
+
+ flow[0] = flow[1] = flow[2] = 0.0f;
+ dist = 0.0f;
+ if (pfr->tot_neighbors > 0) {
+ pa = pfr->pa;
+ for (i=0; i < pfr->tot_neighbors; i++) {
+ npa = pfr->neighbors[i].psys->particles + pfr->neighbors[i].index;
+ sub_v3_v3v3(offset, pa->prev_state.co, npa->prev_state.co);
+ dist += len_v3(offset);
+ add_v3_v3(flow, npa->prev_state.vel);
+ }
+ dist += sphdata->psys[0]->part->fluid->radius; // TODO: remove this? - z0r
+ sphdata->element_size = dist / pfr->tot_neighbors;
+ mul_v3_v3fl(sphdata->flow, flow, 1.0f / pfr->tot_neighbors);
+ } else {
+ sphdata->element_size = MAXFLOAT;
+ VECCOPY(sphdata->flow, flow);
+ }
+}
static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, float *UNUSED(impulse))
{
SPHData *sphdata = (SPHData *)sphdata_v;
@@ -2406,24 +2440,14 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa
pfr.density = pfr.near_density = 0.f;
pfr.h = h;
pfr.pa = pa;
- pfr.element_size = fluid->radius;
- pfr.flow[0] = pfr.flow[1] = pfr.flow[2] = 0.0f;
for(i=0; i<10 && psys[i]; i++) {
pfr.npsys = psys[i];
pfr.massfac = psys[i]->part->mass*inv_mass;
pfr.use_size = psys[i]->part->flag & PART_SIZEMASS;
- BLI_bvhtree_range_query(psys[i]->bvhtree, state->co, h, sph_density_accum_cb, &pfr);
- }
- if (pfr.tot_neighbors > 0) {
- pfr.element_size /= pfr.tot_neighbors;
- mul_v3_fl(pfr.flow, 1.0f / pfr.tot_neighbors);
- } else {
- pfr.element_size = MAXFLOAT;
+ BLI_bvhtree_range_query(psys[i]->bvhtree, state->co, h, sphdata->density_cb, &pfr);
}
- sphdata->element_size = pfr.element_size;
- copy_v3_v3(sphdata->flow, pfr.flow);
pressure = stiffness * (pfr.density - rest_density);
near_pressure = stiffness_near_fac * pfr.near_density;
@@ -2462,6 +2486,7 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa
if(spring_constant > 0.f) {
/* Viscoelastic spring force */
if (pfn->psys == psys[0] && fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash) {
+ /* BLI_edgehash_lookup appears to be thread-safe. - z0r */
spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, pfn->index));
if(spring_index) {
@@ -2475,7 +2500,9 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa
temp_spring.particle_index[1] = pfn->index;
temp_spring.rest_length = (fluid->flag & SPH_CURRENT_REST_LENGTH) ? rij : rest_length;
temp_spring.delete_flag = 0;
-
+
+ /* sph_spring_add is not thread-safe. - z0r */
+ #pragma omp critical
sph_spring_add(psys[0], &temp_spring);
}
}
@@ -2488,28 +2515,52 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa
/* Artificial buoyancy force in negative gravity direction */
if (fluid->buoyancy > 0.f && gravity)
madd_v3_v3fl(force, gravity, fluid->buoyancy * (pfr.density-rest_density));
+
+ if (sphdata->pass == 0 && psys[0]->part->time_flag & PART_TIME_AUTOSF)
+ sph_particle_courant(sphdata, &pfr);
+ sphdata->pass++;
}
-static void sph_integrate(ParticleSimulationData *sim, ParticleData *pa, float dfra, float *gravity, EdgeHash *springhash, float *element_size, float flow[3]) {
+static void sph_solver_init(ParticleSimulationData *sim, SPHData *sphdata) {
ParticleTarget *pt;
int i;
+ // Add other coupled particle systems.
+ sphdata->psys[0] = sim->psys;
+ for(i=1, pt=sim->psys->targets.first; i<10; i++, pt=(pt?pt->next:NULL))
+ sphdata->psys[i] = pt ? psys_get_target_system(sim->ob, pt) : NULL;
+
+ if (psys_uses_gravity(sim))
+ sphdata->gravity = sim->scene->physics_settings.gravity;
+ else
+ sphdata->gravity = NULL;
+ sphdata->eh = sph_springhash_build(sim->psys);
+
+ // These per-particle values should be overridden later, but just for
+ // completeness we give them default values now.
+ sphdata->pa = NULL;
+ sphdata->mass = 1.0f;
+
+ sphdata->force_cb = sph_force_cb;
+ sphdata->density_cb = sph_density_accum_cb;
+}
+static void sph_solver_finalise(SPHData *sphdata) {
+ if (sphdata->eh) {
+ BLI_edgehash_free(sphdata->eh, NULL);
+ sphdata->eh = NULL;
+ }
+}
+static void sph_integrate(ParticleSimulationData *sim, ParticleData *pa, float dfra, SPHData *sphdata){
ParticleSettings *part = sim->psys->part;
// float timestep = psys_get_timestep(sim); // UNUSED
float pa_mass = part->mass * (part->flag & PART_SIZEMASS ? pa->size : 1.f);
float dtime = dfra*psys_get_timestep(sim);
// int steps = 1; // UNUSED
float effector_acceleration[3];
- SPHData sphdata;
- sphdata.psys[0] = sim->psys;
- for(i=1, pt=sim->psys->targets.first; i<10; i++, pt=(pt?pt->next:NULL))
- sphdata.psys[i] = pt ? psys_get_target_system(sim->ob, pt) : NULL;
-
- sphdata.pa = pa;
- sphdata.gravity = gravity;
- sphdata.mass = pa_mass;
- sphdata.eh = springhash;
+ sphdata->pa = pa;
+ sphdata->mass = pa_mass;
+ sphdata->pass = 0;
//sphdata.element_size and sphdata.flow are set in the callback.
/* restore previous state and treat gravity & effectors as external acceleration*/
@@ -2518,9 +2569,7 @@ static void sph_integrate(ParticleSimulationData *sim, ParticleData *pa, float d
copy_particle_key(&pa->state, &pa->prev_state, 0);
- integrate_particle(part, pa, dtime, effector_acceleration, sph_force_cb, &sphdata);
- *element_size = sphdata.element_size;
- copy_v3_v3(flow, sphdata.flow);
+ integrate_particle(part, pa, dtime, effector_acceleration, sphdata->force_cb, sphdata);
}
/************************************************/
@@ -3293,7 +3342,8 @@ static void collision_fail(ParticleData *pa, ParticleCollision *col)
* -uses Newton-Rhapson iteration to find the collisions
* -handles spherical particles and (nearly) point like particles
*/
-static void collision_check(ParticleSimulationData *sim, int p, float dfra, float cfra){
+static void collision_check(ParticleSimulationData *sim, int p, float dfra, float cfra)
+{
ParticleSettings *part = sim->psys->part;
ParticleData *pa = sim->psys->particles + p;
ParticleCollision col;
@@ -3561,7 +3611,8 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
psys->flag |= PSYS_HAIR_UPDATED;
}
-static void save_hair(ParticleSimulationData *sim, float UNUSED(cfra)){
+static void save_hair(ParticleSimulationData *sim, float UNUSED(cfra))
+{
Object *ob = sim->ob;
ParticleSystem *psys = sim->psys;
HairKey *key, *root;
@@ -3618,15 +3669,15 @@ static void save_hair(ParticleSimulationData *sim, float UNUSED(cfra)){
step, after the velocity has been updated. element_size defines the scale of
the simulation, and is typically the distance to neighbourning particles. */
void update_courant_num(ParticleSimulationData *sim, ParticleData *pa,
- float dtime, float element_size, float flow[3])
+ float dtime, SPHData *sphdata)
{
float relative_vel[3];
float speed;
- sub_v3_v3v3(relative_vel, pa->state.vel, flow);
+ sub_v3_v3v3(relative_vel, pa->prev_state.vel, sphdata->flow);
speed = len_v3(relative_vel);
- if (sim->courant_num < speed * dtime / element_size)
- sim->courant_num = speed * dtime / element_size;
+ if (sim->courant_num < speed * dtime / sphdata->element_size)
+ sim->courant_num = speed * dtime / sphdata->element_size;
}
/* Update time step size to suit current conditions. */
float update_timestep(ParticleSystem *psys, ParticleSimulationData *sim,
@@ -3712,11 +3763,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
case PART_PHYS_FLUID:
{
ParticleTarget *pt = psys->targets.first;
- psys_update_particle_bvhtree(psys, psys->cfra);
+ psys_update_particle_bvhtree(psys, cfra);
for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
if(pt->ob)
- psys_update_particle_bvhtree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), psys->cfra);
+ psys_update_particle_bvhtree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
}
break;
}
@@ -3798,37 +3849,32 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
}
case PART_PHYS_FLUID:
{
- EdgeHash *springhash = sph_springhash_build(psys);
- float *gravity = NULL;
- float element_size, flow[3];
-
- if(psys_uses_gravity(sim))
- gravity = sim->scene->physics_settings.gravity;
+ SPHData sphdata;
+ sph_solver_init(sim, &sphdata);
+ #pragma omp parallel for firstprivate (sphdata) private (pa) schedule(dynamic,5)
LOOP_DYNAMIC_PARTICLES {
/* do global forces & effectors */
basic_integrate(sim, p, pa->state.time, cfra);
/* actual fluids calculations */
- sph_integrate(sim, pa, pa->state.time, gravity, springhash,
- &element_size, flow);
+ sph_integrate(sim, pa, pa->state.time, &sphdata);
if(sim->colliders)
collision_check(sim, p, pa->state.time, cfra);
- /* SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
+ /* SPH particles are not physical particles, just interpolation
+ * particles, thus rotation has not a direct sense for them */
basic_rotate(part, pa, pa->state.time, timestep);
+ #pragma omp critical
if (part->time_flag & PART_TIME_AUTOSF)
- update_courant_num(sim, pa, dtime, element_size, flow);
+ update_courant_num(sim, pa, dtime, &sphdata);
}
sph_springs_modify(psys, timestep);
- if(springhash) {
- BLI_edgehash_free(springhash, NULL);
- springhash = NULL;
- }
+ sph_solver_finalise(&sphdata);
break;
}
}
@@ -4241,7 +4287,8 @@ void psys_check_boid_data(ParticleSystem *psys)
}
}
-static void fluid_default_settings(ParticleSettings *part){
+static void fluid_default_settings(ParticleSettings *part)
+{
SPHFluidSettings *fluid = part->fluid;
fluid->spring_k = 0.f;
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 5445c990a9b..411e77de858 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1491,7 +1491,7 @@ static int ptcache_old_elemsize(PTCacheID *pid)
static void ptcache_find_frames_around(PTCacheID *pid, unsigned int frame, int *fra1, int *fra2)
{
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- int cfra1=frame-1, cfra2=frame+1;
+ int cfra1=frame, cfra2=frame+1;
while(cfra1 >= pid->cache->startframe && !BKE_ptcache_id_exist(pid, cfra1))
cfra1--;
@@ -1518,7 +1518,7 @@ static void ptcache_find_frames_around(PTCacheID *pid, unsigned int frame, int *
PTCacheMem *pm = pid->cache->mem_cache.first;
PTCacheMem *pm2 = pid->cache->mem_cache.last;
- while(pm->next && pm->next->frame < frame)
+ while(pm->next && pm->next->frame <= frame)
pm= pm->next;
if(pm2->frame < frame) {
@@ -1841,7 +1841,7 @@ static int ptcache_interpolate(PTCacheID *pid, float cfra, int cfra1, int cfra2)
/* possible to get old or interpolated result */
int BKE_ptcache_read(PTCacheID *pid, float cfra)
{
- int cfrai = (int)cfra, cfra1=0, cfra2=0;
+ int cfrai = (int)floor(cfra), cfra1=0, cfra2=0;
int ret = 0;
/* nothing to read to */
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index c284ed02868..ebe360ef91b 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -394,10 +394,6 @@ Scene *add_scene(const char *name)
sce->r.simplify_shadowsamples= 16;
sce->r.simplify_aosss= 1.0f;
- sce->r.cineonblack= 95;
- sce->r.cineonwhite= 685;
- sce->r.cineongamma= 1.7f;
-
sce->r.border.xmin= 0.0f;
sce->r.border.ymin= 0.0f;
sce->r.border.xmax= 1.0f;
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index e8e9c754806..718b3144677 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -1581,7 +1581,7 @@ typedef struct WipeZone {
static void precalc_wipe_zone(WipeZone *wipezone, WipeVars *wipe, int xo, int yo)
{
wipezone->flip = (wipe->angle < 0);
- wipezone->angle = pow(fabsf(wipe->angle)/45.0f, log(xo)/M_LN2);
+ wipezone->angle = tan(DEG2RAD(fabsf(wipe->angle)));
wipezone->xo = xo;
wipezone->yo = yo;
wipezone->width = (int)(wipe->edgeWidth*((xo+yo)/2.0f));
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 249555578f0..cc4b8917a32 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -2025,7 +2025,10 @@ static ImBuf * seq_render_scene_strip_impl(
}
/* float buffers in the sequencer are not linear */
- ibuf->profile= IB_PROFILE_LINEAR_RGB;
+ if(scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ ibuf->profile= IB_PROFILE_LINEAR_RGB;
+ else
+ ibuf->profile= IB_PROFILE_NONE;
IMB_convert_profile(ibuf, IB_PROFILE_SRGB);
}
else if (rres.rect32) {
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 050aaee92e4..e773eb6dd35 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -225,6 +225,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
CCGVertHDL fverts[4];
EdgeHash *ehash;
float creaseFactor = (float)ccgSubSurf_getSubdivisionLevels(ss);
+ float uv[3]= {0.0f, 0.0f, 0.0f}; /* only first 2 values are written into */
limit[0]= limit[1]= STD_UV_CONNECT_LIMIT;
vmap= make_uv_vert_map(mface, tface, totface, totvert, 0, limit);
@@ -248,11 +249,8 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm,
if (v->separate) {
CCGVert *ssv;
CCGVertHDL vhdl = SET_INT_IN_POINTER(v->f*4 + v->tfindex);
- float uv[3];
- uv[0]= (tface+v->f)->uv[v->tfindex][0];
- uv[1]= (tface+v->f)->uv[v->tfindex][1];
- uv[2]= 0.0f;
+ copy_v2_v2(uv, (tface+v->f)->uv[v->tfindex]);
ccgSubSurf_syncVert(ss, vhdl, uv, seam, &ssv);
}
@@ -359,15 +357,10 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
for(y = 0; y < gridFaces; y++) {
for(x = 0; x < gridFaces; x++) {
- float *a = faceGridData[(y + 0)*gridSize + x + 0].co;
- float *b = faceGridData[(y + 0)*gridSize + x + 1].co;
- float *c = faceGridData[(y + 1)*gridSize + x + 1].co;
- float *d = faceGridData[(y + 1)*gridSize + x + 0].co;
-
- tf->uv[0][0] = a[0]; tf->uv[0][1] = a[1];
- tf->uv[1][0] = d[0]; tf->uv[1][1] = d[1];
- tf->uv[2][0] = c[0]; tf->uv[2][1] = c[1];
- tf->uv[3][0] = b[0]; tf->uv[3][1] = b[1];
+ copy_v2_v2(tf->uv[0], faceGridData[(y + 0)*gridSize + x + 0].co);
+ copy_v2_v2(tf->uv[1], faceGridData[(y + 1)*gridSize + x + 0].co);
+ copy_v2_v2(tf->uv[2], faceGridData[(y + 1)*gridSize + x + 1].co);
+ copy_v2_v2(tf->uv[3], faceGridData[(y + 0)*gridSize + x + 1].co);
tf++;
}
@@ -481,10 +474,10 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
fVerts[2] = SET_INT_IN_POINTER(mf->v3);
fVerts[3] = SET_INT_IN_POINTER(mf->v4);
- // this is very bad, means mesh is internally consistent.
- // it is not really possible to continue without modifying
- // other parts of code significantly to handle missing faces.
- // since this really shouldn't even be possible we just bail.
+ /* this is very bad, means mesh is internally inconsistent.
+ * it is not really possible to continue without modifying
+ * other parts of code significantly to handle missing faces.
+ * since this really shouldn't even be possible we just bail.*/
if(ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), fVerts[3] ? 4 : 3,
fVerts, &f) == eCCGError_InvalidValue) {
static int hasGivenError = 0;
@@ -1368,7 +1361,11 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
}
/* Only used by non-editmesh types */
-static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs), int (*setDrawOptions)(void *userData, int index), void *userData) {
+static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm,
+ int (*setMaterial)(int, void *attribs),
+ int (*setDrawOptions)(void *userData, int index),
+ void *userData)
+{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
GPUVertexAttribs gattribs;
@@ -1725,6 +1722,7 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), uns
static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
int (*drawParams)(MTFace *tface, int has_mcol, int matnr),
int (*drawParamsMapped)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
void *userData)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -1735,6 +1733,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
int i, totface, flag, gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
+ (void) compareDrawOptions;
+
ccgdm_pbvh_update(ccgdm);
if(!mcol)
@@ -1865,14 +1865,20 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
}
}
-static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr))
+static void ccgDM_drawFacesTex(DerivedMesh *dm,
+ int (*setDrawOptions)(MTFace *tface, int has_mcol, int matnr),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
{
- ccgDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
+ ccgDM_drawFacesTex_common(dm, setDrawOptions, NULL, compareDrawOptions, userData);
}
-static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
+static void ccgDM_drawMappedFacesTex(DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData)
{
- ccgDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
+ ccgDM_drawFacesTex_common(dm, NULL, setDrawOptions, compareDrawOptions, userData);
}
static void ccgDM_drawUVEdges(DerivedMesh *dm)
@@ -1908,8 +1914,12 @@ static void ccgDM_drawUVEdges(DerivedMesh *dm)
}
}
-static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs),
- int (*compareDrawOptions)(void *userData, int cur_index, int next_index)) {
+static void ccgDM_drawMappedFaces(DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r),
+ int (*setMaterial)(int, void *attribs),
+ int (*compareDrawOptions)(void *userData, int cur_index, int next_index),
+ void *userData, int useColors)
+{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
MCol *mcol= NULL;
@@ -2282,6 +2292,9 @@ static int ccgdm_adjacent_grid(CCGSubSurf *ss, int *gridOffset, CCGFace *f, int
break;
}
}
+
+ if(numEdges == 0)
+ return -1;
fIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, adjf));
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index 48bc4926a85..e1e872c42b6 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -47,7 +47,8 @@ static SuggList suggestions = {NULL, NULL, NULL, NULL, NULL};
static char *documentation = NULL;
//static int doc_lines = 0;
-static int txttl_cmp(const char *first, const char *second, int len) {
+static int txttl_cmp(const char *first, const char *second, int len)
+{
int cmp, i;
for (cmp=0, i=0; i<len; i++) {
if ( (cmp= toupper(first[i])-toupper(second[i])) ) {
@@ -57,7 +58,8 @@ static int txttl_cmp(const char *first, const char *second, int len) {
return cmp;
}
-static void txttl_free_suggest(void) {
+static void txttl_free_suggest(void)
+{
SuggItem *item, *prev;
for (item = suggestions.last; item; item=prev) {
prev = item->prev;
@@ -69,7 +71,8 @@ static void txttl_free_suggest(void) {
suggestions.top = 0;
}
-static void txttl_free_docs(void) {
+static void txttl_free_docs(void)
+{
if (documentation) {
MEM_freeN(documentation);
documentation = NULL;
@@ -80,23 +83,27 @@ static void txttl_free_docs(void) {
/* General tool functions */
/**************************/
-void free_texttools(void) {
+void free_texttools(void)
+{
txttl_free_suggest();
txttl_free_docs();
}
-void texttool_text_set_active(Text *text) {
+void texttool_text_set_active(Text *text)
+{
if (activeToolText == text) return;
texttool_text_clear();
activeToolText = text;
}
-void texttool_text_clear(void) {
+void texttool_text_clear(void)
+{
free_texttools();
activeToolText = NULL;
}
-short texttool_text_is_active(Text *text) {
+short texttool_text_is_active(Text *text)
+{
return activeToolText==text ? 1 : 0;
}
@@ -104,7 +111,8 @@ short texttool_text_is_active(Text *text) {
/* Suggestion list methods */
/***************************/
-void texttool_suggest_add(const char *name, char type) {
+void texttool_suggest_add(const char *name, char type)
+{
SuggItem *newitem, *item;
int len, cmp;
@@ -154,7 +162,8 @@ void texttool_suggest_add(const char *name, char type) {
suggestions.top= 0;
}
-void texttool_suggest_prefix(const char *prefix) {
+void texttool_suggest_prefix(const char *prefix)
+{
SuggItem *match, *first, *last;
int cmp, len = strlen(prefix), top = 0;
@@ -194,27 +203,33 @@ void texttool_suggest_prefix(const char *prefix) {
}
}
-void texttool_suggest_clear(void) {
+void texttool_suggest_clear(void)
+{
txttl_free_suggest();
}
-SuggItem *texttool_suggest_first(void) {
+SuggItem *texttool_suggest_first(void)
+{
return suggestions.firstmatch;
}
-SuggItem *texttool_suggest_last(void) {
+SuggItem *texttool_suggest_last(void)
+{
return suggestions.lastmatch;
}
-void texttool_suggest_select(SuggItem *sel) {
+void texttool_suggest_select(SuggItem *sel)
+{
suggestions.selected = sel;
}
-SuggItem *texttool_suggest_selected(void) {
+SuggItem *texttool_suggest_selected(void)
+{
return suggestions.selected;
}
-int *texttool_suggest_top(void) {
+int *texttool_suggest_top(void)
+{
return &suggestions.top;
}
@@ -222,7 +237,8 @@ int *texttool_suggest_top(void) {
/* Documentation methods */
/*************************/
-void texttool_docs_show(const char *docs) {
+void texttool_docs_show(const char *docs)
+{
int len;
if (!docs) return;
@@ -246,10 +262,12 @@ void texttool_docs_show(const char *docs) {
documentation[len] = '\0';
}
-char *texttool_docs_get(void) {
+char *texttool_docs_get(void)
+{
return documentation;
}
-void texttool_docs_clear(void) {
+void texttool_docs_clear(void)
+{
txttl_free_docs();
}
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 28d68892a2a..7e102bc9854 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -479,17 +479,11 @@ void unlink_text(Main *bmain, Text *text)
bScreen *scr;
ScrArea *area;
SpaceLink *sl;
- Scene *scene;
Object *ob;
bController *cont;
bConstraint *con;
short update;
- /* dome */
- for(scene=bmain->scene.first; scene; scene=scene->id.next)
- if(scene->r.dometext == text)
- scene->r.dometext = NULL;
-
for(ob=bmain->object.first; ob; ob=ob->id.next) {
/* game controllers */
for(cont=ob->controllers.first; cont; cont=cont->next) {
@@ -2857,7 +2851,8 @@ void txt_add_marker(Text *text, TextLine *line, int start, int end, const unsign
/* Returns the first matching marker on the specified line between two points.
If the group or flags fields are non-zero the returned flag must be in the
specified group and have at least the specified flags set. */
-TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags) {
+TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags)
+{
TextMarker *marker, *next;
int lineno= txt_get_span(text->lines.first, line);
@@ -2924,7 +2919,8 @@ short txt_clear_markers(Text *text, int group, int flags)
/* Finds the marker at the specified line and cursor position with at least the
specified flags set in the given group (if non-zero). */
-TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int group, int flags) {
+TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int group, int flags)
+{
TextMarker *marker;
int lineno= txt_get_span(text->lines.first, line);
@@ -2942,7 +2938,8 @@ TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int group, int
/* Finds the previous marker in the same group. If no other is found, the same
marker will be returned */
-TextMarker *txt_prev_marker(Text *text, TextMarker *marker) {
+TextMarker *txt_prev_marker(Text *text, TextMarker *marker)
+{
TextMarker *tmp= marker;
while (tmp) {
if (tmp->prev) tmp= tmp->prev;
@@ -2955,7 +2952,8 @@ TextMarker *txt_prev_marker(Text *text, TextMarker *marker) {
/* Finds the next marker in the same group. If no other is found, the same
marker will be returned */
-TextMarker *txt_next_marker(Text *text, TextMarker *marker) {
+TextMarker *txt_next_marker(Text *text, TextMarker *marker)
+{
TextMarker *tmp= marker;
while (tmp) {
if (tmp->next) tmp= tmp->next;
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 93404dc25fb..7051376a1f4 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -349,9 +349,9 @@ ColorBand *add_colorband(int rangetype)
/* ------------------------------------------------------------------------- */
-int do_colorband(ColorBand *coba, float in, float out[4])
+int do_colorband(const ColorBand *coba, float in, float out[4])
{
- CBData *cbd1, *cbd2, *cbd0, *cbd3;
+ const CBData *cbd1, *cbd2, *cbd0, *cbd3;
float fac, mfac, t[4];
int a;
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index 2d906a9199b..7bfc7a8ef87 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -48,12 +48,14 @@
#include "BLI_ghash.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BLI_threads.h"
#include "BKE_global.h"
#include "BKE_tracking.h"
#include "BKE_movieclip.h"
#include "BKE_object.h"
#include "BKE_scene.h"
+#include "BKE_main.h" // XXX: ...
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -76,8 +78,7 @@ void BKE_tracking_init_settings(MovieTracking *tracking)
tracking->camera.pixel_aspect= 1.0f;
tracking->camera.units= CAMERA_UNITS_MM;
- tracking->settings.default_tracker= TRACKER_KLT;
- tracking->settings.default_pyramid_levels= 2;
+ tracking->settings.default_tracker= TRACKER_HYBRID;
tracking->settings.default_minimum_correlation= 0.75;
tracking->settings.default_pattern_size= 11;
tracking->settings.default_search_size= 51;
@@ -85,11 +86,14 @@ void BKE_tracking_init_settings(MovieTracking *tracking)
tracking->settings.keyframe1= 1;
tracking->settings.keyframe2= 30;
tracking->settings.dist= 1;
+ tracking->settings.object_distance= 1;
tracking->stabilization.scaleinf= 1.0f;
tracking->stabilization.locinf= 1.0f;
tracking->stabilization.rotinf= 1.0f;
tracking->stabilization.maxscale= 2.0f;
+
+ BKE_tracking_new_object(tracking, "Camera");
}
void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
@@ -128,17 +132,17 @@ void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
}
else if(event==CLAMP_PAT_POS) {
float dim[2];
- sub_v2_v2v2(dim, track->pat_max, pat_min);
+ sub_v2_v2v2(dim, track->pat_max, track->pat_min);
for(a= 0; a<2; a++) {
/* pattern shouldn't be moved outside of search */
if(pat_min[a] < track->search_min[a]) {
track->pat_min[a]= track->search_min[a] - (pat_min[a] - track->pat_min[a]);
- track->pat_max[a]= (pat_min[a] - track->pat_min[a])+dim[a];
+ track->pat_max[a]= track->pat_min[a] + dim[a];
}
if(track->pat_max[a] > track->search_max[a]) {
track->pat_max[a]= track->search_max[a] - (pat_max[a] - track->pat_max[a]);
- track->pat_min[a]= track->pat_max[a]-dim[a] - (pat_min[a] - track->pat_min[a]);
+ track->pat_min[a]= track->pat_max[a] - dim[a];
}
}
}
@@ -208,7 +212,7 @@ void BKE_tracking_track_flag(MovieTrackingTrack *track, int area, int flag, int
}
}
-MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, float x, float y,
+MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, ListBase *tracksbase, float x, float y,
int framenr, int width, int height)
{
MovieTrackingTrack *track;
@@ -248,10 +252,11 @@ MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, float x, flo
BKE_tracking_insert_marker(track, &marker);
- BKE_tracking_clamp_track(track, CLAMP_PYRAMID_LEVELS);
+ if(track->tracker == TRACKER_KLT)
+ BKE_tracking_clamp_track(track, CLAMP_PYRAMID_LEVELS);
- BLI_addtail(&tracking->tracks, track);
- BKE_track_unique_name(tracking, track);
+ BLI_addtail(tracksbase, track);
+ BKE_track_unique_name(tracksbase, track);
return track;
}
@@ -523,18 +528,44 @@ void BKE_tracking_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack
dst_track->markersnr= tot;
}
-void BKE_tracking_free(MovieTracking *tracking)
+static void tracking_tracks_free(ListBase *tracks)
{
MovieTrackingTrack *track;
- for(track= tracking->tracks.first; track; track= track->next) {
+ for(track= tracks->first; track; track= track->next) {
BKE_tracking_free_track(track);
}
- BLI_freelistN(&tracking->tracks);
+ BLI_freelistN(tracks);
+}
+
+static void tracking_reconstruction_free(MovieTrackingReconstruction *reconstruction)
+{
+ if(reconstruction->cameras)
+ MEM_freeN(reconstruction->cameras);
+}
- if(tracking->reconstruction.cameras)
- MEM_freeN(tracking->reconstruction.cameras);
+static void tracking_object_free(MovieTrackingObject *object)
+{
+ tracking_tracks_free(&object->tracks);
+ tracking_reconstruction_free(&object->reconstruction);
+}
+
+static void tracking_objects_free(ListBase *objects)
+{
+ MovieTrackingObject *object;
+
+ for(object= objects->first; object; object= object->next)
+ tracking_object_free(object);
+
+ BLI_freelistN(objects);
+}
+
+void BKE_tracking_free(MovieTracking *tracking)
+{
+ tracking_tracks_free(&tracking->tracks);
+ tracking_reconstruction_free(&tracking->reconstruction);
+ tracking_objects_free(&tracking->objects);
if(tracking->stabilization.scaleibuf)
IMB_freeImBuf(tracking->stabilization.scaleibuf);
@@ -546,6 +577,9 @@ void BKE_tracking_free(MovieTracking *tracking)
/*********************** tracks map *************************/
typedef struct TracksMap {
+ char object_name[32];
+ int is_camera;
+
int num_tracks;
int customdata_size;
@@ -557,10 +591,13 @@ typedef struct TracksMap {
int ptr;
} TracksMap;
-static TracksMap *tracks_map_new(int num_tracks, int customdata_size)
+static TracksMap *tracks_map_new(const char *object_name, int is_camera, int num_tracks, int customdata_size)
{
TracksMap *map= MEM_callocN(sizeof(TracksMap), "TrackingsMap");
+ strcpy(map->object_name, object_name);
+ map->is_camera= is_camera;
+
map->num_tracks= num_tracks;
map->customdata_size= customdata_size;
@@ -606,10 +643,24 @@ static void tracks_map_insert(TracksMap *map, MovieTrackingTrack *track, void *c
static void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
{
MovieTrackingTrack *track;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
ListBase tracks= {NULL, NULL}, new_tracks= {NULL, NULL};
- ListBase *old_tracks= &tracking->tracks;
+ ListBase *old_tracks;
int a;
+ if(map->is_camera) {
+ old_tracks= &tracking->tracks;
+ } else {
+ MovieTrackingObject *object= BKE_tracking_named_object(tracking, map->object_name);
+
+ if(!object) {
+ /* object was deleted by user, create new one */
+ object= BKE_tracking_new_object(tracking, map->object_name);
+ }
+
+ old_tracks= &object->tracks;
+ }
+
/* duplicate currently operating tracks to temporary list.
this is needed to keep names in unique state and it's faster to change names
of currently operating tracks (if needed) */
@@ -633,7 +684,7 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
/* original track was found, re-use flags and remove this track */
if(cur) {
- if(cur==tracking->act_track)
+ if(act_track)
replace_sel= 1;
track->flag= cur->flag;
@@ -684,7 +735,7 @@ static void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
track= next;
}
- tracking->tracks= new_tracks;
+ *old_tracks= new_tracks;
}
static void tracks_map_free(TracksMap *map, void (*customdata_free) (void *customdata))
@@ -729,32 +780,35 @@ typedef struct TrackContext {
typedef struct MovieTrackingContext {
MovieClipUser user;
MovieClip *clip;
+ int clip_flag;
int first_time, frames;
MovieTrackingSettings settings;
TracksMap *tracks_map;
- short backwards, disable_failed;
+ short backwards, sequence;
int sync_frame;
} MovieTrackingContext;
-MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *user, short backwards, short disable_failed)
+MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *user, short backwards, short sequence)
{
MovieTrackingContext *context= MEM_callocN(sizeof(MovieTrackingContext), "trackingContext");
MovieTracking *tracking= &clip->tracking;
MovieTrackingSettings *settings= &tracking->settings;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
int num_tracks= 0;
context->settings= *settings;
context->backwards= backwards;
- context->disable_failed= disable_failed;
context->sync_frame= user->framenr;
context->first_time= 1;
+ context->sequence= sequence;
/* count */
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_SELECTED(track) && (track->flag&TRACK_LOCKED)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, user->framenr);
@@ -769,12 +823,13 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
if(num_tracks) {
int width, height;
- context->tracks_map= tracks_map_new(num_tracks, sizeof(TrackContext));
+ context->tracks_map= tracks_map_new(object->name, object->flag & TRACKING_OBJECT_CAMERA,
+ num_tracks, sizeof(TrackContext));
BKE_movieclip_get_size(clip, user, &width, &height);
/* create tracking data */
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_SELECTED(track) && (track->flag&TRACK_LOCKED)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, user->framenr);
@@ -790,7 +845,7 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
patx= (int)((track->pat_max[0]-track->pat_min[0])*width);
paty= (int)((track->pat_max[1]-track->pat_min[1])*height);
- if(track->tracker==TRACKER_KLT) {
+ if(ELEM(track->tracker, TRACKER_KLT, TRACKER_HYBRID)) {
float search_size_x= (track->search_max[0]-track->search_min[0])*width;
float search_size_y= (track->search_max[1]-track->search_min[1])*height;
float pattern_size_x= (track->pat_max[0]-track->pat_min[0])*width;
@@ -808,7 +863,10 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
* than the search size */
int level= MIN2(track->pyramid_levels, max_pyramid_levels);
- track_context.region_tracker= libmv_regionTrackerNew(100, level, MAX2(wndx, wndy));
+ if(track->tracker==TRACKER_KLT)
+ track_context.region_tracker= libmv_pyramidRegionTrackerNew(100, level, MAX2(wndx, wndy), track->minimum_correlation);
+ else
+ track_context.region_tracker= libmv_hybridRegionTrackerNew(100, MAX2(wndx, wndy), track->minimum_correlation);
}
else if(track->tracker==TRACKER_SAD) {
track_context.pattern_size= MAX2(patx, paty);
@@ -825,7 +883,23 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
}
context->clip= clip;
+
+ /* store needed clip flags passing to get_buffer functions
+ * - MCLIP_USE_PROXY is needed to because timecode affects on movie clip
+ * only in case Proxy/Timecode flag is set, so store this flag to use
+ * timecodes properly but reset render size to SIZE_FULL so correct resolution
+ * would be used for images
+ * - MCLIP_USE_PROXY_CUSTOM_DIR is needed because proxy/timecode files might
+ * be stored in a different location
+ * ignore all the rest pssible flags for now */
+ context->clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
+
context->user= *user;
+ context->user.render_size= 0;
+ context->user.render_flag= MCLIP_PROXY_RENDER_SIZE_FULL;
+
+ if(!sequence)
+ BLI_begin_threaded_malloc();
return context;
}
@@ -853,34 +927,61 @@ static void track_context_free(void *customdata)
void BKE_tracking_context_free(MovieTrackingContext *context)
{
+ if(!context->sequence)
+ BLI_end_threaded_malloc();
+
tracks_map_free(context->tracks_map, track_context_free);
MEM_freeN(context);
}
-static void disable_imbuf_channels(ImBuf *ibuf, MovieTrackingTrack *track)
+/* zap channels from the imbuf that are disabled by the user. this can lead to
+ * better tracks sometimes. however, instead of simply zeroing the channels
+ * out, do a partial grayscale conversion so the display is better. */
+static void disable_imbuf_channels(ImBuf *ibuf, MovieTrackingTrack *track, int grayscale)
{
int x, y;
+ float scale;
- if((track->flag&(TRACK_DISABLE_RED|TRACK_DISABLE_GREEN|TRACK_DISABLE_BLUE))==0)
+ if((track->flag&(TRACK_DISABLE_RED|TRACK_DISABLE_GREEN|TRACK_DISABLE_BLUE))==0 && !grayscale)
return;
+ /* If only some components are selected, it's important to rescale the result
+ * appropriately so that e.g. if only blue is selected, it's not zeroed out. */
+ scale = ((track->flag&TRACK_DISABLE_RED ) ? 0.0f : 0.2126f) +
+ ((track->flag&TRACK_DISABLE_GREEN) ? 0.0f : 0.7152f) +
+ ((track->flag&TRACK_DISABLE_BLUE) ? 0.0f : 0.0722f);
+
for(y= 0; y<ibuf->y; y++) {
for (x= 0; x<ibuf->x; x++) {
int pixel= ibuf->x*y + x;
if(ibuf->rect_float) {
float *rrgbf= ibuf->rect_float + pixel*4;
-
- if(track->flag&TRACK_DISABLE_RED) rrgbf[0]= 0;
- if(track->flag&TRACK_DISABLE_GREEN) rrgbf[1]= 0;
- if(track->flag&TRACK_DISABLE_BLUE) rrgbf[2]= 0;
+ float r = (track->flag&TRACK_DISABLE_RED) ? 0.0f : rrgbf[0];
+ float g = (track->flag&TRACK_DISABLE_GREEN) ? 0.0f : rrgbf[1];
+ float b = (track->flag&TRACK_DISABLE_BLUE) ? 0.0f : rrgbf[2];
+ if (grayscale) {
+ float gray = (0.2126f*r + 0.7152f*g + 0.0722f*b) / scale;
+ rrgbf[0] = rrgbf[1] = rrgbf[2] = gray;
+ } else {
+ rrgbf[0] = r;
+ rrgbf[1] = g;
+ rrgbf[2] = b;
+ }
} else {
char *rrgb= (char*)ibuf->rect + pixel*4;
-
- if(track->flag&TRACK_DISABLE_RED) rrgb[0]= 0;
- if(track->flag&TRACK_DISABLE_GREEN) rrgb[1]= 0;
- if(track->flag&TRACK_DISABLE_BLUE) rrgb[2]= 0;
+ char r = (track->flag&TRACK_DISABLE_RED) ? 0 : rrgb[0];
+ char g = (track->flag&TRACK_DISABLE_GREEN) ? 0 : rrgb[1];
+ char b = (track->flag&TRACK_DISABLE_BLUE) ? 0 : rrgb[2];
+ if (grayscale) {
+ float gray = (0.2126f*r + 0.7152f*g + 0.0722f*b) / scale;
+ rrgb[0] = rrgb[1] = rrgb[2] = gray;
+ } else {
+ rrgb[0] = r;
+ rrgb[1] = g;
+ rrgb[2] = b;
+ }
}
}
}
@@ -922,7 +1023,12 @@ static ImBuf *get_area_imbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieTracki
origin[1]= y1-margin;
}
- disable_imbuf_channels(tmpibuf, track);
+ if ((track->flag & TRACK_PREVIEW_GRAYSCALE) ||
+ (track->flag & TRACK_DISABLE_RED) ||
+ (track->flag & TRACK_DISABLE_GREEN) ||
+ (track->flag & TRACK_DISABLE_BLUE) ) {
+ disable_imbuf_channels(tmpibuf, track, 1 /* grayscale */);
+ }
return tmpibuf;
}
@@ -951,7 +1057,7 @@ static float *get_search_floatbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieT
height= (track->search_max[1]-track->search_min[1])*ibuf->y;
tmpibuf= BKE_tracking_get_search_imbuf(ibuf, track, marker, 0, 0, pos, origin);
- disable_imbuf_channels(tmpibuf, track);
+ disable_imbuf_channels(tmpibuf, track, 0 /* don't grayscale */);
*width_r= width;
*height_r= height;
@@ -963,14 +1069,11 @@ static float *get_search_floatbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieT
if(tmpibuf->rect_float) {
float *rrgbf= tmpibuf->rect_float + pixel*4;
-
*fp= 0.2126*rrgbf[0] + 0.7152*rrgbf[1] + 0.0722*rrgbf[2];
} else {
unsigned char *rrgb= (unsigned char*)tmpibuf->rect + pixel*4;
-
*fp= (0.2126*rrgb[0] + 0.7152*rrgb[1] + 0.0722*rrgb[2])/255.0f;
}
-
fp++;
}
}
@@ -992,14 +1095,11 @@ static unsigned char *get_ucharbuf(ImBuf *ibuf)
if(ibuf->rect_float) {
float *rrgbf= ibuf->rect_float + pixel*4;
-
*cp= FTOCHAR(0.2126f*rrgbf[0] + 0.7152f*rrgbf[1] + 0.0722f*rrgbf[2]);
} else {
unsigned char *rrgb= (unsigned char*)ibuf->rect + pixel*4;
-
*cp= 0.2126f*rrgb[0] + 0.7152f*rrgb[1] + 0.0722f*rrgb[2];
}
-
cp++;
}
}
@@ -1014,7 +1114,7 @@ static unsigned char *get_search_bytebuf(ImBuf *ibuf, MovieTrackingTrack *track,
unsigned char *pixels;
tmpibuf= BKE_tracking_get_search_imbuf(ibuf, track, marker, 0, 0, pos, origin);
- disable_imbuf_channels(tmpibuf, track);
+ disable_imbuf_channels(tmpibuf, track, 0 /* don't grayscale */);
*width_r= tmpibuf->x;
*height_r= tmpibuf->y;
@@ -1033,7 +1133,7 @@ static ImBuf *get_frame_ibuf(MovieTrackingContext *context, int framenr)
user.framenr= framenr;
- ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &user, 0);
+ ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &user, context->clip_flag);
return ibuf;
}
@@ -1137,13 +1237,13 @@ int BKE_tracking_next(MovieTrackingContext *context)
if(context->backwards) context->user.framenr--;
else context->user.framenr++;
- ibuf_new= BKE_movieclip_get_ibuf_flag(context->clip, &context->user, 0);
+ ibuf_new= BKE_movieclip_get_ibuf_flag(context->clip, &context->user, context->clip_flag);
if(!ibuf_new)
return 0;
- #pragma omp parallel for private(a) shared(ibuf_new, ok) if(map_size>1)
+ #pragma omp parallel for private(a) shared(ibuf_new, ok) if(map_size>1)
for(a= 0; a<map_size; a++) {
- TrackContext *track_context;
+ TrackContext *track_context = NULL;
MovieTrackingTrack *track;
MovieTrackingMarker *marker;
@@ -1154,12 +1254,11 @@ int BKE_tracking_next(MovieTrackingContext *context)
if(marker && (marker->flag&MARKER_DISABLED)==0) {
#ifdef WITH_LIBMV
int width, height, origin[2], tracked= 0, need_readjust= 0;
- float pos[2], margin[2];
+ float pos[2], margin[2], dim[2];
double x1, y1, x2, y2;
ImBuf *ibuf= NULL;
MovieTrackingMarker marker_new, *marker_keyed;
- int onbound= 0, coords_correct= 0;
- int nextfra;
+ int onbound= 0, nextfra;
if(track->pattern_match==TRACK_MATCH_KEYFRAME)
need_readjust= context->first_time;
@@ -1170,7 +1269,8 @@ int BKE_tracking_next(MovieTrackingContext *context)
else nextfra= curfra+1;
/* margin from frame boundaries */
- sub_v2_v2v2(margin, track->pat_max, track->pat_min);
+ sub_v2_v2v2(dim, track->pat_max, track->pat_min);
+ margin[0]= margin[1]= MAX2(dim[0], dim[1]) / 2.0f;
margin[0]= MAX2(margin[0], (float)track->margin / ibuf_new->x);
margin[1]= MAX2(margin[1], (float)track->margin / ibuf_new->y);
@@ -1180,7 +1280,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
marker->pos[1]<margin[1] || marker->pos[1]>1.0f-margin[1]) {
onbound= 1;
}
- else if(track->tracker==TRACKER_KLT) {
+ else if(ELEM(track->tracker, TRACKER_KLT, TRACKER_HYBRID)) {
float *patch_new;
if(need_readjust) {
@@ -1276,14 +1376,13 @@ int BKE_tracking_next(MovieTrackingContext *context)
MEM_freeN(image_new);
}
- coords_correct= !isnan(x2) && !isnan(y2) && finite(x2) && finite(y2);
- if(coords_correct && (tracked || !context->disable_failed)) {
+ if(tracked && !onbound && finite(x2) && finite(y2)) {
if(context->first_time) {
#pragma omp critical
{
/* check if there's no keyframe/tracked markers before tracking marker.
if so -- create disabled marker before currently tracking "segment" */
- put_disabled_marker(track, marker, 1, 0);
+ put_disabled_marker(track, marker, !context->backwards, 0);
}
}
@@ -1307,7 +1406,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
/* make currently tracked segment be finished with disabled marker */
#pragma omp critical
{
- put_disabled_marker(track, &marker_new, 0, 0);
+ put_disabled_marker(track, &marker_new, context->backwards, 0);
}
} else {
marker_new= *marker;
@@ -1344,6 +1443,8 @@ typedef struct MovieReconstructContext {
struct libmv_Reconstruction *reconstruction;
#endif
+ char object_name[32];
+ int is_camera;
float focal_length;
float principal_point[2];
@@ -1365,13 +1466,13 @@ typedef struct ReconstructProgressData {
} ReconstructProgressData;
#if WITH_LIBMV
-static struct libmv_Tracks *create_libmv_tracks(MovieTracking *tracking, int width, int height)
+static struct libmv_Tracks *create_libmv_tracks(ListBase *tracksbase, int width, int height)
{
int tracknr= 0;
MovieTrackingTrack *track;
struct libmv_Tracks *tracks= libmv_tracksNew();
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
int a= 0;
@@ -1415,16 +1516,28 @@ static void retrieve_libmv_reconstruct_intrinscis(MovieReconstructContext *conte
static int retrieve_libmv_reconstruct_tracks(MovieReconstructContext *context, MovieTracking *tracking)
{
struct libmv_Reconstruction *libmv_reconstruction= context->reconstruction;
- MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
+ MovieTrackingReconstruction *reconstruction= NULL;
MovieReconstructedCamera *reconstructed;
MovieTrackingTrack *track;
+ ListBase *tracksbase= NULL;
int ok= 1, tracknr= 0, a, origin_set= 0;
int sfra= context->sfra, efra= context->efra;
float imat[4][4];
+ if(context->is_camera) {
+ tracksbase= &tracking->tracks;
+ reconstruction= &tracking->reconstruction;
+ }
+ else {
+ MovieTrackingObject *object= BKE_tracking_named_object(tracking, context->object_name);
+
+ tracksbase= &object->tracks;
+ reconstruction= &object->reconstruction;
+ }
+
unit_m4(imat);
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
double pos[3];
@@ -1472,7 +1585,7 @@ static int retrieve_libmv_reconstruct_tracks(MovieReconstructContext *context, M
}
if(origin_set)
- mul_m4_m4m4(mat, mat, imat);
+ mult_m4_m4m4(mat, imat, mat);
copy_m4_m4(reconstructed[reconstruction->camnr].mat, mat);
reconstructed[reconstruction->camnr].framenr= a;
@@ -1490,7 +1603,7 @@ static int retrieve_libmv_reconstruct_tracks(MovieReconstructContext *context, M
}
if(origin_set) {
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(track->flag&TRACK_HAS_BUNDLE)
mul_v3_m4v3(track->bundle_pos, imat, track->bundle_pos);
@@ -1506,19 +1619,20 @@ static int retrieve_libmv_reconstruct_tracks(MovieReconstructContext *context, M
static int retrieve_libmv_reconstruct(MovieReconstructContext *context, MovieTracking *tracking)
{
- tracks_map_merge(context->tracks_map, tracking);
-
/* take the intrinscis back from libmv */
retrieve_libmv_reconstruct_intrinscis(context, tracking);
return retrieve_libmv_reconstruct_tracks(context, tracking);
}
-static int get_refine_intrinsics_flags(MovieTracking *tracking)
+static int get_refine_intrinsics_flags(MovieTracking *tracking, MovieTrackingObject *object)
{
int refine= tracking->settings.refine_camera_intrinsics;
int flags= 0;
+ if((object->flag&TRACKING_OBJECT_CAMERA)==0)
+ return 0;
+
if(refine&REFINE_FOCAL_LENGTH)
flags|= LIBMV_REFINE_FOCAL_LENGTH;
@@ -1534,13 +1648,13 @@ static int get_refine_intrinsics_flags(MovieTracking *tracking)
return flags;
}
-static int count_tracks_on_both_keyframes(MovieTracking *tracking)
+static int count_tracks_on_both_keyframes(MovieTracking *tracking, ListBase *tracksbase)
{
int tot= 0;
int frame1= tracking->settings.keyframe1, frame2= tracking->settings.keyframe2;
MovieTrackingTrack *track;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(BKE_tracking_has_marker(track, frame1))
if(BKE_tracking_has_marker(track, frame2))
@@ -1553,10 +1667,12 @@ static int count_tracks_on_both_keyframes(MovieTracking *tracking)
}
#endif
-int BKE_tracking_can_reconstruct(MovieTracking *tracking, char *error_msg, int error_size)
+int BKE_tracking_can_reconstruct(MovieTracking *tracking, MovieTrackingObject *object, char *error_msg, int error_size)
{
#if WITH_LIBMV
- if(count_tracks_on_both_keyframes(tracking)<8) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+
+ if(count_tracks_on_both_keyframes(tracking, tracksbase)<8) {
BLI_strncpy(error_msg, "At least 8 tracks on both of keyframes are needed for reconstruction", error_size);
return 0;
}
@@ -1564,31 +1680,37 @@ int BKE_tracking_can_reconstruct(MovieTracking *tracking, char *error_msg, int e
return 1;
#else
BLI_strncpy(error_msg, "Blender is compiled without motion tracking library", error_size);
- (void) tracking;
+ (void)tracking;
+ (void)object;
return 0;
#endif
}
MovieReconstructContext* BKE_tracking_reconstruction_context_new(MovieTracking *tracking,
- int keyframe1, int keyframe2, int width, int height)
+ MovieTrackingObject *object, int keyframe1, int keyframe2, int width, int height)
{
MovieReconstructContext *context= MEM_callocN(sizeof(MovieReconstructContext), "MovieReconstructContext data");
MovieTrackingCamera *camera= &tracking->camera;
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
float aspy= 1.0f/tracking->camera.pixel_aspect;
- int num_tracks= BLI_countlist(&tracking->tracks);
+ int num_tracks= BLI_countlist(tracksbase);
int sfra= INT_MAX, efra= INT_MIN;
MovieTrackingTrack *track;
- context->tracks_map= tracks_map_new(num_tracks, 0);
- track= tracking->tracks.first;
+ strcpy(context->object_name, object->name);
+ context->is_camera = object->flag&TRACKING_OBJECT_CAMERA;
+
+ context->tracks_map= tracks_map_new(context->object_name, context->is_camera, num_tracks, 0);
+
+ track= tracksbase->first;
while(track) {
- int first= 0, last= track->markersnr;
+ int first= 0, last= track->markersnr-1;
MovieTrackingMarker *first_marker= &track->markers[0];
MovieTrackingMarker *last_marker= &track->markers[track->markersnr-1];
/* find first not-disabled marker */
- while(first<track->markersnr-1 && first_marker->flag&MARKER_DISABLED) {
+ while(first<=track->markersnr-1 && first_marker->flag&MARKER_DISABLED) {
first++;
first_marker++;
}
@@ -1614,10 +1736,10 @@ MovieReconstructContext* BKE_tracking_reconstruction_context_new(MovieTracking *
context->efra= efra;
#ifdef WITH_LIBMV
- context->tracks= create_libmv_tracks(tracking, width, height*aspy);
+ context->tracks= create_libmv_tracks(tracksbase, width, height*aspy);
context->keyframe1= keyframe1;
context->keyframe2= keyframe2;
- context->refine_flags= get_refine_intrinsics_flags(tracking);
+ context->refine_flags= get_refine_intrinsics_flags(tracking, object);
#else
(void) width;
(void) height;
@@ -1650,6 +1772,7 @@ void BKE_tracking_reconstruction_context_free(MovieReconstructContext *context)
MEM_freeN(context);
}
+#ifdef WITH_LIBMV
static void solve_reconstruction_update_cb(void *customdata, double progress, const char *message)
{
ReconstructProgressData *progressdata= customdata;
@@ -1662,6 +1785,7 @@ static void solve_reconstruction_update_cb(void *customdata, double progress, co
BLI_snprintf(progressdata->stats_message, progressdata->message_size,
"Solving camera | %s", message);
}
+#endif
#if 0
static int solve_reconstruction_testbreak_cb(void *customdata)
@@ -1712,8 +1836,22 @@ void BKE_tracking_solve_reconstruction(MovieReconstructContext *context, short *
int BKE_tracking_finish_reconstruction(MovieReconstructContext *context, MovieTracking *tracking)
{
- tracking->reconstruction.error= context->reprojection_error;
- tracking->reconstruction.flag|= TRACKING_RECONSTRUCTED;
+ MovieTrackingReconstruction *reconstruction;
+
+ tracks_map_merge(context->tracks_map, tracking);
+
+ if(context->is_camera) {
+ reconstruction= &tracking->reconstruction;
+ }
+ else {
+ MovieTrackingObject *object;
+
+ object= BKE_tracking_named_object(tracking, context->object_name);
+ reconstruction= &object->reconstruction;
+ }
+
+ reconstruction->error= context->reprojection_error;
+ reconstruction->flag|= TRACKING_RECONSTRUCTED;
#ifdef WITH_LIBMV
if(!retrieve_libmv_reconstruct(context, tracking))
@@ -1723,14 +1861,15 @@ int BKE_tracking_finish_reconstruction(MovieReconstructContext *context, MovieTr
return 1;
}
-void BKE_track_unique_name(MovieTracking *tracking, MovieTrackingTrack *track)
+void BKE_track_unique_name(ListBase *tracksbase, MovieTrackingTrack *track)
{
- BLI_uniquename(&tracking->tracks, track, "Track", '.', offsetof(MovieTrackingTrack, name), sizeof(track->name));
+ BLI_uniquename(tracksbase, track, "Track", '.', offsetof(MovieTrackingTrack, name), sizeof(track->name));
}
-MovieTrackingTrack *BKE_tracking_named_track(MovieTracking *tracking, const char *name)
+MovieTrackingTrack *BKE_tracking_named_track(MovieTracking *tracking, MovieTrackingObject *object, const char *name)
{
- MovieTrackingTrack *track= tracking->tracks.first;
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
while(track) {
if(!strcmp(track->name, name))
@@ -1742,9 +1881,8 @@ MovieTrackingTrack *BKE_tracking_named_track(MovieTracking *tracking, const char
return NULL;
}
-static int reconstruction_camera_index(MovieTracking *tracking, int framenr, int nearest)
+static int reconstruction_camera_index(MovieTrackingReconstruction *reconstruction, int framenr, int nearest)
{
- MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
MovieReconstructedCamera *cameras= reconstruction->cameras;
int a= 0, d= 1;
@@ -1796,21 +1934,41 @@ static int reconstruction_camera_index(MovieTracking *tracking, int framenr, int
return -1;
}
-MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(MovieTracking *tracking, int framenr)
+static void scale_reconstructed_camera(MovieTrackingObject *object, float mat[4][4])
+{
+ if((object->flag&TRACKING_OBJECT_CAMERA)==0) {
+ float smat[4][4];
+
+ scale_m4_fl(smat, 1.0f/object->scale);
+ mult_m4_m4m4(mat, mat, smat);
+ }
+}
+
+MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(MovieTracking *tracking,
+ MovieTrackingObject *object, int framenr)
{
- int a= reconstruction_camera_index(tracking, framenr, 0);
+ MovieTrackingReconstruction *reconstruction;
+ int a;
+
+ reconstruction= BKE_tracking_object_reconstruction(tracking, object);
+ a= reconstruction_camera_index(reconstruction, framenr, 0);
if(a==-1)
return NULL;
- return &tracking->reconstruction.cameras[a];
+ return &reconstruction->cameras[a];
}
-void BKE_tracking_get_interpolated_camera(MovieTracking *tracking, int framenr, float mat[4][4])
+void BKE_tracking_get_interpolated_camera(MovieTracking *tracking, MovieTrackingObject *object,
+ int framenr, float mat[4][4])
{
- MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
- MovieReconstructedCamera *cameras= reconstruction->cameras;
- int a= reconstruction_camera_index(tracking, framenr, 1);
+ MovieTrackingReconstruction *reconstruction;
+ MovieReconstructedCamera *cameras;
+ int a;
+
+ reconstruction= BKE_tracking_object_reconstruction(tracking, object);
+ cameras= reconstruction->cameras;
+ a= reconstruction_camera_index(reconstruction, framenr, 1);
if(a==-1) {
unit_m4(mat);
@@ -1824,6 +1982,8 @@ void BKE_tracking_get_interpolated_camera(MovieTracking *tracking, int framenr,
} else {
copy_m4_m4(mat, cameras[a].mat);
}
+
+ scale_reconstructed_camera(object, mat);
}
void BKE_get_tracking_mat(Scene *scene, Object *ob, float mat[4][4])
@@ -1862,7 +2022,8 @@ void BKE_tracking_camera_to_blender(MovieTracking *tracking, Scene *scene, Camer
BKE_tracking_camera_shift(tracking, width, height, &camera->shiftx, &camera->shifty);
}
-void BKE_tracking_projection_matrix(MovieTracking *tracking, int framenr, int winx, int winy, float mat[4][4])
+void BKE_tracking_projection_matrix(MovieTracking *tracking, MovieTrackingObject *object,
+ int framenr, int winx, int winy, float mat[4][4])
{
MovieReconstructedCamera *camera;
float lens= tracking->camera.focal*tracking->camera.sensor_width/(float)winx;
@@ -1895,15 +2056,87 @@ void BKE_tracking_projection_matrix(MovieTracking *tracking, int framenr, int wi
perspective_m4(winmat, left, right, bottom, top, clipsta, clipend);
- camera= BKE_tracking_get_reconstructed_camera(tracking, framenr);
+ camera= BKE_tracking_get_reconstructed_camera(tracking, object, framenr);
+
if(camera) {
float imat[4][4];
invert_m4_m4(imat, camera->mat);
- mul_m4_m4m4(mat, imat, winmat);
+ mult_m4_m4m4(mat, winmat, imat);
} else copy_m4_m4(mat, winmat);
}
+ListBase *BKE_tracking_get_tracks(MovieTracking *tracking)
+{
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
+
+ if(object && (object->flag & TRACKING_OBJECT_CAMERA) == 0) {
+ return &object->tracks;
+ }
+
+ return &tracking->tracks;
+}
+
+MovieTrackingTrack *BKE_tracking_active_track(MovieTracking *tracking)
+{
+ ListBase *tracksbase;
+
+ if(!tracking->act_track)
+ return NULL;
+
+ tracksbase= BKE_tracking_get_tracks(tracking);
+
+ /* check that active track is in current tracks list */
+ if(BLI_findindex(tracksbase, tracking->act_track) >= 0)
+ return tracking->act_track;
+
+ return NULL;
+}
+
+MovieTrackingObject *BKE_tracking_active_object(MovieTracking *tracking)
+{
+ return BLI_findlink(&tracking->objects, tracking->objectnr);
+}
+
+MovieTrackingObject *BKE_tracking_get_camera_object(MovieTracking *tracking)
+{
+ MovieTrackingObject *object= tracking->objects.first;
+
+ while(object) {
+ if(object->flag & TRACKING_OBJECT_CAMERA)
+ return object;
+
+ object= object->next;
+ }
+
+ return NULL;
+}
+
+ListBase *BKE_tracking_object_tracks(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ if(object->flag & TRACKING_OBJECT_CAMERA) {
+ return &tracking->tracks;
+ }
+
+ return &object->tracks;
+}
+
+MovieTrackingReconstruction *BKE_tracking_object_reconstruction(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ if(object->flag & TRACKING_OBJECT_CAMERA) {
+ return &tracking->reconstruction;
+ }
+
+ return &object->reconstruction;
+}
+
+MovieTrackingReconstruction *BKE_tracking_get_reconstruction(MovieTracking *tracking)
+{
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
+
+ return BKE_tracking_object_reconstruction(tracking, object);
+}
+
void BKE_tracking_apply_intrinsics(MovieTracking *tracking, float co[2], float nco[2])
{
MovieTrackingCamera *camera= &tracking->camera;
@@ -1990,8 +2223,9 @@ static int point_in_layer(bGPDlayer *layer, float x, float y)
return 0;
}
-static void retrieve_libmv_features(MovieTracking *tracking, struct libmv_Features *features,
- int framenr, int width, int height, bGPDlayer *layer, int place_outside_layer)
+static void retrieve_libmv_features(MovieTracking *tracking, ListBase *tracksbase,
+ struct libmv_Features *features, int framenr, int width, int height,
+ bGPDlayer *layer, int place_outside_layer)
{
int a;
@@ -2011,7 +2245,7 @@ static void retrieve_libmv_features(MovieTracking *tracking, struct libmv_Featur
ok= point_in_layer(layer, xu, yu)!=place_outside_layer;
if(ok) {
- track= BKE_tracking_add_track(tracking, xu, yu, framenr, width, height);
+ track= BKE_tracking_add_track(tracking, tracksbase, xu, yu, framenr, width, height);
track->flag|= SELECT;
track->pat_flag|= SELECT;
track->search_flag|= SELECT;
@@ -2020,7 +2254,7 @@ static void retrieve_libmv_features(MovieTracking *tracking, struct libmv_Featur
}
#endif
-void BKE_tracking_detect_fast(MovieTracking *tracking, ImBuf *ibuf,
+void BKE_tracking_detect_fast(MovieTracking *tracking, ListBase *tracksbase, ImBuf *ibuf,
int framenr, int margin, int min_trackness, int min_distance, bGPDlayer *layer,
int place_outside_layer)
{
@@ -2028,15 +2262,18 @@ void BKE_tracking_detect_fast(MovieTracking *tracking, ImBuf *ibuf,
struct libmv_Features *features;
unsigned char *pixels= get_ucharbuf(ibuf);
- features= libmv_detectFeaturesFAST(pixels, ibuf->x, ibuf->y, ibuf->x, margin, min_trackness, min_distance);
+ features= libmv_detectFeaturesFAST(pixels, ibuf->x, ibuf->y, ibuf->x,
+ margin, min_trackness, min_distance);
MEM_freeN(pixels);
- retrieve_libmv_features(tracking, features, framenr, ibuf->x, ibuf->y, layer, place_outside_layer);
+ retrieve_libmv_features(tracking, tracksbase, features, framenr,
+ ibuf->x, ibuf->y, layer, place_outside_layer);
libmv_destroyFeatures(features);
#else
(void)tracking;
+ (void)tracksbase;
(void)ibuf;
(void)framenr;
(void)margin;
@@ -2047,22 +2284,34 @@ void BKE_tracking_detect_fast(MovieTracking *tracking, ImBuf *ibuf,
#endif
}
-MovieTrackingTrack *BKE_tracking_indexed_track(MovieTracking *tracking, int tracknr)
+MovieTrackingTrack *BKE_tracking_indexed_track(MovieTracking *tracking, int tracknr, ListBase **tracksbase_r)
{
- MovieTrackingTrack *track= tracking->tracks.first;
+ MovieTrackingObject *object;
int cur= 1;
- while(track) {
- if(track->flag&TRACK_HAS_BUNDLE) {
- if(cur==tracknr)
- return track;
+ object= tracking->objects.first;
+ while(object) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
- cur++;
+ while(track) {
+ if(track->flag&TRACK_HAS_BUNDLE) {
+ if(cur==tracknr) {
+ *tracksbase_r= tracksbase;
+ return track;
+ }
+
+ cur++;
+ }
+
+ track= track->next;
}
- track= track->next;
+ object= object->next;
}
+ *tracksbase_r= NULL;
+
return NULL;
}
@@ -2074,6 +2323,8 @@ static int stabilization_median_point(MovieTracking *tracking, int framenr, floa
INIT_MINMAX2(min, max);
+ (void) tracking;
+
track= tracking->tracks.first;
while(track) {
if(track->flag&TRACK_USE_2D_STAB) {
@@ -2511,12 +2762,12 @@ ImBuf *BKE_tracking_distort(MovieTracking *tracking, ImBuf *ibuf, int width, int
}
/* area - which part of marker should be selected. see TRACK_AREA_* constants */
-void BKE_tracking_select_track(MovieTracking *tracking, MovieTrackingTrack *track, int area, int extend)
+void BKE_tracking_select_track(ListBase *tracksbase, MovieTrackingTrack *track, int area, int extend)
{
if(extend) {
BKE_tracking_track_flag(track, area, SELECT, 0);
} else {
- MovieTrackingTrack *cur= tracking->tracks.first;
+ MovieTrackingTrack *cur= tracksbase->first;
while(cur) {
if(cur==track) {
@@ -2536,3 +2787,78 @@ void BKE_tracking_deselect_track(MovieTrackingTrack *track, int area)
{
BKE_tracking_track_flag(track, area, SELECT, 1);
}
+
+MovieTrackingObject *BKE_tracking_new_object(MovieTracking *tracking, const char *name)
+{
+ MovieTrackingObject *object= MEM_callocN(sizeof(MovieTrackingObject), "tracking object");
+
+ if(tracking->tot_object==0) {
+ /* first object is always camera */
+ BLI_strncpy(object->name, "Camera", sizeof(object->name));
+
+ object->flag|= TRACKING_OBJECT_CAMERA;
+ }
+ else {
+ BLI_strncpy(object->name, name, sizeof(object->name));
+ }
+
+ BLI_addtail(&tracking->objects, object);
+
+ tracking->tot_object++;
+ tracking->objectnr= BLI_countlist(&tracking->objects) - 1;
+
+ BKE_tracking_object_unique_name(tracking, object);
+
+ return object;
+}
+
+void BKE_tracking_remove_object(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ MovieTrackingTrack *track;
+ int index= BLI_findindex(&tracking->objects, object);
+
+ if(index<0)
+ return;
+
+ if(object->flag & TRACKING_OBJECT_CAMERA) {
+ /* object used for camera solving can't be deleted */
+ return;
+ }
+
+ track= object->tracks.first;
+ while(track) {
+ if(track==tracking->act_track)
+ tracking->act_track= NULL;
+
+ track= track->next;
+ }
+
+ tracking_object_free(object);
+ BLI_freelinkN(&tracking->objects, object);
+
+ tracking->tot_object--;
+
+ if(index>0)
+ tracking->objectnr= index-1;
+ else
+ tracking->objectnr= 0;
+}
+
+void BKE_tracking_object_unique_name(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ BLI_uniquename(&tracking->objects, object, "Object", '.', offsetof(MovieTrackingObject, name), sizeof(object->name));
+}
+
+MovieTrackingObject *BKE_tracking_named_object(MovieTracking *tracking, const char *name)
+{
+ MovieTrackingObject *object= tracking->objects.first;
+
+ while(object) {
+ if(!strcmp(object->name, name))
+ return object;
+
+ object= object->next;
+ }
+
+ return NULL;
+}
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index 616c27f6b0b..81c526e45a6 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -299,7 +299,8 @@ static bUnitDef *unit_best_fit(double value, bUnitCollection *usys, bUnitDef *un
if(suppress && (unit->flag & B_UNIT_DEF_SUPPRESS))
continue;
- if (value_abs >= unit->scalar*(1.0-EPS)) /* scale down scalar so 1cm doesnt convert to 10mm because of float error */
+ /* scale down scalar so 1cm doesnt convert to 10mm because of float error */
+ if (value_abs >= unit->scalar*(1.0-EPS))
return unit;
}
@@ -481,11 +482,14 @@ static int ch_is_op(char op)
}
}
-static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, const char *replace_str)
+static int unit_scale_str(char *str, int len_max, char *str_tmp,
+ double scale_pref, bUnitDef *unit, const char *replace_str)
{
char *str_found;
- if((len_max>0) && (str_found= (char *)unit_find_str(str, replace_str))) { /* XXX - investigate, does not respect len_max properly */
+ if((len_max>0) && (str_found= (char *)unit_find_str(str, replace_str))) {
+ /* XXX - investigate, does not respect len_max properly */
+
int len, len_num, len_name, len_move, found_ofs;
found_ofs = (int)(str_found-str);
@@ -494,7 +498,7 @@ static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pr
len_name = strlen(replace_str);
len_move= (len - (found_ofs+len_name)) + 1; /* 1+ to copy the string terminator */
- len_num= BLI_snprintf(str_tmp, TEMP_STR_SIZE, "*%lg"SEP_STR, unit->scalar/scale_pref); /* # removed later */
+ len_num= BLI_snprintf(str_tmp, TEMP_STR_SIZE, "*%g"SEP_STR, unit->scalar/scale_pref); /* # removed later */
if(len_num > len_max)
len_num= len_max;
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 8cd30912840..da64c464dce 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -159,9 +159,6 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
- /* RPW 11-21-2002
- if (rd->imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB;
- */
if (rd->im_format.imtype != R_IMF_IMTYPE_AVIJPEG ) format = AVI_FORMAT_AVI_RGB;
else format = AVI_FORMAT_MJPEG;
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index aa7d71b1577..bf547584b9e 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -1333,11 +1333,11 @@ void ffmpeg_set_preset(RenderData *rd, int preset)
}
}
-void ffmpeg_verify_image_type(RenderData *rd)
+void ffmpeg_verify_image_type(RenderData *rd, ImageFormatData *imf)
{
int audio= 0;
- if(rd->imtype == R_IMF_IMTYPE_FFMPEG) {
+ if(imf->imtype == R_IMF_IMTYPE_FFMPEG) {
if(rd->ffcodecdata.type <= 0 ||
rd->ffcodecdata.codec <= 0 ||
rd->ffcodecdata.audio_codec <= 0 ||
@@ -1353,19 +1353,19 @@ void ffmpeg_verify_image_type(RenderData *rd)
audio= 1;
}
- else if(rd->imtype == R_IMF_IMTYPE_H264) {
+ else if(imf->imtype == R_IMF_IMTYPE_H264) {
if(rd->ffcodecdata.codec != CODEC_ID_H264) {
ffmpeg_set_preset(rd, FFMPEG_PRESET_H264);
audio= 1;
}
}
- else if(rd->imtype == R_IMF_IMTYPE_XVID) {
+ else if(imf->imtype == R_IMF_IMTYPE_XVID) {
if(rd->ffcodecdata.codec != CODEC_ID_MPEG4) {
ffmpeg_set_preset(rd, FFMPEG_PRESET_XVID);
audio= 1;
}
}
- else if(rd->imtype == R_IMF_IMTYPE_THEORA) {
+ else if(imf->imtype == R_IMF_IMTYPE_THEORA) {
if(rd->ffcodecdata.codec != CODEC_ID_THEORA) {
ffmpeg_set_preset(rd, FFMPEG_PRESET_THEORA);
audio= 1;
diff --git a/source/blender/blenlib/BLI_array.h b/source/blender/blenlib/BLI_array.h
new file mode 100644
index 00000000000..bd14793e0f9
--- /dev/null
+++ b/source/blender/blenlib/BLI_array.h
@@ -0,0 +1,185 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joseph Eagar.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/*
+ * this library needs to be changed to not use macros quite so heavily,
+ * and to be more of a complete array API. The way arrays are
+ * exposed to client code as normal C arrays is very useful though, imho.
+ * it does require some use of macros, however.
+ *
+ * anyway, it's used a bit too heavily to simply rewrite as a
+ * more "correct" solution without macros entirely. I originally wrote this
+ * to be very easy to use, without the normal pain of most array libraries.
+ * This was especially helpful when it came to the massive refactors necessary
+ * for bmesh, and really helped to speed the process up. - joeedh
+ *
+ * little array macro library. example of usage:
+ *
+ * int *arr = NULL;
+ * BLI_array_declare(arr);
+ * int i;
+ *
+ * for (i=0; i<10; i++) {
+ * BLI_array_growone(arr);
+ * arr[i] = something;
+ * }
+ * BLI_array_free(arr);
+ *
+ * arrays are buffered, using double-buffering (so on each reallocation,
+ * the array size is doubled). supposedly this should give good Big Oh
+ * behaviour, though it may not be the best in practice.
+ */
+
+#define BLI_array_declare(arr) \
+ int _##arr##_count = 0; \
+ void *_##arr##_tmp; \
+ void *_##arr##_static = NULL
+
+/* this will use stack space, up to maxstatic array elements, before
+ * switching to dynamic heap allocation */
+#define BLI_array_staticdeclare(arr, maxstatic) \
+ int _##arr##_count = 0; \
+ void *_##arr##_tmp; \
+ char _##arr##_static[maxstatic*sizeof(arr)]
+
+
+/* this returns the entire size of the array, including any buffering. */
+#define BLI_array_totalsize_dyn(arr) ( \
+ ((arr)==NULL) ? \
+ 0 : \
+ MEM_allocN_len(arr) / sizeof(*arr) \
+)
+
+
+#define BLI_array_totalsize(arr) ( \
+ (size_t) \
+ (((void *)(arr) == (void *)_##arr##_static && (void *)(arr) != NULL) ? \
+ (sizeof(_##arr##_static) / sizeof(*arr)) : \
+ BLI_array_totalsize_dyn(arr)) \
+)
+
+
+/* this returns the logical size of the array, not including buffering. */
+#define BLI_array_count(arr) _##arr##_count
+
+/* Grow the array by a fixed number of items. zeroes the new elements.
+ *
+ * Allow for a large 'num' value when the new size is more then double
+ * to allocate the exact sized array. */
+#define _bli_array_grow_items(arr, num) ( \
+ (BLI_array_totalsize(arr) >= _##arr##_count + num) ? \
+ (_##arr##_count += num) : \
+ ( \
+ (void) (_##arr##_tmp = MEM_callocN( \
+ sizeof(*arr) * (num < _##arr##_count ? \
+ (_##arr##_count * 2 + 2) : \
+ (_##arr##_count + num)), \
+ #arr " " __FILE__ ":" STRINGIFY(__LINE__) \
+ ) \
+ ), \
+ (void) (arr && memcpy(_##arr##_tmp, \
+ arr, \
+ sizeof(*arr) * _##arr##_count) \
+ ), \
+ (void) (arr && ((void *)(arr) != (void*)_##arr##_static ? \
+ (MEM_freeN(arr), arr) : \
+ arr) \
+ ), \
+ (void) (arr = _##arr##_tmp \
+ ), \
+ (_##arr##_count += num) \
+ ) \
+)
+
+/* grow an array by a specified number of items */
+#define BLI_array_growitems(arr, num) ( \
+ ((void *)(arr)==NULL && (void *)(_##arr##_static) != NULL) ? \
+ ((arr= (void*)_##arr##_static), (_##arr##_count += num)) : \
+ _bli_array_grow_items(arr, num) \
+)
+
+/* returns length of array */
+#define BLI_array_growone(arr) BLI_array_growitems(arr, 1)
+
+
+/* appends an item to the array. */
+#define BLI_array_append(arr, item) ( \
+ (void) BLI_array_growone(arr), \
+ (void) (arr[_##arr##_count - 1] = item) \
+)
+
+/* appends an item to the array and returns a pointer to the item in the array.
+ * item is not a pointer, but actual data value.*/
+#define BLI_array_append_r(arr, item) ( \
+ (void) BLI_array_growone(arr), \
+ (void) (arr[_##arr##_count - 1] = item), \
+ (&arr[_##arr##_count - 1]) \
+)
+
+#define BLI_array_free(arr) \
+ if (arr && (char *)arr != _##arr##_static) { \
+ BLI_array_fake_user(arr); \
+ MEM_freeN(arr); \
+ }
+
+#define BLI_array_pop(arr) ( \
+ (arr&&_##arr##_count) ? \
+ arr[--_##arr##_count] : \
+ 0 \
+)
+
+/* resets the logical size of an array to zero, but doesn't
+ * free the memory. */
+#define BLI_array_empty(arr) \
+ _##arr##_count=0
+
+/* set the count of the array, doesn't actually increase the allocated array
+ * size. don't use this unless you know what you're doing. */
+#define BLI_array_set_length(arr, count) \
+ _##arr##_count = (count)
+
+/* only to prevent unused warnings */
+#define BLI_array_fake_user(arr) \
+ (void)_##arr##_count, \
+ (void)_##arr##_tmp, \
+ (void)_##arr##_static
+
+
+/* not part of the 'API' but handy funcs,
+ * same purpose as BLI_array_staticdeclare()
+ * but use when the max size is known ahead of time */
+#define BLI_array_fixedstack_declare(arr, maxstatic, realsize, allocstr) \
+ char _##arr##_static[maxstatic*sizeof(*arr)]; \
+ const int _##arr##_is_static= ((void *)_##arr##_static) != ( \
+ arr= (realsize <= maxstatic) ? \
+ (void *)_##arr##_static : \
+ MEM_mallocN(sizeof(*arr)*realsize, allocstr) \
+ ) \
+
+#define BLI_array_fixedstack_free(arr) \
+ if (_##arr##_is_static) MEM_freeN(arr) \
+
diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h
index e27a315a023..32c4e012d1d 100644
--- a/source/blender/blenlib/BLI_dynstr.h
+++ b/source/blender/blenlib/BLI_dynstr.h
@@ -100,6 +100,17 @@ int BLI_dynstr_get_len (DynStr *ds);
*/
char* BLI_dynstr_get_cstring (DynStr *ds);
+/**
+ * Get a DynStr's contents as a c-string.
+ * <i> The str argument must be allocated to be at
+ * least the size of BLI_dynstr_get_len(ds) + 1. </i>
+ *
+ * @param ds The DynStr of interest.
+ * @param str The string to fill.
+ * @return The contents of @a ds as a c-string.
+ */
+void BLI_dynstr_get_cstring_ex (DynStr *ds, char *str);
+
/**
* Free the DynStr
*
diff --git a/source/blender/blenlib/BLI_edgehash.h b/source/blender/blenlib/BLI_edgehash.h
index 283b52e06b9..9153155e359 100644
--- a/source/blender/blenlib/BLI_edgehash.h
+++ b/source/blender/blenlib/BLI_edgehash.h
@@ -47,22 +47,22 @@ void BLI_edgehash_free (EdgeHash *eh, EdgeHashFreeFP valfreefp);
/* Insert edge (v0,v1) into hash with given value, does
* not check for duplicates.
*/
-void BLI_edgehash_insert (EdgeHash *eh, int v0, int v1, void *val);
+void BLI_edgehash_insert (EdgeHash *eh, unsigned int v0, unsigned int v1, void *val);
/* Return value for given edge (v0,v1), or NULL if
* if key does not exist in hash. (If need exists
* to differentiate between key-value being NULL and
* lack of key then see BLI_edgehash_lookup_p().
*/
-void* BLI_edgehash_lookup (EdgeHash *eh, int v0, int v1);
+void* BLI_edgehash_lookup (EdgeHash *eh, unsigned int v0, unsigned int v1);
/* Return pointer to value for given edge (v0,v1),
* or NULL if key does not exist in hash.
*/
-void** BLI_edgehash_lookup_p (EdgeHash *eh, int v0, int v1);
+void** BLI_edgehash_lookup_p (EdgeHash *eh, unsigned int v0, unsigned int v1);
/* Return boolean true/false if edge (v0,v1) in hash. */
-int BLI_edgehash_haskey (EdgeHash *eh, int v0, int v1);
+int BLI_edgehash_haskey (EdgeHash *eh, unsigned int v0, unsigned int v1);
/* Return number of keys in hash. */
int BLI_edgehash_size (EdgeHash *eh);
@@ -83,7 +83,7 @@ EdgeHashIterator* BLI_edgehashIterator_new (EdgeHash *eh);
void BLI_edgehashIterator_free (EdgeHashIterator *ehi);
/* Retrieve the key from an iterator. */
-void BLI_edgehashIterator_getKey (EdgeHashIterator *ehi, int *v0_r, int *v1_r);
+void BLI_edgehashIterator_getKey (EdgeHashIterator *ehi, unsigned int *v0_r, unsigned int *v1_r);
/* Retrieve the value from an iterator. */
void* BLI_edgehashIterator_getValue (EdgeHashIterator *ehi);
@@ -98,4 +98,3 @@ void BLI_edgehashIterator_step (EdgeHashIterator *ehi);
int BLI_edgehashIterator_isDone (EdgeHashIterator *ehi);
#endif
-
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 712429716a6..2e8f1a5512e 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -56,6 +56,7 @@ int BLI_create_symlink(const char *path, const char *to);
struct direntry;
int BLI_is_dir(const char *path);
+int BLI_is_file(const char *path);
void BLI_dir_create_recursive(const char *dir);
double BLI_dir_free_space(const char *dir);
char *BLI_current_working_dir(char *dir, const int maxlen);
diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h
index 976519c281a..f2a7e73e5e0 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -142,6 +142,16 @@ int BLI_ghashutil_strcmp (const void *a, const void *b);
unsigned int BLI_ghashutil_inthash (const void *ptr);
int BLI_ghashutil_intcmp (const void *a, const void *b);
+typedef struct GHashPair {
+ const void *first;
+ int second;
+} GHashPair;
+
+GHashPair* BLI_ghashutil_pairalloc (const void *first, int second);
+unsigned int BLI_ghashutil_pairhash (const void *ptr);
+int BLI_ghashutil_paircmp (const void *a, const void *b);
+void BLI_ghashutil_pairfree (void *ptr);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index c190cb5daab..6e87e518ecb 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -167,6 +167,11 @@ MINLINE float signf(float f);
MINLINE float power_of_2(float f);
+/* these dont really fit anywhere but were being copied about a lot */
+MINLINE int is_power_of_2_i(int n);
+MINLINE int power_of_2_max_i(int n);
+MINLINE int power_of_2_min_i(int n);
+
MINLINE float shell_angle_to_dist(float angle);
#if (defined(WIN32) || defined(WIN64)) && !defined(FREE_WINDOWS)
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 0e33ee2be3f..7fbb4680b6d 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -34,6 +34,8 @@
extern "C" {
#endif
+#include "BLI_math_inline.h"
+
/* primaries */
#define BLI_XYZ_SMPTE 0
#define BLI_XYZ_REC709_SRGB 1
@@ -48,7 +50,7 @@ extern "C" {
#define BLI_YCC_ITU_BT601 0
#define BLI_YCC_ITU_BT709 1
#define BLI_YCC_JFIF_0_255 2
-
+
/******************* Conversion to RGB ********************/
void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
@@ -70,22 +72,23 @@ unsigned int hsv_to_cpack(float h, float s, float v);
float rgb_to_grayscale(float rgb[3]);
unsigned char rgb_to_grayscale_byte(unsigned char rgb[3]);
-/***************** Profile Transformations ********************/
+/**************** Profile Transformations *****************/
void gamma_correct(float *c, float gamma);
float rec709_to_linearrgb(float c);
float linearrgb_to_rec709(float c);
float srgb_to_linearrgb(float c);
float linearrgb_to_srgb(float c);
-void srgb_to_linearrgb_v3_v3(float *col_to, float *col_from);
-void linearrgb_to_srgb_v3_v3(float *col_to, float *col_from);
-
-/* rgba buffer convenience functions */
-void srgb_to_linearrgb_rgba_buf(float *col, int tot);
-void linearrgb_to_srgb_rgba_buf(float *col, int tot);
-void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
-void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
-
+
+MINLINE void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3]);
+MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3]);
+
+MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4]);
+MINLINE void linearrgb_to_srgb_v4(float srgb[4], const float linear[4]);
+
+MINLINE void srgb_to_linearrgb_predivide_v4(float linear[4], const float srgb[4]);
+MINLINE void linearrgb_to_srgb_predivide_v4(float srgb[4], const float linear[4]);
+
/************************** Other *************************/
int constrain_rgb(float *r, float *g, float *b);
@@ -101,6 +104,10 @@ void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *o
void rgb_byte_to_float(const unsigned char *in, float *out);
void rgb_float_to_byte(const float *in, unsigned char *out);
+#ifdef BLI_MATH_INLINE_H
+#include "intern/math_color_inline.c"
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index a2a4ffdc830..27da6c1025d 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -65,7 +65,9 @@ float dist_to_plane_v3(const float p[3], const float plane_co[3], const float pl
float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
-void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
+void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
+void closest_to_plane_v3(float r[3], const float plane_co[3], const float plane_no_unit[3], const float pt[3]);
+
float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3]);
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2]);
@@ -260,6 +262,8 @@ MINLINE void madd_sh_shfl(float r[9], const float sh[3], const float f);
float form_factor_hemi_poly(float p[3], float n[3],
float v1[3], float v2[3], float v3[3], float v4[3]);
+void axis_dominant_v3(int *axis_a, int *axis_b, const float axis[3]);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index 008d2ad49ce..4d3a4dfe445 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -68,10 +68,12 @@ void sub_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
void sub_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
-void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]);
void mul_m4_m4m3(float R[4][4], float A[4][4], float B[3][3]);
-void mul_m3_m3m4(float R[3][3], float A[3][3], float B[4][4]);
+/* note: the A,B arguments are reversed compared to previous mul_m4_m4m4
+ function, for consistency with above functions & math notation. */
+void mult_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
+void mult_m3_m3m4(float R[3][3], float A[4][4], float B[3][3]);
void mul_serie_m3(float R[3][3],
float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index d8e880a9dec..e9e44ed7b2c 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -198,6 +198,7 @@ double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int s
float normalize_vn_vn(float *array_tar, const float *array_src, const int size);
float normalize_vn(float *array_tar, const int size);
void range_vn_i(int *array_tar, const int size, const int start);
+void range_vn_fl(float *array_tar, const int size, const float start, const float step);
void negate_vn(float *array_tar, const int size);
void negate_vn_vn(float *array_tar, const float *array_src, const int size);
void mul_vn_fl(float *array_tar, const int size, const float f);
diff --git a/source/blender/blenlib/BLI_md5.h b/source/blender/blenlib/BLI_md5.h
new file mode 100644
index 00000000000..afcc3cdfa3e
--- /dev/null
+++ b/source/blender/blenlib/BLI_md5.h
@@ -0,0 +1,45 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BLI_MD5_H
+#define BLI_MD5_H
+
+/** \file BLI_md5.h
+ * \ingroup bli
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+
+void *md5_buffer(const char *buffer, size_t len, void *resblock);
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+
+int md5_stream(FILE *stream, void *resblock);
+
+#endif
+
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index a6b4f2c9b92..abe8fb7d8fe 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -279,27 +279,34 @@
# endif
# if defined(__GNUC__) || defined(_MSC_VER) /* check __func__ is available */
# define BLI_assert(a) \
-do { \
- if (!(a)) { \
+ (void)((!(a)) ? ( \
+ ( \
fprintf(stderr, \
"BLI_assert failed: %s, %s(), %d at \'%s\'\n", \
- __FILE__, __func__, __LINE__, STRINGIFY(a)); \
- _dummy_abort(); \
- } \
-} while (0)
+ __FILE__, __func__, __LINE__, STRINGIFY(a)), \
+ _dummy_abort(), \
+ NULL)) : NULL)
# else
-# define BLI_assert(a) \
-do { \
- if (0 == (a)) { \
+# define BLI_assert(a) \
+ (void)((!(a)) ? ( \
+ ( \
fprintf(stderr, \
"BLI_assert failed: %s, %d at \'%s\'\n", \
- __FILE__, __LINE__, STRINGIFY(a)); \
- _dummy_abort(); \
- } \
-} while (0)
+ __FILE__, __LINE__, STRINGIFY(a)), \
+ _dummy_abort(), \
+ NULL)) : NULL)
# endif
#else
# define BLI_assert(a) (void)0
#endif
+/* hints for branch pradiction, only use in code that runs a _lot_ where */
+#ifdef __GNUC__
+# define LIKELY(x) __builtin_expect(!!(x), 1)
+# define UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+# define LIKELY(x) (x)
+# define UNLIKELY(x) (x)
+#endif
+
#endif // BLI_UTILDEFINES_H
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 5d54ffbeb36..03e3b8288ae 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -65,12 +65,14 @@ set(SRC
intern/math_base.c
intern/math_base_inline.c
intern/math_color.c
+ intern/math_color_inline.c
intern/math_geom.c
intern/math_geom_inline.c
intern/math_matrix.c
intern/math_rotation.c
intern/math_vector.c
intern/math_vector_inline.c
+ intern/md5.c
intern/noise.c
intern/path_util.c
intern/pbvh.c
@@ -86,6 +88,7 @@ set(SRC
intern/voxel.c
intern/winstuff.c
+ BLI_array.h
BLI_args.h
BLI_blenlib.h
BLI_boxpack2d.h
@@ -117,6 +120,7 @@ set(SRC
BLI_math_matrix.h
BLI_math_rotation.h
BLI_math_vector.h
+ BLI_md5.h
BLI_memarena.h
BLI_mempool.h
BLI_noise.h
diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c
index 5cdadce7c01..ad52de180aa 100644
--- a/source/blender/blenlib/intern/BLI_dynstr.c
+++ b/source/blender/blenlib/intern/BLI_dynstr.c
@@ -94,7 +94,8 @@ void BLI_dynstr_append(DynStr *ds, const char *cstr)
ds->curlen+= cstrlen;
}
-void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len) {
+void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len)
+{
DynStrElem *dse= malloc(sizeof(*dse));
int cstrlen= BLI_strnlen(cstr, len);
@@ -225,10 +226,11 @@ int BLI_dynstr_get_len(DynStr *ds)
return ds->curlen;
}
-char *BLI_dynstr_get_cstring(DynStr *ds) {
- char *s, *rets= MEM_mallocN(ds->curlen+1, "dynstr_cstring");
+void BLI_dynstr_get_cstring_ex(DynStr *ds, char *rets)
+{
+ char *s;
DynStrElem *dse;
-
+
for (s= rets, dse= ds->elems; dse; dse= dse->next) {
int slen= strlen(dse->str);
@@ -237,11 +239,17 @@ char *BLI_dynstr_get_cstring(DynStr *ds) {
s+= slen;
}
rets[ds->curlen]= '\0';
-
+}
+
+char *BLI_dynstr_get_cstring(DynStr *ds)
+{
+ char *rets= MEM_mallocN(ds->curlen+1, "dynstr_cstring");
+ BLI_dynstr_get_cstring_ex(ds, rets);
return rets;
}
-void BLI_dynstr_free(DynStr *ds) {
+void BLI_dynstr_free(DynStr *ds)
+{
DynStrElem *dse;
for (dse= ds->elems; dse; ) {
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index c1894088300..9f388b68c38 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -56,7 +56,8 @@ static unsigned int hashsizes[]= {
/***/
-GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) {
+GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info)
+{
GHash *gh= MEM_mallocN(sizeof(*gh), info);
gh->hashfp= hashfp;
gh->cmpfp= cmpfp;
@@ -72,11 +73,13 @@ GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) {
return gh;
}
-int BLI_ghash_size(GHash *gh) {
+int BLI_ghash_size(GHash *gh)
+{
return gh->nentries;
}
-void BLI_ghash_insert(GHash *gh, void *key, void *val) {
+void BLI_ghash_insert(GHash *gh, void *key, void *val)
+{
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
Entry *e= (Entry*) BLI_mempool_alloc(gh->entrypool);
@@ -109,7 +112,8 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val) {
}
}
-void *BLI_ghash_lookup(GHash *gh, const void *key) {
+void *BLI_ghash_lookup(GHash *gh, const void *key)
+{
if(gh) {
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
Entry *e;
@@ -151,7 +155,8 @@ int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFr
return 0;
}
-int BLI_ghash_haskey(GHash *gh, void *key) {
+int BLI_ghash_haskey(GHash *gh, void *key)
+{
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
Entry *e;
@@ -162,7 +167,8 @@ int BLI_ghash_haskey(GHash *gh, void *key) {
return 0;
}
-void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp) {
+void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
+{
int i;
if (keyfreefp || valfreefp) {
@@ -190,7 +196,8 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreef
/***/
-GHashIterator *BLI_ghashIterator_new(GHash *gh) {
+GHashIterator *BLI_ghashIterator_new(GHash *gh)
+{
GHashIterator *ghi= MEM_mallocN(sizeof(*ghi), "ghash iterator");
ghi->gh= gh;
ghi->curEntry= NULL;
@@ -203,7 +210,8 @@ GHashIterator *BLI_ghashIterator_new(GHash *gh) {
}
return ghi;
}
-void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh) {
+void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh)
+{
ghi->gh= gh;
ghi->curEntry= NULL;
ghi->curBucket= -1;
@@ -214,18 +222,22 @@ void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh) {
ghi->curEntry= ghi->gh->buckets[ghi->curBucket];
}
}
-void BLI_ghashIterator_free(GHashIterator *ghi) {
+void BLI_ghashIterator_free(GHashIterator *ghi)
+{
MEM_freeN(ghi);
}
-void *BLI_ghashIterator_getKey(GHashIterator *ghi) {
+void *BLI_ghashIterator_getKey(GHashIterator *ghi)
+{
return ghi->curEntry?ghi->curEntry->key:NULL;
}
-void *BLI_ghashIterator_getValue(GHashIterator *ghi) {
+void *BLI_ghashIterator_getValue(GHashIterator *ghi)
+{
return ghi->curEntry?ghi->curEntry->val:NULL;
}
-void BLI_ghashIterator_step(GHashIterator *ghi) {
+void BLI_ghashIterator_step(GHashIterator *ghi)
+{
if (ghi->curEntry) {
ghi->curEntry= ghi->curEntry->next;
while (!ghi->curEntry) {
@@ -236,23 +248,27 @@ void BLI_ghashIterator_step(GHashIterator *ghi) {
}
}
}
-int BLI_ghashIterator_isDone(GHashIterator *ghi) {
+int BLI_ghashIterator_isDone(GHashIterator *ghi)
+{
return !ghi->curEntry;
}
/***/
-unsigned int BLI_ghashutil_ptrhash(const void *key) {
+unsigned int BLI_ghashutil_ptrhash(const void *key)
+{
return (unsigned int)(intptr_t)key;
}
-int BLI_ghashutil_ptrcmp(const void *a, const void *b) {
+int BLI_ghashutil_ptrcmp(const void *a, const void *b)
+{
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_inthash(const void *ptr) {
+unsigned int BLI_ghashutil_inthash(const void *ptr)
+{
uintptr_t key = (uintptr_t)ptr;
key += ~(key << 16);
@@ -265,14 +281,16 @@ unsigned int BLI_ghashutil_inthash(const void *ptr) {
return (unsigned int)(key & 0xffffffff);
}
-int BLI_ghashutil_intcmp(const void *a, const void *b) {
+int BLI_ghashutil_intcmp(const void *a, const void *b)
+{
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_strhash(const void *ptr) {
+unsigned int BLI_ghashutil_strhash(const void *ptr)
+{
const char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -282,6 +300,39 @@ unsigned int BLI_ghashutil_strhash(const void *ptr) {
return i;
}
-int BLI_ghashutil_strcmp(const void *a, const void *b) {
+int BLI_ghashutil_strcmp(const void *a, const void *b)
+{
return strcmp(a, b);
}
+
+GHashPair *BLI_ghashutil_pairalloc(const void *first, int second)
+{
+ GHashPair *pair = MEM_mallocN(sizeof(GHashPair), "GHashPair");
+ pair->first = first;
+ pair->second = second;
+ return pair;
+}
+
+unsigned int BLI_ghashutil_pairhash(const void *ptr)
+{
+ const GHashPair *pair = ptr;
+ unsigned int hash = BLI_ghashutil_ptrhash(pair->first);
+ return hash ^ BLI_ghashutil_inthash(SET_INT_IN_POINTER(pair->second));
+}
+
+int BLI_ghashutil_paircmp(const void *a, const void *b)
+{
+ const GHashPair *A = a;
+ const GHashPair *B = b;
+
+ int cmp = BLI_ghashutil_ptrcmp(A->first, B->first);
+ if(cmp == 0)
+ return BLI_ghashutil_intcmp(SET_INT_IN_POINTER(A->second), SET_INT_IN_POINTER(B->second));
+ return cmp;
+}
+
+void BLI_ghashutil_pairfree(void *ptr)
+{
+ MEM_freeN((void*)ptr);
+}
+
diff --git a/source/blender/blenlib/intern/BLI_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c
index a9b8cbb6467..6300817ec03 100644
--- a/source/blender/blenlib/intern/BLI_linklist.c
+++ b/source/blender/blenlib/intern/BLI_linklist.c
@@ -35,7 +35,8 @@
#include "BLI_linklist.h"
#include "BLI_memarena.h"
-int BLI_linklist_length(LinkNode *list) {
+int BLI_linklist_length(LinkNode *list)
+{
if (0) {
return list?(1+BLI_linklist_length(list->next)):0;
} else {
@@ -70,7 +71,8 @@ LinkNode *BLI_linklist_find(LinkNode *list, int index)
return NULL;
}
-void BLI_linklist_reverse(LinkNode **listp) {
+void BLI_linklist_reverse(LinkNode **listp)
+{
LinkNode *rhead= NULL, *cur= *listp;
while (cur) {
@@ -85,7 +87,8 @@ void BLI_linklist_reverse(LinkNode **listp) {
*listp= rhead;
}
-void BLI_linklist_prepend(LinkNode **listp, void *ptr) {
+void BLI_linklist_prepend(LinkNode **listp, void *ptr)
+{
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
nlink->link= ptr;
@@ -93,7 +96,8 @@ void BLI_linklist_prepend(LinkNode **listp, void *ptr) {
*listp= nlink;
}
-void BLI_linklist_append(LinkNode **listp, void *ptr) {
+void BLI_linklist_append(LinkNode **listp, void *ptr)
+{
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
LinkNode *node = *listp;
@@ -110,7 +114,8 @@ void BLI_linklist_append(LinkNode **listp, void *ptr) {
}
}
-void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma) {
+void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma)
+{
LinkNode *nlink= BLI_memarena_alloc(ma, sizeof(*nlink));
nlink->link= ptr;
@@ -118,7 +123,8 @@ void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma) {
*listp= nlink;
}
-void BLI_linklist_insert_after(LinkNode **listp, void *ptr) {
+void BLI_linklist_insert_after(LinkNode **listp, void *ptr)
+{
LinkNode *nlink= MEM_mallocN(sizeof(*nlink), "nlink");
LinkNode *node = *listp;
@@ -134,7 +140,8 @@ void BLI_linklist_insert_after(LinkNode **listp, void *ptr) {
}
}
-void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc) {
+void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
+{
while (list) {
LinkNode *next= list->next;
@@ -146,7 +153,8 @@ void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc) {
}
}
-void BLI_linklist_apply(LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata) {
+void BLI_linklist_apply(LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata)
+{
for (; list; list= list->next)
applyfunc(list->link, userdata);
}
diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c
index 308fc6a61e6..4debe1a4b04 100644
--- a/source/blender/blenlib/intern/BLI_memarena.c
+++ b/source/blender/blenlib/intern/BLI_memarena.c
@@ -48,7 +48,8 @@ struct MemArena {
LinkNode *bufs;
};
-MemArena *BLI_memarena_new(int bufsize, const char *name) {
+MemArena *BLI_memarena_new(int bufsize, const char *name)
+{
MemArena *ma= MEM_callocN(sizeof(*ma), "memarena");
ma->bufsize= bufsize;
ma->align = 8;
@@ -57,20 +58,24 @@ MemArena *BLI_memarena_new(int bufsize, const char *name) {
return ma;
}
-void BLI_memarena_use_calloc(MemArena *ma) {
+void BLI_memarena_use_calloc(MemArena *ma)
+{
ma->use_calloc= 1;
}
-void BLI_memarena_use_malloc(MemArena *ma) {
+void BLI_memarena_use_malloc(MemArena *ma)
+{
ma->use_calloc= 0;
}
-void BLI_memarena_use_align(struct MemArena *ma, int align) {
+void BLI_memarena_use_align(struct MemArena *ma, int align)
+{
/* align should be a power of two */
ma->align = align;
}
-void BLI_memarena_free(MemArena *ma) {
+void BLI_memarena_free(MemArena *ma)
+{
BLI_linklist_free(ma->bufs, (void(*)(void*)) MEM_freeN);
MEM_freeN(ma);
}
@@ -78,7 +83,8 @@ void BLI_memarena_free(MemArena *ma) {
/* amt must be power of two */
#define PADUP(num, amt) ((num+(amt-1))&~(amt-1))
-void *BLI_memarena_alloc(MemArena *ma, int size) {
+void *BLI_memarena_alloc(MemArena *ma, int size)
+{
void *ptr;
/* ensure proper alignment by rounding
diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c
index 0060878587b..5e64ed2e3e6 100644
--- a/source/blender/blenlib/intern/BLI_mempool.c
+++ b/source/blender/blenlib/intern/BLI_mempool.c
@@ -274,6 +274,9 @@ void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter)
iter->curindex = 0;
}
+#if 0
+/* unoptimized, more readable */
+
static void *bli_mempool_iternext(BLI_mempool_iter *iter)
{
void *ret = NULL;
@@ -303,6 +306,37 @@ void *BLI_mempool_iterstep(BLI_mempool_iter *iter)
return ret;
}
+#else
+
+/* optimized version of code above */
+
+void *BLI_mempool_iterstep(BLI_mempool_iter *iter)
+{
+ BLI_freenode *ret;
+
+ if (UNLIKELY(iter->pool->totused == 0)) {
+ return NULL;
+ }
+
+ do {
+ if (LIKELY(iter->curchunk)) {
+ ret = (BLI_freenode *)(((char*)iter->curchunk->data) + iter->pool->esize*iter->curindex);
+ }
+ else {
+ return NULL;
+ }
+
+ if (UNLIKELY(++iter->curindex >= iter->pool->pchunk)) {
+ iter->curindex = 0;
+ iter->curchunk = iter->curchunk->next;
+ }
+ } while (ret->freeword == FREEWORD);
+
+ return ret;
+}
+
+#endif
+
void BLI_mempool_destroy(BLI_mempool *pool)
{
BLI_mempool_chunk *mpchunk=NULL;
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 8ad6cfc7cdf..861efcfe6c5 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -56,6 +56,7 @@
#include "DNA_image_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
+#include "DNA_movieclip_types.h"
#include "DNA_object_fluidsim.h"
#include "DNA_object_force.h"
#include "DNA_object_types.h"
@@ -198,7 +199,11 @@ void makeFilesAbsolute(Main *bmain, const char *basedir, ReportList *reports)
- filesize: filesize for the file
*/
#define MAX_RECUR 16
-static int findFileRecursive(char *filename_new, const char *dirname, const char *filename, int *filesize, int *recur_depth)
+static int findFileRecursive(char *filename_new,
+ const char *dirname,
+ const char *filename,
+ int *filesize,
+ int *recur_depth)
{
/* file searching stuff */
DIR *dir;
@@ -313,7 +318,11 @@ static int rewrite_path_fixed(char *path, BPathVisitor visit_cb, const char *abs
}
}
-static int rewrite_path_fixed_dirfile(char path_dir[FILE_MAXDIR], char path_file[FILE_MAXFILE], BPathVisitor visit_cb, const char *absbase, void *userdata)
+static int rewrite_path_fixed_dirfile(char path_dir[FILE_MAXDIR],
+ char path_file[FILE_MAXFILE],
+ BPathVisitor visit_cb,
+ const char *absbase,
+ void *userdata)
{
char path_src[FILE_MAX];
char path_dst[FILE_MAX];
@@ -495,7 +504,8 @@ void bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int fla
SEQ_BEGIN(scene->ed, seq) {
if (SEQ_HAS_PATH(seq)) {
if (ELEM(seq->type, SEQ_MOVIE, SEQ_SOUND)) {
- rewrite_path_fixed_dirfile(seq->strip->dir, seq->strip->stripdata->name, visit_cb, absbase, bpath_user_data);
+ rewrite_path_fixed_dirfile(seq->strip->dir, seq->strip->stripdata->name,
+ visit_cb, absbase, bpath_user_data);
}
else if (seq->type == SEQ_IMAGE) {
/* might want an option not to loop over all strips */
@@ -509,7 +519,8 @@ void bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int fla
}
for(i= 0; i < len; i++, se++) {
- rewrite_path_fixed_dirfile(seq->strip->dir, se->name, visit_cb, absbase, bpath_user_data);
+ rewrite_path_fixed_dirfile(seq->strip->dir, se->name,
+ visit_cb, absbase, bpath_user_data);
}
}
else {
@@ -542,6 +553,12 @@ void bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int fla
}
}
break;
+ case ID_MC:
+ {
+ MovieClip *clip= (MovieClip *)id;
+ rewrite_path_fixed(clip->name, visit_cb, absbase, bpath_user_data);
+ }
+ break;
default:
/* Nothing to do for other IDs that don't contain file paths. */
break;
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index 0eda3e78824..97eb66eb49a 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -20,7 +20,7 @@
*
* The Original Code is: none of this file.
*
- * Contributor(s): Daniel Dunbar
+ * Contributor(s): Daniel Dunbar, Joseph Eagar
*
* ***** END GPL LICENSE BLOCK *****
* A general (pointer -> pointer) hash table ADT
@@ -35,143 +35,159 @@
#include <string.h>
#include "MEM_guardedalloc.h"
-#include "BLI_edgehash.h"
-/***/
+#include "BLI_utildefines.h"
+#include "BLI_edgehash.h"
+#include "BLI_mempool.h"
-static unsigned int hashsizes[]= {
- 1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209,
- 16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169,
- 4194319, 8388617, 16777259, 33554467, 67108879, 134217757,
+/**************inlined code************/
+static unsigned int _ehash_hashsizes[]= {
+ 1, 3, 5, 11, 17, 37, 67, 131, 257, 521, 1031, 2053, 4099, 8209,
+ 16411, 32771, 65537, 131101, 262147, 524309, 1048583, 2097169,
+ 4194319, 8388617, 16777259, 33554467, 67108879, 134217757,
268435459
};
-#define EDGEHASH(v0,v1) ((v0*39)^(v1*31))
+#define EDGE_HASH(v0, v1) ((v0 * 39)^(v1 * 31))
+
+/* ensure v0 is smaller */
+#define EDGE_ORD(v0, v1) \
+ if (v0 > v1) { \
+ v0 ^= v1; \
+ v1 ^= v0; \
+ v0 ^= v1; \
+ }
/***/
-typedef struct Entry Entry;
-struct Entry {
- Entry *next;
- int v0, v1;
+typedef struct EdgeEntry EdgeEntry;
+struct EdgeEntry {
+ EdgeEntry *next;
+ unsigned int v0, v1;
void *val;
};
struct EdgeHash {
- Entry **buckets;
+ EdgeEntry **buckets;
+ BLI_mempool *epool;
int nbuckets, nentries, cursize;
};
/***/
-EdgeHash *BLI_edgehash_new(void) {
- EdgeHash *eh= MEM_mallocN(sizeof(*eh), "EdgeHash");
- eh->cursize= 0;
- eh->nentries= 0;
- eh->nbuckets= hashsizes[eh->cursize];
-
- eh->buckets= malloc(eh->nbuckets*sizeof(*eh->buckets));
- memset(eh->buckets, 0, eh->nbuckets*sizeof(*eh->buckets));
+EdgeHash *BLI_edgehash_new(void)
+{
+ EdgeHash *eh = MEM_callocN(sizeof(*eh), "EdgeHash");
+ eh->cursize = 0;
+ eh->nentries = 0;
+ eh->nbuckets = _ehash_hashsizes[eh->cursize];
+ eh->buckets = MEM_callocN(eh->nbuckets * sizeof(*eh->buckets), "eh buckets 2");
+ eh->epool = BLI_mempool_create(sizeof(EdgeEntry), 512, 512, TRUE, FALSE);
+
return eh;
}
-void BLI_edgehash_insert(EdgeHash *eh, int v0, int v1, void *val) {
+
+void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val)
+{
unsigned int hash;
- Entry *e= malloc(sizeof(*e));
+ EdgeEntry *e = BLI_mempool_alloc(eh->epool);
- if (v1<v0) {
- v0 ^= v1;
- v1 ^= v0;
- v0 ^= v1;
- }
- hash = EDGEHASH(v0,v1)%eh->nbuckets;
+ EDGE_ORD(v0, v1); /* ensure v0 is smaller */
+
+ hash = EDGE_HASH(v0, v1) % eh->nbuckets;
e->v0 = v0;
e->v1 = v1;
e->val = val;
- e->next= eh->buckets[hash];
+ e->next = eh->buckets[hash];
eh->buckets[hash]= e;
-
- if (++eh->nentries>eh->nbuckets*3) {
- Entry **old= eh->buckets;
- int i, nold= eh->nbuckets;
-
- eh->nbuckets= hashsizes[++eh->cursize];
- eh->buckets= malloc(eh->nbuckets*sizeof(*eh->buckets));
- memset(eh->buckets, 0, eh->nbuckets*sizeof(*eh->buckets));
-
- for (i=0; i<nold; i++) {
- for (e= old[i]; e;) {
- Entry *n= e->next;
-
- hash= EDGEHASH(e->v0,e->v1)%eh->nbuckets;
- e->next= eh->buckets[hash];
+
+ if (++eh->nentries>eh->nbuckets * 3) {
+ EdgeEntry *e, **old = eh->buckets;
+ int i, nold = eh->nbuckets;
+
+ eh->nbuckets = _ehash_hashsizes[++eh->cursize];
+ eh->buckets = MEM_mallocN(eh->nbuckets * sizeof(*eh->buckets), "eh buckets");
+ memset(eh->buckets, 0, eh->nbuckets * sizeof(*eh->buckets));
+
+ for (i = 0; i < nold; i++) {
+ for (e = old[i]; e;) {
+ EdgeEntry *n = e->next;
+
+ hash = EDGE_HASH(e->v0, e->v1) % eh->nbuckets;
+ e->next = eh->buckets[hash];
eh->buckets[hash]= e;
-
- e= n;
+
+ e = n;
}
}
-
- free(old);
+
+ MEM_freeN(old);
}
}
-void** BLI_edgehash_lookup_p(EdgeHash *eh, int v0, int v1) {
+void **BLI_edgehash_lookup_p(EdgeHash *eh, unsigned int v0, unsigned int v1)
+{
unsigned int hash;
- Entry *e;
+ EdgeEntry *e;
- if (v1<v0) {
- v0 ^= v1;
- v1 ^= v0;
- v0 ^= v1;
- }
- hash = EDGEHASH(v0,v1)%eh->nbuckets;
- for (e= eh->buckets[hash]; e; e= e->next)
- if (v0==e->v0 && v1==e->v1)
+ EDGE_ORD(v0, v1); /* ensure v0 is smaller */
+
+ hash = EDGE_HASH(v0, v1) % eh->nbuckets;
+ for (e = eh->buckets[hash]; e; e = e->next)
+ if (v0 == e->v0 && v1 == e->v1)
return &e->val;
-
+
return NULL;
}
-void* BLI_edgehash_lookup(EdgeHash *eh, int v0, int v1) {
- void **value_p = BLI_edgehash_lookup_p(eh,v0,v1);
+void *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1)
+{
+ void **value_p = BLI_edgehash_lookup_p(eh, v0, v1);
return value_p?*value_p:NULL;
}
-int BLI_edgehash_haskey(EdgeHash *eh, int v0, int v1) {
- return BLI_edgehash_lookup_p(eh, v0, v1)!=NULL;
+int BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1)
+{
+ return BLI_edgehash_lookup_p(eh, v0, v1) != NULL;
}
-int BLI_edgehash_size(EdgeHash *eh) {
+int BLI_edgehash_size(EdgeHash *eh)
+{
return eh->nentries;
}
-void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP valfreefp) {
+void BLI_edgehash_clear(EdgeHash *eh, EdgeHashFreeFP valfreefp)
+{
int i;
- for (i=0; i<eh->nbuckets; i++) {
- Entry *e;
+ for (i = 0; i<eh->nbuckets; i++) {
+ EdgeEntry *e;
- for (e= eh->buckets[i]; e; ) {
- Entry *n= e->next;
+ for (e = eh->buckets[i]; e; ) {
+ EdgeEntry *n = e->next;
if (valfreefp) valfreefp(e->val);
- free(e);
+ BLI_mempool_free(eh->epool, e);
- e= n;
+ e = n;
}
- eh->buckets[i]= NULL;
+ eh->buckets[i] = NULL;
}
- eh->nentries= 0;
+ eh->nentries = 0;
}
-void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp) {
+void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp)
+{
BLI_edgehash_clear(eh, valfreefp);
-
- free(eh->buckets);
+
+ BLI_mempool_destroy(eh->epool);
+
+ MEM_freeN(eh->buckets);
MEM_freeN(eh);
}
@@ -181,53 +197,63 @@ void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP valfreefp) {
struct EdgeHashIterator {
EdgeHash *eh;
int curBucket;
- Entry *curEntry;
+ EdgeEntry *curEntry;
};
-EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh) {
- EdgeHashIterator *ehi= malloc(sizeof(*ehi));
- ehi->eh= eh;
- ehi->curEntry= NULL;
- ehi->curBucket= -1;
+EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh)
+{
+ EdgeHashIterator *ehi = MEM_mallocN(sizeof(*ehi), "eh iter");
+ ehi->eh = eh;
+ ehi->curEntry = NULL;
+ ehi->curBucket = -1;
while (!ehi->curEntry) {
ehi->curBucket++;
- if (ehi->curBucket==ehi->eh->nbuckets)
+ if (ehi->curBucket == ehi->eh->nbuckets)
break;
- ehi->curEntry= ehi->eh->buckets[ehi->curBucket];
+ ehi->curEntry = ehi->eh->buckets[ehi->curBucket];
}
return ehi;
}
-void BLI_edgehashIterator_free(EdgeHashIterator *ehi) {
- free(ehi);
+void BLI_edgehashIterator_free(EdgeHashIterator *ehi)
+{
+ MEM_freeN(ehi);
}
-void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, int *v0_r, int *v1_r) {
+void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, unsigned int *v0_r, unsigned int *v1_r)
+{
if (ehi->curEntry) {
*v0_r = ehi->curEntry->v0;
*v1_r = ehi->curEntry->v1;
}
}
-void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi) {
+void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi)
+{
return ehi->curEntry?ehi->curEntry->val:NULL;
}
-void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val) {
- if(ehi->curEntry)
- ehi->curEntry->val= val;
+void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val)
+{
+ if (ehi->curEntry) {
+ ehi->curEntry->val = val;
+ }
}
-void BLI_edgehashIterator_step(EdgeHashIterator *ehi) {
+void BLI_edgehashIterator_step(EdgeHashIterator *ehi)
+{
if (ehi->curEntry) {
- ehi->curEntry= ehi->curEntry->next;
+ ehi->curEntry = ehi->curEntry->next;
while (!ehi->curEntry) {
ehi->curBucket++;
- if (ehi->curBucket==ehi->eh->nbuckets)
+ if (ehi->curBucket == ehi->eh->nbuckets) {
break;
- ehi->curEntry= ehi->eh->buckets[ehi->curBucket];
+ }
+
+ ehi->curEntry = ehi->eh->buckets[ehi->curBucket];
}
}
}
-int BLI_edgehashIterator_isDone(EdgeHashIterator *ehi) {
+int BLI_edgehashIterator_isDone(EdgeHashIterator *ehi)
+{
return !ehi->curEntry;
}
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index ae3cba7e94f..7e04e0ae566 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -39,7 +39,7 @@
#define BLI_MATH_BASE_INLINE_H
/* A few small defines. Keep'em local! */
-#define SMALL_NUMBER 1.e-8
+#define SMALL_NUMBER 1.e-8f
MINLINE float sqrt3f(float f)
{
@@ -106,7 +106,7 @@ MINLINE float interpf(float target, float origin, float fac)
* the distance gets very high, 180d would be inf, but this case isn't valid */
MINLINE float shell_angle_to_dist(const float angle)
{
- return (angle < (float)SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
+ return (angle < SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
}
/* used for zoom values*/
@@ -115,6 +115,31 @@ MINLINE float power_of_2(float val)
return (float)pow(2.0, ceil(log((double)val) / M_LN2));
}
+MINLINE int is_power_of_2_i(int n)
+{
+ return (n & (n - 1)) == 0;
+}
+
+MINLINE int power_of_2_max_i(int n)
+{
+ if (is_power_of_2_i(n))
+ return n;
+
+ while(!is_power_of_2_i(n))
+ n = n & (n - 1);
+
+ return n * 2;
+}
+
+MINLINE int power_of_2_min_i(int n)
+{
+ while (!is_power_of_2_i(n))
+ n = n & (n - 1);
+
+ return n;
+}
+
+
MINLINE float minf(float a, float b)
{
return (a < b)? a: b;
@@ -130,5 +155,6 @@ MINLINE float signf(float f)
return (f < 0.f)? -1.f: 1.f;
}
+
#endif /* BLI_MATH_BASE_INLINE_H */
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 2ef29c1ce94..8f5366b6317 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -393,57 +393,6 @@ float linearrgb_to_srgb(float c)
return 1.055f * powf(c, 1.0f/2.4f) - 0.055f;
}
-void srgb_to_linearrgb_v3_v3(float *col_to, float *col_from)
-{
- col_to[0] = srgb_to_linearrgb(col_from[0]);
- col_to[1] = srgb_to_linearrgb(col_from[1]);
- col_to[2] = srgb_to_linearrgb(col_from[2]);
-}
-
-void linearrgb_to_srgb_v3_v3(float *col_to, float *col_from)
-{
- col_to[0] = linearrgb_to_srgb(col_from[0]);
- col_to[1] = linearrgb_to_srgb(col_from[1]);
- col_to[2] = linearrgb_to_srgb(col_from[2]);
-}
-
-/* todo, should these be moved elsewhere?, they dont belong in imbuf */
-void srgb_to_linearrgb_rgba_buf(float *col, int tot)
-{
- while(tot--) {
- srgb_to_linearrgb_v3_v3(col, col);
- col += 4;
- }
-}
-
-void linearrgb_to_srgb_rgba_buf(float *col, int tot)
-{
- while(tot--) {
- linearrgb_to_srgb_v3_v3(col, col);
- col += 4;
- }
-}
-
-void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
-{
- while(tot--) {
- srgb_to_linearrgb_v3_v3(col_to, col_from);
- col_to[3]= col_from[3];
- col_to += 4;
- col_from += 4;
- }
-}
-
-void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
-{
- while(tot--) {
- linearrgb_to_srgb_v3_v3(col_to, col_from);
- col_to[3]= col_from[3];
- col_to += 4;
- col_from += 4;
- }
-}
-
void minmax_rgb(short c[])
{
if(c[0]>255) c[0]=255;
diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c
new file mode 100644
index 00000000000..aaaa065f14d
--- /dev/null
+++ b/source/blender/blenlib/intern/math_color_inline.c
@@ -0,0 +1,109 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: some of this file.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * */
+
+/** \file blender/blenlib/intern/math_color_inline.c
+ * \ingroup bli
+ */
+
+
+#include "BLI_math_color.h"
+#include "BLI_utildefines.h"
+
+#ifndef BLI_MATH_COLOR_INLINE_H
+#define BLI_MATH_COLOR_INLINE_H
+
+/******************************** Color Space ********************************/
+
+MINLINE void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
+{
+ linear[0] = srgb_to_linearrgb(srgb[0]);
+ linear[1] = srgb_to_linearrgb(srgb[1]);
+ linear[2] = srgb_to_linearrgb(srgb[2]);
+}
+
+MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
+{
+ srgb[0] = linearrgb_to_srgb(linear[0]);
+ srgb[1] = linearrgb_to_srgb(linear[1]);
+ srgb[2] = linearrgb_to_srgb(linear[2]);
+}
+
+MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
+{
+ srgb_to_linearrgb_v3_v3(linear, srgb);
+ linear[3] = srgb[3];
+}
+
+MINLINE void linearrgb_to_srgb_v4(float srgb[4], const float linear[4])
+{
+ linearrgb_to_srgb_v3_v3(srgb, linear);
+ srgb[3] = linear[3];
+}
+
+/* predivide versions to work on associated/premultipled alpha. if this should
+ be done or not depends on the background the image will be composited over,
+ ideally you would never do color space conversion on an image with alpha
+ because it is ill defined */
+
+MINLINE void srgb_to_linearrgb_predivide_v4(float linear[4], const float srgb[4])
+{
+ float alpha, inv_alpha;
+
+ if(srgb[3] == 1.0f || srgb[3] == 0.0f) {
+ alpha = 1.0f;
+ inv_alpha = 1.0f;
+ }
+ else {
+ alpha = srgb[3];
+ inv_alpha = 1.0f/alpha;
+ }
+
+ linear[0] = srgb_to_linearrgb(srgb[0] * inv_alpha) * alpha;
+ linear[1] = srgb_to_linearrgb(srgb[1] * inv_alpha) * alpha;
+ linear[2] = srgb_to_linearrgb(srgb[2] * inv_alpha) * alpha;
+ linear[3] = srgb[3];
+}
+
+MINLINE void linearrgb_to_srgb_predivide_v4(float srgb[4], const float linear[4])
+{
+ float alpha, inv_alpha;
+
+ if(linear[3] == 1.0f || linear[3] == 0.0f) {
+ alpha = 1.0f;
+ inv_alpha = 1.0f;
+ }
+ else {
+ alpha = linear[3];
+ inv_alpha = 1.0f/alpha;
+ }
+
+ srgb[0] = linearrgb_to_srgb(linear[0] * inv_alpha) * alpha;
+ srgb[1] = linearrgb_to_srgb(linear[1] * inv_alpha) * alpha;
+ srgb[2] = linearrgb_to_srgb(linear[2] * inv_alpha) * alpha;
+ srgb[3] = linear[3];
+}
+
+#endif /* BLI_MATH_COLOR_INLINE_H */
+
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 9d42ee347d4..ef04e5e9bce 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -133,7 +133,8 @@ float area_poly_v3(int nr, float verts[][3], const float normal[3])
float *cur, *prev;
int a, px=0, py=1;
- /* first: find dominant axis: 0==X, 1==Y, 2==Z */
+ /* first: find dominant axis: 0==X, 1==Y, 2==Z
+ * don't use 'axis_dominant_v3()' because we need max axis too */
x= fabsf(normal[0]);
y= fabsf(normal[1]);
z= fabsf(normal[2]);
@@ -208,33 +209,54 @@ float dist_to_line_segment_v2(const float v1[2], const float v2[2], const float
}
/* point closest to v1 on line v2-v3 in 2D */
-void closest_to_line_segment_v2(float closest[2], const float p[2], const float l1[2], const float l2[2])
+void closest_to_line_segment_v2(float close_r[2], const float p[2], const float l1[2], const float l2[2])
{
float lambda, cp[2];
lambda= closest_to_line_v2(cp,p, l1, l2);
if(lambda <= 0.0f)
- copy_v2_v2(closest, l1);
+ copy_v2_v2(close_r, l1);
else if(lambda >= 1.0f)
- copy_v2_v2(closest, l2);
+ copy_v2_v2(close_r, l2);
else
- copy_v2_v2(closest, cp);
+ copy_v2_v2(close_r, cp);
}
/* point closest to v1 on line v2-v3 in 3D */
-void closest_to_line_segment_v3(float closest[3], const float v1[3], const float v2[3], const float v3[3])
+void closest_to_line_segment_v3(float close_r[3], const float v1[3], const float v2[3], const float v3[3])
{
float lambda, cp[3];
lambda= closest_to_line_v3(cp,v1, v2, v3);
if(lambda <= 0.0f)
- copy_v3_v3(closest, v2);
+ copy_v3_v3(close_r, v2);
else if(lambda >= 1.0f)
- copy_v3_v3(closest, v3);
+ copy_v3_v3(close_r, v3);
else
- copy_v3_v3(closest, cp);
+ copy_v3_v3(close_r, cp);
+}
+
+/* find the closest point on a plane to another point and store it in close_r
+ * close_r: return coordinate
+ * plane_co: a point on the plane
+ * plane_no_unit: the plane's normal, and d is the last number in the plane equation 0 = ax + by + cz + d
+ * pt: the point that you want the nearest of
+ */
+
+// const float norm[3], const float coord[3], const float point[3], float dst_r[3]
+void closest_to_plane_v3(float close_r[3], const float plane_co[3], const float plane_no_unit[3], const float pt[3])
+{
+ float temp[3];
+ float dotprod;
+
+ sub_v3_v3v3(temp, pt, plane_co);
+ dotprod= dot_v3v3(temp, plane_no_unit);
+
+ close_r[0] = pt[0] - (plane_no_unit[0] * dotprod);
+ close_r[1] = pt[1] - (plane_no_unit[1] * dotprod);
+ close_r[2] = pt[2] - (plane_no_unit[2] * dotprod);
}
/* signed distance from the point to the plane in 3D */
@@ -1689,6 +1711,18 @@ void plot_line_v2v2i(const int p1[2], const int p2[2], int (*callback)(int, int,
/****************************** Interpolation ********************************/
+/* get the 2 dominant axis values, 0==X, 1==Y, 2==Z */
+void axis_dominant_v3(int *axis_a, int *axis_b, const float axis[3])
+{
+ const float xn= fabsf(axis[0]);
+ const float yn= fabsf(axis[1]);
+ const float zn= fabsf(axis[2]);
+
+ if (zn >= xn && zn >= yn) { *axis_a= 0; *axis_b= 1; }
+ else if (yn >= xn && yn >= zn) { *axis_a= 0; *axis_b= 2; }
+ else { *axis_a= 1; *axis_b= 2; }
+}
+
static float tri_signed_area(const float v1[3], const float v2[3], const float v3[3], const int i, const int j)
{
return 0.5f*((v1[i]-v2[i])*(v2[j]-v3[j]) + (v1[j]-v2[j])*(v3[i]-v2[i]));
@@ -1696,17 +1730,10 @@ static float tri_signed_area(const float v1[3], const float v2[3], const float v
static int barycentric_weights(const float v1[3], const float v2[3], const float v3[3], const float co[3], const float n[3], float w[3])
{
- float xn, yn, zn, a1, a2, a3, asum;
- short i, j;
-
- /* find best projection of face XY, XZ or YZ: barycentric weights of
- the 2d projected coords are the same and faster to compute */
- xn= fabsf(n[0]);
- yn= fabsf(n[1]);
- zn= fabsf(n[2]);
- if(zn>=xn && zn>=yn) {i= 0; j= 1;}
- else if(yn>=xn && yn>=zn) {i= 0; j= 2;}
- else {i= 1; j= 2;}
+ float a1, a2, a3, asum;
+ int i, j;
+
+ axis_dominant_v3(&i, &j, n);
a1= tri_signed_area(v2, v3, co, i, j);
a2= tri_signed_area(v3, v1, co, i, j);
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index b2c9a5706a3..cd54c944ba9 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -142,7 +142,7 @@ void swap_m4m4(float m1[][4], float m2[][4])
/******************************** Arithmetic *********************************/
-void mul_m4_m4m4(float m1[][4], float m2_[][4], float m3_[][4])
+void mult_m4_m4m4(float m1[][4], float m3_[][4], float m2_[][4])
{
float m2[4][4], m3[4][4];
@@ -195,8 +195,14 @@ void mul_m3_m3m3(float m1[][3], float m3_[][3], float m2_[][3])
m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
}
-void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])
+void mul_m4_m4m3(float (*m1)[4], float (*m3_)[4], float (*m2_)[3])
{
+ float m2[3][3], m3[4][4];
+
+ /* copy so it works when m1 is the same pointer as m2 or m3 */
+ copy_m3_m3(m2, m2_);
+ copy_m4_m4(m3, m3_);
+
m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1];
m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2];
@@ -209,7 +215,7 @@ void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])
}
/* m1 = m2 * m3, ignore the elements on the 4th row/column of m3*/
-void mul_m3_m3m4(float m1[][3], float m2[][3], float m3[][4])
+void mult_m3_m3m4(float m1[][3], float m3[][4], float m2[][3])
{
/* m1[i][j] = m2[i][k] * m3[k][j] */
m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] +m2[0][2] * m3[2][0];
@@ -280,19 +286,19 @@ void mul_serie_m4(float answ[][4], float m1[][4],
if(m1==NULL || m2==NULL) return;
- mul_m4_m4m4(answ, m2, m1);
+ mult_m4_m4m4(answ, m1, m2);
if(m3) {
- mul_m4_m4m4(temp, m3, answ);
+ mult_m4_m4m4(temp, answ, m3);
if(m4) {
- mul_m4_m4m4(answ, m4, temp);
+ mult_m4_m4m4(answ, temp, m4);
if(m5) {
- mul_m4_m4m4(temp, m5, answ);
+ mult_m4_m4m4(temp, answ, m5);
if(m6) {
- mul_m4_m4m4(answ, m6, temp);
+ mult_m4_m4m4(answ, temp, m6);
if(m7) {
- mul_m4_m4m4(temp, m7, answ);
+ mult_m4_m4m4(temp, answ, m7);
if(m8) {
- mul_m4_m4m4(answ, m8, temp);
+ mult_m4_m4m4(answ, temp, m8);
}
else copy_m4_m4(answ, temp);
}
@@ -1121,18 +1127,18 @@ void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], const float s
{
float srot[3][3], drot[3][3];
float squat[4], dquat[4], fquat[4];
- float ssize[3], dsize[3], fsize[3];
+ float sscale[3], dscale[3], fsize[3];
float rmat[3][3], smat[3][3];
- mat3_to_rot_size(drot, dsize, dst);
- mat3_to_rot_size(srot, ssize, src);
+ mat3_to_rot_size(drot, dscale, dst);
+ mat3_to_rot_size(srot, sscale, src);
mat3_to_quat(dquat, drot);
mat3_to_quat(squat, srot);
/* do blending */
interp_qt_qtqt(fquat, dquat, squat, srcweight);
- interp_v3_v3v3(fsize, dsize, ssize, srcweight);
+ interp_v3_v3v3(fsize, dscale, sscale, srcweight);
/* compose new matrix */
quat_to_mat3(rmat,fquat);
@@ -1145,10 +1151,10 @@ void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], const float s
float sloc[3], dloc[3], floc[3];
float srot[3][3], drot[3][3];
float squat[4], dquat[4], fquat[4];
- float ssize[3], dsize[3], fsize[3];
+ float sscale[3], dscale[3], fsize[3];
- mat4_to_loc_rot_size(dloc, drot, dsize, dst);
- mat4_to_loc_rot_size(sloc, srot, ssize, src);
+ mat4_to_loc_rot_size(dloc, drot, dscale, dst);
+ mat4_to_loc_rot_size(sloc, srot, sscale, src);
mat3_to_quat(dquat, drot);
mat3_to_quat(squat, srot);
@@ -1156,7 +1162,7 @@ void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], const float s
/* do blending */
interp_v3_v3v3(floc, dloc, sloc, srcweight);
interp_qt_qtqt(fquat, dquat, squat, srcweight);
- interp_v3_v3v3(fsize, dsize, ssize, srcweight);
+ interp_v3_v3v3(fsize, dscale, sscale, srcweight);
/* compose new matrix */
loc_quat_size_to_mat4(out, floc, fquat, fsize);
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index e4664798f5d..5596b6f9f22 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -1433,7 +1433,7 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
/* split scaling and rotation, there is probably a faster way to do
this, it's done like this now to correctly get negative scaling */
- mul_m4_m4m4(baseRS, basemat, mat);
+ mult_m4_m4m4(baseRS, mat, basemat);
mat4_to_size(scale,baseRS);
copy_v3_v3(dscale, scale);
@@ -1452,10 +1452,10 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
copy_v3_v3(baseR[3], baseRS[3]);
invert_m4_m4(baseinv, basemat);
- mul_m4_m4m4(R, baseinv, baseR);
+ mult_m4_m4m4(R, baseR, baseinv);
invert_m4_m4(baseRinv, baseR);
- mul_m4_m4m4(S, baseRS, baseRinv);
+ mult_m4_m4m4(S, baseRinv, baseRS);
/* set scaling part */
mul_serie_m4(dq->scale, basemat, S, baseinv, NULL, NULL, NULL, NULL, NULL);
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index a9ea90ef555..590a48e8085 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -416,6 +416,15 @@ void range_vn_i(int *array_tar, const int size, const int start)
while(i--) { *(array_pt--) = j--; }
}
+void range_vn_fl(float *array_tar, const int size, const float start, const float step)
+{
+ float *array_pt= array_tar + (size-1);
+ int i= size;
+ while(i--) {
+ *(array_pt--) = start + step * (float)(i);
+ }
+}
+
void negate_vn(float *array_tar, const int size)
{
float *array_pt= array_tar + (size-1);
diff --git a/source/blender/imbuf/intern/md5.c b/source/blender/blenlib/intern/md5.c
index 2192fa32f19..25582a5f750 100644
--- a/source/blender/imbuf/intern/md5.c
+++ b/source/blender/blenlib/intern/md5.c
@@ -21,12 +21,82 @@
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>. */
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
#include <sys/types.h>
-# include <stdlib.h>
-# include <string.h>
+#if defined HAVE_LIMITS_H || defined _LIBC
+# include <limits.h>
+#endif
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#if defined __STDC__ && __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+ typedef unsigned int md5_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+ typedef unsigned short md5_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+ typedef unsigned long md5_uint32;
+# else
+ /* The following line is intended to evoke an error.
+ Using #error is not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ md5_uint32 A;
+ md5_uint32 B;
+ md5_uint32 C;
+ md5_uint32 D;
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+static void md5_init_ctx(struct md5_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialzation function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+static void md5_process_block(const void *buffer, size_t len, struct md5_ctx *ctx);
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+static void *md5_read_ctx(const struct md5_ctx *ctx, void *resbuf);
-#include "md5.h"
#ifdef __BIG_ENDIAN__
# define SWAP(n) \
@@ -43,9 +113,7 @@ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
/* Initialize structure containing state of computation.
(RFC 1321, 3.3: Step 3) */
-void
-md5_init_ctx (ctx)
- struct md5_ctx *ctx;
+static void md5_init_ctx(struct md5_ctx *ctx)
{
ctx->A = 0x67452301;
ctx->B = 0xefcdab89;
@@ -55,10 +123,7 @@ md5_init_ctx (ctx)
/* Put result from CTX in first 16 bytes following RESBUF. The result must
be in little endian byte order. */
-void *
-md5_read_ctx (ctx, resbuf)
- const struct md5_ctx *ctx;
- void *resbuf;
+static void *md5_read_ctx(const struct md5_ctx *ctx, void *resbuf)
{
((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
@@ -71,10 +136,7 @@ md5_read_ctx (ctx, resbuf)
/* Compute MD5 message digest for bytes read from STREAM. The
resulting message digest number will be written into the 16 bytes
beginning at RESBLOCK. */
-int
-md5_stream (stream, resblock)
- FILE *stream;
- void *resblock;
+int md5_stream(FILE *stream, void *resblock)
{
/* Important: BLOCKSIZE must be a multiple of 64. */
#define BLOCKSIZE 4096
@@ -154,11 +216,7 @@ md5_stream (stream, resblock)
result is always in little endian byte order, so that a byte-wise
output yields to the wanted ASCII representation of the message
digest. */
-void *
-md5_buffer (buffer, len, resblock)
- const char *buffer;
- size_t len;
- void *resblock;
+void *md5_buffer(const char *buffer, size_t len, void *resblock)
{
struct md5_ctx ctx;
char restbuf[64 + 72];
@@ -207,11 +265,7 @@ md5_buffer (buffer, len, resblock)
/* Process LEN bytes of BUFFER, accumulating context into CTX.
It is assumed that LEN % 64 == 0. */
-void
-md5_process_block (buffer, len, ctx)
- const void *buffer;
- size_t len;
- struct md5_ctx *ctx;
+void md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
{
md5_uint32 correct_words[16];
const md5_uint32 *words = buffer;
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index e79d850caa5..9adb39f09ef 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -317,7 +317,7 @@ void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char deli
void BLI_cleanup_path(const char *relabase, char *dir)
{
- short a;
+ ptrdiff_t a;
char *start, *eind;
if (relabase) {
BLI_path_abs(dir, relabase);
@@ -1416,7 +1416,7 @@ int BLI_replace_extension(char *path, size_t maxlen, const char *ext)
{
size_t path_len= strlen(path);
size_t ext_len= strlen(ext);
- size_t a;
+ ssize_t a;
for(a= path_len - 1; a >= 0; a--) {
if (ELEM3(path[a], '.', '/', '\\')) {
@@ -1424,7 +1424,7 @@ int BLI_replace_extension(char *path, size_t maxlen, const char *ext)
}
}
- if (path[a] != '.') {
+ if ((a < 0) || (path[a] != '.')) {
a= path_len;
}
@@ -1440,7 +1440,7 @@ int BLI_ensure_extension(char *path, size_t maxlen, const char *ext)
{
size_t path_len= strlen(path);
size_t ext_len= strlen(ext);
- size_t a;
+ ssize_t a;
/* first check the extension is alread there */
if ( (ext_len <= path_len) &&
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index b1b7ebed18e..28dc5a696d5 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -78,11 +78,13 @@ void rng_free(RNG* rng)
MEM_freeN(rng);
}
-void rng_seed(RNG *rng, unsigned int seed) {
+void rng_seed(RNG *rng, unsigned int seed)
+{
rng->X= (((r_uint64) seed)<<16) | LOWSEED;
}
-void rng_srandom(RNG *rng, unsigned int seed) {
+void rng_srandom(RNG *rng, unsigned int seed)
+{
rng_seed(rng, seed + hash[seed & 255]);
seed= rng_getInt(rng);
rng_seed(rng, seed + hash[seed & 255]);
@@ -90,16 +92,19 @@ void rng_srandom(RNG *rng, unsigned int seed) {
rng_seed(rng, seed + hash[seed & 255]);
}
-int rng_getInt(RNG *rng) {
+int rng_getInt(RNG *rng)
+{
rng->X= (MULTIPLIER*rng->X + ADDEND)&MASK;
return (int) (rng->X>>17);
}
-double rng_getDouble(RNG *rng) {
+double rng_getDouble(RNG *rng)
+{
return (double) rng_getInt(rng)/0x80000000;
}
-float rng_getFloat(RNG *rng) {
+float rng_getFloat(RNG *rng)
+{
return (float) rng_getInt(rng)/0x80000000;
}
@@ -135,28 +140,34 @@ void rng_skip(RNG *rng, int n)
static RNG theBLI_rng = {0};
/* note, this one creates periodical patterns */
-void BLI_srand(unsigned int seed) {
+void BLI_srand(unsigned int seed)
+{
rng_seed(&theBLI_rng, seed);
}
/* using hash table to create better seed */
-void BLI_srandom(unsigned int seed) {
+void BLI_srandom(unsigned int seed)
+{
rng_srandom(&theBLI_rng, seed);
}
-int BLI_rand(void) {
+int BLI_rand(void)
+{
return rng_getInt(&theBLI_rng);
}
-double BLI_drand(void) {
+double BLI_drand(void)
+{
return rng_getDouble(&theBLI_rng);
}
-float BLI_frand(void) {
+float BLI_frand(void)
+{
return rng_getFloat(&theBLI_rng);
}
-void BLI_fillrand(void *addr, int len) {
+void BLI_fillrand(void *addr, int len)
+{
RNG rng;
unsigned char *p= addr;
@@ -188,11 +199,13 @@ void BLI_thread_srandom(int thread, unsigned int seed)
rng_seed(&rng_tab[thread], seed + hash[seed & 255]);
}
-int BLI_thread_rand(int thread) {
+int BLI_thread_rand(int thread)
+{
return rng_getInt(&rng_tab[thread]);
}
-float BLI_thread_frand(int thread) {
+float BLI_thread_frand(int thread)
+{
return rng_getFloat(&rng_tab[thread]);
}
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 41b1fea32a6..369984c1719 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -96,7 +96,7 @@ ListBase fillvertbase = {NULL, NULL};
ListBase filledgebase = {NULL, NULL};
ListBase fillfacebase = {NULL, NULL};
-static short cox, coy;
+static int cox, coy;
/* **** FUBCTIONS FOR QSORT *************************** */
@@ -825,19 +825,7 @@ int BLI_edgefill(short mat_nr)
if(len==0.0f) return 0; /* no fill possible */
- norm[0]= fabs(norm[0]);
- norm[1]= fabs(norm[1]);
- norm[2]= fabs(norm[2]);
-
- if(norm[2]>=norm[0] && norm[2]>=norm[1]) {
- cox= 0; coy= 1;
- }
- else if(norm[1]>=norm[0] && norm[1]>=norm[2]) {
- cox= 0; coy= 2;
- }
- else {
- cox= 1; coy= 2;
- }
+ axis_dominant_v3(&cox, &coy, norm);
/* STEP 1: COUNT POLYS */
eve= fillvertbase.first;
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index 1ef254d355f..c5b6f46b3bc 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -54,7 +54,7 @@
#include <sys/mount.h>
#endif
-#if defined(linux) || defined(__CYGWIN32__) || defined(__hpux)
+#if defined(linux) || defined(__CYGWIN32__) || defined(__hpux) || defined(__GNU__) || defined(__GLIBC__)
#include <sys/vfs.h>
#endif
@@ -180,7 +180,7 @@ double BLI_dir_free_space(const char *dir)
if (slash) slash[1] = 0;
} else strcpy(name,"/");
-#if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__)
+#if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__) || defined(__GNU__) || defined(__GLIBC__)
if (statfs(name, &disk)) return(-1);
#endif
@@ -471,6 +471,12 @@ int BLI_is_dir(const char *file)
return S_ISDIR(BLI_exists(file));
}
+int BLI_is_file(const char *path)
+{
+ int mode= BLI_exists(path);
+ return (mode && !S_ISDIR(mode));
+}
+
LinkNode *BLI_file_read_as_lines(const char *name)
{
FILE *fp= fopen(name, "r");
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index 1b5bb607386..b2002b63a22 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -49,7 +49,8 @@
/* FILE_MAX */
-int BLI_getInstallationDir( char * str ) {
+int BLI_getInstallationDir( char * str )
+{
char dir[FILE_MAXDIR];
int a;
@@ -73,7 +74,8 @@ void RegisterBlendExtension_Fail(HKEY root)
TerminateProcess(GetCurrentProcess(),1);
}
-void RegisterBlendExtension(void) {
+void RegisterBlendExtension(void)
+{
LONG lresult;
HKEY hkey = 0;
HKEY root = 0;
@@ -167,7 +169,8 @@ void RegisterBlendExtension(void) {
TerminateProcess(GetCurrentProcess(),0);
}
-DIR *opendir (const char *path) {
+DIR *opendir (const char *path)
+{
if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) {
DIR *newd= MEM_mallocN(sizeof(DIR), "opendir");
@@ -185,7 +188,8 @@ DIR *opendir (const char *path) {
}
}
-struct dirent *readdir(DIR *dp) {
+struct dirent *readdir(DIR *dp)
+{
if (dp->direntry.d_name) {
MEM_freeN(dp->direntry.d_name);
dp->direntry.d_name= NULL;
@@ -208,7 +212,8 @@ struct dirent *readdir(DIR *dp) {
}
}
-int closedir (DIR *dp) {
+int closedir (DIR *dp)
+{
if (dp->direntry.d_name) MEM_freeN(dp->direntry.d_name);
if (dp->handle!=INVALID_HANDLE_VALUE) FindClose(dp->handle);
@@ -217,7 +222,8 @@ int closedir (DIR *dp) {
return 0;
}
-void get_default_root(char* root) {
+void get_default_root(char* root)
+{
char str[MAX_PATH+1];
/* the default drive to resolve a directory without a specified drive
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index e7f7a7e23bc..20d211a74c1 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -86,6 +86,15 @@ typedef unsigned long uintptr_t;
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
+/* XXX */
+#ifndef UINT64_MAX
+# define UINT64_MAX 18446744073709551615
+typedef uint8_t u_int8_t;
+typedef uint16_t u_int16_t;
+typedef uint32_t u_int32_t;
+typedef uint64_t u_int64_t;
+#endif
+
#elif defined (__APPLE__)
#include <inttypes.h>
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 9cf721738a7..35271f7b873 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../nodes
../render/extern/include
../../../intern/guardedalloc
+ ../imbuf
)
set(INC_SYS
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index d5d2df3ea35..0333eab7e1f 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc ../blenlib ../blenkernel'
incs += ' ../makesdna ../editors/include'
-incs += ' ../render/extern/include ../makesrna ../nodes'
+incs += ' ../render/extern/include ../makesrna ../nodes ../imbuf'
incs += ' ' + env['BF_ZLIB_INC']
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index c8abc00d1fe..46e0c7551f3 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -48,6 +48,9 @@
#include "BLI_winstuff.h"
#endif
+/* allow readfile to use deprecated functionality */
+#define DNA_DEPRECATED_ALLOW
+
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_actuator_types.h"
@@ -106,7 +109,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_deform.h"
-#include "BKE_effect.h" /* give_parteff */
+#include "BKE_effect.h"
#include "BKE_fcurve.h"
#include "BKE_global.h" // for G
#include "BKE_group.h"
@@ -136,6 +139,8 @@
#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BKE_sound.h"
+#include "IMB_imbuf.h" // for proxy / timecode versioning stuff
+
#include "NOD_socket.h"
//XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
@@ -3675,6 +3680,7 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte
}
}
+/*this isn't really a public api function, so prototyped here*/
static void direct_link_customdata(FileData *fd, CustomData *data, int count)
{
int i = 0;
@@ -3695,6 +3701,8 @@ static void direct_link_customdata(FileData *fd, CustomData *data, int count)
i++;
}
}
+
+ CustomData_update_typemap(data);
}
static void direct_link_mesh(FileData *fd, Mesh *mesh)
@@ -3715,22 +3723,43 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->adt= newdataadr(fd, mesh->adt);
direct_link_animdata(fd, mesh->adt);
- /* Partial-mesh visibility (do this before using totvert, totface, or totedge!) */
- mesh->pv= newdataadr(fd, mesh->pv);
- if(mesh->pv) {
- mesh->pv->vert_map= newdataadr(fd, mesh->pv->vert_map);
- mesh->pv->edge_map= newdataadr(fd, mesh->pv->edge_map);
- mesh->pv->old_faces= newdataadr(fd, mesh->pv->old_faces);
- mesh->pv->old_edges= newdataadr(fd, mesh->pv->old_edges);
- }
-
/* normally direct_link_dverts should be called in direct_link_customdata,
but for backwards compat in do_versions to work we do it here */
- direct_link_dverts(fd, mesh->pv ? mesh->pv->totvert : mesh->totvert, mesh->dvert);
+ direct_link_dverts(fd, mesh->totvert, mesh->dvert);
+
+ direct_link_customdata(fd, &mesh->vdata, mesh->totvert);
+ direct_link_customdata(fd, &mesh->edata, mesh->totedge);
+ direct_link_customdata(fd, &mesh->fdata, mesh->totface);
+
+
+#ifdef USE_BMESH_FORWARD_COMPAT
+ /* NEVER ENABLE THIS CODE INTO BMESH!
+ * THIS IS FOR LOADING BMESH INTO OLDER FILES ONLY */
+ mesh->mpoly= newdataadr(fd, mesh->mpoly);
+ mesh->mloop= newdataadr(fd, mesh->mloop);
+
+ direct_link_customdata(fd, &mesh->pdata, mesh->totpoly);
+ direct_link_customdata(fd, &mesh->ldata, mesh->totloop);
+
+ if (mesh->mpoly) {
+ /* be clever and load polygons as mfaces */
+
+ mesh->totface= mesh_mpoly_to_mface(&mesh->fdata, &mesh->ldata, &mesh->pdata,
+ mesh->totface, mesh->totloop, mesh->totpoly);
+
+ CustomData_free(&mesh->pdata, mesh->totpoly);
+ memset(&mesh->pdata, 0, sizeof(CustomData));
+ mesh->totpoly = 0;
+
+ CustomData_free(&mesh->ldata, mesh->totloop);
+ memset(&mesh->ldata, 0, sizeof(CustomData));
+ mesh->totloop = 0;
+
+ mesh_update_customdata_pointers(mesh);
+ }
+
+#endif
- direct_link_customdata(fd, &mesh->vdata, mesh->pv ? mesh->pv->totvert : mesh->totvert);
- direct_link_customdata(fd, &mesh->edata, mesh->pv ? mesh->pv->totedge : mesh->totedge);
- direct_link_customdata(fd, &mesh->fdata, mesh->pv ? mesh->pv->totface : mesh->totface);
mesh->bb= NULL;
mesh->mselect = NULL;
@@ -3784,7 +3813,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
TFace *tf= mesh->tface;
unsigned int i;
- for (i=0; i< (mesh->pv ? mesh->pv->totface : mesh->totface); i++, tf++) {
+ for (i=0; i< (mesh->totface); i++, tf++) {
SWITCH_INT(tf->col[0]);
SWITCH_INT(tf->col[1]);
SWITCH_INT(tf->col[2]);
@@ -5940,10 +5969,29 @@ static void lib_link_group(FileData *fd, Main *main)
/* ***************** READ MOVIECLIP *************** */
+static void direct_link_movieReconstruction(FileData *fd, MovieTrackingReconstruction *reconstruction)
+{
+ reconstruction->cameras= newdataadr(fd, reconstruction->cameras);
+}
+
+static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase)
+{
+ MovieTrackingTrack *track;
+
+ link_list(fd, tracksbase);
+
+ track= tracksbase->first;
+ while(track) {
+ track->markers= newdataadr(fd, track->markers);
+
+ track= track->next;
+ }
+}
+
static void direct_link_movieclip(FileData *fd, MovieClip *clip)
{
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track;
+ MovieTrackingObject *object;
if(fd->movieclipmap) clip->cache= newmclipadr(fd, clip->cache);
else clip->cache= NULL;
@@ -5951,16 +5999,8 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
if(fd->movieclipmap) clip->tracking.camera.intrinsics= newmclipadr(fd, clip->tracking.camera.intrinsics);
else clip->tracking.camera.intrinsics= NULL;
- tracking->reconstruction.cameras= newdataadr(fd, tracking->reconstruction.cameras);
-
- link_list(fd, &tracking->tracks);
-
- track= tracking->tracks.first;
- while(track) {
- track->markers= newdataadr(fd, track->markers);
-
- track= track->next;
- }
+ direct_link_movieTracks(fd, &tracking->tracks);
+ direct_link_movieReconstruction(fd, &tracking->reconstruction);
clip->tracking.act_track= newdataadr(fd, clip->tracking.act_track);
@@ -5971,6 +6011,16 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
clip->tracking.stabilization.ok= 0;
clip->tracking.stabilization.scaleibuf= NULL;
clip->tracking.stabilization.rot_track= newdataadr(fd, clip->tracking.stabilization.rot_track);
+
+ link_list(fd, &tracking->objects);
+
+ object= tracking->objects.first;
+ while(object) {
+ direct_link_movieTracks(fd, &object->tracks);
+ direct_link_movieReconstruction(fd, &object->reconstruction);
+
+ object= object->next;
+ }
}
static void lib_link_movieclip(FileData *fd, Main *main)
@@ -7081,6 +7131,40 @@ static void do_versions_gpencil_2_50(Main *main, bScreen *screen)
}
}
+/* deprecated, only keep this for readfile.c */
+static PartEff *do_version_give_parteff_245(Object *ob)
+{
+ PartEff *paf;
+
+ paf= ob->effect.first;
+ while(paf) {
+ if(paf->type==EFF_PARTICLE) return paf;
+ paf= paf->next;
+ }
+ return NULL;
+}
+static void do_version_free_effect_245(Effect *eff)
+{
+ PartEff *paf;
+
+ if(eff->type==EFF_PARTICLE) {
+ paf= (PartEff *)eff;
+ if(paf->keys) MEM_freeN(paf->keys);
+ }
+ MEM_freeN(eff);
+}
+static void do_version_free_effects_245(ListBase *lb)
+{
+ Effect *eff;
+
+ eff= lb->first;
+ while(eff) {
+ BLI_remlink(lb, eff);
+ do_version_free_effect_245(eff);
+ eff= lb->first;
+ }
+}
+
static void do_version_mtex_factor_2_50(MTex **mtex_array, short idtype)
{
MTex *mtex;
@@ -7410,6 +7494,30 @@ void do_versions_image_settings_2_60(Scene *sce)
}
+/* socket use flags were only temporary before */
+static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ bNodeLink *link;
+
+ for (node=ntree->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ sock->flag &= ~SOCK_IN_USE;
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ sock->flag &= ~SOCK_IN_USE;
+ }
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ sock->flag &= ~SOCK_IN_USE;
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ sock->flag &= ~SOCK_IN_USE;
+
+ for (link=ntree->links.first; link; link=link->next) {
+ link->fromsock->flag |= SOCK_IN_USE;
+ link->tosock->flag |= SOCK_IN_USE;
+ }
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -7656,7 +7764,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob = main->object.first;
PartEff *paf;
while (ob) {
- paf = give_parteff(ob);
+ paf = do_version_give_parteff_245(ob);
if (paf) {
if (paf->staticstep == 0) {
paf->staticstep= 5;
@@ -8672,11 +8780,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
View3D *v3d= (View3D *)sl;
if(v3d->twtype==0) v3d->twtype= V3D_MANIP_TRANSLATE;
}
- else if(sl->spacetype==SPACE_TIME) {
- SpaceTime *stime= (SpaceTime *)sl;
- if(stime->redraws==0)
- stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
- }
}
}
}
@@ -8702,9 +8805,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
if(ob->soft && ob->soft->vertgroup==0) {
bDeformGroup *locGroup = defgroup_find_name(ob, "SOFTGOAL");
- if(locGroup){
+ if (locGroup) {
/* retrieve index for that group */
- ob->soft->vertgroup = 1 + defgroup_find_index(ob, locGroup);
+ ob->soft->vertgroup = 1 + BLI_findindex(&ob->defbase, locGroup);
}
}
}
@@ -8865,7 +8968,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- paf = give_parteff(ob);
+ paf = do_version_give_parteff_245(ob);
if (paf) {
if(paf->disp == 0)
paf->disp = 100;
@@ -9873,7 +9976,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
/* convert old particles to new system */
- if((paf = give_parteff(ob))) {
+ if((paf = do_version_give_parteff_245(ob))) {
ParticleSystem *psys;
ModifierData *md;
ParticleSystemModifierData *psmd;
@@ -9986,7 +10089,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
part->type = PART_FLUID;
}
- free_effects(&ob->effect);
+ do_version_free_effects_245(&ob->effect);
printf("Old particle system converted to new system.\n");
}
@@ -10400,13 +10503,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
wrld->maxphystep = 5;
}
}
-
- if (main->versionfile < 249) {
- Scene *sce;
- for (sce= main->scene.first; sce; sce= sce->id.next)
- sce->r.renderer= 0;
-
- }
// correct introduce of seed for wind force
if (main->versionfile < 249 && main->subversionfile < 1) {
@@ -10649,8 +10745,11 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
void *olddata = ob->data;
ob->data = me;
- if(me && me->id.lib==NULL && me->mr && me->mr->level_count > 1) /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */
+ /* XXX - library meshes crash on loading most yoFrankie levels,
+ * the multires pointer gets invalid - Campbell */
+ if(me && me->id.lib==NULL && me->mr && me->mr->level_count > 1) {
multires_load_old(ob, me);
+ }
ob->data = olddata;
}
@@ -12548,10 +12647,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
clip->aspy= 1.0f;
}
- /* XXX: a bit hacky, probably include imbuf and use real constants are nicer */
- clip->proxy.build_tc_flag= 7;
+ clip->proxy.build_tc_flag= IMB_TC_RECORD_RUN |
+ IMB_TC_FREE_RUN |
+ IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN;
+
if(clip->proxy.build_size_flag==0)
- clip->proxy.build_size_flag= 1;
+ clip->proxy.build_size_flag= IMB_PROXY_25;
if(clip->proxy.quality==0)
clip->proxy.quality= 90;
@@ -12617,18 +12718,123 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if ( (ob->dsize[i] == 0.0f) || /* simple case, user never touched dsize */
(ob->size[i] == 0.0f)) /* cant scale the dsize to give a non zero result, so fallback to 1.0f */
{
- ob->dsize[i]= 1.0f;
+ ob->dscale[i]= 1.0f;
}
else {
- ob->size[i]= (ob->size[i] + ob->dsize[i]) / ob->size[i];
+ ob->dscale[i]= (ob->size[i] + ob->dsize[i]) / ob->size[i];
}
}
}
}
}
+ /* sigh, this dscale vs dsize version patching was not done right, fix for fix,
+ * this intentionally checks an exact subversion, also note this was never in a release,
+ * at some point this could be removed. */
+ else if (main->versionfile == 260 && main->subversionfile == 6)
+ {
+ Object *ob;
+ for (ob= main->object.first; ob; ob= ob->id.next) {
+ if (is_zero_v3(ob->dscale)) {
+ fill_vn_fl(ob->dscale, 3, 1.0f);
+ }
+ }
+ }
+
+ if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 8))
+ {
+ Brush *brush;
+
+ for (brush= main->brush.first; brush; brush= brush->id.next) {
+ if (brush->sculpt_tool == SCULPT_TOOL_ROTATE)
+ brush->alpha= 1.0f;
+ }
+ }
/* put compatibility code here until next subversion bump */
{
+ {
+ /* update use flags for node sockets (was only temporary before) */
+ Scene *sce;
+ Material *mat;
+ Tex *tex;
+ Lamp *lamp;
+ World *world;
+ bNodeTree *ntree;
+
+ for (sce=main->scene.first; sce; sce=sce->id.next)
+ if (sce->nodetree)
+ do_versions_nodetree_socket_use_flags_2_62(sce->nodetree);
+
+ for (mat=main->mat.first; mat; mat=mat->id.next)
+ if (mat->nodetree)
+ do_versions_nodetree_socket_use_flags_2_62(mat->nodetree);
+
+ for (tex=main->tex.first; tex; tex=tex->id.next)
+ if (tex->nodetree)
+ do_versions_nodetree_socket_use_flags_2_62(tex->nodetree);
+
+ for (lamp=main->lamp.first; lamp; lamp=lamp->id.next)
+ if (lamp->nodetree)
+ do_versions_nodetree_socket_use_flags_2_62(lamp->nodetree);
+
+ for (world=main->world.first; world; world=world->id.next)
+ if (world->nodetree)
+ do_versions_nodetree_socket_use_flags_2_62(world->nodetree);
+
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+ do_versions_nodetree_socket_use_flags_2_62(ntree);
+ }
+ {
+ /* Initialize BGE exit key to esc key */
+ Scene *scene;
+ for(scene= main->scene.first; scene; scene= scene->id.next) {
+ if (!scene->gm.exitkey)
+ scene->gm.exitkey = 218; // Blender key code for ESC
+ }
+ }
+ {
+ MovieClip *clip;
+ Object *ob;
+
+ for (clip= main->movieclip.first; clip; clip= clip->id.next) {
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= tracking->objects.first;
+
+ clip->proxy.build_tc_flag|= IMB_TC_RECORD_RUN_NO_GAPS;
+
+ if(!tracking->settings.object_distance)
+ tracking->settings.object_distance= 1.0f;
+
+ if(tracking->objects.first == NULL)
+ BKE_tracking_new_object(tracking, "Camera");
+
+ while(tracking_object) {
+ if(!tracking_object->scale)
+ tracking_object->scale= 1.0f;
+
+ tracking_object= tracking_object->next;
+ }
+ }
+
+ for (ob= main->object.first; ob; ob= ob->id.next) {
+ bConstraint *con;
+ for (con= ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ if(!cti)
+ continue;
+
+ if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data= (bObjectSolverConstraint *)con->data;
+
+ if(data->invmat[3][3]==0.0f)
+ unit_m4(data->invmat);
+ }
+ }
+ }
+ }
+
+ {
// composite redesign
Scene *scene;
bNode *node;
@@ -12652,6 +12858,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if ( scene->nodetree->chunksize == 0) {
scene->nodetree->chunksize = 128;
}
+ }
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
@@ -13470,7 +13677,7 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
expand_doit(fd, mainvar, ob->mat[a]);
}
- paf = give_parteff(ob);
+ paf = do_version_give_parteff_245(ob);
if (paf && paf->group)
expand_doit(fd, mainvar, paf->group);
@@ -14182,7 +14389,8 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
expand_main(fd, mainptr);
- /* dang FileData... now new libraries need to be appended to original filedata, it is not a good replacement for the old global (ton) */
+ /* dang FileData... now new libraries need to be appended to original filedata,
+ * it is not a good replacement for the old global (ton) */
while( fd->mainlist.first ) {
Main *mp= fd->mainlist.first;
BLI_remlink(&fd->mainlist, mp);
@@ -14204,8 +14412,13 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
ID *idn= id->next;
if(id->flag & LIB_READ) {
BLI_remlink(lbarray[a], id);
- BKE_reportf(basefd->reports, RPT_ERROR, "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
- if(!G.background && basefd->reports)printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n", BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+ BKE_reportf(basefd->reports, RPT_ERROR,
+ "LIB ERROR: %s:'%s' unread libblock missing from '%s'\n",
+ BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+ if (!G.background && basefd->reports) {
+ printf("LIB ERROR: %s:'%s' unread libblock missing from '%s'\n",
+ BKE_idcode_to_name(GS(id->name)), id->name+2, mainptr->curlib->filepath);
+ }
change_idid_adr(mainlist, basefd, id, NULL);
MEM_freeN(id);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index ad5eda03872..7cde4c8a1e2 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -174,6 +174,10 @@ typedef struct {
MemFile *compare, *current;
int tot, count, error, memsize;
+
+#ifdef USE_BMESH_SAVE_AS_COMPAT
+ char use_mesh_compat; /* option to save with older mesh format */
+#endif
} WriteData;
static WriteData *writedata_new(int file)
@@ -1691,27 +1695,9 @@ static void write_meshs(WriteData *wd, ListBase *idbase)
writedata(wd, DATA, sizeof(void *)*mesh->totcol, mesh->mat);
- if(mesh->pv) {
- write_customdata(wd, &mesh->id, mesh->pv->totvert, &mesh->vdata, -1, 0);
- write_customdata(wd, &mesh->id, mesh->pv->totedge, &mesh->edata,
- CD_MEDGE, mesh->totedge);
- write_customdata(wd, &mesh->id, mesh->pv->totface, &mesh->fdata,
- CD_MFACE, mesh->totface);
- }
- else {
- write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, -1, 0);
- write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, -1, 0);
- write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, -1, 0);
- }
-
- /* PMV data */
- if(mesh->pv) {
- writestruct(wd, DATA, "PartialVisibility", 1, mesh->pv);
- writedata(wd, DATA, sizeof(unsigned int)*mesh->pv->totvert, mesh->pv->vert_map);
- writedata(wd, DATA, sizeof(int)*mesh->pv->totedge, mesh->pv->edge_map);
- writestruct(wd, DATA, "MFace", mesh->pv->totface, mesh->pv->old_faces);
- writestruct(wd, DATA, "MEdge", mesh->pv->totedge, mesh->pv->old_edges);
- }
+ write_customdata(wd, &mesh->id, mesh->totvert, &mesh->vdata, -1, 0);
+ write_customdata(wd, &mesh->id, mesh->totedge, &mesh->edata, -1, 0);
+ write_customdata(wd, &mesh->id, mesh->totface, &mesh->fdata, -1, 0);
}
mesh= mesh->id.next;
}
@@ -2540,6 +2526,27 @@ static void write_scripts(WriteData *wd, ListBase *idbase)
}
}
+static void write_movieTracks(WriteData *wd, ListBase *tracks)
+{
+ MovieTrackingTrack *track;
+
+ track= tracks->first;
+ while(track) {
+ writestruct(wd, DATA, "MovieTrackingTrack", 1, track);
+
+ if(track->markers)
+ writestruct(wd, DATA, "MovieTrackingMarker", track->markersnr, track->markers);
+
+ track= track->next;
+ }
+}
+
+static void write_movieReconstruction(WriteData *wd, MovieTrackingReconstruction *reconstruction)
+{
+ if(reconstruction->camnr)
+ writestruct(wd, DATA, "MovieReconstructedCamera", reconstruction->camnr, reconstruction->cameras);
+}
+
static void write_movieclips(WriteData *wd, ListBase *idbase)
{
MovieClip *clip;
@@ -2548,20 +2555,20 @@ static void write_movieclips(WriteData *wd, ListBase *idbase)
while(clip) {
if(clip->id.us>0 || wd->current) {
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track;
+ MovieTrackingObject *object;
writestruct(wd, ID_MC, "MovieClip", 1, clip);
- if(tracking->reconstruction.camnr)
- writestruct(wd, DATA, "MovieReconstructedCamera", tracking->reconstruction.camnr, tracking->reconstruction.cameras);
+ write_movieTracks(wd, &tracking->tracks);
+ write_movieReconstruction(wd, &tracking->reconstruction);
- track= tracking->tracks.first;
- while(track) {
- writestruct(wd, DATA, "MovieTrackingTrack", 1, track);
+ object= tracking->objects.first;
+ while(object) {
+ writestruct(wd, DATA, "MovieTrackingObject", 1, object);
- if(track->markers)
- writestruct(wd, DATA, "MovieTrackingMarker", track->markersnr, track->markers);
+ write_movieTracks(wd, &object->tracks);
+ write_movieReconstruction(wd, &object->reconstruction);
- track= track->next;
+ object= object->next;
}
}
@@ -2592,7 +2599,10 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
fg.curscene= screen->scene;
fg.displaymode= G.displaymode;
fg.winpos= G.winpos;
- fg.fileflags= (fileflags & ~(G_FILE_NO_UI|G_FILE_RELATIVE_REMAP)); // prevent to save this, is not good convention, and feature with concerns...
+
+ /* prevent to save this, is not good convention, and feature with concerns... */
+ fg.fileflags= (fileflags & ~(G_FILE_NO_UI|G_FILE_RELATIVE_REMAP|G_FILE_MESH_COMPAT));
+
fg.globalf= G.f;
BLI_strncpy(fg.filename, mainvar->name, sizeof(fg.filename));
@@ -2635,7 +2645,11 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil
blo_split_main(&mainlist, mainvar);
wd= bgnwrite(handle, compare, current);
-
+
+#ifdef USE_BMESH_SAVE_AS_COMPAT
+ wd->use_mesh_compat = (write_flags & G_FILE_MESH_COMPAT) != 0;
+#endif
+
sprintf(buf, "BLENDER%c%c%.3d", (sizeof(void*)==8)?'-':'_', (ENDIAN_ORDER==B_ENDIAN)?'V':'v', BLENDER_VERSION);
mywrite(wd, buf, 12);
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp
index 7bd70e9f289..7b57ed243a1 100644
--- a/source/blender/collada/AnimationExporter.cpp
+++ b/source/blender/collada/AnimationExporter.cpp
@@ -767,7 +767,7 @@ std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Ob
// compute bone local mat
if (bone->parent) {
invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
+ mult_m4_m4m4(mat, ipar, pchan->pose_mat);
}
else
copy_m4_m4(mat, pchan->pose_mat);
@@ -1274,7 +1274,7 @@ void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, i
// compute bone local mat
if (bone->parent) {
invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
+ mult_m4_m4m4(mat, ipar, pchan->pose_mat);
}
else
copy_m4_m4(mat, pchan->pose_mat);
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
index 9b4e47615f7..c47e024aba4 100644
--- a/source/blender/collada/AnimationImporter.cpp
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -723,7 +723,7 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector<FCurve*>&
// calc M
calc_joint_parent_mat_rest(par, NULL, root, node);
- mul_m4_m4m4(temp, matfra, par);
+ mult_m4_m4m4(temp, par, matfra);
// evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
@@ -1276,7 +1276,7 @@ Object *AnimationImporter::translate_animation_OLD(COLLADAFW::Node *node,
// calc M
calc_joint_parent_mat_rest(par, NULL, root, node);
- mul_m4_m4m4(temp, matfra, par);
+ mult_m4_m4m4(temp, par, matfra);
// evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
@@ -1434,7 +1434,7 @@ void AnimationImporter::evaluate_transform_at_frame(float mat[4][4], COLLADAFW::
float temp[4][4];
copy_m4_m4(temp, mat);
- mul_m4_m4m4(mat, m, temp);
+ mult_m4_m4m4(mat, temp, m);
}
}
@@ -1597,7 +1597,7 @@ void AnimationImporter::get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *roo
calc_joint_parent_mat_rest(par, NULL, root, node);
get_node_mat(m, node, NULL, NULL);
- mul_m4_m4m4(mat, m, par);
+ mult_m4_m4m4(mat, par, m);
}
}
@@ -1616,7 +1616,7 @@ bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4], float par[4]
if (par) {
float temp[4][4];
get_node_mat(temp, node, NULL, NULL);
- mul_m4_m4m4(m, temp, par);
+ mult_m4_m4m4(m, par, temp);
}
else {
get_node_mat(m, node, NULL, NULL);
@@ -1656,7 +1656,7 @@ Object *AnimationImporter::get_joint_object(COLLADAFW::Node *root, COLLADAFW::No
float temp[4][4], ipar[4][4];
invert_m4_m4(ipar, par_job->obmat);
copy_m4_m4(temp, mat);
- mul_m4_m4m4(mat, temp, ipar);
+ mult_m4_m4m4(mat, ipar, temp);
}
TransformBase::decompose(mat, job->loc, NULL, job->quat, job->size);
@@ -1689,7 +1689,7 @@ bool AnimationImporter::evaluate_joint_world_transform_at_frame(float mat[4][4],
if (par) {
float temp[4][4];
evaluate_transform_at_frame(temp, node, node == end ? fra : 0.0f);
- mul_m4_m4m4(m, temp, par);
+ mult_m4_m4m4(m, par, temp);
}
else {
evaluate_transform_at_frame(m, node, node == end ? fra : 0.0f);
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index df786c38c71..fcfc197ce80 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -218,11 +218,11 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW:
float invpar[4][4];
invert_m4_m4(invpar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, invpar);
+ mult_m4_m4m4(mat, invpar, pchan->pose_mat);
}
else {
// get world-space from armature-space
- mul_m4_m4m4(mat, pchan->pose_mat, ob_arm->obmat);
+ mult_m4_m4m4(mat, ob_arm->obmat, pchan->pose_mat);
}
TransformWriter::add_node_transform(node, mat,NULL );
@@ -374,7 +374,7 @@ std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase
float inv_bind_mat[4][4];
// make world-space matrix, arm_mat is armature-space
- mul_m4_m4m4(world, pchan->bone->arm_mat, ob_arm->obmat);
+ mult_m4_m4m4(world, ob_arm->obmat, pchan->bone->arm_mat);
invert_m4_m4(mat, world);
converter.mat4_to_dae(inv_bind_mat, mat);
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index bababf880a6..4bc0c18551a 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -99,7 +99,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
// get world-space
if (parent){
- mul_m4_m4m4(mat, obmat, parent_mat);
+ mult_m4_m4m4(mat, parent_mat, obmat);
}
else {
@@ -185,7 +185,7 @@ void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBo
// get world-space
if (parent)
- mul_m4_m4m4(mat, obmat, parent_mat);
+ mult_m4_m4m4(mat, parent_mat, obmat);
else
copy_m4_m4(mat, obmat);
@@ -584,17 +584,17 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node
// get world-space
if (parentname){
- mul_m4_m4m4(mat, obmat, parent_mat);
+ mult_m4_m4m4(mat, parent_mat, obmat);
bPoseChannel *parchan = get_pose_channel(ob_arm->pose, parentname);
- mul_m4_m4m4(pchan->pose_mat, mat , parchan->pose_mat);
+ mult_m4_m4m4(pchan->pose_mat, parchan->pose_mat, mat );
}
else {
copy_m4_m4(mat, obmat);
float invObmat[4][4];
invert_m4_m4(invObmat, ob_arm->obmat);
- mul_m4_m4m4(pchan->pose_mat, mat, invObmat);
+ mult_m4_m4m4(pchan->pose_mat, invObmat, mat);
}
mat4_to_axis_angle(ax,&angle,mat);
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 267aa925c74..05b2b3b738d 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -335,7 +335,7 @@ Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Nod
}
}
// calc new matrix and apply
- mul_m4_m4m4(obn->obmat, mat, obn->obmat);
+ mult_m4_m4m4(obn->obmat, obn->obmat, mat);
object_apply_mat4(obn, obn->obmat, 0, 0);
}
}
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index e57d2acd41d..1e5783f8ad0 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -187,7 +187,8 @@ void MeshImporter::set_face_indices(MFace *mface, unsigned int *indices, bool qu
// not used anymore, test_index_face from blenkernel is better
#if 0
// change face indices order so that v4 is not 0
-void MeshImporter::rotate_face_indices(MFace *mface) {
+void MeshImporter::rotate_face_indices(MFace *mface)
+{
mface->v4 = mface->v1;
mface->v1 = mface->v2;
mface->v2 = mface->v3;
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
index 26049398c26..a73d5243624 100644
--- a/source/blender/collada/TransformReader.cpp
+++ b/source/blender/collada/TransformReader.cpp
@@ -63,7 +63,7 @@ void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::m
}
copy_m4_m4(copy, mat);
- mul_m4_m4m4(mat, cur, copy);
+ mult_m4_m4m4(mat, copy, cur);
if (animation_map) {
// AnimationList that drives this Transformation
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index 2b4864ec32b..379a0619040 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -40,7 +40,7 @@ void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4],
if (parent_mat) {
float invpar[4][4];
invert_m4_m4(invpar, parent_mat);
- mul_m4_m4m4(local, mat, invpar);
+ mult_m4_m4m4(local, invpar, mat);
}
else {
copy_m4_m4(local, mat);
@@ -77,7 +77,7 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob)
// calculate local mat
invert_m4_m4(imat, ob->parent->obmat);
- mul_m4_m4m4(mat, tmat, imat);
+ mult_m4_m4m4(mat, imat, tmat);
// done
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index 6a82446f035..c3aa73510d1 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -89,7 +89,7 @@ int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space)
where_is_object(sce, par);
// move child obmat into world space
- mul_m4_m4m4(mat, ob->obmat, par->obmat);
+ mult_m4_m4m4(mat, par->obmat, ob->obmat);
copy_m4_m4(ob->obmat, mat);
}
diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
index f4d4e74e05d..ea0bab44c60 100644
--- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
+++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
@@ -49,7 +49,7 @@ float ConvertDepthToRadiusOperation::determineFocalDistance() const {
copy_m4_m4(obmat, cameraObject->obmat);
normalize_m4(obmat);
invert_m4_m4(imat, obmat);
- mul_m4_m4m4(mat, camera->dof_ob->obmat, imat);
+ mult_m4_m4m4(mat, imat, camera->dof_ob->obmat);
return (float)fabs(mat[3][2]);
}
return camera->YF_dofdist;
diff --git a/source/blender/compositor/operations/COM_LensGhostOperation.cpp b/source/blender/compositor/operations/COM_LensGhostOperation.cpp
index 286efab04c8..a31bb4c32f5 100644
--- a/source/blender/compositor/operations/COM_LensGhostOperation.cpp
+++ b/source/blender/compositor/operations/COM_LensGhostOperation.cpp
@@ -456,7 +456,7 @@ void LensGhostProjectionOperation::initExecution() {
copy_m4_m4(obmat, cameraObject->obmat);
normalize_m4(obmat);
invert_m4_m4(imat, obmat);
- mul_m4_m4m4(matt, lampObject->obmat, imat);
+ mult_m4_m4m4(matt, imat, lampObject->obmat);
visualLampPosition[0] = (float)(matt[3][0]);
visualLampPosition[1] = (float)(matt[3][1]);
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index 8c699c840dc..a21c394a81e 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -496,7 +496,7 @@ void ANIM_flush_setting_anim_channels (bAnimContext *ac, ListBase *anim_data, bA
break;
/* store this level as the 'old' level now */
- prevLevel= level; // XXX: prevLevel is unused
+ // prevLevel= level; // XXX: prevLevel is unused
}
}
}
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index fe6aed77462..45b715c406a 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -2205,12 +2205,12 @@ size_t ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_m
/* only filter data if there's somewhere to put it */
if (data && anim_data) {
- Object *obact= (ac) ? ac->obact : NULL;
/* firstly filter the data */
switch (datatype) {
case ANIMCONT_ACTION: /* 'Action Editor' */
{
+ Object *obact= ac->obact;
SpaceAction *saction = (SpaceAction *)ac->sl;
bDopeSheet *ads = (saction)? &saction->ads : NULL;
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index d18a3c320f7..8c4e0065a19 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -78,7 +78,8 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* try to resolve the path */
if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
- char *structname=NULL, *propname=NULL, arrayindbuf[16];
+ const char *structname=NULL, *propname=NULL;
+ char arrayindbuf[16];
const char *arrayname=NULL;
short free_structname = 0;
@@ -122,11 +123,11 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
free_structname= 1;
}
else
- structname= (char *)RNA_struct_ui_name(ptr.type);
+ structname= RNA_struct_ui_name(ptr.type);
}
/* Property Name is straightforward */
- propname= (char *)RNA_property_ui_name(prop);
+ propname= RNA_property_ui_name(prop);
/* Array Index - only if applicable */
if (RNA_property_array_length(&ptr, prop)) {
@@ -153,13 +154,18 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* free temp name if nameprop is set */
if (free_structname)
- MEM_freeN(structname);
+ MEM_freeN((void *)structname);
/* Icon for this property's owner:
* use the struct's icon if it is set
*/
icon= RNA_struct_ui_icon(ptr.type);
+
+ /* valid path - remove the invalid tag since we now know how to use it saving
+ * users manual effort to reenable using "Revive Disabled FCurves" [#29629]
+ */
+ fcu->flag &= ~FCURVE_DISABLED;
}
else {
/* invalid path */
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 9f466ef52d3..54314980e03 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -310,10 +310,17 @@ int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
beztr.vec[1][1]= y;
beztr.vec[2][0]= x+1.0f;
beztr.vec[2][1]= y;
- beztr.ipo= U.ipo_new; /* use default interpolation mode here... */
beztr.f1= beztr.f2= beztr.f3= SELECT;
beztr.h1= beztr.h2= U.keyhandles_new; /* use default handle type here */
//BEZKEYTYPE(&beztr)= scene->keytype; /* default keyframe type */
+
+ /* use default interpolation mode, with exceptions for int/discrete values */
+ beztr.ipo= U.ipo_new;
+
+ if(fcu->flag & FCURVE_DISCRETE_VALUES)
+ beztr.ipo = BEZT_IPO_CONST;
+ else if(beztr.ipo == BEZT_IPO_BEZ && (fcu->flag & FCURVE_INT_VALUES))
+ beztr.ipo = BEZT_IPO_LIN;
/* add temp beztriple to keyframes */
a= insert_bezt_fcurve(fcu, &beztr, flag);
@@ -517,7 +524,8 @@ static float setting_get_rna_value (PointerRNA *ptr, PropertyRNA *prop, int inde
enum {
VISUALKEY_NONE = 0,
VISUALKEY_LOC,
- VISUALKEY_ROT,
+ VISUALKEY_ROT
+ /* VISUALKEY_SCA */ /* TODO - looks like support can be added now */
};
/* This helper function determines if visual-keyframing should be used when
@@ -648,7 +656,7 @@ static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
*/
static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_index)
{
- char *identifier= (char *)RNA_property_identifier(prop);
+ const char *identifier= RNA_property_identifier(prop);
/* handle for Objects or PoseChannels only
* - constraints can be on either Objects or PoseChannels, so we only check if the
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index 3b65e777200..25432260387 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -776,7 +776,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
* - only include entry if it exists
*/
if (scene->active_keyingset) {
- uiItemIntO(layout, "Active Keying Set", ICON_NONE, op_name, "type", i++);
+ uiItemEnumO(layout, op_name, "Active Keying Set", ICON_NONE, "type", i++);
uiItemS(layout);
}
else
@@ -788,7 +788,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
if (scene->keyingsets.first) {
for (ks= scene->keyingsets.first; ks; ks=ks->next, i++) {
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, ICON_NONE, op_name, "type", i);
+ uiItemEnumO(layout, op_name, ks->name, ICON_NONE, "type", i);
}
uiItemS(layout);
}
@@ -798,7 +798,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
for (ks= builtin_keyingsets.first; ks; ks=ks->next, i--) {
/* only show KeyingSet if context is suitable */
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemEnumO_value(layout, ks->name, ICON_NONE, op_name, "type", i);
+ uiItemEnumO(layout, op_name, ks->name, ICON_NONE, "type", i);
}
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index caffdc29118..becc7e9b68f 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -161,7 +161,7 @@ void ED_armature_edit_bone_remove(bArmature *arm, EditBone *exBone)
EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
{
EditBone *eboflip= NULL;
- char name[32];
+ char name[MAXBONENAME];
if (ebo == NULL)
return NULL;
@@ -936,7 +936,7 @@ int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
/* Find the difference matrix */
invert_m4_m4(oimat, ob->obmat);
- mul_m4_m4m4(mat, base->object->obmat, oimat);
+ mult_m4_m4m4(mat, oimat, base->object->obmat);
/* Copy bones and posechannels from the object to the edit armature */
for (pchan=opose->chanbase.first; pchan; pchan=pchann) {
@@ -972,7 +972,7 @@ int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
/* Find the roll */
invert_m4_m4(imat, premat);
- mul_m4_m4m4(difmat, postmat, imat);
+ mult_m4_m4m4(difmat, imat, postmat);
curbone->roll -= (float)atan2(difmat[2][0], difmat[2][2]);
}
@@ -4663,7 +4663,7 @@ static void add_verts_to_dgroups(ReportList *reports, Scene *scene, Object *ob,
/* find flipped group */
if (dgroup && mirror) {
- char name[32];
+ char name[MAXBONENAME];
// 0 = don't strip off number extensions
flip_side_name(name, dgroup->name, FALSE);
@@ -5067,7 +5067,6 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
{
int action = RNA_enum_get(op->ptr, "action");
- Object *ob = NULL;
Scene *scene= CTX_data_scene(C);
int multipaint = scene->toolsettings->multipaint;
@@ -5100,8 +5099,8 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL);
- if(multipaint) {
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ if (multipaint) {
+ Object *ob = ED_object_context(C);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
@@ -5456,7 +5455,7 @@ static int armature_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
bArmature *arm;
- char newname[32];
+ char newname[MAXBONENAME];
/* paranoia checks */
if (ELEM(NULL, ob, ob->pose))
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index 40d2d80f2b7..502da1be8ac 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -1608,7 +1608,7 @@ static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y
mdb->phi[acenter]= phi/totweight;
}
-static void meshdeform_matrix_solve(MeshDeformBind *mdb)
+static void meshdeform_matrix_solve(MeshDeformModifierData *mmd, MeshDeformBind *mdb)
{
NLContext *context;
float vec[3], gridvec[3];
@@ -1710,7 +1710,8 @@ static void meshdeform_matrix_solve(MeshDeformBind *mdb)
}
}
else {
- error("Mesh Deform: failed to find solution");
+ modifier_setError(&mmd->modifier, "Failed to find bind solution (increase precision?).");
+ error("Mesh Deform: failed to find bind solution.");
break;
}
@@ -1819,7 +1820,7 @@ static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierDa
meshdeform_check_semibound(mdb, x, y, z);
/* solve */
- meshdeform_matrix_solve(mdb);
+ meshdeform_matrix_solve(mmd, mdb);
/* assign results */
if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) {
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 064defb1aef..5cdb9c76396 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -77,6 +77,7 @@
#include "ED_keyframing.h"
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "armature_intern.h"
@@ -171,7 +172,7 @@ static Object *get_poselib_object (bContext *C)
sa = CTX_wm_area(C);
if (sa && (sa->spacetype == SPACE_BUTS))
- return CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ return ED_object_context(C);
else
return object_pose_armature_get(CTX_data_active_object(C));
}
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index 993c8420576..832ee55997b 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -73,6 +73,7 @@
#include "ED_keyframing.h"
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -207,7 +208,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -283,7 +284,7 @@ static int pose_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -989,7 +990,7 @@ static void set_pose_keys (Object *ob)
static bPoseChannel *pose_bone_do_paste (Object *ob, bPoseChannel *chan, short selOnly, short flip)
{
bPoseChannel *pchan;
- char name[32];
+ char name[MAXBONENAME];
short paste_ok;
/* get the name - if flipping, we must flip this first */
@@ -1221,7 +1222,7 @@ static int pose_group_add_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1261,7 +1262,7 @@ static int pose_group_remove_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1309,7 +1310,7 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1358,7 +1359,7 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1421,7 +1422,7 @@ static int pose_group_unassign_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1466,7 +1467,7 @@ void POSE_OT_group_unassign (wmOperatorType *ot)
static int group_move_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob = ED_object_context(C);
bPose *pose= (ob) ? ob->pose : NULL;
bPoseChannel *pchan;
bActionGroup *grp;
@@ -1564,7 +1565,7 @@ static int compare_agroup(const void *sgrp_a_ptr, const void *sgrp_b_ptr)
static int group_sort_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob = ED_object_context(C);
bPose *pose= (ob) ? ob->pose : NULL;
bPoseChannel *pchan;
tSortActionGroup *agrp_array;
@@ -1656,7 +1657,7 @@ static int pose_group_select_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1694,7 +1695,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op))
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
else
ob= object_pose_armature_get(CTX_data_active_object(C));
@@ -1740,7 +1741,7 @@ static int pose_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
/* loop through selected bones, auto-naming them */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
{
- char newname[32];
+ char newname[MAXBONENAME];
flip_side_name(newname, pchan->name, TRUE);
ED_armature_bone_rename(arm, pchan->name, newname);
}
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 59b3f483b38..3287ebfb92f 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -57,7 +57,6 @@ void FONT_OT_text_copy(struct wmOperatorType *ot);
void FONT_OT_text_cut(struct wmOperatorType *ot);
void FONT_OT_text_paste(struct wmOperatorType *ot);
void FONT_OT_file_paste(struct wmOperatorType *ot);
-void FONT_OT_buffer_paste(struct wmOperatorType *ot);
void FONT_OT_move(struct wmOperatorType *ot);
void FONT_OT_move_select(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 95f3bb55ba5..1384b86065b 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -68,7 +68,6 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(FONT_OT_text_cut);
WM_operatortype_append(FONT_OT_text_paste);
WM_operatortype_append(FONT_OT_file_paste);
- WM_operatortype_append(FONT_OT_buffer_paste);
WM_operatortype_append(FONT_OT_move);
WM_operatortype_append(FONT_OT_move_select);
@@ -137,6 +136,26 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_cyclic_toggle);
}
+void ED_operatormacros_curve(void)
+{
+ wmOperatorType *ot;
+ wmOperatorTypeMacro *otmacro;
+
+ ot= WM_operatortype_append_macro("CURVE_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
+ ot->description = "Duplicate curve and move";
+ WM_operatortype_macro_define(ot, "CURVE_OT_duplicate");
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ RNA_enum_set(otmacro->ptr, "proportional", 0);
+ RNA_boolean_set(otmacro->ptr, "mirror", 0);
+
+ ot= WM_operatortype_append_macro("CURVE_OT_extrude_move", "Extrude Curve and Move", OPTYPE_UNDO|OPTYPE_REGISTER);
+ ot->description = "Extrude curve and move result";
+ WM_operatortype_macro_define(ot, "CURVE_OT_extrude");
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ RNA_enum_set(otmacro->ptr, "proportional", 0);
+ RNA_boolean_set(otmacro->ptr, "mirror", 0);
+}
+
void ED_keymap_curve(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
@@ -214,8 +233,8 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_extrude", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_extrude_move", EKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_make_segment", FKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_delete", XKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 1415b8965fe..762564c1cc9 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -4716,18 +4716,6 @@ static int extrude_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
-static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
-{
- if(extrude_exec(C, op) == OPERATOR_FINISHED) {
- RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
-
- return OPERATOR_FINISHED;
- }
-
- return OPERATOR_CANCELLED;
-}
-
void CURVE_OT_extrude(wmOperatorType *ot)
{
/* identifiers */
@@ -4737,7 +4725,6 @@ void CURVE_OT_extrude(wmOperatorType *ot)
/* api callbacks */
ot->exec= extrude_exec;
- ot->invoke= extrude_invoke;
ot->poll= ED_operator_editsurfcurve;
/* flags */
@@ -5599,16 +5586,6 @@ static int duplicate_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
-static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
-{
- duplicate_exec(C, op);
-
- RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
-
- return OPERATOR_FINISHED;
-}
-
void CURVE_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
@@ -5618,14 +5595,10 @@ void CURVE_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= duplicate_exec;
- ot->invoke= duplicate_invoke;
ot->poll= ED_operator_editsurfcurve;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* to give to transform */
- RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/********************** delete operator *********************/
@@ -6083,7 +6056,7 @@ int join_curve_exec(bContext *C, wmOperator *UNUSED(op))
if(cu->nurb.first) {
/* watch it: switch order here really goes wrong */
- mul_m4_m4m4(cmat, base->object->obmat, imat);
+ mult_m4_m4m4(cmat, imat, base->object->obmat);
nu= cu->nurb.first;
while(nu) {
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index b1c266482ae..40812808d06 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -425,51 +425,6 @@ void FONT_OT_file_paste(wmOperatorType *ot)
WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH);
}
-/******************* paste buffer operator ********************/
-
-static int paste_buffer_exec(bContext *C, wmOperator *UNUSED(op))
-{
- const char *filename;
-
-#ifdef WIN32
- filename= "C:\\windows\\temp\\cutbuf.txt";
-
-// The following is more likely to work on all Win32 installations.
-// suggested by Douglas Toltzman. Needs windows include files...
-/*
- char tempFileName[MAX_PATH];
- DWORD pathlen;
- static const char cutbufname[]="cutbuf.txt";
-
- if((pathlen=GetTempPath(sizeof(tempFileName),tempFileName)) > 0 &&
- pathlen + sizeof(cutbufname) <= sizeof(tempFileName))
- {
- strcat(tempFileName,cutbufname);
- filename= tempFilename;
- }
-*/
-#else
- filename= "/tmp/.cutbuffer";
-#endif
-
- return paste_file(C, NULL, filename);
-}
-
-void FONT_OT_buffer_paste(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Paste Buffer";
- ot->description= "Paste text from OS buffer";
- ot->idname= "FONT_OT_buffer_paste";
-
- /* api callbacks */
- ot->exec= paste_buffer_exec;
- ot->poll= ED_operator_editfont;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
/******************* text to object operator ********************/
static void txt_add_object(bContext *C, TextLine *firstline, int totline, float offset[3])
diff --git a/source/blender/editors/datafiles/blender_icons.png.c b/source/blender/editors/datafiles/blender_icons.png.c
index 0ff16998665..0713cd9253e 100644
--- a/source/blender/editors/datafiles/blender_icons.png.c
+++ b/source/blender/editors/datafiles/blender_icons.png.c
@@ -1,6289 +1,6826 @@
/* DataToC output of file <blender_icons_png> */
-int datatoc_blender_icons_png_size= 201043;
+int datatoc_blender_icons_png_size= 218213;
char datatoc_blender_icons_png[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2,
- 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,142,124,251, 81,147, 0, 0,
- 0, 32, 99, 72, 82, 77, 0, 0,135, 15, 0, 0,140, 15, 0, 0,253, 82, 0, 0,129, 64, 0, 0,125,121, 0, 0,233,139, 0, 0,
- 60,229, 0, 0, 25,204,115, 60,133,119, 0, 0, 10, 57,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,
-112,114,111,102,105,108,101, 0, 0, 72,199,157,150,119, 84, 84,215, 22,135,207,189,119,122,161,205, 48, 2, 82,134,222,187,192,
- 0,210,123,147, 94, 69, 97,152, 25, 96, 40, 3, 14, 51, 52,177, 33,162, 2, 17, 69, 68,154, 34, 72, 80,196,128,209, 80, 36, 86,
- 68,177, 16, 20, 84,176, 7, 36, 8, 40, 49, 24, 69, 84, 44,111, 70,214,139,174,172,188,247,242,242,251,227,172,111,237,179,247,
-185,251,236,189,207, 90, 23, 0,146,167, 47,151,151, 6, 75, 1,144,202, 19,240,131, 60,156,233, 17,145, 81,116,236, 0,128, 1,
- 30, 96,128, 41, 0, 76, 86, 70,186, 95,176,123, 8, 16,201,203,205,133,158, 33,114, 2, 95, 4, 1,240,122, 88,188, 2,112,211,
-208, 51,128, 78, 7,255,159,164, 89,233,124,129,232,152, 0, 17,155,179, 57, 25, 44, 17, 23,136, 56, 37, 75,144, 46,182,207,138,
-152, 26,151, 44,102, 24, 37,102,190, 40, 65, 17,203,137, 57, 97,145, 13, 62,251, 44,178,163,152,217,169, 60,182,136,197, 57,167,
-179, 83,217, 98,238, 21,241,182, 76, 33, 71,196,136,175,136, 11, 51,185,156, 44, 17,223, 18,177, 70,138, 48,149, 43,226, 55,226,
-216, 84, 14, 51, 3, 0, 20, 73,108, 23,112, 88,137, 34, 54, 17, 49,137, 31, 18,228, 34,226,229, 0,224, 72, 9, 95,113,220, 87,
- 44,224,100, 11,196,151,114, 73, 75,207,225,115, 19, 18, 5,116, 29,150, 46,221,212,218,154, 65,247,228,100,165,112, 4, 2,195,
- 0, 38, 43,153,201,103,211, 93,210, 82,211,153,188, 28, 0, 22,239,252, 89, 50,226,218,210, 69, 69,182, 52,181,182,180, 52, 52,
- 51, 50,253,170, 80,255,117,243,111, 74,220,219, 69,122, 25,248,185,103, 16,173,255,139,237,175,252,210, 26, 0, 96,204,137,106,
-179,243,139, 45,174, 10,128,206, 45, 0,200,221,251, 98,211, 56, 0,128,164,168,111, 29,215,191,186, 15, 77, 60, 47,137, 2, 65,
-186,141,177,113, 86, 86,150, 17,151,195, 50, 18, 23,244, 15,253, 79,135,191,161,175,190,103, 36, 62,238,143,242,208, 93, 57,241,
- 76, 97,138,128, 46,174, 27, 43, 45, 37, 77,200,167,103,164, 51, 89, 28,186,225,159,135,248, 31, 7,254,117, 30, 6, 65,156,120,
- 14,159,195, 19, 69,132,137,166,140,203, 75, 16,181,155,199,230, 10,184,105, 60, 58,151,247,159,154,248, 15,195,254,164,197,185,
- 22,137,210,248, 17, 80, 99,140,128,212,117, 42, 64,126,237, 7, 40, 10, 17, 32,209,251,197, 93,255,163,111,190,248, 48, 32,126,
-121,225, 42,147,139,115,255,239, 55,253,103,193,165,226, 37,131,155,240, 57,206, 37, 40,132,206, 18,242, 51, 23,247,196,207, 18,
-160, 1, 1, 72, 2, 42,144, 7,202, 64, 29,232, 0, 67, 96, 6,172,128, 45,112, 4,110,192, 27,248,131, 16, 16, 9, 86, 3, 22,
- 72, 4,169,128, 15,178, 64, 30,216, 4, 10, 65, 49,216, 9,246,128,106, 80, 7, 26, 65, 51,104, 5,199, 65, 39, 56, 5,206,131,
- 75,224, 26,184, 1,110,131,251, 96, 20, 76,128,103, 96, 22,188, 6, 11, 16, 4, 97, 33, 50, 68,129,228, 33, 21, 72, 19,210,135,
-204, 32, 6,100, 15,185, 65,190, 80, 16, 20, 9,197, 66, 9, 16, 15, 18, 66,121,208,102,168, 24, 42,131,170,161,122,168, 25,250,
- 30, 58, 9,157,135,174, 64,131,208, 93,104, 12,154,134,126,135,222,193, 8, 76,130,169,176, 18,172, 5, 27,195, 12,216, 9,246,
-129, 67,224, 85,112, 2,188, 6,206,133, 11,224, 29,112, 37,220, 0, 31,133, 59,224,243,240, 53,248, 54, 60, 10, 63,131,231, 16,
-128, 16, 17, 26,162,138, 24, 34, 12,196, 5,241, 71,162,144,120,132,143,172, 71,138,144, 10,164, 1,105, 69,186,145, 62,228, 38,
- 50,138,204, 32,111, 81, 24, 20, 5, 69, 71, 25,162,108, 81,158,168, 80, 20, 11,181, 6,181, 30, 85,130,170, 70, 29, 70,117,160,
-122, 81, 55, 81, 99,168, 89,212, 71, 52, 25,173,136,214, 71,219,160,189,208, 17,232, 4,116, 22,186, 16, 93,129,110, 66,183,163,
- 47,162,111,163, 39,208,175, 49, 24, 12, 13,163,141,177,194,120, 98, 34, 49, 73,152,181,152, 18,204, 62, 76, 27,230, 28,102, 16,
- 51,142,153,195, 98,177,242, 88,125,172, 29,214, 31,203,196, 10,176,133,216, 42,236, 81,236, 89,236, 16,118, 2,251, 6, 71,196,
-169,224,204,112,238,184, 40, 28, 15,151,143,171,192, 29,193,157,193, 13,225, 38,113, 11,120, 41,188, 38,222, 6,239,143,103,227,
-115,240,165,248, 70,124, 55,254, 58,126, 2,191, 64,144, 38,104, 19,236, 8, 33,132, 36,194, 38, 66, 37,161,149,112,145,240,128,
-240,146, 72, 36,170, 17,173,137,129, 68, 46,113, 35,177,146,120,140,120,153, 56, 70,124, 75,146, 33,233,145, 92, 72,209, 36, 33,
-105, 7,233, 16,233, 28,233, 46,233, 37,153, 76,214, 34, 59,146,163,200, 2,242, 14,114, 51,249, 2,249, 17,249,141, 4, 69,194,
- 72,194, 75,130, 45,177, 65,162, 70,162, 67, 98, 72,226,185, 36, 94, 82, 83,210, 73,114,181,100,174,100,133,228, 9,201,235,146,
- 51, 82,120, 41, 45, 41, 23, 41,166,212,122,169, 26,169,147, 82, 35, 82,115,210, 20,105, 83,105,127,233, 84,233, 18,233, 35,210,
- 87,164,167,100,176, 50, 90, 50,110, 50,108,153, 2,153,131, 50, 23,100,198, 41, 8, 69,157,226, 66, 97, 81, 54, 83, 26, 41, 23,
- 41, 19, 84, 12, 85,155,234, 69, 77,162, 22, 83,191,163, 14, 80,103,101,101,100,151,201,134,201,102,203,214,200,158,150, 29,165,
- 33, 52, 45,154, 23, 45,133, 86, 74, 59, 78, 27,166,189, 91,162,180,196,105, 9,103,201,246, 37,173, 75,134,150,204,203, 45,149,
-115,148,227,200, 21,201,181,201,221,150,123, 39, 79,151,119,147, 79,150,223, 37,223, 41,255, 80, 1,165,160,167, 16,168,144,165,
-176, 95,225,162,194,204, 82,234, 82,219,165,172,165, 69, 75,143, 47,189,167, 8, 43,234, 41, 6, 41,174, 85, 60,168,216,175, 56,
-167,164,172,228,161,148,174, 84,165,116, 65,105, 70,153,166,236,168,156,164, 92,174,124, 70,121, 90,133,162, 98,175,194, 85, 41,
- 87, 57,171,242,148, 46, 75,119,162,167,208, 43,233,189,244, 89, 85, 69, 85, 79, 85,161,106,189,234,128,234,130,154,182, 90,168,
- 90,190, 90,155,218, 67,117,130, 58, 67, 61, 94,189, 92,189, 71,125, 86, 67, 69,195, 79, 35, 79,163, 69,227,158, 38, 94,147,161,
-153,168,185, 87,179, 79,115, 94, 75, 91, 43, 92,107,171, 86,167,214,148,182,156,182,151,118,174,118,139,246, 3, 29,178,142,131,
-206, 26,157, 6,157, 91,186, 24, 93,134,110,178,238, 62,221, 27,122,176,158,133, 94,162, 94,141,222,117,125, 88,223, 82,159,171,
-191, 79,127,208, 0,109, 96,109,192, 51,104, 48, 24, 49, 36, 25, 58, 25,102, 26,182, 24,142, 25,209,140,124,141,242,141, 58,141,
-158, 27,107, 24, 71, 25,239, 50,238, 51,254,104, 98, 97,146, 98,210,104,114,223, 84,198,212,219, 52,223,180,219,244,119, 51, 61,
- 51,150, 89,141,217, 45,115,178,185,187,249, 6,243, 46,243, 23,203,244,151,113,150,237, 95,118,199,130, 98,225,103,177,213,162,
-199,226,131,165,149, 37,223,178,213,114,218, 74,195, 42,214,170,214,106,132, 65,101, 4, 48, 74, 24,151,173,209,214,206,214, 27,
-172, 79, 89,191,181,177,180, 17,216, 28,183,249,205,214,208, 54,217,246,136,237,212,114,237,229,156,229,141,203,199,237,212,236,
-152,118,245,118,163,246,116,251, 88,251, 3,246,163, 14,170, 14, 76,135, 6,135,199,142,234,142,108,199, 38,199, 73, 39, 93,167,
- 36,167,163, 78,207,157, 77,156,249,206,237,206,243, 46, 54, 46,235, 92,206,185, 34,174, 30,174, 69,174, 3,110, 50,110,161,110,
-213,110,143,220,213,220, 19,220, 91,220,103, 61, 44, 60,214,122,156,243, 68,123,250,120,238,242, 28,241, 82,242, 98,121, 53,123,
-205,122, 91,121,175,243,238,245, 33,249, 4,251, 84,251, 60,246,213,243,229,251,118,251,193,126,222,126,187,253, 30,172,208, 92,
-193, 91,209,233, 15,252,189,252,119,251, 63, 12,208, 14, 88, 19,240, 99, 32, 38, 48, 32,176, 38,240, 73,144,105, 80, 94, 80, 95,
- 48, 37, 56, 38,248, 72,240,235, 16,231,144,210,144,251,161, 58,161,194,208,158, 48,201,176,232,176,230,176,249,112,215,240,178,
-240,209, 8,227,136,117, 17,215, 34, 21, 34,185,145, 93, 81,216,168,176,168,166,168,185,149,110, 43,247,172,156,136,182,136, 46,
-140, 30, 94,165,189, 42,123,213,149,213, 10,171, 83, 86,159,142,145,140, 97,198,156,136, 69,199,134,199, 30,137,125,207,244,103,
- 54, 48,231,226,188,226,106,227,102, 89, 46,172,189,172,103,108, 71,118, 57,123,154, 99,199, 41,227, 76,198,219,197,151,197, 79,
- 37,216, 37,236, 78,152, 78,116, 72,172, 72,156,225,186,112,171,185, 47,146, 60,147,234,146,230,147,253,147, 15, 37,127, 74, 9,
- 79,105, 75,197,165,198,166,158,228,201,240,146,121,189,105,202,105,217,105,131,233,250,233,133,233,163,107,108,214,236, 89, 51,
-203,247,225, 55,101, 64, 25,171, 50,186, 4, 84,209,207, 84,191, 80, 71,184, 69, 56,150,105,159, 89,147,249, 38, 43, 44,235, 68,
-182,116, 54, 47,187, 63, 71, 47,103,123,206,100,174,123,238,183,107, 81,107, 89,107,123,242, 84,243, 54,229,141,173,115, 90, 87,
-191, 30, 90, 31,183,190,103,131,250,134,130, 13, 19, 27, 61, 54, 30,222, 68,216,148,188,233,167,124,147,252,178,252, 87,155,195,
- 55,119, 23, 40, 21,108, 44, 24,223,226,177,165,165, 80,162,144, 95, 56,178,213,118,107,221, 54,212, 54,238,182,129,237,230,219,
-171,182,127, 44, 98, 23, 93, 45, 54, 41,174, 40,126, 95,194, 42,185,250,141,233, 55,149,223,124,218, 17,191, 99,160,212,178,116,
-255, 78,204, 78,222,206,225, 93, 14,187, 14,151, 73,151,229,150,141,239,246,219,221, 81, 78, 47, 47, 42,127,181, 39,102,207,149,
-138,101, 21,117,123, 9,123,133,123, 71, 43,125, 43,187,170, 52,170,118, 86,189,175, 78,172,190, 93,227, 92,211, 86,171, 88,187,
-189,118,126, 31,123,223,208,126,199,253,173,117, 74,117,197,117,239, 14,112, 15,220,169,247,168,239,104,208,106,168, 56,136, 57,
-152,121,240, 73, 99, 88, 99,223,183,140,111,155,155, 20,154,138,155, 62, 28,226, 29, 26, 61, 28,116,184,183,217,170,185,249,136,
-226,145,210, 22,184, 69,216, 50,125, 52,250,232,141,239, 92,191,235,106, 53,108,173,111,163,181, 21, 31, 3,199,132,199,158,126,
- 31,251,253,240,113,159,227, 61, 39, 24, 39, 90,127,208,252,161,182,157,210, 94,212, 1,117,228,116,204,118, 38,118,142,118, 69,
-118, 13,158,244, 62,217,211,109,219,221,254,163,209,143,135, 78,169,158,170, 57, 45,123,186,244, 12,225, 76,193,153, 79,103,115,
-207,206,157, 75, 63, 55,115, 62,225,252,120, 79, 76,207,253, 11, 17, 23,110,245, 6,246, 14, 92,244,185,120,249,146,251,165, 11,
-125, 78,125,103, 47,219, 93, 62,117,197,230,202,201,171,140,171,157,215, 44,175,117,244, 91,244,183,255,100,241, 83,251,128,229,
- 64,199,117,171,235, 93, 55,172,111,116, 15, 46, 31, 60, 51,228, 48,116,254,166,235,205, 75,183,188,110, 93,187,189,226,246,224,
-112,232,240,157,145,232,145,209, 59,236, 59, 83,119, 83,238,190,184,151,121,111,225,254,198, 7,232, 7, 69, 15,165, 30, 86, 60,
- 82,124,212,240,179,238,207,109,163,150,163,167,199, 92,199,250, 31, 7, 63,190, 63,206, 26,127,246, 75,198, 47,239, 39, 10,158,
-144,159, 84, 76,170, 76, 54, 79,153, 77,157,154,118,159,190,241,116,229,211,137,103,233,207, 22,102, 10,127,149,254,181,246,185,
-206,243, 31,126,115,252,173,127, 54, 98,118,226, 5,255,197,167,223, 75, 94,202,191, 60,244,106,217,171,158,185,128,185, 71,175,
- 83, 95, 47,204, 23,189,145,127,115,248, 45,227,109,223,187,240,119,147, 11, 89,239,177,239, 43, 63,232,126,232,254,232,243,241,
-193,167,212, 79,159,254, 5, 3,152,243,252,186,196,232,211, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,213, 0, 0, 13,213, 1,
- 61,214, 88,241, 0, 0, 0, 7,116, 73, 77, 69, 7,219, 2, 27, 16, 38, 47, 61,220,216,191, 0, 0, 0, 26,116, 69, 88,116, 83,
-111,102,116,119, 97,114,101, 0, 80, 97,105,110,116, 46, 78, 69, 84, 32,118, 51, 46, 53, 46, 49, 48, 48,244,114,161, 0, 0,245,
- 8, 73, 68, 65, 84,120, 94,236, 93, 7,152,213, 68, 23, 93, 64,164, 75, 7, 1,233,189,247,142, 52,233, 69, 81,233, 69, 16,169,
-138, 32, 85, 64,113,233, 8,210, 59, 72, 21, 88, 64,164,174,128,130, 72,239, 75,149,222, 59, 75,175, 75,103,231, 63, 39,188,121,
-127, 54,155,188, 36,187,111,129,133,228,251,230,203,123,201,204,205,204,157,118,230,222, 59,119,124,124,156,203,225,128,195, 1,
-135, 3, 14, 7, 28, 14, 56, 28,112, 56,224,112,192,225,128,195, 1,135, 3, 14, 7, 28, 14, 56, 28,112, 56,224,112,192,225,192,
- 27,205, 1,127,127,127, 97,163,128, 21,173,196, 37, 77, 87, 40,107, 33,254, 43,165,105, 33,127, 50,138,221,124, 90,225,171, 85,
-154,101, 93,252,236,109, 33,191, 86,105,202, 58,138,136,124,122,179,222,101,217,189, 66, 83,182,119,220,173,210, 53,229,167,186,
- 15, 89,236, 79,150,105,218,232, 75,175,156,166,133,182,201, 40, 97,201,167, 89, 27,181, 67,211,106, 95,178, 67,211,106, 95,178,
- 67,211,235,237,211, 91,109, 94,219, 38, 45,210,245, 88,118,189,118,110,161, 47,217,162,105,177, 47,189, 22, 52, 45,244,165,176,
-230,211, 83, 95,178,212, 62,213,115,187,170,238,173,204, 77, 22,138,245, 6, 70,145, 13,207, 70,209, 76, 43, 66, 77,203, 66, 71,
-177, 52,240, 70, 20, 77,213,164,107, 54,144, 91,206,167,197, 50,219, 6,111,145,161,142, 80,246,117,204,167,188,155,228,217, 82,
- 91,242,102, 29,169,219,187, 13,186,150, 6, 52, 87,185,149, 9,215, 66, 93, 89,166, 41,105, 89,160,251, 74,105, 70, 20, 63, 45,
-240,210,180,111,234,213,187, 5,186,175,154,159, 86,251,146,229,124,122,171,142,180,109,210, 34, 93,219,253, 61,188,109,222,168,
-239,152,208,181,149, 79,139,253,211, 22,205,136,226,103,120,219,188,222, 60,108,161,142, 44,124,246, 45,136, 98,147, 81,150, 26,
-140,106,210, 41,107,129,133,182,104, 90,160,103, 58,240,170, 59,135, 13,176,105, 41,159, 22, 87, 77,182,129,150,122, 21,225, 13,
- 0, 19, 17,117,100,113,101,107,183,236,114,101, 31,110, 0, 35,203,172,119,247,192, 83,211,122, 87,247, 33,139,253,201, 54, 77,
-242, 54,188,245, 30,145,249, 84,181,123,179,122,178, 92,118, 27,125,233,149,210,180,209,151,236,228, 51, 34, 37, 90, 94,169, 35,
-217, 38, 93,245,212, 59,188, 0, 70, 59,198, 89,232, 75,150,248,169,238, 59, 22,198,209, 48,209,244, 70,223,212,240,211,108,209,
-102, 43,159, 22,251,146, 41, 77,109, 91,183, 72,215,226,180,253, 6, 71,179,208,152,213,165,183, 92, 17, 54, 88,102,137,166,197,
-149,131,173, 73, 60,178,208,180,184,194,177, 93,118, 27,117,111,169,142, 34, 42,159,106, 96,228,141, 1, 45, 50, 1, 45,111,214,
-145,150,150, 5,218,166,245, 30,217,104,218,104,163,182,202,110,129,151,150, 22,128,218,252, 89,160,107, 43,159, 22,251,146,169,
-148, 76,221, 15, 45,242,212, 22,205,136,204,103,120,198, 16,163,250, 8, 15,200,140, 44, 52,245,234,196, 98,221,219,128, 3,111,
-104, 84, 11, 29, 57, 76, 64, 75, 34, 93, 11,108, 51, 29, 40, 84, 40,154, 40,223,108,101,111,105, 64,211, 27, 40,194,211, 1,213,
-160,205,194,170,201, 22, 40, 98,153,189, 77,211,226, 64,246,202,243,137,114, 43, 43,101,111,213,187,106, 96,176,202, 83,211,246,
-169,238, 67, 22,251,147,101,154,170, 21,163, 87,164, 16, 54,251,146,229,124,218, 88,180, 88,166,105, 99,181,108,135,102,100,169,
-119,175,231,211, 70, 95, 50, 5, 69,234,241,221,226,248,100,139,166,197,241,201, 22, 77,139,125, 41,172, 52, 61,205, 75,182,104,
- 90,236, 75,182,104, 90,236, 75,150,250, 81, 24,234,222, 2, 12,112,162,216, 6, 90, 54, 89,102, 90,185, 54,233,217, 6, 90, 22,
-233, 59,249,180,200, 40,139,209, 28,126, 90,100,148,197,104, 14, 63, 45, 50,202, 98, 52,135,159, 22, 25,101, 49,154,195, 79,139,
-140,178, 24, 45,178,240,211, 98,113,156,104, 14,208,122,193,129,200,210,176,157,124,122,183,207, 58,252,116,248,233, 45, 14, 56,
-109,201, 91,156,116,198,228,200,210,150,188, 91,227, 14, 53,135, 3, 14, 7, 28, 14, 56, 28,112, 56,224,112,192,225,128,195,129,
-183,148, 3,169, 82,165,242,207,146, 37,203, 17,163,144, 50,101,202,127,223, 82,214,188, 54,197,118,234,232,181,169, 10, 39, 35,
-230, 28,136,138, 40,239,184, 2,127, 71, 49, 79,226,196,112, 56,224,112,192,225,192, 27,204,129,140, 25, 51, 30,122,246,236,153,
-120,242,228,137,120,248,240,161,184,119,239,158,184,125,251,182,184,126,253,186,184,120,241,162,200,148, 41,211, 9,187,197,127,
-255,253,247,215, 3, 28,156,179, 19,144,102,163,201,119, 54,227,125, 96,148, 40, 81,220, 33,106,212,168,129, 12,209,162, 69, 83,
-194, 59,239,188,163,132,232,209,163,203,176,203,140,166, 30, 61, 61,154, 42,186, 30,105, 38, 72,144, 96,103,146, 36, 73, 2,147,
- 38, 77,234, 14,201,146, 37, 11,148, 33,121,242,228,129, 50,160,204,129, 12,120,199,178, 25, 94, 17, 81, 71,118,235,244, 77,138,
-207,246,249,193, 7, 31,156,179, 19, 82,164, 72,225,177,125, 98, 65,178, 27,244,174,216, 8,215,145,102,147, 9, 16, 81,218,188,
-167,160,109,191,232, 7, 59,205,218,188, 17, 61, 73, 75,246, 43, 85, 63, 48,163, 41, 63, 25, 21,253,100, 8,250,253, 61,244,131,
-171, 8, 87, 18, 39, 78, 28,200,160,238, 19, 9, 19, 38,220,255, 38,181, 39,167, 44, 14, 7, 28, 14, 56, 28,240,200,129,244,233,
-211, 31,185,127,255,190,216,181,107,151, 8, 8, 8, 8, 21, 0,180,142,218,101, 33,193,195,229,195, 7, 69,208,205, 27,226, 78,
-224,101,241,252,249,115, 65, 48,199,112, 97,223, 30,113, 38, 96,187, 56,177,121,131,120,250,244,169, 18, 30, 63,126, 76, 64,119,
-209,228, 59,231, 6, 15, 30, 44, 38, 76,152, 32,134, 15, 31, 46, 6, 12, 24, 32,122,245,234, 37,186,116,233, 34,190,253,246, 91,
-209,170, 85, 43,209,172, 89, 51,209,176, 97, 67, 81,183,110, 93,241,241,199, 31,139, 88,177, 98,153,210, 28, 56,112,160, 24, 55,
-110,156, 24, 58,116,168,232,223,191,191,248,241,199, 31, 67,208,108,218,180,169,104,208,160,129,168, 93,187,182,168, 94,189,186,
-136, 25, 51,166, 71,154,156, 80, 88, 30, 94,193,193,193, 74,153, 89, 70, 2, 89, 62,127,244,232, 81,168,192, 9,223, 83,217, 35,
-162,142,236,214,233,155, 20,159,237,115,230,134,189, 98,105,192, 17,177,112,199, 33,165,110,100, 56, 60,126,182, 56, 52,122,166,
- 56, 48,124,106,136,231,102,237, 19, 64,236,166, 29,154,151, 46, 93, 10,138, 31, 63,254,124,240,149, 82, 31,163,235,220,131, 7,
- 15, 4, 67, 80, 80,144, 59,200,103,108, 75,204, 55,219, 24,219,218,138, 21, 43, 4, 23, 28,102,253,168, 99,199,142,162, 93,187,
-118,162,101,203,150,162, 73,147, 38,162,126,253,250, 74,251,174, 85,171,150,168, 81,163,134,168, 90,181,170,168, 84,169,146,248,
-232,163,143, 68,169, 82,165, 4, 23, 25, 22,234,159,229,248,165, 90,181,106, 55,152,151,133, 11, 23,138,221,187,119,139, 3, 7,
- 14,136,195,135, 15,139, 99,199,142,137, 19, 39, 78,136, 51,103,206, 8,240,255,138, 5,122, 78, 20,135, 3, 14, 7, 28, 14,188,
- 25, 28,192, 4,177, 2,106,195,195, 12,105,210,164,185,135,251, 99,117,200,156, 57,243,125, 61,181,162, 39,149, 34, 39, 50,130,
-172,246,113,125,148, 64,233, 24,195,141, 27,255,127,198,231,148,156, 49,112,178,192,119, 46,153, 77, 16, 4, 68, 39, 79,158, 20,
- 23, 46, 92, 16,200,183, 64,126, 5,164, 61, 34, 91,182,108, 34,119,238,220,162, 64,129, 2,162,104,209,162,226,195, 15, 63, 20,
-229,203,151, 55, 5, 90, 88,193,159, 27, 51,102,140,128, 68, 73, 9, 40,147,200,146, 49,131, 24,243, 69, 61, 49,229,139,186,162,
- 72,254,124, 34,111,222,188,162, 96,193,130, 10,221,146, 37, 75,154, 2, 45, 74,178, 8,178,246,237,219, 39, 14, 30, 60, 40,142,
- 28, 57,162, 76, 48,167, 79,159, 22,231,206,157, 19,152, 96, 21,176, 72,126,200,178, 3,104,157,247, 84,118,117, 29,165, 77,155,
-246, 14,234,227, 26,194, 69, 87,184, 6,222,221,181, 91, 71,111, 70,235, 13, 91, 41,216, 62, 9,178, 18,124, 53, 80, 9,119,239,
-222, 85, 2,165,185,211,125, 50,184, 3, 23, 32, 4, 56,108,159,228,181, 73, 29,221,180, 74,243,236,217,179, 65, 37, 74,148,248,
- 43,117,234,212, 95,154, 1, 45,126,159, 64,229,248,241,227, 10, 72,161,148,249,234,213,171,226,214,173, 91,130,249, 35,120, 39,
-176,225, 66,161,117,235,214,150,128, 86,155, 54,109, 24,143,110, 33, 8,162,216, 79,196,123,239,189, 39, 18, 37, 74, 36, 32,109,
- 21,144, 72,137,116,233,210,177, 79,138,236,217,179, 91, 1, 90, 4, 89, 3, 43, 87,174, 28,200,188,240, 42, 87,174,156,192,127,
- 49,122,244,104,225,231,231, 39,184, 96, 33,176, 99, 57, 28,160, 21,182,118,235,164,114, 56,240, 54,112, 0,195, 71,116,132, 34,
- 8, 53, 16,170, 34,148,116,253,230,127, 6,190,147,239,149,255,122,124, 81,197, 81,222,171,254, 87,148,116, 52,207,139,225,121,
-121,215,187, 10,184,199,210,124, 71,166,115,231, 67,183, 62,204,252,154, 80, 69, 37, 7, 74, 14,150, 92, 41,115,213,204, 1,253,
-206,157, 59, 10, 80,186,114,229,138,192, 68,193,137,231,184, 81,165,115, 34,163, 36, 75, 13,180,152,246,230,205,155,238,103, 18,
-104,145,174,107, 34,243, 8,180, 8,138, 70,140, 24, 33, 10, 21, 42,164, 4, 35,144,197, 21, 56, 65, 22, 7,249,216,177, 99,123,
-156, 28, 73,147, 19, 20, 1, 86,249, 98,249,196,218,222,205,197, 3,223, 38,226,106,167, 47,196,165,230,159,137,235,165,115,138,
- 13,109,191, 16,141,170, 85, 81, 64, 86,153, 50,101, 76,193, 27,129, 22, 37,120, 70, 32,139,252,203,147, 39,143, 2,178, 56,177,
- 83,218,101, 6,180,212,124,206,144, 33,195,159,168,163,109,168,158,117, 12,168,163,109,168,163,195,168,163,107,118,234,232,109,
-232,176,158,218, 39, 37, 89,106,160,197,186,208, 2, 45,130, 28, 74,143,216, 62,179,102,205,106, 10,180,172,208, 36,200, 66,253,
-255, 83,164, 72,145, 6,133, 11, 23, 46,109, 6,180,216,247,164, 36, 72, 15,100,177,159,178, 13,179, 63, 80,162,107, 65,250,116,
-206, 21, 79, 76,154, 52, 41, 84, 64, 91, 20,144,160, 42, 32, 43, 71,142, 28,202, 66,131,170,120, 15,237,133, 54, 88,239, 0,156,
-221, 86,143, 29,148, 42, 55,106,212, 72,172, 91,183, 78,145,108,181,109,219, 86,145, 58, 19, 44, 98,225,224, 72,180,222,230, 14,
-232,148,253,173,231,128, 39, 44,130, 33,173, 66,247,238,221,123, 16, 27, 97, 65,234, 71,224,195,223, 50, 72,208,165,249, 31, 2,
-108,185,192,154,146,206,149,158, 63,212,255,149,231, 8, 10,120,146,241,228,119,121,199,243,106,242,191,138, 78,136,124, 24, 1,
- 45,197,185,161,145,243, 68,170,168, 56,177, 24,169, 17,213,170, 69, 12,196,134,182, 91, 4, 90, 4, 27, 82,146, 37, 1, 23,239,
- 92,137, 19,100, 16, 20,244,207,156, 76,140,204,159, 65, 28,241, 95, 72,224,230, 17,104,193, 94,228,220,207, 63,255, 44, 32, 5,
-240, 8,178,228, 74,154, 42, 16, 51,160, 69,154, 84, 65,102,206,148, 81, 60,159,255,133, 56, 61,174,173,232,214,232, 19,247, 4,
-211,189, 97, 3,177,161, 67, 59,113,248,235,150,162, 74,133, 10,138, 42,197, 76, 29, 73,160, 69,128,122,244,232, 81,183, 36,235,
-252,249,243,138, 36,139, 32,139,128, 51, 95,190,124, 10,120,165, 77, 28,227,218, 1, 90,144, 52,140, 7, 0,152,129,201,107, 60,
-234,131, 97,198,206,157, 59,151,225,190, 29,225,162,213, 58,122,155,123, 58,219, 39,193,147,148,100,173,242, 41, 34,100,144, 82,
- 44,130,172, 54, 67,125,149,240,251,218,149,150, 36, 90,102, 52, 9,178,210,100,206,176, 28,160,164, 14, 58,112, 65,128,173, 15,
-173, 0, 45, 46,108,180, 32,139,223, 82,131, 44, 0,112, 69,197,109, 5,104, 49, 30,165, 88,122, 64,139,116,208, 23, 69,206,156,
- 57,149,118,202, 69,141, 21,160, 5, 53,232,149, 69,139, 22, 41,146,172, 58,117,234,136, 41, 83,166, 40,170,204,175,191,254, 90,
- 1, 89, 92,120, 80,170, 75,105, 28, 22, 54, 14,208,122,155, 59,160, 83,246,183,158, 3,158, 60,199,171,129,143, 26, 84,201,223,
-218,247,106, 48, 37, 25,171, 6,107, 70, 64, 75, 11,158,244,128,152,140, 99,144, 15, 93, 73,154, 2,176, 60,121,102, 87,171,168,
-164, 58,209,232,110,166, 58, 36,128, 48, 82, 23, 18,100, 49,140, 42,144, 81, 76, 45,151, 79, 28,251,211, 26,208,234,215,175,159,
-178,218,166,186,144, 42,196,203,151, 47,187,213,133,148,100,113,144,167,109, 9, 65,214,167,159,126, 42,226,196,137,227, 81, 10,
- 65,160,229,235,235, 43,114,229,200, 38,196,191,221, 68,233, 98,133,220, 32, 75,170, 11, 43, 66, 58,182,226,199,129,162, 54,108,
-190,172, 72,201,104,244,206, 73, 80,170, 11, 37,200,226, 4,195,252, 21, 47, 94, 92,228,207,159, 95, 1, 89,140, 71, 41, 0,128,
-214, 5,163,158, 7,155,175,157,210,104,222,117,191,131, 59,195,109, 87,184,131,111, 94,128,196,101, 20,194, 31,168,175,237,178,
-206,156, 29,163,250, 92, 85, 3, 45, 74,177,212, 64, 75,218, 66,113,193, 33,129,214,188, 53,203,109, 1, 45, 61,154, 82,146, 69,
-144,133, 78,251, 1, 66,102,171, 64,139, 32, 93,170, 11,165, 42,147, 32,107,216,176, 97,238, 69, 7,234, 94,124,246,217,103,150,
-128, 22,129, 80,188,120,241,220, 64,171,115,231,206, 66, 6,210,201,149, 43,151, 2,178, 32,113,227,138, 82,196,136, 17,195,204,
- 70, 43, 42,128,214,101,170,203,217,255,104, 39,185,124,249,114,177,117,235, 86, 65, 53, 37, 37, 89,167, 78,157, 82, 22, 26, 92,
-100, 57, 64,235,173,159,103, 29, 6,188,229, 28,240,132, 69, 48,180,149,215, 72,150,220, 18, 45, 61,192,163, 5, 90,136,163,168,
- 21, 85, 32, 73,170, 14, 67, 73,180,212, 96, 75, 79,114,166,150,116,169,223, 75,240, 22, 38,137,150,183,234,158, 19, 25,129,150,
-158,186, 80,130, 44, 74, 19,166,125, 84, 64,204,251,164,180, 56,185,114,177,169,106, 6, 54, 37,231,104,252,206,213, 54,109,178,
- 56,160,195,240, 86,177,157, 82,131, 44, 26,172, 19,100,113, 50, 49, 3, 90,164,217,163, 71, 15,168,242,114,138,139,135, 39,138,
-146, 37,138,133,178,201,170, 92,169,178, 24, 63,110,177,168,247,121,109, 5,192,153, 73,201, 8,180,104, 55, 67, 21,137, 4, 89,
-156, 0,201, 11, 74,196, 56,113,209,150,140, 42, 67,130, 70, 94,158,128, 22,121, 73,245, 45,105,202, 32, 13,234, 9,214, 40,129,
- 97, 28,111,213,221,219, 64, 71, 2, 45,169, 46,212, 2, 45,105,108, 46,129,214,156, 85,254,166,237,147,198,240, 4,206,122, 52,
- 9,178,208, 78,151, 67,189, 87, 7, 96, 61, 47,170, 60, 13, 66, 86, 43, 64,139,192,138, 32,139, 0,197, 19,200, 34, 56,170, 89,
-179,166,153,244,201,135,234,114, 26,189, 99, 39, 96, 8,160,165, 52, 68,205,197,182, 74,117,185, 5,160, 21, 5, 59, 9, 47,209,
-150,140,106,204,213,171, 87, 43,146, 44,130,172,255,254,251, 79, 89, 20,181,111,223, 94,121, 70,254, 0,108, 58, 18,173,183,161,
-163, 57,101,116, 56, 96,192, 1, 19,137, 86, 9, 45,160,242, 36, 89,210,188,115,131, 44,151,250,175,130, 74,202,165,167, 58, 84,
-236,173,244, 0,151, 5, 9,151,177, 68,203,147,234,208, 91,173,130, 19,217,249,189,187,221,246, 88,106,117,225,207,217, 83,138,
-177, 69,178,136, 25, 21, 10, 42, 32,129,193,138, 13, 12, 65, 17, 24,167,168, 52,212,134,239, 90,144,197, 73,132, 32,139,171,234,
-184,113,227,122,148,104,145, 38, 87,242,249, 10,231, 21, 35,239, 15, 20, 37,202,125, 24,194,240,157,147, 76,181,106, 53, 68,247,
-249,251, 68,131,250, 13,149, 93, 89,102,224,141, 64,139, 64, 72, 45,201,226,142, 46, 78,130, 21,160,126,100,126,169,142, 97, 57,
-168,166,113, 1, 45,195,124,146,151, 4, 88,218,141, 5,242, 63,193,150, 3,180,236,181, 92,242,235,236,230,241, 98,101, 71, 31,
- 37,168,213,133, 61, 51, 23, 21, 50,144,183,172, 75,130, 98, 43, 54, 90,122, 52, 9,178,222,143,243,222, 63, 4, 89, 46, 73, 86,
-154,122,245,234,229, 29, 52,104,144, 37,213, 33, 65,159, 30,200,194,166, 8, 69,178,171,150, 64, 85,169, 82,197, 18,208, 98, 91,
- 4, 15, 76,129, 86,217,178,101,149, 54,139,157,182,166, 64, 30,134,244,151,168, 46,255,245,215, 95,197,182,109,219,220, 54, 89,
-148,236, 6, 6, 6, 42, 32,139,146, 45,242,211, 1, 90,246,218,171, 19,219,225,192,155,198, 1, 43,170, 67,130, 31, 23, 88,178,
- 98,163,165,150, 96,169,127, 71,247, 4,180,248,206, 19,160, 10,147,141,150,182,178, 92,170, 66, 67,103,165,218,157,108, 86, 85,
- 81,156,200,206,236,220,230, 6, 7,210, 38,139, 82,172,113, 69,179,138,233, 0, 89,191,127, 86,214, 61,193, 89,153,200, 36, 40,
-162,113,174,220, 93, 72,208,194,213, 50, 87,252,148,100,169, 65, 22,119, 57, 89, 1, 90,116, 13, 81,160,100,126, 81,245,217, 71,
-226,195, 42,229,220,187, 11, 9,178, 40,129,170,249,201,167,162,233,138,107,162, 81,147,166,202, 22,120, 51,160, 69, 31, 89,156,
- 88,168,214,108,209,162,133, 34,201, 34,240,163,187, 9, 74,225, 74,151, 46,173,168,100, 40,129, 8, 47,208,250, 46, 94, 20,197,
- 88,155, 42, 68,216,204,117, 65,125,141, 69, 88,142,122, 90,243,166,117, 76,111,150, 71,105,159, 27, 70,185,129,150, 90, 93,168,
- 6, 90, 82,114,104,165,125, 82,162,165,165,105, 32,201, 74,215,188,121,243,188,163, 70,141,178, 4,180,152, 7,173, 36, 75,130,
- 44, 74,118,217,142,168,138,102,155,226, 38, 16, 51,233, 19,213,229, 4,100, 52,158,151, 59, 11,105,244,174,119, 85,172, 88, 81,
-145, 26, 91, 5, 90,220, 81, 72, 3,120, 74,178,168, 70,228,127, 41,201, 98, 63, 32,112,229,229, 0, 45,111,182,102,135,150,195,
-129, 55,139, 3, 82,245,231,146,106, 81, 66, 85, 84, 74,184, 84,207,220,187, 14,117, 36, 90,242,157,214, 64, 94, 62, 55,218,117,
- 40,159,203, 59,119, 33,170,191,109,109,215,161,182, 58,104,252,206,129,143,134,235,148, 42,201, 65, 93, 58, 45,229, 46,193,107,
-215,174, 41,182, 21,116, 77, 96,213,121, 41, 39, 50,250,201,162,212,165, 83,130,104,138, 61,150, 52, 60,158, 81,177,144, 88, 80,
-187,188, 88,254,229, 39,202, 4, 66,160,224,154,200, 60, 26,195,195, 32,247, 92,135, 14, 29, 20,105,144, 90, 93,216,184,113, 99,
-101,183, 21,237, 88, 24, 40,201, 34,200, 34,200,129, 29,138, 71,137, 22,105,210, 80,183, 64,177, 2, 34,215,211,180,226,139,195,
- 93, 68,189, 31, 58, 40,234, 18,130,172,134, 63, 14, 19,245,253,207,137,218,235, 30,137,250, 13, 27, 41,254,134,204,192, 27,129,
- 22, 13,127,137,216,185,221,158,121,129, 4, 67, 1,129,156,224, 72, 27, 42, 35,101,130,164, 68,226,239,191,255,166,234,208,176,
-236, 82,162,165,221, 88, 32,213,178,228, 31, 0,219, 93,240,114, 60,234,237,111,212,213, 41,171,245,244,102,117, 79,235,165, 33,
- 79, 79,175, 27, 22, 2,104, 73,117,161, 22,104, 81,154,104,165,125, 18,104,169,105, 74,155, 44,151, 36, 43, 53,186, 89, 90,180,
-213,188,104, 19, 84, 29,102, 66,200,137,157,172, 30,141,225,169,230,147,254,189,216, 79,105,147,101, 4,178,168,230, 35,136,183,
- 2,180,104,107, 40,141,222,229,206, 66, 61,160,197,197,203, 39,159,124, 66,195,121, 83,137, 22, 84,145,151,184,232, 97,127,148,
-110, 28,216, 31,165, 36,139,252,149,151, 3,180,172,183, 85, 39,166,195, 1,135, 3,198, 28, 80,129, 50,125, 53,222,235,192, 60,
- 76,244, 71,184,202,212,115, 84, 26, 30,231,165,210, 6, 70, 74,178,126,201,149, 90, 76, 40,153, 67,252, 86,185, 72, 8, 53,205,
-214, 31,218,138, 61,131,186,137,171,155,215, 80, 5,226, 17,104,189,251,238,187,231, 56,104,211,152, 92, 79, 93,200,119,116,194,
- 72,149, 29, 47,238,210,130,111, 32, 83,160,245,213, 87, 95, 41,210,128, 74, 13,170,138,182,127,247, 23,223, 30,221, 40,218,174,
-191, 41,106,174,186, 43,210, 46,125, 46,190,248,125,159,104,218,174,179, 2,178, 56,137, 88, 1, 90, 92,205, 83, 37,201, 60, 65,
-122,161,236, 6, 35,208,226, 4,199,188, 83, 34, 71,149, 15,119, 80, 82, 10,129,137,199, 35,208, 34, 0, 86, 3,173,239,222,139,
-170,184,202, 96, 32, 88, 5, 96, 14,194, 78,209, 63, 80,103,188,110,134,197,201,236,235,208, 30, 95, 86, 30, 36,120,149,146, 44,
-191, 31,235, 11, 25,164,186,144, 60, 31, 56, 37,167, 18, 22,175,233,100,218, 62, 9,180, 8,202, 72,147, 32, 43, 71,198, 15, 86,
-160, 94,234,192,174,143,192, 42, 45, 66,122,130,172,239,190,251, 46, 31,126,103, 65,200,101, 5,104,209,214, 81, 13,178, 80,183,
-138,141,162, 90,146, 37, 65, 22, 23, 7,102,210, 39, 74,134, 25,143, 52,212, 59, 11,245,128,150,148, 16, 91, 5, 90,220, 85,184,
-118,237, 90,101,199, 45, 37,197, 92,196,112,161, 70,158,112,145,196,254, 64,208,234, 0,173,151,213,210,157,239, 56, 28,112, 56,
-240,202, 57, 0, 21,211, 74,163, 51, 14, 1, 2,232,168, 84,215,121,169,142, 10, 49,196,137,225, 18,104, 73, 73,214,164,146, 57,
-197,111, 85,138,138,133,117, 42,184,165, 88, 92,225,238, 29,220, 93, 28, 25, 63, 64, 92,223,185, 65,111, 34, 11, 65,147, 64,139,
- 18, 34,174,218,229,238, 66, 61,117, 97,183,110,221,220, 94,227,117,128, 86, 40,154,148, 56, 21, 43, 86,204,237, 39,171, 82,149,
-170,226,155, 17,191,137,214, 99,255, 16,159,215,123,225, 17, 94,130, 44, 74,206,116,128, 86,168,178,115,146,102,217, 57,193, 72,
- 27, 31,189,137, 76,181,194,215, 2, 45, 55, 77,105, 12, 47,109,178,164, 36,235,199,148,241, 68,223,244,137,149,111, 96,146,127,
-128,186,250, 29, 97, 3,235, 19,245,243,183, 78,227,138, 44,167,186, 71,120, 62,213, 64,139,237, 80, 13,180,212, 27, 15, 36,208,
- 90,248, 79, 7, 2, 19,195, 58, 34,175, 37,208,146,146, 44,130, 44,212,175,158, 36, 43, 75,223,190,125,243,255,246,219,111,133,
-116,128, 86,136,178, 83,205,199, 54,194,147, 16, 40,201,146, 32,139, 54,138, 84, 23, 82, 50,170, 6, 89, 4,242, 58, 64, 43, 4,
- 77, 2, 45,218, 94, 73, 26,114,103,161,148,226, 82,234, 42,119,237, 74, 91, 71,108, 0,209, 74,180, 66,213, 17,118,199, 94,162,
-212,155,198,239,116, 40, 44,253,102,209,254,141,151,148,108, 81, 66,103, 0,180, 34,188,222,189, 52,224, 58,249,244, 18, 35, 93,
-100, 28,126,190,157,252,244,110,169, 35, 43, 53, 74, 69, 56, 64,114, 69, 45, 87,234, 84,255, 81,141,168,163,154,210, 5, 27,242,
-200,153, 19,127,251,139,147,171,253,197,233,213,127, 42,170, 66, 25, 46,111,254, 71, 92,221,182, 14, 97, 45,237, 69,180,210,167,
- 16, 52,161, 18, 57,199,227, 66, 40, 1,162,173,147, 30,200,162,186,144, 3, 60,237, 66, 40, 81,194, 89,107, 30,105, 18,188,209,
-177, 34,165, 76,114,162,225,100, 37,105,107, 65,150,129, 58, 82,183,236,156, 80,184,122,167, 90,214,236, 2, 48,186,172,105, 39,
- 33,128, 22,165, 44, 4, 90, 82,146,197,205, 5, 4, 89, 3,179,190,111,103,215,161, 51,160,185,152, 44,193,171,180,193,218,189,
-114,150, 8, 88, 62, 67,236, 92, 54, 85,177, 35,146, 97,201,191, 93,196,162, 53, 29,197,188,191, 90,153,182, 79, 0,173, 91, 0,
- 24,202,238, 66, 56, 36,253, 28,199,220,228, 68,189, 39, 69, 72,130, 54,153, 21,109, 50, 51,126, 39, 68, 72, 0,169, 86, 58, 24,
-134,167,129,100, 83,171, 58, 12, 5,180,168,130,166,212,149,109,159,109,149, 82, 38,182, 79,182, 83,246, 5, 45, 64,210,145, 62,
-133,160, 73,117, 57,219,187, 4,106,210, 17, 47,141,222,121,244, 14, 13,229,185, 75, 86, 58, 28,229, 66,196, 42,208,162, 20,153,
- 18,101,218, 76,114, 65, 64, 19, 4,121,201, 99,168,248,223, 1, 90,161,102, 5,167,111,122,119,162,116,248,249,250,243,211,187,
- 57,140,172,212, 8,166,140,212,138, 58,170,169, 16, 13, 91,199,247, 83,160,198, 23, 84,168,255,112,244,169, 61,172, 89, 59, 65,
-108,166,253, 9, 3, 87,237, 12,156, 84, 24, 56, 17, 48,192, 80, 93, 9,144, 58, 41, 1,191, 45,211, 84,211, 85,211,214,210,199,
-119, 60,210, 68, 57,118, 98,210, 13,148, 1, 32, 42,208, 44, 48,141, 39,160, 37,109,217,180,231,222, 81, 90,192,201,204,226,174,
- 67,103,240,113, 49,153,252, 54,107,143,218,247,102,237, 19,182,121,219,209,230, 22, 66, 18,220, 28, 82,162, 50, 86, 2,128, 86,
- 49,100,137,158,213,229,165,149, 62,109,246,112, 96,186,210, 23,180,253, 1,109,215,176, 45,241, 35,112,104,186, 89, 30,186, 46,
-211,235,245, 41,117,187,199,111,143, 52, 73, 23, 54, 90, 91,104,159, 40,249,198,246,111,212,238,193, 75,189, 67,165,157,246,233,
-221,201,194,225,167,195, 79,111,113, 32, 34,218,146,183,242, 22,185,233, 80, 61,104,164, 86,212, 81, 77, 69, 68, 69, 56, 52,209,
-132,172,128, 86,198,177,208,218, 28,126, 90, 96,146,141, 40, 14, 63,109, 48,203, 66, 84,135,159, 22,152,100, 35,138,195, 79, 27,
-204,178, 16,213,225,167, 5, 38, 57, 81, 34,150, 3, 78, 35,244, 46,127, 29,126, 58,252,244, 22, 7,156,182,228, 45, 78,190,160,
-227,240,211,225,167,183, 56,240, 54,183, 37,111,241,240,173,162,243, 54, 55, 24,167,236,222,109,234, 14, 63, 29,126,122,139, 3,
- 78, 91,242, 22, 39, 29,144,233,180, 37,239,182,165, 55,150, 26, 27,138, 94,176, 83, 96, 35, 26,158,158,155,209,119,104,234,215,
- 75, 88,235,203,225,167,195, 79,171,109,192,233,155,198, 28,176,202, 67,117, 60,135,159, 14, 63,245, 56,240, 54,183, 37,201,143,
-176,206,103,102,125,234,173,122,239,160,125,239, 86,183,195, 79,135,159,222,226,128,211,150,188,197, 73, 71,170,227,180, 37,167,
- 45,121,151, 3, 14, 53, 91, 28,112, 58,160, 45,118,153, 70,118,248,105,202, 34, 91, 17, 28,126,218, 98,151,105,100,135,159,166,
- 44,178, 21,193,225,167, 45,118,153, 70,118,248,105,202, 34, 91, 17, 34,130,159,182, 50,224, 68,118, 86,121,102,141, 48, 90, 24,
- 26,137, 33, 77,184, 33, 74,132,144,194, 32, 36,242,240, 45, 79, 52,163,128, 94, 12,132,120, 46,250,252, 6,127,243,153,218,253,
-128,150,188,155,166, 16,189,163, 94,184, 48, 58,239,249,179, 19, 90,158, 59, 55,241,235, 51,103, 38, 22, 23, 98, 69, 12,153, 32,
-238,251, 57,114,166,200, 84,232,187,132,105,114,143, 78,145,177, 80,235,152,201,179,166, 55,200,171, 25, 63,195,192, 78,199,128,
- 57, 44, 76, 11, 75, 91, 10,199,119,156,122, 15, 7,243,116,146,154,241,243, 99,164,217,131,176, 23,161,158,197, 79,155,209,180,
- 72, 38, 68, 52,135,102, 88,184,102,156, 38,178,240,211,187,165,126,221,169,225, 60,192,157,241,227,199, 15,132,115, 79,119, 72,
-148, 40, 81, 32, 3,124,227, 40, 1,238, 3,220, 1, 62,112,248,206,212,175,142,170,220,239,224,119, 67,124,103, 10,210, 29, 97,
-224,111, 62, 67,224, 59,163,203,172,193,196, 71,194, 86, 8,235, 93,129,191,249,204,211,229,137,102, 94,240,224, 56,202,119, 12,
- 4, 18, 51,160,220,199,192,155,227,248,157, 55, 12,249,140, 10,127, 69, 35,225,201,158,131,217,183, 54,219,129, 39, 80,148, 18,
-103,224, 61,214, 11, 0, 69, 41,237,230, 19,105,222, 69, 72, 54,122,244,232, 28,240,253,212, 24,126,144,134, 48,240, 55,159,241,
- 29,227, 24,208,117,231,147, 32,107,215,206, 14, 19,151,255, 89,225, 22,195,238,221,157, 38,158, 63, 63,185,140, 16, 1,209, 99,
- 39,201,154,178,192,135,213,199, 28, 61,118,106,210,147,103,207, 38,173, 92,191,125, 98,166,124, 31,141, 53, 0, 91,102,245,110,
-147,149, 74,116,135, 38,152,128,147, 18,118,202,126,110,212,199,217,191, 25,146, 37, 75,230, 14, 24, 3, 12,251, 59,105,154,141,
- 23, 90,122,244,183,133,103,155, 53, 21,233,174, 35,244,185, 45, 70, 99,143, 30, 45,233,191, 75,199,205,137,154,166,146, 79, 45,
- 93, 89, 94, 53, 93,210,147, 52,193, 7, 79,249,220, 25, 17,249, 12, 11, 77, 79,249,116,241, 57, 42,238, 99, 92, 60,202,138,223,
-219,120,122, 5,125,241,193,143,218, 62,252, 47,128,182,177,155,113, 16, 24, 87,239,114,250, 81, 88, 70, 31,227, 52,111, 51, 63,
-189,203,201,215,157, 26, 65,150,218,131,115,112,112,176,226,209,156, 94,179,233, 32, 83, 58,197,100,167,228,217,133, 60,115,143,
-131,176,209, 32,169,121,158, 7,244,143,254,252,243,207,143, 78,157, 58,165, 28, 92,205,192, 51,209,126,249,229,151, 71,124,135,
-248,121,108,116,106, 14, 0,149, 16,252,224,236,241,241,159,127,254,169,120,241,102, 30,231,207,159,207,243,223, 30,243,157, 43,
-142,222, 96, 97,212,176, 63,132,131,197,243, 39, 78,156,120,190,106,213,170, 39, 24,112, 86, 51, 32,159,207,241, 44, 24,131,240,
-121,208,164, 23,111, 59,131, 79, 29,120,167, 15,100, 89,113,228, 9,193,150,188, 40, 33,242, 36, 37, 98,188, 80,249, 84, 73,178,
- 8,166,132, 94, 32,208,114, 73,186,244, 36, 91,122, 52,227,226, 32,224, 52, 0, 86, 63, 19,184,105,105,242, 25,223, 49, 14,232,
-198,213, 41,188,155, 38, 37, 89, 4, 88,247,111, 30, 22, 12,211,166,151,187,211,250,219,198,126, 41, 51, 21,252, 53, 97,234,220,
- 99, 14, 30, 62, 54, 9, 52, 38,253,187,227,232, 36,223,241, 43, 38,125,246,237,200,137, 73,210, 21,104,237,137,166, 23,251,206,
-219, 60,160,185,203,158, 48, 97,194,203,242, 72, 28,189,131,228,121,242,131,236,231,242,156, 82,222, 9, 58,140,250, 59,193,139,
- 60, 48, 90,142, 29,242, 68, 8, 62,151,231, 73,242,187, 50,112,188,129,119,248,115, 70, 52,145,207, 75, 50,159,164,201,211, 41,
- 56,110, 72,186,106,239,253,234,179, 41,113,186,132,229,124, 90,161, 73,218,112, 64,123,209, 40,159, 4, 68,140,195, 75,230,147,
- 99,167,204, 39,199, 80,117, 94,229,127,140, 53,134, 39, 65,232,209, 52, 43, 59,191,225,137,159,174,252,143, 57,114,228,136, 50,
-166,227, 16,251,235, 56,245,226, 41,219, 0,199, 80,140,165,193, 56,214,236, 9,207,165,252,242,203, 47, 57,182, 16,108,217, 25,
-235,194,211, 85,157,190, 25, 30,238,133, 78, 27, 89,248,233,221, 82,191,238,212,184,194,229, 64, 49,119,238, 92,241,199, 31,127,
-136, 37, 75,150,136,229,203,151, 11, 0, 14,241,239,191,255,138,141, 27, 55,138,109,219,182, 41, 7, 79,243,176,100, 14,188, 22,
-129, 86,225, 12, 25, 50, 4,241, 88, 14,245, 37,207, 1,100,135,231,225,179, 24, 28,131,192,163,194, 22, 38,220,207,241,221,203,
- 99,198,140, 81, 14,170,213,187, 56,112, 28, 60,120, 80,240,188, 67, 72,205,120, 54,221,231, 70,131,164,124, 14, 79,239,181, 50,
-103,206, 28,136,203, 77,114,224,192,129,103, 23, 46, 92,120,141,131, 49,207,111,219,180,105,147, 72,147, 38, 77, 32,142,236,169,
-101, 33,159,140, 18, 3, 43,199, 61,199,143, 31,127,190,119,239,222,167,240, 24, 62,207,149, 14,139,199, 24, 67, 48,168,173,195,
-255, 22, 30,218,134, 30, 40,114, 75,178,144,209,219, 8, 65,154,112, 91, 74,185, 12, 36, 91, 33,104, 82, 45,184,123,247,238,180,
-240, 36, 30, 64,128,133, 99, 98,206,224,104,159,171,152, 48, 30, 35, 60,193,239, 64, 28, 21,115,150,239, 24,135,113,153,198,136,
-159, 84, 23, 74,160,117,104,255,122,241, 69,139, 50,143, 78,156,220,187,241,206,221,187,179, 86,111, 57, 48,233,232,217, 43,147,
-150,174,219, 63,105,210, 31,155, 39, 21,110, 60,100,210,199,223, 77,156,148, 50, 91,209,177, 9, 62,200, 85, 22, 52, 13,189,163,
-123,169,255, 68,150,193, 39, 66,243, 9, 80,116,153,141,124,233,210,165, 98,197,138, 21, 98,245,234,213, 98,221,186,117, 98,243,
-230,205, 98,251,246,237, 2,117,172,156, 85,200, 9, 25,224,154,135, 99, 11,130, 47,157,147, 7,220,249, 36,208, 34,205,191,255,
-254, 91, 25, 47, 54,108,216, 32,182,108,217, 34,118,238,220, 41,246,236,217,227,166,135, 5,139, 66,143,227, 1,193, 23,128, 1,
- 23, 47,234, 75, 77,243, 18,251, 50,199, 30,230,109,199,142, 29,238,188, 29, 62,124, 88,168,105,241,184, 31, 30,174, 78, 48,130,
-241,230,170, 17, 77, 2, 24,230,147,229,101,127,102,121,113, 16,187,216,191,127,191, 32, 77,244, 85,113,230,204, 25,229,156, 70,
- 30, 51,198, 35,132, 72, 19, 64,203, 16,188, 73,154,158,202, 76,154, 44,179,154,166,167, 35,183, 36, 77,150,125,235,214,173,110,
- 62, 30, 56,112, 64,169, 23,150, 93, 75,147,192, 14,224,201,144,159,228, 9,234, 41,128,124,231,161,223,172, 31,130, 93,150,155,
- 99,253, 95,127,253,165,148,155,188,152, 62,125,186,192, 2,152,146, 45,189, 43, 66,219,167,151,250, 58,201, 56,249,244, 34, 51,
- 35,136,159,134, 57, 68, 55,141,142, 80, 4,161, 6, 66, 85,132,146,174,223, 21, 93,247, 98,184,151,119,253,174,128,123, 81,215,
-111,198,231,111,190,231,111, 25,138,168, 63,166,162,205,111,200,239,200,184,242, 27,218,255,242,185,246,125, 8,218,202,119,120,
-110,154, 43,112,114, 83, 46, 9,180,172,128,172, 67,135, 14, 41, 64, 75,103,133,171,101, 90, 76,128,139,179, 28, 92,212, 23, 87,
- 94,124,198,193,130,131, 58,239, 28, 68,161,126,224,132, 30,211,164,109,156, 35,240, 33, 80, 51,187,152, 71, 14,250,160,167, 93,
- 53,135,250, 4, 85, 6, 92,197,147, 54, 7, 50, 78, 62, 28,184,152, 87, 74,225, 56, 8, 77,153, 50, 69, 25,160,200, 43,139,237,
-247,187, 1, 3, 6, 60,226, 96,141, 51,237,174, 35,141,148,134, 13,152, 52,105, 82, 32,191,131,243,230,214,226,185, 22,184,132,
- 34,143,178, 74,155, 44,183, 36, 11,207, 30, 32, 4,104,194, 3, 36, 86, 36, 93,184,164,100, 43,161, 94,126,241,158, 54, 89,201,
- 81,246, 81,140,143, 65,253, 24,254, 63, 65, 56,131,112,192, 21,248,251,209,154, 53,107, 14, 51, 14,227, 50, 13,211,234,209,164,
- 77, 22,213,133, 4, 91, 93,186,127, 24,180,255,191,127, 14, 61,125,122,199,127,199,129,211, 51, 70,204,250,119,210,194,127,246,
- 42, 18, 45,134,253,199, 46, 76,106,213,119,238,164, 1, 19,151, 77, 42, 80,174,246,216,120,169,114,213,176,200, 87, 39, 90, 56,
- 56,128, 73,252, 50, 1, 12, 65, 22,235, 20,192, 92, 64,189, 45,112,196, 14, 23, 38, 2,146, 36, 46,162,148,126,137, 5,144,192,
- 2, 68, 64, 26,237,241,136, 39, 2, 3,210, 68, 59, 81,104,105,105, 98,130, 23, 28, 55,212,224,128,139, 44, 29,160,229, 46, 25,
-210, 92, 98,127, 36,208, 80, 3, 64, 9,178,212,180, 8,178, 8, 6, 41, 73,202,152, 49,163, 22,104,185,105,202,124,106, 65, 22,
-243, 70,144, 69,201,179, 26,100, 73,154, 58, 64,203, 77,147, 38, 21,148,100, 25, 1, 75, 45, 32,146, 52,117,128, 86, 8,154,228,
-167, 4, 89, 88,220, 9, 79, 32,139, 99, 23,203,174, 3,180,180, 45, 37, 39, 37, 89,139, 23, 47, 22, 12,203,150, 45,115,131, 44,
-142,121, 12,148,110,225,240,114, 74,182, 11,132,163,153, 57, 73, 29, 14,152,114, 64, 15,139,200, 68,152, 35, 42,116,239,222,189,
- 7,199,168, 18, 37, 74,248, 17, 48,185,230, 53,247, 93,190,231, 93,190,103, 28,237,127, 85, 58,133, 60,226, 18,196,185,233,168,
-211,170,191,161,154, 75, 67,125, 91,190,211,210,118, 23,154,133,227, 31,121,231,111,130, 7, 14, 22, 92,229, 74, 73, 22, 65,133,
-148,100,113,213, 71, 73,150, 28,144,216,177,205,128, 22,206, 83,235, 2,251,158,199,158, 64,214,250,245,235, 21,208,199, 21, 52,
- 14,224,125,204, 52, 38,181,163,172, 72,185,194, 93,180,104,145,178,226,214, 94, 28, 48, 71,142, 28, 41,124,125,125, 21,218,160,
-103, 8,140,242,229,203,215,187, 97,195,134, 91, 27, 55,110,124,129, 3, 21, 87,224,228, 67,239,222,189,197,177, 99,199,148, 85,
- 40, 39, 36,222, 81,121,202,192,132, 67,124, 47, 20, 44, 88,112, 3, 38,161,222, 30,242,250, 46, 6,180, 91, 84,177, 98,133,248,
- 28, 3,229, 98, 87,220,118, 63,252,240,195,101,174,234,145,255, 91,120, 62,200,180, 53,190,168, 73, 61, 73,214, 29, 53,200, 66,
-190, 3, 80,134,155,152,192,110, 97,226,185, 74,201, 86,212,168, 81,239, 34, 78, 10,189,111,224,121,108, 28, 22, 92, 18,239,158,
- 65,106, 69, 70, 18,100,237, 83,211, 4,189, 0,208,218, 7,192,121, 7,124,162,221,218, 51,166, 97, 90,125,154, 43, 98,208, 38,
-107,195,186, 1, 93,211,102, 72,127, 41,123,246,108,247,227,196,137,251, 44,109,186, 12,183, 51,231, 46,118,112,207,254,195, 51,
- 8,178, 46, 92,185, 61,105,214,138,157,147,190, 25,244,251,164,134, 61,127,155,212,113,200,239,147,226,165,204, 59,216, 10, 47,
-156, 56,225,227, 0,192,198, 37, 74,105, 40,173,102, 31,151,160,131,139, 30, 41,217,145,210,162, 75,151, 46, 41,146, 99, 74, 65,
- 60,157,165, 73, 0,195,254,195,254, 76,192,161, 39,125,210, 74,138,184, 88,242, 4, 12,100, 62, 37, 45,173,212,169,107,215,174,
- 74,191,148, 32,139,139, 34,130, 19, 0,173,107, 70, 28, 34, 40, 98, 62, 41,157,151,146, 44, 53,200,194, 96, 33, 40,213,230,226,
-136,128,136, 96,144, 52,205,128,150, 28, 59,176,160, 82,198, 28,179, 59,105,162,236,148,182,235, 94, 50,159, 28,143, 8,178, 56,
- 4, 72, 73,150, 17,125, 23, 77,173, 68, 75, 77, 95, 49,124,255,228,147, 79,158,114,252,230, 88, 6,218, 15,241,108, 47, 67,141,
- 26, 53, 30, 17,104, 46, 88,176, 64, 96,124, 11,118, 61,183,106, 32, 31,190, 70,233,164,126, 43, 57,160,135, 69, 36, 35,180, 64,
- 72, 15,104,189,152, 26, 67, 3, 48,237,115,198, 65,112, 75,157,212, 32, 78,190,211, 3, 94,174,119,138, 84, 75,143,166,124,166,
-166,237,174, 72, 61, 20, 73,209, 63, 7, 11, 43, 32,139,157,209, 64,149, 16,162,177, 96,176, 88,203,213,161,188, 56,104, 81,146,
- 69, 32,196, 65,142,226,123,230,101,206,156, 57, 74,231,246,243,243, 19, 76, 99,210,226, 20,160,197, 21, 46, 3, 7, 76,174,204,
-168,158,224,128,220,183,111, 95,209,169, 83, 39,241,253,247,223,139, 94,189,122, 9,168,254, 60, 2, 45,128,135, 29, 28,160, 32,
- 42,191, 65,128,245,219,111,191, 9,128, 14,209,161, 67, 7, 69,106,199,129,124,218,180,105,162, 75,151, 46,202,115, 78, 76, 45,
- 91,182,188, 70, 62, 21, 41, 82,100,171,135,188,150, 99,124,242,180, 81,163, 70,207, 16,143,149, 92, 18, 54, 17,215, 56,144, 99,
-165,250, 8, 19,201, 95,120, 38,237,168,162,123, 42, 55,129, 22, 43,213, 85,177,161, 36, 89,152, 56, 3, 0,234, 2, 80, 55, 1,
-152,144, 2, 46, 95,190, 76, 9, 26, 37, 11, 4,186, 70, 64, 43, 1, 38,165,110,140, 7, 21,194, 37,196, 59,167, 6, 89,152, 8,
- 3, 48,201, 42, 52, 33,213, 59, 6, 30, 31, 98, 92,166, 65,188, 4, 70,249,141, 31, 63, 78, 37, 72, 39,111, 67, 13,253, 28,170,
- 71, 69, 74,200,201,112,246,156, 57,207,177,179,224,209,164, 41,211,150,206,251,123,215,164,214, 3,230, 77,170,222,110,226,164,
- 10,173,199, 76,234, 53,118, 25,128, 86,110, 75,160,243,173, 28,145,188, 88,104,244,177, 75, 4, 37,108,203, 82,138, 69,137, 19,
-165, 88,148, 22, 73, 41, 86,142, 28, 57, 4, 22, 34, 2, 27, 34,148, 69, 11, 15,136, 54,202, 6,129, 1,129, 19, 23, 64, 80, 57,
- 81, 58, 45, 72, 19,139, 49, 74,173,148, 69, 11,199, 2, 9, 98, 56,209, 27,168,186,220,159, 32,208, 34, 77, 9, 0, 37, 32,146,
-128,141, 11, 31,142, 39, 18, 16,177,175,241,130,234,208, 35,208,226,119,181, 11, 71, 41,201, 34,208, 34,200, 98,254, 56, 94, 73,
-154,102, 64,139,192, 85,171, 34,213,147,100,145, 38,227,114,172, 49, 3, 90,204, 39,105, 50,175,236,119,122,234, 66,153, 79, 21,
- 77, 79, 64,107, 27,121,197, 75,170, 11, 93, 6,240, 10,207, 1, 14,143, 83,106,198, 49,112,242,228,201,130,230, 25,104, 31,122,
- 7,127,123,177, 53, 58,164,222,102, 14,152, 72,180,202, 27, 73,172,212,160, 71, 53, 47, 26, 74,157, 92, 64, 73, 97, 53, 65,145,
- 6, 84, 41, 0, 76, 15,104,201,239,224,157,162, 42, 52,250,175, 91,135,122, 40,146, 64,139,131,154,122,149,171,183,234,147,131,
- 28,117,251,158, 86,184,252,112,156, 56,113,110,203,129, 74, 15,100,113, 69, 69,144, 53, 97,194, 4, 69, 2,197,255, 76, 99,210,
-240, 66, 0, 45, 9,184,120, 7, 0, 18,223,124,243, 13, 37, 99,110,160, 69,240, 6,122,134, 19, 68,158, 60,121,230, 97, 69,255,
-156, 18, 53,168, 77,175,208, 22,139,246, 30, 52,194,229,157,229,229,160, 68, 94, 16, 12, 98, 21,125,117,232,208,161, 4,113,207,
- 49,248,206,245,144,215, 65, 20,193, 19,100,208, 38,134,241, 96,227,180, 28,246,104,207, 33,205,122,158, 41, 83, 38,110, 0,200,
-134, 16, 23,131,221,232,202,149, 43, 7, 64,250,244,157, 17, 61, 79, 64, 11,188, 13,192,132, 19, 0, 0, 27,128, 65, 57, 0, 82,
- 5,254,190,194, 70, 97, 2,180,146, 66,146, 57,219,213,120, 8,200,168, 46, 84, 84,145,144, 96, 16,172, 5, 96,130, 84,104, 66,
- 74,177, 15,121, 63,201,184, 76,131, 56, 73, 13,242,154, 12,117,120,199,200,126,142,252, 76,144, 48,225,163,161,211,252,103,244,
-157,180,114,210,144, 25,255, 76, 26, 48,117,229,164,178,117, 59, 76,136,251,126,182,178,111,243,160,243,178,202, 14,245,239, 37,
- 74,168, 40,201, 82,247,113,173, 74,142,237,159, 64,153,125,129, 19,185, 25,208, 98, 31,151, 42, 62,181,244, 73,130, 24,130, 44,
- 74,120, 9, 14,248,125,151,170,235,130, 81,185, 9,180, 8, 8,217, 55, 9,178,216,175,185, 0, 98, 27, 34,173,158, 61,123, 42,
-160, 72, 13,136,172, 0, 45,142,115, 82, 58,239, 83,231,128, 96, 56,127,254,188, 66,147, 64, 75, 13, 94,228, 34, 17,160,136,253,
- 73,247,162,217, 1,105, 50,159,102,146, 44,249,158,116, 49,126, 24, 74,180, 36, 77,169, 46,100,191,147,192,205, 72,162, 69,154,
-200,167, 33, 63, 65, 99, 27,235,147,233, 41,165,167, 61,157, 4, 90, 63,254,248, 99,235,126,253,250,221, 27, 63,126,188,178, 64,
- 37,175, 91,180,104, 65,233,125, 80,133, 10, 21,246,228,204,153,115,209,203,106,159,206,119,222, 30, 14,152, 72,180, 74, 16,220,
-168, 1,142, 4, 58,118,239, 46, 58, 33, 0,149, 75,189, 88, 65,114, 91, 15,104,201,239,235,229, 65,243, 44,116,165,169, 80,100,
-111,249,150,162,127, 14, 88, 82,149,224, 9,100,113, 21,105,166, 74,112, 1,139,251, 4, 26,164,203, 65,140,171, 90,174,206,248,
- 13, 53,200, 26, 60,120,176, 64, 39, 87, 12, 48, 1, 70,238,155, 52, 51, 67,160,197,129, 65, 11,180, 72, 19,244, 60,217, 84,197,
-202,146, 37,203, 48, 72,167,214, 96, 37,239, 7, 99,247, 43, 92,121, 83, 2,195, 21, 37, 3, 85,148, 28,148, 8, 44, 49, 0,206,
-135, 68,103, 13, 38,157, 97,160, 27,203, 40,175,176, 83,217,205,213, 35,249,136, 56, 51, 17, 10, 32,127,193,156, 56, 48,168,209,
-142,170, 45, 66, 66,216,176, 65, 32,183,248, 14, 7,122,236, 74,164, 65,186, 46, 77, 35,160, 5,192, 27, 0,169, 91, 0, 38,201,
- 0,168, 25, 2,254,249,231,159, 0,228,151,224,136,187,164, 76,129, 22,164, 15,243, 17, 47, 24,244,105,244,118,128,234, 71, 76,
- 52, 1,224,129,155, 38,236,110, 2, 86,174, 92,185, 23, 18,195, 19,140,203, 52, 70, 64, 11,229,153,132,239,191, 16, 45,168, 46,
-182, 3,242,149, 3,253,176, 97,195,130,227, 39, 76,254, 95,162, 52,121, 39, 37, 73,151,143, 42,195,159, 95,128,172,222, 70,219,
-201,223,158,145,231, 37,148,148, 64,139, 11, 37,182, 77, 41,113,210, 74,177, 8,178, 74,150, 44, 41,176, 97, 67, 96, 17, 32,160,
-238, 22,176, 41,242, 40,209,226,152, 64,233, 19, 38,123, 37,164, 79,159, 94,217,232, 34, 65, 12, 65, 22,165,196,140,199,126,229,
-146,234, 24, 2, 3, 74,222, 24,151, 0,144, 99, 7, 1, 27,105, 81, 90,205, 49, 8,253, 72,201, 23,129,129, 92,208,153, 1, 45,
- 2, 24,246, 65, 2, 55, 53, 77,130, 45,230,143, 64,203, 29, 84,237,215, 12,104,145,166, 26,168,170,237,188,180, 82, 39, 73, 86,
-103, 39,163,187,246,101, 62,165,186,144,124, 84, 27,211, 27,209, 52, 1, 90,138,234, 16,146,202, 39, 28,207, 48, 86,136,234,213,
-171, 63,198,184,116, 6,147,206,125,109,159, 85,255, 71, 26,186,183,113, 46,135, 3, 94,229,128, 30, 22,209, 2, 31,206, 99,106,
-155, 43, 51,224,165,141,207,255, 12,174,116, 90,201,149, 91,147,164, 7,180, 52,105, 37, 13,229,110, 10,180,244, 56, 69,160,197,
-149,171,167,157, 56,178,163, 19,132,112, 5,231,105,133,203,111,128,230,102,166,225,228,170, 6, 89,180, 3,155, 61,123,182,224,
-234,137, 32,139, 3, 38, 85, 19,216,229, 39,152,198,155, 64, 11, 70,231,102, 64, 75,251,185,138,121,243,230,189,200,129,156, 18,
- 41,230, 13,118,102, 52, 8, 38,112,161, 75, 9, 75, 87,246,236,217,159,177, 54, 40,253, 66,130, 47, 17,198, 83, 13, 64,240,133,
- 50,210, 88, 55, 29,140,142, 55,195,248,244, 17,165, 63,144,188,221, 6,200,252,217,136,184, 6,104,221,131,186, 51, 0,124, 13,
-128,116, 44, 0, 59, 44, 41,113, 10,192,224, 25, 0,169, 91, 0, 84,157, 4, 92,220, 0, 96, 6,180, 18,192,232,245, 7,198,195,
-132,118, 5, 52,207,161,110,221, 52,161,222, 84,104, 66,253, 26,128, 58, 59, 56,107,214, 44,250, 42,163,161,236, 15,200, 79, 2,
-189,188, 66,218,117, 82,170, 39,228, 64,205, 73,149, 54,105,156,216,185, 51,139,118, 60,144,242, 81, 13,233, 92,175,128, 3, 80,
- 17, 94,228, 68,173, 85,159, 73,137,137,220,193, 71, 48,198,126, 78,213, 58, 47, 79, 64,139,192,128,241, 41,201,210,130, 24, 72,
- 70, 21, 16, 67,144,197, 49,134,237, 65,210, 4, 48,208,186, 77,112,115, 68, 2, 45,105,164, 78,155, 44,170,240,185,155,152,146,
-172,159,126,250, 73, 89,196, 17,176,113,161, 38,193, 22, 0,158,161,234,144,249,100, 26,142, 71,220,228, 34, 37, 90,188,147, 39,
- 4, 89, 82, 13,167, 0, 46,215,133,124, 26, 26,216,115,247, 53,105, 74,213,158, 21,144, 69,178,158,128,150,150,166, 21,144, 69,
-154,158,248,233, 98,108, 78, 72,168,110,177,174,184, 81,136, 0,142,210, 61,142, 83,188,228,196,162,190,243, 57, 22,160,134,245,
-244, 10,154,176,243,201,183,128, 3,104,118,234,157,128,252, 45,119, 21,106,119,254,233,237, 4, 84,199, 15,177,235, 80, 69, 55,
- 44,187, 16,229,183,212, 59, 21, 67,239, 56, 52,170, 31,218, 88,176,243, 25,109,119, 86,131, 44,198, 51, 83, 37,240, 59, 0, 14,
-125,176, 83,239, 41, 7, 33, 41,201,210,130, 44,174, 72,169, 14, 24, 52,104,144,128,189,212, 83,166, 49, 3, 90,148,142,168, 85,
-134,242,183,158, 68,139,118, 6,160,103,117,151,160,242,105, 74,174, 56, 88,114, 48,134, 91, 6,101,231, 15,249, 99,163,109,191,
- 75,187, 22, 94, 44, 31,210, 81,183,251, 47,249, 64,160,129,223, 19, 16,218,112,163, 0, 39, 30,240,232, 62, 36, 96, 83,201, 50,
- 43, 64, 11,147,212,117, 76, 86, 55, 49, 49, 4, 34,127, 1,216,176, 16, 0,155,177,128,121,243,230, 5,192,238,237, 52,164, 79,
-103, 0,100, 21, 53,159,137,234, 48, 14, 12, 99, 41, 58,229,138,225, 63,186,115,192,100, 11,146, 47,104,130, 78, 0,252,146, 5,
-204,152, 49, 99, 55,232,159,196,206, 15, 58,172, 20, 76,131,162,197,209,203, 43, 54, 51, 40,126,121,228, 37,119,109,210,118,135,
-246,114,148, 48,146, 7, 80, 89, 80,170,231, 92,175,128, 3,144, 98, 93, 36,232, 81,111,110, 81, 27,170,115, 33,165, 5, 89, 86,
-128, 22, 1, 54, 65, 22,119, 41, 66,213,228,182,239, 82, 75,198, 24, 71,221, 62, 76,236,148, 20,137, 22, 37, 89, 4, 89,148,102,
- 17,176,177, 79, 17, 20,113,195, 10,199, 33, 94,106,160,133,133, 0,237, 19,117, 47, 2, 24,210,148, 32, 75,130, 64, 2, 45, 62,
- 39,184, 34,112,115,161, 14, 53,208, 50, 4,111, 18, 20,145,135,118, 84,135,158,192,139,154,166, 4, 61,191,254,250,171, 82,110,
- 19,213,161,161, 58,146, 12,201,157, 59,247, 94,246, 73, 26,217,211,182, 21, 99,134, 64,255, 86,198, 96, 79, 23, 22,135, 55, 95,
- 65, 83,117, 62,233,112,224,205,226, 0,129, 4, 59,177,118,231,145,167, 85,174,167, 21,174,139, 59, 9, 96,175,115,157,210, 12,
-174, 74,169, 46, 84, 75,178, 56, 96,182,111,223,222, 45,254,103, 92,164, 75, 96,194,217,243, 28, 40,152, 47, 14, 22,106,192,165,
- 6, 90, 61,122,244, 80,192, 27,165,100,160,231,201, 64, 52,212,231,184,155,146, 3, 49,125,113,241, 27,148,192, 80,226,103,163,
-198, 19, 82,229,194,139, 3, 24,210,149,133, 65,176,178, 43,128,131, 26,254,183, 71, 88, 8,158, 4,163, 28,193, 0, 67, 43,241,
-223,147,119,124, 46,173, 19, 35, 31,233, 25, 0, 82, 30, 51, 64,242,112, 5,106,216, 0,240, 53, 0,124, 13,128,132, 48, 0,131,
-240, 41,128,157,199,209,162, 69,123,204,184, 0,137,233,144, 86,247, 72, 30, 60,143,138,240, 62, 84,129,115, 56,152, 3, 12,237,
-199, 4,123, 23,118, 33,199, 33,201,218, 7, 21,224, 94,216,173, 29, 2,253,211,168,167, 85,140,195,184, 76,195,180,122,252,128,
- 68,235,148,148,104,113,226,226, 42,159, 59, 87,105,223, 70,201,224,168, 81,163, 20,176, 5,137, 22,221, 69, 56,215, 43,224, 0,
-129, 22,165,204,122, 46, 13, 36,200, 98, 31,227,130, 70,125,153, 73,180, 88,239, 82, 82, 68, 91, 71,130, 24, 74,107,165,157,151,
- 90, 58, 38,233,122, 2, 90, 84,113,114, 33, 66,128, 69, 90,236,211, 52,128,167,109, 22,219, 22, 55,190, 80, 18,206,160, 86, 29,
- 90, 1, 90,146,166, 90,162, 69, 73,155, 7,213,161, 41,208,178, 42,201,146,101,183, 2,180,212,146, 44,246, 63,181, 49,189, 30,
- 48,242,196, 79, 54, 53,140, 11, 99, 57,230, 18,180,145, 79,216,236,240, 4,227, 70,240, 23, 95,124,225,194,150,161,157, 32,243,
- 5, 22,192,220,157,232, 92, 14, 7, 28, 14,132,135, 3,210,143,148,122,123,183, 17,200,146, 3,176,206,192,171,231, 32,174,114,
-214,172, 89,131, 40, 25,226,192, 78, 63, 93,156,108, 57, 72,246,233,211, 71,241,207, 67,155, 11,172,224,232,176,180,178, 78, 25,
-180, 52,191,128,231,247, 7,244,107, 69, 21, 7,237, 34,184,219,144,128,139, 64,171, 93,187,118,202, 74,119,200,144, 33,226,243,
-207, 63,167,113, 61,233,126,161,161,235,209,145, 29,129, 22, 69,234, 84,245, 81, 18, 67, 91, 6,110, 22, 48,225,175,154,102,106,
-108,149, 86, 6, 46,230, 9,233, 74, 22, 47, 94, 92, 17,243,208,158, 4,255,107,194,206,235, 22,255, 99,135, 15,183, 81,119, 48,
-160,173,117, 46, 74,191, 87,238,221,135,152,212,206, 3, 20,157, 7,152, 58,139, 60,158,134,196,232,228,196,137, 19,233,130, 65,
-234,164,233, 71, 75,235,239, 74, 75, 51, 22, 86,181, 89, 32, 81, 59,205,116, 95,127,253,245, 62,148,251, 63,128, 76,210, 61, 54,
-115,230,204,109,200,251, 54,190, 99, 28,198, 5, 77,173, 29,153,155, 38,108,180, 38, 35, 31, 79, 41,105, 32, 15, 9, 82,233,173,
-159,155, 29, 56, 73,114, 71, 83,155, 54,109,158, 33,222,104, 27,252, 12, 79,211, 86,167,117, 28, 24,130, 27, 80,249, 95,144,234,
-124,181,223, 40,181,155, 4, 45,200, 98, 91,245,212,223, 41,129,225, 66,141, 11,148, 66,133, 10,209,239, 13,109, 14, 69,165, 74,
-149, 4,251, 2, 65,150, 30, 77, 44, 64,180, 18, 24,119, 29, 73,163,125, 9,216,244, 84,143,122, 96, 3, 0,226,134, 81,127,151,
- 18, 45,181, 58, 83,109, 51,166, 71,143,207,144, 79, 45,208,114,231,147,227,133,220,236, 99, 83,162,165,181, 79,211,165, 73, 53,
- 41, 36, 81, 10,184,100,191,242, 36,209,242,196, 79, 23, 79,148, 35,120,176, 96,162,116, 90, 57,130, 7,167,115,136,143, 63,254,
-216,168,232,106, 0, 38,217,234,244, 35,111,141, 72, 47,232,188,205,252,244, 46, 39, 95,119,106, 4, 90,236,208,242,200, 13, 14,
-154, 92,161,114, 69,201, 65,132, 3,165,219,118,193,213, 37, 45, 2, 45, 22,189, 10, 38,214,235, 88,137, 62, 33,208,162,100,139,
-187, 1,251,247,239, 79,215, 7, 79, 93,146,172, 42, 86,192,134, 43, 78, 50,220,199, 2, 0, 60, 35,224, 34, 32, 36,144,163,237,
- 6, 12,173, 21,112,131,242,208,165,194, 88, 4,198,213, 94,102, 64,235, 50,119, 16,101,203,150, 77,192, 80, 94,217,161, 67, 39,
-143, 54,128, 65,114, 76, 48,138,254, 1,106, 54,130,158,124,248,175, 0,173,122,245,234,241,127,238,138, 21, 43, 42,255,155, 52,
-105,194,255, 70,142, 1, 67,229, 19, 73,220,146, 45, 72,174, 4, 3, 86,169,238,128,157,139, 4, 55,138,228,139,113,173,148, 29,
-241,226, 79,157, 58, 53,171,148,108, 33, 77, 40, 91, 13,190, 99, 28,198, 53,161,153, 12,117,125,135,254,205, 40,213,160, 27,140,
-113,227,198, 41,192,151,171,104, 14,234,240,194, 79, 53,132,167,131,175,223,246,193, 39, 66, 7, 94,244, 91, 5,104,233, 57,231,
-212,147,100,201, 25,216, 10,208, 98,157,211,247,150,220,177, 40, 85,144,122, 32,203, 5, 96, 12,129, 22, 64,145,162, 58, 84, 75,
-197,212,246, 93, 70,200, 0,146, 34, 67,160, 37, 65, 17,105,170,129,155, 91, 93,104, 64,212, 12,104,145,111,210, 45,132, 4, 68,
-102, 52,145, 79,143, 64, 75,210, 84,247, 71, 51,154, 22,128,150,182,251, 74, 3,121,229, 12, 33,245,183,212,172,112, 61,119,128,
-214,219, 13,138, 34, 98, 92,122,221,161,145,119,243,199, 3,162,229, 1,178,234,195, 84,105,175,196, 64,195,119, 6, 14,182, 50,
- 0,204,216, 57, 84, 58, 62,196,207, 63, 65, 69,185, 17,190, 89,238, 50,240, 55,159,161, 36,122,147,183,149, 78,157, 9,145,230,
-127,244,209, 71,193, 4, 67,180,227,128,219, 4, 74,136,184,147,142,239,140, 46,143, 13, 6, 59,108, 86,211, 23, 23, 37,112,180,
- 99,105,222,188, 57,119, 80,173,182, 1,180, 40,162,159,134, 85, 61,193,222, 52,166,131, 99,192,105,240, 2,255, 28, 64,232, 55,
-254,231,251, 98,197,138,241,191, 39, 23, 17,186,249,164,148, 74, 45,217,210, 2, 35,190,211,145,100,121,228, 39,165, 84, 8,239,
-215,173, 91,183, 28,118,160,117, 7,176,154,203,192,223,124,198,119,140, 99,192, 3,109, 62,203, 3,108,221,130, 20,235, 41, 61,
-133,211,219, 52,253,242,124,251,237,183, 4,213, 4, 89, 70,231, 69,170,201, 71, 68,167,118,104,130,195, 84, 99, 83,122, 69,160,
-161, 94, 76,153,129, 24, 51,160, 69,122, 4, 86,218,197,153,218, 38, 75,139, 99, 60, 29, 67, 35,129,150, 92,228, 81, 61,104, 6,
- 52, 72, 31,234, 51,143,210, 39, 2, 33, 73,147, 0,208, 10, 77,240,204,240, 88, 31, 9,222,200, 63, 46, 70,173,210,132,228,205,
- 16,104,113,204,229, 2,151, 52, 89,110,171, 52, 61,241,211,211,248, 5,187, 58,158, 10, 97,120, 57, 64,203,205, 61,103, 12,241,
- 46,244,112,168,133,129, 3,175,170, 17, 22, 70, 94,151,185, 2,127,155, 93,102,249,140,137,157,135,191, 97,176, 59,142, 65,244,
- 56, 84,159, 4, 71,102, 71, 3,233,209,212, 2,147,120,154,140,105,255,107,243,109,152, 79,140,136, 60,146,135,128, 74, 47,120,
-146, 22,121,162, 73,155,173, 56, 8, 9, 16,146,186, 2,127,243,153, 39,215, 11,122, 52,147,226, 56,151, 95, 97,179,117,154, 6,
-242,220,141, 72,215, 15, 40, 96, 18,179,202,113,189, 55,171, 35,139,100, 66, 68,115,104,178, 2,146, 36,217,166, 93, 76,233, 45,
-164,212,139, 42,254,246,180,176,130,196,119, 39,105,202,133,153,209,226,204, 14, 77,124,111,139,167,133,158,150,150,252,143,242,
-237,211, 52, 14,119,189,227,221,206,176,208,244, 84,118, 73, 83,242, 80,187, 32, 53,202, 39,242, 65,149,188,238,226, 34,172, 52,
-109, 46,126,221,223, 6,144,220,134,180,119,209, 71, 31,162,191,114,129, 24, 66,186, 5, 41,180,218,143,152,211,143,194, 50,250,
- 24,167,121,155,249,233, 93, 78,190, 37,212,222,230, 6,227,148,221,187,141,220,225,167,195, 79,111,113,192,105, 75,222,226,228,
- 11, 58, 14, 63, 29,126,122,151, 3, 14, 53, 91, 28,112, 58,160, 45,118,153, 70,118,248,105,202, 34, 91, 17, 28,126,218, 98,151,
-105,100,135,159,166, 44,178, 21,193,225,167, 45,118,153, 70,118,248,105,202, 34, 91, 17, 34,130,159,182, 50, 16,153, 34,147, 89,
-122,193, 78, 25,140,104,120,122,110, 70,223,161,169, 95, 47, 97,173, 47,135,159, 14, 63,173,182, 1,167,111, 26,115,192, 42, 15,
-213,241, 28,126, 58,252,212,227,192,219,220,150, 36, 63,194, 58,159,153,245,169,183,234,125, 68, 32, 94,135,166,119,155,144,195,
- 79,135,159,222,226,128,211,150,188,197,201, 23,116, 28,126, 58,252,244, 22, 7, 34, 75, 91,242, 86,121,223, 42, 58,145,165,114,
-157,124,122,183, 89, 58,252,116,248,233, 45, 14, 56,109,201, 91,156,116,192,155,211,150, 94,255,182,228,221, 28,190, 37,212,156,
-134,237,221,138,118,248,233,240,211, 91, 28,112,218,146,183, 56,233, 0, 24,167, 45, 57,109,201,187, 28,112,168,217,226,128,211,
- 1,109,177,203, 52,178,195, 79, 83, 22,217,138,224,240,211, 22,187, 76, 35, 27,241, 51, 27,156,113, 30,132,195, 95,250,137,106,
-102, 74, 37,100, 4,187,117,212, 8,142,139,175,195, 31,223,223, 32,147,205,224, 91,118,105, 90,201,178, 67,211, 10,151,172,199,
-113,248,105,157, 87, 86, 98, 70, 22,126, 90, 41,139, 19, 71,195,129,200, 82,185, 78, 62,189,219,116, 29,126, 58,252,148, 28,200,
- 6, 31,116,215,228, 25,133,112, 30,170,117,244,105,198, 41, 91,109, 9,135,183, 95,160, 67, 79,156,249, 41,224,191,138,190,158,
-244,192,150, 25,205,108,112, 30, 74, 96,200, 51, 81, 27,153,101,208,245,222,140,166, 36,211, 12,142,139,111,224,108,210,191, 60,
- 0, 65, 25,215, 42, 77,139, 89, 84,162, 57, 52,237,112,203, 60,174,195, 79,207, 60,202,131,215,121,205,217,232,196, 8, 15, 7,
-156, 70, 24, 30,238,133, 78,235,240,211,225,167,183, 56,240, 50,218,146, 27,100,241,136, 27, 28, 76, 46,112, 34, 2, 1,134,157,
-203, 86, 62,225, 20,119,255,186,117,235,148,195,203,255,253,247, 95,145, 33, 67, 6, 2, 59, 45,216,242, 68, 51, 4, 48,164,211,
- 85,139,153,181,148,207,162, 69,139, 94,164, 87,119,230, 17,158,238,141,128,160, 3,180, 28, 64,104,177,217, 89,142,102,169,125,
- 90,166,246, 34,162, 17, 77, 58,243,254, 34, 74,148, 40,219,243,228,201,163,156,203,137,223, 91,240,172, 46,194, 59, 54,191,241,
-102, 69,199,193,164,235, 24,222,172, 82, 57,165,113, 56,224,112,224, 21,113, 0,227,107,110, 8,178,238, 43,231, 28,142, 29, 59,
-150,231,131, 62, 65, 94,254, 65, 88,162, 19,122,226,153,167,163,183,212,197, 96, 60,198,215,163,243, 15,191,195,239,241,124, 77,
- 28,178,206, 51, 74, 31,232,128, 45, 61,182,184, 65, 22,243,204,115, 57,225, 21,221, 46, 48,244,200,110, 28, 99,245, 31, 15, 86,
- 39, 16, 36,240,132, 55,120, 51,176,245,138,170,207,249,172,195, 1,219, 28, 72,143, 20,131,177,216,185,193, 67,201,113, 22,174,
- 88,186,116,169, 88,184,112,161, 24, 49, 98,132, 40, 95,190,188,128, 36,151,230, 3,221, 16, 18, 26, 81,127, 99,177, 8, 79,127,
- 71, 40,203, 96,155,181, 78, 2,135, 3, 14, 7, 28, 14,132,230,192,102,158, 33, 72,192, 66, 80,193, 51,255,140,174,192,192, 64,
-193,195,229,161,234,251, 15,100,204, 14, 23, 79, 84,176, 96,193,195, 60,228, 94,125,241,252, 68, 30,186,204,179, 26,175, 95,191,
- 46, 46, 92,184,160,124,247,252,249,243,202,225,206,160,171, 61,134, 71,155,227, 16, 32,107,229,202,149, 2,199,222, 68, 4, 8,
-202, 6, 41,217, 21,130, 44,230,143,103,127,226,252, 80, 61,169,155,211,166, 28, 14, 68, 38, 14,116,255,252,243,207,159,127,243,
-205, 55, 98,210,164, 73,196, 19, 98,193,130, 5, 98,230,204,153, 98,198,140, 25, 98,246,236,217, 98,214,172, 89, 98,204,152, 49,
-162,118,237,218, 2,103, 41, 63, 68,225,198, 35,100, 85, 23,242,141,198, 34, 44, 92,100,170, 81, 39,175, 14, 7, 28, 14,188,246,
- 28,216,199, 67,165, 9,162, 8, 40,172, 4,130, 15, 23,216, 50,146,108,197, 39,200,162,148,140,170, 72, 43, 52, 9,180, 8,188,
-192,173,205, 30, 56,150, 30, 42,142,235, 82,250,246,215, 95,127, 81,250,246, 24,241,141,164,111, 75,240,110, 42, 66, 58, 3,154,
-124, 62, 2,129,241,244,194, 63, 80, 27, 62,102,121, 41,117,219,191,127, 63,165,110,215, 17, 55,195,107, 95,171, 78, 6, 29, 14,
-232,115,224,200,161, 67,135,196,127,255,253,167,168,236, 87,172, 88, 17, 2,104, 17,100,253,246,219,111, 98,218,180,105, 74,152,
- 50,101,138,104,211,166,141,200,152, 49, 99, 48,200,245,146, 36,223,104, 44,242, 70, 23,206,233, 22, 14, 7, 28, 14,188, 10, 14,
-100,195,225,235, 15, 8, 36, 8,118, 60,169, 14,161, 62, 59, 41, 37, 60,148,108, 33,179, 84, 11,234, 93, 61, 41,201,146,246, 94,
- 76,167, 3,100,254,129, 93,214,147,197,139, 23, 43,223,165,234, 48,123,246,236,247, 17, 47,183, 7, 38, 12,163,212, 75, 74,223,
- 30, 63,126,108, 40,125,147, 47, 40,173, 3, 88,210, 5,111,144,132,173,225,123,179,139,223,145, 82,183,227,199,143,179,220,211,
- 94, 69, 69, 57,223,116, 56,224, 5, 14, 28,217,179,103,143,232,214,173,155,152, 63,127,190,210,239,182,110,221, 42,150, 45, 91,
- 38,126,255,253,119, 69,154, 37, 65,150,250, 78,149, 34,190,125,228,109, 1, 90,189,223, 88,189,168, 23, 90,144, 67,194,225,128,
-195,129, 48,113, 32, 27,141,209,119,237,218, 37, 78,159, 62,173,216, 36,197,137, 19,103,191, 14,165, 68, 4, 77, 84, 47, 18,120,
-184,192,147,222, 7,151, 16,188, 48,142, 11,100,133, 82, 51,114, 55, 31,193,216,163, 71,143,196,134, 13, 27,140,140,225,181,180,
-167, 93,186,116, 73, 92,185,114,197,146,148, 76,170,252, 8,168,244, 50, 73, 0, 38,237,176, 60, 73,221, 78,157, 58, 37,206,157,
- 59,167, 0, 66, 23,208, 26, 22, 38, 46, 59,137, 28, 14,188,122, 14,252,183,109,219, 54, 69,138, 53,120,240, 96,209,181,107, 87,
- 49,111,222, 60,183,132, 75, 11,180, 90,183,110, 45, 10, 21, 42, 36, 58,119,238,172, 5, 90,111, 54, 22,113,108,180, 94,125, 75,
-117,114,224,112,224, 13,228, 64,182, 84,169, 82, 93,161, 45,210,225,195,135,169, 26, 60,107, 80, 70, 55,136,178, 2,180,140,226,
-208,222,137,146, 41,170, 47, 60,184,119,208,102, 33, 67,142, 28, 57,174, 19,240, 92,188,120, 81, 88, 84, 29, 82, 53,152,206,160,
- 44,124, 78,213,226, 18,131,240, 15,164,125,143,105, 79,118,239,222, 61,181,234,144,198,196,206,229,112, 32, 50,114,224, 83,244,
-243, 91, 3, 7, 14, 84, 92,171, 80, 77,200,223, 93,186,116, 17,126,126,126, 10,224,162,148, 89, 2,172, 82,165, 74,137, 6, 13,
- 26,136, 86,194,135, 64,139,182,153,238,203,193, 34,145,177,250,157, 60, 59, 28,112, 56,240,170, 57,144,141,110, 29,224, 67,139,
-198,229,122,126,169, 18,213,169, 83,231, 34, 13,218,195, 43,209, 2,253,102, 0, 88,231, 92,146, 51, 35,135,165,122,252,200,150,
- 37, 75,150,171, 4,131,148, 50, 69,164, 49, 60, 84,153,215, 8,178,104,188, 79,201,151, 99, 12,255,170,155,167,243,125, 47,113,
-224, 61,208,233, 7,187,171,135, 67,135, 14, 85, 22, 44,191,254,250,171, 24, 48, 96,128, 34,185,130,255, 56, 37,212,173, 91, 87,
-116,234,212, 73, 84,173, 90, 85, 96,135,226,109,164,249,204, 75,223,119,200, 56, 28,112, 56,224,112,192,225,128,139, 3,233,112,
-119, 27,139, 19,100, 81,213,199,157,130,102, 54, 90,151, 47, 95, 22, 12, 46,215, 8,106, 27, 45, 79,198,233, 86, 25,159, 45,125,
-250,244, 87,119,238,220,169,168, 58,233,222,193, 64,213,105,149, 94,168,120,177, 99,199,254,155,170, 77,130, 44, 74,249, 28,247,
- 14, 97,102,165,147,240,245,229, 64,114,100,109, 76,174, 92,185,158,142, 28, 57, 82, 44, 89,178, 68,177,209,252,244,211, 79, 21,
- 27,174,250,245,235,211,190,241, 17,226,252,140,144,224,245, 45, 70,228,201,217,203,116,146, 22, 30,174, 56,249, 12, 15,247, 66,
-167,117,248,233,240,211, 19, 7,254,162,177,172,188, 40,201, 34,200, 50,216,117,168,110, 75,241,115,230,204,121,136, 82,167,179,
-103,207,134,112, 25,193, 29, 79,248,224, 58,139,108,247,232,176,148,146, 55,170, 63, 92,170,206,115, 94,160,233, 38, 1, 32,119,
-133,170, 77,130, 44,199, 97,169, 71,206, 58, 99,136,197,134,103, 49,218,171,224, 39, 85,225,179, 96,139,245,124,244,232,209,202,
- 46, 67, 72,111,159,227, 25, 23, 69, 31, 88,204,183, 19,205, 2, 7, 94, 69,229, 90,200, 86,168, 40, 78, 62,195,194, 53,227, 52,
- 14, 63, 29,126,122,226,192, 58,170, 20,212,134,226, 30,252,104,105,219, 82, 34, 24,216, 31,248,243,207, 63, 67,164, 31, 55,110,
- 28,129,150, 85,231,162,102,237, 51, 27,140,234,255,134,205, 9,253, 91, 53,179, 88,149,102, 52, 37,153, 70,180, 83,179,168,218,
-180, 74,211, 98, 22,149,104, 14, 77, 59,220, 50,143,235,240,211,156, 71,220,241, 59, 15, 97, 46, 66, 78,243,232, 78, 12,187, 28,
-112, 26,161, 93,142,121,142,239,240,211,225,167,183, 56,240, 42,219, 82, 58, 20, 66,107, 44,110,228, 25, 94, 47,159,122,158,225,
- 61, 25,167,107,121,246, 42,203,110,167,254,156,124,218,225,150,121, 92,135,159,230, 60,178, 19, 35, 34,248,105,231,251, 78, 92,
- 23, 7, 34,162, 34, 28,154,222,109, 94, 14, 63, 29,126,122,139, 3, 78, 91,242, 22, 39, 95,208,113,248,233,240,211, 91, 28,136,
- 44,109,201, 91,229,125,171,232, 68,150,202,117,242,233,221,102,233,240,211,225,167,183, 56,224,180, 37,111,113,210, 1,111, 78,
- 91,122,253,219,146,119,115,248,150, 80,115, 26,182,119, 43,218,225,167,195, 79,111,113,192,105, 75,222,226,164, 3, 96,156,182,
-228,180, 37,239,114,224, 13,164,198, 78,162, 23,236, 20,213,136,134,167,231,102,244, 29,154,250,245, 18,214,250,114,248,233,240,
-211,106, 27,112,250,166, 49, 7,172,242, 80, 29,207,225,167,195, 79, 61, 14,188,205,109, 73,242, 35,172,243,153, 89,159,122,171,
-222, 59, 43, 29,239, 86,183,195, 79,135,159,222,226,128,211,150,188,197, 73, 71,162,165,215,150,162,128, 45, 12, 81, 93, 65,254,
-183,202,245, 87,209, 62,153, 71,187,215,203, 42,123, 68,240,243,117,164,105,151,255, 78,124,151,164, 76,143, 17,172,224,104,174,
-142,104,151, 81,175,162, 3,218,205, 35,227, 71,246,124,106, 7, 73, 59, 60,136,236,101,183, 83, 86,109, 92,167,236,225,225, 94,
-232,180, 14, 63, 35, 31, 63,229,216, 17, 29, 89,143,129, 16, 19,129,191, 9,186,172,130,153,151, 89,239,204,215, 59,174, 60,218,
-157,151,180,249,140,136,178,191, 77, 52,189,219,218, 35, 1,181,252,113,227,198, 93,146, 56,113,226,255,112,120,234,222,152, 49,
- 99,206, 68,158, 75,216,204,183, 94,103,153, 10,111,200,207,223,121,231,157,167, 56,150,227, 41,232, 62,141, 21, 43,214, 83,248,
-149,121,154, 32, 65,130, 59, 22,232,235,118,192,100,121, 62,237,146, 50,239,103,231,146,231,249,228, 7, 53, 13,163,231,154,239,
-188,204, 78,109,161,136,134, 81, 94, 86, 62,163,160,110,106,195,223, 79,203,104,209,162,181,136, 30, 61,186, 18, 80, 87, 45,224,
-217,186, 5,234,169,153, 73, 33, 66,228, 51, 81,162, 68,219, 51,103,206,124, 44, 91,182,108,199,112,166,220, 49, 56,157, 60,150,
- 60,121,242,237,146, 6,234,127, 83,210,164, 73,143,224,123, 71,224, 44,242, 72,218,180,105,143,160,205,109,114,234,200,205,129,
-151, 85,239,225,105,155, 33, 22, 23,191,255,254,123,180,187, 91,226,101,123,176, 57, 90,253, 71, 91,163,182,225,157,255,249,220,
- 74, 80,101, 36,210,149, 61,188, 76,124, 21,101,135,223,176,145,232,119,247,209, 87,175, 96,204, 15, 68,255, 11, 68,159, 84, 2,
- 28,171, 42, 1,125, 86, 9,120,183,211, 67,223,148,160, 0, 36, 99,140,131,131,202,251,160,113,133,206, 89,153, 22, 99,127, 32,
-250,185, 18, 82,166, 76,233, 14,136,227,137,102,136,207,129,214, 36,208, 13,114,209,189,140,255,238,128,103,151, 84, 97,131,201,
- 24,162,228, 21,249, 28,163, 42,251, 21,111,149,157, 52,193, 75,210,187,162,199, 71,242,130,193,164,236, 33,248, 25, 81,249,116,
-213,187, 87,203, 30, 70,154, 94,236, 62,145,128, 84,129, 2, 5,142, 60,121,242,196,237,189,249,193,131, 7,202,169,220,200,250,
- 32, 27,217,215, 14,146, 51, 75,151, 46,173, 16,229, 1,147, 60,192,245,210,165, 75,202,233,245,103,206,156, 17,239,189,247,222,
- 83, 11,180,117, 7,222, 44, 37, 26, 95,191,119,255, 65, 80,166,226,141,120,158,154,251, 50,122,238,161, 3,230,199,187,133, 8,
-123,109,134, 85,136, 95,208,104,144, 68,163,219,204, 14,108, 39, 48,141,167,129, 34, 34,104,226,123, 4, 89,117, 42, 84,168,208,
- 18,213,212, 10, 30,184, 91, 93,187,118,173,213,149, 43, 87, 90,161,174,148,255, 56,159,170,133, 29,160,133,179,175,142, 76,157,
- 58, 85, 57, 58,101,204,152, 49,130, 71,144,228,201,147,231,136,164, 65,144, 5,250,226,217,179,103,202, 59,122,253,198,161,187,
-238,247,174,120,145,110,194, 45, 86, 32,117,255,226,133,210, 76,144,161, 88,190, 84,253, 45,180,111,189, 40, 33,202,142,193,123,
- 23,156,105, 94, 52, 11, 0,173, 23,101, 96, 26,147, 73,135,175,233,201,185, 3,192,245, 56, 76, 62,255, 34,156,198,239,135, 12,
- 0,195,167,177,240,226,179,113,140,227,138,171,205,171, 59,159, 4, 85,247, 54, 68,237, 21,184,202,103,219,189, 83, 63,223, 86,
-238,248,111, 21,108, 25,245,163, 48,242,207, 48,159, 6,244,120, 70,226, 62, 4,246, 63, 58, 91,180,114,121,106,159,244,130,253,
- 13,194, 24,244,173,229,184,207, 64,104,135,144,213, 69, 56, 29,192, 2,199,135, 53,248,159, 78,175,236,104, 67, 59, 75, 22, 73,
- 23, 88,178,240,139, 80,188, 80,106, 45, 48,177,146, 71,198, 9,149,207,168, 81,163,142,170, 93,187,246, 93,142,203, 60,126,136,
- 99, 61,143, 68,122,252,248,177,114, 84, 16,255,171, 3,193,129,135,182, 68,233,208,187,160, 57,161,113,227,198,119, 72,147,199,
- 25,113, 46, 97,255,230, 41, 0,193,193,193,238,121, 69,254, 32,232,242, 64,211,253, 10,237,120,106,147, 38, 77,148, 57,132, 71,
-187,108,222,188, 89, 28, 61,122, 84,249,134, 54,160,127, 92, 48,161, 25, 13,249, 28, 91,175, 94, 61, 37,159, 91,183,110, 21, 65,
- 65, 65, 94, 41, 59,142,153, 81,104,238,221,187,215,205, 79,242,128, 60, 85,135,167, 79,159,242,240,115, 75,252,196, 25,129, 10,
-205,128,128, 0, 37,159,172, 27,214, 83,120,234,232, 53,164,105,181, 29,191, 25,241, 0,180, 78,223,191,127, 95,172, 90,181, 74,
-252,243,207, 63, 98,207,158, 61,130,147,225, 71, 31,125, 68,176,101, 85,178,165,238,212, 83, 37,200, 98, 99,105, 28,199, 71, 12,
- 77,224,163, 52, 58, 94,199,143, 31, 23, 9, 19, 38,124, 98,129,123, 33, 6, 10, 72, 89,154, 98,240, 63,145, 42, 77,150,251, 87,
-174,222, 9,226, 29, 82,151,211, 50,164, 74,235,122,142, 59,158,157, 0, 72,104,170,243, 13, 55, 77, 28, 44,123, 80,230, 41,212,
-104,224,225, 1,121,133, 65,224,152,222, 32,201,103, 88,205,157, 99,135,224, 32,195,193,134, 29,140, 29, 79,118, 20,118, 28,210,
-184,119,239,158, 2, 54, 0,110, 4,211,120, 26, 40, 60,209, 36, 45,126, 71, 94,252,142, 5,154,138, 36, 75,130, 44, 2,173, 65,
-131, 6,181,154, 49, 99, 70, 43, 28,178,219,106,227,198,141,173,118,237,218,213, 42,126,252,248,182,128, 22,120,122,132,160,154,
- 39,183,223,186,117, 75,180,106,213, 74,228,205,155,215, 13,164, 48,200, 30,225, 32,140, 83,219,197,134, 13, 27,148, 67,125,113,
- 78, 86,164, 7, 90, 4, 88,224,161,159, 12, 85,202,103,255,181, 88,193,180,227, 95,132,212,227, 75, 20, 78,205,251, 56, 6, 76,
-156, 99, 11,231, 77,213,215,160,253,135,104,243,148, 46,168, 23, 65,102,237,148,109,141,105, 76, 38,157,234,185,115,231,126, 52,
- 97,194,132, 96, 30, 15,131,186, 86, 38, 30, 78,188, 12,219,183,111, 23,219,182,109, 19, 91,182,108, 17,139, 22, 45, 10, 46, 87,
-174,220, 99,208,171,110, 68,147, 18, 44,130,171,223,127,246, 81,178,199, 59,255,243,249,107, 46,209,202, 6, 62, 60, 96,127,100,
- 91,133, 20,246, 62,202,104,229,112,106, 61,160,149, 8,105,167,247,232,209,227, 25, 23,147,236,147,172,139, 27, 55,110, 40,188,
-196,145, 36,193, 4, 95, 8, 51,249,189,127,255,253,151, 99, 43, 29,175,202,203, 77,179,100,145,244,129,234,122,254,184,114,158,
-155, 37, 10,167, 13,100, 40, 94, 72, 27,210, 4, 22,205,255,129, 17, 16,211,230,115,200,231,159,127,126, 93,210,110,222,188,185,
-114,198, 35,243,247,223,127,255, 41, 32,230,212,169, 83,202, 17, 73, 28,255,201, 19, 15, 64,139,210, 23,170, 8, 71, 54,108,216,
-208, 77,179,111,223,190, 10, 45, 46,180, 88, 78,246,117,237,101, 5,104, 17,100,213,170, 86,205,157, 52,103,186,116,162, 43,206,
-205,235,251, 85,115, 49,236,219,182, 74, 24,218,174,173, 24,211,161,189,114,106,128, 9,208, 34, 32, 28,129,115, 54,175, 73,130,
- 92, 4, 18,188,177,236,251,247,239, 15, 81,118,142, 95, 86,203, 14,154,238,178,119,236,216, 81, 57, 90, 10,227,166, 50,199,177,
- 29, 72, 62,146, 23,108, 15, 30,202,238,230, 39,128,176,155,102,187,118,237,196,210,165, 75,149, 62,186,111,223, 62,113,228,200,
-145, 48,213,209,107, 74,211, 2, 4,120,179,162, 80, 58, 67, 41,205, 94, 0,153,179, 95,126,249,165, 82,177, 60, 58,131, 3,131,
-197,162,202, 78, 29,133,234, 66,117,231,170, 19, 59, 36,208, 98, 3, 68, 71, 10, 11,208, 58,177,191,125,251,160,134, 85,191, 12,
- 90,226,191, 45, 40, 83,154,108, 65, 23,198,143, 15, 58,254,221,119, 65, 71,218,182, 13,106, 88,177,209,139,231,169, 50, 7, 29,
-255,241,251, 32,172,202, 79,120, 2, 90,144,164,156, 36,208, 97, 71,179, 19,120, 36, 8,128,226,126, 35,160,133,242,159, 35,240,
-225, 10,135,160,213, 44,184, 58,181, 71,160,229,137, 38, 0,146, 2,228,120,166,156,252,150, 5,154, 81,169, 46, 36,192,146, 1,
-167,176,183,194,196,216, 10, 96,187, 53, 38,222, 54,200,127, 27, 72,210, 90,161,156,158,108, 45, 66, 12,230,152,172,142, 80, 26,
-122,251,246,109, 5,100,241, 82, 3,173, 52,105,210, 28,225,228,195,213, 41,207,151, 35, 32, 84, 75,188, 92, 60,141,124, 18,173,
-130, 33,129,214,161,125,171,253, 14,237, 89,229,119, 0, 97,255,238,191,252,246, 7,252,229,183, 47, 96,165,223,158,157,203,253,
- 86, 46, 30,233, 87, 36,111,170, 9, 86,129, 22,121,200, 73,144,225,216,177, 99,202, 32,206, 1, 87, 30,107,115,242,228, 73,101,
-240,101,224, 69,181,141, 39,160, 5,128, 29,192,180,189,123,247, 22,101,202,148, 17,101,203,150, 21, 85,170, 84, 17, 24,140, 69,
-203,150, 45, 5,192,130, 24, 54,108,152,152, 57,115,166, 2, 8, 40, 61, 0,224, 14, 48,162, 73,117, 33, 37, 89,234, 62,127,227,
- 72,255,199,124,254, 26, 3,173,108,104,151,215, 8,136,120, 30, 97, 96, 96,160, 32, 31,113,228, 15,143,226, 49, 3, 91,161,218,
- 39,206, 53,220, 72,137, 61,129,197,245,235,215, 21, 9, 62, 37,247, 28,235, 72,251,238,221,187,226,175,191,254, 98,221, 60, 32,
-159,200,127,124,103,137,222, 24, 82, 2, 82, 44, 53, 47,207, 30,223, 36,206, 28,219, 36, 78, 31,219, 40, 78, 29,217, 32, 78, 30,
- 89, 47, 78, 28, 90, 39,142, 31, 90, 43,182,173,157, 38,138,229, 79,173,173,239, 80,224,141, 15,208,247, 20, 73,150,188,122,245,
-234, 37, 86,175, 94, 45,118,239,222, 29, 10,100,221,188,121, 83, 1,139, 30, 36, 48, 4, 47, 49,160,222, 10, 65, 19,224, 93,233,
-215,228, 1, 23,177, 92,108,174, 95,191, 94, 84, 41, 95, 66, 52,172, 95, 71,121,110, 6,180,168, 46,252,226,139, 47, 94,172,202,
- 93, 87,195, 10, 21,196,250,177, 35,197,145,249,211,197,141,213, 11,149,112,253,239, 69,226,159,145, 67,205,128, 22,199,174,119,
-180,101, 31, 63,126,188, 88,177, 98,133, 2,138, 56,246,147, 7, 92,100,112,113,193,179, 47,195, 82,246, 1, 3, 6, 40,105, 57,
- 14,179,238, 89,239, 28,135, 9,178,228, 98,201, 67,217, 21,126,106,243,233,235,235, 43,176,240, 85, 22, 63, 60,227,147,109,244,
-231,113,189, 67, 4,179, 58,178, 66, 83,130,107,171,245,174,165, 89,189,122,117, 81,180,104, 81,241,225,135, 31, 10, 44,204, 20,
- 33, 77,197,138, 21, 69,165, 74,149, 4, 1,189, 1, 63, 13,161, 5,170,189, 8, 66, 13, 85,168,232,250, 45,239, 69,152, 88, 39,
-158,124, 30, 93,245,174, 42,126,151, 52,160,103, 68,167,168,134,182,252,174,204,147,146,206,240,162, 36,193, 21,202,170, 34,101,
-128,180,104, 10,109,180, 24,208,208,149, 21, 46, 43, 23,170,132,219,242,185,250,238,178,227,122, 95,231, 67,209, 96,227,243,148,
-200,158,146, 44,130, 44, 2, 1, 54,190,165, 73,125,196,159, 8,156, 92, 81, 81,193,210,118, 11,224,206,146,237, 22, 85, 26,199,
- 59,117, 10, 26, 19, 55,105, 80, 70,132,134,239,127, 16,180,183, 92,153,160, 13,209,125,130, 54,197,136, 18, 52, 41,113,178,160,
-204,239, 37, 13,106,154, 58,117,208,185, 46,223, 4, 65, 61,121,198, 4, 36,186, 1, 38,226,237,181, 17,168,110,164,218, 81,247,
- 66,195, 63,199, 1,151,237, 32, 74,148, 40, 2,252, 16,200,187,128,132,141, 0,141, 18, 7, 14, 54,228, 1, 7,118,185,122,242,
-120,160,173,154, 38,233, 2, 68,114,181,169,240, 85, 2, 45,254,199,132,104,149,102, 84,218,100,161,131, 41,146, 44,130, 44, 74,
-179,176,194,109,141, 65,238, 76,139, 22, 45,158, 55,106,212, 72,177,167, 67,253, 60, 66,254, 31,225,247, 35,208,191,238,137,167,
-176,201, 58, 66, 73, 29, 37, 90,188,180, 18, 45, 76, 72, 71,216,169, 9, 24, 56,232,114, 32, 86, 3, 49,147,250,122,109, 95, 99,
-178,155,176, 31, 64,202,111,106, 39,191,217,147,191,243,155, 57,177,131,223,140, 9,237,252,166,141,105,231,247,117,205,130,187,
-106,229,120,255,202, 39, 57,146, 95,249, 36,219,139, 80,250,253,216, 23,203, 38,137,177, 14,225, 59, 79,133,162,116,138,124,228,
- 0,203,186,238,215,175,159,104,208,160, 1, 85,239, 2,253,135, 19,161,128, 45,156, 50,152,113, 66, 51, 0, 90, 33, 62,129,246,
-248, 45, 0,148, 34,205,234,208,161,131, 64,125, 43, 32,235,211, 79, 63, 21, 92,100,113, 2,230, 68,180, 96,193, 2,101,112, 71,
- 8, 70, 27,248,214, 40,159,122, 18,173, 61,115, 99,222,252,165, 83,130, 29, 37, 11,167, 93,132,176, 16,146, 24, 37,148, 44,148,
-246,143, 34,224,149, 26,128,189,130, 74, 13, 1,178, 36, 96, 37, 40,226,196, 11,233, 8, 77, 18,204,192, 86,136,108,163, 13,159,
-167,244,130, 19, 54,219, 60,251, 53,164,234, 55, 96,175,248,156,255,201, 71, 2, 58, 78,238, 6, 64,203, 77,143, 82,171, 83, 0,
- 83,107,150,245, 23,171,151,244, 19,127, 47,234, 35, 86,254,225, 43,150,255,254,147,240,159,247,163, 88,234,215, 83, 44,158,221,
- 67, 44,252,237,123,177, 96, 70, 87, 81,212, 24,104,133,200, 35,237,104, 88,190,182,109,219, 42, 32,123,250,244,233, 10,176, 32,
- 48, 34, 72,151, 18, 24, 57,217, 18, 40,233, 0, 3, 73, 83, 1, 6,180,157, 98, 90,130,140, 73,147, 38, 41, 96,146, 82,106,142,
- 1, 82,202,142,177, 68,220,220, 48, 78,236,154,212, 74,124, 88,172,128, 39,154, 10,109,140, 17, 65,106,144,197,223,157,234,214,
- 21,155, 39,141, 22,199, 23,205,112,191,186,241,207, 66,241,207,104, 67,160, 37,243,169, 72,138, 96,107,122,133,115, 26, 15, 60,
- 30, 57,114,164, 34, 37, 98,251,102,221, 19, 20,179,110,102,207,158,173, 0,130,137, 19, 39, 42, 32,209,172,236,228, 39, 23,211,
- 93,187,118, 21, 63,255,252,179,152, 53,107,150,216,177, 99,135,178, 16,162, 68,143, 32,139,244,168, 97, 72,157, 58,181, 50,254,
- 91,161, 73,192,247,221,119,223, 9, 74, 7,167, 76,153,162,244,107,126,135,121,101, 29, 37,204,233, 19, 34,120,131, 38,219,174,
-157,122,103,217,205,242,105, 70,211, 0,139, 40,245, 70, 80,196,155, 12,242,191,230,110, 20,143,207, 43,116,239,222,189, 7,211,
-151, 40, 81,130,154, 6, 79,244,116,233,200,244, 47,178,163,155,222,120,232, 98,225,248, 86,222,241, 51, 3, 78,220,190, 78,201,
-142,250, 34, 34,167,116,132,192,128, 43, 91,118, 30,181, 10,131, 43,106,164, 29,173,243,165, 40, 4, 78,108, 96, 84, 23, 50,112,
-130, 32,125,127, 23,208,226,187, 33, 67,134,132, 80,119,113,194,229,115, 79,182, 91, 84, 17, 18,104,173,139,234, 19,180,239,163,
- 50, 65,255, 85, 40, 19,180, 45, 97,204,160,109,113,163, 4,237,136, 31, 53, 40, 32, 81,212,160,227,181,202, 5,157, 64, 56,254,
- 81,126, 2,173,211,175, 96, 16,247, 33, 40,162,152,152, 29,142,128,194, 44, 80,250, 3,144,116,222, 83, 94, 61,209,100, 39,231,
-247, 56, 25,203,111, 89,160, 25,133, 70,239,136,167, 0, 44, 74,178, 8,178, 96,107,113,254,167,159,126,122,206,250, 98,157,115,
-194,101,135,225,192, 65,123, 42,240,244,145,167,124, 82, 13,200,182, 37, 65, 22,239,106, 32,133,137, 71, 81, 45, 50,127,242,122,
- 19,128, 22,193, 67,192,182,101,126,191,142,108,227, 55,121, 68,107,191,137,195, 90,250,141, 27,210,220,175, 85,213,252,187, 62,
-122, 63,246,147, 7,107, 23, 9,134, 27, 63, 53, 14, 17,202, 38,137, 30, 88, 54, 81,244, 98, 70, 60,165,116,138,124, 34,239,209,
- 79, 21,213, 62, 37, 76, 4, 90, 28,136, 41, 69, 97, 96,253,112, 5,205, 75, 71,221,163, 37, 31, 3,246, 92, 7, 48,241, 60,151,
-105, 57, 41,176,127,179, 29, 81,250,194,137,135, 99, 0, 86,211,207, 17,247, 32, 39, 85,163, 60, 74, 27,173,221,115,222,185,113,
-239,228,144,167,151,215,165,191, 19,184,163,206,169,147,123, 38,111, 63,180,127,245,186, 67,251, 86,173, 59,184,103,213,186,255,
-118,175, 90,183,115,203,162,117, 69, 11,164, 94,252, 10,129,150, 27,100,113,193, 71, 96,192,114,115, 18,227,111,242,150, 0, 20,
-124,183, 11,182, 26, 99,194,187,129,201,148, 38, 5,180,209, 74,232,226, 23, 15,214,253, 23,139,170,103,180, 93,164, 4, 73, 5,
-180,252,245,120, 90,188, 96,154,192,163,255,173,209, 5, 85,243,167,117, 17,115,167,116, 18,115, 38,127, 39,102, 77,108, 47,102,
-142,255, 86, 20,201,151,202, 72,162, 21,130, 60, 13,223,105,127, 69, 9, 9,219, 17,129, 7,199,102, 45,200, 34, 72,146,210, 40,
- 15,147,184, 2, 96,104,248,206,184, 4, 2, 4,147,108,167,178, 45, 73,251, 44,218,232, 54,174,144, 75, 60, 88,214, 65, 28, 28,
-223,192, 20,104,113,113,193, 58,200,159, 41,147,104, 14,245,225,247, 88, 88,140,106,223, 78,236,153, 57, 73,156,245,159,243,127,
-160,181,230, 15, 43, 64,139, 60,136, 70, 67,117, 74,150,152, 23, 74,107, 71,140, 24, 33, 70,141, 26,165,244, 25, 2, 12,182,121,
-140,123,162, 91,183,110,162,125,251,246,202, 2,208,172,236,164, 73,126,178,221, 80,146, 69,144,197,121,145, 96,136, 82,123,206,
-103,108, 91, 92, 80,150, 47, 95, 94,249,134, 21,154,204, 39,213,154, 4,229, 4, 89, 4,239, 28,215, 57, 30,115, 44, 38,208,178,
- 83, 71,178,236,146,102, 7,223, 9,162, 88, 93, 95,145,239,147, 94, 34,125,133,238, 33, 66,201, 6,131, 44,151, 93,230,147,210,
- 44,128, 25, 1,115, 33,165,156, 48, 71, 81, 36, 89,148,146, 87,173, 90, 85, 89,116,235,241, 83, 7,139,184,219,171, 26, 80,241,
-183, 25,208,146,113,112, 47,164, 6,106,170,231, 10,208,210,251,111, 49,190, 34,209, 82,209, 80,190, 99,120,105, 11, 71, 73, 22,
- 27, 0, 43,145, 8,149, 43, 30,118, 26, 6,234,218, 33,197, 80, 86,184, 84,151,241, 61,159,177, 67, 17,132,225, 35, 90, 3,110,
-229,187,220, 89,200,134,192, 70,198, 64, 73, 22, 65,150,188, 40,237,161, 20,102,254,252,249, 74, 99,218,180,105,147,162,127,230,
- 32,135,149,135,161,145, 60,129,214, 31,181,106, 6,141,133,244,106,124,172, 40, 65, 19,226, 64,138, 5,144, 53, 57,126,148,160,
- 41, 9,163, 4, 77, 75, 28, 53,104, 70,178,168, 65, 51,147, 71, 13, 90,152, 51,137, 93,160,101,102, 24,175, 53,128, 55,228, 49,
- 58,211, 57,150,155,188,163,132, 9, 13, 93,145, 62, 97,194, 18,216, 65, 35, 0, 54, 68,246,236,217, 5,236, 67, 4,236,227, 20,
- 16,106, 6,180, 36, 77, 86,180,107,101, 68, 35,114,133,103, 18,104, 97, 37,168, 72,201,172,210, 36,208,194, 32,163,216,100, 81,
- 93, 72, 73, 22, 68,213, 10,200,226, 32,193, 65,233,235,175,191, 86, 6,102,170,146,217, 54, 80, 63, 30,129, 22,164, 1,255, 2,
-108, 29, 84, 7, 62,147,204,194, 32,186,137, 96,140,224, 74, 6,148, 77,187,235,208, 99, 27,126, 29, 95, 22,130, 42,112,219,134,
- 69,126, 35, 7, 53,245,235,215,163,182, 95,239,110,159,250,253,216,169,166,223, 39,121, 82,156, 90,245,203, 15,162,111,206,248,
- 74, 8, 90, 61, 75, 92,174,157,210, 29,110, 14,250, 66,148, 77,242,238, 18,163, 50, 73,160,197, 9, 17,210, 66, 5,252,204,153,
- 51, 71, 89,233,177, 63, 18, 96, 17, 20,113, 48,103,176, 8,180,248,185, 4, 48,200, 62,134, 85,120, 48, 7,114,218,203,177,158,
-185,202, 7,240, 22, 99,199,142,165, 26, 49, 24,109,152,192, 33,129, 39,158,203, 93,135, 67, 32,193,186,184,163,249,209,237,139,
- 42, 30, 92, 62,187,201,118,191,201, 29,215,205,154,212,126,221,111,227,219,175,155, 62,190,221,186,105,163,191, 94,247,235,232,
-182,235,138,228,251,224,149, 1, 45,140, 33,171, 57,222, 17,100,177,188,224,193, 35, 9,124,248,155,207, 8,186, 40,145,135,212,
- 88,109, 30, 16,166,102, 71,163,119, 78, 72,234,139, 96,214,165, 58,164, 65,124,168,171, 88,254, 52,129, 7,118,255, 37, 8,170,
- 38, 13,111, 37, 70,255,252,165, 24, 49,224, 11, 49,180,111, 99, 49,216,183,190, 24,248, 99, 93,129, 54, 38,124,187,125, 42,126,
-236,252,177,248,176, 72,218, 7, 5,243,164,184, 87, 32,247,251,247, 10,229, 73, 97, 40, 25,231,230, 28, 2, 3,182, 27,105,239,
-195,197,153, 84,111, 18,112,168, 39,112,230,217, 4, 24, 68,101,251,228, 88, 39, 85, 79, 4, 49, 77, 62,173, 40, 90,212,174, 32,
-190,172, 85, 70, 52,169, 94, 92, 52,172, 84, 64, 52,173,156, 87, 44,243,173, 41, 30,205,111,100, 10,180, 64,243, 50,213,121,189,
- 32,105,221, 1,233,210, 78,132,189,144,236,156,156, 63, 91, 81, 23, 82,146,197,160,168, 14, 71,153, 74,180,200,223, 40,178,236,
- 4,151, 61,123,246, 84, 0, 22,109,170,216, 22,164, 81, 60,165,186,148,194, 81,237,101,165,236,164, 73, 91, 92, 26,172,115, 94,
-164,100,176, 86,173, 90,162,112,225,194,138,105,132,218, 38,153,115, 40,193,146, 25, 63, 73,147,249,225,120, 75,141, 18,231, 97,
-166, 35,128,149,160,144, 64, 75, 2, 97,171,249,212,210, 76,247, 81, 55,145,254,163,239,221, 52,101,189,143,156,249, 98, 33,224,
-141,124,154,181, 37, 43, 64, 75, 13,142,228,111,213, 61,132, 36,202, 5,132,148,254,132,223,229,165, 68,138,119, 9,146, 12,232,
-133,162,163, 1,118,146,166, 27,104,153, 14, 6,218,194, 81, 29, 72,198,178,177,112,160, 1,129,189,152,128, 31, 82,226, 64,155,
- 16,252,191,203,103, 8,199,138, 23, 47,174, 52, 74, 54,168, 78,157, 58,241, 93,103,189, 15, 82,221,164,150,144, 81, 93,200,160,
-190,106,214,172, 41,180,129,104, 29, 34, 73,143, 64, 11, 52,130,144,215, 32, 52,192, 32, 52,238, 32,128,190, 32, 52,196, 32, 12,
- 24, 65,104,140, 65,232,240, 65,152,124,130,144,127, 91, 64,203,204, 48, 94,199, 0,222,144,215, 18, 20,113,240,177, 18,216,217,
- 33,177,242, 40,209,242, 68,147, 54, 81, 4,175,156,116,229,247,172,208,164, 11, 7,238, 50,196,170, 73,177,201,162,186, 80,130,
- 44, 14, 32, 4,193, 20, 97,115,181,198,193,153,147, 61, 36,156, 30,129,150,105, 3,124, 67, 35, 16,104,109, 88, 51,223,111,224,
-143,245,253,186,182,171,230,247,224,222,149, 80,161, 89,201,188, 87,236, 2, 45, 74,167,216,111, 8, 12, 24, 8,166, 62,249,228,
- 19, 2, 94, 5,192, 83, 69, 53,121,242,100, 69, 66, 40,251,156, 5,137,150,172,133,100,160,113,102,218,180,105,138,132,131, 43,
- 94,130, 56,170,128,168, 82, 68, 63, 62,131,136,201,204,170, 76, 74,167,138, 22, 76,189,120,207,142,229, 10,168, 26,216,171,254,
-186,190, 61,234,172, 3,224, 92,215,179,211,199,235,186,127, 87, 99, 93,215,118, 85,214,117,108, 83,113, 93,169, 34,105,255,197,
-102,128, 53, 5,243,166, 92, 83, 56,127,170, 21,102,244,189,249, 30,160, 63,144, 32,135, 70,224, 24,239, 46,129,182, 50,179,184,
-128,207,106, 62,227, 59,142,113,232,147,103, 45,124, 59, 30,226,124,143,192,197,196, 18, 85,152,138,223,202, 14, 67, 74, 37,164,
-122, 82,222, 41,221,194,251, 1,122,244,169, 10,220,179,253, 79, 49,125,220, 55,162, 95,207,218,226,242,185,189, 74,184,164,132,
- 61,226,210,217,255,135,139,103,119,139,139,103, 94,132,189,219,230,139,252,185,146, 27,142,159,156,196, 57,142, 17,196, 80,242,
-162, 7,178,168,230, 82,239, 20,244, 48,225, 50,235, 81, 8,180, 8, 28,217,246, 8,226, 42,127, 88, 80, 60,221,241,171,120,186,
-117,156,120,178,225, 23,241,228,159,222,226,201,138,206,226,209,226, 54,226,241,242, 78,226,241,146, 54,166, 64, 11,237,247, 18,
- 23,144, 67,218,180, 17,103,177, 24, 63, 51,111,158,184,128, 5,192,149, 37,139,197,213, 63, 23,139,107, 43, 94, 4,254, 94, 53,
-220, 18,208,242,145,101, 39,192,164,234,253,179,207, 62, 19, 53,106,212, 80, 64, 85,169, 82,165, 68,193,130, 5,149,197, 47, 23,
-194, 80,135,154,129, 13,165,236,116,227,192,249, 80,238,132, 36,200,162, 10,149,252,165, 52,231,155,111,190, 81,198, 76, 2,187,
-185,115,231, 42,194, 9, 51,126, 50,159, 4, 40, 4, 88, 7, 15, 30, 84,180, 34, 20,130, 72,144,197,119, 4, 90,118,234, 72,143,
-166,148,100, 73,112,109,183,222,213, 52,177,235, 82, 87,146, 69, 73, 23,231,120,170,170,245,192,155, 21,160, 69,192,131, 80, 72,
- 3,124, 72,206,109,191,133,186, 80,255,151, 54, 87, 37,100, 28,249, 94, 19,207, 80,194,165, 77,231,250,175,216,140,169,104,121,
- 30, 26,180,122, 81, 9,180,216, 0, 49,176, 60,226,127, 72, 68, 20, 67, 68, 54,118, 12, 20,244,119,149, 13,131,238, 60,105,224,
-183,112,225, 66,218,135,108,197,115, 58,126, 11,117, 65,226,242,148,226, 99, 45,192, 82,255,167,161, 61,197,195,156,192,217,233,
-169,194, 96, 35,194,247, 13, 7, 10,228,225, 52,129, 22,242, 26,132, 70, 24,132,116, 65, 44, 56, 65, 22, 86,101,202,111,130, 44,
-136,109,131, 64,203, 22,208, 50, 51,140,215, 49,128, 55,100, 52, 6,115, 69,117, 40,237,176,224,242, 64,145, 62, 65,146, 35,242,
-229,203,167,172,120,164,168,149, 29,221,101, 40,168,221,158, 28,130,190,164, 73, 9, 25, 37, 99,180,203, 41, 86,172,152, 34, 74,
-150, 64,139,180, 97, 88,174, 12, 30, 86,104,210, 79, 22,129, 22,234,160, 53, 13,223,105,147,197,213, 45, 37, 89, 82,210, 72,195,
-104,174,172, 56, 96,112,146,112,129,113, 11,243,207,219, 21, 5, 18,133, 9,171,255,154, 13, 41,214,199,126,109,154,126,168,128,
-172,125,155,199,133, 8, 13, 11,166, 11, 51,208, 34,144, 98,224,228, 8,213,188, 98,164,206,254,194,192,186,230,128, 47, 37, 39,
- 58,198,177,158, 42, 35, 53,250,220, 5, 26, 49, 3, 48, 41,118, 59,156, 24,208,135,217, 30, 83, 91,169, 69, 55,208,130, 74,112,
-199,230,165,235,198,255,210, 98, 93,183,246,213,214, 61,184,119,213, 99, 56,127, 98,253,186,252, 57,147,235, 74,117,172,124, 55,
-140,113, 26,130, 63,167, 49,150,236, 70,250, 76, 4, 70, 42,160,181,132,207, 48,182,249, 83,170,130,223,141, 44,124, 99, 0,199,
- 73,237,197,133, 10,104, 80,226,159, 14,129,160,139,180,101, 32, 40, 35, 56, 35, 72, 11,117, 81, 21,184, 99,211, 18, 49,238,151,
-175, 68,183,111,171, 9,240, 81, 28,219,247,187,105, 56,180,115,134,200,151, 35,169,225,248, 73, 96,192, 5, 24, 65, 36,219,145,
-156,192,169,230, 98, 59,210, 78,182,122,147,163, 54,179, 4,245, 28,235, 88, 94, 46,246,168,142,171, 88, 40,163,168, 85, 60,163,
- 56, 52,185,169,120,188, 0, 1, 0, 43,248,230,255,121,100, 2, 54,124, 36,208,226,120, 94, 15,134,213, 12, 93,234,213, 19, 87,
- 48, 46, 49, 44,134,157, 34,159,241,190,106,168, 53,160,165, 46, 59, 85,240,148, 8,113, 92, 86,187,160,224,247,120,201,187, 89,
- 62,169,226,100,159,163,180,137,243, 23,141,193, 37,136, 37, 48,154, 7,128, 72,213, 25,165,196, 92, 32, 17,112,155,209,148,249,
-164,214,136,227,173, 94, 29, 17,104,169,175,176,208,148, 64, 43,172,245,110, 37,159, 90,215, 30,218,124, 90,177,209,114,129, 27,
-183,196, 73,130, 29,214,145,171,158,244,108,175, 66, 72,168,180, 18, 45, 15,233, 66,216,132,105,109,180,108, 1, 45,157,126, 61,
-153, 6,145,108, 32,106,187, 25, 54, 12, 54,160,117,235,214,113,101,123,142, 3, 49,117,249, 68,218, 80, 81, 81,202,197, 1, 68,
-247, 2, 24, 80, 36, 90,158,128,150,158, 68,139,141, 30, 21,104, 10,180, 48, 80, 40, 82, 44,228, 39, 8, 18, 48, 69,178,133,134,
-173,252, 70,227, 84, 64, 22, 58,126, 16, 86,253, 92,145, 26,218,150,104, 50,111,102, 24,239,209, 0, 94, 77, 75,130, 34,174, 22,
-172, 4,174, 4, 49,184, 92,244, 52,168,123,162, 73,160, 69,222,177,254,228,247,172,208, 36,208,162,207, 44,128,214, 86,224,103,
-235,166, 77,155, 62,101,122,170,145,104,111, 32,141,175,217, 54,216,233, 41, 45, 67,253,120,148,104,153, 57, 36,197,251,237,160,
-113, 12,147,221, 49, 0,198, 99,104, 75,199, 48,209,187, 29,154, 90,152,216, 94,203, 40,249,243,188, 63, 97,229,178, 25,126,157,
-218, 84,244,107,244,105, 65,175, 3, 45, 2,106,246, 41, 26,195, 19, 72,115, 98,147,190,117,164,175, 30,105, 67,105, 19,104,145,
-159,153,177, 91,244, 6,193, 53, 37, 45, 72,127,139,207,172, 50, 90, 2, 45,170, 4, 55,175, 93,176,238,151,190,141,215,125,253,
-101, 89, 5,100,237,223, 50,222, 99,120, 5, 64, 75, 91, 44, 45,208,178, 90,108, 25,111, 13, 39, 61,105, 43, 39,239, 28, 83, 93,
-190,178,180,244,232,141,220,227, 85, 56,111,202,192, 77,107, 23,136, 95,250, 52, 18,109,155,149, 81,128, 22, 64,187,165, 96, 6,
-180, 36, 88, 87, 79,224, 4, 95, 4, 89,106, 23, 49,114, 34, 55,155,196, 9,180, 8,176,164, 27, 7,210,104,142, 13, 21,126, 63,
-126, 38, 30,251,127, 43, 30,205,254, 20, 32,235,148,216,117,228,138,104,208,235, 79, 37, 88,160,169, 72,180,228,100,106,118, 55,
-112,239, 16,130,199, 4, 6,178,236,220, 72,132,141, 64,110, 64, 37,203,170,254,142, 21,144, 73,160,197, 69, 14, 53, 9, 4,171,
-172,243,202,149, 43, 43,255,169,122,166,164,139,207, 9,154, 40, 49,230, 98,221,172,236,234,124,202, 58, 90,183,249, 31,241,195,
-144, 78,162,209,183,181, 68,217,218, 5, 20,137,150, 93,160,165,173,119, 9,180,100,189, 47,248, 59, 32,204, 52,225,235, 44,132,
- 77, 22, 37, 89,148, 22,202, 57,222, 72,162,229,169, 19, 32, 51,220,245,167, 72,179, 24, 79,245, 95,187,251, 79,251, 95, 27,159,
- 52, 10, 35, 20,115,209,147,146, 48, 51, 58,252,190, 58, 13,165,106, 33,242,100,214,143,181,239, 51,208,160,145,232,155, 98, 74,
- 54,112,138, 44,201, 36, 78,184,156, 92, 33, 78, 13,230,123, 78,190,240,195,194, 6, 90,223,211, 71,160, 94, 82,108,180,216,129,
-141,252, 84, 81,106, 34,237,178, 8,234,228, 36,129,188,120, 4, 90,136, 23, 4, 41, 76, 16,164,107,138, 20,235,171,175,190,122,
- 4,117,135, 34,197,130,234,235,209, 31,127,252, 17,132,198, 19,132, 85, 86, 16,242, 74, 27,139,158, 54,192,150, 93,222,233,198,
- 7,128, 80,118, 29, 74,137,131,217,157,141,221, 12,104,121,162,201,141, 5,228,181,244,205, 37, 87, 41,102, 52,233,140,148,142,
- 73, 49, 80,209, 57,105,107,216,228, 60,101,135,148, 62,117,216, 22,176, 27,209, 13,178, 88, 79, 88,165,123, 4, 90,102, 14, 73,
- 49,249, 28,145,245,205, 58,167, 97, 60, 93, 66,120,133,241,175,144, 72,254, 92,239, 79, 88,186,104,170, 95,203, 47, 74,249,125,
- 92, 57,155,215,128, 22, 65, 19, 71, 64, 26,190,195,217,162,248,248,227,143,149,129,155, 82, 4,233, 20, 82,235, 24,210,108, 48,
-215, 99, 19,164,216,138,143, 33, 78, 22, 0,191,116,113, 96,249,146, 64,171, 80,222,148,139,215,174,158,187,174,111,247,207,214,
- 53,169, 83,232,109, 1, 90,202,206, 15, 2, 44, 26,186,115, 50, 45, 82,164,200, 51, 48,111, 53, 66, 70, 23, 19,185, 67,175, 9,
-220,104,156,193, 4, 68, 13, 65, 51, 79,204,133,157, 85, 32,248, 40,250,124,255,153,104, 92,187,160,215,128, 22,129, 1,251, 55,
- 39,112, 9, 14, 60,129, 44, 43, 96,131,237, 83, 74, 46,216, 14,191,194,238,215,185, 4, 89, 80, 17,222,152, 84, 9, 54, 89,141,
-149, 9,156, 0, 43, 87,195, 25, 74, 48,107,159, 28,183, 56,246, 84, 45, 91, 75,244,248,122, 64,168,176, 98,209, 63,130,129,239,
-190,172,243,181,145,123,135, 16, 44, 86,151,253,197,188,253,127,201,149, 26,104,169,159,155,229,147,106, 83, 74,180, 8,166, 36,
- 31,105, 72,239,231,231,167,128, 44, 41,177,225, 78, 71,204, 83,202,174, 94, 51,154,218, 58,154, 48,115,164, 24, 48,166,151,232,
- 59,178,135,168,210,184,164, 72, 87, 44,129,200, 94, 38,133, 45, 80,164, 87,239, 90, 35,248, 82, 13,127, 14, 55,205,240,182, 37,
-203, 3, 78, 36,142,152, 1,121,159,140,176,215, 21,214,225,222, 22, 42,138,191, 97, 92,253,148, 58, 88, 2, 35,238,212,192,243,
-233,102,229, 68, 71,185,131, 9,245, 41,165, 83, 4, 78,248,255, 20, 29,242, 41, 38,212, 96,110,171,213,147,102,241, 25, 47,198,
- 53,162, 79,213, 33, 12,127, 21, 73, 22, 36, 47,138, 20,139,192,170, 79,159, 62,138, 20, 11, 13, 59, 8, 70,246, 65,232,240,180,
- 62,101,156, 91, 16,221,210, 59,243,122,179, 60,107,222, 75,195,120,203, 6,240,234,244, 4, 69, 28,116, 8,160,172, 4, 78,154,
-102,160, 40, 34,104, 66,146,212, 12, 82,192, 22, 12,168,175, 22,220,241,201,173,205,224,167, 24, 56,112,160, 2,178,248,159, 96,
-155,224,200,165,142,244, 8,180, 48,144,120,116, 72,138,114, 42,187, 14,105,239, 71,245, 41, 13,177,233, 18,194,102,253,188,118,
-209,243,231, 72, 54,241,223,213, 75,253,122,247,104,225,247, 67,215, 70,126,247,239, 92,242,138,234, 80, 2, 45,233,189, 91,110,
- 48, 49,186, 91,153, 28,245,152,151, 63,127,126, 5,104,209,136, 55,172, 64, 11, 54, 87,139, 87,173,152,181,174, 59,212,134,159,
- 86,205, 25,233,128,150,107,167,225, 18,240, 71, 29, 20, 91, 43, 15, 13, 78,145,136, 17,104, 81, 26,200,182,205,190, 66,187, 57,
-172,236, 31,102,202,148,233, 40, 0,242, 67,170,122, 57, 38, 80,165,132,190,236,209,246,171, 96,238, 20,129,224,163,248,190,125,
- 53, 81,171, 74,118,175, 3, 45, 53,200,162, 84, 84, 79,146, 37,103, 93, 51, 96, 32,219, 39,227,255,240, 67, 79, 49,239,199, 79,
-197,227,133, 95,138,201, 95,229, 18, 65,227,138,136, 71,191,125,108, 27,104,225,155, 10,208,106,220,168,147,152, 60,225,223, 80,
-225,223, 53, 7, 5, 3,223,253,208, 99,162, 45,160,197,178, 19,104,153, 5, 43,253, 72, 2, 45, 53,192,160,244,159,234, 66,130,
- 47, 2,173, 46, 93,186, 40,139, 35, 74,180, 40,149, 54,227,167, 4, 69,178,142, 8,174,138,127,146, 83,148,172,149, 91,100, 43,
-155, 66, 36,207,247,174, 24, 63,115,120,152, 64,145,186,222, 37,208,146,132,236, 74,180,212,249,164,107, 25,150, 89, 45,201,146,
- 82, 44,117, 70,205,202,254,218, 13,234, 47, 49, 67,223,115, 7, 18,141, 67,169, 86,224,142, 54, 76,206,199,105,199,197, 35, 58,
-144, 15,195, 99,104,244,242, 8, 9,202, 19,118,108,173, 93,150,166, 50,212, 64, 43,132, 99, 64,164, 63,141, 1, 45, 8,187, 67,
- 20,213, 33,164,101,138,244,138,119, 74,186,176,194, 87, 0,150, 54,192,151,149, 90, 53,101,234, 12, 83, 26,198,219, 48,128, 15,
- 65, 19, 62, 83,206,113,149, 71,255, 57, 28,116,121,247, 20, 24,151,118, 9, 26,158, 69, 56, 77,109, 29,209, 79, 22,119,176,113,
- 99,132,180,201, 82,131, 44, 74, 80,208, 89,180, 64, 43, 68, 62,205, 28,146, 66, 5,122,132, 3, 59,237,243, 40,209,228,247,116,
-220, 59,152,214, 81, 24,250, 64,132,210,204,147, 61, 73,139,170, 31,229,153, 25,120,233,180,223,237, 27,167,253, 86, 45, 27,237,
-183, 96, 70,143, 16,225,179,220,169,220, 54, 90,220,109,200,221,135, 58,187, 14, 67,228,147,131, 19,251, 7,219, 15, 39,115,179,
-182,100, 48, 65,152,150, 93, 13,180, 32,193,182, 34,209,114,211,148, 18, 45, 0,132, 37,155, 55, 44, 95,215,167,103,203,117,189,
-186, 53, 94,119,255,238, 37,187,170, 67,211,124, 70, 64,189,247,164,119,112,170,159,244, 60,240, 83, 98, 65,131,118, 15,125,211,
- 13,180,208,127, 30,114, 55, 53,109, 89,217,239,229,174, 43,130,100, 78,198,124, 78,191, 72,112, 24,187, 82,167, 28,238,178, 67,
- 58,122,101,211,250, 63, 69,239,158, 45,196,143,221, 26, 9,128,118, 75,106, 67,170, 23, 53,170,195, 16,252, 36, 48,160,250,153,
-121, 99,126,204, 64,150,149,182, 36,219, 39,227, 86, 44,154, 67, 60,158, 87, 95, 76,250, 50,187,200,153, 35,187,216,209, 37,173,
-120, 48, 36,157,120,126,229,160,153,234, 80,219,230, 47,208, 76,197, 8,104, 45,247,223, 35, 24, 76,128,150, 97,217, 9,178,212,
-146, 43, 27, 18,173, 16, 52,169, 54,101,221,178,141,112, 28,163, 20,171,115,231,206,138,173, 35,165,206,148,100, 81,128,192,121,
-196, 3,112,245, 88, 71,171,215,175, 16, 69,107,102, 19,197,106,230, 16,159,182,172, 40,182,239,217, 28, 2,100, 89,169, 35,189,
-122,215, 2, 45, 45, 81, 29, 80, 20, 17,109, 41, 12,221,249, 13, 76, 2,137,212, 94, 14, 14, 52,158, 36, 66, 87,175,124, 56, 40,
- 97, 0, 82,123, 94, 55, 29, 36, 97, 51,245,132,131, 15, 85,147, 20, 95, 83,140, 45,105, 74,137, 22, 38, 98,143, 64,139, 32, 10,
- 59, 30,131,170, 85,171, 22, 4, 49,124, 16, 86, 11, 65,216,237, 17, 4,177,108, 16,118,146, 40, 32, 12,103, 58, 5, 53,107,214,
- 44, 8, 82,154, 19, 46,144,165,246, 87, 99,154, 79,105, 24,111,195, 0, 94,219, 8, 55,129,103,161,207,158, 8,213, 69, 94, 60,
-128, 29, 28,165,126, 90,169, 91,132,211,212, 54, 89,128,231, 71, 92,117, 25,129, 44,230, 21,171,113,143, 64,203,204, 33, 41, 15,
-145,102,253,151, 44, 89, 82,217,237,195, 21,254,155, 0,180,200,203,124, 57,147,117,131,157,210, 28,248,212,154,147, 47, 71,178,
- 80,225,195,247, 99, 41, 64,203, 5,174,148,187, 25,208,130,196, 96, 35,140,104,159, 26, 52,157, 80,143, 25,151,105, 60,129,118,
-189,161, 10, 27, 41, 20,137, 22,119,152,162, 95,135, 9,104, 21,200,245,126,215, 26,149,243,175,190,121,237,210,186, 91,215, 79,
-175, 3,216, 92,247,251,204,158,186, 97,169,223, 79,235,106, 86,206,249, 79,209,124, 41,167,169,242, 99,218, 55,195, 48,204,154,
-209,140, 15,126,253, 7,201,120,168,157,129, 4, 95,148, 68,233,216, 90,169,105,142,160, 61, 36,205, 42,144,183,223, 16,166,176,
- 93, 83,250, 79,251, 86,110,205,231,157,155,127,240,156,199,240,204, 71, 72,226, 9,104,229,203,153,124, 82,141, 74,249, 30,221,
-184,134,163, 96,174,159, 22,224,163,248,125, 70, 15,143, 97,137,223, 79,162,102,165,156,143,139,228, 75,185,215,136,159,156,112,
-165, 73,135, 52, 94, 55,107, 87,102, 19,174, 26,104,209, 37, 72,245,226, 89,176, 99,181,189, 34,205,105, 93, 44,150, 8,234, 19,
- 95, 60, 28,147, 79, 60, 15,220,111, 25,108,128,166, 2,180,190,108,218, 93,145, 88,105,195,224, 65, 51, 5,131,124,110,225, 8,
- 30, 30,139,230, 46,187, 90,154,165, 46,191,246,185, 89,217, 9,180, 56, 15,114,211, 19,125, 72,113, 19, 9,213,134, 4,178,148,
- 96, 81,210, 35,253,166,217, 1, 90,222,174, 35,189,122,247, 6,208,178,146, 79, 74,182,194, 98,163, 21,134,126, 30,121,147, 96,
-229, 53,131, 13, 94,138, 28,185, 26,146,129,210, 8, 12, 64, 60,140, 85, 94,102, 3,154, 15, 84, 84, 79,216, 8, 41, 22, 38,112,
-211, 91, 65, 66, 26,100, 8,180,120,164, 14,210, 7, 45, 91,182, 44, 8, 91,209,131,160,206, 12,194, 89,108, 65,216, 5,169,168,
- 16,177,187,195, 29,104,183, 5, 85,152,199, 35,120, 60,212,140, 52,140,183,106, 0,175, 45,123, 92, 76, 86, 91,216, 81,173, 4,
-116, 88,238,224,140, 99, 50, 57, 70, 4,205, 16,159,164, 51, 82,214,181, 52,124,151,234, 66,245,121,101,168, 31,143, 64,203,204,
- 33, 41, 15,157,230, 38, 11,174, 0,229,245,166, 0, 45,179,158, 78, 79,240, 4, 90,240,155,117,134,113,121, 55, 3, 90,136, 22,
- 27, 64, 96, 29,165,164, 86, 2,227, 50,141, 93,160,197,227,104,176, 10,127,142,250,161,243,203,210,102,101,193,251, 80, 18, 45,
- 74,182, 0, 54, 7, 23,205,159,118,109,209,130,105,215, 2, 48, 24,133,127,105, 4, 95, 24, 32,139,105,236,140, 33, 22,242,165,
-141, 98, 58, 46, 33, 65,124, 4,218,114, 46,209, 9, 60,143, 48,157, 7,126,166, 35, 16, 83,237, 48,100, 84,154, 30,116, 39, 45,
- 24, 93,239,192,125, 17,194, 96,215,115,163, 34,132,200, 39, 36, 83, 43,138,228, 75, 29, 92, 36,127,154,231,121,115, 36,243, 24,
-192,243,103,148,100,105, 64, 22,191, 19, 74, 2, 35, 15, 40,214, 59,131, 80, 15,116,153,129, 13, 53,208, 82,167,167,148,158,134,
-225, 51, 62,143, 45,130,250, 37, 22, 65,125,227,139, 7,163,242, 40,193,140, 38,207, 45,228,188,163,117,137,225,233,191,217,161,
-210, 4, 69,178,236,224,139, 87, 36, 90, 84,155, 82, 80,192,147, 63, 40, 33, 36,168,166, 11, 7,238, 46,164, 6,136,238, 30,184,
-112, 85, 95,102,101, 87,231,211, 91,117,164, 71, 51,188, 64,203, 75,249, 12, 67,119,126, 51,147,164, 69,177,230, 96,167,216, 62,
-128,174,125,104, 80,251,112, 2,250, 94, 72,137,246,226,185, 22,132,152, 14,104, 24,140,238,208,125,131,214,118, 11,141,239, 41,
- 36, 37, 79, 9,178,224,203,132,198,162,242, 10, 65, 19,187, 25,191,130,250,240, 4, 61,190,171, 3,158,159,150, 1, 82,179,211,
- 12, 4, 89, 0,118, 95,233, 84,139,105, 62,195, 80,149,111, 4, 77,212,205,117,250,201,162, 11, 7,238, 46,164,225, 59, 93,126,
- 80, 93, 72, 73, 22, 65, 22,164,125,218, 35,120, 66,148,221,204, 33, 41,104,254,139, 58, 54,116,104,234,226,253, 27,193, 79,109,
- 59, 42,155,244,221, 25, 18,100,201,119,252, 95, 54,113,244,145, 70,109, 62, 12,109, 81, 47,137, 41, 63,177,136,185,128, 62,195,
-115, 77,181,128,223, 20, 24, 88, 57,207,208, 83,156, 87, 93,246, 48,240,216,148,159,175, 35, 77,244,235,157, 4, 7, 12, 86, 22,
-128,140,131,113, 64,123, 96,117,136,178,243,189, 85, 90, 50,158, 25, 77,140,219,251, 48,145, 95,177, 19, 80,182, 93, 26,158,135,
-200,103,100, 41,123, 68,228,243, 53,166, 25,134,110,226, 36,137,148,131,143,151,170,205, 41,187,151, 24,249, 38, 3, 45,139, 44,
-122, 85,109,201,212,237,128,167,137,204, 98,217,204,162,189,170,178,155,229, 75,251,222,201,167, 93,142,121,142,239,240,243,237,
-228,167,119, 75,253,150, 80,115, 58,139,119, 43,218,225,167,195, 79,111,113,192,105, 75,222,226,228, 11, 58, 14, 63, 29,126,122,
-139, 3,111,115, 91,242, 22, 15, 95, 59, 58,172, 84,189, 96, 39,163, 70, 52, 60, 61, 55,163,239,208,212,175,151,176,214,151,195,
- 79,135,159, 86,219,128,211, 55,141, 57, 96,149,135,234,120, 14, 63, 29,126,234,113,224,109,110, 75,146, 31, 97,157,207,204,250,
-212, 91,245,254,109, 70,230, 78,217,189,219,212, 29,126, 58,252,244, 22, 7,156,182,228, 45, 78, 58,210, 60,167, 45,121,183, 45,
- 57,212,194,192, 1,167, 17,134,129,105, 30,146, 56,252,116,248,233, 45, 14, 56,109,201, 91,156,116,192,134,211,150,156,182,228,
- 93, 14, 56,212,108,113,192,233,128,182,216,101, 26,217,225,167, 41,139,108, 69,112,248,105,139, 93,166,145, 29,126,154,178,200,
- 86, 4,135,159,182,216,101, 26,217,225,167, 41,139,108, 69,136, 8,126,218,202,128, 19,217, 89,229, 69, 68, 35,116,104,122,183,
-103, 57,252,116,248,233, 45, 14, 56,109,201, 91,156,116,230,142,183,185, 45,121,183, 21,189, 37,212,222,230, 6,227,148,221,187,
-141,220,225,167,195, 79,111,113,192,105, 75,222,226,164, 3,138,156,182,228,221,182,228, 80, 11, 3, 7,156, 70, 24, 6,166,121,
- 72,226,240,211,225,167,183, 56,224,180, 37,111,113,210, 1, 27, 78, 91,114,218,146,119, 57,224, 80,115, 56,224,112,192,225,128,
-195, 1,135, 3, 14, 7, 28, 14, 56, 28,112, 56, 96,153, 3, 60,236, 83, 6,203,137,156,136, 14, 7, 28, 14, 56, 28,112, 56,224,
-112,192,225,128,195, 1, 47,113,224,141,198, 34, 44,156,151,248,228,144,113, 56,224,112,192,225,128,195, 1,135, 3, 14, 7, 28,
- 14,216,230,192, 27,141, 69, 28,105,150,237,246,224, 36,112, 56,224,112,192,225,128,195, 1,135, 3, 14, 7,188,200,129, 55, 26,
-139,188,209, 40,210,139,141,192, 33,229,112,192,225,128,195, 1,135, 3, 14, 7, 28, 14, 68, 12, 7,222,104, 44,242, 70,235, 69,
- 35,166, 61, 56, 84, 29, 14, 56, 28,112, 56,224,112,192,225,128,195, 1, 47,114, 32,146, 99, 17,154, 96,169,205,176, 28,147, 44,
- 47,182, 13,135,148,195, 1,135, 3, 14, 7, 28, 14, 56, 28,112, 56,240,118,114, 64, 2, 42,163,251,219,201, 21,167,212, 14, 7,
- 28, 14, 56, 28,112, 56,224,112,192,225,128,195, 1, 47,114, 64, 43,205,122,105, 18, 45,199,145,157, 23,107, 17,164, 28,126, 58,
-252,244, 22, 7,156,182,228, 45, 78,190,160,227,240,211,225,167,183, 56,240, 54,183, 37,111,241,240,173,162,243, 54, 55, 24,167,
-236,222,109,234, 14, 63, 29,126,122,139, 3, 78, 91,242, 22, 39, 29,144,233,180, 37,239,182,165,200, 78, 77,218,105,189, 52,105,
-150,179,202,243,126,147,113, 58,181,119,121,234,240,211,225,167,183, 56,224,180, 37,111,113,210, 1,111,111,115, 91,242,110, 43,
-122,185,212,180,224,234,165,129,173,183,185,193, 56,101,247,110, 35,119,248,233,240,211, 91, 28,112,218,146,183, 56,233,128, 34,
-167, 45,121,183, 45, 69,102,106, 14,208, 50,169, 61,167,179,120,183,121, 59,252,116,248,233, 45, 14, 56,109,201, 91,156,116, 64,
-145,211,150, 94,255,182,228,221, 28,190,124,106,142,234,208, 3,207,157, 14,232,221, 6,233,240,211,225,167,183, 56,224,180, 37,
-111,113,210, 1, 90, 78, 91,122,253,219,146,119,115,248, 26, 81, 99,227,211, 11,118,178,104, 68,195,211,115, 51,250, 14, 77,253,
-122, 9,107,125, 57,252,116,248,105,181, 13, 56,125,211,152, 3, 86,121,168,142,231,240,211,225,167, 30, 7,222,230,182, 36,249,
- 17,214,249,204,172, 79,189,138,247,101,241, 81, 74,180,228,221,177,209,210,212,130,179,210,241,110,179,116,248,233,240,211, 91,
- 28,112,218,146,183, 56,233, 72,180,156,182,244,250,183, 37,239,230,240,229, 82,211, 58, 44,125,105, 95,119, 26,182,119, 89,253,
- 42,248,249, 14,138,192, 96,116,233,189,127, 21,249, 12, 11,167,157,124,134,133,107,158,165, 19,222,165,232,248,167,114,248,233,
- 61, 14, 56,253,221,123,188, 36,165,136,224,167,119,115,248,114,169,169,237,179,180,199,241,232,230, 36, 11,158,206, 64, 88,162,
- 10, 61,116, 98,206,209,196,153,141,255, 76, 43, 47,195,138, 16, 66,188,139,144, 12, 33, 13, 66, 22,132, 76, 8,169, 16, 18, 35,
- 68,247,192,159,136,168, 92,135,166, 62,195, 75,224,241, 32, 87,224,111,237,101,244,254,141,228,103,202,148, 41, 99,231,202,149,
-235,211,199,143, 31,215,223,189,123,119,253,145, 35, 71,214,227,127, 62,183,210,230,195,209,231,223, 72,126, 90,228,199,203, 46,
-123, 21,228,107,157, 43,240,183,213,203, 40,159, 81,226,196,137,211, 33,121,242,228,171,210,166, 77,123, 48, 85,170, 84,135, 18,
- 36, 72,176,250,157,119,222,233, 10,194, 81, 77,136, 27,209,172,149, 56,113, 98,255, 82,165, 74, 29, 5,189, 53,160,209, 28, 33,
- 46,239,252,207,231,124,143,255,181,116,232,191,204,124, 90,229,157, 94,188,151, 93,239, 97,205,171,147,207,176,114,206, 73,231,
- 51, 27, 96, 39,196, 5,158, 44,209,242,229,163,143, 62,186,255,236,217, 51,241,228,201, 19,241,232,209, 35,241,224,193, 3,162,
-184, 25,102,147, 14, 8, 39,217,180,105, 83,161, 60,121,242, 12,196,128,176, 58,122,244,232,119, 25, 48, 0,173,202,154, 53,107,
-255,191,254,250, 43, 39,226,188,103, 80, 15,158, 26,246, 59,160,211, 18,131,218, 18,208, 61,159, 40, 81,162,243,252,141,103,109,
- 64, 43,172,224, 45, 6, 6,197, 78,113,227,198, 93, 21, 51,102,204, 43, 12,252,205,103,160, 25,195, 67, 91,241,148,207, 88, 49,
- 98,196,232,146, 44, 89,178, 85,241,227,199,191,194,192,223,124, 6,122,177,194, 72, 51,172,205,214, 40,159,148, 84, 13, 66, 61,
- 12,101,136, 26, 53,234,144,226,197,139, 55, 44, 81,162, 68,253,146, 37, 75,214,227,157,207,228,123,198, 69,144,146,175, 72, 55,
-248, 36, 77,154,148,109,113,166,167,144, 49, 99,198, 67, 0, 89,226,183,223,126,123,134,201,236,218,180,105,211, 30,141, 31, 63,
-254, 89,142, 28, 57, 70,233,181,249, 36, 73,146, 12, 71,189,206,178, 18, 24,247, 85,214,123,211,166, 15,133, 58, 32, 47,153, 76,
-218,183,233,228, 24, 33, 52, 31, 54, 21, 77, 17,152, 63,222,229,111,155,121,245,212, 62,215,141, 95,125, 87,140, 91,117,151,223,
-216, 96,163, 83,233,210,252,224,131, 15,126,251,225,135, 31,158,254,254,251,239, 98,254,252,249, 98,246,236,217, 98,202,148, 41,
-162,121,243,230,207,222,123,239,189,223, 77,232,235,209,108,249,253,247,223, 95,193,152, 27,204, 1,154,247, 89,179,102,221,142,
- 29, 59,246,126,222,213,207,187,119,239,126, 5,244, 59,107,190,241,178,242,105,131,117,186, 81, 35,221, 24, 18,222, 2,155,205,
-155,225,164, 31, 89,248, 25,206, 98,190,210,228,101,241,117,181,141, 86,111,179,220, 44, 97, 39, 70,164,203, 8, 75, 92,193, 76,
-162,117,249,254,253,251, 76,195,248,242, 10, 85,185, 32,155,190,113,227,198,141, 0, 42,206,126,241,197, 23,219, 48,121,223, 26,
- 58,116,232,133, 97,195,134, 93, 46, 82,164,200,245,134, 13, 27,110,122,247,221,119,207, 86,173, 90,181, 54, 37, 94, 58, 25, 53,
-106, 48,185, 48, 73, 30,157, 58,117,234,227,139, 23, 47, 42,224,143,147,226,169, 83,167,196,232,209,163, 31,227,221,113,208,202,
-101, 80,112, 35,154, 69, 48,128,157,253,229,151, 95,158, 30, 56,112, 64,220,184,113, 67, 92,184,112, 65,252,253,247,223,162, 99,
-199,142,143,249, 14,244,138,216,164, 89, 20,128,242,252,226, 65,131,158, 6, 6, 6,138,167, 79,159, 42,121, 37,221,185, 3, 7,
- 62,229, 59,208, 43,106,147,166, 89,125,122,122,111, 9,104,197,138, 21,107,232,137, 19, 39,126, 57,127,254,188, 18,248,155,207,
-222, 20,160, 69, 48,132,197,130,127,112,112,176,110, 64, 61,249, 3, 92, 62, 98,191,200,155, 55,239, 67, 72,177, 82,231,207,159,
-255,234,225,195,135, 69,206,156, 57, 47,233,181,121,210, 68, 27,244, 71,146, 80, 1, 11, 20,127, 44, 76,252,239,222,189,235,127,
-237,218, 53,127,198,245, 80, 73, 47, 99,144,252, 0,223, 31, 46,193, 17,126, 47, 69, 32,216,138, 98,163,113,105,243,233,109,154,
- 81, 84,224,106,153,234,183,221,188,122,226,231, 25, 2,173,106, 67,174,112, 44, 59, 24,142,178, 43, 73,179,101,203, 22,112,240,
-224, 65,177,118,237, 90,129,197,165,248,247,223,127,197,156, 57,115,196,136, 17, 35, 4,198,185,253, 38,244, 67,229, 51,115,230,
-204, 91,217, 6,255,252,243,207,199,245,234,213,187,139,241,238, 33,255,159, 59,119,238, 57,239,252,207,231,124,207,255,144,184,
-174,215,124, 67,183,236,222,206,167, 13,190, 25, 69,125, 25,109,222, 11,217,140, 16,245,217,219, 92,118,111,212,201,171,162, 97,
-251, 80,105, 9,180,150,200, 28, 67, 42, 84, 32,117,234,212, 51, 83,164, 72,177,138,129,191,249, 76, 85,162, 37,152, 52, 60, 2,
- 45, 74,178, 8,178, 32,105,186,188,107,215,174,195, 0, 44,103,191,254,250,235, 75,120,190,145,129,191, 33,205, 58,179,101,203,
-150, 77,241,226,197,187, 88,174, 92,185,207,240,156, 34,113,245,165,215, 8,115,229,206,157,251,206,205,155, 55,181,130, 56,247,
-255,179,103,207, 10, 12, 82,183, 65, 40,143, 78, 45,232,209, 44,154, 37, 75,150,187, 0, 21, 34, 40, 40, 72, 1, 66, 4, 91,219,
-183,111, 23,219,182,109, 83,194,210, 69, 11, 69,234, 15, 62,184, 3,122,122, 96, 75,151,102,169, 92,185,238,158,243,247, 23, 39,
-199,142, 21,228, 23,243,204,192,223, 39,230,205, 19,199,151, 45, 19, 69,178,101,187, 11,154,122, 96,235,101,116,192,152,248, 54,
- 3,175, 18,148, 90, 17, 80, 53,104,208, 96,232,132, 9, 19,134, 14, 31, 62,124, 36, 3,127,243, 25,223, 49, 14,227,170,248,250,
- 50,242,233,141,206,228,206, 39,129, 14, 1,209,177, 99,199, 66,132,128,128, 0,255, 21, 43, 86,248, 67,138,229, 95,160, 64,129,
- 71,172, 43,180,181, 71,153, 50,101,138, 1,192,117,245,232,209,163, 4, 90, 92,144,200, 43, 20, 77,128, 49,127,117,248,239,191,
-255,252,183,110,221,234,143,201,215, 31,125,192,127,193,130, 5,107, 64,239, 40,232,156, 71, 24,243,254,251,239,167,179,208,230,
-195, 91,126,109, 29,197, 80,129, 44, 46, 74,254, 66, 8, 47,208,242, 54, 77,130, 62, 69,146,133,251,110,121, 15, 67, 94, 61,181,
-207,245, 85, 7, 95, 17, 8,143, 64,151,234, 55,171,151, 17,128,217, 65,160,213,167, 79, 31,209,182,109, 91, 81,187,118,109, 81,
-186,116,105,209,168, 81, 35,129,241,115,175, 9,113, 61,154, 77,208,254,182, 33, 93,111,132, 36, 8, 93,134, 12, 25,114,157, 3,
- 29,239,252,239,122,254, 35, 36,173, 91,241,187,161,149,182, 4,160,229,237,124, 90,229,155, 81,188, 72, 55,134,132,183,192,145,
-121,252,244, 98,217, 13, 73,161,137, 23, 65,168,225, 10, 69,113, 47,166,249,175,104,152, 84,241, 42,186,222,107,239,146,134,124,
-174,204,223,170,116, 70,194, 19,179, 98,122,182,209,242,199,196, 47,131,139, 82, 8,160, 5,245, 91,251, 42, 85,170,252,123,229,
-202,149, 0,100, 70, 9,252,205,103,124, 39,211,220,185,115, 71, 11,180,220, 25, 67,154,119,169, 46,196,196,124,158, 32, 11,255,
-247,118,235,214,237,228,210,165, 75,247,224,247, 90, 6,254,230, 51,252,222,189,113,227,198,173, 24,136,206, 64,228, 78,219,173,
-104, 30, 74, 24, 61, 97,194,132,199, 41,109, 50,187,142, 28, 57, 34, 16,247, 20,104,189,107,194, 49,100, 51,214,121,130, 43,150,
-137, 82, 49,148, 87, 64,242,160, 72,179, 22, 47, 90, 36,230,205,156, 41,252,231,250,137, 63,102, 78, 23, 46,201,150, 39, 53, 34,
- 63, 23,139,210,170,115, 0, 82,187,219,183, 23,127,188,255,190,184,126,253,122,136, 48, 35, 81, 34,177, 25,239, 14,248,249, 9,
-151,100,203,147, 26,209,172,210,195,242,254,107, 36, 10,114, 5,254,246, 1,152,168,139,242, 43, 32, 11,192,247,159,104,209,162,
- 61, 97,224,111, 62,227, 59,198, 9,203,199, 94,167, 52, 18,104,105, 65,209,142, 29, 59,220, 64,171,102,205,154,103,127,253,245,
- 87,209,191,127,255, 39, 0, 68, 55, 6, 13, 26,116, 23,106,160, 96,252,158,172, 87, 22, 79, 52,215,172, 89,131, 46,231,239, 15,
-213,227,154,194,133, 11, 63,129, 74, 41,248,210,165, 75,148,118, 60,131, 74,253,134, 14,216,138,104,118, 69, 81, 1, 45, 74,114,
- 42, 35, 72,192, 29,214,111, 71, 4,205,152, 82,146,229, 2, 90,127,123, 41,175,178,140,243, 0,178, 30, 35, 16,180,140, 9,107,
-193,153, 14,166, 21,121,208,102,206,253, 52,239,178,232, 48,232,119,209,186, 67, 79,241, 89,195,150,162,228,103, 93, 68,145,230,
-115, 4,192,117, 32, 22,148,122,182,143,118, 63,251, 45, 18, 80,114,213,193,110,194,151,156,207,176,100,207, 73,243, 22,113, 64,
- 7,139,184, 75, 79,208,132, 63, 10,152,129, 90,188,135,206,255,242,140, 44,159, 27,221, 37, 13,245,123, 9,216, 94, 36, 87,190,
-227,253,139,133,211, 80,165,154,112, 9, 66, 15, 74,173, 8,168, 36,192, 82,223,239,221,187, 23,128,193,228, 95,151,100,203,157,
- 70, 47,135, 72,151,156, 54, 89,173, 91,183, 62,128,223, 4, 90,107,171, 85,171, 22,120,245,234,213,141, 80,203,172, 99,224,111,
- 62,131, 42,109, 29, 84, 46,255, 65,125,184, 22, 54, 14,125, 16, 87, 43,213, 82,127,162,233,228,201,147, 21,149,142,209, 5,117,
-144, 2,152,110,223,190, 45, 96, 47,241, 16,249,109,235,137,139,176,191,234, 2,117,227, 19, 74,178, 78,159, 62,173,168,247, 32,
-154, 23, 0,127, 98,201,194, 63,196,239, 51,166,139, 89,163, 71,138,169,253,122,139, 53,126,179, 68,235, 6,245, 30,187,108,182,
- 12,201,210,254,106, 33, 84,131,199, 71,141, 18, 11, 0,178,230, 39, 73, 18, 10,104, 77,137, 27, 87,140,143, 21, 75,236, 28, 60,
- 88, 76,236,210,229,169,203,102,203,251, 21,174, 79,145,147,106,144,228, 97,148, 40, 81,158, 66, 85, 54, 27,170,221,117, 45, 91,
-182, 60, 80,171, 86,173,131,144, 92, 41,234, 9, 94, 4, 91,148,108, 1, 28, 12, 45, 88,176, 96,157,151,149,201,136,250,142, 17,
- 40,218,179,103,143,255, 63,255,252,227,255,199, 31,127,248, 67, 98,176,166,104,209,162, 79,102, 2,100, 83,101, 8, 41, 87,112,
-190,124,249,110, 64,186,155, 81, 47, 95,122, 52,247,237,219,231,191, 97,195, 6, 5,100, 97, 17,225,255,249,231,159,159, 6,189,
- 96, 0,184,167,133, 10, 21,186, 62, 99,198,140,251, 0, 93,207, 40,217,138,168,178,234,209,213,128, 44,130,151,204, 8,118,212,
-134,161,200, 70, 4, 77, 87,158,212,246, 89,187,241, 44,103,120,243,170,202,252,108,130, 44,132, 51,120,246,139,234, 57,251, 71,
- 94, 4,203,224, 19, 18,208,173, 24,211, 68,239, 37,143, 68,129,222, 65,226,189,111,159,138, 56, 95, 63, 22,153, 58, 5,138,154,
-190, 59, 68,175, 94,189, 4,236, 61,153,255, 87,122,189,132,124,166, 67, 57,127,135, 77,218, 70,222, 81,216,116,225, 45,112,165,
-204, 62, 21, 63,201, 17,245,124,165, 76, 62, 66,185,227,127,120,105, 58,233, 95, 61, 7,116,176,136, 59, 83,152,118,220, 18, 45,
- 60,148,128, 72,123, 55, 5, 90, 18, 84,153, 0,178,176, 48,195,154, 68, 75,143, 50, 85,132,106, 73,150, 4, 90,176,131, 10, 56,
-116,232, 80, 0,212, 31, 1,140, 99,150, 43,164, 75, 3,131,227,191, 49,201,156, 4,136,218,249,240,225,195,245, 48,170,190, 78,
- 80, 37,129, 22,127, 99,114,191, 1,245,204, 70, 72,143,118,206,157, 59,119, 11,118,236,172, 64,218,248, 70,244, 49,153,205,161,
- 77,150,209, 69,251, 39,170,123, 8,148, 96, 87, 36,160,154, 20, 52,144,247,148, 95, 26,187, 83,250,197, 52,183,110,221, 18,199,
-143, 31, 87, 36, 89, 75,255, 0,200,154, 62, 85,204, 30, 61, 66, 76,239,223, 91, 76,233,242,157,152,223,187,167,152, 1,192,197,
- 52,158,104,210,216,157, 18, 11,170, 8,165, 36,235,183,100,201, 4,172,175,197,244, 4, 9, 4, 65, 22, 37,104, 4,118, 84,115,
- 98, 87,155, 96, 26, 51,190,122,241,125, 8,160, 5,137,158, 56,121,242,100, 48,242, 20, 76,245, 41,121,199,103,111, 27,208, 66,
- 27,247,223,188,121,179, 34,213,130,138,207, 31, 0,124, 45, 84,202,167,160,106,185,138,133,195, 76,216,106,101,245,208, 54, 21,
-117,164, 90, 74, 70, 85,228,234,213,171, 21,224, 6, 80,229, 15,105,224, 35, 2,120,170, 35, 51,100,200, 16, 31,147,222, 85, 74,
- 78,241, 95,109,247,229,197,106,214, 39,165, 99,184, 78,240, 98, 38,165,245,152,175,136,160,233,250, 96, 12,151, 52,235, 0,254,
-135, 69,197,105,148,111,150,247,207, 54, 83,111,156,249,118,198,141,255,240,123,146, 11, 20,116,198,194,227, 15,216, 59,253,203,
- 59,158,209,192, 60,165, 89,165, 0,132,111,163, 29,230,229,203,151, 5, 1, 23,199, 41,170, 17,151, 47, 95, 46, 6, 99, 49,245,
-233,167,159,134, 9,104, 97, 67,206, 87, 24, 75,127, 79,147, 38,205, 78,180,191, 93,144,138, 45,196, 34,136, 27,126,194, 4,140,
- 35, 42,159,146, 63, 4, 87, 3, 7, 14,188, 4,233,237,165, 22, 45, 90, 92,114,129, 45, 51,246,121,124, 79,112,117,114,213,120,
-241,120,223, 92,177,125,116, 3, 5,108,133,139,160,147,248,181,224,128, 70,179, 22, 42, 79,106,112,100, 0,148, 76,129,150, 4,
-105, 17, 0,180,152, 95, 99, 39,165,158, 80, 36,237,177, 36,184,226, 29,210,161, 0, 76,190, 1,176, 81, 10, 88,182,108, 89, 0,
-212,129, 1,220,186,108, 86, 75, 72,155, 5, 18,154,219,152,184, 46,130,198, 70, 24,206,175,175, 84,169,210, 85, 60, 95,203, 64,
-176, 5, 99,228,117, 21, 42, 84,184, 10, 64,178, 9, 3,211, 22, 12, 72,255, 65,114,114, 11,239, 19, 27,209,199,128,115,130, 70,
-239,122, 23,192,156, 50,192, 81,245, 7, 73,130, 98, 95,181,119,239, 94,193, 29,137,158,242,203,157,133, 4,103,176,165, 81, 64,
- 17, 13, 88,151,253,177, 64, 44,152, 54, 85,248,141, 30, 46,102,246,253, 73, 76,237,220, 65, 76,110,221, 76,204,254,182,165,248,
-103,236, 8,193, 52,158,104,114,103,161, 4,125, 18,104, 17,100, 77,139, 31, 95, 76,142, 19, 71,140,143, 25, 83,201, 39, 1, 30,
-120, 36, 8,110,152,198,140,175, 94,126,255, 53, 37, 89, 4, 84,157, 58,117, 82, 36,120,234,192,103,124, 71,201,150, 84, 29,130,
-159, 67, 33,125,209,218,129,120, 57, 91, 17, 79,206, 72,162, 69,144, 4,155, 65,127,180,117,127, 0,127, 37, 64,253,236,103, 37,
- 71,122, 52,105,155, 69,208, 6,169, 21,213,134,254, 0,107,143, 70, 65,202,137,141, 32,207, 97, 83,115, 14,255,131, 40,121, 5,
- 0, 11,180,242, 13, 47,198,161, 61, 22,141,202, 41, 97, 89,134,192, 93,144, 52,102, 87, 95,118, 38,114,197,158,202, 2, 77,219,
- 69, 80, 25,193, 19,100,121, 67,197,201, 60,148,203,158, 48,198,158, 37,213,210,156, 57,123,237,241,129,235,119,159,109,253,166,
-119,254, 85,177,227, 68,223,214,166, 77,155, 67, 24, 71, 30,112,140,129, 13,223,131, 38, 77,154,144, 71,180,133,242,120,161,157,
-116,195,238,194,227, 11, 23, 46, 12, 38,184,146, 70,240,216, 53, 40,234,212,169, 19,156, 62,125,250, 99,144,132,119, 55,163,163,
-126, 15, 96, 53,165, 75,151, 46, 79,230,193,158,147, 1, 82, 85,129,118, 36,234,214,173,251, 12, 0,198, 82,187,212,126, 15, 54,
-179,157,190,250,234,171, 3,200,231,115,111,229, 83,253, 13, 72,178, 54,140, 25, 51,230, 18,128,229, 37,240,227, 18,255,219, 41,
-179, 94, 92, 74,178, 30,253,247,187,184, 61,161,152,184, 59,175,190,224,255,240,210,116,210,191,122, 14,120, 73,162, 85,158,170,
- 69,148, 38,132,138, 81, 11,210,240,191,170, 58,158, 42,126,133,112,114, 66,191, 45, 90, 5, 90,207,159, 63, 15,128,180, 37, 0,
- 19, 79, 0,212, 30, 1,232,224, 1,216,221, 18,128, 9,101,181, 89,198, 80,168,204, 0, 35, 55,225,123,232, 33,212, 36, 71, 1,
-124,182, 17, 84, 73,144,133, 29, 88,235,161,138, 92,143, 9,252, 26,232,239,192,138,239,120,211,166, 77,239, 1,104,209,208, 51,
-161, 17,125, 2, 45,186,150,208, 94,148, 28, 81,130,132,129, 81,145, 14, 65,146,166, 72,165,120,183, 2,180,152,150,192,108, 21,
- 36, 96,254, 11,126, 23,127, 76,155, 34,252, 70, 14, 19, 51,251,244, 18,211, 58,125, 43,166,180,106, 42,102,126,213, 80, 44,104,
-221, 84,172,249,165,191, 37,160,197,124, 18,192, 73,160, 37, 65,214,216, 24, 49,196,200,119,222, 81,212, 81,251,247,239, 87,192,
- 32, 37, 91,175, 0,104,249, 96, 39,221, 84,126, 91, 11,178,228,127,190,171, 94,189,250,127,180,207,130,106,151,134,240, 67, 81,
- 55, 84,177, 84, 51,107, 3,175,243,123, 79,170, 67, 26,173, 83,154, 5,119, 14,254, 19, 39, 78, 36,208,154,107,165, 44,164,201,
- 93,140,106,137, 22,165, 99, 4,109,148,102, 65,245,234, 15,119, 38,143,203,148, 41,173,184, 71, 9, 8,216, 41, 96,175,165,212,
- 61, 36, 90, 47, 27,104, 81,154, 67, 96, 68, 73, 86, 14, 4,170, 67, 21,137,150,218,141,130,234,183,251,189, 7, 94, 24,210,180,
-194, 63,163, 56,216,177, 71,155,192, 41, 8,148, 46,217, 53,216,215,146,173, 22, 35,106,148, 11, 93,243, 39,185, 17,248,101,182,
-179,183, 90,102, 63,176,117, 64,231,173,115,102,247, 93,221,111, 90, 41,255,172,185,147,157,191,121,243,198,115, 44, 40,131, 90,
-181,106,117, 0,139,174,107,232,159,143,177,224, 32, 24, 53, 28,151,240, 46, 86,179,102,205, 62,236,209,163,199,196,138, 21, 43,
-110, 66, 61, 31,130,196,242, 28, 76, 33,206,192,254,242, 95,236, 56,228, 68, 80,200, 46, 31,184, 59,144,155,114,216, 31, 1,218,
-197,250,245,235, 5, 93, 71, 64,210, 42,176,144, 53,219,197,232,233,115,249, 81,166,238,176, 13,252, 35, 93,186,116,155, 17, 54,
- 0,128,253, 30,214,124,170, 63, 4,173,196,239, 24,203, 47,129, 31,151, 96,106,114,137,255,237,150, 91, 27, 31, 18,172,179,219,
-199, 54, 18,247,230, 55, 20, 43,218,167,167, 68,139, 59,192,157, 43,146,115,192, 4,104,153,217,104, 41, 0, 9, 88, 32,134, 39,
-201, 23,163,188,136,246,194,176, 94,254, 86, 61,139, 30, 14, 54,134, 13,240, 75,213, 33,164, 49, 1,152, 0, 2,208,193, 3,176,
-146, 10,128, 59,134,128,177, 99,199, 42,193,162,234,240, 3,116, 92,170, 14,207, 78,159, 62,253, 52,118,223, 92,194,128,243, 24,
-234,195, 27, 24,136,174, 18,116, 81,149,200,103,159,125,246,217, 37, 0,173,211, 0,114,235, 0,206,168, 58, 52,180,209,162,234,
-144,146, 32,121,209,158,138,234, 62, 74,132, 8, 92, 96,204,252, 66, 34, 5, 35,116, 6,124,219,146,234,144,105,182,111,221, 34,
-252,127,159, 47, 22, 78,157, 44,230,141, 24, 42,102,245,249, 81, 76,235,216, 78, 76,107,217, 68,204,250,178,129,152,247, 69,109,
-177,188,221, 87, 98,102,251,214,150, 84,135,103,206,156, 81,108,197, 36,208,154, 4, 73, 22, 65,214, 8,128,172,159, 81,241,148,
-186,237,220,185, 83, 1, 90, 28, 64, 95,178,234, 80,105, 91,176,183,154, 76,144,105, 4,180,248, 14,171,223,125,148,100, 17,100,
-129,239, 74, 64, 82,130,173,120,225,104,160,175, 52, 41, 65, 17, 93, 56,104,141,225, 9,140,120,193,142,202, 31,146, 39,127, 95,
- 95,223,149,112, 10,185, 7, 64,104, 43, 84,136, 29,169,238, 51,202,184,116, 25, 33,105, 82, 13, 9,190,250, 99,211,135, 63,182,
-225,251,163,141,251,131,142,178, 61,255,151,225,131,185, 21, 63, 24, 54,132, 2,139, 17,238,100,220,249, 10, 24, 66, 41,148, 58,
- 48, 11, 70, 46, 21,150,224,157, 21,144,163, 71, 83, 22, 77,190, 51,250,111,196, 2,250,216, 43,139,160,167,222,180, 75,243,240,
-131,249, 3,111, 60,152,211,239,236, 77,128,172, 49,165, 83,110, 75, 26, 43,218,232,247, 18,188,219,239,163, 90,105,150, 85,251,
-164, 52,119, 69,139, 70, 77,234,112, 34, 95, 92,185,114,229,205, 84,163, 99, 65, 66,169, 76,110,163, 12, 2, 76,228, 69, 93, 79,
- 69, 93,207,130, 20,138,198,234,197, 16,180,227, 24, 7,249, 25, 8, 4,238,107, 17,168, 25,232,229,169,222,195,185, 59,208, 19,
-233,242,144,166,238, 65,190,213, 62,225,220,241, 1,184,250,162,173,238,192,131,234, 97,104,151,233,176, 97,104, 1, 84,156, 91,
-120, 71,250,116, 97,160, 17, 34, 9,109,178,106,229,140,118,134,146, 44,229,238,216,104,133,151,165,175,125,122,116, 67,245,174,
- 67,254,230,206, 67,185,131,144,255,221, 0, 73, 21,151,207,101, 58,185,203, 80,157, 70,251, 46,172, 59, 14,201, 63,219,158,225,
- 67, 24,195, 99,112,249, 23,224, 32, 0,147,107, 0, 86,246, 1,152,112,148, 0, 7,121, 1, 48,150,222, 96,209, 24, 62, 49,157,
-145,194,176,122, 63, 10,126, 8, 43,125,197, 24, 30,224, 99, 51, 85,133, 0, 70,155, 97, 11,181,165,124,249,242, 87, 33, 53,219,
- 12,245,228, 94, 0,175,245,112,228,232,139,248,158, 12, 80,155, 2,244, 41,147, 21,165, 2,180,111,161, 68,128,106, 63,174,248,
- 96, 15, 35, 22, 97,151, 32, 69,236, 68,203, 0, 9,143,172, 24,195,119,237,220,233,241,190,157, 59,196,162, 41, 0, 89,195,127,
- 17,179,125,127, 20, 51, 58,126, 35,166,183,104, 44,102,127, 89, 95, 44,106, 93, 87,108,237,223, 68,108,236,249,157,104, 91,161,
-204, 19, 43,198,240,179,250,244,121,122, 12,134,212,148,100, 77,140, 29,219,109, 55, 70, 85, 33,193, 85, 31, 84,212, 79, 81,162,
-136,197,173, 91,139,193, 95,125,245,178,141,225,149,142,102, 5,104, 33,206, 42, 0,129,250,136,254,203,155, 4,180,232,215, 74,
- 13,180, 8,140,104,184,190,120,241, 98,127, 72, 97,253,123,246,236,185, 10,147,209, 99,170,246, 40, 25,197,238,195, 71,217,179,
-103,191, 10,143,223, 41,244, 70, 41, 2, 45,168,200, 67,208,212, 1, 90, 79,216,118, 11, 21, 42, 40,176,104,225,102, 13, 1,131,
-123, 1,186, 47,213, 70,139,249,167, 77, 21,110,169, 17,212,182, 89,122, 46, 21,118, 33,206, 74, 4, 83,160,101, 64,211,231, 97,
-211,166,130,193, 69, 35,134,234,191,169,164, 76,229,164, 84,237,145, 63,172, 52,119, 18,100, 81,146, 85, 34,101,236, 45,200, 79,
- 85, 4, 69, 69,138, 5,228,222, 79, 63,173,245,148,245,243,121,237,207,158, 0, 88,223,130, 52,247, 1,129, 22, 92, 52, 60,192,
-216,180,209, 96,118,138, 86,191,126,253, 54,144,166,239,129, 68,107, 26,226,148,213,139,135, 93,135,219,164,131, 81,185, 80, 68,
- 60, 67, 51,140,178,101,203,102,195,198,164, 83, 67, 22, 93, 20,157, 6,249,137, 54,237, 58,138,218,245,155,136,146,159,180, 23,
- 37,191,156, 36, 0,250, 47, 96,161,154, 63, 12, 51,102,121, 44,110,207, 64,163,240, 28,125,155,106,209, 80, 30,235,161,214,222,
-206,247, 40, 23,205, 46,106,134,225, 27, 78, 18,135, 3, 14, 7, 52, 28, 88,194,157,122,120,182,132,207,233,194, 1, 34,223,181,
-216,125,165, 24,191,211, 54, 11,162,106, 5,100,169,221, 59,208,216, 83,166,209,114,148,104, 19,170,187, 92, 16,111,159,135,212,
-230, 40, 6,152,221,157, 59,119, 62, 9,187,133,253, 0, 71, 27, 97,112,191, 17,246, 47,251, 32,158, 63, 11, 35,244, 93, 80,173,
-252, 3,137,201, 25,172,250, 63, 64, 90, 79, 71, 85, 40,238, 29, 56,248,113, 2,228, 29, 59,197, 20,137,204,202,149, 43, 21,177,
- 58, 84, 62, 2,180, 5,118, 39,210,109,130,101,247, 14, 43,255,248, 93,172,153, 59, 27, 32,171,167,152,217,161,141,152,241, 85,
- 35,225,215,180,174, 88,210,170,142, 8, 24,218, 76,236, 29,209, 78, 44,248,230, 43, 17, 59, 86, 44,174,118,205, 12,135, 21,247,
- 14,135,144,143,127, 91,182, 20,163, 33,201,162,145,189, 4, 89,148,188, 17,100, 77,173, 88, 81, 44,133, 13, 7,212,134, 28,208,
- 94,182,123, 7, 75,170, 67,170, 23, 93,245, 75,117, 33, 37, 89,111,132,234, 16,210, 70,127,216,206,248, 99, 19,128,114,103,248,
-248,227,143,253, 97, 75,232, 95,166, 76, 25,218, 83,157,160, 68, 18, 82,138, 96,168, 77,175, 66,178,251, 20,106,172,167, 0, 69,
-244, 35, 22,234, 34,208,130,116,213, 31, 91,252,253,209, 55,148,187, 54,192, 16,249,209,185,115,103, 33,193,202, 17,140,137,156,
-126,180,130,232,163, 13,210, 3,181,111,174,151, 49, 64, 41,174, 24,240, 33,218,102, 17,236,168,237,177,194,234, 82,193, 19,205,
-212, 18, 92,169, 64, 22,109,196,198, 33, 16,236, 25, 93,138,132,205, 32,159, 97,161, 89, 9,180, 86,184,198,173,114,234,143, 66,
-194,120,204, 45, 42,199, 15,142,137,180,179, 4,224, 80, 22, 73, 48, 70, 63,102,148, 73, 72,226,155, 97,193,120, 30,109,137,142,
-152, 57,142,114,241, 74,213, 6,157, 38,115,247, 34,191, 59, 5,253,252, 48, 54,232,220,179, 2,180,176, 81, 98, 51,141,235,191,
- 95,240, 72,100,253,225,145,136,245,245, 51, 17,179,237, 83,145,170,195, 13, 81,233,199,221,226,199, 31,127, 20,144, 26, 5,216,
-108, 44, 13, 97, 59,117,142, 32, 10,142, 78, 47,184,120, 65,231,185,218,240, 39,226,157, 87,197,171,109,243, 59, 78,116,135, 3,
-111, 58, 7,202,162,128, 90,169,150,199, 50, 47,225,209, 58,174,193, 71,137, 40, 29,150,210, 30,139,198,239,122, 14, 75,169,174,
- 83,167,193,239, 16, 91,110, 49,152,196,167,199,119, 12, 46,151, 33, 17,216, 11,251,174,147,208,221, 99, 83,206,229,173,152,136,
-182,192,153,233, 37, 24, 9, 31,135,154,102, 61, 0,217, 69, 76, 96,213,145, 70,235,243, 74,215, 97, 41,157,145, 82,245,198, 1,
-144,234, 55,238, 46,196,206, 46,229,216, 11, 74,180, 96, 91, 35,160,242,185,141, 60, 89,118, 88,154, 30,206, 72,151, 65,109,184,
-113,230, 20,177,184,123, 71,177,160, 85, 19,177,164,121,125,177,123,120, 27,113, 96, 92, 39,177,232,219, 22, 34,109,226,132,182,
- 28,150, 22,134, 19,212, 93,240,197,180, 9, 91,187,169,242,164,228, 13,126,197, 20,112,184,160, 89, 51,177,180, 91, 55,145, 59,
-109,218,123,200,231,171,112, 88,106,201, 24,158, 6,243,200,159,226,103, 11, 23,213,133, 90,149, 97, 68,108,181,142, 80,154,176,
-219, 27, 5,155,188,101,144,176, 42, 14, 75, 41,205,162,107, 7, 6,212,143, 18,138, 21, 43,166, 72, 78, 1, 52, 31,194,214, 38,
- 55,119, 8,114, 23, 25, 38,100, 78, 80,242,114,231, 19, 18,143,161,235,214,173, 91, 74,144,133, 73,215, 31,192, 58,148,106, 18,
-139,149, 71, 92, 28, 0,196, 61,164, 26, 18,192,235, 42,255,131,166,174,183,121, 47,142, 84, 90,126, 74, 80, 68,251, 25,170,228,
-212,139, 27,183, 84, 75,229, 36, 84,207,165,130, 29,154, 92,152,148, 85,129, 44,238, 32,164, 91, 9, 14, 86,234, 69, 75,104,154,
- 47,128,150, 58,159, 18, 20,134,149,166, 46, 91,181, 64, 75,186,123,225,162,136,139, 36, 24,179,211,177,107,168,122,119, 61, 40,
- 64,160,142,197,223, 35,140,165,193,240,155,118,151, 71,226, 64, 34,116, 17, 46, 61, 46,124,251,237,183,129, 88, 4,222, 1, 77,
-152,190, 62, 23,144,150,210, 94,149,229,154, 99, 68, 19,237,109, 27,253,249,113,131, 15,253, 6, 94,186,116, 25,187, 24, 15, 41,
-182,167,144,234, 11,208,181,178,139, 81,205, 79, 58, 60, 61, 8, 77,128,114,156,143,213,203, 53, 55, 28, 66, 90, 9,136, 35,180,
-111, 70, 96,155,247, 6,105,167,236,222,224,226,155, 65, 67,235, 25,222,180, 84, 75,104,235,132, 88,102, 71,240, 72, 21,227, 18,
-198,165, 91, 2,220,249,219,104,240,161, 5, 90, 50,216, 99,125,198, 99,118,176,186,223, 10, 81,245,213,174, 93,187, 94,192,145,
- 54,167, 48,201, 4, 66,109,178,154,146, 44, 23,200,138,163,147, 83,163,134,173, 28,193, 3, 81,253, 35,218, 98, 81,162, 5, 9,
-156,152, 52,105,146,192,174,161, 71,148,122,129,150,221, 35,120,138,210,113,105,135,134,245, 30,205,237,231, 43,214,143,254, 69,
-172,255,185,143,152, 3,233, 86,187, 74,229, 30, 99,213, 26,150,227,114,148, 35,120, 70,183,107,247,148, 71,114, 16,108,209, 96,
-159,192,112,224, 23, 95, 60,117, 73,178, 94,197, 17, 60,161,220, 59, 80, 5, 75,155, 44, 6,254, 86,187,119, 0, 47,233,216,212,
- 72,165, 27, 25, 7,159,120,104, 63, 99,177,136,152, 99, 20,208, 38, 31, 82,162, 5,105,211,125,148,253, 29,128,163,171,172, 59,
- 72,161,212,134,235,234,178,199, 36,216,242,116,214, 33, 22, 8, 71,208, 70,131,177, 43,235, 49, 38,210,235,176, 75,188,143,255,
- 90, 63, 90, 47,131,159, 81, 96, 55,166,156, 29,104, 96,240,174, 72,181, 80,110, 79, 46, 21, 66,129, 34,210, 84, 75,174,144,222,
-173, 26,212,145,104,125,133,247, 90,155,183,151, 65,211, 18,208,226, 17, 99,236, 7, 4, 90, 92, 24,105, 36, 90,122,117, 84, 30,
- 70,229,219,113,132,215,117, 44, 38, 21, 21,164,250, 34,200,130,164,253, 14,212,144,148,136,175, 3,192,126,140, 59, 85,141,186,
-227, 39,218,231,143, 29, 58,116, 56,178,106,213, 42,193, 32,119, 49, 98,204, 19, 56,165,129, 39, 95,156,198,184,234,107, 50,186,
-107,243, 89, 47,140, 18,173, 6,158,198,121,211, 25,198, 60,194,203,104,243,230,185, 48,143,225,228,211,156, 71,111, 75,140,178,
- 40,168, 45,137,214, 12,186, 76,160,123, 4,174,226, 40, 42,215, 0, 40,201,184, 37, 84, 23, 82,146, 69,144,197, 65, 8, 47,102,
-155,117, 64, 12, 54,113, 49, 72,100,166, 51, 82, 24, 95,254,133,157,133,119, 24, 0, 92, 86,210, 38,203,165, 46, 52,242,222,238,
-169, 97, 71,196,161,210,177,232,192, 84,231, 80,233,240, 28, 0,253, 58, 30, 42, 29,202, 97, 41, 36, 55, 19, 1,132,199, 51, 0,
- 4, 79,166, 36, 75,165,226,120,211,128,150,233, 96, 0,128, 53,139, 78, 74,161,162,185, 3,123,195, 27,188,243, 63,159,155,181,
-121, 35,226,244, 0,143,244, 55, 96, 3,246,140,174, 61,120,231,127,141,103,248,151, 49,152, 75,119, 12, 52, 86,166, 10,143, 18,
- 35,233,226, 65,109, 16,239,201,165, 66, 40, 80, 4, 26,180,227,210,210,116,171,248,240,142, 82,172,131, 42,201, 22, 7, 43,143,
- 18,173, 8,160,169, 91, 61, 90,137, 22,199, 68, 74,147, 88, 79,180,209,131, 84, 95,173, 58, 52,170, 35, 74,141, 90, 35, 44,131,
-171,156, 67,240, 19,120, 22, 7,146,159, 5, 0, 59, 9, 45, 1,109,194,122, 35,208,168,158,129, 42,120,181, 95, 54, 61,154, 37,
-176,104, 28,136,111, 47,133,170,121, 19,164,106, 91, 0,192,252,177, 8,194,126, 26,159,146,166,141, 88,163,101,112,197,119,219,
-104,193,105, 46, 37, 85,161, 46,216,104,109,244, 96,163,245, 50,218,167,133,162,153, 70,113,242,105,202, 34, 91, 17, 34,130,159,
-182, 50, 16,217, 35,103, 65, 1, 8,152,150,168,130,222,161,210,106,137, 22,227,206, 64, 96, 90,121, 25, 86, 4, 38,236,104, 4,
- 92, 8, 9, 16, 18, 35, 36, 68,136,135, 16,211,196, 38, 43, 34, 42,215,161,249,162,198, 66, 29,193,163,105,200,102,239, 77,235,
- 61, 28, 29,227,149,215, 17, 22, 6,137, 96,111,211, 14,170,232, 46,144, 62,116,225,157,255,249,220, 74,155, 55, 42, 59, 65, 21,
- 61,193, 99, 50,123,149,103, 29, 50,123,210, 29, 3,221, 59,168, 93, 60, 16,132, 81, 77, 52, 14,129, 0,204,200, 8, 94,175,142,
-140,104, 74,122, 4,117, 85, 92, 65,207, 70,235,101,209, 12, 85, 61, 80,229,174,128, 63,179, 99, 88,100, 28, 71, 56, 70,224, 5,
-169,230, 49, 24,177, 31,163, 52, 11,174,101,104,219,101,183,205,211, 39, 32,157,157,154, 29, 3, 70,186, 47,179,205,151,227, 78,
- 90,158, 93,170,215, 78,177,216,236, 11, 30,236,195, 59,189,227, 73, 94,102, 62,195, 49,132,188, 84,126, 58,249, 12, 15, 7,156,
-180,182, 56,224,116, 64, 91,236, 50,141,252, 50,248,169, 62, 84, 90, 47, 67,102,239, 95,246, 4, 97,202, 52, 15, 17, 94, 6, 63,
-195,147, 63,187,147,184,157,111, 25,149,221,200, 29, 3, 1, 19,213,126, 4, 89, 70, 27, 63,236,208, 84,211,147,109,138,180,181,
-187, 14, 95, 38, 77, 59,252,211,198,117,218, 82,120,184, 23, 58,173,195,207,183,147,159,222, 45,245, 91, 66,205,233, 44,222,173,
-104,135,159, 14, 63,189,197, 1,167, 45,121,139,147, 47,232, 56,252,116,248,233, 45, 14,188,205,109,201, 91, 60,124, 21,116,180,
-246, 89,101,213,153, 96,165,234, 5, 59, 25, 53,162,225,233,185, 25,125,135,166,126,189,132,181,190, 28,126, 58,252,180,218, 6,
-156,190,105,204, 1,171, 60, 84,199,115,248,233,240, 83,143, 3,111,115, 91,146,252, 24,129, 31,122,161, 21,158,171,131, 89, 31,
-122, 29,223,135,205, 75,124, 24, 74,242, 54, 35,115,167,236, 97,104, 48, 30,146, 56,252,116,248,233, 45, 14, 56,109,201, 91,156,
-116,164,121, 78, 91,242,110, 91,210,163, 70,192, 21,217, 46,130,172, 16, 18,173,136, 44,128,211, 8,189,203, 93,135,159, 14, 63,
-189,197, 1,167, 45,121,139,147, 14,216,112,218,146,211,150,188,203,129,144,212, 34, 35,208, 50,231, 7, 28,233, 69,147, 1,110,
- 23, 90, 34, 5,119,155, 40,129,255,213,239,245,126,171,190,224,238,128,102,105,204,190,163, 71, 51, 87,214,248,109,203, 22, 77,
-121, 36,111,214,248,109,224,126, 33, 7,104,212,145,129,255,205,190, 25,150,124,234,125, 39,119,246,132,223, 48, 31,185,179,196,
- 83, 55, 8,103,240, 49,111,106,118, 98,152,241, 51, 41,136, 53,127, 47,214,187, 75, 75,164,140,123, 45,238,187,209,150,240, 63,
-130,122, 71,160,246,123,102, 52,237,228, 79,198,125,105, 52,225, 46, 32, 59,206,190, 27,136,176, 12,219,253,183,243,206,255,124,
-110, 33,227,238,124,150, 77,239,115, 6, 65,184,194, 25,117, 90, 79,239,116,190, 17,162,236,149, 51,249, 60,228, 89,116,149, 51,
-251,208, 63,148,251,170,146, 89,255, 57,227, 41,241,145, 78,175,111, 90, 40,147,213, 40, 47,173,142, 92, 25,162,111,176, 58, 8,
-125, 17, 62, 67,208,243, 15,168,151,247,151,157, 79,171,252,123,163,250, 81, 88, 11,237, 74,231,212, 81, 56, 25,104, 33,121,100,
- 1, 90, 90, 85,161,103,213, 33,192, 68,249, 68, 9,226, 29, 76,152, 32,238,165,104,209,162, 62,225, 25,130,188,120,231,255,132,
-239,197,189,132,119, 7, 25, 47, 60, 64,203,206,119,244, 6,222,210, 69, 82,220, 16, 87, 70,137,210,133, 83,222,134, 79,154, 86,
-240,249,213, 6, 94,150,219,240,206,255,137, 19, 36,248, 34,105,210,248,245,224, 17,254,131,240,228,147,233,147, 38, 77, 84, 47,
-113,226, 4, 95,232,125,231,195, 66,239,223,103, 62,202, 20, 73,161, 62, 54,197,233,128, 22,122,144,141, 40,158,248, 25, 35, 93,
-162,184, 7,151,124, 83, 83, 92,157,208, 89, 4,126, 83, 72,156,110,145, 71, 76,171,156, 94,164,142,247, 46, 29,108,218,221, 37,
-103, 35, 91,161,162,190,140,122,143,150, 49, 99,198,246,240, 42,191,101,255,254,253, 1,104,239, 1, 56, 30, 38, 0, 14, 53,149,
-243, 72,249,156,239,145,179,104, 30, 10,162, 6, 90, 66,172,239,165,132,146,105, 20,135,123,244, 17,215,150,129,224, 75,190,227,
-111, 60,235, 42,223,185,238,159, 24,129, 34,128,166,224,199, 91,134,138, 42,153,124,158,171,211, 84,207,234,243, 80,236, 28, 21,
-234, 57,227, 49, 62,211, 25,209,172,146, 37,202, 83,130, 49,163,192,247, 72,219, 76, 39,208,133,132,188,212,117,196,231,134,241,
-107,100,143, 22,104,244, 45,190,211,163,217,180,128,207,211,134,121,125, 4, 67,179,130, 62,207,224,160,120, 53,156,150,174,133,
-255,173,181, 93,186,116, 89,251,222,123,239,209, 23, 25,121,156,217,164,161,189,140,182, 20,158,182,174,199, 79,111,208, 35, 13,
-167,236,222,226,228, 11, 58,145,133,159,122,165,142,108, 64,203,154,135,248, 4,241,227, 30,219,248,207, 2,177, 96,206,120, 17,
- 59,118, 44,229,172,192,161, 67,135, 42,247,216,177, 98,138,153,147, 6,139, 37,243,198,137,248,239,197, 57, 22, 30, 0, 99,231,
- 59,122, 3, 26,129, 13, 1, 78,249, 98, 31, 4, 1,180,181,129, 23,234, 54,200,167,114,143, 27, 55,118,155,223, 38, 14,110,179,
-116,238,248, 54, 73, 18,190,215, 32, 60,249, 76,146,228,189, 6, 27, 86,253,209,230,143,217,227, 41, 57, 11,245,157,143, 74,164,
-185,163, 0,190, 34, 41,110, 26, 77, 16, 94,234, 51,145,165,179,188,236,124,246,253,219,247,107,113,121,216,215,226,194,215, 69,
-197,149,111,139,138,171, 93,202,138, 11,109,242,139,153, 85,210,179,209,227,188,110,221,235,101,231, 51,172,205, 32, 68, 62, 9,
-162,224, 13,124, 11, 22, 21, 1, 88,255, 40, 1,206, 36, 3,112, 60, 75, 0, 15,127,199,130, 40, 0, 19,186, 4, 91, 70,223, 52,
- 4, 90, 56, 22,106,220,221,187,119,135, 50,104,129,150,250, 29,223,131, 56, 1,153,238,132, 43,129, 86,227,194,113,131,212,233,
-154, 20,121,239, 62,129,150,222,115, 51,160, 69,208, 35, 86,182, 53, 12, 45, 74,190,247, 16, 96,115, 48,248,225,171, 14, 46, 48,
-165,151,207,102,218,184,252, 47,227,123,250, 30,223,233,149,157, 0, 75, 28,152,163,132,161, 85,124, 4, 78,217, 88,139, 58,114,
- 7, 28, 94,190, 22, 62,216,214,214,170, 85,107, 45,210,171,129,170,182,174, 34,101,251, 12,107, 35,215,164,115,202,238, 37, 70,
-186,200, 68, 22,126, 70,118,160,101,221, 51, 60,164, 89,129,251,119,252, 37,222, 79,150, 72,224,172,182, 16,199, 70,240,127,178,
- 36, 9,196,154, 63,167, 19,104,241,188, 46,183,154, 81,254,214, 27,124,244,226,217,249,142, 30, 77,170,234,170,148,203,116, 37,
- 99,218,248,139,113,216,181, 34,205,146,129,255, 83, 36, 75,210,102,141,255,244, 54,137, 19,196,107, 26,158,124, 38, 77,156,160,
-233,222,237,127,181, 73,149, 34, 73, 27,189,239,100, 78,155, 96,118,229, 50, 25,174,100,201, 16,175,187, 3,180, 94,254,234, 41,
-115,138, 36,219, 3,231,143, 17,135,234,102, 19,115, 42,166, 21,141,114, 36, 19,255,126,247,177,184,246, 67, 53, 69,178,149, 34,
-110,244, 77,111, 10,208,162, 90,144, 18, 43, 53,200,194,177, 64, 1, 23, 46, 92, 8,192,185,139, 1, 91,183,110, 13,192,153,141,
- 1,240, 96, 30, 0, 47,223, 91, 60,168, 17, 67,168, 14, 41,201, 82, 66,250,232,119,113, 36,203, 48, 28, 91,213, 31,135,190,247,
-171,144, 53,230, 29,169, 86, 44,159,249,221, 59, 95,125,245,213,112, 95, 95,223,126,184,134, 88, 5, 90,181,115,191,115, 95, 77,
-179,110,222,119, 21,160,197,231, 56,223,116, 56, 64, 97,127,210,172,151, 47,198,125,171, 64,107,239,184,186,226,200,175, 13,196,
-153,153,141,197,149,121, 95,138,135,219, 39, 40,224,171, 89,209,216, 15, 27, 54,108,216, 15,121,239,254,211, 79, 63,125, 63, 96,
-192,128, 94,106,224,164, 51,233, 40, 64, 11,231, 18,254,132, 3,237,187,227, 40,176,159,244,128,214, 63,131,106,138, 45,195, 63,
- 19,251,198,215, 21, 15,255,234,172,124,203, 42,208,130,180, 49, 4,208,226,255,107,215,174,173,197,241, 77, 4, 90, 35, 61,204,
-167,145,101,114,116,242,249,118,130,162,136,168,247,200, 12,180, 60,183, 2,127,127,255,178, 8,130,129, 49, 9,128,254,219,177,
- 82, 12,235,211, 74,100, 76,151, 66,164, 75,157, 92,164,253, 32,153, 18,210,165, 73, 46,122,119,109, 36, 86, 47,155, 98, 5,104,
-185, 63,108, 4,180,172,126, 71,175, 4,180,209, 34,208,170, 82, 38,251,162,204, 25, 82,181,201,144, 46, 69,155, 12,169, 93, 1,
-191,123,119,107,210,102,213,210,169, 86,128,150,199,124, 18,104,253,183,125,121,155,225,125, 91,183,209,251, 78,245, 10, 57,253,
- 42,151,206,112, 37,107,186, 56,221,188,219,223, 28,106, 86, 56,240,105,209, 60, 55,206, 79, 31, 44,118,213,204, 40, 42,125, 16,
- 55, 8,105,226, 54, 41,153,251,193,205,145,173,196,185,150,121, 69,241,148,113,175, 90,161, 19, 25,226,208, 6,139,234, 66, 41,
-201,146, 32, 43, 32, 32, 96, 55, 22, 1,187,113,192,112,192,130, 5, 11, 2,182,108,217, 18,128, 67,213,119, 50, 62,202,101,197,
-201,108, 87, 74,157, 62,254,248,227, 17, 99,199,142,109,191, 98,197,138,230,160,213, 28,135, 21,247,229,243,122,245,234,141,192,
-113, 67,237,113,116, 86,123, 28,218,222, 28, 82,227,190, 58, 64, 43, 4, 11,165, 68,139,128, 74, 77, 19,128,234, 30,129, 86,157,
- 60,209,239,147,230,182,109,219,154,147,102,253,252, 49,239,233, 0, 45, 45, 77, 5,228, 28,156, 84,255,255, 82,173,191,190, 22,
-226,191,217,110,160, 53, 99,198,140, 86, 0,155, 13, 64,179,193,148, 41, 83,186,233, 0, 45, 53, 77, 5,104,225,112,251, 30, 88,
- 68, 54,152, 48, 97, 66,136,248, 82,162,181,110,200, 39,255,255,222, 1, 63, 61,160,229,166, 73,213,225, 15,101,124, 20,105,214,
-216,186, 73, 31,222,186,117,107, 45,193, 21, 3,164,141,107, 81, 55, 4, 88, 2, 99,162, 25,208,138, 12, 77,210,201,163,195, 1,
-175,113, 64,139, 69, 92,132, 35,147,234, 80, 45,229, 14,105,163, 37, 1,150,228, 22,129,214,222,173,254, 98,241,140,159,196, 31,
- 83,127, 16,243, 39,247, 16,126, 19,186,137,223,198,118, 17,211, 71,117, 20, 83,134,183, 23, 43,254, 24,239, 21,160,101,245, 59,
-122, 53, 41,109,180,202,151,248,224, 46,242,217,102,254,228, 31,218,204,157,216,173,205,111, 99,186,181, 65, 62,219, 76, 29,222,
-190,205,242, 63,198,123, 5,104,237,222,234,223,102,209,244,222,109,244,190, 83,190, 88, 42,197, 70, 11,249,185,226,181, 22,231,
- 16,178,204,129,134, 31, 22,185,115,110,214,104,177,165, 82, 90, 81, 44,105,108, 69,125, 91,187, 72,206,219, 55,166,252,160, 0,
-173, 15, 63,136,167, 86,233, 90,166,251, 58, 70,164,193, 59,109,178, 8,180, 36,200,250,238,187,239,206,226, 48,225,231, 12,144,
-230,156,133,138, 63,128, 1, 7,149, 7,224, 28,188,253, 40, 7,193, 39, 3,143, 80, 50,186,218, 18, 56,181,104,209,162,191, 4,
- 89,171, 87,175,110, 62,106,212, 40, 5, 80,181,111,223,190, 63, 1,209,238,221,187,155, 67, 53,215,124,250,244,233,150,129, 22,
- 1, 21, 0, 76,123, 2, 55,210, 84, 3, 45, 2, 55, 73,211, 14,208, 58, 54,181,161, 74,125, 24, 18,104,205,154, 53,171, 21, 65,
- 22,232, 54, 0, 31, 44, 1, 45, 72,240,186, 19,104,225, 64,111, 93,160,181,113,104,173,255,127,239,200, 66,143, 64,203,197, 96,
- 69,138, 5, 0,172, 4,128, 99, 69,138,245,237,183,223,174,109,217,178,165, 2,180, 92, 97,228,235,216,206,156, 60, 57, 28,120,
- 21, 28,208, 98,145, 72, 8,180,152,101,125, 27, 45, 89, 56,162, 73,198, 34,208,218,181,105,177, 33,200,154, 48,248,107,177,116,
-238, 72, 17, 63, 94,108, 51,213,161,187,174,140, 36, 90,158,190, 51,233,151,118,238,239,232, 85,186,180,209, 42, 91, 44,213, 3,
- 61,144, 53,113,104, 59,216,104,141,242, 10,208, 10,216,180, 72, 23,100, 17,204,125, 84, 60,245, 11, 27,173,194, 41,110,189,138,
-198,249,182,127,179,115,227,186,247, 78,110,248, 83,252, 92, 62,153,168,157, 61, 17, 1,133,207,247, 95,212,185,183,122, 84, 55,
-225, 91,248, 29,241, 89,246,196,247,223, 20, 30,113,119, 33, 13,223,105,147, 69,117, 33, 37, 89, 4, 88, 82,191, 31, 45,218, 59,
-193, 21,234,119,187, 90,174,110,183,171,159,182,236,127, 53, 74,148,104,193, 22, 15, 2, 87,128,214,215, 95,127,221, 95, 2,162,
-245,235,215, 55, 31, 51,102,140, 2,168,186,117,235,214,159, 82, 39,130, 44, 72,184,154,207,156, 57,211, 22,208, 2,128,105, 79,
-144, 69,154,106,160, 53,119,238,220,246,146,166, 29,160, 69,149, 97, 8, 91, 45,218, 68,185, 84,135, 4, 90, 4, 89,251,246,237,
-107, 0,137,153, 37,160,213,161, 67,135,238,144, 52,133,146,128, 73,137,214,214, 17,159,253,255,123,199,255,180, 13,180, 8,182,
- 78,157, 58,181, 22,170, 82, 55,208, 98,189,168, 6,229, 55,165,137, 58,229,112, 56, 16,102, 14,104,177, 72, 36, 5, 90, 18,108,
-233, 75,180,212,170,195,237,107,231,235, 74,178, 42,149, 45, 32,178,102,205, 34,202,150, 42, 40,222,139, 23,251,138,137,237, 83,
- 8,160, 21, 53,106,212, 89, 56,128,247,132, 12, 41, 83,166,124, 86, 48,127, 94,145, 55,119,118,241, 97,209,156, 33, 36,102, 4,
- 89,227,127,110, 43,254,152, 57,152,223, 81,239,238,113,211, 84,108,180,202,100,188, 82,171,114,222,197, 90, 73, 86,166,188, 37,
-214, 36, 74, 87,224, 88,146, 12, 69,142, 69, 73,152,245,176, 79,194, 28,235,101,136,154, 56,215, 40,230, 91,175, 53,232,149, 39,
- 73,146, 68, 45,210,231, 46,179, 59, 93,254, 26,143,115, 22, 44,189, 74, 45, 49, 35,152,171, 91, 35,223,236, 74,165,211,107,109,
-180,194,220,216,156,132,246, 56,208,167, 93,235,160, 39, 15,131,196,154,165,243, 69,197, 28,233, 20, 80,245, 75,247,142, 65,207,
-159, 61, 21,219,182,108, 18,149,114,166,191,107,143,226,235, 27,155, 18, 45,105,248, 78,155,172, 53,107,214,132, 0, 90, 49, 98,
-198, 18,191,175, 59, 39, 22,111,185,162,220,249,223, 12,104,169, 93, 56,124,148, 37,198, 29,170, 11, 41,201, 34,200,170,152, 45,
-182,219, 70,171, 82,246, 56,183, 41,201, 34,200, 2,112,210,179,209, 10,193, 56,169, 58,164, 68,235,135, 31,126,248, 69,210,164,
- 45, 22, 85,135,180,213,130, 13,213, 80, 73, 19, 64, 75,207, 70, 75, 75, 83, 1, 57, 87,255,128, 20,107,219, 80,168, 12,103,189,
- 8, 46,160,245,101,177, 56, 15,251,246,237,219,135,146, 44,130,172, 95,127,253, 85,207, 70, 75, 77, 83, 81, 29,210, 54,139,106,
-195,113,227,198,133,136, 47,129,214, 61,255,111,133,216, 59, 69,136,195,127, 8, 97, 17,104, 81, 85, 40, 37, 90, 70, 64,203, 1,
- 91,175,111, 95,115,114,246,242, 57,160, 2, 90,106,144, 18, 89, 84,135,158, 25, 22,218, 70, 43,110,224,230, 85,179, 93,234,194,
-206,110,117, 33,193, 79,206, 28,217,149,113,123,196,136, 17,226,157,104,209, 30,231,201,147, 39, 14,193, 9, 64,212, 40,124,101,
-189,235, 30,234,131, 46, 96,179, 62, 48, 48, 80,200,112,254,252,121, 1,245,135, 66, 47, 91,230, 15, 66,124,135, 32,107,204,128,
- 86,194,239,215,126,134, 64, 75,177,209, 2,208,250,180, 82,238, 69,191,141,233,236, 86, 23, 18,252, 16,100,109, 60, 46,132, 94,
- 32,224, 50, 2, 90, 4, 97,124, 47,193, 88,158, 74,149,226, 68, 77,152,109,255,183,125,127, 83,104,165,206, 83,245,201,228,161,
- 29,190,166, 36,139,223, 25, 63,184,109,155, 79,171,229,243,171,244, 97,122,199, 70,235,229,247, 75,229,139,141, 27, 53,186,205,
- 54,180, 99,199, 14,145, 38,117,234, 39,240,165,182,189,117,235, 86, 79,229,179,148, 41,222,191,241,138,178,230,245,207,210,230,
- 10,210, 26,101,119, 33,237,176,104,147, 69,117, 33, 37, 89, 4, 85,181,191,236,250,124,212,220,173,143,198,204,223,241,104,244,
-188,173,143, 62,253,162,211, 99, 62,143, 18, 37, 42,221, 30,232,170, 14, 61,237, 44,180,185,235, 80, 23,104,133,115,215,161, 46,
-208, 82,164, 89,180,205,250,235,155,255, 7, 60,179,184,235, 48, 20,208, 50,218,165,104, 99,215,161,155,166,218, 70,107, 76,157,
- 36, 15, 37,216,210,147,104,169, 64,240, 75, 59,174,195,235,141,210, 33,232,112,192, 75, 28,136,228, 54, 90,101,193, 6,233, 17,
-222, 92, 90,157, 40,126,220,192,117, 43,166, 65,194, 20, 18,100, 17,252,228,203,153, 94, 1, 89, 18,108, 69,137, 18,229,111,130,
- 45,130, 44,215,234,108,189, 30,207, 93, 96,172, 55,128,216,124,164, 89,132,201,240,250,196,137, 19, 5,193, 22,175,172, 25, 83,
- 41,182, 95, 82,146, 69,144, 53,178,111, 11, 49, 99,220,143,226,189,184,250, 18, 45,183,141, 86,241, 15,238, 74,155, 44, 9,126,
- 18,165,201,175, 0,173,197,155,206,139, 54, 61,199, 8,159,132, 57,111,248, 36,202,177, 81, 13,162,116,219, 6, 64, 22,211, 49,
- 30, 65, 86,148, 68,185,254,150, 32,139,247,180, 57,138,109, 85,131,172, 49,253, 91,183, 41,231,216,104,121,169,155,133,137, 76,
-226,164, 73,147,222,129, 74,230, 57, 12,185,159,103,202,148,233, 17, 85,107,216,153,247, 8,234,160,231,117,235,214,125, 30, 39,
- 78,156, 59,160,156, 56, 76,212, 95,179, 68,220, 69, 88,180,104,209, 45,116,225, 0,155,169, 0,244,171, 0, 24,124, 7, 80, 93,
- 72, 9,214,136, 57, 91, 30,207, 88,186,243,182,223,202,189,183, 71,204,248,251,230,168,249,187, 46,240,121,202,146,109,199, 26,
- 21, 69, 11,166,212, 59, 1,181,239, 96,171, 53,124,200,144, 33,253, 70,143, 30,109, 75,162, 5,154,195,212,187, 11,165, 49, 60,
-119, 49,246,238,221,187, 63,105, 90,145,104,209, 79, 22,193, 20,119, 23,202, 64, 41, 22, 3,159, 55, 45, 30,255, 42,104,246, 3,
-205,238,240, 93,245, 61,164,114,150, 36, 90, 48,134,255, 9, 82,173,238,189,122,245, 10,235,174, 67, 55,123,181,238, 29,184,187,
- 80, 74,180,154, 52,105,178, 22, 59, 44, 21, 27, 45,237,229, 26,164, 95,179, 22,231,100,199,225,192, 43,231, 64,100,145,104, 89,
-243,159, 37,217, 9,255, 86,199,231, 97, 23,215,202, 63,198, 10,255,121, 35,197,226,217, 67,197,130, 25,131,196,220, 95,251,138,
-105,163,123,138, 92,217, 51,132, 2, 91, 72,187,209, 12,104, 17,108, 65,109,152,232,157,119,222,217, 49,123, 54,118, 9,225,194,
-224,171,220,115,229,200, 20,226, 59,179, 38,252, 36,166,143,233, 41,126,241,109, 43,226,197,141,117, 92,175,170,165,141, 86,185,
- 98, 31, 60,240,135, 45,214,162,217, 67,219,252, 49,125, 80,155,185,147,251,182, 73,156,190,176, 2,180, 8,178,120, 39, 72, 34,
-104, 34,120,210,113, 67,241,127,242, 18,104, 1,148,105, 65, 86,138,204,197, 15,250, 77,253,249, 91,245,119,126,155,216,187,141,
-219,143,150, 99,163,245,178,123,100,226,152, 49, 99,254, 11, 73,214, 78,186, 59,160,113, 56, 37, 61,244, 39,117,249,242,229,128,
- 75,151, 46, 41, 62,165, 22, 46, 92,184,131,241,222, 20,176, 69, 63, 90,157, 58,117,218, 74, 23, 14,148,106,209,240,189, 66,131,
-239,175, 80, 93, 56,106,238,182,199,115, 86,236,185, 61,126,238,250,155,147, 23,238, 56, 48,246,143,189,167,249,252,131,210, 29,
- 40,113,214,189,212,170, 67,186,112,144, 59, 1,105,164, 78,117,161,116,239, 80, 41,123,236, 27,203,151, 47,111,127,230,204,153,
-230,216,217,104,106,163, 5, 15,239, 79,170,101,137,250,188, 78,190, 56,129,106,154, 95, 20, 79,124,145, 82,174,186,249,227, 6,
- 46, 89,178,164,253,201,147, 39,155,147,102,211, 18, 73, 46, 50, 62,211,121,104, 72,205,232, 39, 11,238, 24,250,115,119, 33,237,
-177, 96, 80,223,170,127,255,254,125,248, 28,128,169,255,226,197,139, 91,129,102,131,211,167, 79, 55, 64, 62, 45,217,104,181,109,
-219,182,199,129, 3, 7, 26,248,249,249,133,123,215,161, 30,208, 66, 93,173,133, 36,127, 45,212,164,107,199,143, 31,175, 11,180,
- 28, 53,226,203, 30, 62,156,239, 69, 18, 14, 68, 38,160,101,221,143, 86,156, 56, 49, 42,199,127, 47,246,113,250,201,114, 7,216,
- 73,209, 86, 74, 9,113, 99, 95,129,135,248, 32,181,100, 11, 21,118,195, 12,104,105, 65, 86,247,238,221,161,210,136,242,140,233,
- 64,239,177,242,173,144,223, 9, 36,200,138, 19, 35, 70,101,189, 6, 65, 27,173, 15, 11,167,184,156, 62,245,123,191,211, 87,150,
- 12, 9,240,155,118, 89, 46,201,212, 61,181, 68, 74, 13,182, 60, 75,180,114,222, 80,167,139,154, 48,235,190, 68,137,226,183,208,
-126,135,223,202,152, 38,222,116,230, 67,227, 71, 43,146,180,225,200,155,205, 24, 49, 98,140,223,188,121,243,142,199,143, 31, 43,
-224,138,192,138, 1,147,182,226, 33,125,195,134, 13, 1,171, 86,173, 10, 56,123,246,108,192,228,201,147,119, 48,126,228, 45,109,
-136,156, 43,158,225, 11, 20, 40,176, 5,139,134,157, 43, 87,174, 12,168,221,118,160, 34,209,162,218,144,146, 44,130,172,197,155,
- 47, 47, 39,208, 50,147,104,185, 40,119,161, 27, 7, 0,149,225,234,157,128,180,159,226,115,248,152, 26, 14,177,126,123,124,171,
-253,185,115,231,154, 3,188,154, 2, 45,208,109,107,133, 38, 65,150,164,201,248, 72, 71,239,243, 70,151, 98, 83, 69,227,117,186,
-112,144, 70,239, 0, 93, 10, 64,250,254,251,239,187, 67,130,164,128, 44,208,108,128,124, 90, 2, 90,244,187, 69,160, 53,127,254,
-252,112,239, 58,212,122,134, 71, 65,230, 80,146,181,103,207,158,181,165, 74,149, 34,200,250, 3, 33,132, 64,171, 76,153, 50, 28,
-160,123,243,249, 27,210, 70,157, 98, 56, 28,240, 22, 7, 34, 11,208,178, 87, 94,179, 51, 2,249,158,234, 66,170, 13, 37,216,130,
- 81,171, 50,112,224, 75,106,213,161,219,161,153, 30,200,130, 26,113, 14,226,111,144,233, 60,125, 87, 85, 2, 55, 77,218,104,149,
- 41,154,242, 88, 54, 56, 10,213,166,165,234, 79, 1, 90, 58,146, 41, 9,182,244,104,202,116,158, 36, 97,218,111,241,172, 67,230,
- 67,227, 71, 43, 34,156,185, 57, 52,255, 95,105,229,155, 55,111,174, 56,238, 84,131, 44, 76,176,110,144, 5, 96, 16, 0,201,169,
- 34,241,193,228, 27, 0,149, 27, 29,151,150,215,173,119,123, 93,196, 83,236,151, 86, 71,242,172, 67,186,112,128, 13,150, 98,163,
- 85, 11, 54, 89, 35,231, 7,156, 27,243,199,222,147,163, 23,236, 57,245,105,179, 46,119, 13,108,180,180,249, 84,118, 29,114,119,
-161,116,183,160,222, 93,216,167, 79,159,254, 18, 16, 93,188,120,177,249,210,165, 75,245,128,214,203,160,169, 0,173,174, 93,187,
-118,167, 11, 7,238, 44, 36, 64,146,187, 11, 97, 8,223, 93,130, 44,228,179, 1,242,169, 7,180,212,249, 84,232,193,211,126,247,
-195,135, 15,135,146,128,217,216,117,232,169,222,185,241,134, 71,253,244, 66,168,142,240,142, 4, 90,242,238, 2, 90,218,118,245,
-210,218, 82, 56,155,191,147,207,112, 50, 80,147,252,109,230,167, 30, 39, 35, 11,208, 42,235, 90, 40, 73,169, 22,255, 27, 95,102,
- 64, 75, 26,190,131,194, 70,132, 27, 4, 89, 88, 61,122, 4, 90,176,201, 90, 44,213,133,148,100, 17,100, 65,252,255, 46,129, 25,
-141,227,121,183, 11,180,164,141, 22, 84,136,161,220, 76,184,129,150,129,173, 21,192,214, 66, 3,160,181,193,204,182, 75,155, 79,
-117, 62,222,148, 73, 60,156,227, 70,132, 15, 20,112,105,208,143,224,137,234, 66, 41,201,146, 32, 11, 46, 4, 2, 36,200,194, 46,
-178,128,129, 3, 7, 42,182, 76,216, 85, 22,192,116,111, 88, 29,209, 25,105,144, 20,143,216,216,117,168, 11,138,122,246,236, 57,
-132,206, 72,229, 78, 64,236,218, 83,108,177,208,199,135, 80, 93, 72, 73, 22, 65,214,188,121,243, 76, 61,195, 35, 95, 10,120,243,
- 50, 77, 9,140,126,162, 51, 82, 74,178,212,187, 11, 81,215, 63, 81, 93, 72, 73, 22, 65, 22, 36, 84,150, 60,195,195,166,235, 39,
-170, 13,161,138, 12,235,174, 67,187,109, 94,109, 44, 43,199, 78,173, 52,203, 46, 77, 43,221,214,161,105,133, 75,214,227, 56,252,
-180,206,171,176,198,140, 44, 64, 75,219,127, 61, 75,167,205,128, 22, 65, 81, 40, 75, 78,215, 3,190,211,153,200,222, 73,159, 62,
-253, 3, 72, 31,132, 26,100,169, 13,228, 1,188,122,219, 5, 90,210, 70,139, 64, 71,155, 86,111,247,160,218,230, 42,117,190,234,
-138,191, 37,215,245,255,206,226,146,132,121,218,173,168,253,150, 58, 31,111,216, 36, 30,214,142, 17,225,131, 15,212,128, 67,224,
-184,115, 26,108,178,166,193, 30,107, 26, 64,214, 52,168, 11,167, 65, 93, 56, 13, 32,107, 26, 38,204,105,240, 70, 62, 13, 19,239,
- 52, 76,162,202,111, 62, 71,186,193,111, 88, 29,133, 0, 90, 81,162, 70,123,154,161, 92,251, 41,153, 43,118,153,152,241,163,246,
-147,248, 95,181,179,141,109,158,241,121,233, 2, 45,121,198,161,213, 59,193,148, 7,126, 42, 64,203,110, 48,161,169,123, 54,161,
-222,121,133,175,234,172,195, 48,116, 26, 7,104,133,102, 90,132,143, 33, 97,168, 39,189, 36, 78, 62,189,196, 72, 15,100, 34, 19,
-208,178,110,163,101, 6,180, 84, 18, 45,130, 42, 25, 54,240,183,198,189,131,187, 17,226,249,247, 56,181,254, 20,238,227, 40,201,
- 50,251, 70, 40, 85,160, 14, 40,162,141, 86,217,162, 41,143, 80,117,103,133,158,226,170, 33,113,174,153,169,114, 87,125, 16, 53,
- 81,174, 95,244, 38, 8, 9,208,212,126,183,180,254,183,180,223,202,155, 53,126, 27,230,131,170,204, 55,108, 18, 15,107, 23,138,
-240,193, 7, 27, 42, 62,194,236, 84, 1,106,195, 10, 48,124,174, 0,117, 87, 5, 28, 65, 83, 1,198,213, 21,224,231,169, 2, 12,
-142, 43, 12, 26, 52,168, 2, 64,150, 18,248,123,227,198,141, 21,152,238, 13,172, 35,186,109, 32,136, 98,208,186,112, 48,122,167,
-173,163, 79, 92, 0,135,109,216, 78, 96, 58,121,189, 12,154, 84,193, 53, 11, 67, 96, 58,189,124, 26,209, 83,226,215,200, 30, 45,
-144,234, 67,189,192,119, 94,108, 75,210, 70, 75,221,231, 34,188, 31,133,181,131,107,210, 57,249,244, 18, 35, 93,100,222,102,126,
-234,113, 50,178, 0, 45,239,182, 2, 27,212,222,230, 6,227,148,221, 70, 67,177, 16,213,225,167,103, 38,121, 58,207, 80,239,157,
-195, 79, 11,141,206, 70, 20,135,159, 54,152,101, 33,170,195, 79, 11, 76,178, 17, 37,178,240, 51, 50, 3, 45,173, 52,235,165,109,
-108,137, 44,149,235,228,211, 70,143,181, 16,213,225,167, 5, 38,217,136,226,240,211, 6,179, 44, 68,117,248,105,129, 73, 54,162,
- 56,252,180,193, 44, 11, 81,223,102,126, 70,102,160, 37,243,174, 11,176, 88,169,122,193, 66,123,112, 71, 49,162,225,233,185, 25,
-125,135,166,126,189,132,181,190, 28,126, 58,252,180,218, 6,156,190,105,204, 1,171, 60, 84,199,115,248,233,240, 83,143, 3,111,
-115, 91,146,252,176, 50,159, 69, 38,213,225, 75,147, 98,169, 27,212,219,140,204,157,178,155, 77, 47,246,222, 59,252,180,199, 47,
-179,216, 14, 63,205, 56,100,239,189,195, 79,123,252, 50,139,237,240,211,140, 67,246,222, 71, 22,126, 70,102,137,150,163, 58, 52,
-105,147,145,165, 17, 58,249,180, 55,184,152,197,118,248,105,198, 33,123,239, 29,126,218,227,151, 89,108,135,159,102, 28,178,247,
-222,225,167, 61,126,153,197,142, 8,126, 70,102,160,101,198,175, 8,123, 31, 17, 21,241,106,104,166,173,245,163, 79,234, 90, 15,
-148,144,166, 86,111, 11, 28,123, 53,249,180,144, 49, 77, 20,119, 62,177, 27, 52,154,157, 80,176, 96,171,232, 62, 5,123,143,142,
- 95,102,224,153,168, 5,251,124,171,162,107, 84,246, 40, 73, 51, 22,108,154, 46, 87,233,237, 41, 50, 23,189,150,165, 96,197, 3,
-137,211,230,109,135,116, 81, 84, 33, 1,206,240,203,129,255,241, 85,207, 72, 58,210,241,211,126, 85, 24,166,112,202,238, 69,102,
- 58,109,201,197,204,132, 57,211,248, 36,202,213,219, 39, 81,206, 97,238,144, 32,199,151,161, 88,205,103,234, 56,137,114,246,195,
-217,177,105, 60,244,119,217,159, 19, 29, 63,126,188, 0,226, 37,210,244,113,190,215,123,167,254,180,211,230,223,206, 54, 31,153,
-129, 86, 89,100,222,186,123, 7, 91,245,155,229,243, 12, 62, 25,234,244,241, 73, 95,231, 36,238, 60, 90, 34,108,157, 37,211,103,
- 31,248,100,168,251, 57,194, 64,208,249, 59,110,174, 47,174, 69,205, 92,255,128, 79,166,122,236,168,246,105,102,168,211, 22,116,
- 2, 13,130,218, 13,131,181, 73, 60,245, 39, 15,119,156,122, 38,142, 95,121, 46, 20,176,101,126, 89, 25, 40, 98,112,208,135,203,
-139,142,241,226,197,251, 5,247,174,248, 95,207, 53, 48,233,125,193, 10,205,168, 72,216, 50, 94,220,184,139,114,167, 76,124,246,
-189,232,209, 54,227,255, 32, 43, 52,237,131, 44,223,233,223, 13,251, 75, 60,121,250, 92,196, 41, 53,240,188,135,129,151,175,162,
-164,206, 86,114,105,215, 62,163,238,158,185,124, 71, 60,123, 30, 44,206, 5,222, 21, 61, 6,140,123,244, 65,182, 18,127,195, 5,
- 67, 84, 6, 56,182,253, 18, 14, 72,251,226,222,140,255,225,194, 65, 14,218,122,101, 79, 9,186,234, 1, 63, 46,254, 23, 71,104,
-236,186,243,191,167,203, 10, 63, 35, 5, 77,156,188,144, 42,101,202,148,190, 56,150,103, 39,239,252,239,133,178,155,183,114, 15,
-125, 19,117, 55, 9,175,233, 35,202,206, 93,251, 77,143,117, 20, 43, 86, 44,186, 88, 80, 6, 55,215,111, 43,121,182, 82,239,161,
-232,152,124, 43, 76, 52, 95,105, 29, 1, 48,253,125, 80, 4,168,131, 2,168,180, 23,158,133,142, 7,128,246,255, 75, 93,246, 40,
-236,179,236,187,184, 58,179,238, 57,190,201,254, 45,239,218,119,170,126, 46,169, 70, 62,126, 90,105,121,214,226,188,205,101,215,
-227, 80,100,177,209,178,119,168,180,105, 91,200, 89, 39,174, 79,134,218, 95, 2,196,172, 47,219,120, 80,240,220, 85, 7,133,223,
-154, 83, 2,255,143,106,210,154, 55,152,116,205, 98,250,100,172, 59, 52,111,173,159,158, 15,152,182, 81,172,218,121, 65, 28, 56,
-123, 95, 28, 56,255, 88,124, 59,241, 8,105,110,179, 77,147, 9, 0,178, 78, 4, 62, 21, 27, 14, 63, 18, 27,143, 60, 18,155,142,
- 62, 18, 91,142, 61, 18,127,239,123, 64,154,106,255, 55,140,109,158,207,212,181, 30, 19,100,213, 24,113,159, 64,235,177, 41,143,
-204,105,166, 79,150, 44, 89, 95,120,220, 30,190,108,217,178,233,171, 87,175,246,195,125,214,176, 97,195,126,137, 29, 59,118,127,
-208, 47,162,243, 13,179,124,166,205,156, 58,213,182,191,134,255, 36, 2,151, 78, 19, 55,126, 31, 37,174,253, 54, 64,108,234,213,
- 84,228, 74, 28,235,186, 65, 57, 77, 37, 90,101,203,150,125,135, 65, 2,177, 23,146,172, 23, 32,139, 23,239,248, 79, 48,103, 56,
- 72, 38, 78,159,255,139, 14, 61,127,185,251,228, 89,176, 56, 21,248, 72,236, 60,126, 95,185, 63,122, 18, 44, 58,246, 26,121, 47,
- 89,134,130,109,232,159, 12, 4,102, 3,104,177, 29,205,150,131, 50,126, 19,108,105,203,222, 23,207,158, 33, 60, 71,248, 13,192,
-172,113,197,138, 21,127,130, 39,112, 95,248,213,242,229,253,147, 79, 62,249,137,207,241, 62, 55, 66,116, 27,252,100,220,220,175,
- 59, 77, 0,170,216, 56,126,167,109,190,124,249,246,124,243,205, 55,193,127,255,253,183,192,185,142,226,175,191,254, 18,237,219,
-183, 15,230,115,190,103, 60, 27,101,183,208,180, 13,163,104,235,136, 3, 15,193,176,213, 32,227,171, 63, 96,214,230,221,190,147,
-145,200,170, 33,170, 25, 77,163, 2,122,250,150,150,230, 65, 28, 81, 22,200, 0, 80,161, 4,180, 39, 37,192,151,155, 18,162, 71,
-143,174, 4, 56,209,229,243, 19, 22,234, 40, 27,226, 80,218,107, 53,100,247, 72,211, 5,160, 32,157,250,219,178, 68, 11,113, 9,
-186, 52,128, 44, 4,208,114, 45,144,184,224, 83, 28, 91,243,174,227, 23,209,253, 14, 81,148, 69,150,171,159, 27,142, 33,225,105,
-152,174,180, 97,173,119, 79,159,118,104,122,161, 98, 76, 72, 68, 22,160, 85,214, 53, 6,169,165, 90,182,185, 19,197, 39, 83,237,
-178, 62,233,107,207, 72, 87,166, 93,208,240, 89, 27,197,234, 93,129, 98,217,174, 32, 49,234,175,187,162,210,183,243, 8, 96,250,
-104,168,122,110,132, 25,234, 21,126, 39, 75,189, 67,195,253,118,138,128,147,143,196,180,245,247,196,128,197,183, 69,207,249,183,
- 68,175, 5,183,196,215,227, 15, 11, 72,202,120, 8,171,157,129,247, 69, 92,128,169,181,135, 30,138,190,139,110,139,254,160, 57,
-104,233,109, 49,216,255,142, 24,186,252, 78,216,128, 86,170,170,251,191,248,121,135, 40,250,221, 54,225,131,223, 22,184,231,169,
-236,185,178,102,205, 58, 24, 96, 96,242,200,145, 35,253,126,250,233, 39, 63,120, 48,247,155, 56,113,162,223,220,185,115,121,159,
-130,163, 98, 8, 36,146,218, 40,123,142,234,133,243,222,186,184,118,153, 56, 51,168,141, 56, 92, 63,135, 56,214, 48,187, 56,211,
-170,136,184,244, 93, 89,113,174,101, 30, 81,244,253,184,119, 65,239, 3, 35,154,106,137, 86,206,156, 57,223,197,193,197, 77, 33,
- 33,153,136, 51, 2,151,148,173, 90,127, 81,137, 6,195, 38,103,106,184,228,251,120,213,230,172,232, 52, 98,141, 26,100, 77, 87,
-192,215,255,175, 80,101, 79,147,171,244,230,147, 23,110,137,147,151, 31,137, 47,199,158, 23, 62,117, 14,136,166, 99,206,137,189,
- 39,239,138,128,195,129, 34, 85,246,146,123, 52, 64,235, 7,254, 87, 13,192,106,154, 84, 69,224, 44,233,199,193,204, 68,204,152,
- 49, 5, 0,234, 20,120,136,247,213,134,163, 71,143,250,226,232, 29,223, 18, 37, 74,252,128, 52,181, 60,241, 51, 86,172,216,103,
-217, 81, 98,197,142,125, 31, 71,187,244,129,183,249, 80,244, 72,223, 14, 77,126, 47, 65,130, 4,191,162,190,167,120,147, 38, 78,
- 90,248,187,126,253,250, 79,113, 84,142,128,122, 70, 60,120,240, 32, 84, 56,114,228,136,192, 97,218,226,243,207, 63,127,202,248,
- 54,218,146,133,230,173, 27, 37, 68,189,187, 36, 89, 4, 89,150, 46,131,248,102, 19,217,107, 9,180, 0,176,206,145,247,168,115,
-129, 35,130, 4,142, 53, 82,234, 2, 71, 66,137,209,163, 71, 11,158, 17, 59,116,232, 80, 49,100,200, 16, 1,103,186, 34,110,220,
-184, 23,117,152,164, 45,123, 54, 20, 54, 13, 66, 90,215, 61, 53,238, 31, 32,164, 68, 72,129,144, 28, 33, 25, 66, 18,132,196, 24,
- 67, 8,204,180,215,255,105, 74,160,133, 59,192,248, 95, 89,178,100, 57,226, 41, 48, 14, 1,150, 9,208, 74, 68, 9, 22, 62, 74,
- 71,214,203, 93, 64,235,182,235,191,218,193,245,109,215,187,229,124, 71, 9, 23,238,236,215,242, 50,171,119, 75,109,234,101,183,
-249,176,100,202, 66,189,123,131,108,100,225,167, 94, 89, 21,160,133,246, 82, 4,161,134, 42, 84, 84,253, 46,138,223,197, 92,255,
-213,207, 25, 95,254,151,119,210,145,180,152, 78, 77, 87, 79,192,225, 13,254,251,248,224,104, 18,101, 37, 40,239,186, 84, 51,212,
- 89,241,213, 79,179,197,226, 13,167,197,210,157,119,196,144, 63,239,136, 62, 0, 49, 3,150, 0,196, 44,185, 37,222,203,223, 42,
-216,135,106, 68,171, 87,250,218,157,243,126,210,231,217,206,163,183,197,140, 13,247,197, 55,211,111,136,150,227,207,136, 79,122,
-173, 23,197,154,207, 20,105, 42,254, 36,162,102,105,180,215, 39,125,221,210, 86, 73,134,136, 7,160,245,239,193,135,194,247,143,
-219,161,192,150,142, 68,203,252, 19, 73, 63,156,215,103,201,195, 23, 18, 45,252, 54, 79, 96, 24, 35, 15, 6,179,159, 49,248, 78,
-249,241,199, 31,253, 58,118,236, 56, 13,147,112, 87, 12,138,253,211,165, 75,215,113,240,224,193, 19,112, 38,164, 95,131, 6, 13,
-120, 84,140, 85, 36,159,251,147,226, 5,238, 93,223,185, 94, 28,233, 90, 91,236,171,149, 73, 12, 44,242,190,168,150, 38, 94,240,
-183,121,146,138,163, 95,228, 20,151, 90,229, 21,171,106,103, 21,209, 95, 28,228,173,123, 73,160,133, 1, 53,117,230,204,153, 23,
-248,250,250,110,198, 17, 55,187,174,220,126,190,111,236,138, 43,103,227,212, 88,252,204,167,194,239,162,225,192, 45,226,194,181,
- 32,209,113,196, 63,148,100, 41, 32,139,105, 61,241, 36, 69,150, 98,151,159, 60, 13, 22,219,143,129,127, 0, 89,255,236,189,165,
-220,151,109,185, 36, 78, 92,188, 39,146,103, 44,242, 16,233,103, 35,240,236,194, 89,188,243, 63, 85,137,184, 39,208,208, 14, 5,
-180,224, 9, 94, 23,104, 93,187,118,205, 23,135, 5,251,226,252, 67, 95,208, 96, 48,188,240,173,167,193,128,110,113,227,198, 11,
-254,243,207, 63,199,220,184,113, 67, 23,104,217,161,201,143, 1,176,222,106,221,186,245,189, 74,149, 42,157, 34,168, 6, 0,234,
-167, 5,132, 56, 0,217,119,205,154, 53,190, 43, 87,174, 52,205, 39,105, 22, 47, 94, 92, 60,125,250, 84, 60,123,246, 76, 0,112,
-234, 2,173, 71,143, 30, 9,156, 5, 41, 64, 91, 48,126, 56,218,108, 88,147,134,146, 80,153,168,223,244, 36, 90, 30,191, 29, 70,
-213,161, 33, 77, 23,216, 35, 6, 8,165,238, 36,160, 71, 66, 75,106, 74, 2, 45,156,197, 40,160,194, 21,169, 83,167, 22, 25, 50,
-100, 16,217,178,101, 19,185,115,231, 22, 5, 11, 22, 20,197,138, 21, 19,165, 75,151, 22, 31,125,244,145,232,223,191,191, 17,208,
-210,230, 83, 2, 45, 74,120,163, 97,204,232, 9,233, 55, 79,219,120, 26, 39, 78,156, 51,200, 95,111, 60, 87, 22, 60,200,127, 66,
-220,244,128,214,255,105,170, 64, 19, 1,150, 27,177,234,252,120,248,240,161, 96, 28, 3,160,229,166, 73,155, 44,242, 78, 69, 98,
-157, 7,186,234,119,147, 92,246, 92, 97,109,107, 78,186, 55,128, 3, 6, 88, 68, 2,173, 26,178,255,189,104,226,194,253, 31, 71,
-251,245,144,255,213,207,213,241,212,239,213,191,153, 86,210,117, 61,143, 24, 78, 90, 4, 90,155,107,118, 93, 34, 58,206,186, 41,
-186,250,221, 20, 61,230,189,144, 58,245, 89,120, 91,124, 57,116, 7,165, 68,234, 51, 14, 61,103, 52, 67,157, 82,249, 63,239,247,
-252, 16,212,131, 93,230,220, 20, 95, 77,186, 38,138,183,254, 93, 68,203,210,224, 18,108,180,198,249,100,172,211,204, 39, 99,189,
- 92, 62, 62,158, 39,111,143, 31,201, 88,251,250,154, 3, 15,197,143,191,223, 10, 5,182, 94, 33,208,202,151, 61,123,246,159,113,
-120,237,212,206,157, 59,251,125,245,213, 87, 19, 49, 56,246, 66, 57,106, 35,208, 22,168, 48, 64, 78,119, 2, 45,172,114,103, 97,
- 0,165, 84,203,236,202,215,181, 89,163, 7, 71,119,239, 20,235,191,111, 38,182, 85, 75, 39, 42,164,140, 67,149,218,247, 8,180,
- 1,251,168, 94,230,132,207, 47,181,204, 43,142, 55,207, 45,114, 36,142,117,201,136, 32,193, 18, 37, 89, 4, 89, 48, 72,223, 25,
- 28, 28,188,139, 97,221,161, 39, 71, 9,178, 54,254,119,237, 57, 91,119,224,205,135,162, 94,191, 45, 34, 94,213, 57, 43, 36,200,
- 50, 3, 90, 89, 11, 85,218, 39, 37, 90, 95,140, 62,171,128,172, 58, 67, 78,136, 85, 1,151,133,255,198, 99,162, 84,229,122,143,
-168, 50, 36,200,114,221,249,155,161,175,203, 56, 94,155,109,242, 38, 24, 19, 90, 48, 36,110,187, 54,109,218, 52, 2,128,195,247,
-214,173, 91, 10, 56, 34, 72, 58,127,254,188,239,214,173, 91,125, 33, 61,240,197,177, 60,166, 0, 70, 13,180, 32, 89, 28, 3, 32,
-227, 27, 94,154,204, 52, 0,180,178,122,223,191,127,191,232,213,171,215,131,170, 85,171,158,235,210,165,203,194,128,128,128, 65,
-204, 35,250,159, 47, 58,187,111,171, 86,173,124, 33,161, 50,205, 39,105, 66,210,168,204, 95, 56,239, 81,240, 12, 81, 6, 2, 46,
- 78,136, 4, 88,124, 14, 64, 40, 40,213, 58,117,234,148, 96,124,179,134,228,237,247, 46,176,162,149,104,185,231, 93,215,224,230,
-254,172, 65,124,111,103,203,140,158,161,186, 19,109,139, 11, 0, 75, 18, 58,244,221,115,148, 54, 18, 96, 1,104,139,230,205,155,
-139,205,155, 55, 43,117,243,223,127,255, 9, 28,180, 45, 42, 84,168, 32,208, 22, 20,160, 5, 27, 77, 61,137,150, 54,175, 10,208,
-162, 26, 31, 0,115, 59, 36,154, 15, 72,235,254,253,251, 98,251,246,237,226,211, 79, 63,125, 8,201,216, 94, 36,138,142,120,220,
- 76,226, 25,104, 73, 35,119,220, 9,162,216,118,208, 38, 13,131, 2,180, 84,105, 12, 24, 73,137, 22,165, 83,156, 15, 66, 72,173,
- 92,207,164, 84, 43,132,180,203, 37, 5, 83, 75,180,204,234,201,121,255, 6,114,192, 10,208,114, 73,173, 20,201, 22,199, 16,189,
-187, 17,168,114,141, 57,134,105,240,162, 68, 56,216, 90, 86,210,119,221,249,255,255, 23, 11, 39,131,225, 71,210,213,121, 31, 32,
-232,116,133, 14,161,193, 86,238,218, 35, 0,180, 96,179,101,229, 74, 89, 51,118,212,204, 13, 78,108,135, 36,171,195,111, 55,197,
-167,131, 14,139,100,165,190, 71,250,186,211, 0,128, 56, 56,132,255, 74,255,121,158,228, 69,219, 62,255,115,247, 3, 69, 13,169,
- 5, 91,175, 8,104, 21,196,138,118, 16, 6,235,169, 0, 15,126,109,219,182,253, 21, 43, 82, 78,170,165, 84, 5,142, 10,219,141,
- 95, 8,180,160, 98,240,195,123, 74,181,184,122, 53,186, 10,118,109,209,244, 65, 48,164, 26, 71, 0,180, 62,203,144, 84,148, 75,
- 30,155, 32,171,166, 58, 65,166, 4, 49,206, 94,132,234,240, 76,139, 60,162, 66,218,247, 56,145,196,210, 35, 72,176,132, 73,161,
- 25, 37, 89, 18,100,241,190, 96, 91,208, 73, 74,178,120, 21, 44, 87, 71,185,243, 63,213,136,106,117,163,167,138, 75,152, 58, 87,
-219,118,223,255,252, 40,232,209,115,168, 11,239, 8,255,173,151,196, 63,187, 46,139,157, 71,174,139, 90, 95,116,125, 18, 43,254,
-251,180,197,163,122,143, 18, 45,218,104, 73,137, 86, 51,252, 54,106, 23,147, 41, 25,132, 90,102, 4, 38,181, 17,180,205, 2,192,
-240, 69,246,124, 15, 30, 60,232, 59,106,212, 40,223, 54,109,218, 40, 0,134,234, 67,208,177, 44,209, 26,131,107,231,206,157,190,
-201,146, 37,191,205, 78,147, 40,113,146,123, 97,161, 73,158,164, 73,147,230,142, 27, 93,224, 7,192,149,128, 4,238,113,173, 90,
-181,142,125,247,221,119, 74,254,100,176,146, 79,210, 4, 32, 86, 72, 66,226, 40, 0, 42, 5, 14, 80, 86,164, 91,188,110,223,190,
-173, 0,172, 29, 59,118, 40,129,170, 69,198, 15,127,199,178, 77, 65, 79, 66,101, 8,180,200,103, 4, 75, 64,198,118, 78, 44, 38,
- 48, 1,123,150,243, 7,208,126,238,215, 95,127, 85,164, 88,205,154, 53, 83,128, 47,206,226, 20, 0,240, 98,203,150, 45,226,216,
-177, 99, 2, 18,109, 1, 59, 66,187, 64,235, 3,140, 11, 63,212,171, 87,239, 1,129, 53,212,216, 2,237, 84,161,119,225,194, 5,
- 81,173, 90,181, 32, 44,222,250,161, 28,239,161,200,158,129,150,138, 39, 70,170,195, 50,101,202, 4, 74, 0,166, 0, 45,243, 75,
- 49,132,119,153, 1,132,176,195,146,118, 90,200, 91, 40,251, 45, 29, 27, 45,243, 47, 57, 49,222, 56, 14, 24, 96, 17, 74,180, 90,
- 73,240,196,113, 66,130, 45,249, 91,123,247, 4,180,180,116,100, 90,151, 84,172,124, 24,153, 90,214, 53,126,169,147,115,188,224,
-243, 23,151, 37,137, 22,118,255,165, 40,254,245,221,127,246, 92, 23, 29,102,222,124, 33,217,130, 52,170,227,140,139, 80,241, 53,
-184,239, 67, 3,121, 43, 87,134,218, 99, 7,206,216, 46, 38,254,115, 87,212, 30, 25, 40, 18, 22,253, 46, 88,217,109,232,173, 43,
-125,189,188,200,231,205, 53,123,175,139,159, 32,113,251,126,238,173, 23, 54, 95, 42,201,214, 43, 0, 90, 41, 96,248, 62,156, 32,
- 11,131,150, 31, 6,220,217, 48, 82, 38,136,210,162,231,210, 80,241, 12, 90,186,116,169, 31, 84,136, 51,240,190,183, 7,182,164,
- 46, 87, 48,223,125,130, 44, 14,226,219, 54,109, 20,117,138,228, 10, 5,178,144,190,100,171,162, 25,159, 95,106, 95, 74,156, 6,
-208,202,152, 32,230, 5, 35,154, 46,137,214, 28,170, 11,213, 64,235,255, 18,173,171,138, 68,107,253,254,171,207, 99, 85, 91,248,
-140, 54, 91, 86,129, 22,190, 25, 37, 85,182,146,203,218,116, 29,116,119,243,190,243,226,240,185,219, 98,241,218,195,162, 86,211,
-174, 79,146,101, 42,170,236, 58,212, 26,195,107,108,180,244,178,237, 11, 73,142, 47, 86,243, 33, 2,165, 89,106,240,194,223, 4,
- 93, 32, 96, 11,104,145, 46,128,175, 82,102,118, 34, 0,163, 17,106,186, 86,104, 50,211,169, 82,165,186,171, 6, 90,242, 55,140,
-247,175, 65, 10, 49, 60, 44, 52, 51,101,202, 36, 80, 71, 10,208, 82, 7, 74, 76, 36,192,146,119,130, 46,198,247, 86, 23,179, 74,
- 71, 13, 90,212, 42, 62,169,130,211,238, 18, 52, 1, 57, 86, 63,235, 19, 78,117,162, 33,152,178,147, 63, 2, 45,216, 90,138, 60,
-121,242, 8, 28,102, 46,254,253,247, 95,197, 70, 11,109, 90,172, 90,181, 74,236,217,179, 71,108,216,176, 65,212,173, 91, 87, 1,
- 90,239,189,247,158, 85,137, 86, 42, 72,173, 14,239,219,183, 79, 64, 37, 46, 32,201, 21,187,118,237, 18,135, 14, 29, 82, 54, 66,
- 96, 83,141,128, 77,224,105,228, 53, 30, 24,102, 25,104, 25, 49, 87,170, 20, 41,233, 10, 15,208, 98, 95, 38,192, 98,208,130, 48,
- 11,253,220,114,221, 59, 17, 35, 55, 7, 94,134, 68,203, 12,164,133,145,131,114,124, 45,235, 74, 47,239,255, 31,119, 77,129, 22,
- 64,214,251,197,190,190,189,106, 55, 65,214, 13,241, 89,191, 93,162, 84,219,133, 10,216,170,212,233, 79, 24,172,215,157,105, 41,
-115,233,235,100,205, 81,163,119,240,150, 99, 15, 69,173, 97, 87, 69,246, 6, 51,152,118,180,165,180, 86, 34,165,171,147, 15,249,
-188,185, 26,249,236, 60,251,166,168, 51,112,183,136,158,173, 9,128, 92,157, 27, 26, 55, 15, 90,247, 14,166,212, 99, 39, 46,178,
-184,203,244,211,162, 98,159, 19, 34, 86,242, 2, 75, 77, 19,104, 34, 0,104,213,130,125,206, 88,216,224,204, 78,148, 40,209, 47,
-120, 77, 55, 4,234, 75, 49,144,199,128, 54,115,209,162, 69,126, 80, 43,112, 23, 95, 19, 79,223,129,184,125,200,170,105, 19,196,
-166,245,235, 68,157,146, 5,159, 34,110, 53, 77,252, 28, 21,243,102,189,121,117,193,104, 17,216,189,170, 88,252,177, 50,217,206,
- 48,162, 73,149, 4,212, 92,155, 1, 94,220, 64,139,191,143,157,187,185,175,207,172, 67,103, 9,174, 40,201,138, 89,245,143,103,
-223, 79, 10, 56, 75, 3,121,245,110, 68, 19,158, 40, 43,221,164, 25, 11, 55, 3,224,218,145, 52, 93,129, 71,165,171, 54,124, 8,
- 73,214, 86,185,187, 48, 12, 64,107, 40,164, 3,195,181, 64,139,234, 56, 45,208, 2,112,245, 58,208,178, 66,147, 60,121,255,253,
-247,239,233, 1,173,114,229,202, 93,215, 2, 45,171, 52,105,251, 67,117,161, 22,104, 17,116,107,129, 22, 39, 97,198,183,219,102,
-189, 16, 95, 13, 90,220, 44,240, 96,235,100, 89, 98,100,146, 55, 79, 82, 51,143, 73,189, 37,209,194,110,194,115,144, 90,138, 66,
-133, 10, 41,170, 61, 74,178, 22, 46, 92, 40,254,249,231, 31, 69, 2, 69, 73, 20, 37,155, 77,154, 52, 81,128, 22,192,145, 85,160,
-149, 18,224,255, 1,165,150,172,103, 9,178,176,113, 67, 92,185,114, 69, 4, 6, 6, 10,188,127,138,114,196, 65, 65, 29,160,229,
-133, 70,236,144,120,121, 28,176, 2,180,144, 27,101,225,171,150, 76,105,109,180,204, 36, 90,234,247, 94,178,209,146,227,171,209,
-221,132,137, 46,144,181, 50,224,154,104, 51,229,186,168,238,187,147,224,229, 14,213,136, 37, 90,207, 19,201, 75, 67,237,151,177,
-110, 57, 75, 85,145,177,246, 23, 61, 39,108, 16,189, 97,215, 85,238,199, 3, 34, 74,166,250,167,124,146, 55,225,128, 16,254,203,
- 5,178,254,222,117, 77,124, 59,227,134,248,164,239, 46,228,243,139,219, 62,216,217, 24, 94,226,141,223,125,183, 86,243,252,201,
-159, 29, 57,185, 73, 28, 60,181, 94,228,175, 27,243,105,202, 15, 67,237, 96, 51,253, 12,236, 48, 62,197,106,123, 20, 34, 22,213,
- 68,206, 3,137,195, 32, 24,108, 79, 33,200,130,129,252,100,128,168,129,136, 99, 69,149, 58,172, 96,250, 15,158, 32,110, 85, 13,
-205,220, 53, 11,229,186,115,117,245,239,226,162,111, 29,113, 4, 6,241,217, 18,197,184,141, 56, 41,172, 2, 45,168, 38,118, 97,
-240,222, 5,149,217,174, 21,107,182,239, 27, 60, 99,211,209,142,195, 87,159,236, 54,116,201,209,153,243,150,239, 43, 92,184,240,
- 82,187, 64, 75,170, 15,144, 7,233,198, 65,217, 93,168, 90,213,186,221, 59,152,172,116,105,163,245,156, 54, 90,144, 2,110, 81,
-131, 45,168,202, 66, 1,173,126,253,250,121, 29,104, 89,161, 73, 94, 3,100, 7,233, 1,173, 82,165, 74,221,208, 2, 45,171, 52,
-147, 38, 77,170,168, 10,181, 64,235,238,221,187,161,128, 22,237,120, 24,223,180,129,122, 57,130, 6,180,132, 0, 63,242,143,107,
-208, 84,190,108, 71, 98,100,146,213, 48, 3, 45, 87,126,116,213,151,118,242, 7,245,222, 57,104,159, 5,118,187, 42, 18, 45,218,
-103, 81,117, 72, 96, 68, 85, 46, 1, 17,213,125,180,221,130,139, 23, 59, 64,235,125,140, 35,135, 41,201, 98,122, 74,181,206,156,
- 57,163,128, 44,214, 61, 65,156, 75,162, 69,151, 30,150,129,150, 39,213, 33,153, 25, 94,137,150,148,100, 73,201, 22,242, 22,194,
-245,131,163, 58,244,114,231,123,179,200, 89,217,117,200,157,131,220, 65, 72,219, 45,245,174, 66,245,111,189, 93,135,220,169, 40,
-211, 41,105,195,200, 58,181, 68, 75,173, 50,180, 48,238, 2,100,193,214,233,246,159,219,175,138,102, 19,175,137, 10, 61,119,136,
-119,178, 54,185,165, 56, 17, 85,108,182,234,108,132,225,250, 95,200,152, 39, 59,162,255,231, 59,125,237, 81, 11, 55,156, 19,141,
-199, 93, 19, 57,155, 46, 36, 64,163, 33,120,248,175, 76,159,231, 79, 94,244,235, 91, 43,119, 94, 21,173, 1, 6,171,253,180, 19,
-249, 36,200,250,188, 80,120,136,127,133,237,198,173,226,198,154,183,170,102, 41,113,172, 99, 3,113,228,196, 90,241,223,249,127,
- 69,255,128,212,162,241,164, 68, 34, 77,165,168,243, 62, 40, 30, 98, 75,178,149,207,105,221, 43,228,131, 72,126, 16, 86,186, 83,
-105,155, 5,144, 53, 5, 59,137,250,129, 80,126, 43,196, 92,113,180,254,114,242,117,109,222,232,193,222,141,107,197,182,159,154,
-139, 99,141,115,136, 26,233,226, 83,173,168,149,120,133,248,132, 90,117, 8, 21,212, 46,216,124,236,130,138, 98, 23, 0,224, 46,
- 0,192, 93,176,133,218,133,237,232,187, 96, 92,174,220,233,250,193,134,234, 48, 49,192, 99,119, 2, 44, 87, 8,177,187, 80,245,
-124,146,198, 70,203,210,174, 67, 12,212, 83, 36,216,162, 45,149, 90,162, 5,159, 82,190, 48, 62,182, 5,180,176, 99,108,140, 39,
-213,161, 85,154,100, 48,212,196, 15,244,128, 22, 0,226, 77, 53,208,178, 73, 83, 1, 90,148,108,168,193,150,148,116, 72,169, 22,
- 39,118,170,153,144, 7, 11, 29,222, 70,139,179, 22,213, 45,161, 82,171,243, 94, 96,170, 23,151, 26,104,121, 2, 57,234,207,153,
-169, 6,205,222,123,202,186,183, 36, 90, 4, 90, 80, 45, 11, 44, 68, 4, 54, 62, 8,180, 73,101, 51, 4,236, 8,197,213,171, 87,
-149, 93,162,116,245, 0, 27, 66,197,189,131, 13,137, 86,114, 72, 4,127,168, 94,189,122, 16, 37, 98,231,206,157,115,131, 44,238,
- 66,229,115,142, 31, 40, 7,237, 48,109, 25,195,235,181, 81,249,204, 13,180,172, 25,195, 75,247, 14,118,140,225,181,238, 29,172,
-181, 48, 39,214,219,192, 1,171,187,239, 95, 37, 47,202,106,198, 50,230, 37,164,141,150,110,238, 0, 94,146, 21,105,115,123,217,
-182, 43,162,193,152,107,162,116,215,109,216, 21,216,248, 5,200, 10,235,149,161,206,166,109, 71,239,137,170,131,175,136, 15,170,
- 13,167, 1,188,199,137,223,210,103,148,124,182,189,181,124,199, 85,241,229,164,235,162,162, 4,131, 25,235, 20,180,148,222, 32,
- 18,165, 88,131,179,166,190,113, 14, 0,235,110,167, 58,226,230,103,121,197,144, 82,201, 68,221, 33, 9,196,232,115,233,196,152,
- 11,233, 68,159,157,169, 68,145, 86, 49,175,135, 69,186,229,250,108, 65,236, 74, 26, 4,155,162, 41,216, 33,230,247,195, 15, 63,
- 76,197, 32, 57, 0,239,212, 6,242,118,139, 81,176,123,171,102, 15,130,159, 63, 19,251,183,111,129,129,124, 18, 81, 37,117, 60,
-130,172,207,204, 8,169,141,225,159, 60,121,162,128, 44, 0,192, 93, 88,133,238,154, 52,105,210, 46,248,250,218,213,163, 71,143,
- 93,240, 3,180,171,114,229,202, 91,232,103,203, 42,208,194,138,190, 48, 0,212,111,170, 29,133,218,221,133,114,151,161,118,231,
-161,222,174,195, 80,238, 29,134, 15, 31, 62, 5,118, 47,138,173, 22,192,133, 2,180, 8, 92,160,174,245,253,250,235,175,125,193,
-103, 2, 45, 30,247, 99,120, 73, 63, 90,177,227,196,121, 48,103,206,156, 81, 84, 65,106,109,180,236,210,228,199, 0,114,142, 98,
-119,217, 3, 74, 27,212, 23,212, 74,183, 8,180,194, 66, 19,234,231,251,116, 13,192, 9,156,234,194,155, 55,111, 42,128,139,119,
-130, 44, 78,140,156,216,225,166, 66,113, 37,192,248,102,245,239,237,247, 70,160,197, 8, 8,217,144, 24,133, 71, 98, 21,170,152,
- 90,251, 49,215,238, 66,126, 67,207,163,189, 37, 99,125, 56, 33, 61, 71, 95, 89,112,233,161,236, 44,236,214,173,155,192,130, 69,
- 49, 88,167,205, 28,165, 93,216, 16, 35, 58,116,232, 32,126,254,249,103,145, 48, 97, 66,171,170,195,164,148, 34, 67,170,181,253,
-195, 15, 63, 12,130, 61,167,160,218,144,180,209, 30, 30,196,143, 31,127, 47, 10,200, 93,135,220,113,108,203,189,131,165, 93,135,
-250,126,180,220, 60,117,220, 59,120,187, 23, 57,244,192,129,200, 0,180, 88, 81,101, 93,224, 74, 46, 32,249,223,228, 2, 40, 34,
-200,170, 59,234,154, 40,214,113, 75, 88, 65, 86, 8, 39,105,177,114,125,121,151,222,217, 9,180,226, 21,254, 14,246, 89, 13,146,
-155,101, 67,231,125, 72,199,107,200,167, 63,242,217, 8, 82,178,178,223,111,123, 33,113,179, 15,178,220, 52, 1,176,122,125, 25,
- 43,198,227,121, 21,139,139,139,112,151,112,167, 89, 25,113,244,163, 76,162,207,251,239, 93, 39,248, 34,168, 34,184, 34,200, 34,
-216,234,183,251, 3, 81,173,119, 60,145,170,124,148,199, 41, 75,133, 48, 94, 55,115, 16,151, 2, 6,176,195, 8,178,176,186,245,
-195, 64, 57, 59, 73,146, 36,122, 6,242,106, 22,152,209, 76, 93, 36,107,166,123,193, 88,217,210,127,210,150, 13,235, 68,195, 18,
-121, 8,178,106,121,224,179,155,166,218,189, 3,140,119,119,210, 40, 30,119, 69,146,245,203, 47,191, 40, 64,139,210, 44,248,132,
-218, 73, 23, 16,116, 5, 97, 0,180,244,242, 73,137, 22,253,149, 80,162, 21,106,119,161,235,185,244,163,197, 93,135,156,228,232,
- 71,171, 25,238, 84,161,106,105, 74,207,240,116,241,176, 13,182, 46, 35,232, 47,139,206, 68, 9,180,160,142,241,237,211,167,143,
-111,145, 34, 69,124, 93,219,205, 9,188,185,219,201,140,159,140, 83, 16, 0,171, 51, 38,199, 16, 64, 11,229, 30, 17, 70,154,239,
-128,102, 23,216,106, 93,134, 75,143,135,148,106,240,202,159, 63,255, 29, 72, 52,134,135,149, 38,164, 32, 35, 1,160,158, 54,106,
-212, 72, 49,132,102,157, 19,104, 29, 56,112, 64, 81, 85,125,252,241,199,156,192,159, 50, 30,190,207, 60,152,149, 61, 12,221,209,
- 35, 77,187, 54, 87,122,241,245,218, 82,120,129,150,150,166,150,158,153, 39,123, 61, 62,133,160, 73,160, 5, 39,186,162, 70,141,
- 26,202,206, 66,244, 19,209,176, 97, 67,209,180,105, 83,209,178,101, 75, 1,240,175,128,172,174, 93,187, 10,216,229, 17, 8, 91,
-117, 88, 74,103,164,138, 31, 45, 72,182,122, 2, 88,157,162, 91, 18,220,207, 96,145,214, 27,207,165, 31,173,119,241,251, 85, 57,
- 44,149,238, 29,236, 56, 44,165, 20,204,113, 88,250,162,101,153,141,243, 97,233,167,145,133,166, 94,217, 34, 11,208,178, 89, 47,
-112, 64, 25, 61,251,151,247,186,204,186, 26, 30,144, 21,170,193, 68,201, 88,119, 87,133,222, 71,197,135,221,247,138, 40,153,235,
- 31,182,153, 43, 25,253,255, 13, 70,149,207, 18,157,183,134, 21, 12,134,200,103,147,119,223,125,240, 8,222,213, 31,239,217, 44,
-182,151,201, 34, 22,229, 73, 41, 90,196,137, 57,143,106, 68,153, 1,170, 11,169, 54,164,250,176,227,242,228,226, 72,208, 66,113,
-246,209,122,241,126, 41, 31,245, 25,136,166, 13, 59,121,242,228,159,208, 64, 30, 82, 35, 35, 3,121, 45,139, 76,105, 34,193,144,
-101, 99,126, 6,200, 90, 47, 26,150, 41,162,183, 11,209,144,166,214, 97, 41, 38,131, 45, 56,214, 69,145,106, 65,194,179, 11,128,
- 96, 87,149, 42, 85,182, 16,100,209,169,169,246,108, 68, 21, 97,189,124, 42,198,240, 70,187, 11,117,108,183,204,142,224,225,231,
-228, 89,135,156, 92,202, 96,149,223,131, 18, 44, 74,181, 48,193,249, 66,125, 67, 96, 87, 70, 78, 62, 58,237,205, 19, 63, 21,154,
-152,196,220,187, 14, 75,150, 44, 57, 34,156, 52,227,208,101, 7,220, 61, 92,131, 63,173, 39,185,114,229,186, 3,169,196,240,240,
-208,132,237, 85, 92, 0,169, 63, 0,210,159, 67,237,172, 72, 55, 0, 8,169, 42,124,142,231, 11,249,222,160,159, 89,105, 75,118,
-187,104, 8,154, 6, 18, 33, 35, 73,145,124,174,149, 24,133,202,103,120, 84,131,174, 2,153, 1, 45,187,229, 14, 53,214, 1, 4,
- 41, 64,139, 1,139, 20, 37,208, 11, 60, 65,149, 12,252,207,231,140, 99, 3,104, 37, 6,163, 18, 33, 36, 64,136,143, 16, 15, 33,
- 46, 66,108,170, 11, 17, 98, 34,188,139,192,246,107, 13,104, 57, 71,240,132,165,190, 67,207, 71,225,161, 18, 50,109,132,247, 77,
- 47,101, 53, 34,242,249, 22, 1, 45, 22, 53, 99,237,111,163,103,111,118, 61, 74,166, 6, 39,124,160,158, 11, 99,197,132,172,136,
-244,117, 42, 70,201,220,224, 8,104,110,193, 81, 62, 31,122,133,166,151,243, 73,160, 69,144,117,237,211, 60,162,107,162, 56,193,
-148, 98, 25,229,147,210,173, 92,245,163, 7, 19,100,141,187,152,214, 54,208, 34, 93, 26,200,195,171,179,158,129,188,222,103,173,
- 54,236, 97, 69,179,164,163,129,188, 21,213,108, 8,137,150, 4, 79,174, 35,120,154,225, 62, 39,109,218,180,155,185, 27,145,191,
-233,103, 75, 43,201,146,105,204,128, 22, 87,226,170,195,163,155,185, 14,143,254, 82,125,224, 44, 37, 88,234,231,174,213,187,222,
- 89,135,122,252,225,198, 10,150,153, 18, 51,222,205, 54, 90,152,242, 19,234,196,115,160, 35,222,141, 17,243,158,183,104,130, 78,
-114,212,249, 20, 0,109, 30,229,228,149,124, 2, 88,165,194,100,189, 25, 82,210, 96,222,249,223,164,127,153,150, 61, 12,253, 83,
-143,166,153,116, 72,239,189,250,211, 17,158, 79, 47, 0,183, 80, 64, 11,187, 14, 15,146,174, 12,144, 54, 5, 50,160,222, 3,225,
-158,193, 29,208,255, 3, 81,103,129, 0,102,175,224,172,195, 92,189,195,126,168,116, 78,218,145,234,129, 13,245,161,210, 29, 9,
-182, 41, 81,214, 57, 84, 58,196, 59, 85, 63,215,163, 25,134,166,168,155, 36,194,219,146,151, 50,250, 54,231, 83,143,133,111,168,
- 68, 43, 68, 81,149,195, 62,195,122,189,196, 6,227,157,124, 54,122,247,221, 62, 4, 91, 8, 15, 1,178, 6,152, 21, 60, 69, 73,
-159, 1,148,100, 49,164, 40,229,243,163, 9,216, 48, 34,167, 53,144, 55,138,103,135,159,122, 7,202,234,209,213, 5, 90,106,105,
-149,246, 80,105,173, 36,203, 34,208,226,183, 9,152,100,136,239,242,248,158,192,194,243, 80, 19,153, 73,189,120, 60, 14, 40,140,
-117, 20, 41,104, 98,247, 42,109,115,172, 92,118,218,146, 21,122,118,235,200,161,105,206,129,136,173,163,132, 57,211,224, 72,157,
-126,238, 3,165, 97,127,165,120,126,215, 94,210, 0,158,239,149,144,171, 55, 14,162, 78,227,161, 31,201, 62,158,200,117,172, 14,
-181, 1,234,190,207,223,122,239,212, 95,142,216,178,155,243,222,106, 12, 39,159, 86, 57, 21,246,120,111, 3,208, 10, 59,119,144,
-210,105,132,225, 98, 95,168,196, 14, 63, 29,126,122,139, 3, 78, 91,242, 22, 39, 95,208,113,248,233,240,211, 91, 28,120,155,219,
-146, 30, 15, 29,160,101,210,178,222,230, 6,227,148,221, 91,195,142, 51,145, 57,109,201,105, 75,222,226,128,211,150,188,197, 73,
-103, 92,138,136,182,244,198, 2, 45, 50, 75, 47,216,105,142, 70, 52, 60, 61, 55,163,239,208,212,175,151,176,214,151,195, 79,135,
-159, 86,219,128,211, 55,141, 57, 96,149,135,234,120, 14, 63, 29,126,234,113,224,109,110, 75,146, 31, 86,230,179,200, 42,209,122,
-105,249,142, 8,196,235,208, 52, 27,182,237,189,119,248,105,143, 95,102,177, 29,126,154,113,200,222,123,135,159,246,248,101, 22,
-219,225,167, 25,135,236,189,119,248,105,143, 95, 97,137,253,210, 0, 75, 88, 50,247, 58,164,113, 26,161,119,107,193,225,167,195,
- 79,111,113,192,105, 75,222,226,164,163, 66,114,218,210, 75,110, 75, 21,179,250,164,172,154,201,199,234, 38, 42,230,206, 99, 29,
-145,150, 77,122,166, 52,189,200,146,200, 2,180,184,131,154,121,149,193,146,115, 99,111,240,201,233,128,222,224,226,255,105,168,
-249,153, 5,143,103, 32, 44, 81, 5,250,141,210, 94,115, 52,113,232, 20,148,105,229,101,169,142,176, 69,123, 16, 14, 65,190, 3,
- 71,158, 63, 89, 40,146, 30,205,116,240,189, 53, 63, 85,170, 84, 39, 17,206,225,144,227,127, 65,203,210,183, 93,223,211,139,155,
- 49, 69,138, 20, 11, 16, 36,205, 53,160,105,237,220, 77,227,201,241, 61, 56, 22,173, 6,215, 11, 95, 33,180, 66, 62,233, 81,223,
- 78,135, 9,145,207, 58,189, 15,190, 91,169,203,190, 56, 12,252,205,207, 90,125,102,183,142, 44,212,139, 58,138, 29,222, 91, 37,
-237,208,180,202, 41,107,241, 28,126, 90,227,147,213, 88,145,142,159,240,224, 27, 77, 27, 42,103,242,249,185, 82, 70,159,103, 8,
-207, 43,103,240, 25,161, 23, 71, 62,211, 27, 67, 60,208,123, 70,218,158,232,241,157, 21,154,146, 6,188, 78, 71, 55,163,167,161,
-169, 87,151,145, 5,104,105,243,105, 45,223,245,129,154,235,228,244, 81,111,227,125, 15, 92,160, 3,200,150,174, 59,255,123,186,
-172, 52,236,200, 66,211,106,103,182, 5, 96,108, 18, 85,243,115,118,136,243, 92,240, 7,180,150,104,233,225, 88,142,251, 60, 19,
- 15, 71,234, 8,156, 95,168,156,177,134, 56, 51,108, 78,226,201,233,213,154,105,107,214,172, 73,255, 92,241,236,212, 59,252, 58,
-213,129,255,173, 64,120,153, 15,126,248,240,145, 8, 14, 22,202,129,184, 0,110,215, 1,102,166, 88,228, 65,136,182, 4, 63, 81,
-141,225,202,224,234,154, 53,107,148,178,241,156,183,173, 91,183,138,162, 69,139,222, 4, 80, 26, 23, 22,154,112,250,153, 21, 52,
-219,254,245,215, 95,157,239,223,191,223,249,249,243,231,157,113,148, 77,103, 28,149,243, 13,104,150,181, 75,147,128, 42, 75,141,
- 65,245, 50, 84,242, 61,203,192,223,197,135,111,137,101,229,153, 4,101,174,111, 90,233, 71, 22,179,231,142,230,208,180,203,177,
-240,143,117,118,191,232,212,145, 93,142,189, 97,117,164, 5, 41,141, 82,249,124, 64,128, 37,214,247, 18, 12,252,205,103, 70, 96,
-198, 12, 20,233,208,123,246,197, 7, 62,169,194, 11,222, 8,176, 98,225,116,141,178,165, 74,253, 28,221,199,231, 43, 51,176,101,
- 82,205,214, 0,139,119,219, 74, 88,168,169,165, 89,242,183,103, 58,181,115,250,244, 69,120,134,240,188,106,102,229, 40,148, 86,
- 56,183,235,151,249,243,231, 15, 61,113,226,196,208,121,243,230, 13,197,209, 18,191,240, 57, 40,241,252, 67,240, 51,212,101, 52,
- 80, 48,110,129, 72, 64, 51, 44,204,150,105, 34,122,144, 92, 66,160,133,143, 93, 70, 88,226, 10,102, 18,173,203, 0, 16, 90, 64,
-102, 37,159,197,120,132, 8, 15, 40,230,113, 34,248, 86, 94, 27, 64, 43, 53,174,107, 87,174,223, 18, 87,111, 63, 22, 23,111,190,
- 8,103, 47,223, 21, 39,207, 92, 32,189,219,112,216,248,133, 5, 70,171,243,153, 1, 78, 84,175,177, 44,188, 0,136, 4,206,167,
- 19,103,206,156, 81,206,247,171, 80,161,194,109, 56,138,172,109,147,230,123, 4, 89, 0,147,157, 65, 82, 9, 0,166,157,175, 92,
-185,210, 25,199,250,116,198,217,142,223,224, 88,149,140,118,104, 82,138, 69,128,181,241,184, 16, 12,252, 93,182,247,193,184, 86,
-158, 49,173,222, 32,105,225,251, 86,163, 88,169,119,171,180, 94, 86,155,183,155, 31,163,248, 78,217,141, 57, 89, 8,167, 9,156,
-198,235,233, 8,222,242, 29,151, 21,253,177, 30,250,207,119,184,127, 7,135,173,245, 64, 59,171,141, 49, 36, 84,212, 36,153,202,
-125,156, 36, 87,141,197, 73,114, 86, 59,147, 12, 33,121,110,252,206, 90,238,227,112,211,204, 89,125, 9,104,158, 5,205,211,164,
-153, 52,123, 57, 51,167,207, 17,218,150,180, 0, 37, 67, 28,159, 10,149, 50, 69, 9,246, 22,208,210,161, 23, 10,104,213,207,232,
-147,186, 97,122,159,180,118,164,100, 16,221,215,234,218,185,243,208, 51, 39, 79, 14, 43,247,225,135,131,215,226, 8, 48,139,224,
- 77,175, 10, 35, 11,208,178, 55, 62, 65,138,149, 8, 0,235,241,211,127,123, 42, 21,218, 32,223, 59, 98,198,196,145,126,240,216,
- 61, 84, 27, 48, 9, 13,197, 41,244, 67, 75,148, 40,241, 51,190, 82, 95,243,165, 16,141,176, 74, 38,159, 7,149, 50,249,136, 26,
-217,223,185,231,231,231, 55,244,212,169, 83,161,232,145,190, 29,154,252, 94,165,204, 81, 79, 86, 47,150,121,225,156, 57,179,134,
-121,139,166, 61,142,233,198,142,208, 14, 72, 96,229, 2, 90, 4, 89,242, 74,132,227, 93, 74, 65, 69, 87,145,129,191,241, 66,125,
-126,216,146,187,119,239,218, 1, 90,116, 86,219, 7, 96,232, 57, 15,173,229,161,197,148, 32, 85,171, 86,237, 41,158, 19,212,209,
-241,160,222,229, 46, 59, 36, 86,191,250,251,251, 7,223,184,247, 84,164,251,250,168,120,183,193, 65, 37, 36,254,242,160,216,180,
-227,128, 66, 15,121,165,247,117,179, 75, 77,115,246,170, 85,171, 32, 23, 19,144,142, 5,139,219,183,111, 43,103,253,253,247,223,
-127,202, 25,127,139, 23, 47, 22, 84, 39,154, 17,196,123, 55, 77,170, 11, 41,201, 34,192, 2,143,122,160,172, 61,209,150,122,130,
-102, 15, 74,181,112, 56,115,103,228,179,133, 29,154, 14,208,178,192, 45,243, 40,158,250, 17,129, 64, 29,120, 97,159,151, 35, 71,
-142,147, 80, 27, 47,112,141, 65,122,139, 62,245,151,172,244,205, 10, 80,113,111, 71,162, 38,230, 89, 84, 98, 88,161,105,145,148,
- 59,218, 75,167,137,126,112,150,103,113,118,238,220,153,227,132,149,197,138,167,178,227,116,169,119, 27, 98,129,222, 29, 71,120,
-249,162,175,251, 46, 95,190,220, 23, 7,106,251,150, 42, 85,234,123,120,201,111,136,196,138, 58, 93,231,210, 45,123,146,172, 37,
-227, 1, 8,253,249,113,171,129,119,230,172, 58, 34,214,236, 14, 20,254, 91, 47,138, 97,115,119,138, 10,141,127,188,149, 50,119,
-245, 63, 25, 39, 44, 52,235,126, 59,252,206,175, 75,247,139, 5, 27,206,137, 95, 87,156, 16,223,143, 91, 39, 10,127,210,233, 70,
-138,220,213, 23, 37,207, 83,201,232,148,137, 8,173, 35, 53, 56,249,214,199, 39, 70,178, 36, 73,186,124,223,180,242,118,130,173,
-138, 25,125,130,245, 84,135,140,103, 5, 20,105,233, 41,170, 72,141,234, 80, 79, 77,169,226,173,187,236,234,124, 86,194,137, 28,
-201, 19, 39,254,249,228,209,163,195,246,239,222, 61, 44, 65,220,184, 63,105, 65,214,240, 15,124, 98,125,146,198, 39,135, 78, 62,
-245,170, 46,178, 0, 45,123,170, 67, 61,160,181, 96,214,175,186, 64, 11, 43,254,161, 56,204,119, 40, 38,226,161,224, 16,131,225,
- 5,144, 21,252,248,159, 30,162,113,225,184, 65,152, 16, 39,227, 64,101, 93,160,101,135, 38, 63, 70,240, 54,176, 94,166,135, 29,
- 42,167,190, 49,169, 95,187,191,143, 29, 57, 56, 74, 15, 20,162,163, 15, 93,177, 98,133,105, 62,237,142,134,175, 40,126, 8,160,
- 5, 96,145,189,116,233,210,149,142,159, 58, 85, 19, 96, 65, 9,135,143, 31,175, 9, 0, 92,137,239, 92,121, 92,194,131,135,241,
-123,137,197, 60, 15, 0,136,118,107, 40, 9,106,228,197,243,217, 64,163,151, 25, 29,124,251, 8,191,121,227,238, 19, 17,163,225,
- 65,177,251, 76,176, 56,120, 17, 7,177,213, 63, 32,150,174,218, 44,252,253,255, 20, 56, 59,241, 26,232,152,169,161,221,159, 2,
-120, 59, 45,165, 89,164,125,254,252,121,128, 44, 30,164,188, 69,252,245,215,223, 98,222,188,249, 34,125,250,244,164, 25,203, 44,
-127,242, 61,109,178,168, 46, 36,208, 34,200,146, 64,107,195,134, 13, 61,113,214, 99,231,133, 11, 23,118,134, 20,237,107,196,215,
- 30,206,108,248, 9, 47,170, 14,173, 22,195,155,241,146,193, 46,111, 26,164,124, 7,113,159, 9,194, 41,194, 73,188, 8,210, 15,
-196, 49, 52,171, 1,138,206, 97,146, 93,131,255, 92,156,149, 8, 35,221, 24,160,177, 14, 7,157, 43, 0, 27,253, 93, 28, 60,120,
- 80, 57, 79, 16,199,218,108, 5, 77,179,227,151, 60,126, 54, 67,134, 12,103,217,174,112,190,229, 99, 68,140, 25,198, 60,106,147,
- 17, 24, 82,250,111,180, 64,241,210,103,194, 76, 38, 85,245,234,213, 21, 94, 98,209,193,254,109, 85, 5,175,251, 65,130,172,190,
-125,251,254,180,113,227, 70, 95,156,233,232,219,179,103, 79, 95,158, 69,138,131,233,125, 9,188,112,150,106, 47, 72,179, 9,182,
- 44, 95, 4, 89,253,126, 93,253,124,227,129,107,162,235,175,251, 69,227,193,219, 69,243, 97, 59, 69,183, 41,251,197,232, 37,199,
- 69,243, 94,179,158,165,202, 91,253, 79,203, 4, 17,145, 52,135,254,182,254,249, 63,123,174,136, 14, 19,246,186,104, 6,136,206,
-147,247,137,222,179, 14,137,106,109,199, 62, 73,149,167, 58, 65,252, 75,191,212, 0, 5,141,176,236,128,126,253,134,220,184,118,
-109,216,151, 13, 63, 31,153, 55,161, 79, 41,245,123, 24,222, 38, 73, 20, 55,110,157, 10,101,203,182,195,192, 87,204,200,246, 73,
-166, 9, 65,175,254,167,163,180,244, 74, 39,246,201,174,167,166,212, 99,130, 58, 31, 88,229, 52, 31,216,191,255, 48,230,179,245,
- 87, 95, 13,195,119, 62, 84,191,255, 40,141, 79,141,170, 89,223,185,222,169, 74,106, 81, 46, 93,148,205, 70,249, 84,125, 39,178,
- 1, 45,153,223,208,249,134,212,129, 29,203,125, 81,117,248,121, 14,159,224,218,185,162, 4,119,109, 80,106, 63,236, 95, 38,195,
- 22,102, 40, 84, 52, 67, 47, 95,190, 60,148, 32,233,194,133, 11, 67,241,124,232,240,225,195,135,206,152, 49,195, 20,192,168,129,
- 22, 0,143, 66, 47,188, 52,153, 97, 2, 45,177,178,173, 56, 62,233,115, 49,166, 89,206,199,223,148,127,255,238,136, 46, 13, 54,
-254, 23,176,117,220,185,115,231,134,162,108, 67,187,119,239, 62,180, 85,171, 86, 67,167, 77,155,102,154,207,151,222,155,194,246,
- 65, 74,148,150, 32,240,158,136, 32,235,193, 99, 81,255,202,237,231,173, 79, 93,126,210,238,196,197, 71,237,206, 93, 10,106,115,
-238,226,181,250,197,139, 23,175,204, 56,174,184, 50,141,167,175, 18,160, 20,128,186, 80, 57, 80,153,246, 84,101,202,148, 9,194,
-121,108,103, 97,243, 21, 4, 73,143,130,183, 96,175,197, 67,171,115, 34, 24, 2, 26,172,144, 79, 61,124,248,208, 13,180,182,157,
-124,166,128, 45, 2,173,223, 22,172, 16, 51,103,254, 38,112,118,226, 77,208,200,100,149, 13, 80,109, 92,124,252,248,177,160,116,
- 14,109, 80,108,218,121, 64,204,249,115,187, 24, 63,119,173, 24, 58,117,185, 24, 48,102,158,200,148,171,240, 45,208, 75,111,149,
- 38, 13,223,105,147, 5, 91,175,206,148,100, 49,236,219,183,175, 39, 36, 89, 61, 9,178,166, 78,157,218, 25,147,239,247,160,151,
-216, 42, 77,198, 83, 27,190, 39,120, 63, 93, 58, 60,138,166, 99, 12, 31, 43, 73,234,252, 41,181, 70,243,118,190,227,229,184, 49,
-147, 37, 75,118, 96,221,186,117,202,164,187,105,211, 38, 74, 29,143,226, 27, 97, 1, 47,113, 0,212,198,126,249,229,151,193,171,
- 87,175, 22,232,143, 10, 77,222, 41,205, 68,159, 20, 48, 33,152, 12,218,102,118,127,234, 34, 70,133, 26,106,241,236,217,179, 5,
-204, 24, 4, 14,232, 22,144,154, 60,255,241,199, 31,149,182,138, 3,202, 5,218,234, 42, 36, 48,147,108, 25,177, 45, 93,227,198,
-141,149,124,118,235,214,141,227, 98, 73, 47,240, 55, 30, 84,232,187,190,248,226, 11, 74, 91, 3,108,150,151,159,175, 5, 9,219,
- 49,244,149,235, 86, 3, 54,114,156,101, 19,180,145,247,218,190,190,190, 98,203,150, 45,138,132, 24, 64,105, 15,210,182, 70,224,
-152,193,126,110,231,202, 10,201,119,119,130,172,246,237,219,251,182,107,215,142,192, 74,185, 19,112, 97, 1,231, 59,107,214, 44,
-223, 34, 69,138,116, 3, 81, 51, 53,162,242, 93,170, 11, 63,105, 51,228,206,134,255,174,137, 90,190,155, 69,205, 94, 27, 68,173,
-159,254, 21,181,125,255, 17,205,126,222, 36,126,250,237,160, 24,252,251, 17, 81,188, 86,231,235, 73,178, 86, 52, 83, 35,186,105,
- 54,233, 52,242,238,202,157,129,162,230, 79,155, 69,169,230,147,159,165, 43,214,232,114,134,146, 77, 46,215,236, 48,227, 89, 23,
-128,185, 31,103, 30, 20,121, 43,183,190,145, 40,115,153,136,144, 94,121,228,169, 4, 40,189, 33,249,203,252, 65,210,209,251,183,
-111,154,248,223,222,189, 67, 99, 71,143,222, 92,190,163, 90, 46,182,143, 79,161,226, 69,139,118, 89,191,118,237,207,199, 33, 73,
- 42, 86,176, 96, 27,218, 73,233, 17,103, 58,210, 75,157, 34,197, 0,130, 33, 45, 61,190, 7,189, 2, 37,242,229,240,213, 83, 83,
- 26,209,100,186,154, 62, 62,177, 65, 87, 1, 89, 7,246,238, 29, 22,243,221,119,123,203,124, 82,138, 85, 38,173,207,212,111, 62,
- 74, 17,124,118,110, 27,197,198,172,117,217,228,162, 92,202,144,245,175,197, 34,248, 94,100, 2, 90, 90, 59,173,144,236,210, 41,
-156,207,123,239,250,204, 94,185,120,174,223,204,153, 51, 39,255,246,219,111,147,105,155, 5, 27,150,161,152, 99,135, 98, 21, 57,
-116,228,200,145, 67,219,180,105,163, 0,152, 9, 19, 38,152, 2, 24, 53,208, 34,205, 29, 59,118, 40,246, 94,225,161,201, 82, 72,
-160, 69,176,197,112,121, 86, 67,241, 91,187, 2, 79,191,173,152,234, 86,135, 14, 29,148,252,201, 96, 37,159,118, 70,147,215, 33,
- 46, 85,132, 16,247,215,184, 25, 36, 90, 37,168,183,241,238, 59, 31,175, 11,102,224,239, 19,103,175,181,132, 68,166,134, 75,141,
-104,154, 93, 12,174, 3, 48, 64, 62,169, 90,181,170, 50,193,242, 2, 80,187,141,132,201, 93,137, 83,193,136, 93, 49,142,130,113,
-187, 96, 60, 0,174, 96,188, 67,223, 13,125,113,167, 33,233,156,190,112, 93,100,109,127, 24,106,195, 3, 74, 72,241,213,126, 49,
- 96,200,104,209,168, 81, 35,218, 84, 5, 87,172, 88,241,113,182,108,217,238,193,126,131, 82, 35,143, 23, 38,156, 63,169, 34,188,
-120,241,162,128, 52, 85,204, 93,190, 29,170,200, 3,226,157,122, 47, 66,172,122, 59, 68,201,106, 77,158,231,201,147,231, 42, 0,
-212,133, 4, 9, 18,132, 62,191, 77,243, 5,238, 46,220,189,123,119,103, 44, 32, 58, 67, 50,210,131,146, 44, 44, 6,122, 66,197,
-253, 3, 54, 2,108,194,121,143, 79,144,207,167, 0,156,143, 33,129,187,101,209, 6, 76,126, 37, 26,212, 90, 35, 49,209, 92, 6,
-240, 92,134,135,234,243, 67, 19,228,206,157,123, 91,147, 38, 77,206,227,121, 87,179,178,191,164,247,109,209,183, 21, 73,209,199,
- 31,127, 44,246,236,217, 35, 38, 78,156, 72,192,209,209,230,247, 99, 3, 84, 28, 36,240, 33,104,249,245,215, 95, 5, 0,151,192,
-162,224,105,179,102,205, 20,154,172,195, 69,139, 22, 9,130, 8,208,182, 10,182, 90, 80,146, 69, 48,128,182,248, 16,233, 56,169,
-242,140,199,106, 80, 73, 5,209, 86, 15,139, 63,230, 23,218,145, 48, 93, 29,153, 87,230,217, 53, 46,170, 15, 80, 14, 11,193, 24,
-216,104,177,158,253,133, 52, 9, 56,177, 65,100,189, 43,207,150,232,161,125, 30,133, 10, 91,105,239, 86, 3,235, 13,146, 93, 43,
- 42,116,153,135, 97, 44,239, 55,223,124, 35, 78,159, 62,205,141, 37,226,187,239,190, 83,190,151, 43, 87,174,251,136, 20,215, 82,
-102, 17,137, 54, 89, 4, 82,148,100, 17,104, 77,154, 52,201,119,231,206,157,190, 11, 22, 44,240, 5,120,245,133, 68,220, 23, 11,
- 24,223,193,131, 7,251, 98,225, 68,155, 45,211, 43, 25,108,178,166, 47, 63,168, 72,154,106,246, 90, 47,250,254,182, 87,172, 10,
-184, 44, 70, 45, 62, 34,154,244, 95, 45,126,248,117,135,152,184,252,148,232, 60,114,149, 72, 87,168,214, 98, 83,130,136, 64, 59,
-175, 37, 27, 78,136, 54,163,118,137, 82, 95,253, 26,156, 44,103,149,191, 19,102, 40,149,134,225,253,156,149, 87,180,234,247,251,
-179, 95, 87,158, 22,223, 13, 91, 33, 82, 23,252,216,207, 10, 77,111,198,145, 32,165,108, 26,159,233, 84, 21, 86,201, 20,245,121,
-205, 34,105,183,188,239,227,147, 78,190, 67,195,175,254, 83,207,158,253,207,157, 57, 51,236,204,169, 83,195,250,247,238,253, 19,
-164, 72,101, 60, 73,180,146, 96,231,249, 55,109,219, 14,123,250,228,201,176, 38, 13, 26, 12,213,208,171,252,125,215,174,253, 72,
-175,103,243,106,219, 43,103,138,242, 92,173,166,212, 43,159, 90, 74, 38,233, 54,110,216,112,152,148,172,241,125,185,116, 62, 91,
-103,118, 44, 45,158,173,253, 65, 60, 95,251,163,152,211,165, 44, 37, 90,123,181,249,140,196, 64,203,188,234,245,128, 22, 82, 13,
-197, 10,127, 40, 14,255, 13, 17, 40,205, 82,131, 23,254, 38,232, 98,124, 79, 95,210, 2, 45, 53,221,176,210,228,247,180, 64, 75,
- 2,174,150,165,226, 63,106,208,160,193, 56,117, 94,173,228,211,156, 91,175, 87, 12,218, 99, 1,247,212,184, 29, 36, 90,251,212,
-248, 87, 92,187, 39,148,192,223, 7,143, 93,104,189,125,251,246, 26,144, 80, 88, 89,141, 69,175, 85,171,214, 19,238, 78, 4,232,
- 80, 36, 70,148, 28,161,180,255,169, 75, 12, 9,197, 81,105,128,190,119,239, 94,101,215, 31,128, 18, 39, 60,189, 3,200, 11,112,
- 5,126,224,208, 81,177,110,203, 46,177,116,197,191, 98,246,252,165,162,243,247, 63,138, 78,157, 58,139,160,160, 32,101, 23, 34,
- 3, 36,165,162,126,253,250,207, 48,169,248,155,112,184,120,190,124,249,110,114, 2, 64,217,196,212, 5,235,132, 79,157, 3,138,
- 74,146,129,191,247,158, 2, 3,112, 81,197, 8, 41,194, 45,240,104,170, 9,205,148, 80,179,126, 13, 73, 86,103, 2,174,181,107,
-215,118,254,227,143, 63,186, 2, 68, 94,199, 68, 17,172,206, 39,165, 49, 80,177, 60, 3,104,154, 97,161, 37, 64, 96, 19,109,204,
-220,185,115,239, 48, 63,224,239, 41,164,193,130,209,125,229,128, 61,204, 21,190,131,218,235, 58,158,246,180, 64, 51, 66,163, 96,
-226, 59, 68,176,130, 69,148, 2,174, 8,142, 88,102,186,230,192,127, 59,106,175,113,216, 52, 35, 14, 28, 56,192,246,241, 8,105,
- 59, 33, 80,202, 72, 26,233, 16,218, 3,192, 62,128,228, 80, 1, 91,104, 87,102,117,164,148, 27,124, 63,200,252,125,251,237,183,
-204, 95,117, 13, 51, 62,162,148,140,249,133, 4,233, 68, 24, 24, 21,143, 18, 86, 74, 74,153,119, 2, 35,180,139, 32,208, 73, 26,
- 6, 90, 76, 18, 21,170,204,197, 28, 95, 9, 94, 0,182,149, 59,237, 8,177,168, 32, 24,208,235, 51,161, 62, 5,160,115,137,237,
- 29,192, 55,216,138, 68, 11, 11,160, 96,198, 47, 88,176,224, 13,139,249,142, 13,112,180,141,224,181, 64,129, 2, 2,192, 72, 1,
-153,252, 79,251,204, 1, 3, 6,144,215,166, 11, 22,249, 45,208,106,255,247,223,127,251, 66,202,168, 0, 45,104, 62, 20,176, 69,
- 73, 22,109,180,186,116,233,226, 11,186,190, 75,151, 46,245,197, 14,226,246, 86,242,152, 44, 87,245,147,127,110,187, 40, 26,255,
-188, 93,124,218,107,141, 88,177,253,162,232, 62,237, 63,209,105,210, 62,209,101, 98,128,104,222,255, 79,241,231,118, 0,175, 69,
- 71, 69,218,130, 31, 91, 2,152,169,242,126,124,254,175,157,151, 68,157,126, 91, 69,186, 98, 13,175, 38,200, 86,150,237, 82,185,
- 18,101, 44,157, 58,127,165, 22,129, 84, 41, 14, 95,112, 64,164, 41, 80,195, 18, 77, 43,101,177, 26,135, 32,164, 78, 90,159,244,
- 53,178,189,163,216, 75, 63, 93,251, 67,112,197, 12, 62,207,190,124,223, 39, 41,223,161, 81,102, 6, 80, 26,120,231,198,141, 97,
- 59,182,109,251,165,100,145, 34, 61, 1,110,138, 83,202,229, 9,104, 1,156,213, 88,186,120,241,176,231, 0, 90, 73, 18, 37,114,
- 75,157,176,154, 78, 95,247,179,207, 20,122,187, 2, 2,126,129, 33,123,207,212,241,124,106,213, 79,247,127, 96,167,151,119, 9,
-180, 32, 66,235,160,162, 59, 84, 5, 20, 59,252,220, 56,183, 34,197, 58, 55,175,173,104, 87, 33,165,248, 48,181,207,202, 79, 83,
-249, 36,126,131,128,150,185,228,205, 8,104, 81,181,167, 5, 90, 84,199,105,129, 22, 86, 38,225, 2, 90, 97,165,201, 74,183, 3,
-180,172,228,211,106, 39,120, 93,226, 73,160,117,237,246, 19, 5,104, 93,184,249, 92, 9,252,189,107,255,137,214, 0, 13, 86,129,
-150, 15, 84, 46,191,114,162,162,234, 4, 43, 80, 5,172, 64, 50,196,193, 90, 74, 27, 18, 64,220,127,155,207,169, 98,128, 36,134,
-113,131, 97,123, 51,214,136, 31,152, 24,123,195,214,229, 38, 39, 83,128, 23, 65,251, 46,174,154, 31, 60,126, 22, 98, 39,226,149,
- 91, 79,196,237,123, 15, 5,118,248, 61, 3, 56,129, 20,218,248, 2,205,193,152,164,111, 46, 89,178, 68,140,153,185, 66, 1, 87,
- 84, 73, 50,168,129, 22,243,121,243,230, 77, 74, 62,110, 64,170, 84,222, 19, 77, 0,188,178,248,118, 59, 72,178, 58, 99, 34,236,
-140,178,109, 36,200, 98, 62,175,220,194,110,201, 27, 47, 2,127,223,131,158, 22,223,127, 10,154,158,108,140, 66,128, 44, 23,144,
-234,172,201, 67, 20, 68, 26, 45,129,216,107, 0,182,202, 19,192, 80, 61, 12,169,203, 94,230, 53,126,252,248,219,169,146,195,228,
-200,201,214,108, 23,150, 44, 94, 17, 74, 43, 9, 84, 32, 9,164,157, 83, 46, 3,222,103,133,132,235, 33, 37, 91,205,155, 83, 27,
-226, 83,218,164, 95,149,236,212,169,147,146, 63, 72,137,168,218, 10,117, 37, 76,152,112,203,241,227,199, 69,143, 30, 61, 72,239,
- 35, 27,253,244, 93,180,255,149,108,167, 24,243,168, 58,123, 72,245, 38, 54, 94, 8, 72, 69,119,168,250,128,101,146,160, 55,133,
- 42, 78, 2,191, 42, 85,170, 16,108,126, 11, 16,244,136,246, 95,144,234, 11,168, 64, 45,185, 55,145, 64,203, 42,112,178, 17, 63,
- 14,128,224, 22, 72, 85,159, 66,130,245,156,134,240, 40,247,113,128,203,231, 4, 89, 93,187,118,229,162, 66,217,205,139,118,186,
-194,106,193, 1, 34,219, 99, 78,241, 29, 52,104,144, 47,234, 75, 81, 19, 66,155,224, 59,125,250,116, 5,112, 17,104, 97, 23,179,
- 47,164,123,148,104, 89,146, 60, 38,207, 93,253,196,156, 53,103,196,151,176,201,170,227,187, 90, 12,157,127, 80, 1, 89, 63, 76,
- 63, 32,122, 76,217, 37,154,247, 91, 38, 54, 31,188, 46, 38, 47, 63, 33,210, 23,250,228,184,149,188,126,144,239,227,243,243,214,
-158, 81,236,178, 50,151,254,242, 90,162, 76, 31,230,144,233, 96, 84,159,181,100,173,111,174,236, 59,117, 71, 76, 88,122,232,245,
- 1, 90, 25,125,158, 18,104, 53,131,237, 96,250,180,105,127,188,114,233,210, 48, 74,159,210,124,240, 65,119, 56,252, 75, 45,193,
-141, 39,160, 69,215, 11,119,111,221, 26,182,125,235,214, 97,216,141,208,144,113,105, 28,159, 38, 85,170, 30,151,206,157, 27,118,
-249,194,133, 97,160,221, 19,244,210,168,233,121,162,201,119, 80, 21,254, 44,233,194,152,181, 39,159,209,133, 68,253, 66,241, 30,
-222, 91,217, 85,220, 89,209, 69,212,207, 31,247,121,241,148, 62,223, 24,229, 51, 18, 75,180,204,221, 59, 24, 1, 45, 72, 55, 66,
- 1, 45, 12, 98,161,128, 86,159, 62,125,194, 5,180,194, 74,147,157,194, 8,104,181, 40,249, 94, 40,137,150,149,124, 90,233,160,
-175, 83, 28,170, 5,177,122,173,113,233,218,221,150, 73, 26,110,188, 17,189,214,186,231, 12,137, 27,108,184,177,117,207,225,150,
- 24,232, 45,171, 14, 93,229, 74,139,123,117,168,119, 20,235,119, 74, 28,176,138, 14,196,179, 0, 12,200,215,105,116,204, 11,210,
- 39,170, 12,177,201,196,220, 80,154,206, 73,105, 24,159, 46, 93,186,171,152, 4,130, 9,126,180, 59, 17,147,126,117, 88, 28, 58,
-113, 73, 64,165, 32, 0,122, 14,152,241, 24,147, 84,117,208, 60,154,189, 72,245, 91,113,235,110,118,239,104,228,238,198,253,103,
- 94, 72,180,248,157, 35, 71,142, 8,168, 44, 72,243,111, 11, 52, 51,114,119, 33, 12,223,191, 65,153, 31, 75, 67,254, 20,173,254,
-191, 99,146,191, 47, 92,185,163,128, 70,196,221,104, 68, 19, 18,154, 97, 26, 0,181, 26,113,199,235,132, 9,152,196, 54,202,184,
- 88, 12, 80,178, 69,219,152,151,126, 1, 84,237,160, 4,138,170, 57,124, 28, 99,185,114,213,167,237, 14,118, 3, 11, 72, 70,247,
-227,191, 21,169, 86,111,216,183,137, 41, 83,166,144, 14,237,112, 60, 93,237,185,233, 2, 42,110,198, 29,100, 18,183, 15,129, 15,
-164, 34,140,107,180, 11,180,241,208,161, 67, 21, 73, 12,226, 12,182,200,196, 28, 0, 83,219, 9,126, 8, 54,138, 21, 43,246, 0,
-233,202, 64,186,115,135,237, 7,146, 23, 1, 53,244, 65, 60, 43,110,145,158, 15,234,127, 32,203, 69, 16, 89,175, 94, 61,238,212,
-165,173, 36,175, 42,144,180, 63, 35, 8,101, 57, 24,207,140,166, 13,224,164,144,178, 17,127, 56,192,143, 2,136,161, 46, 23, 4,
-133, 72,206, 77, 46,165,209,191,168,222,236, 12,208,180,159, 18,196,194,133, 11, 19, 48, 91,178,211, 67,154,186,163, 70,141, 82,
-192, 85,191,126,253, 20, 96, 69, 73, 22, 65, 22, 85,135, 4, 94, 80, 77, 43,119, 0,173,186,102,229,231,251,247,243,212, 92,216,
-123,202,102,209,229,215,125,226,203, 33,155, 68,195,222,127,137,239,198,237, 16,221, 39, 7,136,166,125,150,137, 81,191,239, 17,
- 91, 14,221, 16,131,103,110, 20, 25, 10,215, 90,104,133,102,138,188, 53, 22, 15,158,189, 93,124, 55, 97,159,168,253,253, 60,145,
- 50, 79,245, 93,241, 51,150, 42,152, 56,203,135, 69, 82,229,173,182,103,218,146,157,193,123, 78,220, 22, 3,167,254, 43, 50, 20,
-122,117,170,195, 50,153,226, 5,208, 94,170,114,198, 40,207, 75,166,246, 97,167,162, 29, 85,225, 41,147, 39, 15,123,254,244,233,
-176,250,117,235,254,130,255, 5,173,130,162, 92, 57,114,252, 2,191, 56,195,134,253,242,139, 91,189,135,244,249,199,142, 26,165,
-208,107,250,197, 23,191, 64, 50, 86, 84, 75,207, 12,104,229,204,145, 99,152,164, 11, 0, 87,159,241,203,165,241, 25,178,162, 95,
-117, 69,154, 53,160, 65, 78, 81,226, 3, 31, 54,178, 16,142, 88,213,117, 21,201,129,150,149,102, 23, 42,142, 98, 63, 69,123, 44,
-181, 84,139,255,213, 18, 45,218, 65, 65, 68,108, 11,104,193, 31,215,100,111,208,100,142,173, 2, 45,171,249, 12, 19,167, 94,126,
-162, 16,198,240,220, 93,120,238,226,213,122, 71, 79, 93,106,185,255,240,217, 86, 59,247, 30,107,181, 97,235,254,150,255,172,221,
- 84, 15, 18, 40,187,198,240,178, 52, 99, 81, 79, 10, 96,145,106, 56,249, 27, 54,123, 28,144, 61,170,138, 13, 88, 18,255,195, 15,
- 63,124, 76, 58,218,157,136,116,251,176, 97,231, 33,177,110,221,122, 2, 59, 78,116,150,174,172, 85,186,228, 41, 88,174,206,173,
-253,167,239, 9,134,131,103,239,139,235,119,158, 8,168,163, 21,144,197, 9,132,160,136,246, 90,150, 8,190,136,148, 10,134,255,
- 74, 62,175, 99,199,164, 86, 53,121,240,248,121,197,175, 24,236,202,238, 24,208,140, 10, 0,124,196,205, 60, 27, 63,168,150, 5,
-205,197, 54,242,234,141,168,220, 17,247, 13,165, 86, 4, 26, 0,144, 84,187,201, 29,150, 81,169, 78, 36,208,234,223,191, 63,243,
- 70,169,156, 71, 31, 75,144,138,252, 73, 21,153, 75, 74,101,182,209, 33, 5, 29,226, 82,234, 3,149, 19,119, 35,122,186,102,177,
- 78,169,130, 67, 36,238,224,211,187,114,124,245,213, 87,138,138, 46, 74,148, 40, 86,118,139,213,130, 36,243, 41,213,229, 52,174,
-135,164,146,146, 39,121,194, 64, 65, 56,172,189,199,111, 82, 21, 71,233, 45,128, 81,127, 11, 12,111, 78, 94, 17,192,180,110,221,
-154, 11, 18, 45,152,104, 8,169,110, 48,223, 3,136,176, 44,109, 61,209,196, 2,229, 16, 1,112,214,172, 89, 47, 89,248,182,143,
-213,248,168,215, 35,204, 3,235,137, 82,194,186,117,235, 50,175,249, 52,223,232, 3, 91, 69,241,195, 15, 63, 48,159,150,236,169,
- 16, 47, 43,198,157,239,177,120,112, 75,179,104, 4,143, 77, 73,202,142, 67,240,210, 23, 54,100,190,176,121,236, 6, 64,103,205,
- 24, 30,126,178, 74,212,234,116,235,231,249, 71,197, 79, 51, 15,136, 31,166,236, 20, 95,245, 95, 46,154,247, 89, 42,198,252,177,
- 79,236, 59,117, 91, 44,221,114, 73,148,171,253,221, 13,203,198,240,160, 89,161,209, 15,183,250,206, 57, 44,126,156,113, 80,116,
- 27,245,183, 40, 87,183,203,141,106, 77,122,220,244, 91,185, 87,156,187,250, 64, 44,219,122, 89,148,170,213,238,149, 25,195,247,
-134,225,122,145, 66,133,134, 29, 63,176,107,114,231,118,173, 38, 37, 4,142, 38, 80,137, 30, 45, 90, 83, 74,158,104,151, 5,149,
- 93, 71,171,160, 72,210, 35, 32,234,245,195, 15,195, 36, 61, 74,182,232,247,234, 50, 36,100,239, 68,141,218,117,173,129,239, 43,
-189,246,199,111,211, 16,158,249,148,116,161,158,172,202,231,229, 51,248, 28,188,177,180,163,184,178,168,189,248, 40, 67,148,187,
-141, 18,249,188,103, 5, 16,170,190, 99,174,146,179,210, 41, 94,227, 56,223,211,216,157,210, 38,170,246, 96,143,163, 0, 46, 12,
- 72, 10,208,130,138, 97,104,239,222,189,135, 98,192, 24, 10,207,223,156,116,185, 43,203,240,162, 31,173, 42,153,125,158,215,206,
- 23,231, 42,196,243,147,189, 65,147, 31,171,146, 37,234,195,207,115,199,120,190,226,199,210,138, 49,188, 12, 82,162,101, 55,159,
-175,113,125,168,179,182,132,238, 22,240, 96, 9, 31,210,133, 3,119, 23,194, 46,162, 6, 84,122, 53,104, 0, 79, 73, 22, 65,150,
-218,189, 3, 87,215, 50,141,133,114,210,199,205,248, 22, 45, 90, 4,115, 18,162,189, 19,213,137, 77,155, 54,229, 96, 60, 2,193,
-178,171, 3,213,183,162, 65,253,241, 72, 13,180,228, 78, 68, 2, 45,255,127,182,138, 57,115,252, 4,220, 10, 24, 1, 24,189,108,
-191, 75, 73,153, 26,203, 16,100,113, 98,148, 32,107,236,216,177, 4, 90,150,212, 9,174, 15,196,133,186, 83,201,167, 4, 90,106,
-213,228,150,128, 3,130, 18, 27, 24,198, 95, 53,226, 35, 38,228,145,225,144,104, 89,241,217,101,161, 10, 45, 69,249, 52,111,222,
-188,119,168,106,163, 74,139,234, 34,164,210,250, 80,170, 1, 53,170, 34,157,193, 22,125,218,254,208, 56,186,177, 17,117, 72, 15,
-247,145, 22,232,222,182,146, 3, 0,136,203,140,143,113,132, 59,229, 12, 47,216,243,108, 35, 48,160,145, 62, 34, 37, 48,136, 24,
- 11,106, 58, 5,196, 48, 31,102,223,135,138,116,139, 84,229,161, 29,209,167,155, 86,125,153, 31,192,243, 48, 36, 52, 74,249,173,
-168,239, 64,103, 7,191,239, 82, 95, 26, 73, 39,219, 81, 82,200,120,216,209,186,217, 36,159, 53, 1,138,118, 34,206,167,102,229,
-113,189,183, 18,191, 60,108, 16,159, 19, 92, 2,144, 30,135, 84,149,126,195,190,211,161,159,239,243,207, 63, 87, 22, 45,249,243,
-231,231, 2,200,146, 75, 6,184,223,104,128,177,163, 23, 22,107,190, 43, 87,174, 84,236,180, 40,197,130, 68,220, 23, 82,114,218,
-111,245,130,154,183,129,197,242, 40,209,222,207, 83,205,191, 78,199,201, 79,250,206, 62, 36, 38,175, 56, 37,150,195, 38,139, 82,
-172,173, 8, 75,183, 94, 18,237,251,205,120,146,182, 64, 13, 51, 27,207, 16,159, 76, 9,119, 16,117, 58, 77,126,218, 7, 52,103,
-172, 58, 35,214,236,189, 42, 40,197,218,117,252, 22, 64,214, 37,209,174,247,212, 39,233, 11,126,108, 5,176,219, 41,138,165,184,
- 4, 36,101,177, 9,225,163, 82,133, 39,157, 58,180,103,242,119,237,219, 15,163, 33, 59,159, 23,204,155,119, 16, 65,205,216,209,
-163,135, 1,212, 84,178, 10,180, 20,122,229,202, 41,128, 72, 77, 47,103,246,236,253,248,140, 82, 50,208,171,166, 71,207,147, 68,
- 11,171,169,164,106,186,116, 31,209, 54,141, 79, 66,236, 44, 84,236,203,150,254, 84, 69, 64, 26,183,218,106, 62, 85, 12,138, 44,
- 64,203, 92,117,104, 80,235, 52,212, 44, 14,181, 15,197,189, 67,209, 65, 20,103,162, 4, 90, 88,133, 41, 32, 11,122,253,161,152,
- 80,124, 25, 15, 65,107,216,169,103,128,237,117,154,216,191,252,110,185,244, 62,243,171,100,137,242,172, 81,161, 56,207,119, 14,
-135,152, 18,128,139, 64,171, 99,199,142,227,194,152, 79, 75, 29,193, 67, 36, 43,198,231,118,191,161,166,185,132, 71,235,128,192,
- 18, 21, 17,197, 97, 41, 13,223, 25,244, 28,150,114, 66,209,164,177,146,207,202,181,107,215, 86, 12,207, 93, 19, 28, 29,161,122,
-186, 60,210,196, 78,168,203,180,129,185, 9, 39,166, 57, 58, 30, 83,252,107,113, 39, 98,202, 22,255,137, 57, 11,254, 84,156, 37,
- 34,255, 90, 53,159, 71,154,116, 63, 16, 24, 24,168, 96, 45, 58, 86, 37,200,162,234,136, 42, 67, 26,246, 66,101, 28, 12,187, 46,
-173,177,181, 71,154, 0,123, 55,168, 38,165,138, 51, 83,187, 99,226, 93, 87, 62,211,182, 57, 36,254, 90,179, 89, 96,133, 46, 48,
-249,205,215, 48, 66, 77, 83,207, 70, 43,212,206, 66,244,175, 17, 38, 54, 90, 86,234, 40,204,109, 9,182, 78,155,216, 46, 40,201,
- 34,200, 66,166,117,237,134,232,166,129,187,208, 56, 49, 19,112,128,231,187, 61,148,189, 38,128,173, 45, 96,128,248,156,232, 63,
-247, 64,211, 7, 42,221, 3,204, 43, 84, 99, 30,141,188,179,100,201,114,142,241, 0,224,244,164,152, 90,126,214, 64,219,160,203,
-133, 1, 8, 70,174, 74,184,168,232,136, 69,203, 38,220,191,209, 97,182,150,102, 45, 72, 59,119, 33,158,153,253, 81, 43,128,172,
- 61,136, 87,195, 2, 77,187,117,172, 23,223,157, 79,212,243, 95,108,223, 46,219, 59,143,170,106,212,253, 12,248,191, 18,180,125,
-131,221, 25, 85,138,234,203,168,125,190, 11, 63, 89, 13, 32, 17,236, 70,181, 33,237,177,104, 0, 79, 41, 23, 37, 89, 46,144,197,
-197,156,199,124,170, 95,210, 25,105, 74,128,173, 66,213,218,221,232, 58,230, 31, 49,102,201, 81,241, 43,108,178,134, 64, 93, 72,
- 73, 22, 65, 86, 88, 28,150,166,202, 87,253,207, 98,181,190,187,241,253,232,213, 98,130,255,113, 49,253,239,147,226,151,153,235,
- 69,249, 58, 29,175,167, 43,248,241, 43,117, 88,250, 81, 6,159,145,240,103, 21, 76,213, 97,173, 34,105, 2,224,208, 46, 45,252,
-141,196,171, 82,185,178, 2,150,190,253,230, 27, 55,248,242, 32, 41,114,215, 81, 54,184,168,249,184, 70, 13, 37,109, 75,248,185,
- 34,189,102,176,247, 42, 87,166,140,242,172, 75,167, 78,195,224, 11, 40,167, 5,160,229,166,201,184, 52,164, 87,211,165,106,179,
- 78, 6,159,220, 61, 63,201,168,168, 13,199,182, 44, 36, 10,189,239,227,251, 6, 3, 45,217, 84,195, 12, 12,217, 25, 42,194,104,
-114, 0, 86,179,138, 84, 11, 43,161,161,232,112, 28,152,200,108, 91,157,197,149, 27,175,211, 44,130, 29, 12,229, 51, 69, 89, 95,
- 57,115,148,224, 54,165, 19, 61,111, 86, 44,238, 99,168,127,198,133, 51,159, 97, 29,220, 34,116,114, 68,166,150,240,124, 63,220,
-205,142,224,145, 42,198, 37,140, 75, 3, 87,166, 85, 21,202, 74, 62,147,210, 30,139,187, 16, 97,107,226, 73,146, 32,201,122,164,
-137,250, 40,143,129,246,105,224, 85, 72,157, 78, 94, 16, 91, 33, 29, 34,112,153,187,240, 79, 49,102,220, 36,129, 29,133,180, 5,
- 73,103,113, 48, 87,162, 1,172,124, 84,190,124,249,235, 4, 91,135, 14, 29, 10, 1,178, 96, 39, 34, 0, 58,105, 99,134, 93,204,
-150, 38, 8, 37, 18, 12,252,107,209, 11,254,173, 59, 65,226, 20,220, 83,236, 59,116, 74,108,218,190, 79,172, 92,179, 73,204,246,
-251,157,147, 61,119, 90,154,209,212,238, 58,164, 27, 7,245,100,158,209,194,174, 67, 43,117,100,183,157,170,105, 86,133,228,231,
- 48,213,125, 32, 98,118, 28, 82, 3,240,122, 25, 0, 7,141,195,121,224,182,250,138,232,124,242, 91, 4,112,116, 72,250,137, 73,
-129,101, 60, 61, 9,208,203,200,167,221,250,208,139, 31,209,249,252, 8,117, 73,208,244,131,133,204,114,188,238,135,198,188, 28,
-247, 10, 54,235, 61, 43, 93, 56, 64,114,248, 29, 3,234,143,199,241,152,169, 11, 61,150,157,170,193,180, 5, 63, 89,156, 38,127,
-141, 51,105, 11,212, 60,147, 1,238, 28, 44,168, 11, 77,105,194, 45,196, 18,208, 59,155,182,192,199,167, 51, 22,169,133, 35,120,
- 42,154,109,254,136,208, 58,226,185,131, 60, 64, 90, 30,185, 67, 55, 11, 37, 18,250,228, 42, 10, 7,207, 85, 42, 86, 84,128,209,
-231,159,126, 58, 44, 11, 60, 85,152, 0, 24,119, 62, 11, 98,127,139, 59,109,173, 90,195, 40,137,130,161,109,156,178,165, 75, 15,
- 37,189,198, 13, 26, 12, 75, 11, 37,137, 93,160,245, 1,204, 45,212,116,147, 98, 71, 36,129, 86,143,143, 51, 40, 64,171, 79,221,
-108, 4, 90, 95,188,193, 64, 43,204, 18, 45,109,255,163, 31, 21, 14,174, 52, 88,229,221,204,175,138,149, 70,232,117,154,216,209,
-144,173, 98,230, 40,135,170,103,127,135,171,222, 58, 94,202,167,133,177,232,165, 78, 58, 51,232,122,129,206, 64,233,122,224,222,
-189,123, 70, 42,193, 37,148, 62,112,117, 79,144, 69,187, 21,228,114,182, 42,167, 86,234,136, 59,207,166,192,126,227, 57,142, 59,
- 25, 99,129, 17,166, 52,161, 2, 26, 4,131,227, 39, 84,199,112,171, 59,253, 22,193,153, 33,119, 56, 62,194, 74, 87, 79, 53, 97,
- 74, 19,147,255,143,217,179,103,191, 14,231,162,138, 81, 47,125, 65,193,174,228, 57,182,249, 95,198,202,186,138, 78,190, 77,105,
- 98, 82,152, 12,155,178, 39,147, 39, 79, 86,118,159,193,190, 68,145,184,193,187,249, 35, 24,252,234, 29, 81,162, 71,147,126,180,
-134, 65, 13,127,153, 62,192, 52,249,136, 3,192,182, 3,182, 63, 23,241,220, 72,245,110,154, 79, 11,117,162,141,226,208, 12, 3,
-211, 60, 36,113,248,233,240,211, 91, 28,112,183, 37, 61,160, 37, 15,145,142,243,238,187, 13, 8,142,128,128, 27,216, 5, 69,177,
-162, 69,171, 83,170, 88, 49,166, 85,118, 28, 50,240, 25,233,193,246,171,137, 17, 61,141,234, 48,132, 68,139,239,222,125,231,157,
-239, 75,149, 40, 49, 76,238, 56,228,179,143, 50, 70, 57,216,185,106, 26, 81, 58, 93,148, 99, 77,146,251,196,121,131,129,150,183,
-234,223, 77,199,170,109,142,157,193, 39,178,208,180,202, 76, 59,101, 15, 11, 77, 44, 98, 20,192,180, 68, 21, 40,189,210, 94,106,
-137, 22,227,206, 64, 96, 90,121,217,201,167,218,255,147,167, 60, 91,165,153, 23, 43,221, 21, 80,243, 92,133, 58,241, 34, 86,187,
-126, 32,154,218,128,176, 85,154,185, 1,184,126,131, 42,232, 40, 84, 91,123, 65,127, 4,232, 37, 11, 15, 77,128,203, 98,160,183,
- 22, 42,158, 91,176,189, 9, 4,205,185,160,167,149,100, 89,225, 39,118, 75,235, 26,145, 83, 90,192,119, 70,151,213,178, 91,109,
- 71,140,231,208,180,195, 45,243,184, 14, 63,205,121,100, 39,134,195, 79,112,139,160, 68,239,188, 65, 9, 86,104,128, 30, 86, 80,
-212, 12,234, 66,109, 90, 51,122,102, 64,139,239,169,214,212,210,173,158,250,133, 1,191, 5, 64,168,215, 70,194,172,138,179,211,
-224,188, 16, 87,230,147, 99,185,148,110,121,129,172, 57, 9,167,179,152,243,200, 78, 12,135,159,118,184,101, 30,215,225,167, 57,
-143,236,196,112,248,105,135, 91,230,113, 29,126,154,243,200, 78,140, 72,203,207,138, 89,125, 82, 86,205,228, 3,237, 92,152,175,
-200, 82,246, 55, 1,104,201, 50,188, 52,128, 24, 89, 42,215,201,103,152,251,175,110, 66,135,159, 14, 63,189,197, 1,167, 45,121,
-139,147, 47,232, 56,252,116,248,233, 45, 14, 68, 68, 91,138,204, 64, 75, 45,201, 34,200, 10,161,165, 32,179,244,130,157,202, 48,
-162,225,233,185, 25,125,135,166,126,189,132,181,190, 28,126, 58,252,180,218, 6,156,190,105,204, 1,171, 60, 84,199,115,248,233,
-240, 83,143, 3,111,115, 91,146,252,160,105,135, 94,208, 26,150,155,245,161,183,250,125, 68, 32, 94,135,166,119,155,148,195, 79,
-135,159,222,226,128,211,150,188,197, 73, 71,250,228,180,165,183,179, 45,121,183,212, 47,151,154,215,118, 29,218,205,182,211, 89,
-236,114,204,115,124,135,159, 14, 63,189,197, 1,167, 45,121,139,147, 14, 40,114,218,146,211,150,188,203, 1,135,154, 45, 14, 56,
- 29,208, 22,187, 76, 35, 59,252, 52,101,145,173, 8, 14, 63,109,177,203, 52,178,195, 79, 83, 22,217,138,224,240,211, 22,187, 76,
- 35, 59,252, 52,101,145,173, 8, 17,193, 79, 91, 25,120,205, 34, 75, 27,173,240,237, 58,252,249,231,159,163, 98, 43,126, 60, 56,
-155,203, 3,239,208, 81,113,222,152,217,225,178,166, 21, 49,116,196,152,168,216, 50, 31, 15, 12,203,115,253,230,221,168,205, 91,
-116, 13, 55,205, 48, 48,223, 52,159, 14, 77, 91, 28,112,248,105,139, 93,166,145, 29,126,154,178,200, 86, 4,135,159,182,216,101,
- 26,217,225,167, 41,139,108, 69,120,155,249,105,139, 81,175, 89,100,185,203, 48,124,187, 13,225,160, 49, 42, 64, 86, 10,132,129,
- 56,252, 85,241,110,141,115,172, 60, 1, 35,211, 6, 3,111,212, 60,146, 7,167, 0,248, 12,132,215, 97,133,230,239,203, 54,134,
-139,166, 30,243,225,251, 8, 71, 68, 25, 94,134,249, 52, 73,231,169,158, 77,203, 30,134, 70,226,208, 12, 3,211,194, 82,239,225,
-248,140, 83, 71,225, 96,158, 78, 82,135,159, 14, 63,189,197, 1,167, 45,121,139,147, 47,232, 68, 4, 63,189,155,195,151, 75,205,
- 59, 54, 90, 9, 18, 36,136, 14, 15,219, 31, 2, 99,237,133,115,201, 50, 22,202, 96, 90, 17, 56,230, 36,122,140,152, 49, 63, 4,
-200,218, 27, 39, 78, 92,175,208,132, 23,238, 10, 0,133,231,112,168, 41,207, 90,139,141, 60,239,130,103,243, 64,220, 55, 27,228,
- 89, 55,159,140,239, 74,199, 51,203, 98,147, 30,233,146,190, 55,202,110,129,134, 54,138, 41, 63, 29,154,182, 56,224,240,211, 22,
-187, 76, 35, 59,252, 52,101,145,173, 8, 14, 63,109,177,203, 52,178,195, 79, 83, 22,217,138, 16, 17,252,180,149,129, 72, 25,217,
-223,223,159,199,179,232, 94,144, 98, 69,205,157, 59,247,135, 80,243,109,202,153, 51,231, 99, 28,107,178, 0,192,195,236, 8, 30,
- 51, 62, 68,205,146, 45,199,135,169, 82,190,191,169, 64,166,148,143,113,220,201, 2,120,225, 14, 15,205,104, 0, 71, 35, 43, 87,
-174,124,123,211,166, 77,130, 32, 9, 25, 72,136, 3,138, 47,242,176, 97,120, 12, 15, 54,203,144,250, 61,227, 51, 29,211,147, 14,
-233,145, 46,233,243, 59,120, 22,205, 14, 61, 39,174,195, 1,135, 3, 14, 7, 28, 14, 56, 28,112, 56,224,153, 3,158,176,200,107,
-204, 59, 41,209,242,116,202,135,143,143, 9,208, 42, 8, 53,218,254,142, 29, 59, 62,231,185,111, 0, 92,219, 1,140, 74,224, 89,
-136,163,115,190,252,242, 75, 51, 27, 43, 53,159, 10,190, 23, 63,193,254, 25, 29,170, 62,127, 48,173,150,248, 32,101,242,237, 56,
-231,174, 4, 0, 77, 8,154,141,155,183,182, 66, 51, 21, 36,110,123, 97, 71,246,240,214,173, 91,196, 71, 2,255, 9,180, 18,225,
-248,148,139, 39, 79,158, 20,200, 43,129, 36, 85,149, 86,174,168,140,207,116, 76, 79, 58,164, 71,186,164,207,239,240,123,120,158,
-202, 10, 49, 39,142,195, 1,135, 3, 14, 7, 28, 14, 56, 28,112, 56, 96,206,129, 72, 10,180,100,193,212, 42,196,208,133,213, 22,
-174, 72,145, 34, 49, 1, 50, 74, 64,122,243,105,146, 36, 73,182,181,104,209, 66, 80,162, 51,122,244,232,103, 53,107,214,188, 80,
-188,120,241,185, 89,179,102,109, 14, 85, 98, 62, 72,188,154, 0, 32,165, 52, 59,149, 61,111,254,194, 49, 19, 38, 76, 84, 34, 70,
-140,152,159,198,139,247,222,182,110, 45, 62, 23,193,103,167,138,103, 19,242, 62,107, 90,173,200,133, 50,133,115,206,205,150, 62,
- 85,243,119,162, 69,205, 23, 37, 74,148, 38,160, 77,116,104,118,210,123, 38, 28,214, 27,184, 98,197,138,224, 51,103,206,136,205,
-155, 55, 43, 64, 43, 94,188,120,183,144, 54, 30,222,225, 92,229,139,148,112,241,144,105, 43,160,141,204,137,194,248, 76,247, 63,
-246,174, 2,172,138,166, 11, 95, 27, 21, 37, 20, 68, 64, 64, 64, 4, 65,236, 86,236,238,238,252,236,238, 14,236,238,238,238,238,
-238, 86,236,238, 86,196, 64, 64, 12,234,252,231, 93,185,252,151,235,141,189,120, 13,116,150,103,158,229,238,206,158,157,121,231,
-236,206,187,231,156,153,193,245,144, 3,121,144, 11,249,184, 15,238,135,251,242, 57, 94, 0, 93,108, 2, 1,129,128, 64, 64, 32,
- 32, 16, 16, 8,252, 40, 2,241,148,104,233,182,104, 41, 43,165, 90, 57, 38, 76,179,152, 96, 93,229,197,126, 63,177,155, 48,164,
-119,239,222,225, 87,175, 94,165, 3, 7, 14, 68,142, 28, 57,146,124,125,125, 35, 42, 84,168, 16,148, 39, 79,158, 23,188,120,239,
- 93, 38, 68,129,124,205, 89, 78,121,117,128, 60,203,196, 36,217, 85,123, 91,219, 79, 54,214, 86, 33, 35,250,117, 11,143,250,176,
-143,200,127, 84,228, 87, 95, 59,122, 58,216, 43,162, 91, 73,199,160,242,217,108, 94,216,167, 73,121,151,227,182, 2,153,108,157,
-101,121, 90,101,178,213, 41, 55,147, 29,186,114,229, 10,241, 72, 72,186,124,249, 50,249,249,249, 73, 68,139,175, 67,178,176,183,
-183,127,241,246,237, 91,229,111,217, 68, 11,215,227, 58, 92, 15, 57,248,141, 13,242,113, 31,220, 15,247,197,253, 81,142, 31, 85,
- 46,113,189, 64, 64, 32, 32, 16, 16, 8, 8, 4,254, 85, 4, 52,113,145,191, 6, 11,174, 92, 49, 84, 16,123,101,165,152, 48,229,
-115,117,117,221,156, 35, 71,142,200,217,179,103,211,134, 13, 27,104,225,194,133,145, 83,167, 78,165,113,227,198, 73,105,226,196,
-137, 81, 99,199,142,141,240,241,241,137,228,120,166, 87,108,245,170,164, 7,148,124, 89,211,155,109,206,231,153, 49,242,245,146,
-250, 68,167, 26, 19,173, 41, 20, 25, 53,223,149, 34, 7,219,210,231,113, 89, 40,106,168, 83,212,139,169, 5, 35,170,231,119,141,
- 76,147, 38,205, 43, 38,123, 58,101, 50,193,177, 1,209,185,121,243, 38, 61,121,242,132, 30, 61,122, 36, 17, 32, 21,162,101,238,
-224,224,240,226,227,199,143,113, 34, 90,184, 14,215,115,189,204,149, 68, 11,242,113, 31,220, 15,247,141, 38, 90, 54,127,141, 66,
-136,138, 8, 4, 4, 2, 2, 1,129,128, 64,224, 23, 35,160,137,139,252,226, 34,252,200,237, 84,231,209,146, 39,135, 93,134,112,
-157,217, 50,209,242,229,224,239, 7, 53,106,212, 8, 5,201,154, 52,105, 18, 8,150, 68,186, 14, 29, 58, 20,206,238,196,207,236,
- 62,188, 59,115,230, 76, 79, 72,174, 88,177,162,214, 24, 40, 11,203, 52, 9, 82, 37, 75,108,235,229,153,205,183, 97,113,239, 7,
-131,170,187,135,134, 45,201, 69, 81,131, 29, 40,114,186, 51, 69,174, 43, 21, 73,183,199,135,143,106, 85,234,115, 70,167,140,119,
-103, 47, 92, 35,201, 44, 93, 86,187, 76,156,103,178,149,151,173,110,254,123,247,238,141,122,255,254,189,100,133,138,142,209,130,
-235,208,156,227,201, 94, 68, 68, 68, 16,143,148,132,235, 80,246,134,252,184, 14,215, 67, 14,111,146,235, 16,242,113, 31,220, 15,
-247,197,253,101, 11, 21, 25, 5, 2, 2, 1,129,128, 64, 64, 32, 32, 16,248,219, 16, 48,124, 30,173,194,133, 11,131,104, 37,204,
-150, 45, 27, 98,156, 10,112, 58, 51,121,242,100, 16,173,136, 57,115,230,208,178,101,203, 34,154, 53,107, 22,196,211, 29,236, 96,
-235,151, 37, 16,115,118,118,214,233,150,203, 91,160, 96,130, 20,201, 77, 18,122,120,120,165,178, 74,155,182,128,117,218, 52,103,
-194, 38,121, 19, 13,181,143,160, 5, 57,137,214,149,143, 24, 95, 55, 95, 80,146, 36, 73,119,176, 56, 73,102, 6, 59, 91,185,174,
- 62, 59, 14,206,191, 60,116,232,208,143, 97, 97, 97, 18,209, 98, 43,155, 52,234, 16, 68, 9,191,153, 20, 61, 5, 47,147,217,186,
- 86,200,143,235,162,137,150, 5,228,225, 55,228,227, 62,184, 31,203, 18,193,240, 50, 1, 21,217, 4, 2, 2, 1,129,128, 64, 64,
- 32,240,151, 34, 16,247,121,180,216,125,135,121,168,202, 85,169, 82,229, 46, 7,193,211,170, 85,171,104,254,252,249,145,179,102,
-205,162, 94,189,122,221,228, 81,130,245, 0, 90,245,234,213,229, 18, 34,133,169,105,234, 20, 41,146, 37, 41,215,179,148,219,221,
-168,113,238, 20,185,163, 30,125, 88, 85, 63, 50,114, 73, 62,218,217,173,232, 77,158, 54, 66,146, 89,163,114, 37,217, 50,163, 27,
- 46, 17,147,159, 41, 28,164,255, 14, 46, 63,142, 29, 3,209, 74,171, 70,180,220,100, 54,178,155, 26,209, 74, 11,121,144, 11,249,
-184, 15,203, 17,211, 59,200, 4, 83,100, 19, 8, 8, 4, 4, 2, 2, 1,129,128, 64, 64, 3, 2, 38, 38, 38,246, 28,123, 53,145,
- 3,224,195, 71,141, 26, 21,153, 37, 75,150, 39, 94, 94, 94, 75,186,118,237, 26,198,191,195, 96,233,170, 87,175,158,100, 37,226,
- 88, 45,117, 98,164,113, 66,179,132, 9, 19,216, 91,166, 74, 49,241,249,192,220,225,143, 71, 20,140,116,119,205,248, 36,187,171,
-195,146,245, 61, 10,133, 61, 31,145, 39,204,193,210,148,101,214,149,100, 22, 44, 88, 64,150, 76,213,162, 99, 66, 81, 38, 66, 79,
-217,165,135, 9, 75, 21, 60, 15,214, 5,144, 36, 62,134, 9, 75,157, 52, 84, 83, 83, 57,157,144, 31,215,225,122, 92, 3,121,144,
- 43, 38, 44,213,251,168,252,140,137,236,132, 76,189,176, 27,148, 65,224,105, 16, 92,122, 51, 11, 60,245, 66,100, 80, 6,129,167,
- 65,112,233,205, 28, 95,240,212, 91,145, 63, 60,131,238,169, 29,180, 21,158,227,146, 26,230,202,149,235, 28,147,169, 47, 28, 20,
-254,134,173, 67,125, 59,116,232,224,194,214,158,219,217,179,103, 15,100,235,206, 99, 38, 98,117,181, 92,175,177,113, 77, 83, 36,
-107, 88, 42,139,237,185,193, 21,115,125,177,183, 78,243, 38,125,122,187,190, 29, 58,117,113, 73,111,157,246,118,110, 79,231,192,
-106, 94,118,143,121,234, 7,131,100,234, 3,159, 73,146, 39, 39,115, 67,202,137,252,184, 78,159,108, 67,100,198, 81,150,242,178,
-248,242,176,136,114,254, 96, 67,171, 93, 46,240, 20,120, 26, 11, 1,161, 75,198, 66,242,155, 28,129,167,113,241,140,207,210,212,
-215, 56,148,183,230, 33,199, 94,217,179,235,112, 52, 91,116,214,241, 28, 82,231,107,213,170,149, 7, 40,240, 98,210, 9,221,221,
-221,125, 56, 88,252, 12, 91,180,238,240, 50, 58,135, 13, 32, 27,246,166,166,169, 70,155,153,153,175, 99,249,231, 43, 86,107, 40,
-201,108,219,177,115, 66,167,140, 46, 62, 28,243,117, 38,157, 85,154, 59,108, 53, 50, 68,230,143, 54,142,120, 88,126, 20,193,216,
-215, 11, 60, 5,158,198, 66, 64,232,146,177,144, 20,196, 64,232,210,159,175, 75,198, 45,225,175,149, 22,103,162,101,205, 22, 45,
- 75,142,153,114,229, 17,118, 38,170,101,254,239,191,255, 18, 20, 45, 90,212,148,173, 89,117, 92, 92, 92,210,112,210, 20, 79,165,
- 73,177,173,153,152, 89,242, 82, 59,174, 71,143, 95,137, 37,179,126,235, 46, 9,242, 20, 46, 97,154, 42,181, 89, 29,182,152,165,
-177, 77,159, 81,174,204, 31,133, 83, 60,128, 63,138,160, 32, 90,194,234, 40,190,238,141,251, 20, 9, 60, 5,158,198, 67, 32,190,
-244,113,198,171,241,239,145, 20, 55,215,225, 15,150, 53,190, 52,174, 40,231, 15, 54,180,218,229, 2, 79,129,167,177, 16, 16,186,
-100, 44, 36,133, 69, 75,232,210,159,175, 75,198, 45,225, 63, 34, 77, 40,182,113, 27, 90,224, 41,240, 52, 22, 2, 66,151,140,133,
-164, 32, 48, 66,151,132, 46, 25, 23,129,248, 41, 77,167,235, 16, 15,137,166,100, 72, 85,181,201,208,117, 92,159,124, 33, 83,115,
-187,196,181,189, 4,158, 2, 79,185, 58, 32,158, 77,237, 8,200,197, 80, 53,159,192, 83,224,169, 9,129,127, 89,151, 84, 67, 45,
-126,148,127,232,123,190,126,213,249,184,197,104, 25,161,116,226, 75,199, 8, 32,170,136, 16,120, 10, 60,141,133,128,208, 37, 99,
- 33, 41, 44, 90, 66,151,132, 46, 25, 23,129,248, 41, 77,185, 4,143,238,197,165,127, 66,221,196, 3,104, 92, 80, 5,158, 2,207,
-239, 16,160,117,138, 68, 52,199, 35, 19,205,118, 47, 70,243,178,185,145,175, 66,235, 50, 88,114, 73,187, 36,115,154,151, 11, 45,
-200, 92,136,230,100,207,100, 12,153,113,108, 58,161,243,113, 4, 78,203,101, 2, 79,129,167,177, 16,144,116, 41,125,161,246, 53,
-108,139,116,122,109, 87,184,195,107, 11,215,226, 65,233,108,157, 34,140,117, 3, 33, 71, 30, 2,226,161,150,135,147,220, 92, 2,
- 79,185, 72,201,203,247, 87,224, 73, 51,178,120,210,156, 44,219,104,174,135, 31,167,213, 52,203,203, 91, 70,245,117,214, 61, 90,
-230,102, 73,230,236, 44, 43,104,182,135,215,143,202,148,113,189,166, 44,127, 69, 27,253,201,117,239,212,177, 29,149,240,201, 65,
- 46,142,214, 84,182, 84,118,234,210,185, 3, 25, 88, 94,209, 70, 6, 2,166, 39,123,188,194, 51,125,193, 14,111,155,142, 63, 75,
-237,102,221,146, 82,155,105, 87,137,167,103,218,199,117,108,200, 41,133,113,161, 17,210,100,189, 36,121, 90, 7, 44,139, 19,149,
- 60,121,242,141,188,135,169,205,208, 45, 94, 41,161,161,149,251,155, 30,192, 63,160,238,182,209,122, 22, 21,173,119,234, 69,210,
-165, 75,169,248,101, 49,152,167, 54, 57,196,171, 35,188, 70,226, 57,222, 14,225, 24, 11, 73,165,163,110,191, 84, 63,105,153,119,
- 74,154,149,185,215,151,233,238, 23,119,181,183,121,246,113,170,219, 37,154,227,222,143, 22,102,214, 85, 70, 20, 95,107, 57, 37,
-153,115, 60,187,127,154,230,126,113,121, 11,135,231, 33, 83, 88,230, 44,143, 62, 63, 34, 83, 5, 47,139,164, 73,147,238,230,223,
- 86, 50,245,227,151,226, 41,179, 76,178,222,117, 63, 32, 75,121,233, 47,169,123,229,242,133,232,115,208, 33, 90,189,180, 23,189,
-124, 56,135,202,148,204,249, 67, 68,139,103,120,206,147, 39,113,226,158, 89, 20,138,146, 92, 17, 67,151, 81,251,165,117,143, 47,
-109,244, 39,151, 51,150, 69,203,165,104, 84,186,244,142,132, 37,250,154, 54,109, 74,142,142,142, 31,185,236,117,140, 80,126, 33,
-194,192, 78,135,222,188,121, 67,235,214,173,139,224, 57,186, 66,185,227,234,199,215, 39, 53, 0,197, 95,242,242, 49,160, 60,218,
-178,106, 44, 39, 79,252,122,146, 23,235,246,231,186,251,243, 94, 90,218, 7,155,182,227,106,194,227,117,221, 85,234,226,206,147,
-224, 62,230,201,112,111,171,214,207, 58,123,141, 66,110,133,155, 12, 73,235, 85,173,152, 6, 80, 13,169,123, 82,232, 21,244, 11,
-122,246,252,249,115,116, 28,154, 58, 15,109, 50,139,242,100,188, 79,253,252,252,194, 63,125,250, 20, 21,112,105, 37, 5, 94, 94,
- 74,111,207,207,165, 75,123,103,135, 91, 88,152, 63, 97,121, 69,181, 52,188, 33,229,148,171,102,218, 73,209, 92,118,239,205,201,
-178,251,124,191, 12,119, 22, 52, 76, 19,126,164,171,221, 3, 38, 73,251,152,124,101,214, 35, 92,187, 76,184, 12,231,100,217,121,
-178,151,195,221,182, 85,115, 71,236,236,232,240,144,101,238,165, 25,238,250,214, 9,213, 91,247,132, 9, 19,246,231,182,137,100,
-178, 53, 82,102,229,245,202,148, 41, 71, 53,155,144,169,130, 70,237,234,197,233,243,135,131,180, 99,227, 96, 38, 90,179,169, 92,
-169, 31, 35, 90, 57, 19, 38,236, 22, 86,179,230,151,165,217,179,111, 97,178, 85, 85, 11,217, 2, 1,235,204, 75,186,237,226,125,
-253, 31,124,222, 85, 47, 31,235,225,225,241,156, 15,116,137,131, 76,141,239,165,220,185,115, 23, 42, 81,162,196,144,156, 57,115,
-198,229,189,164, 81,102, 92,159,205, 56,232,186,242,146, 95,165,243, 29,115,228,200, 17,217,163, 71, 15, 90,191,126, 61,109,223,
-190,157,178,102,205,250,149, 11, 97,247, 3,101,143, 47,151,230,138, 46,168, 50, 86,203,112, 67, 82,109,103, 69,225, 6, 46,138,
- 35,117,157, 21,193,245, 92, 20, 33,141, 93, 20,199,107, 57, 75, 95, 44,186, 54, 77,141, 75,216, 94,191,126, 77, 88,160,185, 79,
-159, 62, 95,216,234,128, 7,163,156, 76, 52, 99,201,228,201, 79,207,179,213, 1,235, 15,198, 42, 11, 31, 59,207, 22,136,239,214,
- 37,228, 5,178, 37,162,195,251, 24,146,195,247,141,145,137, 25,240,113, 30,123,213,242, 96,125, 67, 62,246,140,175, 83, 63, 94,
-146,143, 61, 85, 63,174, 42, 83, 85, 14, 58,240,160,160, 32, 10, 9, 9, 33, 38, 27, 47,148,231,112,252,195,135, 15, 20, 28, 28,
- 28,235,184, 26, 38, 58, 31, 22, 96,128, 58,163,238,106,101,151,142,171,215, 41, 58,207,119, 50, 85,176,211,134,105, 92,218, 93,
- 89, 36,247,178,101,203,190,137,136,136, 32, 87, 87,215,215,170,229,244, 40,246,223,240, 51,119, 66,130, 90,246,153,189,214,218,
-179,122, 54, 67,234,174,146,183, 28,244, 9,122, 5,253, 2,201,122,249,242,165, 33, 68,171,116,181,106,213, 2,195,194,194,162,
- 34, 35, 35,163,184, 61,162, 14,250,186, 80,216, 18, 11, 10, 93,155,131,222, 29, 31,202,132,107, 78, 84,217,226,121, 2,181,180,
-241,175,122,161, 41,104,157,103, 82,154,151,165, 69,228,108,143, 11, 75, 26,167, 13,244, 95,215,142, 38,213,176, 8, 9,155,233,
-126,129,102,101,105, 75,139,157, 98, 77, 8, 44, 7, 79, 73,230,172,204,205, 33,115,104, 45,151, 15,235, 86, 45,165,238, 21,157,
- 63,126,147,233,222, 58, 46, 50, 85,238,203,134,197, 36,111,167, 78,157, 74, 76,180,130,248,120, 50, 25,207,252, 47,195, 83, 70,
- 89, 12,125,215,197,202,159,207, 78, 97, 95, 50, 83,162,179,185,108, 21,133,101,222, 75, 78,221,179, 70, 63,239,238,113,149,169,
- 36, 90,213, 42,229,166,242,165,115,252,176,235,144, 45, 90,229, 64,178,162,106,215,142,212, 66,182, 64,178,250,142, 25, 51,198,
-143,159, 49, 63,158,236,250, 8,255, 86,143, 43,148, 83,119,245, 42, 79, 97,153,132,119,139,179,179,243, 7, 3,101,106,125, 47,
-149, 41, 83,102,248,195,135, 15,131, 6, 15, 30,188,150, 73,151, 33,239, 37,173, 50,245,180, 85, 92,234,174,175,249,127,165, 76,
-123, 46, 76, 31,238, 19, 63,128,104,117,235,214, 13,239,223,218,250, 10,168,239, 60,211,134,100,156, 74,112,170,196,169, 20,167,
-124,209,255,231,229, 61, 18,142,151, 86,219,231,133, 92,149,243,249,181,200,192,181,170,215,171,202,196,113,213,223,177,254, 87,
- 41,183,114,212,161,250,254, 91, 22,128,161,186, 87,175,112, 61,103,133,111,167, 66,246,161, 55,182,173,164,144,167, 15,232,253,
-205,139,116,113,222, 40,234,148,215, 58,180,161,139, 98,172, 62,128,212,206, 75, 68,235,196,137, 19,116,237,218, 53,137,112,220,
-185,115,135,242,231,207,255,137, 95, 24, 7, 56,175,179, 33,242,184, 49,253, 15, 28, 56, 64,220,121,127, 96, 34, 49, 65,249,112,
-129, 44,225, 30, 56,206,121,166,240,241, 68,144,203,203, 8,189,198,253, 85, 73,142,234,253,184,147,125,143,243,176, 56, 69, 31,
- 79,132,235,121,125,199,144,115,231,206, 17, 19, 34,229,241,132,124,143, 9, 29, 59,118, 12, 97,203,135,234,113,157,197,103, 43,
-206, 83,126,185,208,182,109,219,136, 23,168,142, 69,180,112,124,203,150, 45,186,136,150, 54,217, 9,185,238,227, 27, 55,110, 28,
-252,232,209, 35,226,217,250, 99,202, 8, 76,216,132, 27,252,228,201, 19,226,117, 27,149,199,117,150, 17,215,159, 60,121,146,106,
-214,172, 25,164,138, 41,142,159, 58,117, 74,121,124,188,134, 23,217,119,114,121,137,166, 54,168, 39,146,133,133,197, 72, 94,164,
-251, 85, 64, 64,128,164, 3, 74,162,165,180,100,165,203, 90,181,219,156,117,167,206, 28,189,250, 54, 32,123,153,118,227,205,179,
- 87, 51, 55, 64, 23,156,161, 63,197,138, 21,251,244,244,233, 83,137,196, 95,190,124, 89,210,179,187,119,239,106, 35, 90,234,226,
- 83,115,125,159,127,249,242, 37, 10,137,203, 25,201, 31, 4,145, 55, 39,216, 18, 45, 74, 18,147, 2,183, 84,161, 87, 71, 71, 71,
-153,165, 74,249,140, 5,164, 54,160,140, 70,205, 74, 51,189, 50, 32, 38,235,250, 96,199,155, 71,199,148, 15,167, 71, 7,105,101,
-115,235,240, 35,221,236,239,113, 92,213, 6,154,235,233, 96,232, 13, 37,153,179, 61, 87, 94, 30,224,120,107,250,208,206,225,143,
- 31, 63,166,158, 77,203, 71,236,237,100,127,159,173, 92,235,226, 34, 83,165, 12, 13,106,212,168, 17, 2, 93,228,133,233, 63, 38,
- 74,148,232, 63, 67,203, 23, 95,243,131,100,149,118, 79,246,252,242,138,158, 81, 85,178,166,124,107, 0,217,210, 85,229,172,252,
- 92,189, 89,178,100, 9,241, 59, 10, 31, 45,114,201, 86, 44,153, 32, 90,159, 62, 28,160,234,149,243,233,116, 25,214,173, 91,151,
-216,178, 67,157, 58,117,210,231, 90, 76, 0, 75,150, 22,178, 37,145,172,113,227,198,249,133,135,135,251, 45, 94,188,216,175,106,
-213,170,126,124,172,231, 15,182,237,212,177, 99,199, 18,203, 36,150, 73, 44, 19,101,156,166, 77,166,156,247,146,210,146,197,107,
-253,118,219,188,121,243,153, 91,183,110, 5, 84,174, 92,121, 60,175,241,171,241,189, 36, 71,230, 15,214,241,167, 92,206,239, 60,
-183,108,217,178, 45,231,103,242, 9, 91,163,190,122,122,122,126,230, 37,246, 30,177, 37,106, 9,135, 76, 24,212, 31,171, 20,176,
- 64,225,194,133, 35,143, 28, 57, 66,252,204,163, 45,148,214, 30,157,117,208,197, 69, 64,172,250,246,237, 11, 15, 24, 97, 15, 98,
-132,255,163, 9, 82,204,255,202, 99, 42,231, 36,242,165,252,173, 73, 6,206,105,184, 78,186, 70,211, 61, 84,229,169, 84, 72,221,
-146, 21,123,186, 7, 84,142, 83, 49, 78, 71,212, 81,168,227,162, 40,196, 36,235,211,167,128,151,116,117, 84, 87, 58, 84, 34, 3,
-157, 40,158,158,110,119,175, 65, 47, 87, 76,161,246, 57, 45, 67,107,187, 40, 74, 24,160, 1, 82, 39, 11,114,130,116,225,194, 5,
-226,175, 5,130, 53,103,205,154, 53,145,220,153,127,226,198, 29,195,242,100, 5,209,129, 80, 65, 30,119,140, 52,114,228,200,207,
-209,150, 42, 27, 16, 37, 28, 15, 12, 12, 36,254,202,249,204,191, 47,179, 76, 59, 38, 27, 79, 31, 60,120, 64, 54, 54, 54, 49, 36,
- 71,181,236, 32, 82,252, 64, 41,137,147, 61,255,190,186,117,235,214, 48,200,122,246,236, 25, 49, 81, 2, 89,177,225,114, 94,100,
-188,164,227, 47, 94,188, 80, 30,215, 11, 3,136, 22,187,163,136,151, 52,138, 85, 6,229,241, 93,187,118,197, 34, 96,122, 5,114,
- 89,184,110,126,140,221, 87, 16,181,171, 87,175, 42, 73,162, 13, 19,155, 11,236, 58,147,142,223,188,121, 83, 54, 25,204,152, 49,
-163, 68, 70,241,101, 56,103,206,156, 47, 74, 76,149,199,191,126,253, 10, 31,252, 23,198, 30, 47, 72, 27, 93,101,100,188, 95, 32,
- 63,218,129,201,116, 8,136, 15, 44,122,216, 32, 15,215, 42, 45, 89, 45,122,207, 92,235,156,175,225,168, 61,103,159, 63, 91,176,
-249,188,159, 85,214,106,229,101,212, 63, 5,244,133, 9,220,231, 99,199,142, 69,178, 37,138,208,145, 67,175,148, 58,118,229,202,
- 21, 89, 68, 11,241, 87,103,206,156, 9,131, 37,139,221,219, 18,201,226, 20,161, 78,180, 64,186,222,236,106, 69, 59,230,117,249,
-202,150, 25,196,108,253,242, 77, 26, 21, 56,215,163, 26,130,213,151, 52,182,122, 19,124, 97, 21,209,190, 46,116,127,184, 11, 13,
- 46,159, 58, 56, 74, 10,140,207, 82,155,124,139, 37,150, 91, 56, 73,230, 60,207, 42,144, 57,182,142,211,219,139,126,231, 8, 47,
-202, 89, 83,198, 81,167,210,246, 31, 37,153,179, 61,107, 26, 34, 83,245,222,220, 78,119,142, 31, 63, 78, 71,143, 30,165,161, 67,
-135, 18, 19, 99,184, 96,127,104,147, 44,112,179,221,157,104, 62,143,184, 92,152,217,150, 14,203,175,239, 15,221,216,128,139, 65,
-178,202,184, 39,123,246,230,226,102,162,119,119,233,213, 4, 47, 42,239,145,228, 71,201, 22, 72, 86, 0, 62,172, 94,189,122, 69,
-147, 38, 77, 34,126, 30,227, 68,182, 36,162, 21,184, 95, 39,209,226, 15, 80,154, 60,121,178, 68,100, 10, 20, 40,160,143,104, 1,
-157,239,200,150,135, 66, 81,141,143,247, 27, 63,126,124, 12,201,154, 57,115,166, 31, 63,159,126, 28,203,179,211, 0, 72,213,179,
- 78, 99,153, 49, 36,139,101, 18,158,121, 39, 39,167,167,218,100,202,121, 47, 41, 45, 89, 3, 7, 14, 92,203,203,205,141,186,120,
-241,226,179, 29, 59,118,248, 49,241,210,248, 94,146, 35,243, 7,234, 40, 93,202,175,205,196,156, 96,217, 65,226,175, 63, 2,113,
- 69,194,115,158,132,147,100, 80,144,179,241,135,121,202, 66,133, 10,249, 53,106,212, 40, 20,100, 29,186,132,143, 83, 96, 57,100,
-200, 16, 90,180,104, 17, 62,170, 63,242,123,251, 76,237,218,181,147,203,145, 25,157,199, 11, 22, 69, 24, 13, 86,174, 92, 9,235,
-245, 14,185,215,234,226, 34,106,228, 70, 34, 88,128,228, 27, 44,255, 39, 82,170,191,181,253,175,141,164,105,146,163,126, 76,195,
-253, 80, 61,253, 11, 72, 71, 87, 78,227,195,211,192, 89,113,240,218,166,197,116,125, 92, 79,218,231,157,152,142,230, 72, 66,103,
-115, 37,161,203,121,146,210,147, 54,197,233, 76,199, 74,212,212, 53,193, 41,185, 64, 70, 23, 82,178,102,169,166, 27, 55,110, 72,
-132, 5,157,100,151, 46, 93, 62,179, 75,240, 13,231,173,174, 79,174,146, 80, 29, 60,120,144, 96, 41, 97, 82, 20,197,214,170, 87,
-204,210, 3,129, 62, 44, 51,248, 42,103, 2, 19,197, 95, 28,136,139,122,135,251,240,255, 26,137, 22,136, 20,136, 31, 95,255, 33,
-115,230,204,111, 81,158,168,168, 40, 73, 9,209,233, 48,233, 8,100,182,255, 26,199,177, 97,143,123,168, 88,145,116, 22,153,243,
- 61, 5,233, 64,103,195,228, 32,166, 12, 56,254,254,253,123, 66, 61,180,145, 64,117,193,112, 21,114,140,195,107,148, 13, 68,243,
-244,233,211,180,115,231, 78,148, 61,144,191, 74, 94,163,222, 32, 57, 32, 29,135, 14, 29,146, 93, 70, 54,229, 75, 68,235,252,249,
-243,146,101, 8,245,227,178,250,243,250,147, 31,112, 28,150, 61,148, 21,247,115,112,112,240, 87,119,219,170,150, 19, 86, 52,148,
- 1,109,131, 47, 77,101,155,131,252,241,181, 18,209,178,242,174, 90,107,246,186,147,167,143, 92,126,243,218, 38, 71,205,193,131,
-167,109,222,131,255,173,189,171,182,215,211,254,213,217, 37,250,102,198,140, 25,124,139,175,244,246,237, 91,137, 80,170,235, 22,
-126, 71, 63,144, 58,197,113,199,127,152,235, 27,133,164, 36, 89, 32, 92,154,136,214,199,149,238,244,104, 91,135, 40,214, 63,109,
-139,159,235, 83,221, 31, 58, 79,243,189,210,241, 72,192, 89,143,134, 59, 95, 95,211, 57,231, 87,122,117,145,104,126,118, 98,139,
- 19, 13,173,104, 17,126,166,183,195,109, 38, 76,243,105,177,167, 78, 34,172, 90, 8, 73,230, 28,143, 25,247,135, 57, 95, 31,209,
-174,202, 87,184,247, 55,108,216, 64,220,185, 80,203, 74, 57,195,143,247,200,112,135,173, 90,115, 13,145,169, 34,223,135,191,154,
-131, 85,101,178, 62,133,240,249, 50,113, 5, 2,110, 76,154,239, 89, 66,178,222,205,241, 56,202,113,100, 75,153, 92,230,163,185,
-185,208,225,252, 17,155,146,100,189,189,244,141,100,209,210,194, 68, 11,115,211,203,105,249,169,124, 22,147,184,146,173,172,252,
-142,144, 72,150,191,191,191,212, 62,251,246,237,163,133, 11, 23,226, 99,202, 96,178,245,141,104,237,163,106, 85, 52, 91,180, 84,
- 73, 22, 58,223, 74,149, 42, 17,119,206, 6,147,173,145,238,238, 55,218,214,175,127,159,159, 85, 63,254, 40,150, 44, 89, 32, 89,
-249,242,229, 59,205,141, 21,215,128,233, 25, 19, 38, 76, 32,124, 96,177, 76,201,146, 5,146,197, 50, 17, 23,212, 65,155, 18,200,
-121, 47,113, 76, 86,173, 77,155, 54,157,230,119,202,235,188,121,243, 14,158, 61,123,246, 30,252,207, 68, 75,227,123, 73,142,204,
-184, 42, 37, 8, 21,167,228,156,204, 56, 89,114, 74,195,201,156,137,140, 5,183,143, 57,203, 53,139, 78, 24, 4,163, 43,100, 64,
- 42, 2, 91,175, 50,112,157, 2, 55,110,220, 40,245, 99,136,167, 98, 34, 73,236,185,193,136, 65,242,245,245,149,244, 9, 31,197,
-115,231,206, 37,182,226,189, 99,226, 42,231, 93, 98,194,253,207,205,213,171, 87, 19, 99, 71,246,246,246, 1,124, 59,167,232,122,
- 15,228,143,127,180,117, 53,109, 56,232,226, 34,170,196, 10,239,115, 25, 4, 72, 39, 1, 83,202,208, 70,186, 52,157, 87,189,175,
-202,255,168,142,210,154,165,189,137,117,177,200,250,206,138,119,111, 47,159,161, 19,165, 28,232, 68,206, 36,116, 62,119, 82,186,
-150, 55, 41,221, 45,144,140,158,149,180,164,151,189,170, 19,199,110,225,133, 41,119,147, 26, 22,238, 28, 77, 9, 36, 7, 47, 15,
-124,249,114,224,108,164, 62,161, 32, 70,144, 7,130,194, 22, 13,186,127,255, 62,177, 85,130,250,245,235,247, 21,199, 97,213, 0,
- 75,199,113, 60,128,108,178, 14, 67,135,204, 10,160,145,104,129, 48, 33,174,135,191, 98,194, 96,101,131, 85, 7,229, 84, 90,223,
- 6, 13, 26,244, 85,121, 28,101,133, 76, 88,145,228,186,229, 96, 81, 67,253, 64, 82, 84,201,158,242, 56, 44, 62,170, 4, 76, 87,
-253, 81, 86, 88,199, 64,220, 80,103, 96, 6, 82,212,191,127,255,175,159, 63,127,150, 30,146, 75,151, 46,197,148, 93,110, 25,225,
-210, 3,118,103,207,158,149, 72, 21, 98,156,238,221,187,135, 23,153,132, 41,238,133, 4,156,240,178, 87,113,179,126, 87, 92,180,
- 15,242,160,125, 6, 12, 24, 32,237, 65,250, 80,102,174,167, 68,180,156,156,138,153, 20,169,217,103,214,185,187,161, 31, 75,213,
-239,191,176,106,203,225, 75,241,127,222,202,157,217,244,239,171,117, 78, 40,232, 7,218, 50, 52, 52, 84, 34,211,218,116, 74,174,
-235, 48, 89,178,100, 1, 32,128, 76, 34, 37, 75, 22, 18,199,104, 69,150,205, 97, 70,158,246, 73, 98,165,202,121, 44,232,225,230,
-214, 24, 61,139, 23,201, 47,221,184,135, 75, 64, 11, 50,249, 48,233, 57,187,170,169,245,171,151,251, 39,176, 47,126,164, 68,178,
-104,126, 54, 58, 54,192,155,250,150,181,252,192,228,227, 60, 91,160, 56,166, 65,255,200, 47, 73,230,124,183, 34,144, 57,179,161,
-131,255,145,253,187, 37,130, 14, 23, 55, 92,243,179, 39,143,162,118, 37,108,130,153,200,156,227,251, 20,151, 35, 83, 21, 20,254,
-112,218,207, 47,222, 40, 85,153,120,153,179,238,156,140, 11,120, 18,201,154, 46,145,172,173, 87, 7, 56, 94, 24, 81,201,252,237,
-221,161, 25,207,113,157,215,210, 92,111, 99,144,173,226,108,129,123,192,101, 43, 18,151,242,225, 26,137,100,121, 36,123,250, 46,
- 22,201,202, 69,180,204,135,104, 77,121,122, 57,191, 2,149,247, 76, 97, 40,217, 2,201,146, 62,174, 84, 73, 22,158,125,188,163,
-208, 97,242, 51,103, 16,217, 2,209, 10, 13,220, 75,213, 52,184, 14,171, 87,175, 46, 89,178, 64,100, 22, 44, 88, 64, 76, 54,164,
-119, 30,187,133,228, 16, 45,192,144, 0,150, 44,144,172,200,218,181,105,111,171, 86,129, 45,107,215,190,207,199,135,112,234,192,
-100, 27, 35, 80,227, 66,178, 96,197,153, 57,113,226, 68,169,108, 35, 70,140, 64,121, 22,114, 26,197, 50,241,110,215, 74,178, 80,
- 40, 57,239, 37, 38, 23, 38, 13, 26, 52,152,197,239,150,143, 28,126,177,176, 93,187,118, 75,241, 63,187,194,166,113,136,194,119,
-239, 37, 57, 50,227,162, 75,108,185, 44,197, 33, 27, 89,163, 73, 86, 58,222,103,224,228,200,237,144,145, 61, 11,206,108,153,202,
-200,239,210, 12, 44, 27,157,125, 58, 46, 95,122, 38, 75, 58,245,150, 45,136, 23,241,108, 43, 55, 16,104,196, 78,242,135, 43,158,
-201, 88, 68, 11,122, 6, 43, 97,250,244,233, 79,200, 40,127,155,158, 61,123,210,225,195,135, 9, 46, 72,206,175,156,106,198,188,
-116,233,210,146, 87, 40,154, 4,231,214, 36, 43, 46, 22, 45, 16, 37,117,210,165, 78,158,244,157,231,178, 72,164, 76, 83, 62, 25,
-199,100,192,194, 89,116,249, 69, 65,180, 94, 30,220, 66,126,165,236,232, 34, 91,177,110,230, 75, 70, 15,152,100, 61, 47,108, 66,
-239, 74,154, 83, 64,171,130,212,208,213,112,162, 5, 75,144,174,196, 62,113, 89, 68, 11,100, 67, 73,168, 64, 42, 64,122, 64, 86,
-134, 13, 27, 38,145, 2, 16, 44,188,148,112, 47, 88, 59,166, 79,159, 30, 6, 43, 13, 91, 83, 52, 18, 45,182,134,249,195,250,194,
-238,198, 48,228,199,245,183,111,223,150,226,200,144,248,129,254, 10,235, 27,228,193, 5,137, 4,194,197, 15,131,172,248, 39, 16,
- 42, 88,212,240,245,160, 78,180,160,132,176, 34,105,179,182,169,183, 38, 8, 14,242,131, 72,226,229, 7,203,205,245,235,215,165,
-186,227, 55,202, 13,146, 1,146,132,114,162,110,114, 52,194,205,205, 77, 34, 90,112,161, 66, 30, 18,238,193,238, 9, 9, 83,213,
-227, 32, 92, 42,113,107,223,137, 71, 25,209, 30,248,194,225, 23, 2,220,195, 82, 66,185,208, 97,224,130, 31, 33, 90,168,151, 62,
- 93,194,121, 60, 72,250,234,206,129,218, 1, 32,128,108, 21,140, 98,119, 76, 4,227, 23,118,255,206,157,176,173,214,214,116,111,
-193,130, 40,198,247, 19,227, 26,202,199, 67, 57, 14, 44,148,243,132,253, 22,162, 53, 43,171, 5, 19,140,145, 1,227, 51, 93,153,
- 82,223,254,115,148,255, 21,182,148, 20,146, 72, 22,173, 40, 78,225,107,171, 83,189, 60,102, 17, 55,125,157,175,179,149,103, 28,
-143, 22, 76,163,175,238, 4,153,115, 60,135,191, 30,151,233, 74,207,218,185, 63, 99,100, 48,172,163,176,148,160,253,252, 88,207,
-202,120, 91, 69, 94, 27,228,116,131,243,141,145, 35, 83,229,158,174,252,124,132,170,203,132,238,242, 23, 46,134,127,115, 72,143,
-252,141,166,185, 38,147,200, 30,147,172,107,131, 28,253,134, 85,182, 14,189,186,176, 37,117, 40,156, 34,244,250,144,140,231,153,
-108,173,163, 57, 89, 11,252,128,101,171, 24, 91,174, 63,206,159, 63,159,184,125,241, 17,233, 35,191,116,255,207, 89, 42, 83,162,
- 29,199,103, 52,143,138,177,100, 45,200,193,237, 84,132,104,117, 57,162, 13, 53,137,182, 53,165, 11, 83,170,145,143, 75,146, 88,
-131, 66,116,221,139, 9,235, 53, 88, 33, 52,145, 44,188,151,240, 46, 66,135,201,157,190,234, 96, 31,173, 34, 39,140, 31, 71,165,
-138,231,160,208,247,123,169,184, 79, 22,226,223,239,149,153, 17, 91,163, 36, 89,112,245,130,116,225, 61,192, 29, 37, 97, 84,153,
- 30, 76,202,242,179,191,156, 59,215, 51,140,229,206, 14,141, 26,221, 7,201, 2,217, 26,145, 57,243,205,104, 55,162,161, 83, 63,
-212, 71,184, 66,169, 82,165,194, 48, 0, 9,238, 82, 88,178,163, 73,214, 60, 46,143,108,121,114,222, 75,134, 18, 45, 57, 50,227,
-162, 71,220,199,185,117,237,218,181, 37,215,213,139, 95,191,246,156, 50,241,199,160, 55,127,176,102,155, 50,101,138,119,195,134,
- 13,179, 50,169,193, 51,148,169, 73,147, 38,118,252,254, 46,197,255,103,212,117, 47,118,231,241,224, 76, 15,238,234,190,197,203,
-226, 3, 8, 31, 62,170, 9,253, 41,140, 10,104,115, 14,243,120,197,242, 92,101,148,127, 2,158, 27,232, 32,231,221,198, 9,243,
-239, 73,113,172,172,147, 23,113, 31,244,169,209,134, 14, 43,117,121,122, 98,180,116,197, 97,105, 61,135,123,196,133,104, 41,175,
-249,118,121,108, 18,166, 38, 79, 89, 13,253,238, 67,109, 0, 54,114, 81, 28, 60, 61,166, 27, 61,234, 86,149,110,231, 79, 70,143,
- 11,154,208,171, 34, 38, 20, 88, 52, 57,125,174,225, 68,167,203,218, 82,243, 56,184, 14,241,162,208,148,208,184, 21, 43, 86, 12,
-149,235, 58, 4,121, 80, 37, 84,171, 86,173,138,226,151,250, 43, 86,250, 64, 28,135,197, 3,110, 46,142,137,138,226, 47, 29,127,
- 38, 5,239, 96,165, 98, 51,168, 70,162, 5,194, 4,229,226,235, 63,240,255,175,153,240, 69,193,114, 3,114, 4,203, 14,228, 66,
- 62,127, 57,194,189, 36,185,196,208,129, 48,105,144, 69, 98,248, 90,238,163,159, 18, 94,138,170, 86, 53, 28, 7, 33, 0, 81,212,
-102,109, 83,111, 35,184,236, 80, 22,212, 25,215, 66, 46,202,170, 94, 70,148, 15, 56,200, 45, 35,187, 76, 37,162,133, 58,131,252,
- 49, 49,146, 48,101,204, 36,215,161,242,248,218,181,107,165,227,186, 92,135, 24,172, 0,255, 63,204,207,245,235,215,151,220,135,
- 76,118, 37, 43, 9,147, 78,169,131,177,246,170, 90, 61,174,174, 67,232, 9,244, 5,122,163, 77,167,112, 28, 15,139,190,151, 4,
-127,205, 29,225,193, 25, 81,156, 34,249,203, 53,156, 73, 70, 40, 91, 30, 63,129,100,109, 74,149,138, 30, 44, 90, 20,197, 29,217,
- 39, 38,238,161,220,246,159,217,138,240,133, 95, 30, 71,244,201, 53,246,121, 38, 58, 89,152, 76, 28,219,208,210,230,233,205,213,
- 61,163,232,210, 60, 38, 89,222, 68,203,217,208,132, 14,124,103, 43, 90,214,163, 56,245, 46,155,230, 29,187, 23, 79,210,188,236,
-217,245,149,129,221,134, 30,112,191, 45,111, 97,255,108,235,186,165, 81, 32,233,123,246,236,145,172,196,176,148,128, 92,143, 27,
-210,131,186,149,177,121,207, 86,175, 19, 52,211, 83,175, 76,229, 61,217, 82, 56,143,221,187,225,248, 80,217,189,123,119,140, 76,
-124,200,176,229, 57,130, 59,207, 85,250,202,167, 60,255, 45, 38,203,171, 24, 91,214,182,222, 28,156,209,111, 68, 21,171,208,208,
- 27,219,137, 46,205,167,171,131, 50, 82,163, 92, 41,190, 92,236,239,120, 65, 10,220,159,233, 85, 48, 14,100,203, 7, 36, 11,101,
-197,243,142, 47,121,214, 49,144,193,162,114,203,168,204,151,223, 70,225, 84,218, 45,209,203, 75, 3,157,191,185,117, 65,134, 87,
-149,229, 54,170, 65,180,181, 49,249,175,108, 76, 21,179,166, 10, 44,224, 16,123,196,180,158,251,228,100,114,250, 6,229, 2, 9,
- 86, 90,178,148, 36, 11,207, 21,191, 19,223,178,140,172,250,202, 59,105,226, 4,191, 38, 13,202,209,211,251,219,153,104,237,161,
-235,126,211,169, 70,229, 28, 84,188, 88, 81,116,172,132,224,114, 16, 25, 30,109, 71,245,234,213,163,214,173, 91, 75,241, 89, 60,
-162, 87,223,179, 84,150, 7, 9,249,241,115,228,199,175, 11, 63, 14,107,144, 18, 44, 89, 32, 89, 58, 70, 35,234, 42,114,125,184,
-181, 48, 42, 27, 27, 66, 37, 84, 72,214, 28,190, 80, 54,201,194, 77,228,188,151,216, 69, 88,221, 16,215,161, 28,153,250,218, 68,
-203,249, 4,252,174, 44,204,248, 55,229,119, 60, 43, 16, 21,224,247, 83, 65,142,129,202,199,109,148,159, 7, 39, 20,229,143,216,
-162,124, 62, 39,187, 4,203,240,199, 65, 62, 57,120,240,187, 59, 31,187, 71,223,191,123,247,142, 96,201,199,199, 63,222,211, 32,
- 74, 32, 87,240,138,128, 20,113,120,202, 91, 14,171, 80, 31,109,169,173, 42,109,248, 67, 95,122,103, 96, 95,167, 78, 29,242,241,
-241, 33,111,111,239, 80, 38,174, 95,152, 8, 74,109,135, 65, 85,108, 49,198,164,166,178, 55,174,183,214,145,133,186,206,225, 6,
- 50,175,213, 54,178,208,144, 81,135,202,229,119,148,123,121,245, 67, 48,124,219,156, 22,159, 94, 78,233, 69,254,205,243,211,155,
-146, 22, 20, 84,202,140,190, 86,207, 64,129,213, 28,232,191, 76, 9, 62,198, 37, 24, 30,150, 3,213, 4,210,194,238,186,112, 86,
- 18,131,130,225, 65,140,240,224,129,240,240, 48,210,143,172,144,248,146,179, 97, 51,167,116, 28,102,101,254, 26,251,200,249, 46,
-243,113, 59, 38, 91, 79,113, 92, 27,209, 2, 25,129, 59, 46,154,148, 56, 49, 49,187,206,174,184, 16,229,212, 11,209,199,109,112,
- 31, 54,145,178,113,236,163,164,144,184,159, 28, 68,249,122,137, 80, 65,129,163, 77,220,210,101, 56, 14,247, 23, 94,240,114,137,
- 86,244,253, 80, 22,191,238,221,187, 75,101,196, 40, 78,213, 50,246,238,221,251, 35, 20, 27,228, 82,110, 25, 17,131, 6,140,224,
-122,228, 47,215, 24, 76,213,142,135,224,190, 40,186,174,122,243, 3,250, 2, 95, 55,240,247,195,148,140,224, 72,116, 18,152,208,
- 46, 58,158, 68,225, 81,180,197, 32, 76,235,240, 35,193,240,208, 27,232, 15,244, 72, 93,183,240, 27,207,154,190,246, 97,194,232,
-203,113,120, 95, 25,171, 40,126, 17,124,102, 55,103, 40, 91,115, 66, 97,201, 2,201,130,101,235, 93, 64, 64, 24, 19,205, 80,110,
-247, 47,172, 23, 65,252,178,240,213, 39,215,216,231, 57, 96, 61, 15, 2,214, 71, 86, 54,255,240,104,109, 87,182,144,148,103,146,
- 85,236, 91, 7,206, 36,139, 14,245,161, 67,147,155, 80,209, 76, 38,225,223,102,118,247, 44,171,175, 12, 74,153,189, 42,216, 7,
-237,218,186, 94, 50,253, 35, 38, 17,174, 99, 88, 52, 97, 21,222,176,114, 17,249,184,165,252, 38,115,142,167,220,233, 88, 20, 76,
-180, 94,193,138, 9,153, 72, 74,153,176,190, 64, 31,152,200,196, 88, 81,244,150,115, 50, 7,190,207,206,178,254,150,111,198,243,
- 35, 42, 71,147,172,171,203,136,230,177,103,133,227,159, 46,140, 41,204,238,184,228, 97,103,251, 56, 94,148, 98,182,102,187, 25,
- 50,127, 79, 17,144, 44,144, 76, 4,152, 43, 73,230,138, 21, 43, 16,184, 15,178, 85, 92, 95,249,212,207,199,144,173,161,108,140,
- 88,197,131,159,214, 87,103,146,213,136, 94,175,108, 68,149,188, 83,191, 55,144,100, 41,197, 75,100, 11,229, 66,135,166, 36, 89,
-112,201,203, 37, 89, 16, 84,185, 98, 41,122,254,112,141,148,253,180, 0, 0,255,244, 73, 68, 65, 84, 55,109, 88, 61,138,138, 22,
-114,167,165, 11, 58,147,223,137, 97, 84,163,106,121,201, 50, 6, 75, 56,220,253, 32, 89,134,212, 27,150, 44,144, 44,126,126,252,
- 42, 84,168,224,199, 31,185,126,252,204,248, 49,134, 59, 97,201,210, 51,245,131,198, 91,193,146, 5,146,133,208, 3,150, 41, 13,
- 38,194, 7, 31,166,246,225, 11, 12, 34, 89,184,129,156,247, 18, 7,195, 15,194,180, 14,114,131,225,245,200,188,107, 8,134, 26,
-242,162,142,110,153, 50,101,170,193,100,165, 42, 91,178,170,240,179, 83,131,223,173, 85,153, 96,149, 97,194, 84,130,117,162, 34,
-231,145, 99,117,138, 17,207,239,205,188,220, 15, 93,103,121, 8,105,137,148, 88, 44,111,252,145, 17, 49,122,244,232,199,236,146,
-188,194,150,254, 28, 6,148, 61, 41,191, 19,143,115,127, 36,145, 53,188, 55,208, 78,248,208, 71,251,161, 47, 66,204, 51, 54,142,
-167,139, 66, 83, 24, 32,251, 79,207, 26,119,139, 22,106,214,200, 85,225,219,214, 59,117,232,201,198, 5,232, 85,235, 34,228, 95,
-207,147,142, 23, 75, 35,145,172,166,113,156,222, 1,100, 70,153, 96, 10,103, 18,240,145, 95,114, 6, 79,239, 0,242, 0, 66,192,
-129,125,239,248, 37, 19, 51,189, 3,130,183, 65,130,248, 11,236, 29,147,172, 41, 92, 13,105, 52,134, 62,162, 5,121,106,164, 36,
- 9, 91, 45,102,243,200,139,119,176,140, 64,110,116,107, 39,196,253,216,140,174,126, 92,167, 50,176,252,167,176, 18, 33,169,186,
- 47,113, 28, 68, 11, 73,149,128,201,212, 44,148,101,188,134,178,196,169,140,236,191,151,200, 38,143, 72,137,133, 41,142,131, 84,
- 70, 31,151, 53,189, 3,119,162,109,248, 97,126,129,196, 15,224, 72,140, 52,100, 75, 24,241,131,173, 28,146, 14,139, 86, 65,183,
- 66,205,250, 91,123, 85,235,241, 35,211, 59, 64,127,160, 71,208, 39, 85,253,194,255,140,163,156,206, 34, 53,151,247, 25,172, 90,
-220,214,225, 32, 89,236,222, 10,101, 43, 99, 40, 44, 89,111, 95,191, 14,227,227,159,152,208,126, 97, 11,218, 23,126,177,254,150,
-233, 29,104,158,187, 27,220,102,247, 56,104,189, 75,209,148,159,175,140, 96,151,148, 68,178, 90,114,176, 98,111, 58, 59,183, 53,
- 21,114, 54,137, 60,209,147, 3,226,231,120,108,146, 51, 37,131,180, 70,226,236, 44, 59,239, 12,117,190,222,212,199,238,243,130,
- 89, 83,164, 56, 60, 88, 88,241, 81,176,115,243, 90, 42,228,154,242,155, 76,190,183, 28,153, 42,186, 91,152,219, 62, 4,174, 30,
-196, 38, 42,101,242,192, 21,116,148,161,156, 79,214,168,101, 41,142,108,182, 87,245,136, 89, 30,199, 6,148, 73, 21,252,118,123,
-111,162, 43, 75,190,145,172,197, 60, 61,206, 90,254,240,220,214,140, 78, 79,169, 77,133,157,147,134, 75, 1,242,115,189,100, 7,
-219,115,135, 18, 4,221, 65,199,128,193, 42,112,109,194,234,134, 15, 35, 4,156,243,121,196,156,200, 30,197,169,172,191, 68,182,
- 50, 39,125,121,137, 73, 32,109,105, 64, 1, 76,178, 42,123,167,126, 23, 71,146, 21, 67,182,216,165,244, 6,229, 2, 41, 2, 41,
-198, 84, 15,124, 82,175, 37, 75, 41,160,114, 5,142, 21,251,122,137, 74, 20,245,230, 96,103,111, 42, 86, 56, 51, 61,191, 55,141,
-242,229,206, 40,197, 98,225,125, 7,203,150,204,119, 80, 76, 54,184, 11, 97,201, 98, 75, 51, 62,196,118,243,111, 63,118,241, 43,
-131,222,117, 77,253,160,245, 86,112, 23,162,115,102,153, 40,207, 11,196,251, 32,108, 32, 58,222,199,208, 34, 42,228,188,151,216,
-162, 85,176,100,201,146,253,121,223, 67,206,244, 14,122,100,202,114,229,202,168, 8,250, 49,124, 60,192, 37,151, 39, 58,241,212,
-101,210, 49,217, 35, 14,213,238,131,235,154,177,126, 47,224,190,238, 16,127, 0, 31,228,169, 87,224,138,109,204, 73,206,186,169,
-234,197,198, 53,109, 56,237,229,126,233, 46, 91,178, 62,149, 43, 87, 78, 34,200,176, 74,130,104,161, 15,128,197, 43, 83,218,180,
- 17, 83, 20,138, 55,108,146,108, 46,163,238,127,127, 22, 76, 88,202, 46,194, 35, 60,111, 86, 48,130,223, 91,100, 74,240, 67, 19,
-150, 2,108,124, 57,242,188, 44, 31,217,101, 19,231, 9, 75,217,170,114, 30,110, 55,117,247,149,202,113,248,171, 99, 54,206,123,
- 18,100,137, 21, 64,227,132,165,184, 14,231,177, 87,189,142, 21,175, 34, 31,123,174,126, 60,218,125,247, 84,253, 56, 95,171,113,
-130, 56, 16, 42,188,200, 97,129, 99,226, 18,227,190, 84, 18, 48,124, 73,107,139, 31,211, 38, 83, 89, 78,109,101,209, 81, 70, 92,
-250, 93, 57,101, 96,250, 67, 19,150,178,197,238, 53,130, 88,121,116, 74,236, 9, 75,163, 45, 91, 63, 58, 97, 41,244, 9,122, 5,
-253,130,158, 33,113, 61, 53,117, 24,154,218,168,124,158, 60,121,222, 98,180, 33,127,129, 69,176,169,254, 11,191,208, 63,113, 28,
- 72, 24,183,217,103, 38, 97, 95,249, 75,237, 11,235, 8,130,224, 53, 13,243,254,233, 19, 3, 74,238,179,185,158,133,217, 98,179,
-227,230, 16,167, 27,205,242,155,126,241,155, 88, 81, 34, 89,167,103,183,164,130,206,201,190, 17,162,185, 89,118,209, 34,247,162,
-136,105,210,240,134,138, 85, 78, 73, 38, 2,236,249,154,235,131,157,110,212,200,109,253,117,213,146,185, 82, 44,221,214,245, 43,
-169,128, 75, 52,201,194, 12,241, 8,176,151, 33, 83,237,158, 18,217,130,101, 19, 50, 49, 34, 73, 38,201,138, 41,167, 42,209,234,
- 87, 58, 85, 96,203,252,201,191, 52,200,153,236,107,181,172, 73,195,202,186, 37,141, 40,228,148, 56, 50,135,109,194, 40, 79,107,
- 5,149,245, 72,241, 37,122, 36,162, 38,203,155,198, 54, 98,203, 27,166,155, 80,234,202,119,123, 46, 63,218, 92, 27,209,210,217,
-238, 18,217,114, 55,121,121, 96, 88, 73,170,146, 61,245, 91,153, 36, 75,159, 46,229,228,103,245, 13,220,241, 24,133,200,101,147,
- 67,178, 98,100, 86,173, 92,150, 30,223,219, 73,155,214,142,102,178,229, 73,203, 23,118,161, 51, 71,135, 80,165, 10, 37, 8, 68,
- 6, 33, 7, 76, 52,228, 16,173, 88,229, 84, 90,180,216,245,236, 7,146,181,124,249,114, 63,118,113,194,162,181, 60, 90, 39,190,
- 35, 91,152,228, 84, 77, 95, 98,201, 84, 90,180,224,206, 70,217, 88,166,228, 54,101,153, 32,115,114, 55, 93,120,186,107,123, 47,
- 41, 45, 91,113,153,176, 84, 69,166, 33, 22, 45,125,237, 46,183,190,170,249,126,183, 76,124,196,250, 33,196, 3,161, 60,222, 54,
- 54, 52, 42, 81, 34,122,150, 52, 41,189,224, 52, 91,161,120, 23,151, 74,253, 97,215,168,187, 13,127,204,194,101, 64,229, 52, 53,
-174,228,106, 99,183,219, 87,182,114,132,114, 80,222, 63,181, 4, 15,191, 24, 79,194,181,135,164, 74,246, 84,143, 71,187, 63, 53,
-193,252,187, 31, 22,185, 77,175,175,156,238,220,238,143,249, 11, 42,246, 18, 60,108,217,202, 84,184,233, 64,155,172, 85, 43,232,
- 35, 6,122, 10,194,226,147,246,131,126, 65,207,224, 78, 53,128,104, 65,116, 25,126,129, 63, 95,186,116,233, 39,118,229,134,115,
- 12, 67, 4, 91,119,194,217,194,241,149,131, 69,131,113, 14,121,180,148, 65, 95,221,229, 98,168,243, 37, 25, 29, 16, 46,145,173,
- 43, 3,157,110, 86,241, 78, 25, 54,175,123, 89, 42,152, 81,141,100,105,159, 29,254,187,114, 74, 50,163,201,214,197, 1,142, 55,
- 75,184,167,138, 24, 61,176, 27,147,172, 20,209,214,177,104,146,101,128, 76,117,178,197,216, 5, 99,142, 30,153, 36,235,187, 15,
- 1, 90,224,225,200,100,112,249, 55, 18,165, 39,205,230,233, 45,102,120, 56,254,160, 46,201,109, 47,189,237, 14,178, 85,202,221,
-228,154, 76,146,245, 93,221,181, 20, 36, 39, 91, 32,110,200, 36, 89,177,100,206,152, 49,157, 26,213, 43, 67,247,110,108,164,144,
-183, 59,233,194,169, 73, 84,179,106, 46,246, 2,240,160, 77,142,213, 65, 92, 30,123, 10, 12, 38, 90,124,147,178,109,219,182,149,
-172, 88,108, 13,149, 72, 22, 7,210,131, 16,169,186,176, 99,200, 22,150,235,193,178, 61,186,136, 22,159,171,207, 50, 37, 43, 22,
- 44,172, 32, 89, 8,206,199,113,185, 13,196,249,244,181,145,198,247, 18, 44, 91,252,225, 54,144, 39, 48,141,203,123, 73,163, 76,
- 61,101,214, 87, 78, 3,170, 28,147,245,119,203, 52,229,193, 21, 88,109, 3,150,173,200,169, 10, 69,224,188, 4, 9,252,145,230,
- 42, 20, 1,194,162, 21,151, 38,253,255, 53,223, 53, 46,119,126,210,162,210,108,205, 16,139, 74, 27,142,237,239,126, 88,228,150,
-248, 79, 41,167,109,180,158, 97, 26, 6, 77, 49,116,186,202,105,193, 22,140, 97, 28,247,112,130, 73,219, 91, 36,238,208, 78,240,
- 87,217, 48, 6,193, 66, 7, 16,191,172,238,170,100,235,124, 63,199, 91, 53,114,152,126,142,101,201,138,203, 18, 60, 42,100,235,
- 76, 95,199, 91,213,115, 90,124,147,169,180,100,197, 65,166, 58,217, 98,139, 35,166, 77,144,229, 46, 84,239, 28, 37,203,219, 34,
- 55,103,105,178,214, 57, 30,117,181,166,217,238,149,224,222, 36, 95, 79, 77,235,168,254,178, 54,146,251,192,252, 46,210, 62,107,
-214, 76,170, 94,141,167,153, 40,157,143,178,121,187,243,100,149,227,164, 56, 40,184,119, 17,155,133, 64,120, 25,117,208,132,103,
- 89,126,246,150, 99,142,172,104, 75,150,166, 56, 65,144,173,146, 88,128, 26, 11, 81,235, 33, 90, 56, 93,159,101,194, 5,249, 53,
-218,146,101, 8,201,146, 75, 92,101, 84, 55, 86, 22,161, 75, 50, 17,227,233,120, 38,243, 68,166,136,169,107, 32,243, 18,145, 77,
- 38, 2, 66, 9,101, 2, 37, 51,155,192, 83, 38, 80, 50,179,201,197, 83, 57,251,178, 28,177,114,101,202,145,165,204,163, 85,230,
-255,201, 22,230,143, 66,144,122,150,205,146,187, 80, 55, 33,210,217,233,196, 88,182,164,248, 46,200,244,216, 46,185, 11,127, 64,
-166, 33,149,149,209,225,194,191,151,128,124, 21, 9,181, 38,221, 1,210,191,180,141,140, 93,247, 31,144,167,179,221,121,142, 64,
- 98,171, 13,241, 44,232,196,238,115,194,111,153,247, 18,120,202, 4, 74,102,182,127, 25, 79,153, 16,137,108,170, 8,252,203, 10,
- 35,234,110,220,103, 65,224,169, 5, 79,201,202, 35,173, 81,200,211, 30, 96, 57, 26,205,241, 83,234, 87,235,196, 51, 70,230, 28,
-175,210,180,216, 56, 50,227,168, 14,162,221,227, 8,156,150,203, 4,158, 2, 79, 99, 33,240, 51,116,201, 88,101,251, 29,114,212,
- 99,178,126,107,140,214,143, 2,240, 51, 26, 87,200,252,209, 86,137,125,189,192, 83,224,105, 44, 4,132, 46, 25, 11,201,111,114,
- 4,158, 2, 79, 99, 33,240, 51,116,201, 88,101,251, 29,114,148,196, 74,125, 31,243,224, 1, 48,245,100, 72, 65, 53, 93,175,239,
-152, 62,249,250,174,143, 75,153,255, 6,153, 24,157, 83,143, 83, 59, 78, 88,241,190, 79,116,210,135, 39, 2, 57, 13,173,191, 62,
-153,134,202,147,243, 96, 10,153,134,181,147,104, 35,237, 8, 8, 93, 18,186, 36, 87, 7,196,115,244,107,159, 35,229,221,180,181,
-143,190,246,248, 19,207,255, 81,163, 14,127, 20, 32, 57,157,181,161,247,136, 47, 50,101, 79, 18,105, 0, 0,191,167,238,164,200,
-193,129, 54, 83,162,147,156, 9,241,126, 79, 57, 13, 0, 50, 58,171, 40,167,225,152,233,186, 66,224, 41,240, 52, 22, 2, 66,151,
-140,133,228, 55, 57, 63, 3, 79,227,150,240, 31,145,246, 51, 26,226, 95,150, 89,253, 39,232,205,175,193,147,200,150,215, 65,200,
- 31,157, 82, 40, 62, 41, 26, 50,201,250,246, 23,164,104,204,139, 20,167,224,196,179, 78, 74, 9,139,163,170,111,191,166,156, 63,
- 14,176, 40,231,143, 99,168, 42, 65,224, 41,240, 52, 22, 2, 66,151,140,133,164, 32, 90,154,144,204, 21,125, 16,253, 23,172, 91,
-154,250, 49,227,182,128,156,175,251, 20,105, 51,219,166,176,241,168,144,210,218,189, 39, 18,254,199, 49, 61, 37,145,245,176,164,
-178,115, 79, 99,106,151,237, 32,246, 50,106,166, 87,166,183,187, 89,205, 50, 69, 50,108,206,234,145,170,154, 12,121,177,216,190,
-185,185,147,121,122,151,156,173, 44, 50,100,157,110,227,146,171,167,165,165,171,180,200,102, 28,182,150,186,174,225, 53, 65, 19,
-228,106,237,151,176, 64,183, 83,137, 43,251,250, 37, 41,230,123, 56, 49,126,215,174,189, 78,215, 18, 21, 26,235,142,118, 72,105,
-157,185, 97, 58,215, 60,147, 29,179, 22, 59,149,165, 80,141,119,238, 5,107,188,179,114,206,235,151, 58, 67,206,201, 56,167,163,
-173,190,151, 73,212, 23, 11, 78, 73,169, 68,137,125,138,174,138,179, 49, 68,171,155,226, 84,137, 18,138,253,209,103,145,163,175,
-129, 68, 11,211, 45,192, 42,150,145,215,212,178, 54, 0, 87,189,237,110,128, 44,101, 86, 33, 51, 14,160,233,184, 68,224, 41,240,
- 52, 22, 2, 66,151,140,133,164, 32, 90,154,144,212, 25,163,165, 17,122, 39,175, 34,231, 60,242,148,125,139,148, 57,119,153,183,
-153,114,149,121,155,222, 53,207, 30,101,102,171,140,185,246,216,102, 41,241,214,198,163,196, 91,107,247,226,111,211,184, 21,127,
-107,230,148,255,156,154, 48,173,138,109,106,237, 94,163,106,195,142, 43, 23,172,217,115,241,252,205, 87, 33, 72,248, 31,199,112,
-238, 71, 95,188,166,118, 57,102, 21,175,246, 95,152,169, 93,246,153, 50,116, 75,239, 3, 88,162,176,253, 17,122, 61,149, 74, 22,
-206,176, 95,134,188, 88, 68, 11, 36,171, 93,183, 1,179, 31, 62,122, 54,183, 68,205,118,179, 76,211,185,207, 73,101,155,117,180,
-169,141,123, 49,133,194,215,144, 37, 14,212, 39,245,147,138, 2,130,229,218,105, 87, 34,115,199, 2, 86, 73, 77,211,118, 74,146,
-194,226,100,210,148,150, 39,147, 91,102,232,234,152,183, 65,250, 82,125,252, 52,205, 12,174,149, 24,152,217,122,149,118,203, 93,
- 62,120,240,172,125,225, 99, 87, 93,165,177,107,111,115,186, 67,157,199,108, 34,207,108,121,104,254,150, 75,212,212,119,115,184,
-157, 87,169,224,148,156, 87, 22, 41,122,244,104,108, 12,209,122,240, 32, 31,147, 44, 19, 78, 54,209,201,228,249,115, 5, 47,232,
-249, 45,199,195,135,138,113,178,100,114,166,114, 21,235,150,241,240,204,126, 38,181,153, 69, 95,243, 52, 86,189,237, 29,156,253,
-211,166, 77,119,143, 79,101,136,209, 85, 43, 43, 83,254, 95,204,167, 20, 27, 84,189, 58, 47, 83,207, 85,179, 9,153,113, 0,237,
- 71,223,117, 6,222, 82,180,145,129,128,233,201, 46,240, 52, 46,158,241, 89,154,186, 37, 75,255,168, 67, 16,172, 15, 31,195,104,
-209,238,251, 82,122, 22, 16, 74,141, 59,143,193,188, 42,183,144,170,182,244,165, 43, 15,222,211,172, 45,183,104,230,230,155,116,
-250, 70, 0, 89,100, 42,134, 85,227,245,190,120,147,219,120,230,109,222,105,200,198, 27, 79,130, 35, 54,239,247,187,215,109,224,
-196,157, 72,248, 31,199,112, 14,121,180, 32,174, 87,177,147,219,185,218,231, 41, 81, 43,248,245,251, 79, 17, 89,242, 86, 8,196,
-111,185, 15, 11,207,202,222,133,151, 87, 25,130,196,179,183,199,164,194,121,237,238,128,104, 21, 45, 96,119,214,210,206, 35,216,
- 42, 99,206,192, 12, 30,249,143,155,217,123,106,179, 50,197,148,211,194, 33,235,180, 59,119,239,207,221,176,255,210,220,150,190,
-171,231, 94,189,251,124,238,229, 91,143,230, 50, 17,156,249,141,108,201,222,122,171,231,180,183, 47,144, 40, 81, 50,211,242,137,
- 77, 76,215,186,150,232, 28,182,234,240,115,186,247, 34,132,174, 61, 14,162,177, 27, 30,144, 83,161,102,225, 38,169,109, 48, 57,
- 44,102, 50,215, 68,234,190,195,211,217,187,232,235,153, 91,190,145, 43,101, 82,146,172, 83,151, 31,209,204,109, 15,164,227,125,
-231, 95, 36, 11,199,220, 47,180,147, 34,226, 5, 78,169,153, 66,113,163,135,162, 76,179, 11, 10,127,255, 17, 76,165,250, 42,222,
-188,193, 66,212, 78,156, 48,137, 33,146,211,155, 55, 10, 27, 88,178,252,253, 21, 35,154,149, 81,248, 93,228, 32,127, 86,182,102,
-156,148,139,164,106,108,247,114, 21,106, 94,152,187,124,127,248,230, 83,175,105,232,194, 11, 84,174,122, 11,202,153,191,196, 87,
-158, 28,239,144,147,123,174,131, 94,249,203,127,176,115,116,251, 96,102, 97,117,193,220,220, 18,228, 75,117, 9, 21,189,186, 36,
-187,101,254,159, 81,200,140, 3,104,130,108,104, 68, 64,232,146,208, 37, 99, 33, 16, 95,116,201, 88,245,141, 31,114, 64,180, 34,
-121,141,184, 94, 51,142, 75,105,243,209,251,116,238,198, 43, 42, 95,191, 59,149,168,221,149,182, 30,127, 64,139,182, 95,167, 78,
-147, 14, 81,199,137, 7,233,160,223, 19,217, 68,203,212,198,163,195,241,203, 79,222, 77,156,183,254,100, 10,107,247, 54, 41,211,
-185,103, 69,194,255, 99,102,174,242, 59,228,119, 63,196,212, 38,139,111, 92,137, 86, 42,251,156,155,143,156,187,243,213,239,206,
-187,144,185,235,142,189, 51,181,207,177, 65, 46,209, 2,193,226,101, 2, 38,176,105, 37, 86, 26, 51,162,207,188,210,133, 51,108,
-115,176, 77,225,123,238,188, 31,125,250,252,133,238,220,123, 68,255,117,236,243,145, 45,125, 39, 83, 90,121,130, 60,168,110, 49,
-138, 13,139, 86,131,150, 61,102,215,235, 53, 87, 34, 89, 44,123,238, 51,255,247,115,125,231,108,155, 11,203,150, 1, 26,129, 17,
-134,170, 91,109, 43, 91,231, 81, 99,215, 92, 63,119,247, 89, 32,221,127, 17, 76,151,238,189,163,147, 55,222,208,177,107,111,232,
-244,173,119,116,245, 97, 16, 29,190,250,150, 74, 14,190, 72,201,205,237, 94,241,197, 53,181,149, 83,121,220,217,219, 39, 98,219,
-233, 87, 58, 73, 22,136,214,224, 69,231,201,210, 49,215, 87, 29, 68,139, 73, 22,211, 39, 41,249, 73,179, 1, 51,121,173,157, 45,
-123,142,231,117, 27, 54,127,209, 99,208,132,144,214, 61, 70,133, 20, 44, 83,247, 69, 58, 71,143,231,201, 77, 45,107, 35,207, 13,
-133,162, 78,244, 69,184,144,101, 72,155,198, 23, 69, 70, 23,247, 3, 97, 17,145,116,230, 86, 32,141,231, 50,245,154,176,157, 90,
-245,158, 21, 53, 96,238,241, 79,221,198,111,167,145,203,175, 81,131,182,131,168, 84,249,186, 84,168, 68,213,243, 85,154,143, 77,
-197,178,148,214,173,248,242,242, 17,229, 52,224, 33,145,145, 85,224, 41, 3, 36, 3,178, 8, 60, 13, 0, 75, 70,214,127, 25, 79,
- 25,240,252,177, 89,116,143, 58,220,190,125,251,119, 51, 0,131,104,133,133, 71, 82,165,238,107,165,212,119,246, 41, 58,113,253,
- 45,221,121, 22, 66,151,238, 7,210,162,189,143,168, 82,223, 93, 84,186,227, 74, 42,213, 97, 5,173,217,119, 93, 19,209,138,133,
-200,132,209, 41,114, 77,158,108, 54,190,102,221, 60, 27,110, 62, 13,161,214,157, 42,239, 29, 51,198,124, 26,142,155,155,103, 55,
-183,118,201,189, 44,103,209,170, 95,112, 46,125,166,252,159, 82,218,231, 88,136,227,134,192,154, 34, 93,150,170,141,218, 14, 8,
-190,243, 44,232,115,238,118,123,207,158,190,241,214, 63, 87,137,122,254, 41,210,101,174, 42, 71, 14,172, 88, 32, 89,188,184,243,
-132,231,207,159, 79,224,117,181, 38,240,154, 95, 19,218,183,174, 51,172,100, 33,251,221,118,182, 38,195,158,191,120, 77, 97,225,
- 68,225, 17, 68, 97, 17, 81,180,112,197,230,136,180, 25,115,158, 97,249, 26, 99,161, 16,163,101,102,231, 53, 32,181, 93,246, 89,
- 32, 90,254,239,130,231, 46,217,118,102,110,229,142, 51, 12, 37, 90,234, 85,232,253, 53, 44,162,207,200, 81, 99, 46, 52,106,210,
-226,201,226, 53,187, 30, 30,190,240,146,118,159,123,193,233, 37, 29,190, 28, 64, 23,238, 5,210, 35,255, 80, 10,254, 20, 65,251,
- 46,190,161, 4, 9, 18, 96, 9, 4,157,155,173, 91,129,175,129, 65, 33,244,236,205,103,218,126,234, 5,213,104,218,147,230,173,
- 63, 65, 83, 55,222,162,225, 75,252,104,196,194, 19, 52,122,193, 1,106, 55,112, 14,165,182,207,254, 69,187, 48, 88,179,148, 68,
-139,164, 17,147, 78, 78, 78, 23, 31, 60,245,167, 27,108,113, 59,112,233, 53,173, 56,248,132, 38,108,184, 67, 29,167,240, 2,177,
- 22,182,108,200,146, 86,245, 45,167,129,104,169,223,198,132, 15, 96,202,138,221, 33,161, 97,145,135,175,188,165, 61,103, 94, 83,
-173,255, 6,209,176,149, 55, 67,199,174,129, 53,142,173,114,107,110,211,232,213, 55,169, 90,221,246, 84,189,126, 39,106,216,117,
-170, 15, 95,163,203,149,170, 15, 30,113, 94, 32, 32, 16, 16, 8, 8, 4,126, 2, 2,154,184,200, 79,184,205,239, 17,169,141,104,
-221,120, 16, 64, 46, 85,167,144,239,130,147,180,112,207, 99,154,184,225, 46, 13, 90,114,131, 58,206,184, 68, 13,199,156,165, 10,
- 3, 79,144, 87,227,149,148,161,194, 4, 26, 58,239, 48, 89,184,126,231, 58,140, 85, 33,144, 44, 38, 49, 52,108,184,219,139,153,
-115,154, 73,123,252,198,113,182,162,236,154, 52,123,101, 84,177, 10, 13,232,210,221,183, 84,164, 92, 61,234, 55,102, 81,148,133,
-115,254, 93,114, 81, 73,109,239,105,105,153, 49,247,155,199,254, 65, 97,109,167,158,187,237,222, 98,239,193,158,243,175,159, 88,
-181,239,230, 13, 38, 4, 47,113, 94,159, 44, 37,209,122,250,244,169, 68,178,110,220,184, 49,225,202,149, 43, 19,170,148,243,188,
- 2,215,161, 79,126,187,115,111,223, 7,211, 87, 38, 90,111,131,195,233, 22,147, 66, 16,153,114,181, 90,133,166,178,213,234, 70,
- 84,164,178,205, 54,246,232,185, 27,115, 7,204,216, 54,119,220,146, 3,115,171,117,157, 53,215,218,171, 66, 44,215, 97, 42, 91,
- 55,119,206,247, 56,149, 93,118,255,152,100,239,125, 94, 71,153,123, 71, 68, 70,245, 62,125,238,194,152,227,103, 47, 47,153, 49,
-111,217,233,134,205,218, 60, 91,186,249,196,245,195,151, 95,133,159,187,253,142,142, 92,125, 67, 67, 86,220,165,178,131,206,211,
-164,205, 15, 65,168, 53,173,249, 23,235, 22, 54,110, 5, 58,148,173,213, 54,226,225,139, 32,201, 74,246,249,107, 4,189,126, 23,
- 74,215,239,191,166,189, 39,111,211,228,165, 7,168, 65,247,233,100,158, 49,127,184,169,109,206, 14, 58,136,150, 29,211, 38, 38,
- 88, 82, 74,139,124,105,210,164, 41, 89,171, 94,195,215, 23,153,172,239, 58,247, 74, 34,236,163, 86,223, 34,247,124,149, 94,155,
-152,152,149,140, 38, 90,105,163,201, 22, 8, 23,203,208,184,205,107,217,190,207,132, 5, 43,246, 71, 46,217,245,152, 86, 31,124,
- 73,189,134,204,160,206, 67,151,210, 24, 38, 87,146,203,115,221, 55,215,231,168, 85, 55,168,117,159,153, 84,174,110, 7, 74,102,
- 98, 42,214,217,210,247, 16,136,243, 2, 1,129,128, 64,224, 55, 32, 16,207,137,150,170, 69,235,251, 65,125,154, 42,167, 12,134,
- 47, 82,169,217,215,203, 15, 62,208,130, 61,143,168,207,180,125, 84,189,253, 4, 42,211,124, 52, 85,234,177,142,137,214,113,170,
- 60,228, 36,101,200, 93,251,107, 26,142,207,210, 16, 12, 31,211, 84, 85,171,218,102,104,215,202,110,226,184,177, 14,167, 26, 52,
- 48, 13, 3,193,194, 30,191,113, 60,107,190, 34, 65,129,159,136,166,204, 89, 65,101,170, 55,163,137, 51,151, 18,126,219,122,248,
- 4,202,109,111, 83,251,236,171,198, 47,216, 25,124,230,214,187,144, 28,237, 14, 94,206,213,249,248,233,252, 61, 79,239, 95,122,
-240,229,197,250, 93,166,156, 79,149,222,107,169, 62, 89, 74,162,117,239,222, 61,137,100, 93,190,124,121,194,185,115,231, 64,180,
- 46,130,104, 21, 43,104,119, 26, 68,235,197,187, 47,116,241,254, 7,218,117,222,159,182,157,121, 73,243, 55,156, 96, 55, 90,238,
-227,218,228,195, 69,120,224,212,229,185,238, 85,134,204,101,183,232,108,245, 96,120,144, 44,183, 92,165, 95,247, 24,181,156,250,
- 79,222, 36,165,142,195, 87, 17, 8,151, 46,162, 5,239,238,201,211,103,251, 28, 62,118,102,224,158,131,167, 70, 28, 58,117,109,
-226,208,145,227,239,183,106,223,237,125,243, 73,151,168,112,167,157, 84,180,251, 65, 42,209,247, 20,141, 90,251, 64, 22,209,194,
-253,152,108,117, 44, 94,181, 85,196,182, 19,143,168, 74,159, 29, 84,182,243, 90, 42,218,114, 33,101,175, 53,158, 10,214, 27, 69,
-169, 50,228, 3,201,234,168, 15, 79, 77,231,211,219,218,207,159,181,116,107,228,230,147, 47,104,246,142, 7,212,172,223,226, 72,
- 83,243,116,243, 13,144,149,130,131,223,215,157,186,241, 54,242,214,163, 47,180,246, 24,187, 57,153, 92,117, 31,187,133, 70, 51,
-169,194,255, 18,209,194,158,211,193, 75,111,232,194,173,183, 52,101,205,133, 8,190,199, 18, 78, 41, 13,184,151,200, 42, 16, 16,
- 8, 8, 4, 4, 2,191, 0,129,120, 78,180, 84, 17, 82,146,174,255, 31,211, 85, 57,119,118, 33, 62,120,249,145,150,236,123, 76,
- 77,123,205,100, 23, 84, 56, 33, 72,190, 80,253,145, 84,126,192,113,170, 59,242, 12, 89,101, 46,174, 30, 4,255, 93,147, 84,171,
-102,245, 95, 84,212,215,205,109,219,100,184, 1,146,165,220,240, 27,199,243, 22,202, 26,244, 62, 36,130, 30,248,127, 33,255,160,
- 8, 58,125, 59,136,230,239,126, 76,169, 29,243,233,181,192,224,102, 41,172,178,228,200,152,189, 76, 96,120, 4, 83, 15,222,234,
-141,189,112,173, 96,143, 51,199,139,244,185,176,167,230,232,155,219, 87, 29,123,125,198,218,181,192,115,228,211,165, 47, 74,162,
-117,237,218, 53,137,100,157, 57,115,102,194,241,227,199, 39, 52,111, 92,101,120,233, 34, 25,182,186,101, 76,213,234, 26, 91,118,
- 78,223,122, 79,155, 79,189,164, 57, 59, 31,210,104,118, 81, 45,217,125,147, 82,219,102, 13,214, 38,219, 52,189,151, 7,200, 21,
-167,177, 32, 85,170,249,148, 36,171,203,240, 37,148,187,198, 96, 74,157, 33,247, 59,185, 22, 45,174,106,207, 51,103,206,246, 58,
-121,234,108,159, 99, 39,206,244, 63,112,228,212,144, 57, 11,150,206, 45, 94,162,196,171,252,173,215, 83,161,142,219, 99,136,214,
-192,101,119,101, 19, 45, 37,217, 42, 89,167,203,215,193, 11,206,145, 79,187, 53,148,187,233, 66,106, 63,122, 59,165,207, 86,229,
-179,169,189,193, 36,203,194,193,193,193,215, 37, 83,166,227, 89,179,231,122,178, 97,255,101, 90,123,244, 41, 77,221,124,151, 99,
-252,246, 83,218, 12, 89,158,164,176,204,112, 60,169,169,181, 47,223, 27,211, 53,104,221,246,157,190, 94,185, 70,189,230,244,248,
-245, 23,138,226,230, 30,187,248, 70,196,136,229,215,162,148,129,251,107,142,248,211,192,137,171,169, 82,227,190, 52, 96,246, 81,
- 30,180, 17, 74, 15,159, 5, 71, 13, 24, 54,245,181, 77,122,251,171,250,228,255,130,247,137,184,133, 64, 64, 32, 32, 16, 16, 8,
-168, 33,240, 23, 16, 45, 37,193,210,108,209, 66, 5, 53, 85, 18, 68,235,232,197, 39,180,227,244,115,234, 53,101, 55, 85,105, 53,
- 70, 34, 90,249,235,248, 82,185,254,199,169,230,176, 83,178,136,150,100,209,106, 99, 55,113,236, 88,135,147, 13, 27,164, 8, 5,
- 25,194, 30,191,113,220, 61,103,193, 55, 1, 31,190,210,210,253, 79,168,199,220, 43, 84,186,239, 49,170,193,178,229, 18,173, 84,
-246,217,231,173,223,115, 65,146,123,245, 81,112,112,161, 94,103, 79, 21,233,123,225, 96,185, 97,215,119, 87, 26,117,119,253,200,
-141,254, 59, 26,244,154,119,200,212,198,115,134, 46,237,182,182,182,150, 98,180, 46, 94,188, 24, 67,178, 14, 30, 60, 56,161, 89,
-163,202,195, 48,143,150,171,115,138, 22,187, 78, 63,102,146,240,156, 73,194,125,234,191,232, 58,181,155,118,145,198,172,188, 72,
- 76,162, 52, 18, 45, 16, 41,123,247, 2,143, 29, 61, 11,251, 59,100, 41,236,159,222, 53,255, 99, 37,217, 82, 37, 89,121,235,140,
- 36, 51,167, 2,175, 82,166,243, 40, 37,243, 9,236, 13,162,117,246,236,217,158,103,206,158,237, 5,194,117,252,228,169,190, 11,
- 23, 45,153, 86,188,120,241, 23,249, 91,175,139, 69,180,186,205,191,101, 16,209, 66, 25, 80,102,118, 79,210, 99,118,143,142, 97,
- 66,137,196, 46, 67, 89,228, 87,181, 14,105,211,166,237, 58, 99,198, 12,122,230, 31, 72,215, 30,125,160,253, 23,252,105,249,129,
-199, 52,110, 29, 91,162,230, 94,166, 6, 99,206, 80,177,238,123,201,182, 80, 7, 74,146,220,188,171,174,250, 47, 91,182,215,186,
- 92,229,218,116,229, 81,168, 68,180, 48,104,163,255,244, 61,212,123,218, 1,201,130,117,232,210,123,186,255, 60,136, 22,110, 60,
- 67,221,135, 47,162,202, 77,122, 81,171, 46, 35, 46,123,122,231, 9,173, 88,163,129,250,128, 2,153, 80,139,108, 2, 1,129,128,
- 64, 64, 32,240, 51, 17, 80,242,144,191,136,112,201,131, 43,115,238,178,111,231,109,242,163,253,231,159,210,180,173,247,169,114,
-171,209, 49, 68,171, 44, 19,173,170,236, 58,148, 99,209,194,221, 38, 78,252, 22,163, 5,114, 5, 75, 22,246,248,141,227, 46,222,
- 69,253, 95, 7,126,161,197,251,158, 80,183, 57, 87,168,100,159,163, 84,125,232, 73, 3,136, 86,206, 43,247,159,127,248,226,187,
-226,246,227,194,189,206,157, 45, 62,224,210,209, 6, 19,111, 31,106, 59,239,209,190, 14, 11,158,111, 27,180, 38, 96,195,176,101,
- 23,118,155,218,122,157,214, 85,115, 38, 4, 18,209, 58,125,250,244,132,163, 71,143, 78, 56,112,224,192,132, 93,187,118, 77,168,
- 84,198, 93,138,209, 42, 86,208,254,216,188,173, 55,153, 32,220,145, 8, 33, 98,213,154,140, 59, 71,245,251,175, 99,119, 90,174,
- 19,154,100,131,100, 29,243,187, 71,213,234, 52,163, 10, 53, 26,211,206, 19,119,201,218, 37,159, 68,182,188, 10, 87,253,248,254,
-253,123, 2,201,178,206, 90,237,101, 74,155, 44, 19,229,181,140,148, 43,134,104,129,108,157, 58,125,186,247,150,237,187, 71,206,
-156,183,100, 62, 19,173,231,234, 68,171,221,204, 27,113, 34, 90,129, 33, 97, 52,109,203,125, 42, 84,119, 8, 85,108, 53, 62, 78,
- 68,203,213,213,117,254,181,107,215,233,249,219, 79,228,119,247, 61,237, 56,251,146, 22,236,126, 72, 35, 86,221,228,152,191,139,
- 84,107,248, 41, 42,212,237, 16,101,170, 61,159,146,153,217,234,115, 35, 38,242,202,150,123,109,165,234, 13,104,217,198, 3,116,
-247,229, 87,170,206, 65,240,237,134,174,166,225,203,175, 68,141,216,120, 63,236,203,215,240, 40, 16,196,189,231,222,210,140, 77,
-119,168,211,176,229,148, 35,119,161,203, 94, 94,217,179, 25,128,175,200, 42, 16, 16, 8, 8, 4, 4, 2, 2, 1, 57, 8,232,142,
-209,210, 37, 1, 68,107,223,249,231, 52,124,225, 49,218,118,250, 5, 53,238, 57,147, 78, 93,122, 64,133,234,125,115, 29, 86, 24,
-112, 66, 54,209,194,232, 66,144, 42, 88,176,224, 46,196, 30,191,113, 28, 68,203,255,253, 23, 14,142,126, 76, 93,102, 95,166,226,
-189,143, 82, 21, 38,113,114, 45, 90,166,182, 89, 3, 63,126, 14, 15,175,232,235,231,231,211,231,194,209,218,227,111, 31,238,188,
-240,241,145, 97,235, 95, 29, 30,179, 37, 96,207,136,205,111, 55, 44, 61, 28,184,137,137,140, 78,107,140,146,104, 29, 62,124, 88,
- 34, 89, 59,118,236,152,176,117,235,214, 9,149,203,102,145, 98,180,124,242,219, 94, 28,184,208, 79, 26, 16, 80,107,248,105, 42,
-209,235, 40,181,155,122,129, 92,243,213,254,200, 51,219, 99,161,231,239, 54,199,172, 69, 63,188,226,186,157,187,243,158,142, 92,
-121, 67,115,217,221,104,239, 89,244,171,119,225,154,159,199,175, 58, 79,141,152,172,205,157, 59,151, 82,218,120,242,132,175,185,
-146,200,105,209,232, 60,189, 35, 34, 34,122, 30, 62,114,172,255,234,245, 91, 38,204, 89,184, 98,254,178, 85, 27,166,174,223,184,
-101,148, 38,162,213,108,210,213, 56, 17, 45,140,172,124,252, 58, 84, 10, 46, 31,178,236, 70, 92,137,214,161, 55,239,131,232,225,
-171,143,116,234,230, 91,218,116,226, 57,205,218,126,159, 6, 45,189, 78,173,166,248, 81,229,193, 39, 40, 79,167, 3,148,165,197,
- 86, 38, 90,118,135,100, 98,224,105,157,206,246,202,146,237, 55,137,219, 94, 26, 93, 8, 2,172,140,209, 90,181,239,126,212,220,
-157, 79,104,252,250,187,212,188,203, 68,106,208, 97,100, 36,203, 93,205, 9, 35, 22,197, 38, 16, 16, 8, 8, 4, 4, 2, 2,129,
-223,143, 0,136,214,233,155,239,104,216,146,243,212,115,250, 17, 26,181,228, 36,181,246, 93, 69,205, 71, 31,162,178,253, 14, 83,
-153,126, 71,201,138,103,133, 55,164,164,112, 35, 34,102, 11,123,229,117, 32, 90, 32, 35, 11,118, 63,162,206,179, 46, 83,177,158,
- 71,168, 18,119,190,178,137,150, 93,142, 75, 87, 31,188,253,208,105,238,109,191,226, 3,175,238,109, 62,253,225,126,223,181,175,
- 14,205,217,255,254,196,162,195,193,135,231, 31, 10,217, 50,122,229,197, 53, 28,136, 46,203,162,181,111,223, 62,137,100,109,222,
-188,121,194,218,181,107, 39,212,171, 85,106,120,201,130,246,123, 50,164, 79, 49,188,213,184,163, 84,123,196, 25,118,155,158,150,
- 72, 86,161,122, 67, 35,120,185,159, 11, 92, 23,141,211, 59,100,240, 44, 26,242, 36,224,147, 68,176,198,112,144,118,159, 5,215,
-168, 94,167,137, 52, 99,219,125,170, 51,226, 52,213,242, 61, 70, 46,185, 43, 7,153,164,115,115, 54, 4, 71,190, 93,223, 19,103,
- 47, 77, 95,187,105,215,252, 13,155,119,140, 59,118,252, 68, 95, 88,182,184,236, 3, 84,137, 22,176,172, 50,236, 2, 85, 30,122,
- 1, 68,235,153, 33,247,128,235, 16, 46,221,169,209, 22,173,210,205,199,146, 89, 28, 92,135, 89,178,100,185, 4,151,243,237,167,
-193,116,248, 74, 0,173, 62,252,148, 38,111,186,203, 88, 92,165,166,227,207,177, 46, 29,163,108,109,247,145, 87,235,189,148,204,
-194,241,146,220, 50,154,153,155,207, 26, 60,110, 97, 68, 80,104, 4,189,124,251,133, 74,213,104, 71,205,250,204,161, 77, 39, 3,
-152,212,125,161,241, 27,165, 81,135, 65,253,167,239,163,126,156, 88,174, 47,167, 2,114,229,139,124, 2, 1,129,128, 64, 64, 32,
- 32, 16,144,129,128,234,204,240,223, 7,195,235, 18, 0,162,133,249,179,102,239,120, 72,131, 22, 95,162,150, 99, 14, 83,189,161,
- 7,169,234,192,131, 84,170,247, 97, 42,222,235, 8, 97,249, 29, 45, 50,100, 79,188,230,226,237,227,255,226,221,103,154,183,235,
- 17,117,156,121,137,124,122, 28,145, 70, 53,106, 32, 90, 26,101,166,178,245, 30, 55,124,250,250,199, 7,174,188,127, 88,114,200,
-141,205,109,230, 60,222, 62, 98,115,192,158, 69,135, 63, 28, 94,113,252,227,158,237, 23,190,108, 47, 83,183,215,230,148,233,179,
-140,210, 80,214, 24,153,176,104,125,250,244,233,187, 9, 75,125, 7,118,153,135, 96,120,123, 91,147,161, 3,166,110,167,254,243,
-206, 82,221,126,107, 41, 83,254, 58, 31, 57, 62,236,124,242, 52,110,234,211, 16,196,200,204,144,197, 39,232, 34,187,203,166,108,
-190, 71,189,153,100,181,154,114, 65,178,134,193, 61, 90,105,208, 9,202, 93,169, 83, 40, 7,191, 55,147,209,144,234,241, 69, 13,
-221, 61,189, 7,237,222,189,167, 87, 64, 64, 64, 79,158,239,171, 39,143,144,140, 33, 90, 5,218,172,167, 82, 3,206, 81,141,145,
- 23,201,171,234,112, 74,154,210, 34,148,239,209, 68,237, 62, 58,219, 8, 68,235, 43,207,167,134, 24, 45, 88,180,122,206,187,194,
-113,100,122, 99,180,190,147,153, 39, 79,158, 59,112, 13, 95,121,248,129,246,250,249,115, 44,222, 99,105,158,171,174,115, 46, 83,
-189, 81, 28,159,197,122, 4,146,133,148,220, 42,243, 29, 13, 88, 96,102,123, 77, 91,133,138,213,234,145,255,135,112,186,120,239,
- 3, 21,244, 41,133,185,194,246, 55,104,215, 45, 50,244, 75, 36,193,125,184,231,220, 27, 46,251,183, 17,136,229, 27,244,228,249,
- 80, 21, 46,209,130,100,235,167,140,182, 81,102, 17, 50, 13, 0, 75, 70, 86,129,167, 12,144, 12,200, 34,240, 52, 0, 44, 25, 89,
- 5,158, 50, 64,250, 71,178,168,175,117, 40,191,218, 88,231, 16, 46,189,128, 15, 95,232, 9, 47,195,115,251, 89, 48,199,216, 4,
-242,144,249,215,146,251,103,194,250, 59, 70, 33, 90,206, 89,125,252,159,243, 4,153,243,153,104,117, 96,183,156, 15, 91, 97,202,
-246, 63, 70,169,190, 31,117,168, 81,177,211,166,205,156,202, 60, 67,142, 39,187, 79, 61,184,181,245,124,224,133,161,107,253,183,
-141,220,242,118,211,146, 99, 31,183,239,190,242,101,207,196,213,103, 22,178, 53,235, 62,242,233, 34, 90,230,230,230, 93, 44, 45,
- 45,135, 32,241,255, 49,169, 80, 30,219,251,210, 18, 60,249,237, 78,167,176,206,252,209, 52,125,214, 96,196,100,177,187,176, 61,
-203,211,100,201,138, 41,167, 99,246,178,167,102,173, 57, 38,145,139,246,211, 47, 81,253,209,103, 37,183,104,109,182,102,229,175,
- 61,228,171,165,115,254, 69, 50, 91, 68, 83, 32, 55,172,130,221, 10, 20, 40,216,115,247,238,221, 61, 31, 63,126,220,243,200,145,
- 35, 3, 74,150, 44,249,188,238,152,203,148,167,217, 34, 74,153, 54, 35,166, 53,192, 32, 0, 77, 11, 46,235, 37, 90,136,171,154,
-181,253, 33, 21,169, 55,148,138, 53, 30, 19, 23,162,149,176,104,209,162, 79,159,189,249, 68,231,217,125,138,233, 48,230,237,122,
-136,137, 69, 25,143,139,210,160,135,130, 93, 15,197, 16,173,148,182,222,152, 84, 85,125,185, 32,109,229, 76,192,145,110,215,203,
- 85,170, 69,117, 26,181,162,145, 83, 22,192, 53,108, 98,146, 34,197,156, 50,229,106, 6, 30,191,244, 66, 26,134,122,254, 86, 48,
-237, 59,255,129,188, 11,150,199, 76,246, 74,203,161,120, 73,202, 84, 60,153,217, 4,158, 50,129,146,153, 77,224, 41, 19, 40,153,
-217, 4,158, 50,129,146,153,237,103,224, 41,243,214,127,100, 54,221, 51,195,235, 42,178,131,103,145,115, 88, 80,218, 37, 71,233,
-183, 78,217, 75,191,117,200, 90,234,173,189, 87,201,183,170, 11, 74,243, 40, 52,245,197,164, 13,254,186,119,242, 44,180,181,239,
-200, 25, 17,235, 15, 92,167,217, 28,187,211,200,119, 23,185,148,234, 25,158, 42, 67,222, 77,106,229,211,218,184, 41,108,220,242,
-164,182,203,246,168,211,160,217,167, 54, 28,190,115,232,248,205,224, 93,171,246,221, 90, 95,187,213,128, 77, 60,153,232,125,156,
-215, 82, 87,189, 10,131,197,164, 65,180,176,184,180,204, 38,142,145,153, 34,173, 71,122,123,207, 18, 95,250, 76,217, 78,147, 54,
-220,150,220,101,181,135,236, 37,207,210,237, 62,155,101,200,181, 82, 11, 81,211,116,155,198, 58,238,157,149,207,245, 98,130,213,
-147, 93,157, 3, 74,148, 40,249, 60,141,115,129, 40, 62,182,150,147,114,189, 64, 77,151,235,172,123, 6,143, 2,103, 86,110, 59,
- 17,254, 54,232, 43,173,227,145,150,101,219,205, 13, 51,115,204,139, 89,240,117,109,234, 50,109, 27, 53,105,246,242, 62, 79, 19,
-114,226,250, 27,218,112,252, 25,205,216,122,143, 6, 46,185, 70, 45, 39,157,103,171,222,113,202,213, 97,127, 12,209,178,200, 92,
-230, 37, 11, 87, 31, 30,171,171,156,137, 56,127, 43, 78, 85, 84, 11,149, 40,113,226,190,182,118, 14, 55,219,245,153, 26, 62,107,
-205,105, 42, 94,174, 14,185,231, 40,178, 74, 37,143,222,118,151,217,214,170,217,132,204, 56,128,166,227, 18,129,167,192,211, 88,
- 8, 8, 93, 50, 22,146,223,228,252, 12, 60,141, 91,194,127, 68,154,236,134,176,180,116, 77,109,147, 41,239, 52, 91,247, 66, 23,
- 45, 50,230, 14, 48,207, 88,208,143, 45, 70, 19, 20,182,185, 82,168, 97,165, 83, 38, 44, 86, 28, 84, 62, 38,165,109,214, 51, 8,
-124, 71, 76, 22,220,133, 90, 44, 89, 74,209,122,203,233,157,217,172, 22, 92,135,222,238,102,234,107, 5,106,107,202, 88, 50, 77,
-211,185, 88,155, 59,229, 93,106,233, 92,192,223,204, 49,223, 59, 94,143,145, 45, 99, 30,213,248, 98,141,113, 93, 90,132, 98,201,
- 25,125, 27,150,152,233, 21,157,180, 17, 75,217,196,192,202,202,211,148,151,228, 57, 99,227, 86,208,159,231, 33,243,183,204,152,
-239, 12,142,233, 41,132, 58,158,249,125,135,141, 12,186,249, 36,136, 14, 93,126, 77, 43, 15, 61,161,137, 28, 59,213,107,254, 21,
-106, 60,238, 44, 79,229,113,148,178,182,249,230, 54, 68, 74,151,239,191, 32,150,159,223,144,118,215, 81, 30, 39, 62,135,245, 36,
- 65, 56,213, 39, 88,213,219,238,250,192,214,112, 94,200,140, 3,104, 58, 46, 17,120, 10, 60,141,133,128,208, 37, 99, 33,249, 77,
-206,207,192,211,184, 37,252,181,210,148,174, 67,229, 93,213,127,255,180,210,252,140,134, 16, 50,141,219, 92,191, 2, 79,215, 76,
-110,238,167, 51,123,100,245,115,243,204,126,197, 53, 75,174, 91, 78, 30,185,239,219,103,206,243, 36,157,115,174, 39,102,246,222,
-247,147,219,100,185,149,220,202,237, 74,242, 52, 46,126, 38, 22, 25, 48, 96, 65,221, 10,247, 43,202,105, 12,100, 69, 57,141,129,
-226,255,101, 8, 60, 5,158,198, 66, 64,232,146,177,144, 20, 68, 75, 19,146,234, 49, 90,130,104, 25,201, 90,162, 75,109,197, 67,
-253,231, 63,212,162,141, 68, 27, 25, 11, 1,161, 75,198, 66,242,231,117,226,162,141,254,252, 54, 50,110, 9,127,173, 52,157, 49,
- 90, 80, 62, 77,201,144, 34,106,147,161,235,184, 62,249, 66,166,230,118, 81,197, 5,174,196,234,156,212, 71, 18,106,194,150, 23,
-118,214,216,206,127, 90, 27, 33,224,223,208,182, 23,186,164, 29, 1, 67,177,148,211, 25, 9,153,134,233,168,208, 79,161,159,154,
- 16,248,151,159, 35, 37, 30,198,224, 31,250,158,175,191,254,188,156,151,182,161, 32, 8,153,134, 34,166, 59,191,192, 83,224,105,
- 44, 4,132, 46, 25, 11, 73, 97,213, 17,186,244,111,234,146,113,107,253,107,165,197,125,212,225, 15,150, 83, 60, 44, 63, 8,160,
-218,229, 2, 79,129,167,177, 16, 16,186,100, 44, 36, 5, 41,138,151,186,132, 1, 82,122, 6, 73,197,210,144,148, 86,158, 54, 72,
-226,157, 28,131,192,207,104,119,227, 62,149,191, 71,154,209, 98,179,146, 36, 76,156,172, 87,202,212,105,111,152,154,167,125,174,
-163, 46, 63,163, 33,254, 52,153, 9,220, 51,154,118, 42, 83,212,121,179,135, 75,138,106, 42, 88,232, 45,103, 74,107,247,197,233,
- 51,229,127, 98,154,206,189,147,134,209,149,218, 76,205, 26,225,198,168,198, 84, 14,121, 78,164,182,207, 42,103,100,162,170, 12,
-189,229,228,204, 38, 94, 94, 94, 5,145,240,191, 12,221,213, 43, 51,101, 58,247, 6, 25,220, 10, 28, 77,231,154,147, 23,250,206,
- 92,219, 24, 50, 85,101,240, 58,146,105, 83, 57,228,222,192, 19,193,190, 79,101,155, 61, 40, 85,134,220, 71, 82, 91,121,234, 13,
-176,119,168, 58, 42,203,208, 85, 87, 87, 97,175,169, 76,150,229,167,165, 30,178,250,206,200,180, 85,198,106,154,143, 13,151,232,
-173,187,140,186,170,103,249,171,100, 58, 20,110, 96, 97, 91,172, 71, 90,153, 56,196,212,157,215, 12,189,150, 49,171,207,107,187,
-204,249,175,202,188, 86,145,193,163,224, 5, 39,175,194,254, 25,220, 11,158, 55,228,217,148, 43,255,111,148,153,220,218,165, 96,
-114, 75,199, 29, 38,150,142, 59, 77,210,184,148,144,129,133, 78,253,180,181,181, 77,193, 43, 67,148, 47, 80,160, 64,155, 82,165,
- 74,117,205,153, 51,103,107, 39, 39,167,178, 44, 55,241,239,234, 59,248,253,211,207, 52,189,251, 23, 36,252,175,175,142,166,233,
- 60, 70,240,123, 58,242, 91,242, 24,241,167,180,187,137,141,187, 19,151,127, 82,234,244, 94,103, 83,164,203, 28,107,122, 27, 57,
-132,144,231,139, 44,107,109,109, 93, 93,153,240, 91, 31, 22, 63,185,238, 6,220,254,143,203,106, 84,139, 86,162, 36, 38, 41,207,
- 52,107,223,251,147,127,192,123,234, 59,122, 33,153,152, 90, 92,215, 82,229,223,222, 65, 88,185,228, 59,111,147,169,160,191,106,
-194, 49, 57, 74, 40,167, 25, 61, 50,166,104,185, 98,118,187, 71, 81,239, 55, 81,201, 66, 25,182, 24,162,132,252,128, 92, 62,118,
-229, 37, 13,159,178,130,156,178,250, 4,242,116, 15,131,204, 28,178, 90, 24,250,242, 49,179,118,117, 73,227, 82,224,121,181, 30,
- 43, 34,237,189,203, 5,240, 87, 87,118, 57,101,143,206,163,171,141,172, 51,101,202, 84,201,221,221,189, 25,175,197,216, 26, 9,
-255,227, 24, 95,171,105,242, 83,229,109,117,182,123, 74,107,143,198, 11,150,173,227, 37,115, 66,121, 34,209,215, 84,187,213, 96,
-146, 65,182,100,235,146,133,133,179,153,133, 83,238, 23,190,179,118, 69,156,189,245,150, 14, 92,244,167, 30,147,119, 69,165,115,
-205,255, 78,141,108,125, 39,211,190, 84,239, 85,115,183, 95, 9,196, 94, 19,134,222,117, 38,214,156,185,245,230, 69,236,229,232,
-188, 69,198,194,123,172, 61, 74,221,182,241, 44,115,219,214,171,204,109,123,239,178,183, 29,179,149,187,157, 49,123,185,219,246,
- 89,124,246,200,108, 39,217,117,151, 41, 15,217, 98,201,228, 21, 24, 94,165,118, 46, 20,110,238, 82, 56, 60,141,107,145,112,171,
- 76, 69,194,173, 51,251,132,219,184,251,132,167,207, 92, 68,238, 18, 91,250,202,105,238,237,102, 81,164,125,139, 42,247,178, 20,
-109,246,202,161,104,215,249,142, 62,221,115,232, 41,115,140,204, 76, 57, 74,188,184,245,236, 35, 57,121, 21,249,154, 46,107,181,
- 35,114,146,107,246,146, 95,191, 93, 83, 88,117,141, 83, 61,250,233, 94,134,167,134,121,205, 83,195,188,199, 51,153, 42,173,187,
- 27,151, 81,223, 52, 44,223,201, 76,145,206,227, 63,238,152,231,200, 77,200,255, 35,239,165,196, 38,102,165,146,167,182,218,225,
-149,183,212, 43,115, 43,135,109,137, 77,204,139,105,192, 86, 95, 27, 41,146, 91, 56,110, 62,113,237, 77,212,153,219, 31,200,194,
-222, 93,142,142,234,148,201,196,170,225,201,147, 39,135,240,188,193, 82, 10, 15, 15, 31,178,114,229,202, 33,252, 46,209, 53, 85,
-142,190,114,218, 51, 57, 40,148, 33, 67,134,186, 72,248,159,235,106, 47, 71,151, 76,109, 92,173,184, 77,194, 47,222,125, 77, 72,
-166, 54,238,145,142, 69, 58,142,119, 46,217,111,168,166,148,161,112,135,137, 76,174,162,174, 61,122, 79, 72,124,109,132,138,101,
- 75, 95, 57, 13,120, 36, 99,178,234,149,153, 60,157, 71,254,148,233, 60,214,149,170,211, 57,114,193,230,243,116,246,102, 0,153,
-219,103, 61,105,104,223, 1,130,245,232,209,163,222, 79,158, 60,233,247,224,193,131,174,248,109, 64,129,191, 43,167,157,123,193,
-147,246,238,133,159, 89,187,230, 25,204,114,212, 39,157,134,232, 68,230, 14,185, 6,155,103,204,247, 44,181, 99, 30, 93,229, 53,
-160, 24,127, 97, 86,182,100,245,104,218,174,215,167, 43, 15, 62, 80,221,254, 27, 41,165,153, 85,128,161,141,251,131,176,232, 85,
- 66, 85,249, 32, 88,151, 31, 6,211,189, 23,161, 82,186,120, 63,136,112, 76,223, 11,141, 21,225, 48,207,216,238,159, 38, 58,153,
- 59,228, 12, 74,235, 82,192,223, 10,137,231,147,194,156, 82,158, 69, 27,172, 4,185, 2,201, 90, 58,179,237, 83, 87,135,228, 93,
- 85,228,234, 45, 39,136,214,113, 94,222,232,192,165, 55,116,134, 23, 90,158,186,104, 43,121,230, 45,247, 41,165,141,251, 68, 13,
- 75,250,124,215, 57,226, 64,138,244,153,115, 91,187, 21,126,211,110,226, 97,106, 54,249, 42,205,219,126,135, 26,182, 27,252,161,
-104,197, 70,239, 29, 61,125, 94, 56,120, 21,221,107,154, 62,147,135, 1,109,148, 40, 85,170, 84,153,249, 43,180, 94,133, 10, 21,
-154, 31, 58,116,168, 53,191, 28, 99, 37, 28,195, 57,228, 65, 94, 60, 60,250,240, 84, 61,239,154,173,232,217, 15, 31,191, 80,174,
-178,255, 81,246,210, 45,105,214,230, 27,148,202,206,243,160,156,151,164, 28,221, 49,181,207, 49,173,219,232, 53,225, 88,234,167,
- 34, 47,227, 84,155,151, 59, 90,184,231, 17,245,157,186, 35,202,202, 37,239, 17, 77,109, 4, 11, 22,200, 85,133,250, 93,200,255,
-221, 71,194, 30,191, 85, 45, 91,174,229, 59,165,206, 91,179,207,203, 45,199,238, 68, 98,143,223,250, 58, 50,144,172, 3, 23,249,
-133,126, 63,144,174,242,242, 67, 55,120, 46,177, 59,207, 67,232, 50, 63, 63,110,185,203,223,150, 83, 31,206,163, 79,151, 18,225,
-107,214, 52, 93,230,205, 72,209, 95,182,234,109,162,126,171, 88, 50,205,156,139,132, 31,187,246,134,238, 60, 11, 33, 76, 44,251,
-200,255, 35, 61,229,149, 32,142, 94,125, 67,174,121, 42, 97,101, 1, 57,155,182,114, 90, 87, 40,156,174,210,225, 25,197,102,124,
- 57, 86,243,196,146, 49,181,222, 44,223,176,135, 38, 45, 63, 30,158,167,230,208,143, 14, 62,221, 14,100, 40,210, 69,219,151,116,
-140, 76, 88,167, 28,189,124, 62, 58,101, 47, 79, 87, 31,125, 32,204,203,134, 37,157, 46,220, 11,148, 22,108, 63,115,251, 29,157,
-149,210,123, 58,207,171, 87,156,227,125,182, 34,213, 9,215, 24, 98,209, 2,201, 58,118,237, 61,237,187,248,150,202,240,218,158,
- 5,171,247,160,116,153, 11, 63,100, 92,171, 26,240, 28, 41, 64,176,222,135,132,209,244, 85, 71, 25,199,183, 60,135,220, 27,218,
-127, 49,128,158,243, 10, 9, 99, 23, 31,164,237,103, 94,209,150, 83, 47,121,133,141, 23,116,147,215, 0, 69,126, 67,158, 35,213,
-188,137, 77, 82, 15, 46, 85,171, 35, 77, 93,119,145,214, 28,121, 78,235, 14, 63,162, 86, 61, 70, 80,226,228,102, 61, 13,149,153,
-220,220,126,187,146,104,153,219,186, 29,144,209,240, 58,245,179,114,229,202,221, 64,174,148, 68,235,243,231,207, 67, 78,159, 62,
- 61,196,212,212,116,160, 33,120, 70,231, 77,201,239,157,186,252,209,215,249,249,243,231, 61, 34, 35, 35,165,132,255,231,207,159,
-223, 25,231, 56, 95, 74, 45,114,165,114,226,221,202,239,222, 40, 16,112,164,148, 54, 30, 52,125,237,185,253,235,143,191,216,174,
- 41,205,220,232,183, 15,121, 98,242,243,181,152,132, 58,250, 30,223,213,157,173, 66,165,211,165, 75, 87, 85, 83,178,176,117, 27,
- 99,238,152,247, 45,247, 45,111, 44, 93, 56, 57,230,186,161,239, 29,162,122,158,203,157,213,220,193,251, 68,203,222, 83,104,239,
-217,199, 76,252, 62,208,164,101, 71, 40, 71,137, 70, 97,166,214,134, 19, 87, 16,171,167, 79,159,246, 63,127,254,124,125, 38, 90,
-221,127,148,104, 57,100, 41,228,143,245,108,167, 47,218,252,201,201,187,248, 43,219,204, 69,158,218,184, 21,126,154,142,147,149,
-107,161,167,142,222, 37, 95,181, 26, 48,239, 19, 38,171,150,187,142,177, 12,253,251, 83,178, 24,205,101,168,224, 47,166,115,247,
- 31, 61,165,166,195,119,127, 71,178, 76,205, 44,176,176,178,234,166,175,131,136,201,155,202,218,189, 32,155, 63,151,154,217,103,
-219,104,238,144,125, 71,106, 59,239, 89, 41,210,102, 86,159, 29, 28,249,101,203, 68,102,144, 42,144,171,209,235, 30,198, 36, 57,
- 68,203,194, 41,223,139,157,103, 95,210, 5, 94,163, 16,179,153,179,165,136, 95,148, 1,116,253,113, 16, 47, 35,243,142,234,180,
-238, 31, 84,190,180,247, 1,247,140, 41,151,148, 44,236,180,199,209, 54,249, 56,190,157,242,225,147, 85, 78, 16,173,253,220, 9,
-111, 56,254,130,182,158,126, 69,123,206,191,162, 93, 39,238,209,236, 21,123, 40, 95,201, 90,225,252,197,178, 48,185,173,167,131,
- 10,160,177,234,158, 50,189,119, 57, 91,207, 18,239, 59, 78, 59, 77,165, 7,156,231,117, 13,253,168,215,162,123,180,237,236, 91,
-126,113,127,162,167,111,190,210,225,243, 15, 40, 87,177, 26,111, 97,245,210,245,242, 81,158,203,152, 49, 99,157,206,157, 59, 55,
-231, 47, 28,137, 92, 45, 90,177,118, 84,145,178,181,175, 59,103, 45, 18,156,209,171,112,112,129,146, 53,175,227, 24,206, 33, 79,
-135, 14, 29,154,166, 79,159, 94,253,203, 84,103, 27,101,244,246, 57,251,138,173, 89,217, 75,181,160,172, 37, 90,144,239,226, 11,
-134, 18,173, 4,246,246,246,201,185,204,170, 86, 6,252, 47, 37,158, 12,246,238,206,211,143,165,165,125,176,102,102,221,145,103,
-104,192,146,235,180,145,103,164, 79,227,148, 19,147,161, 42,183,152,114,194, 93, 8, 75, 22, 72, 22, 54,236,241, 27,199,225, 38,
-132, 5,171, 96,173, 30, 47, 7,140, 93, 64, 33,159,190, 82,255, 49, 11,168, 16,255,198,113,184, 19,181,181, 81,122,182,100, 93,
- 98,146,213,145,151,149,234,179,240, 26, 13, 95,117,139, 23,211,190, 71,243,121,241,116,247,188, 21,126,136,104, 65, 55,248,107,
-124,168,153,157,215,243,182,221,135,209,241,243,183,163,142, 95,188, 27,213,169,255, 4,178,112,200,246, 2,231,212,244, 71,235,
-179,105,206, 86,172, 59,188,188, 22,150,134,106, 60,246,156,180, 12, 86,255,197,215,121,169,173, 0,202,156, 47,206, 68,203,178,
-109, 53,215,198,151,151,149, 94,252,245,104,141, 83,103, 22,148,152,215,176,140, 67, 45,219, 60,205, 78, 96,249,174, 89,219, 31,
-208,246,211, 47,105,214,134,243, 81,197,154,140, 39,219,188, 45,110, 90,103,175, 83, 77,215, 59,196,190, 64,237,228,214, 94,213,
-238, 46,221,117, 77,194,177,197, 68, 63,105, 17,250, 1, 92,214,209,188,150,229,244,173,247,105,241,190, 39,210, 51, 53,117,213,
-113,178,207, 81,235,152,162, 88, 49,117, 23,149,110,139, 22, 19,173,189, 23,222, 72,239,139, 54,227,246,211,208, 21, 55,169,255,
-130, 75, 84,162,254, 0,210,178, 86,170,198,231, 29,196, 9, 36,139,159,243,243, 74,171, 22,254, 7,201, 82, 63, 54,100,206,190,
- 56, 19, 45, 38, 89, 3,203, 54,232, 75, 35,151,156,163,225,179,119, 81,157,255,250,208,162, 45,231,233,232,141, 16,234, 61, 98,
- 46,177,165,171,164, 38,253, 76,149, 62, 75,145,194,101,107, 63,169,215,162, 43,213,105,214,149,106, 53,237, 66, 53,155,116,161,
- 50,213,154, 82,193,146,213, 40,127,137,170, 84,188,114, 99,170, 80,175, 35,149,175,219,129,202,214,110, 79, 57,139,215, 14,129,
- 53,197,144,247, 60,187, 11, 59,190,120,241, 98,200,246,237,219,135,140, 31, 63,126, 72,147, 38, 77,134,240,135,218, 16,126,134,
-187,232,232, 33, 53,181,145, 89,246,236,217,219,191,123,247,174, 7, 63,162, 49,233,203,151, 47, 61,130,131,131,123,240, 26,181,
- 61,152, 52,244,240,246,246,198,178,104,102, 26,100,199,200, 76,109,227, 49, 43,157,107,110, 66,178,202, 92,242,190, 91,185,129,
-147,116, 37, 43,247, 82,119, 45, 29,178,147,101,134,108,220, 78,153, 39,107,123,222,113, 28,100,229,225,195,135,189, 96, 37, 82,
- 38,182, 26,245,235, 53,104,244,242,108, 69,235,125,218,125,238, 57,157,226, 15,235, 45,167, 94, 80, 90,231,124,129,186,202,169,
-122,142,151,123,171, 88,166,102,219,240, 51,215, 95,208, 13,238,135, 38,173,185, 64,110, 5,106,127, 98,111,192,176,148,214, 94,
-233,116, 96,169,181, 63, 82, 35, 90,221,140, 65,180,240,254,124,201,235, 22,135, 71, 68,209,199,207,225,132,165,215,238,189, 8,
-145,150,239, 59,115,235, 29, 45,224,143,222,173,252,220, 27, 74,180, 88,108, 94, 78,149,176, 71,133, 84,127,171,252, 47,157, 87,
-251,157,143,127,231,143,190,182,116,244, 30,249,144,148,191,181, 29, 71, 30, 92,159, 82, 69,102,121,254,223, 82, 3,222,218, 93,
-135,172,252,164,122,129,250,111,117, 97, 22,105,109, 95,248,243,226,192, 77,134,237, 38, 83,115,235, 24,107, 86,186,244,246,111,
-151,175,222, 64,102, 22,105, 30,235,105,240, 88,167,209, 17,164,178,243,222, 80,185,110,155,144, 93, 71,175,132, 60,122,241,254,
-235,253,167,111,190,108,218,119, 38,164, 74,221,214,159,204, 50,120, 99, 17,104, 77, 38, 72, 89,183,145,233, 58,252, 78, 22,207,
-128,254,226,212,205,119,188, 0,180, 31,181,156,236, 71, 25,188,203, 74, 86, 9,188,208,235,117, 24,250, 97,249,236, 14,207, 97,
-201, 42, 86,192,254, 0,127,185,180, 98, 1, 88,115,208,160, 13, 68,107, 27,127,213,174, 56,248,148, 86, 31,126, 66,141,186, 77,
-167,149, 59,206,127,251, 90,127, 26, 66, 75, 55, 29,199, 11,121,191, 38,161,201,109,220,242,218,120,148, 12,234, 52,227, 2,249,
-244, 57, 75, 37,250,159,167, 86,211,111,210,152, 13, 79,104,253,201,119,180,211,239,131,148,118,156,127, 79, 75,118, 92, 35,254,
-170,224, 78,221, 51,169,190, 2,242,131,214,152,191,110, 90,223,191,127,191, 89,131,255, 58,175, 46, 94,161,222,231,107,183, 31,
- 82, 64,224, 39,122,244, 50,152,214,239,245,163,172,133, 42,127,174,214,176,237,170,203,151, 47,215,217,177, 99, 71,235, 52,105,
-210,232, 90, 26,232,187, 91,194,117, 56,114,202, 18, 58,124,217,159,102,109,185, 73,185,202,119,144,227, 58,140, 37,167, 95,191,
-126,105,216,245,224,150, 50,101, 74,188, 96, 98, 72, 22,255,159,200,204, 33,215,195,133, 59,110, 80, 27, 94,188, 27, 11, 86,119,
-157,115,133,166,109,185, 79,219, 78, 61, 35,171,140,185,222,107,194, 64,151, 69, 11, 49, 89,112, 23,110, 57,118, 59, 18, 36, 11,
- 27,246, 91,249, 55,142,227,188, 54, 92,237,178,150,189,125,237, 81,144, 68, 90,114,148,108,234,159, 41, 87,249,219,110,121, 42,
-220, 6,201,202,232, 93, 92,142, 91, 70,163,104,214,139,190, 69,202,215,139, 92,181,121, 63, 61,125, 29, 28,133,117, 66, 47,177,
-149,236,226,253, 15,244,224,213, 71,186,253, 52, 40,106,223,233,187, 84,181, 81,247, 72, 83,235, 44,190,250,218,221, 50,147, 79,
- 56, 94,134, 13,199,156,149,214,159,236,203,164, 16,196,101, 7,235,167,123,254, 74,100,225,152,235,131,165, 83,174, 15,105,156,
- 52,126,129,107, 20,159,198, 49,235, 69,231,172,133,190,212,169,152,235, 80,238,236, 54,136, 29, 76,131,140, 14, 69,187,109, 95,
-115,228,153,180, 72,249, 84, 94,104,125,226,170,115,180,108,205,122, 58,177,125, 2, 85,168, 94, 63, 56,186, 61,181, 22, 57,173,
-119,141,156,217,203,117,140, 56,112,225, 21,245, 95,116, 93, 42,235, 8, 38,176, 83, 55,223,103,203,229, 99, 90,203, 75, 69, 45,
-219,125,131,220,138, 52,121,105,147,163,182,149,190,186,171,159,103,253, 44,205, 86,173,183,236, 58, 12,225,248,190,155,238, 5,
-171,127,234, 56,102, 43,141, 98, 60,138,214,238, 25,197, 31, 64,165,228,200, 4,185,130, 37, 75,213, 82,133,255, 97,201, 82, 63,
-182,242,208, 51, 77, 68, 75,235,109,146, 36, 79,221, 49,157,189,235,171, 98,229,235, 68,185,231,171, 66,181, 59,207,164,255,250,
-205,161,228,230,214,203,146, 37, 51,115,177, 76,231,180,102,217,142,139,180,143, 9, 99, 90, 91,103,141, 86, 41, 46,195,220,251,
-207, 2,121, 13,219,207,108,197, 12,149, 44, 54, 87, 31, 5, 75, 22,194,125,103, 30,208, 78,254,232, 59,196,107,218,238,187, 16,
- 64, 59,207,249, 75,214,183, 53,135,159,178,139,202,123,153,182,130,217,103, 41,182,199, 57, 39,187,198, 57, 57,177,123,220, 49,
- 91,217,219,206,158, 69,238,194,154, 5,178,181,127,255,254, 33,211,167, 79, 31, 50,117,234,212, 33,214, 25,115,223,179, 98,139,
-175,149,123,201,219,105, 51,151,188, 13, 55,187, 46, 92,249,131,174,177, 58,201, 2,185,122,253,250,117,143,245,155,183, 15, 47,
- 91,189,137, 95,166, 28,197, 63,184,240,186,185,169,211,185,110,211,215, 70, 25, 10,180,154, 51,101,197,137, 67,206,165,250, 96,
-229, 8,157, 27,242,204, 92,127,254, 64,134,194,109,103,234,203,171, 36, 47,126,126,126, 13,148,169,105,155,238,147,189,124,234,
-124, 60,112,225, 37,141, 89,123, 91, 90,239,118, 15, 91,220,217, 75,162,137,104,125,119, 11,184, 59,179, 21,169,242,225,222,115,
-126,167,159,125, 69,141,134,238,163,244, 57,106, 28, 85,112,252,155,190,242,232, 58,175, 70,180, 12,117, 29,126, 39, 26, 22, 45,
-188, 31,209,167,205,222,241,144, 38,111,188, 75,227,120, 61,100,124,232,182,156,124, 65, 90,223,183, 92,255,227,180,250,200, 83,
-141, 68, 75, 23, 31, 1, 49,226, 27, 66,124, 12, 65, 82,249, 45,157,211,244,187,111,223,190,253, 84,175, 85,230, 83,230, 85,221,
-171,202, 80,254, 31,125,125, 69,236,113,172, 96,193,130,171, 88, 30,194, 9,212, 55,237, 22, 45, 84, 76, 89, 57,213,255,181, 52,
-142,107, 74,179,180,239, 62,127,141,148,190,242, 58,141,219, 65,169, 45,211,189, 78,151,222,238,237,133, 75, 87,105,239,153, 71,
-100,145,198, 90, 91,188,214,119, 34, 83, 89,103, 46,196, 22,134,192, 37, 27, 15, 7,126, 13,143,140,188,251,242,203,135,205,167,
-223, 63, 89,126,228,205,131,125,151, 63, 60,191,250,224,125, 80,131, 54,253,130, 82,217,120,245,210,166, 44,230, 25,243,156, 87,
-186,247,164, 61,187,246, 44, 51,230, 85,143,193, 50, 88, 23, 65,180,246, 94,240,167,182,211, 46, 74, 29,143, 67,182,178,116,156,
- 93, 43,131,151,221,240, 47, 91, 34,203,129,104,119,225,243,162,133,178,110,226,206,190,171,193, 55,224, 11, 64,180,208, 41,128,
-225,119, 25,189,158,230,175, 59, 76,143, 95,135,242,215, 74,176,228,250, 56,126,237, 45,136,214,101, 77,178, 83,217,185,167, 73,
-231,230,227,223,113,250, 57, 26,191,241, 17, 45, 59,244,146, 14, 92,102,235, 27, 47,158,124,248, 90,176, 68,178, 54, 48,225, 26,
-191,233, 25, 13, 90,241,128,202,182,158, 22,238, 85,172,113, 84, 26,199, 60, 27,245, 60,120,141,207,156, 57,211,122,224,208,209,
-163,138,150,171,243,249,227,231, 48,122,232, 31,202,110,148, 0, 90,206, 15,207,242, 3, 79,105,195,209, 39,228,146,179,236,231,
-174,189, 7,142,138, 11,209,194,253,189, 11, 86, 12,189,250, 32,136,218,245, 29,143, 47, 68,213,224, 82, 57, 80, 38, 92,183,110,
-157, 25,127, 37,218,180,106,213, 42, 15,191, 44, 10,240, 69,201, 56, 37,180,176,176,200, 90,160, 84,205,141,117, 58,140, 15, 91,
-118,224, 9,141, 92,125,139,102,110,227, 78,227,172, 63, 13, 24,191, 36,204,222, 61,255, 6, 93, 55, 80,198,104,101, 40,221,119,
-211,208,213,183, 70, 21,108,187,201, 26, 22, 43, 88,174,242,213,234, 19,203,162, 5, 11, 23,142,235, 8,140, 87,176,222,220,190,
-197,166,244, 49,107,239, 80, 38,249,174, 66,189, 24,176, 94,220,250,244,133,191, 22, 3, 62,209,201, 27,239,104,221,177,231,252,
-242,122,198, 86,209,215,116,142,117,103, 47,147,172,198,237, 7, 82,122,183,252,100,154,222, 75,215,128, 21,233, 94,105,221,124,
-194, 31, 50, 65,107, 59,245, 34,245, 94,112,141,113,131,117,232, 1,109, 62,249,130,170, 55,233, 70,199,206,223, 37,212, 35,109,
-198,220, 31,244, 22, 46, 58, 67,198, 92,149,233,236,213,199, 52,102,246, 70,178,206, 92,252, 35,127, 80,141, 74,109,239,105,201,
-174,194,117, 75,246, 61,166,126,115, 79,147,239,180,181,180,123,211,116, 58,183,119, 10,173, 93,183,138,236,243,183,138,245,225,
-167,237, 94, 86, 89,171,247,109, 51,100,133, 84, 62,188,139, 38,109,188,199, 11,149, 63,162, 85,135,159,209,166, 99, 79, 40, 95,
-149, 78, 97,105,179, 86,203, 37,183,172,186,242, 97,160,137,153,109,214,221, 61,167,236,166, 49,171,175, 51,233,204,121, 72,142,
- 92,144, 41,184, 11,213, 73, 21, 8,139,250, 49, 60, 87, 26, 92,135, 26,111,195, 94,133,169,125, 70,206,165, 67, 87, 3, 37,171,
- 21,158,251,182,125,167, 82,178, 84,105,225,134,138,254, 40,181, 76, 93,177,110,171, 40,156, 47, 81,177,254, 71, 77,130, 82,216,
-122,228, 44, 88,166, 78, 80,141, 38,157,169, 90,163,206, 84,165, 97, 39,170,220,160, 35,245, 26, 62,135,142, 48, 65,236, 62,108,
- 30,149, 97, 43, 86,169, 90,237,169,100,205,118, 84,188,122, 91,202, 94,180,214, 75,126, 94,181, 6,200,187,240,135, 4,220,205,
- 8,137,128, 53,116,215,121,127,202,156,167,252,151, 54, 93,250, 29,216,182,107,239,228,189,123,247,250,118,239,217,111,106,254,
-226, 85,142,164,117, 43,254,181,207,194,171,212,121,230, 37,106, 50,238, 28,165, 97,178,165, 13, 87, 14,206, 47, 88,176,114,251,
- 35,181,219,143, 62,211,184,211,216, 99,227,102,174, 94,124,238,226,245,161, 32, 89, 29,186, 13, 90,231, 93,160, 66,232,200, 25,
- 27,163, 86,241,242, 94,124,255, 40,182,192, 63, 77,153,198, 65,231,252,130, 32, 79,155, 79, 5,108, 87, 18,173, 20, 54,238, 27,
-241,190, 85, 77, 56,134, 50,169,231,213,243, 14,141,113,199,193, 37,215,184,117,183, 73, 32, 89,251,163, 73, 86, 29,182,176, 55,
- 25,127,142,182,177, 85,135,195, 80,100, 17, 45,118, 91, 15, 92,183,235,148,228, 26,239, 49,247, 10,101,171,212, 55,202,210,181,
-188, 61, 62, 90,241, 49,206,233, 49,246,108,221,170,165, 80,124,103,193,213, 90, 92, 85,162,117,239,222, 61,137,104,193,251, 97,
-106,235,213,217, 34, 99,254, 53,150,206,249,110,164,201,152,239, 85, 26,153,125,106, 6, 21,162, 53,126,193, 46,178,114,206, 77,
-171, 14, 61,165, 46,179, 47, 83,207, 9,155,249,253,145, 75,250,128, 67, 40,135, 38,139,150, 46, 62,162, 36, 75, 92, 25,137,108,
- 97,175,250,191,210, 82,165,126, 76,219,111,109,249,245,201,137, 62,111, 39,231, 29, 16,147, 71,149,100,225,160, 14,139,150,187,
-181,173,211,187, 83,103, 47,208,139,183,159,105, 28,127,141, 78,216,112,151, 38,173, 60, 77,183,239,222,151, 30,172,166,237,250,
-190, 53, 49, 49,209,229,119,143,185, 47,204,207,233, 92,243,124, 56,113,249,217, 7,255,192,176, 79, 11, 15, 6,220,107, 63,239,
-177,159, 50, 53, 28,113,228,218,160,233, 59,253, 55,238, 61, 31, 98,237,154,239,133,182, 74,129, 92,193, 13,129, 56,152,131,252,
-245,133, 23, 47, 98,169, 12, 2, 65, 67,102, 75,167, 60,254,246, 89,203, 74,150, 44,144, 44, 51, 59,111, 42, 82,161,246,167,255,
-187, 11, 51,238,207,157,205,121,219,132, 9, 19,250,178, 69, 71,206,132,161,223,221, 5, 15,244, 82,118,115,204, 96, 34, 80,241,
-191, 81,244,248,101,144,132,237,109,142,147,193, 87, 37,190, 38,181, 17, 45, 8, 75,149,222,187,136,153, 83,222,219, 89,242, 87,
-126,155,175, 84,221, 55,165,170, 54,125,219,173,223,168,224,117,219,142,126,245,187,199,166,229, 45,207,168,227,156, 59, 84,126,
-208, 89,170, 58,248, 4,141, 92,123,159,220, 11, 84,131, 69, 71,171,133, 16, 22, 45, 16,173,188,197,170, 92,191,122,235,129, 20,
-175,179,141,221,154,115,119, 62,164, 33,203,111, 82,107,182, 18,245,152,119,149, 90, 12,221, 72,174, 57,202, 92,143, 43,209, 98,
-171,192,218,173, 71,111,209,220,245,199,152, 8,100, 57,134, 0,118, 3,218, 44, 1,187, 7,172,119,237,218,101,207,110, 3,183,
- 69,139, 22, 21, 69, 60, 4, 95,111,195,129,183,117,130,130, 66,218,187,100, 47,249,172, 78,187,145, 95,103,172,229,248, 44,118,
-163,116, 30, 56,229, 43,187, 9, 94, 96, 52,162,174,251, 40, 71, 29,230,106, 62,163,223,164, 77,215, 15,251,180, 95, 24,211,182,
-136,201, 42,192,228, 10,150,173,124,181,122,107,139,209,138, 37, 30, 65,239,247, 95,124,148,220,100,153,217,146, 37,181,155, 93,
-246,187,169,236,115,124, 64, 74,157, 33,199, 7,179, 12, 57, 63,112, 12,224, 7, 11, 78,150,142, 57, 53,197,108,104,208, 29,143,
-155, 48,203,195,218,176,145, 99,124, 64, 42, 15, 95,121, 75,107,247, 94,162, 42,141,187,144,157,123, 1,106,209,125, 12,109, 58,
-122,159,210, 56,230,188,167, 15, 91,107,247,162,225, 32,249,189,230, 95,165,225, 43,111, 73, 22,192, 37,251,159,240,243,244,146,
-138,213,232, 72,157, 39, 29,144,220,114,252,226,252,160, 79,150,242,124,182, 98,245,104,239,137,155, 52,110,225,126, 10, 10,249,
- 68,171,183, 30, 34,151,220,149,195, 45, 92,139,223,239, 63,126, 25, 45, 91, 50,141, 78,238,156, 64,115, 22,204,167, 97,243, 14,
-210,250, 35, 79,200,193,167,171, 44,162,165, 80,248, 38, 76,151,173,218,201, 5, 91, 47,211, 82, 46, 39,190,158,241, 33, 0, 18,
- 83,181,229, 72, 98,247,162, 65, 86, 86,125,117, 50, 73,231,230, 92,186, 94, 15, 94,240,254, 33,121, 22,170, 46,171,115, 4,113,
- 58,192, 31, 40,234,164, 10, 49, 89,234,199,150,240,123, 64, 14,209, 74,154,210,162, 95,255,177,139, 36,130, 53,102,246,102,170,
-211,126,156, 20,163,179,237,108, 0, 53,104, 55,152, 18,167, 76,141,137,137, 21,112, 39, 14,155,182,134, 14, 95,253, 64,118, 25,
- 61, 47,233,171,159,242,124, 10,171, 44, 57, 26,180, 31,194,214,150,215, 28, 30, 49,136, 64,198,228, 94,139,124, 32, 90,136,145,
- 27,198, 58, 52,112,201, 13,137,180,183,238, 53, 57,168, 83,159,209, 97,249, 74,215, 13,205,144,165,200,103,143, 2, 53, 66, 11,
-215,238, 23,238, 93,190, 71, 72,153,126,199,168, 88,207, 35,146,215, 64, 23,209,114,204, 90,250,200,166,163,247,222,108, 61,253,
-226,205,242,253, 15,158,143, 93,114,244, 94,203,158,211, 46, 22,168,240, 95, 64,157,230, 61,190,238, 62,251, 76,138, 77,155,202,
-122, 59,157,211,160, 25,219, 35,211,187, 23,220,167,171,236,234,228, 9,239,218,195,151, 3,194, 56,238, 47,252,196,141,183, 95,
- 89,151, 62, 41,223,191,113, 37, 90, 49, 36,203,239,155, 37, 11, 97, 12, 77,199,159,167,214, 83, 47,208,122,254, 56,226, 88, 95,
- 57,186,148,208,197,187,216,243, 23,111, 66,105,225,222,199, 18,166,153,124, 90,115,191,152,231, 99,217,186, 93,105,192,164,181,
- 82,223, 55,123,245, 17,201,205,107,110,239,245,146,227,181,106,200,105, 55, 85,162,117,241,242,229, 30, 22, 25,178,109,243,224,
- 62, 98,224,180,173, 81, 11,182, 94,160,237,167,240, 14,120, 65,136, 77,150, 35, 15, 68, 43, 50,138,164, 15,242, 52,142,217,208,
-127,113, 12,242,107,201,189,111,233,240,237,247,178, 3,143,249,253,114, 79,167, 69, 75,157,151,224,222,234, 86, 41, 77,191,229,
-228,129,168,111,226, 36,203, 88,140,149, 76,211,113, 28, 83,183,104, 69,255,214,246,177,161,234, 62,252, 63,100,178, 92,135, 73,
-147,122, 88,217, 58, 5, 94,186,122,139, 6, 47,189, 65,165,251, 28,147,204,244,120,233, 44, 99, 64, 87,239,185, 74, 13, 91,245,
-120,159,210,212,244, 50, 75,134,101, 65,231,150,194,198, 45, 79, 58,151, 60, 31,246,156,126,240,254,206,243,207, 31, 6,175,121,
-126, 85,149,100,149,104, 49,245, 92, 42, 91,207,119,204,170, 87, 88,185,228, 57,151,154,215,194,211, 38, 16, 68,107,195,241,231,
-212,128, 77,177,141,249,171,168,217,132,243, 70, 33, 90,105, 92,242,191, 56,124,229, 91, 76,150, 31,147,158, 82,213,154,132,170,
-186, 11,203,149, 43,215,183, 75,151, 46,125, 16, 24,206,202, 42,135,104, 37,102, 50, 48,130,205,223, 15,121,104,243, 91,236, 45,
-211, 57,190,158,185,245, 46,141, 95,127,151,138,213, 27,196, 36,235,147,228,219,126,192,228,230,248, 85,127,218,126,242,137, 78,
-162,165, 17, 19, 87,215,100,214, 46,121,123,119,232, 63, 41,120,244,250, 71, 84, 97, 48, 72,214,113, 38, 89, 15,168,100,179,241,
- 81, 28,104,223, 84, 87,227, 40,137,150, 99,150, 66,193,254,239, 66, 37,151, 1, 72,194, 32,110,247,150,147,252,168,194,192, 19,
- 84,184,251, 97,234, 56,237, 12,241, 87, 78,112, 92,137, 22,143,226,169,219,174,223,100,201, 12,222,127,210,122, 74,151, 41,223,
- 35,254, 26, 43,174, 79,119, 84,206, 39,202,154, 53,171, 59,147,194, 44, 97, 97, 97,121, 46, 92,184, 80,142,135,144,215,190,126,
-253,122,211,136,136,136,102,193,193, 31,155,214,105,218,113, 51, 91,206, 30,243,180, 0, 79,108, 92,114,207,150, 77,230, 60,125,
-147,150,105, 55,107,247,210,189, 55,223, 98,175,224,223,202,251,202, 24,117, 24,171, 10,232,120, 16, 0, 15, 83,186, 71,190, 74,
-223,136,150,173,247, 71,232, 44,130,207, 79,179,123,250, 60, 7,114,227, 67, 97, 53, 91, 99,224,158,147,131, 1,191,176,174,127,
-248, 24, 38, 17, 11, 60,131, 32, 90, 91,143,221, 34,103,239,226,212,113,224,116,218,198,186, 3,162,212,111,209, 53, 74,101,155,
- 85,235,243,163,188,151,141, 71,241,112,148, 19, 86, 43,238,100,216, 50,230, 47,197, 81,128, 40,148,174,211,153,250,207, 62, 34,
-221,131, 93,175,159,248, 26,233,101,146, 36, 73, 18,157,100,198,187,104, 93,186,247,244, 61,109, 62,124,155,220, 43, 14,163, 78,
- 35,215,209,167,207, 95,105,215,161,115,228,150,171, 52,205,156, 51,157,186,142,223, 74,195,151, 93,145,226,173, 96,141,114,240,
-233,242, 89, 78,253,145, 39,189, 71, 13,199,220,149, 58,127,218,117,238, 37, 47, 84,254, 84, 34,156,157,134, 45, 37, 43,175,106,
- 83,228,202,144,155, 15, 49,164,181,218, 12, 35, 16, 34,215, 60,229,101,117, 58, 32, 78,123,153,176,168,199, 99,173, 63,246,226,
-187, 99,112,121,234, 35, 90, 28,216,222,183,187,239,116,137,100,245, 31,179,136, 92,115,149,137,104, 50,112, 45,199, 77,213,165,
- 46,163, 86,209,108,118,195,155,167,115,218,135, 0,248,246,125,198,127,203,199,164, 44,145, 73,234, 70,178,235,105,235,185,120,
-225,150, 11, 18,193,158,177,238, 28,165,178,241, 92, 44,247, 90,228,131,190, 99, 96,130, 42,209,106,217,107,234,187, 71,108, 21,
- 63,115,235, 61, 33, 84, 98,230,182,251,252,177,118,133, 92,138,119, 14,150, 75,180,120, 84,246,167,119, 65, 95,194,107, 14,216,
-249,160,219,156, 75, 55,122, 79,217,253,168,112,213,206, 95, 22,174, 63, 22,121, 4, 31, 24,236, 25,192,199,193, 64,118, 81,193,
-122,130,247,106, 90,215, 66, 26, 45,121,202,250,104, 34, 90,120,223,183, 99, 47, 70, 95,126,110,224,226,141, 43,209,122,252,248,
-113,127,117, 75, 22,194, 24, 64,178,218, 48,201, 66, 25,241,188,167,203,164,159,104,165, 72,231, 94,121,210,188,117,244,240, 85,
- 40,141,101,203, 56,194, 16, 10,215,236, 75, 13,187, 76,166,175,225, 17, 82,106,210,125, 26, 29,187, 30, 40,165,173,199, 30,160,
-220, 79,228,180, 27,136, 22,202,234, 59, 98, 92,223, 2,165,235, 6, 14,156,186, 41, 2, 1,246, 75,247, 63,150, 44, 79,125, 24,
-135,110,108, 65,195,224, 47, 57,242, 64,180,216, 59, 37,189, 43,182,159,126, 74, 7, 47,190,148,234,217,137,173,150,179,182,222,
-166, 21,251, 31, 72, 70, 26,144, 78,109, 22, 45,213,251,168,242, 19, 53,215,225,119, 36, 73,159, 37,138,229,198, 88,194,162,243,
- 74, 49, 95, 26,142,107,149,173,150, 95, 29, 18,237,139, 74,235, 35, 90, 73,147,154,102,177,178,205, 24,116,241,202, 77,238,108,
-175, 83,161,174, 71,104,202,166, 7, 52, 98,193, 33,142,199,178,122,107,110,145,246,133,101,218,116,215, 83,164, 48, 29,202,119,
-213, 27, 3,148, 34,189,123, 46,107,231, 60, 31, 54, 28,188,249,246,194,195,143,111, 7,174,122,126, 69,149,100,181,153,125,239,
- 2, 72, 22, 98,144,228, 52, 44,155, 55,223,231,106, 48,131,114, 53,152, 78, 57,234, 77,165,236,117, 38, 83,122,175, 50, 31, 49,
- 50, 16,137, 71,119, 4, 65, 73,164,196,129,241, 72, 60,242, 76,175,107, 49, 45, 19, 45, 4, 49,227,171,140,211, 43, 85,119, 97,
-190,156,153, 54,118,234,212,169, 15, 15, 81,110, 13,235,143, 12,162,149,200,198,198,230,194,140, 25, 51, 62,179, 5, 70,138,241,
-225, 81, 56, 52, 99,230,204,200,108,121,139,210,176,229,215,169, 76,211,145,116,239,217, 7,122,204,163,189,206,223,124, 69,219,
-142,223,167, 21,123,110, 25, 78,180,162, 65,179,117, 47,114,166,197,232, 67, 84,221, 23,150, 44, 38, 89,205, 39, 68,105, 24, 62,
-254, 29,196, 74,162,229,224, 81, 48, 24,241, 0,112,199,224,193,110, 62,241,188,228, 91,207,214,118, 31,101,111,183,159,254, 27,
-127,226,135,136, 22,223, 56,129,169,173,231,170,230, 61, 38, 75,157,215,216, 21,126,228, 85,184, 86,132,134, 64, 91, 93,106,144,
-204,195,195, 35,255,165, 75,151, 10, 49,158, 62, 12,107, 77, 78,141, 57,213,229,212, 60, 36, 36,164, 13,147, 47,140, 66, 66,108,
-144,190,225,249,210,125,156,138, 53, 51,201, 82,176,114,231, 86,189,198,208,201,171, 79, 8,251, 44,249,171, 78,181, 46,217, 69,
- 10, 54,133,155, 16, 49, 89,106, 1,240, 90,203,232,224, 89,108, 15,226,177, 60,153,100,185, 68,199,100,177, 11,237, 35,220,208,
- 37,251, 28,165,106,190,167, 36,183, 9,130,207,215,112,220, 2,199, 64,125,144,163,247,252, 34,189,246, 38,232, 11, 19,140,103,
- 52, 39, 58, 22, 98, 55,187, 13, 15, 94,121, 67,139, 24,207, 22,108, 33, 40,208,229, 16,127,120,156, 99,139,161,247, 3,125, 50,
-121,228,106,160, 75,158,202,145,110,249,170, 68,122, 20,168, 74,181, 57,160,186, 68,157,110, 84,174, 65, 15,170,216,180, 47,141,
- 90,124,130,182, 50,169,227, 57,172, 62,177,187, 70, 26, 8,193, 50,117,142,178,201, 90,164, 14,189,230,120, 78,196, 27, 58,151,
- 25, 44,165,224, 79,145, 20, 17, 73,148, 57,127, 13,234, 48,229, 20, 19,193,235,146,235, 15,241, 90,139,249,107,157,221,138, 26,
- 99,232, 80,126, 7, 7,135,146,220,158, 85, 29, 29, 29, 99, 8, 57, 91,174, 26,117, 26,190,156, 45,123,175,105,244,194, 3,100,
-147,157,227, 86, 84,130,223,153,140, 23, 40, 81,162, 68, 25,182,128,230,211,135,129,142,243, 9, 56, 94,107,221,164, 21,199, 49,
- 58, 13,174,238,249,114,100,129, 56, 61,103, 11,245,152, 69, 7, 37,236, 54, 49,121,225, 81,109, 76,102, 67,104,240,172,125,146,
- 5, 14,186, 15,146,133, 32, 97, 93, 68,139, 45, 85,101, 91,116, 25, 42,145,167,193,147, 86,144, 73,170, 52,203,210,102,240,184,
-208,109,210, 94,106,214,127, 17,229, 96,178,213,119,198, 97,114,246, 44,240,185, 99,191, 9, 82,190,209,179, 55, 81, 74, 11,155,
-165,114,117, 31, 46, 82,159,202, 45,194, 80,198, 69, 59,111, 75,157,101,254,114,205,195,112, 92, 78,125,145, 71, 19,209,106,209,
-115,202,187, 91, 79, 63,210, 46,254,104,131,245, 30,174,175,234, 67, 79, 81,198,162,157,131,100, 19,173, 44,133, 63,135,133, 69,
- 80,235,222,147, 35, 74,212,236, 30,222,162,219,184,136, 83, 87,159, 73, 46,206,117, 76,178, 96,109, 29,200, 31,131,176,184,215,
- 31,125, 70,122,167, 90,102, 44, 16,170,171,220,154,136, 22, 62,126, 48,104, 5,174,126,124,196,196,149,104,245, 25, 50,102, 57,
-220,133,251,216,146, 53,118,221,109, 41, 86, 20, 70, 0,184,230, 65,178,112,143, 21, 7,159, 48,209, 42,168,215,162,101,102,151,
-117,255,195, 23,129, 92,215, 55,146, 23, 9,198,142,255,134,109,166,190, 19, 54, 82,145,154, 61,165, 52,126,209, 1,137,100, 45,
-222,247,140,177, 61,141,114,203, 34, 70, 32, 90,215,111,222, 28,100,235,238, 19,112,226,202, 11, 30, 21,251,154, 58, 50, 41,194,
-251, 30, 33, 51,221,185,173, 16,151,204,229,148, 37, 15, 68, 43,244, 75,132,100,101, 70, 91, 43,137, 33,100,130,100, 34, 70,171,
-116,223, 99, 28,130,115,253,135,136, 22,218, 85,157,120,225,208,183,195,255,183, 84,225,183,166, 24,173,232,107,191,179,146,169,
-202, 80,202, 82,221,171,200,211, 20,167,169,157,104,233, 82,196,164,166,150,158,214,182,206,193, 23, 46,131,108,252,159,100,141,
- 95,113,134, 99,177,108,158,242,181,234, 19, 64,234,124, 30, 49,191, 83, 90,238, 72, 22,111,187, 24,112,252, 70,176,127,255,149,
-207, 98,145, 44, 16,174,150,147,175, 93, 66, 16,170,220, 7, 27, 49, 89,240,117, 99, 4, 7, 72,214,174,115,175,216,141,249,230,
-219, 87, 57, 7, 27,122, 84, 30, 33, 29, 67,220, 0, 30, 34, 12,249,151,163, 52, 32, 90,232, 12,235,182, 29, 16,172,238, 46,236,
-216,177, 99, 95,144,172,221,187,119,183,190,122,245,106,107, 38, 81, 58, 45, 90,124,222,119,246,236,217,159, 36,134,165,182, 77,
-157, 54,131,202,214,239, 78,141,250,175,164, 9, 11,119,115,124,214, 59, 58,116,254, 33, 49, 70,180,112,219,149, 56, 19, 45,126,
-105,143, 44,223,122, 50,141, 92,243,128, 74,201, 36, 89,192, 92, 73,180,178, 23,174,116,125,245,206,243, 52,127,215, 67, 41,158,
- 0, 15,135, 87,235,189,148,169,249,110, 42,205,230,254,210,237, 23, 27,228, 58,228,249,136,170,177, 53,109, 15, 91,173,234,168,
-182, 45, 15,155,238,157,187,116,227,240,161, 75,206, 83,143,169,135,120,168,117, 22,189, 65,172, 42,215,131, 60,153,178,187,176,
- 44, 19,216, 82, 76,182,202,177, 53,171, 10, 67, 92,159,127,183,201,147, 39, 15, 72, 22, 58, 9,101,176,188, 86,181, 42,210,124,
-157,149, 79,187, 5, 77, 75,183,153,181, 23,228,106,245,246, 99, 82, 75, 97,143,223,165,219,206,220, 87,184,237,130, 22,249, 90,
-174, 74,151,174,204,248,148,125, 22, 93, 30,104, 91,217, 55, 78,129,168,169,236,178,125,132, 37, 11,157, 13,176,197, 75, 8, 65,
-221,203,185, 99,227, 24,134, 15,114,116,159, 95,164, 87, 95,190,251, 36,141, 94,156,200, 1,167,190,236,214,237,201, 47,197,134,
- 60, 98,176,194,128, 19, 84,172,215, 81,202,223,229, 32, 91,122,207, 16,187,152, 31,202,145,169,204,131,192,247,227,126,247,168,
-203,228, 67, 52, 96,206, 49, 26,179,244, 20,205,217,112,129, 93,147,111, 36,162,197,241,113,173, 97,201,229,252, 58,137,150,103,
-161, 90, 52,131, 71,221,129, 96,221,121,142,233, 34, 62, 75,255, 15,227,145,113,153,242, 85,163, 50,109,230,190,234,196, 49,134,
- 8,148,133,187, 18,238, 63,118, 29,106,141, 39, 99,139, 48, 8,116, 57,158,199,173,129,157,157, 93,109, 38, 94,181,144,236,179,
- 20,249,232,145,183, 28,101,240, 42, 22,225,226,158,189,169,155,155, 91, 53,164,204,153, 51, 87, 45, 92,184,112,109, 92,195, 68,
-171,178, 33, 24,168,228, 77,200, 22,133,233, 93,135,206,147, 44, 28,141, 59,141, 36,158,104, 88,214,164,142, 32, 78, 32, 89,234,
- 22, 45,144, 44,245, 99, 61,167,236,210, 73,180, 82,167,177,219,191,147,173,191, 19, 22,237,161,228,102,233, 48,199, 91,194, 68,
-201, 83,215,107,210,115, 22, 13, 93,114,145,154,246,156, 66, 57,138, 84,148, 44, 93, 74,146,149,202, 34,221,114,228,147, 91,239,
- 20,214,238,131,125,103,110,231, 78,242, 17,199, 98,213, 97,143,197, 61,234, 54,126, 51,225,184, 92, 25, 32, 90,120,207,158,224,
- 80, 18,140,210,222,205,150,209,182,253,166, 7, 33,208, 94,157,104,101, 42,209, 37, 4, 3, 25, 58,207, 66, 39,172, 59, 70,203,
- 53,123,241,135,175, 3,222, 17,115, 45,122, 31, 18,206,225, 21, 31,233, 40,199,176,194,253,134, 14, 29, 22,119, 88,138,240,225,
-130,206,188,193,144, 29,148,214,173,200, 99, 93,229,214, 68,180,164,233, 54,216, 85, 6, 82,140,129, 32,113, 33, 90, 22,182,153,
-198,178, 53,247,211, 62,191, 23, 18,201, 66,224,187, 68,178,216, 82,214, 53,154,100, 33, 12, 3,100, 36,189,155,110,162,133,120,
-169,206,253,198,210,187,224,175,146,213,118, 10, 15, 30,193,135, 73,143,185, 23,248,185, 60, 65,107, 15,220,149,166, 13, 89,188,
-255, 25,213, 28,118,154, 92,234, 44,165,140,149, 38, 24, 68,180, 90,119, 25,116,106,240,244,173,225, 24, 9,137, 17,199,173, 56,
-104,189,221,148, 51, 84,172,193,160, 79,153,242, 84, 9,176,113, 43,248, 58,157,235,119,115, 79,106,132, 54, 67,150,194,175,130,
- 66,195,165,186,217,230,172, 45,245,187,248,152,194,168,107, 16, 45,155,236,181, 36,107, 22, 44,154,152,187, 79,174, 94, 33, 31,
- 63,199,113, 29,117,136,235, 48,114, 80,117,148,161,250,200, 69,125,163, 17, 85,207, 67, 94, 18, 45,101,215,236, 58,212, 86,209,
-148, 22,214,222, 76,178, 66,252, 46, 95,143, 69,178,198, 45, 63, 19,101,102, 97, 13,179,164,187, 33, 32,165,180,206,236,157,134,
- 59,145, 41, 43, 79,248,239,190, 24,248,188,239,242,103,151, 85, 45, 89,255,255,255,145,159,141,123,177, 0,115,199,156,147,172,
-172, 60, 77,245,221, 3,241, 88, 32, 89,255,177, 91, 43, 91,237,137,236,234,122, 37,117, 92,248,106, 0, 27,119,171, 56, 84, 34,
- 90,120,153, 15, 89,118, 67, 82, 82, 57, 68,203,202, 53,255,139, 6, 29, 99,143, 46,132,187, 16,150,172,229,203,151,183,134,203,
- 12,214, 44, 14,200,110,205, 47,125,157, 68, 11,110, 66, 88,176,212, 55,127,127,127,186,121,243, 38,185,186,103,227,145, 83, 87,
-164, 57,123, 70,205,217,201, 83, 60,220,161, 35, 23, 30,211,178,157, 87,227, 68,180, 76,109, 60, 58,148,108,208,159, 70, 73,238,
-194,113,176,100,181,212,135,163,242,188,146,104, 33, 24, 62, 75,254,138,159, 87, 29,124,196, 15,201, 69,202,213, 97, 63,121,183,
-217, 39,145,172,250, 35, 79,144,141,123,241, 79,134, 4,195,187,231, 46, 29,178,243,244, 35, 42, 81,181, 89, 24, 2,249, 85,203,
-195,195,150, 43, 84,111, 53,130,221, 13, 55,201, 37, 87,149, 47,114,203, 26,157, 47, 65,234,212,169, 93,123,246,236, 89,153, 73,
-150,114,200,110,243, 49, 99,198, 52,226,227,153,228,144, 44,200, 65,224, 59, 98,178,224, 46,132, 37, 75,117,195,111, 28,199,121,
-228,179, 46,214,187,218,220,237,215,158, 88,151,236, 87,205,192,178, 74,217, 83, 51,209,130,187, 16, 47, 30,152,212, 97, 49,196,
- 23,244, 82,184,230,100,198, 64,113, 7,112,229,201,235,143,210,151, 60, 72, 74,239, 5, 87,165, 23,121, 53,126,217,150,235,127,
-130,124, 56,238,165, 64,215, 67, 84,107,248, 41, 16,173, 71,134,148, 19,238, 75,140,124,133,108, 88, 53,208,249,128,100, 97, 68,
-163, 61, 19, 45,144,172, 27, 55,110,232, 37, 90, 89, 10,214,164,137, 75, 14, 74,228, 10,163,217, 48,178, 13,255, 15,152,186,141,
- 92,243, 86, 37,158,176,180,113,166, 82,189, 55, 86,236,176,224,109,159,249, 23, 56,160,253, 14,136,214, 93,109,101,229,121,151,
-106,241,188,109, 77,217,245,222, 28,228, 73,153, 48,210, 12, 29,121,150,188,101, 2, 85,143,135,134,134,150,207,145, 35, 71, 19,
- 76,104,105,101,101, 37,197, 46, 25,176, 37, 64,156, 11,143,162,186, 53,144,227,201,208,153, 13,156,176,130,221,176,158, 75,228,
-202, 0,209,194,180, 45,223, 5,190,179, 37, 75,253,216, 76,118,207,235,178,104, 21, 44, 89, 61,100,199,185, 55, 84,170,122,243,
- 40,133,133,133, 50,158, 49, 65,210,148,105,238, 54,235, 49,129, 7, 67,188,100,107,230, 7,137,100,249, 78, 94, 73,169,204,211,
-109,231,114,202, 38, 89, 10, 79,207,164,110,121,202,191,195,212, 24,157,134, 45,199,123,231,106,235, 65, 75, 37, 11,138, 83,142,
-114,239,112, 94, 78,189, 53,141, 58,172,223,162,235, 91, 16,163, 24,162,197,157, 44, 62, 50,108,115,215,123, 39,119,212, 97, 90,
- 7,207,177,107, 54,237,140,252, 18, 22, 37,145,246, 99, 32, 89,108,121,195, 64, 23, 30,160, 36, 89,138, 32,179, 96,183, 67,212,
-156, 73, 77,254,186,190,145, 76,136, 39,232, 42,179, 58,209, 98,252, 79,243,136,202,107, 72,108, 69,186,150, 42,189,215, 53, 28,
-131, 12, 67, 98,180,204, 29,115, 7,238, 57,199, 36, 43,122,116, 33,172, 67,112, 71, 98,244, 51,136, 37, 62,138,240,188,195,154,
-105,171,135,104,165, 76,151,121,237,229,219, 79,165,184, 93,196, 61,129, 84, 98,160, 74, 31,142,211,106,199, 22,167,246,211, 47,
- 81,237,161, 39, 40,103,179, 21,148,177,236, 16,114, 41, 63,148,242,182, 92, 43,155,104,165,177,202,208,161, 97,219,129,161,112,
- 23,250,114,223, 8, 28,155, 13,223, 69,118,158, 37, 94,167,113,200,213, 89,203,124,142, 90, 97,117,244, 44,114,229,169,127, 48,
-173,229,120,185, 19, 87, 95, 51,217,170,245, 45,229,248,150, 38,173,191, 37, 61,231,205,198, 28, 39, 51,167,252, 87,228,232,212,
- 95,157, 39,185,153,213,243, 75, 87,174, 75,126,111,196,100,193, 93, 56,110,249,233,200,212,230,210,244, 13, 6,145, 44, 0, 5,
-203, 69,135,225,171,143,239,184,240, 97,127,175, 37,207,230,182,156,241,112,154,182, 84, 99,208,129,197, 25,114, 84,189,195, 47,
-181, 47, 28,167, 21,202, 95, 84, 67,180,129,109,233, 92, 32, 48, 71,221,201, 18,201,242,174, 57,158,188,106,140,165, 44,213, 70,
- 75,150, 44,183, 74,195, 40, 19, 43,158,115,217,193,228, 80,122, 0,217,151,232, 75,182, 69,251, 16, 95,163,215, 98,230, 85,180,
-254,180,114, 42,163, 11,149,238, 66, 85,146,197, 83, 32,180,126,255,254,125,107,254,170,214, 73,180,248,252, 27,117,146,197, 4,
-141,184,195, 34,142, 45, 34, 23,183, 44,212,141, 31,194,158,243, 46, 83,221, 94,203,168,120,195,225, 84,172,190, 47, 85,106, 61,
-209, 96,162,197, 36,171,125,137,250,253, 36,146, 85,172, 78,111, 38, 89,238,152,122, 66,246,134,192,254,227,199,143, 75, 36,178,
-124,173,230,155, 50,230, 40,251,185,209,224, 77,212,105,198, 57,106, 57,241, 52,149,237,184, 76, 34, 89,197, 42, 54,220, 4,178,
-185,121,243,230,214,230,230,230,122, 99,212, 28,179, 22,125,136, 0,219,249,107,246,243, 84, 14, 30,135, 77,173, 51,183,131,155,
- 48,133,117,230,182, 24, 45, 51,116,230,102,137,208,219,184, 23,125, 41,187,176,223, 50, 74,214, 42, 44, 29,113,237,218,181, 26,
-112, 27,222,189,123,183,121,116,199,138,142, 70,175, 53, 11, 66, 48,186, 80,213,162,181,106,219, 55,139,214, 42, 21,139, 86,254,
-150,115,219,217,150, 26,220,188,100,205, 54, 17,152,103, 11,123,235,226,125,107, 90, 21,243,213,251, 65,160, 90, 39,158, 43,238,
- 35,130, 87,149,243, 63,193,188,142, 56, 56,196,113, 89,203, 36, 90,220, 1,108, 90,190,249,136, 52,209,237,204,237,247,165, 47,
- 70,184, 32,171,240, 23,125, 25,118,241,214, 96,194,133,169, 26, 10,183, 89,197, 86, 66,119,125,147,193,198,130,220,210, 41, 39,
-230, 12,250,104,233,144,227, 99, 26,199,236, 95, 56,190,237, 75, 58,151, 92,188,207,245,133, 71,115,189, 6,201,130,251,144, 47,
-210,105,209, 2,153, 66,128, 61,166, 73, 81,186, 14, 31,190,250, 68, 31, 62,134,147,115,238, 42, 82,208,187, 75,193,182,214, 25,
- 10,119,105,239,144,191,249,201,182, 29, 59,124,206, 87,162, 26,222, 47,186,182,100,172,163,213,124,124,124, 26, 6, 4, 4, 84,
- 0,177,242,202, 87,246,174, 91,142,226,239, 61,243,149,189,167, 36, 90,172,195,149,217,205,216,144,173,201, 69, 89,152,182,175,
-207,152,251,124,155,210,193,227, 13,207,147,245,209,198, 37,207,245,130,165,235, 7,118, 29, 60,149,142, 94,121,197, 35,189, 2,
-105,248,212, 85,148,218,206,107, 13, 95, 32,155,188,128, 56,193, 50,242, 93,224, 59,127,237,171, 31, 3,169,213, 69,180, 50,184,
-102,187,188,150, 71,149,118, 31,181,140,146,166, 48, 31,164, 80, 88,153, 38, 50, 49,155, 83,177,201, 64, 42, 82,111, 8, 21, 46,
-223,136,170,212,111, 75, 94,185,125, 66,147, 36, 55, 3,193,144, 93, 78,233,253,204, 75, 98, 53,235, 57, 77,178, 42,194, 26,131,
- 14,214,171, 72,157, 79, 32,241, 85,218, 72, 22,146,250, 6, 62,151, 49,217, 29,220,243, 62,156,177,100,115,196,134, 35,247, 37,
- 98,212,137,227, 59, 11, 53,158, 18,110,102,111,136,165,213, 51, 41, 47,191, 20,242,240, 89,128, 68, 58, 48, 79, 26,158,153, 33,
-203,152, 28, 48,137,193,156,121,136, 29,173,202,243,192,213, 29,180,147, 44, 50,230,227,248, 44,221,228,208,161, 72,135,105,243,
- 54, 95,221, 39,119,122, 7,228,197, 53,250,112,224, 17,235,129,167,249,185, 68,220, 48,230,121, 3, 33,194,251, 29,241,146, 74,
-146, 5,203, 20,136,150, 93,102,221, 22, 45, 38, 90, 1, 55,159,240,200, 82, 30,193,185,130, 63,122,166,109,190, 67, 67, 57,166,
-177,221,196, 99, 84,185,251, 90,202, 83,127, 42,101,174,232, 75, 57,235, 77,163,170,253,118, 81,227,145,135,201,171, 84, 91,182,
- 66,102,214, 59, 13, 5,234,145,218,218,121,198,212,165,251, 34, 97, 45,195, 7, 95,183, 89, 23,200,214,195,231, 77, 42,219,204,
-152,136,218,224,141,103,134,159,176,237,192,249, 40, 60,243, 51,120,212,242, 65,158,130,101,215,217, 23,180,249,196, 51,158, 68,
-247,177,244,142, 7, 38,197, 91,206,137, 74,149, 33,143, 78, 34,108,240,205,227,227, 5, 41, 82, 91, 73,243, 97, 88,103,173,198,
- 74,253,138,198, 44, 57, 21,153, 42,181, 5, 92, 16,134,144,172, 88,147,206, 53,159,249,160,126,171,121, 15, 26, 54,156,126,191,
-174,156, 84,125,228,217, 38, 85, 6, 29,106,161,112,114, 82, 93, 95, 47,150, 76, 88,180, 52,185, 11, 97,182,198, 80, 88, 4,102,
- 30,225,160,118,144, 44, 30, 81, 34,153,179,217, 20,170,107,102,248,152,181, 11,191, 77, 70,154,113,127,193,188, 30,219, 71,140,
- 24,209,151,135, 38,183, 6, 9, 97,114,132,121,166, 36,146,197, 16,105, 35, 90, 49,229,132, 69, 75, 25,155,197,179, 24, 19, 15,
-163, 37,150, 69,107,215,174,165, 53,107,214, 16, 79,143, 17, 94,176,214, 0,106, 59,233,148,100,133,195,215,202, 64, 86,122, 60,
-148,106,163, 14,117, 78,180, 40,145,172,122, 28, 79, 35,145,172, 62, 32, 89,114,102,170,141, 37, 19,211, 35,176, 85,171,209,160,
- 65,131, 90, 40,167,121,112,203, 93,238, 58, 79,172, 23,140,224,119,140, 52,132, 37,107,219,182,109,173,187,118,237,218, 18,121,
-113,141,154,142,127, 87, 78,144,229,158,163, 87, 73, 35, 24,215,236,185, 68, 3,216, 58, 80,167,205, 32,234, 57,122, 41,205, 90,
-119, 70, 26, 16, 80,174,195, 2,212, 87,219,156, 54,186,234, 46,185, 16, 61, 61, 61,107,114,155,212,199,200, 67,252,230,164,143,
-100,125, 39, 19, 49, 90, 30, 5,171,246, 81,141,209,242,204, 95,109, 22, 98,180,250, 46,190, 60, 8,150,172,216,147,154, 94,123,
-130,227, 42,245,215, 59,161, 46,136,214,218,163,252,226,225,132, 23, 28, 98,117, 86,240, 30,216,164,115,209, 56,170,239, 59,153,
-230,230,217,205,217, 74, 60,182, 64,153,250, 95,103,174, 62, 74,139,120,184,116, 27,238,112,154,176,149,172,219,220,171, 84,119,
-200, 30,178,207, 85, 35,156,117, 96,154,150,145,150,122,203, 25, 93,167,214,111,222,188,105, 13,119,225,209,163, 71, 37, 75, 22,
-126, 67,239, 53, 16,173, 88, 50,205, 29,114, 31,255,175,231, 36, 58,195, 83, 60, 96,250,146,108,213, 71, 73,115, 53,189, 9, 10,
- 35,167,156,149,148,163, 11, 51,116,169,231,250,223,157,245,149,118, 93, 90, 85,243,102,165, 10,197,102,171,145, 4, 77,229, 76,
-192, 68,218,135, 45,201, 77,121, 46, 55, 88, 49, 99,172, 91,248,191,123,247,238,181,121,244,115,179,100,201,146,105, 11,109,248,
- 78, 38,147,172, 0,148,237, 10,175, 34,129, 73, 70, 17, 71,117,131, 59,184,197,235, 15, 82,161,114,245,165, 73, 33,245, 12,155,
-255, 78, 38,136, 19,172, 46,234,164,106, 17,199,162,169, 31, 67,199,171,129,104,197,200, 68, 64, 59,176,156,187,227, 62, 53,239,
- 61,141,156,178,228,143,172,213,118, 36, 13, 89,228, 71, 21, 91,142,165,164,169,210,140, 97,220,226,188, 14, 41,123, 27, 78, 79,
- 88,115,149,227,188, 14,226, 67, 8,109,160,192,190,237,152,221,212,109, 6,135,138, 56,230,146, 44, 59, 90, 54,157,186, 84,216,
-167, 88,223,242, 53,155, 93,241,202, 91, 54,192,201,203, 39,152,173, 30,175, 51,231, 44,126,217,222,193,169,175, 33, 50, 83, 90,
-102, 44,147,187,104,141,176, 83, 87,158, 72,174, 73,144,211,174,115, 46, 75,238,241, 90,188,250, 67, 11,182, 28, 65,239,211,185,
- 23, 11, 75,145, 86, 90, 38, 76,125,139, 41,103,244,218,133, 81,169,108, 60,162,210,186,151,189,161,109,249, 29,229,113,228, 65,
- 94,110, 35, 78,186,215, 58, 76,195,147,144,110, 63,243,146,167,148,121, 37,141,216,195,115,142,129, 30,203, 57, 38,107, 25,147,
-108,140, 52,199, 64, 21,184,215,236, 50, 23,210, 57, 97, 41, 98,173, 6,207,220, 77,255, 13, 90, 69,245,123, 47,165,234, 93, 22,
- 82,197,246,243,168,114,167,133,212,100,200, 38,234, 57,227, 4,141, 88,121,141, 58, 78,216, 67, 57,203,181, 35,246, 14, 28,215,
- 50,207,155,198, 54,226, 80,158,131,235, 15, 92,147,230,179,195, 92,116,229,154, 14,251,106,229,156,183,143, 76,206,242,253,123,
-158, 39, 25,119,206, 94,236,229,209,139,143,165,153, 8, 86,241,188,107,248,144,132, 71, 9, 9,211,121, 52,240,221,205, 68, 56,
-255, 11, 45, 19,146,203,188,245, 95,146, 45,169,137,233,221,245,187,206, 68, 96,126,154, 81,139,142,135,165, 72,101,134,128, 90,
- 67, 72, 22,144,144,251, 50, 55, 4,181,239,136,214,119,238, 66,182,100, 97, 72,169,170,187,208,182, 88,111,137,100,141,231,201,
-211,116, 17, 45,213,181, 11,139, 22,176,223,203, 95,207, 77,147, 39, 79,222,133,173, 54,141,145, 48, 57, 39,220,107,152, 60,143,
- 95,244, 82, 98,107, 74,172,184,163,232,202,196,148, 19, 49, 90, 60, 73,223,103,184, 15,121,153, 3,226,105, 9,136, 99,188,104,
-211,166, 77,196,243, 64,133,113,236,201, 40,184,247,120,125,190,167, 5,107, 15,160,118,147, 79,177,117,139, 95,122,252, 5, 36,
-151,104,225,139,179,120,189,190, 81, 32, 89,197,235,246,141, 98, 98,211, 70, 38,168,154,218, 40, 41,215, 57, 63,215,177,225,196,
-137, 19, 37,194,133, 4, 11, 22,210,208,161, 67, 91, 69,215, 27,139, 76,107,114, 41,104,144,153, 43, 9,155,228,121,126,171, 9,
-212,127,238,113, 41,214, 96, 6,143, 62, 26,198,230,234,166, 35,246, 83,161,250, 35,200,220, 46,219, 14, 5,143,154, 52,244,101,
-206,238, 33,199, 92,185,114, 21,231,184,156,142,188, 4,199, 66,222,183,231, 99, 69, 57, 70,203, 57,154,108, 25,212, 65,128,108,
- 33, 86, 11,238, 66,236,241, 27, 2, 16,155, 5,183,161,210,162, 85, 10, 22, 45,118, 31,170,197,106,233,213,121,243, 12, 57,238,
- 34,232, 29, 9, 49, 89,112, 23,194,146, 5,146,101,227,154,231,134,174, 14, 66,253, 92,114, 91,175, 12,236, 34, 89, 82,168, 82,
-203,200,254,179, 14, 80,239, 57,103,201,187,108,123,158, 84, 51,243, 26, 29,171, 1, 24,242,108,182,230,229, 77,190, 35, 89,114,
-136, 22,136, 9, 91,165, 91,154, 57, 23,122,211,172,219,120, 58,113,241, 1,181, 24,184,156, 58,143, 90, 79,142,217, 43, 80,221,
- 18, 14,181,111,172, 42,183, 60,228, 80,245,195,139, 7,230,246, 77,153, 50, 41, 8,187,186,245, 73, 43,158,236, 70,116,231, 4,
-235,101, 11,190,174, 53, 63, 71, 45, 56, 46,171, 97,138, 20,210,226,238,186,172,140, 26,137, 22, 72,214,230, 83,175,217, 82,217,
-137, 90,116, 30,132,213, 25,130,208,169,170,187,186,229,234, 39,136, 19, 70,195,169,199, 99, 33,174, 78,253, 24,226,236,116, 17,
- 45,232,113,146,148,150,139,235,117, 24, 69, 99, 87, 93,165, 97, 75, 47,210,192, 5,231,169, 90,219,113, 28,179,101,131, 85, 41,
-228,110, 26,241,244,246,169,243, 30,239,198, 34, 53,187,113, 12, 90,102,111, 8,195, 62, 79,197,142,212,137,135,230,187,230,173,
- 5,151,190,182, 1, 37, 58,117,158, 7, 35,116,100,125, 25,194,239, 62,105,118,120,126,167, 12,233,223,191,255, 16, 30,212,208,
- 81, 71,161, 53,202, 52,229, 69,174,109,221, 11,127,236, 50,116, 94,228,180, 53,103,121,218, 25, 38, 8, 43,175, 83,195, 33,219,
-169, 96,189,225,145,220,129,127,100, 66,166,173, 60,210,113,172, 83,200, 88,243,232,186,111,107, 23,242, 12,249, 81,179, 55, 94,
-220,167,109, 9, 30,156, 67, 30,185,107, 29, 90, 56,230,190,151,222,221,231,157,125,150,162,239,236, 61,125,222,101,240, 44,250,
- 45,121,125,219,243,178,104,156,124,222, 57,242,222, 54, 83, 62, 77, 83,175,196,148, 31, 68,235, 17,143, 54,196,100,194,151,238,
-189,163, 35,151, 94,208, 22,158,178, 5, 31,167,173,250,207,161,220,101,154, 18, 79,234,125, 31, 22, 44, 94, 9,162,152,161,120,
-242, 7,244,227,195,151, 48,245,196, 29,142,245,188,199,171, 64, 84, 14, 50,192, 93,168, 17,103, 46,115,214,244,110, 5,158, 55,
-234, 60,230,227,180,181, 23,248, 35, 16, 19,151,222,166,182,227, 15, 82,238,170, 61, 67,204, 29,242, 60, 71, 30,185, 10, 27,143,
-243,201, 49,116, 40,220,147, 36, 53,185, 97,146,220,244,126,210,100, 38,152,132,212, 80,146,101,200,203,220, 16, 44, 99, 53,110,
- 26,231,188,231,149, 35, 12,149,163, 11,121,164, 97, 48, 70, 23, 34, 22, 75,153,224, 46, 4,193, 66,210, 16,216, 23, 35, 83,117,
-237, 66,199,244, 38,195,185, 96, 6,207,248, 30, 93, 25,213,114, 74,163, 14, 57,110,232,243,217,179,103,137, 23, 88,165,101,203,
-150, 81,155, 54,109,194,248,248, 69,206, 31,189, 68, 72,174, 36, 74,194, 85,168,246, 64,106, 63, 69, 26, 61,114, 89, 5, 28,173,
- 47, 52, 76,162, 56, 98,245, 61, 2,217,130, 59,206, 0, 64,117,189, 36, 83,176,101,160, 24,199,196,212,227,185,170,154, 79,158,
- 60,185,181,171,171,107, 99, 51, 51, 51,140,184,208, 21, 8,174, 85, 38, 38, 59,100, 18, 48,198,222,171,228, 37,175, 18,205, 62,
-218,121,149,186,194,110,155,113,112,221,232, 41,179,198,243,108,189,114,101,146, 53,144,211, 58,254,255, 50,239,111,243,254, 52,
-239,231,113,106,239,229,229,165,171,253,180,222, 19,110, 68,105, 30, 45,222,171,151, 43, 93,241, 62, 85, 97,217,194, 94, 67,153,
-245,213,195,128,166,137,201,170, 87, 38, 94, 92, 60, 31,217,134, 84, 54, 89,182, 98,250, 20, 25, 55,209, 43, 19, 50,162,167,112,
- 80, 13,240,140,249,159,117, 67,125,122, 7, 45, 50,255, 79,184,170,180,158, 64, 29,134,175,165,226,101, 43,210,231,195, 53,142,
-111,159, 80,120,130,171, 93,114, 76, 56,139, 37,149, 52,109,250,202,137,193, 14,176,176, 33, 6, 11, 83, 78,100,231,189,190, 17,
-166,223, 19,173,111,174,195, 0,198,240,125, 74, 43,247,190,209, 75, 23,233,147,163, 90,222,239,100,130, 56,193,205, 53,112,230,
- 94,201,122, 1, 75, 22, 72, 22,214,100,236, 62,105,167,100,145,193, 7, 7, 72, 22,172,242,122,136, 22,238,149, 32,137,137,121,
-179, 76, 57, 75,221, 45, 88,169, 85,120,198,108,197, 47, 39, 74,110,166,107, 97,102,217,120,178,245,106, 80,230,124,213,130, 82,
-217,101,157,168,122, 17, 38,202,116,202, 89,245,131,169,157,103, 92,214, 37,148, 68,229,205,155,183, 58,135, 92, 12,226,112,137,
- 33, 60,129,231,144,133, 11, 23, 14,169, 88,177,226, 32,142,157,171,166, 67, 79,117,180,187,107, 50,115, 91,239,169, 60, 82,246,
- 62,191,235, 63, 51,185,250,108,149,169,240,131,212,182, 89,103, 40,236, 11,104,211, 35,220, 74,146,137,117, 10,249,121,249,255,
- 90,135, 60,183, 19,143,128,156,171,109, 9, 30,156,195,252, 79,114,215, 58,148,241,236,233,203, 18, 83,119,132, 88,240, 7,234,
- 51,190,255, 93,196,101,114, 58,195,233, 48,127, 72,175, 71, 44,174,158,143, 41,157,250,137,147,188,114, 74, 32, 12, 16,112,195,
- 98,186, 38,219,204, 5, 63,232, 43,156,202,121, 29,109, 84, 44,177,165, 99,142,255,210,187, 23,217,203,125,241, 61, 43, 87, 41,
-237,229,169,109,120,225,116,249, 19,170, 26, 80,150, 63, 49, 43,150, 16,148, 69,182,126,180,240,250, 94,146,113,145,255, 83,101,
-122,184,164,168, 86,166,168,243,102, 87,135,148, 48,107,171,174, 93,104,104, 89,213,203, 9,178,229,203, 86,162, 7, 76, 92, 2,
-224, 78,196,111, 22,170, 97,241,223, 24,194,133,217,126, 87,202, 81,108,140,132, 74,235,156,251, 16,199,227, 52, 51,176,160,114,
-240, 52,231, 78,181,100,116,220,147,185, 12,249,114,100,202, 16, 19, 43,139, 86,153, 74,139, 22,239,235,115,106,199,169, 38, 39,
-159,184, 90,180,112, 87,140, 66, 84,206, 12,175, 94, 80,251,218,147,146,247, 91,162,117,212,225, 47,173,187,161, 32,202,209,165,
-159, 39, 51,154,112,101, 44,228, 95,179, 66,206, 7, 62,217,172,203,240,189, 52, 45,204,173,183,131, 80,205,144, 52,105, 82,204,
- 19,213, 58,122, 47,167,248,191,164,141, 48,157, 10,200,147,220,164, 97,250,149, 95, 82, 78, 57,128,233,201,163,175,156,137,178,
-101,203, 86,156,159,199,102,252, 17,212,129, 93,252,205,120, 77, 85, 31,205,239,190,152, 59,233,147, 25,151, 98,255,159,192,240,
-122,133,188,110, 97, 20,146,218,218,133, 26,229, 34,143,150,252, 63,181,156,113,169,164,150,107, 52,150,211,202, 57,207,157,244,
- 60,197, 4, 70, 63, 50,201, 10,180,113,201,123,199,128,123,254,140,186, 27,112,123,145, 85,137,192,207,104, 8, 33,211,184,250,
- 37,240, 20,120, 26, 11, 1, 67,116, 73,110,176,182, 33, 50,229,214, 67,200,148,139,148,188,124,241, 18, 79, 88, 45,117, 44,186,
-254, 93,205,181,228,143,151,117,151,215,172,122,115,253,140,186,235,189,233, 31,156, 65,147,229,255,151, 20,247,103, 52,132,144,
-105,220,166, 19,120, 10, 60,141,133,128,208, 37, 99, 33,249, 77,142,192, 83,224,105, 44, 4,226,139, 46, 25,171,190,127,156, 28,
- 52,128,166,100, 72, 65,181,201,208,117, 92,159,124, 33, 83,115,187,196,181,189, 4,158, 2, 79,185, 58, 32,158, 77,237, 8,200,
-197, 80, 53,159,192, 83,224,169, 9,129,127, 89,151,148,120,196,181, 63,211,247, 76,253,142,243,234, 22, 45,196,104,253,146, 45,
-190,176,104, 81, 78,227,170,131,192, 83,224,105, 44, 4,132, 46, 25, 11, 73, 97, 37, 19,186,244,231,235,146,113, 75,248,123,165,
-253,146, 64,120, 97,250, 54,126, 35,139, 23,133,113, 49, 21,120, 10, 60,141,133,128,208, 37, 99, 33, 41, 8,225,191,172, 75,198,
-213,162,223, 43, 77, 16, 45, 53,252,255,101,197, 22,117, 55,238,195, 40,240, 20,120, 26, 11, 1,161, 75,198, 66, 82,144,183,248,
-162, 75,198,109,241, 95, 43, 77,184, 14,245,224, 29, 95,148, 80,148,211,184, 15,142,192, 83,224,105, 44, 4,132, 46, 25, 11, 73,
- 65,138,254,101, 93, 50,174, 22,253, 35,210,254,101,133, 17,117, 55,174,146, 11, 60, 5,158,198, 66, 64,232,146,177,144, 20,164,
- 72,232,146,113,117, 41, 62, 75, 83,186, 10,149, 19,149, 10,215,161,112, 29,198, 32, 32, 94, 20,198,125,180, 5,158, 2, 79, 99,
- 33, 32,116,201, 88, 72, 10, 66, 24, 95,116,201,184, 45,254,107,165,169, 19,171,216,191,121,253, 41,229, 2,175, 10,213,255,127,
-109, 25,197,221, 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16,248, 87, 17,136,231, 92, 68,213,146, 5,146, 21,123,122, 7, 84, 78,
- 89, 65, 65,180,254, 85, 21, 23,245, 22, 8, 8, 4, 4, 2, 2, 1,129,192,239, 67,224,175,230, 34,170, 36, 75, 16,173,223,167,
-100,226,206, 2, 1,129,128, 64, 64, 32, 32, 16,248, 87, 17,248,171,185, 72, 60, 55,215,253,171, 58, 41,234, 45, 16, 16, 8, 8,
- 4, 4, 2, 2,129,191, 6,129,191,154,139,252,213,149,251,107, 84, 80, 84, 68, 32, 32, 16, 16, 8, 8, 4, 4, 2,127, 47, 2,
-241,156,139,232,142,209,250,123,155, 77,212, 76, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2, 1,129,192, 79, 71, 64,247,168,195,159,
-126,123,113, 3,129,128, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2,127, 47, 2,234, 51,195,255,178,121,180,254, 94, 72, 69,205,
- 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16, 16, 8,252,102, 4,226,203, 36,105,162,156,198, 85, 20,129,167,192,211, 88, 8, 8,
- 93, 50, 22,146,223,228, 8, 60, 5,158,198, 66,224,103,232,146,177,202,246, 59,228, 40, 99,180,112,239,239,231,209,250,137, 37,
-250, 25, 13, 33,100, 26,183,193, 4,158, 2, 79, 99, 33, 32,116,201, 88, 72, 10, 82, 36,116,233,223,212, 37,227,214,250,215, 74,
- 83,186, 10,213,247, 63,189, 20,226, 97, 49, 46,196, 2, 79,129,167,177, 16, 16,186,100, 44, 36, 5, 41, 18,186, 36,116,201,184,
- 8,196, 79,105,191, 45, 24, 94, 60,128,198, 85, 24,129,167,192,211, 88, 8, 8, 93, 50, 22,146,130,104, 9, 93, 18,186,100, 92,
- 4,132, 52,131, 16, 16, 15,160, 65,112,233,205, 44,240,212, 11,145, 65, 25, 4,158, 6,193,165, 55,179,192, 83, 47, 68, 6,101,
- 16,120, 26, 4,151,222,204, 2, 79,189, 16, 25,148,225,103,224,105, 80, 1, 68,102,241,149,247, 51,148, 80,200, 52,238,147, 37,
-240, 20,120, 26, 11, 1,161, 75,198, 66, 82,244, 29,255,178, 46, 25, 87,139,254, 32,105,104, 84, 77,201,144, 34,106,147,161,235,
-184, 62,249, 66,166,230,118,137,107,123, 9, 60, 5,158,114,117, 64, 60,155,218, 17,144,139,161,106, 62,129,167,192, 83, 19, 2,
-255,178, 46, 41,241,136,107,127,166,239,153,250, 29,231,149,163, 14, 85,103,136,255, 37,229,248,151,153,185,168,187,113, 85, 76,
-224, 41,240, 52, 22, 2, 66,151,140,133,164,176, 62, 9, 93, 50,174, 46,197,103,105,191,124,180,161, 42, 91, 53, 54,112, 66,177,
-141,139,168,192, 83,224,105, 44, 4,132, 46, 25, 11, 73, 65, 96,132, 46,253,155,186,100,220, 90,255, 90,105,191,109,102,120,241,
-176, 24,183,161, 5,158, 2, 79, 99, 33, 32,116,201, 88, 72, 10, 82, 36,116, 73,232,146,113, 17, 16,210, 12, 66, 64, 60,128, 6,
-193,165, 55,179,192, 83, 47, 68, 6,101, 16,120, 26, 4,151,222,204, 2, 79,189, 16, 25,148, 65,224,105, 16, 92,122, 51, 11, 60,
-245, 66,100, 80,134,159,129,167, 65, 5,248,195, 50,139,121,180,244, 52,200,207, 80, 24, 33,211,184, 79,129,192, 83,224,105, 44,
- 4,132, 46, 25, 11, 73, 97,205, 19,186,100, 92, 93,138,207,210,196,204,240,130,104,105, 69, 64,188, 40,140,251,104, 11, 60, 5,
-158,198, 66, 64,232,146,177,144, 20,132, 48,190,232,146,113, 91,252,215, 74,211, 31,163,181,125,251,118,250,181,101, 18,119, 19,
- 8, 8, 4, 4, 2, 2, 1,129,128, 64, 64, 32,240,127, 4,254, 90, 46,162,172,216, 95, 91, 65,161,197, 2, 1,129,128, 64, 64,
- 32, 32, 16, 16, 8,252,209, 8,196,115, 46,162, 58,127, 22,172, 91,248,253, 61,131, 20, 68,235,143,214, 65, 81, 56,129,128, 64,
- 64, 32, 32, 16, 16, 8,252,181, 8,196,115,162,165, 59, 24, 62,158, 87,238,175, 85, 58, 81, 49,129,128, 64, 64, 32, 32, 16, 16,
- 8,252, 43, 8,196,115, 46, 34, 98,180,254, 21, 69, 21,245, 20, 8, 8, 4, 4, 2, 2, 1,129, 64,124, 69, 64,120,214,226,107,
-203,137,114, 11, 4, 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16,248,121, 8,232,183,104,253,188,123, 11,201, 2, 1,129,128, 64,
- 64, 32, 32, 16, 16, 8, 8, 4,254, 9, 4,212, 99,181,254,137, 74,139, 74, 10, 4, 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16,
-248,217, 8,252, 22,146, 21, 95, 38, 73, 19,229, 52,174,250, 9, 60, 5,158,198, 66, 64,232,146,177,144,252, 38, 71,224, 41,240,
- 52, 22, 2, 63, 67,151,140, 85,182,223, 33,231,183,185, 14,127, 70, 67, 8,153,198, 85, 33,129,167,192,211, 88, 8, 8, 93, 50,
- 22,146,130, 20, 9, 93,250, 55,117,201,184,181,254, 71,164,137,135,197,184, 13, 45,240, 20,120, 26, 11, 1,161, 75,198, 66, 82,
-144, 34,161, 75, 66,151,140,139, 64,252,148, 38, 22,149,214,211,110,226, 69, 97, 92,197, 22,120, 10, 60,141,133,128,208, 37, 99,
- 33, 41, 8,161,208,165, 63, 95,151,140, 91,194, 95, 43, 77, 44, 42, 45,136,150, 86, 4,196,203,199,184, 15,163,192, 83,224,105,
- 44, 4,132, 46, 25, 11, 73, 65, 50,227,139, 46, 25,183,197,127,173, 52, 17,163, 37,136,150, 32, 90, 26, 16,136, 47, 47, 31, 81,
- 78,227,190, 48, 5,158, 2, 79, 99, 33, 32,116,201, 88, 72,254,229,114,160, 40,154,146, 33,213,214, 38, 67,215,113,125,242,133,
- 76,205,237, 18,215,246, 18,120, 10, 60,229,234,128,120, 54,181, 35, 32, 23, 67,213,124, 2, 79,129,167, 38, 4,254,101, 93, 82,
-226, 17,215,254, 76,223, 51,245, 39,156,255,101, 83, 61, 8,182,111,220,230, 22,120, 10, 60,141,133,128,208, 37, 99, 33, 41,220,
- 82, 66,151,132, 46, 25, 23,129,191, 67,154, 32, 90,106,237, 40, 94, 20,198, 85,108,129,167,192,211, 88, 8, 8, 93, 50, 22,146,
-130, 16, 10, 93,250,243,117,201,184, 37,252,181,210, 68,140,150, 30,188,197, 3,104, 92,133, 20,120, 10, 60,141,133,128,208, 37,
- 99, 33, 41,136,150,208,165, 63, 95,151,140, 91,194,127, 68,154, 80,108,227, 54,180,192, 83,224,105, 44, 4,132, 46, 25, 11, 73,
- 65, 96,132, 46, 9, 93, 50, 46, 2,241, 83,154, 45, 23, 27, 86, 45,229, 62,215,175,170,134,120, 0,141,139,180,192, 83,224,105,
- 44, 4,132, 46, 25, 11, 73, 65,180,132, 46, 9, 93, 50, 46, 2,241, 83,154,152, 71, 75,184, 14,181, 34, 32, 94,146,198,125,168,
- 5,158, 2, 79, 99, 33, 32,116,201, 88, 72, 10, 50, 28, 95,116,201,184, 45,254,107,165,233,142,209,218,190,125, 59, 69,167, 98,
-191,182, 92,226,110, 2, 1,129,128, 64, 64, 32, 32, 16, 16, 8, 8, 4, 20,138,191,154,139,160,114,104,100,229, 94, 52,184, 64,
- 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2,129, 95,137,192, 95,205, 69,254,106, 22,249, 43,181, 68,220, 75, 32, 32, 16, 16, 8,
- 8, 4, 4, 2, 2,129, 56, 33,240, 87,115, 17, 97,201,138,147, 78,136,139, 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16, 48, 18,
- 2,241,156,139,168,143, 58,140, 61, 97,105, 60,175,156,145,154, 88,136, 17, 8, 8, 4, 4, 2, 2, 1,129,128, 64,224,119, 33,
- 16,207,185,136,250,168,195,223, 5,163,184,175, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2,129,191, 14,129,223, 54, 51,252,
- 95,135,164,168,144, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2, 1,129,128, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2,
- 1,129,192,175, 67, 64,213,170,245,203,238, 26, 95, 38, 73, 19,229, 52,174, 74, 8, 60, 5,158,198, 66, 64,232,146,177,144,252,
- 38, 71,224, 41,240, 52, 22, 2, 63, 67,151,140, 85,182,223, 33, 39,118,240,251,183,229,120,126,201,246, 51, 26, 66,200, 52,110,
-211, 9, 60, 5,158,198, 66, 64,232,146,177,144, 20,164, 72,232,210,191,169, 75,198,173,245,175,149, 38,136,150, 30,188,197, 67,
-109, 92,133, 20,120, 10, 60,141,133,128,208, 37, 99, 33, 41,200,155,208,165, 63, 95,151,140, 91,194, 95, 47, 77,184, 14,117, 96,
- 46, 30, 64,227, 42,164,192, 83,224,105, 44, 4,132, 46, 25, 11, 73, 65,180,132, 46,253,249,186,100,220, 18,254, 35,210,132, 98,
- 27,183,161, 5,158, 2, 79, 99, 33, 32,116,201, 88, 72, 10, 2, 35,116, 73,232,146,113, 17,136,159,210,126, 89, 76,150, 58, 60,
-226, 1, 52,174,194, 8, 60, 5,158,198, 66, 64,232,146,177,144, 20, 68, 75,232,146,208, 37,227, 34, 16, 63,165,233,156,176, 20,
- 15,137,166,100, 72, 85,181,201,208,117, 92,159,124, 33, 83,115,187,196,181,189, 4,158, 2, 79,185, 58, 32,158, 77,237, 8,200,
-197, 80, 53,159,192, 83,224,169, 9,129,127, 89,151,148,120,196,181, 63,211,247, 76,253,142,243,191,109,194, 82,241,165, 99,220,
-230, 22,120, 10, 60,141,133,128,208, 37, 99, 33, 41, 44, 90, 66,151,132, 46, 25, 23, 1, 33,205, 32, 4,196, 3,104, 16, 92,122,
- 51, 11, 60,245, 66,100, 80, 6,129,167, 65,112,233,205, 44,240,212, 11,145, 65, 25, 4,158, 6,193,165, 55,179,192, 83, 47, 68,
- 6,101,248, 25,120, 26, 84,128,191, 49,179,117,226,196,137,251,167, 72,145, 98, 22,167,185,252,255, 4,174,164,165,158,138,126,
-215, 16,166,166,166,157,211,167, 79,127,147,211, 51, 71, 71,199,157,169, 83,167,236,234,106,162, 40,202,114,146,200, 4, 77, 87,
-227, 38,100, 25, 30,156,186,114, 25,111, 36, 79,158,252, 17,255,191, 28,191, 57, 89,233,144,175, 87, 97,134,219, 41,106, 93,237,
- 82,109, 51,246,106,114, 42,217,216,216, 28,227, 99,101,213,142,235,149,169,173, 60,245, 83, 42, 74,215, 54, 85, 60, 65,194,255,
- 42,249, 12,146,153, 58,117,234,198,182,182,182,167,210,166, 77,251,156,247, 39, 24,143,218, 26,238,169, 75,102, 58,174,219,120,
- 7, 7,135,219,118,118,118, 83,248, 90,172, 78, 46,103, 51,168,156,114, 4,114, 30,189, 50,125, 76, 20, 62, 5, 76, 20, 1, 5,
-147, 41,130, 11, 39, 83,204,226,125,153, 50, 10, 69,202, 56,182,123, 17,190,110,189,153,153,217, 69,214,245,237,252,127, 77, 78,
-208,175,154,248,141,227, 56,207, 9,249, 84, 55,189,229,140,150, 51,158,247,207, 57,141,138,254,221,137,113, 14,206,158, 61,251,
- 35, 78,139,221,220,220,154,200,109,247,148, 41, 83,150,225,107, 55,240,243,244,168, 96,193,130,239,236,237,237,111,101,200,144,
- 97,137,137,137, 73,241, 56,214, 93,102,147,124,151, 77, 78,221, 13,149, 45,100, 26,138,152,238,252, 2, 79,129,167,177, 16,248,
- 25,186,100,172,178,197, 59, 57, 85,184,196,163, 57, 77,191,124,249,178, 31, 17, 73, 9,255,243,177, 89,156,198,232,232, 4, 99,
- 53, 4,119,248, 67, 71,140, 24,241,249,229,203,151, 20, 16, 16, 64,183,111,223,166,201, 3,251, 68,149, 75,147,152, 92,173, 45,
- 67,153, 12,220,115,202,144, 97,117,214, 84, 9,251,176,204, 76, 90,144,210,214,184,150, 76,174,206, 12, 28, 56, 48,228,216,177,
- 99, 33, 95,191,126, 13,137,138,138, 10,121,241,226, 69,200,254,253,251, 67, 10, 23, 46, 28,194,242,186,113, 74,164, 65,174, 94,
-133, 25,102,167, 56, 66, 11, 7, 17,246,170,215,103,201,146,229, 58,223,135,106,213,170,245,133,143,219,203,237, 28, 53,213,141,
- 47, 78,158,213, 76, 97, 81, 59,149,194, 63, 98,201,112,162,153, 61, 9,100, 43, 46, 50,211,165, 75,183,165,115,231,206, 65,207,
-159, 63,167, 47, 95,190,208,147, 39, 79,168, 77,155, 54, 31,248,248, 10,181,123,107,171,123,218,108,217,178,249,159, 58,117, 42,
- 42, 48, 48,144, 14, 31, 62, 28,229,237,237,237,207,215,202, 33, 91,177,100,242, 61,231, 49, 81,219,105, 72,226,107, 22,200, 44,
-103, 76,182,252, 38,138, 39, 97,126,135,136,206,237,165,173,181, 10,210,228, 60, 25,168,102,154,100,129, 69,146, 41, 58, 21, 83,
- 40, 18, 27,208,238,117,138, 21, 43,246,241,202,149, 43,145,111,223,190,165,235,215,175, 71,181,106,213,234, 51, 95,127, 13,123,
-252,198,113,156, 71, 62, 62,222,210,128, 54, 2, 89, 91,228,235,235,203,143, 17, 17, 63, 15,196,196,138, 74,150, 44, 73, 33, 33,
- 33, 56,244,136,211,226,136,136,136,102,114,100,154,155,155, 55,230,118, 14, 9, 13, 13,149,228, 97,131, 62,162,205,166, 79,159,
-254,145, 63,104,118,178, 28, 77, 31, 25,122,117, 62, 14,111, 42, 33, 51, 14,160,233,184, 68,224, 41,240, 52, 22, 2,241, 69,151,
-140, 85,223,223, 33, 7,125,163,106,156,150,156,190, 82, 42,103,131, 62,125,250, 40, 73,213,174, 34, 69,138,156,109,214,172,153,
- 31, 18,255,127,152,207,239, 57,127,254,188, 95,239,222,189, 65,186, 26,232,233,200, 44, 11, 21, 42, 20,248,234,213, 43,202,156,
- 57, 51,101,204,152,145,240, 63,182,115,117,114,211, 1, 79, 5, 61, 61,186,139,246,110, 90, 79,173,108, 19,147,143,173,121,184,
-109,250,244,111,173,172,172, 70,178,220, 4,122, 58,157, 26,158,158,158,193,215,174, 93, 11,185,115,231, 78,200,208,161, 67, 67,
-184,227, 10, 97,162, 16, 82,179,102,205,144,105,211,166,133,132,133,133,133, 44, 88,176, 32,132, 45, 17,215, 88,150, 58,217,210,
-171,132,218,136, 22, 91, 55,166, 50,233,164,123,247,238, 17,203,133,149, 66,185,169,203, 52,183,176,176, 40,111,105,105,217, 13,
-123,206,100,142,140,153, 21,138, 84, 57,204, 21,142,157,114,184,102,217,222,160,116,166,233,165,243,230,174,157, 58, 97, 96,248,
-140,158, 68,181, 28,227, 68,180,208,249,118,237,218, 53, 24, 4, 11, 29, 48, 58,112,236,131,131,131,169, 65,131, 6, 65,108,217,
-170,161,175, 19,103,220,135, 31, 61,122, 52, 2,109,196,123,218,185,115, 39,205,156, 57, 51,138, 9,208, 36, 25, 26, 28,171,238,
-220,217,239,219,187,119,175,223,133, 11, 23,252,206,156, 57,227, 23, 30, 30,238,199,237, 33,165,237,219,183,251,109,220,184,209,
-111,205,154, 53,126, 76,142,165,196,229,246,115,113,113,217,173,118, 31,189,109,148,207, 68,241,244,235,177,173, 68,147, 58,208,
-135,177,237, 40,176,123, 69,122,221,166, 40,205,202,155,129,138,166, 80,108, 83,211, 35,136,215, 40, 51, 73,146, 36, 71, 30, 61,
-122, 20,213,175, 95,191,175, 94, 94, 94, 31, 90,180,104,241, 25, 88, 98,195, 30,191,113, 28,231, 31, 62,124, 24,197, 58,176, 95,
- 31,158, 42,231,199, 40, 73,214,145, 35, 71, 98,200, 17,254, 65, 59,177,222, 74, 22, 45,103,103,231,134,250,100,166, 74,149,170,
- 90,223,190,125, 37,118,166,190, 49,198, 82,123,163,124,252,172,189, 96, 89,105, 13,197, 83, 70, 59,171,103,209,219, 70, 66,166,
- 65, 8, 8, 60, 13,130, 75,111,102,129,167, 94,136, 12,202,240, 51,240, 52,168, 0,127, 88,230, 56,205, 12, 95, 26, 4, 10,214,
-171, 1, 3, 6,128, 72,193,178,149,148, 83,170,232, 4, 11, 65,125,126,209, 75,121, 64,200,162,243,168,214, 93,181, 33,170,172,
- 91,183, 46,108,202,148, 41,196,238, 40,226,206,151,166, 78,157, 42,125,125,191,218,190, 66, 34, 90, 55,250, 55,149,250,139,219,
- 35, 59, 74,191,239,207, 30, 70,141, 26, 53, 10,101,215,136, 42,137, 83,111,220, 52,185,115,231, 14,254,244,233, 83,200,146, 37,
- 75, 66, 56,239, 57, 46,128, 23,167, 36,209, 29, 43,202,219,132, 59,198,160,171, 87,175,134,172, 90,181, 10,150,173,161, 50, 59,
- 29, 88,213, 74,176,187,179,102, 95,251, 36,119, 96,209,234,107,163,184,194,199,188, 57, 89, 71,203,176,227,186, 75,229,102,247,
-205, 81, 45,157,163, 57,147,190, 62, 76, 2,135,112, 7, 56,132, 9,199, 16,119,119,247,126, 85, 93,108, 11,110,110, 80, 38,215,
-135, 97,237,114,209,196,238,217, 38, 84,200, 87,122,117,189,226, 13,154, 59, 91, 29,107,145, 46,121,104, 93,243, 68,193,113,113,
- 29,178,235,232, 12, 44, 88, 74,114,133, 14, 23,150,173, 7, 15, 30, 16, 91,251,136, 45,135, 7,244,117,226,220, 62,215, 33, 99,
-246,228,201, 84,203, 59, 11, 21,181, 72, 77,197, 44, 83, 83,158, 84,201, 63,122, 42, 20,121,244, 40,248,119, 68,235,226,197,139,
-208, 15, 41,177, 53, 72, 74,239,223,191,143, 57,134,227, 31, 62,124,144, 18,200,150,171,171,171,193, 68,171,112,114, 69,225,252,
-201, 21,239, 10,154, 40, 62, 85,177,183,122,209,206,197, 42,242,116,131,130,244,190, 67, 73,154,146,203,158, 96,217,146,217,238,
- 85,146, 37, 75,134, 15,137,158,156, 64,202,155,150, 47, 95, 94, 50, 25, 97,143,223,209,199,187, 70,147, 44, 16,103,229,166,235,
-229,147,144, 93,130, 31, 33, 7,150, 44,190,224, 36,126,195,162,133, 4,215, 97,180,108,117,120, 53,202,204,148, 41,211,109,214,
-251, 24, 2, 8, 43, 22, 91,112,233,254,253,251,196, 31, 29,116,238,220, 57, 98,194, 72,107,215,174,141,100,114,191, 67,102,221,
-245, 52,173,206,211, 63,227,197, 43,100,254, 72,139,124,127,173,192, 83,224,105, 44, 4,126,134, 46, 25,171,108,191, 67,142,254,
- 81,135,108, 89,192,139, 95,117, 27, 11,107, 21,136, 20, 31,212, 53, 17, 87,107, 16,177,104, 87, 34, 92,140, 26, 55,238,252, 23,
-192, 85,216,180,105, 83,242,240,240,144, 18, 91,198,136, 59, 86, 10,185,123, 85, 34, 86,231,234,230,145, 58,141,224, 27, 23,164,
-223,126,141, 10,209,165, 75,151,136,227, 77,246,234, 64,109,219,137, 19, 39, 2, 86,172, 88,241,138,243, 32, 30, 11, 4,171, 0,
-167,169,236, 74, 92,196,123,184, 11, 51,114,178,100, 75,218, 59, 38, 31, 33,236,230, 3,217,114,212, 33,179, 24,151,239, 30, 91,
-192,232,245,235,215,244,238,221, 59, 26, 87,216,157, 64,180, 70,228,201, 24, 53,123,246,236, 47, 61,123,246,252,152, 38, 77, 26,
-196,238,216,177,188, 8,148,187,104,209,162,112,173,125,183,193,130, 5,146,245,249,243,231, 33,220, 25, 14, 97,121, 67,182,110,
-222, 60,164,156,183,123, 83,144, 44,144,173, 10,246,150, 53, 39,149,205,219,246,121,191,150,181, 6, 20,242,186,241,121, 76,151,
- 67,117, 92,108, 84, 45,100,178, 21,199,218,218,250, 37, 44, 47,124,193,119, 9,150, 55,118,225,170,186, 35, 53,202,229,186, 13,
-232, 90,191, 94,100,141,140,246,116,111,202, 64, 10,223,183,138,194,119, 46,161,187, 99,187, 83,213,244, 86, 65, 5,146, 38,236,
- 43,183, 64,176,104,193,146,197,249, 99,136, 22, 72,150, 38,162, 21, 20, 20, 36, 17, 45, 38, 32,234, 68, 75,238,237, 98,242, 21,
- 72,166,112, 45,150, 34,209,185, 11, 77,125, 40,160, 93, 73, 42,111,158, 4, 49,123,113,221,234,243,133, 32, 95,141, 12, 20, 0,
- 87,225, 24, 37,161, 26, 59,118,172,164,227,248,205,199,113, 46,174,155, 57,187,173, 31,180,108,217, 50,130,173,185,175,217, 53,
- 30,120,246,236, 89,130,149, 12,214,199,245,235,215, 19,127, 88, 72, 4, 27,207, 93,165, 74,149, 2,249, 70,197,226,122, 51,113,
-157, 64, 64, 32, 32, 16,248, 21, 8,104,224, 34,191,226,182, 63,255, 30,202,138,169, 84,208,156,239, 58,141,211, 46, 78,232, 96,
-176, 37,200,150, 72, 81,167,100,138,196,151,144,240, 63,142, 69,159,171,202,123,184,102,166,114, 74,175,169,196, 28,159,115, 23,
-113, 45, 28,211, 66, 5, 10, 20,144, 82,241,226,197,165, 88,146,192, 59, 87,105,119, 22, 5, 29,171,158, 77,178,194,188,190,230,
- 71,219, 60, 20,116,176,170, 55,249,251,251, 19,187,171, 30,104, 65, 33, 71,221,186,117,111,178,203,229, 58, 91,105,208,137, 39,
-227,180,252,191,255,254, 11, 57,121,242,228,145,200,200,200,241,252,101,223,150, 99,139,218,243,113, 54,196, 40, 42,140, 25, 51,
- 38,132,235, 9,162, 5,171,132,166,205,155, 59,165, 80,184, 94, 64, 86,216,165, 69,176, 88,245,202,156, 38, 10, 68,107, 96,214,
-244,145, 51,102,204, 8,222,188,121,243,251,229,203,151, 7, 48,185,122,166,180,104, 49,153, 68, 80,252,119, 27,220,133, 76, 30,
- 36,146, 5,194,197,241, 78, 82,178, 73,147,166, 15,220,134, 30,201, 21,249,151,215, 44,222,154,173, 90,205,218,231,116, 25,176,
-186, 78,169,119, 31,134,181,191,229,157, 92, 10,226, 55,120,227,114,156,126,246,236, 25,241, 61, 9, 22, 15, 38, 47, 4,236,223,
-188,121, 35,117,196,106, 22, 45,141,242,157, 21,138,194,149, 51,216, 68,133,239, 93, 73, 52,161, 29, 81,235,124, 68,173,242, 18,
- 13,107, 68,254, 51, 7, 82, 78, 91,155, 47,102,169, 83,191,103, 18, 57,143, 5,184,233, 42, 36,136, 22,220,133, 74, 75, 22,231,
-141, 33, 93,140,137,100,197, 2,193,226,118,246, 99,151,153,223,252,249,243,141, 66,180, 80,166,194, 41, 20,185, 70,231,117,161,
- 15,189,170, 82, 71,103, 75,202,155, 74,145, 70, 71, 89, 75,178,219,112, 29,147, 76, 16,251, 14,156, 76,177,199,111, 28,231,255,
- 75, 26,220, 24, 76,178,148,174, 66,165,123, 15,191, 89, 14, 98, 27,149, 91,123, 38,191,219, 19, 38, 76, 56,159, 15, 84,228, 84,
-158,219,168,148,158,123, 53, 95,180,104,209,245, 57,115,230, 92,231,124, 5, 57,185,194, 53,207, 86, 93,154, 56,113, 34,177,254,
- 75, 31, 49,183,110,221, 34,142,179,163,133, 11, 23, 18,187,205,209, 86, 98, 19, 8, 8, 4, 4, 2,127, 36, 2, 26,184,200, 31,
- 89, 78, 45,133,210,237, 58, 84,175, 28,187,223,166,248,241,198,238,140,125, 44, 80,250,234, 6,177,242,245,201,249, 49,120,197,
- 68,250, 48,207,151,250,228,202,252, 49,154,108,225,116,194, 60,121,242,156,192, 53, 60,210, 9,163,168,190,219,152,104,221, 65,
-103, 95,163, 70, 13,184, 95,168, 66,133, 10,196,241, 83,146,181,232,233,197,179,180, 62,179,130,118,148,115,151, 92, 31,247,206,
- 28,167, 85,110, 10,218, 82,214, 93,114,131,112, 7,124, 95, 75,197,186,115,160,251,145, 81,163, 70, 29,228,243,181, 57,229, 97,
-139, 25, 2,131, 67,134, 13, 27,182,187,156,155,243,226,122, 22, 73,222, 52, 72,107,242,218, 35,137, 98, 10,159, 79,201,247, 14,
- 97, 75, 74, 72,130, 4, 9, 52, 90, 76,216, 10,118, 2,177, 50,236,234,130, 37,237,106,180, 92,151,161,182,138,163,146,235, 48,
-189,226, 50, 31,235,194,238,202,219,220,161, 61,231,125, 24, 58,178,199,143, 31,163,243,212,104,209,131, 69,139,243, 12,102, 55,
-206, 16,182, 54, 12,153, 48, 97,194, 88,182, 64,236,226, 56,168,211,105,205, 83,251,142, 41,157,167, 11, 77,232,209, 26,100,203,
- 43,185, 98,194,253, 62,205,232, 80,203,106, 95, 61, 82, 72,157,174,193, 27,143, 54,172,215,186,117,235, 96,224,205,196, 78,114,
- 23, 34,206, 10,174, 36,198, 61,152,221, 98,112, 3,235,220,138, 36, 79,188,249,246,228, 1, 68, 19,219, 19, 53,244,136, 73,159,
-235,185,211,232, 14,255,209,105,174, 51, 72, 50,199, 94, 69,241,104, 55,184,188, 56,220, 76,243, 6,162,133,120, 44,109,238, 66,
-118,109, 30, 98,162,181,157,227,178, 54,177,206,109, 98, 82,176,157,221, 98, 24,209,247,195,155, 79, 82, 69,214,209, 5,220,232,
-195,192,250,212, 57,179,181, 46,162, 85,167, 94,189,122, 1, 28,147, 22,204,245, 66, 92,223,123,142,101,187,143, 61,126,227, 56,
-206,115,129, 84, 71, 3,234, 45,159,210, 85, 8, 75, 22,220,131,209,150, 44,232, 34, 92,239,157,248,247,241,142, 29, 59,250,241,
- 71,129, 31,235,190, 31,147,248,109,236, 82, 31,194,164,172,178, 30,225,139, 56,255,245, 42, 85,170,128,104, 57, 33, 47, 91,108,
-223,140, 28, 57,146,118,239,222, 77, 28, 76, 79, 32,219,104,115, 88,184, 14, 30, 60, 72, 28,211,133,188, 98, 19, 8, 8, 4, 4,
- 2,127, 36, 2,127, 9,209,210, 60, 67,188,122,229,248,235,122, 25,226,174,152, 8,193,242,128,184, 44, 5,172, 88, 65,203,198,
- 19,117, 45, 69, 65,109, 10,211,165,110,181, 8,199,162, 91, 43,105,237,218,181,165, 88, 45, 92,171,169, 5,153,104,205, 65,220,
- 8, 58, 2, 14,200,150, 18, 19, 36, 41, 32,254,234,145,253,180,216, 85, 65,107, 75,186,209,141, 27, 55,232,204,182,245, 52,223,
- 69, 65, 27,106, 23, 38, 38, 82,176,192,104,115, 29, 78, 96,130,179,174, 78,157, 58,171,249,158,136,153, 90,200,191, 67, 58,117,
-234, 4,139, 85,147,154,166,138,151,116,122, 39,209,140,238, 84,205, 52,193,107, 62,150,132,221, 44, 8, 30, 14,225, 78,231,161,
-166,114, 50, 17,147,162,158,121, 36, 87, 20,159, 79,173,204,163, 33, 24,222,156, 73,217,126, 14,136,150, 12, 21,236,194, 1,209,
-130,101, 65,211,102,206, 49, 71,125,152, 64, 12, 25,207, 27, 91, 30, 30,178,101,233, 25, 19,194, 75,167, 78,158, 60,231,153,217,
-237, 4,200,150,123, 74, 69,214,226, 54,166,123,162, 38,244,160,241,165,114,147, 91,170,239, 2,152,191,147,157, 63, 73,162,150,
-197,147, 39,190,224, 99,146,240, 37,239,253,242, 38, 73,244, 31, 50, 49, 57, 93,215,164, 73,147, 96,144, 44, 4,235,115,192, 57,
- 85,171, 86, 45,152,143,195,157,170,119, 43,152, 44,209,179, 79, 91,230, 17,181, 45, 24, 67,178,190,214,119,167, 35,213,189,233,
-250,181,171,146,181, 4,214, 70,180, 31, 91, 81,162, 56, 0, 95,125,148, 96,204, 61,148, 68, 75,131,187,240, 12, 8, 22,167,101,
-236,226,154,149, 53,107,214, 73,121,243,230,157, 52,110,220,184, 89,140,215,116,189,133,212,159, 33, 97, 17, 19,197,146, 99,109,
- 42,209,135, 17,255, 81,149, 52,201, 49,157,130,198,141,201,233, 94, 38,253, 33, 28, 59,245,174, 97,195,134,111, 48,106, 21,122,
-130, 61,126,227, 56,206,179,222,108,213,127,219,255,231, 80,139,201, 82,181, 98,245, 96,203, 86,204, 40, 94, 12, 6,224,248, 69,
- 63,198, 97, 27,223,119,200,224,193,131,117, 17,173,148, 76,218,174,112,217,174,163,220,209,119, 99,206,159,251, 43,158, 31,108,
-248, 88, 64, 76, 30, 8, 22,187,213, 37, 75, 38,199,128,105,116,109, 27, 82, 31,145, 87, 32, 32, 16, 16, 8,252, 44, 4,254, 2,
-162,165, 30,167, 21, 27, 42, 85,191,168,146,104,129, 60,113,174, 24,162,245,126, 74, 79,122,223,178, 0, 93,168,229, 77,155,106,
- 23,140, 69,180, 64,202,116, 17, 45,150, 83, 97,238,220,185,225,123,246,236,161,246,237,219, 75,137,173, 33,146,197,106,247,228,
-225, 52,221, 89, 65,235,219,214, 38,196,153,236, 26,221,143,214,212, 44, 72, 71,150,206, 33,254, 98,255,156, 52,105,210,234,154,
- 26,150, 45, 51, 83,217, 18, 48, 35, 87,174, 92, 83,248,124, 34,238,236,159,163,143,225,192,119, 16,173,132, 53, 76, 21,175,105,
- 70, 15,105,244, 94,213,148, 10,116, 50,150, 21, 43, 86, 12, 97,130,128,243, 11, 53,201,100,247,202, 21,182,190, 72, 29, 20,255,
- 15,171, 23, 2,191,147,246, 79,175, 56,126,113, 72, 43,234,109,163, 56,203,191,203,176, 59,112, 23,130,249,249,254,180,101,203,
- 22, 88,191,190,242,113,213,145, 98,234,226,165, 81,135,236,134,218,202,193,240,119, 63,126,252,120, 9,110, 51,144,143,181,107,
-214,156,131,101,139, 47, 72,208, 53,151, 91, 8, 77,236, 65, 77,221, 51,232,141, 39, 42,154, 44,209,246, 41, 37,115, 5,135,204,
- 31, 74,116,100, 35,133, 76,235, 69, 19, 10,103, 9, 42,150, 60,209, 22,220,156,203, 95,155,203,117,132, 99,182,158,113, 39,123,
-136, 73,130, 94, 75, 22,174, 75,148, 40, 81,165,156, 25,157, 66, 95, 44, 28, 77,212,166,128, 68,180, 62,212,201, 76,247,170,184,
-208,172,166, 85, 99, 72, 22, 98,128,208,134, 72, 44, 27,214, 30,141, 27,136, 22, 70, 23,242, 73, 41,169,184, 11,183, 51,137,158,
-207,238,194,209, 60, 56,160, 47,231,233,194, 3, 38,186,108,218,180,169, 47,143,148, 27,240, 35, 15,115,190,148,138,116, 69, 83,
- 36,216,184,170,126,201,224,144,233,189,163,118, 52, 46, 77,133, 77, 20,195,117,200,172,204,109, 3,203,104, 23, 78,165,153,188,
- 7, 64,151,176,199,111, 78,237,184,253, 14,241,222, 80, 43,227, 24, 4,190,171,196,101, 73, 69,128, 37, 11,207, 11,147, 74, 63,
-214,215,115,236, 54, 28,194,135,235,243,126, 44, 99, 2, 87,183, 86, 11, 33,159, 43,198, 4,255,236,129, 3, 7, 46,243,255,192,
-169,107,187,118,237,174, 47, 93,186, 52,128,201,234,103,190,254, 37, 91, 4,223,193,138,137,196,238, 69,105,207,207,135,222,216,
-188, 31,193, 92, 92, 43, 16, 16, 8, 8, 4,126, 20,129,191, 54, 70, 75, 9,140,178,130,236, 50, 25,199,150, 33, 63,142,163, 58,
-195,231, 98, 92,135, 61,188, 50,134,156,106, 85,150, 54, 84,205, 77, 13,211,167,138,229, 58,204,151, 47,223, 33,118,141,249,177,
-149,103,166, 22,160,205,120,228, 93, 16, 92,133,236, 30,145, 70, 28,226,127,196,146,172,108, 85,147, 22, 87,202, 77,187,215, 44,
-163, 5, 51,167, 83,187, 98,185,169,108,174,172,225, 14, 25, 50,188,225,206, 13,157,142,198,141, 71, 3, 14,102,162, 51, 40,103,
-206,156,253, 57, 67, 34,118, 7,238,100, 55, 84, 72,169, 82,165, 64,164, 82,151, 73,174,168, 91, 43, 85,130,215,176,108,213,254,
- 54,241,231,112,142,171, 82,198,104,181,213, 34,182, 8,187, 31,195,209, 49, 34,166,137, 99,186, 16,192, 31, 53,160, 82,177,240,
-169, 61,219,211,188, 62,157,137,131,225,165, 32, 99,140,152,156, 55,111, 30,113, 80,114,216,232,209,163,175,178,181, 8, 49,106,
- 58, 55, 38,177, 59,224, 70, 3,193,186,123,247,174, 31,199,106,249,113,135,233,199,157,224,126,107, 11,139, 85,206,182, 54,212,
-179, 84, 65,202,156, 50,209, 26, 93,130, 10, 36, 73,212,100, 90,153, 60,193,116,116, 19, 15, 97,107, 44, 5,189,211,194,225, 20,
-190, 96, 8, 13,207,237,250, 33,119,162, 68,141,245,149, 69,203,249,242, 62, 62, 62, 33,199,143, 31,167,166,149,203,209,219, 62,
-181,201,191,102, 38,186, 90,209,153, 14,150,116,160,209,133, 51,209,137, 19,199,165, 0,107, 16,204,213,171, 87, 19,207, 93,166,
-215,162,197,228, 41,134,104, 33, 38, 11,238, 66, 78,203, 64,178,216,229,213,133,201, 70,163,201,147, 39, 87, 99, 43,103, 53,198,
-188, 17, 19, 67, 57, 43,161,103, 96,247,235,100, 78, 79, 57, 77,231, 0, 61,215,130, 73, 20,121, 10, 38, 87,244,110,224,148,246,
-200,205,209,221,110,132, 46, 27,243,228,202,128,255,222, 85,178, 74,126, 59,151, 66,145,194, 0, 76, 16,155, 8,226,165,139, 60,
-203, 17,151, 24, 46, 67,108,216, 43, 47,224,255,165, 15, 19,236,149,207,152, 28, 97,209,121, 90,178, 5,108, 37,147,171, 13,252,
-123, 22,239, 47,115, 12,220,117,182,188,193, 53,232, 18,157,199,149, 7,116,188,227, 1, 45, 52,107,214, 44,226,152, 66,226,231,
- 26, 68, 81,108, 2, 1,129,128, 64,224,143, 70, 32,158,146, 45,238, 98,164, 77, 57,159,150,222,121,180, 28, 56, 51, 2,103,247,
-112, 66,160, 59, 54, 93,193,240,232,148, 96,253, 65, 48,175,141,182, 22,100,146,209, 11, 36, 6,177, 35,112, 57, 97,100, 84,183,
-255,154, 70,150,201,100, 23,149,201,206,230, 35, 91, 94,110,219, 90,165, 89,156, 51,165, 52, 82, 48,131, 12, 77,104,202,193,190,
-173, 89, 38,220,101,184,239,127,220,241,135,236,219,183, 47,132,173, 50, 24, 17,136,169, 29,176, 33, 30,166, 9, 91,199, 66, 56,
-192, 61, 4, 29, 16,255,214,213,233,214,230, 64,253,247,187,118,237,146, 44, 86,234, 27, 38, 91,133, 21, 7, 35,189, 88, 78, 99,
- 38,118,135,121,228,227, 97,158, 91, 12, 29,159,206,141, 9, 65, 63, 30, 73,121, 30,164,116,199,142, 29,126, 43, 87,174,244,107,
-219,182,237, 21,238,112, 63,113, 60, 85, 20, 98,107, 46,113,124,152,135,187, 59, 70,165, 57,105, 19,198,110,219,179, 65, 11,134,
-211,231, 17,205,232,115,117, 7,137,104, 5, 79,234, 69,254, 29, 75,211,237, 14, 21,168, 68,242, 68,167,244,149, 69,211,121,182,
-234, 96,110, 52,105, 14, 38, 88,172,154, 48,217, 58,213,178, 52,113,192, 27, 45, 43,230, 76,147,202,102,167,114,197,124,164,206,
- 27,238, 72,182,172, 68,113,157,244,198,104,241, 20, 3, 18,209,226,118,145, 2,223, 89,254,182,167, 79,159,206,228,182,232,195,
- 86,152,134, 76, 86, 75,150,112,118,234, 83, 42,181,201,237,210,102,201,239,185,167, 74,137,249,186, 84,231, 79,139, 85, 92,115,
-198, 38,147,171,107, 48,187,196,162, 48,104,129, 93,164, 81,158,238,153, 63, 79,172, 91,126,195,195, 5, 99, 54,124,222,181,116,
- 79,232,150,121, 39,214, 53,175,124,185,120,202,132, 75, 11,154,198, 76,199, 17, 23, 88,112, 13,116,124, 51, 39,229,168, 67, 12,
-166,216,162,242, 91,147, 92,105,114, 82, 13, 22,173,132,106, 68,203,160, 50,113, 12,101,247,173, 91,183,250,114,108,220, 56,142,
- 27, 91,192, 22,194, 29, 76,178, 46,179, 16, 76,156, 10,204,176, 58, 66, 21,182,102, 6,176,245, 20,147,205, 98, 66,221, 96,182,
- 12, 27, 58, 98,210,160,114,137,204, 2, 1,129,128, 64,224, 31, 70, 64, 61, 54, 75,142,177, 64, 49, 18, 83, 54, 68,207,161,213,
- 78, 7,120,173, 49, 5, 4,166,130,224, 60,170, 49, 40, 26, 47,225,121,135, 54,193,109,200,115,105,133,176, 5,104, 83,146, 68,
-137, 90, 58,240,200, 48,206, 28,151,161,238, 62,108,161,170,198, 22,178, 74,124,125,126, 78, 73,120,196,221, 11, 38,113, 33, 76,
-124,164,217,224,153, 4,188,198,196,165, 28,184, 30,194, 95,253, 33,221,187,119,135,181, 75,142, 11, 45, 57,231,235,192,238,201,
- 77, 28,215,117,121, 96,213,146,225,227, 58,183,164,166,110,214,184,126, 6, 39, 88,218, 44,112, 79,118,177, 30,224,216,152, 61,
-124,159,185, 50,148,204,142,137,197, 65, 38,132,231, 49, 81,103,175, 94,189,206, 51, 1,125, 6,146,197,211, 63, 16, 91,186,164,
- 32,115, 38, 97,145, 76,122,180,198, 41,249,152, 36,122, 73,123, 87,104,156,194,225,233,128, 70, 84, 56, 89, 66,173,241, 72,186,
-202,200, 86,194,119, 8,162, 7, 17,134, 91,119,195,134, 13, 84,190, 80, 62, 90,211,182, 38,173,248,175, 26,141, 47,159,143,242,
-167, 78,254, 49,125,234, 84,231, 57, 62,232,181,220, 81,135,152,132, 84, 57,186,144, 9,128, 31, 19,172,141,140,215, 36, 38, 12,
- 93, 96,201, 2,201, 26, 85,174,208,167,208,253,235, 40,120,237, 12,234,155, 59,243,103,149,193, 22,223, 21,217, 62,109,154,229,
- 71,120,182,122, 37, 9, 6, 65,221,188,105, 19,213,173, 80,230,242,135,221,171,230, 31, 27,210,113,117,247,220,153, 55,243,220,
- 90, 32, 72, 90, 9,155, 82,112, 46,142,135, 43,106,150,112,102, 69,199, 52, 47,125,204, 19,206, 40,144, 58,214,242, 82,117,217,
-234,118,159,239,245,146, 9, 33, 6,102,172,192, 94,229,119,115, 45,152,198,140, 56, 84, 25,105, 8, 61, 31,204,177,138,146, 69,
- 11, 46, 68, 92,155,195, 84, 97, 85,204, 60,225,252,170,174, 54,111,177,199,111, 77, 50,157,146, 42,220,125,172, 83, 30,171,230,
-102, 27, 92,220,222,252,232,138,197, 11,199,177, 59, 28,241,113,208,149,225,172, 75,199,234,215,175,127,125,217,178,101,215, 89,
-231,195, 48, 24,130, 39, 88,253,200,131, 84,116,185, 77,101,168,173,200, 34, 16, 16, 8, 8, 4, 4, 2, 58, 16, 80,183,100,201,
- 34, 90, 85, 48, 9, 41, 58,131,232,185,180, 52,185,162,170,130,136, 33, 79,244,236,240,234, 19,152,105,154,208,204,151,103, 24,
- 39,126,241,195,250, 21,151, 77, 85,102,250,234,213,171, 23, 96, 11, 73, 94, 38,110,121, 89, 24, 44, 87, 14, 76,174,238,179,165,
- 40, 4,147,152, 34,206,134, 59,225, 16, 38,130, 33,108,165, 2, 73, 82,126,245,171,222, 91,239,196,107,136,209, 58, 55,240, 63,
-194, 94,173,208,141,120,152,253, 46, 14, 60,222,198, 49, 81,189, 85,206,233,146,233,192,214,187,193,176, 30,113, 89,251,243,254,
- 37,226,194, 64,178,224,146,131, 5, 2, 35, 25,249,248, 51,181,123,197,200, 44,149, 34,241,233,247,227, 58, 80,212,162,145,244,
-117, 90, 63,137,112, 5, 78,238, 75,111,102, 13,165,115,173,202, 81,241,228,137, 78,202, 4, 55, 86, 57, 65,156,216,205, 23,197,
-110, 77,130,249,150, 9, 31, 6, 6,144,187,157,237,151, 2,201, 18,250,251,152, 36,222, 19,151, 9, 75, 65,180, 96,201,226, 32,
-109, 63, 38,174,126,236,106,222,200,174,233, 73,136,201,130,187, 16,150, 44,144, 44,234, 85,129,168, 67, 17,186,215,178,184,106,
- 12, 32,170, 18,123, 18, 84, 27,155,103,202,217,218, 57,222, 77,138, 65, 66, 92, 93,122, 43,171,160,162, 41, 18,181,230,120,172,
- 98,133,121, 57, 35, 61, 24,196,200, 44, 97,158,112,241,233, 89,163, 35, 63,237, 90, 70,171,154, 86,136, 40,110,145, 80,213, 5,
-190, 6,164,138,173, 66, 15,177,103,242,249, 20,123,142, 75,148,126,243, 61, 48, 24, 67,185,197,200, 84, 11,132,199, 32, 4,144,
-172, 14,202, 32,120,236,249,183, 52,137, 42,147,171, 37,103,230,142,143,250,178, 99, 9,173,107, 81, 41, 18,191, 53,201, 44, 97,
-145,120,219,133, 69,147,233,235,158, 21,180,169,115,195,200, 34,233,205,142, 48, 9, 28,223,165, 75,151,141,172, 51, 87,216, 2,
-123,157, 9,242,117, 94,126,231, 58,175,123,120,156,137,215,101,254, 88,208,228,126,215,171,243, 50,245,199,160,231, 72,200, 52,
- 8, 1,209, 70, 6,193,165, 55,179,192, 83, 47, 68, 6,101,248, 25,120, 26, 84,128,191, 37,115, 3, 16,168,104,107,213, 14,182,
-196,236,226, 81,121,126, 72, 60, 55, 21,102, 65,223, 6,171,215,160, 65,131,208, 97,232, 91,130, 71,137,137, 49,137, 22,100,230,
-229, 14,214,145,201, 14, 92,141,152,177, 29, 27, 8, 87, 23,182,158,157,224,209,107, 33, 28, 55,134,121,184, 48, 27,188, 54,159,
-169, 94,133,209,178, 4, 79, 5, 30, 29,182,131, 9,196, 22,238, 52,225, 54, 84, 13, 96,214, 43, 83, 9, 8, 44, 87, 60, 8, 32,
- 18, 83, 68,128,216,192,138,196,228, 67,147, 69, 43, 70,102,190,164,137,234,141,204,155,233,195,231,105,221,233,109,219, 98,148,
- 52, 81, 34, 10,152, 49,132,174, 52, 46, 64,109, 29,204, 62,228, 73,148,168,174, 76, 37, 84, 47,167, 27, 91, 5, 67,121, 90,131,
-168,109,219,182, 17,147,108, 76,175,129,117,254,138,201,148,135,108,177, 73, 17, 7,195, 51,233,149,150,214, 65, 98, 43, 36, 92,
-166,219, 38, 77,154, 52,147,221,199,125, 56,190,173, 33,220,133, 31,230, 12,166,200,214,249,233, 69,173,204,116,176,176,181, 78,
-162,197, 68,117, 2,187, 13, 35,225,226,228, 24, 55,226, 25,255,137,219, 32,202, 58,109,218, 57,113, 41,103,101, 23,235, 15, 95,
-214, 76, 38,170,237, 68, 47,170, 56,147,143, 89, 66,140, 82, 85,110,188, 54,181, 98, 19,167,121,106,150, 44,204, 53,135,227,170,
- 11,138,199,212, 29, 11, 68, 51, 17,195,146, 58, 24,216,160, 92,246,105, 49, 31,219,198,101,199,188,115,112,207, 75,150,220,202,
-206,214,129,159,215, 78,149,238,255,188,178, 19, 21, 78,157,224,189,202,253, 99,100, 86,117,183, 15, 13, 91,135,124, 25,233,121,
-231, 10, 84,202, 42,249,123,142,215, 26,202,115,143,173,100, 66,124,142, 73,215, 5,190, 14,107,144,214,139,126, 14,180,193, 33,
- 91, 63,227,130,167, 1,215,232,203, 42,202,169, 15, 33,195,206, 11, 60, 13,195, 75, 95,110,129,167, 62,132,254,157,243,234, 35,
- 14,245,198,104,169, 66, 3, 69,130, 75,112, 54,199, 67,197, 12, 71,199,255,124, 12,157, 26,230,142,210,230,138,211,164,132, 3,
-163, 45, 90,114,220,108,154,154, 72, 93,102,114, 30,117,152,130, 93,119, 24, 29,169,169, 98,122,221, 70,124,157,222,135, 69, 19,
-209,226, 78,109, 10,187, 35, 55,242,168,174,117, 28,123,164, 30, 52,173, 87,166, 74,229,156,216,250,241,158,201, 71, 20,172, 72,
- 28, 92, 30,201, 35,199,208,209, 58,169, 1, 16, 75, 38,143, 58, 92,223, 51,139,125,208,249,198,108, 1,234, 82,149,142, 53, 42,
- 78,173,237, 83, 5, 21, 77,158,104,173, 1,186,173,169,156,110, 28,156,191,136, 9,106, 16, 91,233, 48,151, 90, 33, 3,228, 33,
-107, 44,153, 24,197,138,145,135,170,137, 45,144, 27,153, 44,205, 96,139,222, 64,182,162,181,113, 77,158,108,114, 23,119,187,207,
-151,171,123,210,126, 38, 89,141,172,146,169,187, 14,213,203,105,203, 36,250, 45,147, 54,137, 16, 34, 86,140, 71, 42, 6,105,192,
- 76, 87,209,255,111,209,178, 72,180,118,125,205, 2, 81,254,149,236,105, 76,150,212, 81, 37, 44, 19, 45,214,114, 33,226,156,182,
-112,210, 54,225,109,140, 76, 30,249, 55,135, 73,213, 98,142,209,130, 44,229,135, 72, 25, 94,139,115, 8, 31, 31,130, 61, 31, 47,
-135,251, 20, 53, 79,184,124, 69,181, 60,145, 47, 42,218,209,232, 44,169, 34,241, 91,229,254, 49, 50, 75,165, 73,188,121, 75,203,
- 74, 81, 47, 91, 22,166,193,110,166,145, 5,210,152, 28, 96,139, 21, 70, 74,194,226,156,143, 19, 38,237,149,179, 25,162,159,114,
-228,125,215,238,114, 47,210,147, 79,148,211, 72, 64, 70,139, 17,120, 10, 60,141,133,192,207,208, 37, 99,149,237, 79,144, 35,203,
-117,168, 94,208,244,108,121, 89,196,147, 74,174,115,114,114, 90,199,195,249, 17,172,140,160,121, 89, 29,153, 74, 38, 87,142, 79,
- 9,226,142, 60, 71, 28,145,208,212,184,233, 88,150, 61, 39,245,133,115,229,222, 66,175,194, 12,179, 85,116,188,211,187,238, 37,
-236, 85,132,230, 99, 11, 7,136,166,166, 33,255,122,101,170, 21,206, 9,150, 45,184, 11,163, 99,179,156, 52, 20,254, 59,153,108,
-185,106,200,129,239, 39, 11, 37, 75,248,170, 68,242,196, 39,242, 38, 74,164,201,178,104,104, 27,201,197, 77, 91, 62, 67,235, 14,
- 57,186, 6, 91,104,235,196,165, 81,135,140,215, 11,140, 58,228, 76,154, 48,147, 85,247, 28, 41, 20,182, 37, 45, 18,109, 46,148,
- 58,193,199,146,230,137, 54,228, 73,169,125, 80,135, 1, 58,159,139,173,108,205,152, 84, 53,227,121,228,106, 71, 95, 7,226,159,
- 13,243,100,241,241,202,202, 25,224, 49, 29, 69,113,139, 68, 43, 11,155, 37, 8,196, 30,191, 85,238, 19,131, 39,202, 89,130, 73,
- 33,242,113, 76,217, 74, 71, 19,105,121,169,184,108,113,105, 35,125,247, 17, 50,245, 33,100,216,121,129,167, 97,120,233,203, 45,
-240,212,135,144, 97,231,127, 6,158,134,149,224,207,206, 29, 39,162, 21,151, 42,253,140,134, 16, 50,227,210, 18,218,175, 17,120,
- 10, 60,141,133,128,208, 37, 99, 33,249, 77,142,192, 83,224,105, 44, 4,226,139, 46, 25,171,190,191, 67,206, 15,185, 14,127,164,
-192,241,165,113, 69, 57,127,164,149,191,191, 86,224, 41,240, 52, 22, 2, 66,151,140,133,164, 32,111, 66,151,254,124, 93, 50,110,
- 9,255, 32,105, 80, 62, 77,201,144, 34,106,147,161,235,184, 62,249, 66,166,230,118,137,107,123, 9, 60, 5,158,114,117, 64, 60,
-155,186, 45,192,114,113, 84,230, 19,120, 10, 60, 53, 33, 96,168, 30,201, 33,138,241, 69,166, 18,143,184,246,103,250,158,169,127,
-234,188, 28,197, 48, 20, 16, 33,211, 80,196,116,231, 23,120, 10, 60,141,133,128,208, 37, 99, 33, 41,172, 79, 66,151,254, 77, 93,
- 50,110,173,255, 17,105,226, 97, 49,110, 67, 11, 60, 5,158,198, 66, 64,232,146,177,144, 20,164, 72,232,146,208, 37,227, 34, 16,
- 63,165, 25,182, 4, 79,226,124, 35,252, 21,185,124, 9, 9,255,243,108,152, 9,117, 37,158,180, 10,243, 12, 97,193,218, 39,209,
-255,171,154, 5,165,255, 89,206, 62,150,231,135,132,255,245,202, 84,203,175,130,123,204, 67,205, 50, 18,105, 40,107, 34, 28,151,
-147, 52,201,252, 25,229,140, 47, 50,141,168,219,241,238,197,155, 36,255,255,117, 30,255,235,211, 31,245,252,154,116, 73, 53, 79,
-202, 34, 99,222,100,175,191,168,159,174,100,234, 51,246,141,242,185,147,174,253,255, 22,131,167,161,207,102, 6, 91,219, 50, 60,
-178,241, 9, 18,254,255, 85, 58,111,128, 46,229,225,188, 91, 57, 29, 81, 73, 83, 52,149,211, 0,153,250,178,198, 59,253,212, 87,
- 33, 3,206,139,186, 27, 0,150,140,172, 2, 79, 25, 32,253, 35, 89, 12, 92,130,135, 9,150,223, 19,162, 35,119,136,137,214,112,
-114,169, 62,119,181,122,114, 44, 55,122, 83,106,187,108, 15, 44,172,157, 2,249, 37, 30,179, 20, 74, 52,225,250,142,104,129, 96,
-177, 76,191,163,119, 73, 34, 91, 60, 47,132,133, 73,210,164, 35, 44, 45, 45, 79,241, 44,241, 33, 72,210,255,124, 12,231,212,243,
-107, 35, 90,232,152,148,101, 77,148,119, 56,121, 84,159,219,205,173,234,236,190, 41,210,103,219,157, 32,177,201,126,158, 92,171,
-154,175, 66,145, 84, 83,199,169,241,101,174, 90,206,236,125, 47, 50,113, 44,157, 50,121,242,222,246,118,118, 59,184,158,143,120,
-254,167,199, 86,188, 48,116,210,196,137,123,227,156,130,243,168,214, 75,175, 76,150, 95,155,203,195,179, 87, 54, 52, 75,149,106,
- 33,215,249, 54, 18,254,199, 49,156,147, 83,119,245, 60,250,136,171, 44,153,198,123, 26,226,223,203,135,245,232,193, 27,162, 27,
- 47,137, 76, 10,142,162,108, 13,151,174, 65,114, 47,213,245,136, 93,134,140, 95,144, 50,151,232,124, 68,121, 60,121,161,209, 49,
-249, 37,114,164,129, 20,225,184, 82,102,222,150,107,104,195,185,240,161, 72,173,122, 79, 94,235,236,226, 22,130,132,255,149,199,
-145, 71,153, 95,151, 76,253,207,230,216,141,102, 25, 11, 95, 51,177,116,126,206,243,179,197, 44,214, 9,178, 37, 71, 63,121,158,
- 20, 75,158, 69,117, 80,226, 68,137,246,243, 82, 73,239,177, 54,104,146,196,137,247,225, 24,206, 25, 89,151,150,171,175, 37, 26,
- 77,184,190,127,135,252,203,250, 41,234,110, 12, 4,226,223,123,201, 24,181,254, 38, 35,190,212,221,120, 53,254,245,146, 12, 92,
-130,135, 59, 8,144, 44,223,237, 68,165,186,110,167,117,231,163,118,168,166,218, 45,135, 92,243,246,206, 22,137, 25,185,177, 46,
- 30,207,106, 30,243,174,212, 69,180, 64,178, 88,166,159,194,185,246, 93, 94, 83,239,237,236,217,179,195,121,233, 26,194, 82, 42,
- 95,191,126, 37,204,140,206, 51, 92,135,227, 28,242,196,228,135, 37, 76, 67, 71, 6,242,132, 14, 73, 89,214,236, 77, 86,196,116,
-102,110,238, 94,111,121,109, 61,194, 2,201, 37, 74,148,120,195,157,196, 48,158,152, 40,163, 42,225,210,214,233,224,190,255, 77,
- 56,125,195,220,218,225,107,199,142, 29,131,148,179,164,243,108,222,116,252,248,113,226,245,249,104,248,240,225, 81,149, 42, 85,
- 10, 78,102,154,230,235,236,117,167,111, 72,245,210, 82, 78, 28,143,169,139, 71,171, 27,188, 70,224,157,102,205,154,125,218,189,
-123,183,180,158, 32, 18,254,231, 53,233, 62,225,156,130,243,232,171,123, 44,153, 44,223, 68,161, 40,146, 62, 93,186,185, 60,171,
-251, 41, 38,131, 79,145,240, 63,142,225,156,122,126,141,117, 55,158, 98,198,151,135,250,255,229,100, 61, 2,201, 90,199, 83,242,
- 86,238,187, 55, 70,231, 51,186,184,125,229, 73,105, 9,203,252,216,103,112,140, 88,119, 54, 66,122, 22,144, 71,153, 95, 23, 41,
- 82,230, 73, 90, 96, 36,121, 86, 30, 55,212,220, 33,207,190, 84,169,205, 34,148, 15, 76,106, 51,179, 8, 28,195, 57,182, 98,201,
-146,169,235,217,108,222, 99,234,197, 82,165,203,134, 97, 9, 37, 60, 83,231,206,157,139,121, 54,117, 17,173, 24,125,115,169,123,
-151,243,189,228,245, 39,233, 34, 47,110,126,239,222, 61,226, 5,208,165, 61,175,190, 64,188, 78,229, 75, 5,231,209,171,159,242,
-117, 41, 59,103,125,209,188,117,103,218,176,235,184, 84, 86, 65,180, 98,192,139,127,207,145,252,118,215,151, 83,212, 93, 31, 66,
-134,157,143, 47,120, 26, 86,171, 63, 39,183,225,115,102,193, 61,145, 52,255, 72,137,100,165, 46, 58, 62, 80,213,154,101,238, 90,
-234, 18,147, 4,105,225, 99, 44, 60, 12,210,129, 5,115,121,145,100, 98,146,240, 89,175,235,208,165,254,157,204, 30, 94, 17, 79,
-159, 62, 37, 44,120,139,151,247,132, 9, 19,136,215,102,163, 45, 91,182, 16,142, 35,185,185,123, 70, 40, 56,175,210,213,168,141,
-104,161,172,176,186,129,100,165, 44, 50, 54,208,189,250,156,158,176,104, 37, 76,106,250, 18,242,158, 61,123, 70, 88,112,248,245,
-235,215,196,147, 68, 70, 37, 78,150,118,178,146,108,105,146,169,116,243,165,181,207, 18,122,225,194, 5, 90,178,100, 9,229,207,
-159,159,120, 22,114,226, 53,250,136, 23,170, 38, 94, 68,154,120,217, 33,105, 61,194,185,115,231, 82, 82, 51,251, 80, 93,229,140,
-113, 29,186, 53,187,101,149, 46,125,196,177, 99,199, 98, 44,128,234, 95,243,135, 14, 29,138, 66, 30, 5,231,149, 37, 51,115,139,
-155,105,237,221,131,120, 33,225,247,232, 92,121, 45,193, 24,145,104, 35,116,150, 76, 8,223, 33,143,130,243,234,146,105, 68,157,
-141, 47, 15,117, 76, 57, 85,221,124,169,139,142,123,167,180, 92,217,218, 59,126, 5,201,194, 7, 5, 47,139, 68,102, 25,114,221,
-197,185, 84, 69,199,190,213,231,230, 83,149,153,216,189,201,123, 37,129,193,179,162,220,240,252, 40, 9, 12,242,232,147,169,235,
-217,180,244,168,124, 22,171, 46, 96,221, 76, 44, 80,142, 53, 51,241,108,214,171, 87, 47,138,159,205,247,122, 93,135, 76,160,138,
- 20,241,137,130, 94, 67,111,248,121, 33, 94,223,145,234,212,169, 35,213, 29,207, 18, 82,249,242, 21,162, 64,182,140,160, 75, 88,
-126,104, 81,191, 33, 99,233,214,179,143, 4,178, 37,136, 86,172,167, 48,222, 61, 71,255,242, 59, 68,212,221,136, 8,196, 63, 81,
- 74,107,150,246,146, 99,217,151,232, 84, 12,185,224,134, 2,185,194,151, 59,246, 74,183,148, 25, 91,132,114,230,204, 25,142, 14,
- 28, 86,172,246,237,219,127,156, 58,117,234, 33, 94,159,111,125, 68, 88,216, 2, 59, 91,219, 9,200,171,233, 78, 56,238,164, 80,
-152,167, 76,153, 50,224,201,147, 39,180,115,231, 78,169, 19, 88,177, 98, 5,237,218,181,139,246,239,223, 47,237,209, 9,241,250,
-137,210,226,202,108,217, 10,192, 53, 58,100, 74,177, 88, 32, 87,112,191,192,109,136,223,150, 10, 69, 22, 46,103, 36,175,163, 71,
-188, 68, 11, 45, 93,186, 84,146,249,230,205, 27, 74,108, 98, 26,160,129,104,197, 20, 89, 89, 87,182, 6, 5,160,158, 14, 14, 14,
-196, 75,156, 16, 91,136,200,221,221,157,120, 33,100,170, 80,161, 2, 53,108,216, 80, 34, 91,200,147, 60,121,242,152, 56, 54,109,
-117,231, 40,185, 20, 92,159, 39,126,126, 88,197, 72,243,198,235, 1, 74,101,220,179,103, 15,234,254, 4,215,232,194, 51,133, 66,
-145, 59, 91,182,108, 1,184, 6,157, 43,112,189,122,245, 42,221,188,121, 83,250, 31,242,148, 27,240,100,178, 24,128,107,180,201,
-140,127,186,109,188, 18,107,139,201,114,180,177,169,192, 75, 7,125,194,250,147,207,159, 63,151,136, 55, 43,248, 72,245,252, 90,
-218, 93,210, 79, 94, 19,167,108,145, 34, 69, 34,149, 4, 6,235, 71,150, 43, 87,142, 9, 75,121, 26, 50,100, 72, 12,129, 97,189,
-138, 68, 94,125,250,169,233,217, 52, 87, 40, 28, 43, 87,174,252, 9,122, 0, 11, 41,175, 75,250,140, 93,209,141, 76, 21, 10, 47,
-126,168, 77,148,122,173, 77, 63,225, 18, 4, 17, 68, 25, 55,110,220, 72,188,250, 67, 0, 95,223,156,159,121, 23, 36,252,207,171,
- 66, 4,224, 60, 72,167,163,163,227, 75, 92,243, 3,186, 20,139,100,129,108,113,217, 56, 96, 65,178,104, 97,217, 39,177, 9, 4,
- 4, 2,255, 24, 2,234, 92,228,175,170, 62, 42,135, 10, 41,247,218,136, 86,146, 68,137, 86,195, 93,248,242,229, 75,106,221,186,
-117,208,145, 67,135, 22, 93,185,116,105,222,205,235,215,231, 69, 70, 68,204,211, 71,180, 82,152,152, 12,225, 47,238,112, 88, 94,
- 64,178, 64,182,120, 65,104,201, 29,119,230,204, 25,130, 5, 9,132,104,239,222,189,210, 61,134, 13, 27, 22,134,107,244, 17, 45,
- 88,176, 64,180,176, 79,162, 80,180,203,155, 55,111, 40,172, 89,248,162, 7,121,219,180,105,147,180,232, 48, 58, 74, 51,203,116,
-239,245,117,100,184, 31, 19,172,183,176,132,193,101,210,171, 87, 47,170, 89,179,166, 68,178,202,150, 45, 75,125,250,244,161,101,
-203,150, 73,150, 55,184, 38,121, 77,192,215,250, 58,178,100,137, 19,247,234,214,173,219, 23, 93, 36,235,197,139, 23,196,107, 54,
- 74,169,121,243,230, 95,112,141,182,186,167, 81, 40,236,120,173,197, 23,112,187,194,122,177,112,225, 66,154, 50,101, 10,141, 29,
- 59,150,198,143, 31, 79, 51,102,204,144,234, 12, 75,158,114, 3,190,188, 64,244, 43, 92,251, 87, 41,176, 17, 42,163,141,104,225,
- 56, 71,144,167, 52, 73,150,236, 40,175,239, 41, 89, 71,199,140, 25, 67,108,185,237,169,122,141, 54,162,229,174, 80,164, 81, 39,
- 48,172,163, 45,172, 20, 10, 87, 36,252,175, 78, 96,112, 13,100,107, 35, 69,154,136, 22,179,150,137,112,195,243, 2,231,228,236,
-236,124,207, 83,161, 48, 85,234,164,234, 94,155, 76,196, 95, 65,127, 96,201, 2,201,226,178,217,168, 95,143, 99, 32,235,176,240,
-225,153,194, 53, 6, 18, 45,213,192,247, 87, 74,119, 97, 52,201, 90,196,101,195, 90,141, 88,227, 81,185, 56,188, 17, 90, 86,136,
- 16, 8, 8, 4,226, 11, 2,234, 92, 36,190,148, 59,186,156,186,221,135,114, 45, 90,220, 73,223, 15, 8, 8, 32, 88,138,152, 48,
-237, 3,201,226,206,103, 30,127, 65,207, 99,139,150, 94,162,197,139, 11, 31, 7,201,130,133, 9,150, 44, 16,161, 19, 39, 78, 72,
-214, 49,188,224,175, 93,187, 38,185, 19,177, 71,167,134,175,103, 92, 35,135,104, 77, 88,126, 97,146,185,181,211,253, 37, 75, 22,
-115, 76,201, 67,186,116,233,146, 68,220, 16,163, 2, 34,119,250,244,105, 66, 71,148, 44,149,245, 35, 57, 68,139,215,166,139, 97,
- 40,136,209, 9, 14, 14,150, 98,201,144, 64, 94, 96, 33, 98, 75,158,228,242,148, 99,209,226, 0,250, 35, 32,147,154, 54, 16, 37,
- 16, 75, 16, 44,224, 1,235, 30,199,170, 17,174,209, 86,119, 14,208,239,194,184, 73,177, 62,161,161,161,132,152, 26, 38,114, 84,
-189,122,245, 79, 5, 11, 22, 12,102,139,201,199,182,109,219,126,226, 14, 81,114, 83, 34, 94, 13, 24,183,108,217, 50, 60,121,178,
-100,221,227,153, 2,255,244,226,234, 34, 90, 56,199,214, 69, 51,179,212,169,253,208,238,104, 47,118,199, 69, 70, 91, 7, 37,171,
-149, 54,162,197,132,108,176, 42,129,113, 84, 40,210,171,223, 11,199, 84, 9, 12,174, 49,148,104,241,218,161,199, 81, 46, 88,163,
-184, 48, 53, 52,145, 44, 29,207, 81, 66, 14,124,223,135,103, 6, 22, 54, 88,175,180, 93,143,115,208,121,232, 28, 2,228, 13, 36,
- 90,223, 5,190,131,108, 49,118, 32, 89, 26, 45,225, 63,189,225,197, 13, 4, 2, 2,129, 63, 6,129,120,110,209, 82, 95,130, 39,
- 54,241,146,107,209,242,246,246,254,130,151, 57, 58,142, 35,135, 15, 47,191,195, 36,235, 33,147,172, 23,207,158,201, 34, 90, 76,
- 72,130,241,130,102,119,163,100,181, 58,121,242,164, 68,132,240,130, 7,201, 0,201, 66,224, 45,220, 94,248, 31, 22, 30, 92,163,
-143,104,217,229,107, 55, 57,119,158,188, 95,224, 50, 3, 33,194, 87,253,187,119,111, 37, 11,214,245,235,215, 37,121,236,238,136,
- 98, 87, 39, 89,186,150, 89, 35,135,104,177, 21,194, 95,149, 20,193, 69,136, 96,125,148, 21,101, 71, 92, 13, 91,220,136, 23,200,
- 38, 30, 49,169,215,117,200, 86,175, 32, 77,110, 67, 85,146, 5, 60,208, 22, 43, 87,174,164,254,253,251, 67,174,214,186,115, 80,
-242, 49, 92,171,220,142, 30, 61, 10,203, 90, 56,119,132, 85,184,117,147, 32,225,255, 68,137, 18,133,131,176, 2, 3,184, 81, 33,
-151, 59,229,179,127,204,147,245,135, 20, 68, 31,209,194,121, 87,133,194,138, 23,176,190,143,216, 68,196, 42, 49,241,186,232, 27,
- 61,162, 85, 43,209, 82, 33, 48,176, 94,105,187, 15,206,169, 17, 24,131, 44, 90,236,134, 12,194,179,133,184, 42, 94, 89,221,214,
- 80,162,133,145,133,112, 57, 34,254,208,140, 93,133,218,174,199, 57,196,104, 98,203,158, 61, 59,172,195,134, 16,164,236,140,147,
-122,224,251, 43, 65,178,254,144,135, 64, 20, 67, 32,240,155, 17,248,235, 45, 90,192, 87,159,235,144,227, 62, 36,162,133,128, 91,
-182, 16, 45,127,252,240,161, 68,178, 56, 70, 72, 54,209, 66,220,208,188,121,243, 8, 35,248,224,118,187,114,229,138, 68,178,224,
-162, 3,145, 1,185, 66, 71, 6,146,132, 36,135,104, 37,183,112,186, 48,103,206, 28,122,248,240, 33,199, 56, 5, 72,214, 27,116,
- 58, 72,176, 64, 33,110, 41,179,187,215,167, 74,245,187,110,131,123, 49, 46, 68, 11,113, 80, 32,109,112,117,194, 37, 7, 11, 18,
- 98,109, 16, 36, 44,135,104,113,158,143,112,183,128, 68, 65, 22, 54,148, 13,117, 69,253, 65,178, 96, 33, 3,137, 69,252, 14, 91,
- 76, 32,247,163,182,142, 76,157,104, 65, 30,151, 45,170, 84,169, 82, 1,112,253, 32,225,127,150, 25, 5, 23, 39,240,238,220,185,
- 51,177,149,139,204,204,204,206,253,230,231,233,143,187,189, 28,162,133, 60, 60,130,211,135,221,186, 81,208, 49,232, 49, 19,164,
-102,186, 44, 90,170, 4, 6,174, 66,109,247,193, 57, 53, 2, 99, 16,209, 98,157, 9,194, 64,136, 1, 3, 6,196,137,104,101,201,
-146,229, 61,200, 56, 2,223, 13, 32, 90,129, 6, 16, 45, 57,129,239,127,156, 94,136, 2, 9, 4, 4, 2,191, 14,129,120, 78,180,
- 12, 3, 10, 47, 79, 77,113, 32, 86, 86, 86,247, 65, 18, 16, 91,181,110,221,186,125,236,238,154,247,142, 73, 86, 72,112,176,172,
- 24, 45,184, 1, 65,168, 16, 55,133, 88, 47,144, 44,184, 8,241, 37,141,151, 60,220,103, 8,180, 69,130, 85, 10,174, 69, 57,174,
-195,164, 41, 82,191,135,181, 8,174, 66, 36, 16,174,192,192,247,146,139,167, 71,143, 30,145,252,134,159,150,177,228,208, 97,202,
- 56, 46, 99, 18,173,209,163, 71,203, 34, 90,108, 9, 57,137, 50,162,174, 32,133,136,243,106,213,170, 21, 53,104,208,128,106,212,
-168, 33,197,126, 21, 43, 86, 76, 10,144,238,217,179, 39,166,143, 32, 92,163,173, 35,131,235,144, 93,145, 49,211, 4,104,114, 73,
- 34,150, 6, 22, 66,184,122, 57,166,142,218,180,105,131,123, 68, 36, 75,146,164,155, 97, 26,241,247,231,150, 75,180,144,143,245,
-105, 1,220,221,176,160,242,255,235,116, 17, 45, 85, 2, 99, 0,209, 2,129, 49,136,104,241,168,194,227, 32,127,176, 90,198,197,
-117,200,110,192,253,112,173, 67,159, 13,112, 29,238,151, 73,180, 68,224,251,223,255, 8,137, 26, 10, 4,254,117, 4,116,187, 14,
-213,209,209, 70,180, 56, 24,126, 13, 70,196, 33, 70,137, 93,102, 65, 47,158, 63, 95, 4,146, 21,246,229,203, 60,138,140,212, 27,
-163,133,192,118,204,157,229,239,239, 79,155, 55,111,150, 44, 57,120,185,195,226,130, 99,239,222,189,147, 8, 22, 58, 12, 4, 29,
-119,234,212,233,171,156, 96,248,196,201, 76,223, 32,254, 8, 73, 73,182, 96, 13,195,168, 64,158,176,180, 30, 58, 45,213,128,249,
-223, 65,180,184, 30,195,134, 14, 29, 26, 6, 66,132,249,141, 80, 95,116,212, 60,213,131,228, 46, 68,204, 26,207,215, 69,156,135,
-198,141, 27, 7, 2,134,129, 0,195,180,117,100,202, 96,120,144, 41, 88,198, 96,205, 0,118,112,113,162,125, 16,151, 54,107,214,
- 44,226,121,192,136,167,126,160, 38, 77,154, 32,192, 30, 83,112, 4,136, 96,248,239,223, 7,134, 16, 45, 30, 25, 88, 30, 83,146,
- 0,103,182, 44, 74,163, 88,181,185, 14, 85, 9,140, 1,174, 67, 16, 24,131,136, 22,130,225,161,251,208,123, 46, 83,156,130,225,
- 49,162, 18, 22,101, 4,231,107, 11,134,207,148, 41,147,220, 96,120,213,192,247, 39, 34,240,253, 95,239,131, 68,253, 5, 2, 2,
-129, 88, 8,104, 35, 90,236, 82,200,232,229,229, 21, 6,171, 22,130,130,217,133, 24,194,177, 65,135,158, 61,121, 98,240,244, 14,
-184, 30, 36, 3,193,241, 74, 75,214,251,247,239, 37,194, 16, 25, 25, 41, 5,200, 99, 42, 8, 39, 25,211, 59, 36, 72,156,252, 0,
- 2,193,217, 66, 22, 5,242, 2,194, 5, 34,195, 83, 36,248,207,229, 88, 37,116, 90,152,250, 1, 22, 45, 76, 5, 33,147,104,189,
- 82,181, 18,105,114, 29, 34,112, 56, 58, 70,235,149, 50,166, 69, 75,135,155, 16, 67,225,185, 62,111,225,126, 4,161,132, 37, 15,
-238, 66, 88, 7, 65,178, 16,159, 3,146,133,184, 47,196,217, 32,175,174,225,243,184, 31,130,177,121,110,175, 55, 32,172,136, 25,
- 2,158,108,105,148, 8,219,192,129, 3,169,107,215,174,146,171, 16,163, 38, 27, 55,110,140,216,172, 64, 49,189,131,230,135, 93,
-149,104, 57,165, 79, 95,150, 7,126, 60,103, 11,238, 75,252,175, 78,194, 48,241, 45, 15, 42,144, 72, 73,241,226,197, 35,125, 49,
-155,191,134, 13,215, 33,176, 93,149,192, 56,106, 9,134, 87, 37, 48,113, 10,134,231,233, 29,120, 98,222, 80, 12, 86,129, 94,241,
-140,240, 79, 13,157,222, 1,147,145,226, 89,196,192, 17,148, 71,125,122, 7, 28, 3,153,195,135,144,140,233, 29, 68,224,187,232,
- 87, 4, 2, 2, 1,129,128, 54, 4,148,147,128,126,155,176,116,220,119, 19,150, 98,170, 3,124,205,131, 24, 97, 58, 6, 16, 5,
- 88,101,228, 78, 88,154, 41,179, 71, 4, 92,104,112, 17, 42,131,223,209, 65, 32,166, 10, 27, 2,228,173,109,108,101, 77, 88,138,
-206,140,199,132,167,230,206,105, 40,143, 20, 12,101,139,153, 36, 19,157, 32, 38, 45,133, 37, 11,228, 10,147,153, 98, 82, 83, 76,
-110, 26,189,126,163,170,197, 32,102, 98, 64,229,228,162,142, 94,197, 62,160, 83, 81,110,168, 43, 72, 28,220,153,136,181,194,244,
- 14, 72, 8, 30, 78, 97,237,249, 65,214,228,162, 60,201,163, 29,207, 46,142,120, 41,200,226,201, 73,105,205,154, 53,132, 50, 79,
-156, 56, 81,178,100,193,165,152,214,218,134,235,174,123, 66,200,152, 73, 80,121, 18,210, 52,182,110,193,101,202,148, 9, 90,187,
-118,173, 52, 7, 23, 92,179,104, 19,144, 64,158,109, 30, 22,138, 16, 83, 75,251, 16, 49, 97,233,119, 26, 31,211,238,170,100, 10,
- 3, 33,148,147,126,178,251, 54,156,173, 69,195,147, 43, 20,133,153, 96, 57,131,100,241,239,133, 32,179,176,196,242,252,106, 79,
-212,172, 79,177,100, 98,170, 6,117, 2,163, 62,189,131, 58,129,209, 48,189,131,170,126, 74, 19,244,106,122, 54, 49, 97, 41, 98,
-180,160,251,112,197, 67, 63, 49, 0, 4,243,190,201,157,176,180, 66,133,138, 81,208,117, 88, 74, 65,254, 17, 55,134,132,255,113,
- 12, 36,171, 82,165,202,114, 38, 44,197, 20, 13,152, 15,235, 8, 39,105, 66, 55,222, 63,231,100, 72,240, 60, 26, 76, 76,218,105,
-220,174, 74,224, 41,240, 52, 22, 2, 63, 67,151,140, 85,182,120, 32, 71,101,253, 64,109, 75,240,184,101,118,143,196,228,162,136,
-135,130, 37, 5, 36, 9,110, 43,174,157,254,245,212,120,198,119, 76, 70, 58, 98,196,136, 48, 4,196,131,180, 33, 65, 78,151, 46,
- 93,190,194,146,133, 89,225,245,173, 33,168,110,105, 96, 11,144, 29,191,197,231,229,206,157, 59, 18,129,229,102, 22,214,111,148,
-235,200,129,100, 97, 73, 33, 44, 95,130,217,183,181,117,142,202,117,220, 54,158,120,113,217,198,209,227, 19,207, 73, 21,130, 14,
- 21,110, 57,116, 52,176,148, 97, 10, 6, 30, 57, 25, 85,178,100,201,160,228, 22,118,159,246,156,123,113, 89,185,134,163, 74,235,
-170, 46,239,242,255,117, 30,121,105, 33, 88,171,184, 3, 12, 91,188,120,177, 52, 65, 43,246,176,142,177,139, 15,117,151,150, 31,
-210, 87,119,245,245,230,162,151,224,153,199,150,152,243, 22, 22, 22,175,184, 99,245,103, 11,214, 69,222, 47, 86, 46,193,163, 87,
-166,241, 84,243,103, 60,128, 63, 85,166,170, 46, 49,134,239,149,163, 65, 65,182, 65,134, 65,128, 27, 53,106, 68,117,235,214,149,
- 98,222,160,247,209,147,151, 78,215, 69,180,112, 14,147,144, 86,172, 88, 49, 82, 31,129,225, 9, 71,181, 77, 88,170,170, 75, 49,
-107,123,106,122, 54,177, 4, 79,222,252, 5,195, 64,182,225,150,199,210, 78,202,103, 83,214, 90,135, 76,240, 97,173,194,199,132,
-242,195, 71, 57,133, 8,142,225, 28, 62, 2, 12,212,165, 35,209, 68, 11,164,203,208,237,167,182,187,161,133,209,145, 95,148,211,
-136, 96, 10,130,109, 92, 48,227, 17,158, 70,175,248, 47, 20,200,179, 0, 73,155,250,154,135, 90,138,160,178,126, 32,150,226,209,
-184,168,116,153,255, 47, 42,109,157, 46, 93, 20, 72, 22,130,189,117, 17, 45,213,245,209,156,216, 37,136,248, 43, 4,187, 99,100,
- 33, 18,254,199, 49,156,147,179, 54,159,182,184, 26, 11,158, 13,155, 23,148,222,149, 34,157,215,126, 88,180,224, 54,196,130,211,
- 32, 89, 88,144, 87, 31,209,250,127, 57, 7, 95, 96,146, 82,140, 23,124,238, 99,111,107,187,219,218,218,250, 33,151,241, 97, 90,
- 75,203,221,201,147, 38,237,131,115,138, 92,131, 47,232, 93,247, 77,117,173,195,232, 5,181,181,213, 93,185,160,182,161, 50,149,
-174, 75,109,123, 57,120, 26, 81, 33,227, 93,167,163,170, 75,118, 86, 86,181, 88, 31, 63, 49,241,145,220,176, 32, 85,112,205,194,
- 74,132,145,177, 24,197,138,160,113, 38,180,183, 49,229,131, 62,162,165, 36, 91,250, 8,140,234,172,240, 58, 62, 4, 98,214,246,
-212,250,108,150,251,255,162,210,246, 25, 28, 34,149,207,166,172,181, 14, 89, 63,149,139, 74, 35,190,140,167,112, 8,196, 52, 14,
-234,139, 74,235,213,207,216,202,180, 53,154,104,197,101,198,247,120,167, 75,255,242,115, 36,234,110, 20, 4,254,101,157, 55, 10,
-128,191, 73,136,114,222, 44,245,189,230,226,192,181,166, 92,115, 45,218,205,150, 80, 87, 71, 30,189,190, 33, 44, 89, 79,244,174,
-117,200, 47,114,184,189,244, 17,131, 24,215, 88,116,126,149,146,106,116,247,104, 35, 93,202,227, 26,234,164,211,117,168,116, 5,
- 26,163,156,234,117,249, 83,101, 26, 81, 57,227,221,139, 66,147,254,192, 66,202,250,220,157, 73,198, 41, 38, 73,111, 96, 41,229,
- 56, 40, 76, 57,114,159,221,127,157,225,178, 86, 94, 39, 71, 63,225, 18, 68,252,149, 58,129,193, 49,165,187, 80,181, 28,154,100,
- 26,250,108, 98,125, 67, 16, 44, 36,189,107, 29, 26,241,217, 84,211, 37, 4,198,199,117,198,247,120,167, 75,255,242,115, 36,234,
-110, 20, 4,254,101,157, 55, 10,128,191, 73,136,186, 37,203,240,133,166,227, 88,240,127, 89, 97, 68,221,227,168, 52, 90, 46,251,
- 19,240, 4, 57, 55,211, 83,173, 63,161,156,114,144, 23,229,148,131,146,252, 60, 2, 79,249, 88,201,201, 41,240,148,131,146,252,
- 60,241, 5, 79,249, 53, 18, 57, 99, 16,136, 47,141, 43,202,105, 92,165, 21,120, 10, 60,141,133,128,208, 37, 99, 33,249, 77,142,
-192, 83,224,105, 44, 4,126,134, 46, 25,171,108,191, 67,142,210,162,165, 58,159, 86, 44, 50, 4,192,212,147, 33, 5,213,116,189,
-190, 99,250,228,235,187, 62, 46,101, 22, 50,191,111,103, 93,152,136, 54,210,142,128,208, 37,161, 75,114,117,224, 79,124,142,170,
-197,225,157, 47,183,190,170,249,254,196,186,139,190, 35,246,179,251, 59,218, 72,121, 79,109, 58,165,175, 76,127,226,121,121,177,
- 89, 63,161,228, 63,131,241, 10,153,198,109, 40,129,167,192,211, 88, 8, 8, 93, 50, 22,146,194,250, 36,116,233,223,212, 37,227,
-214,250,215, 74,211,105,209,250,153, 69, 17, 15,139,113,209, 21,120, 10, 60,141,133,128,208, 37, 53, 36,125,125, 21, 9,121, 76,
-114, 2, 34, 95,222,175, 75, 68, 84,155,147, 34,129, 76,192, 53,226, 89,187,182,230, 25,254, 59, 53,180, 76, 45, 67,174,104, 35,
- 25, 32, 25,144, 69,224,105, 0, 88, 50,178,254, 12, 60,101,220, 86,100, 81, 71,224,103, 52,196,223, 36,211, 49,125,250,244,123,
- 56,237,101,224,120,210,112,189,219,223, 84,119,189,149, 85,203,240,219,234,206,147,150,150,226,133,184, 75,201, 44,240,111, 43,
-167,204,242, 41,179,197,148,211, 43,147,162,134,103,102,197,160,152,228,166,104,162, 77,150, 39,159, 83,205,139,107, 85,242,202,
-169,123,194, 10,165, 29,102, 35,241,117,114, 38, 47,149, 35, 83,189,184,238, 60, 21,203, 99, 30,105,249,156,231, 68,171,172,161,
- 46, 49, 50,121,194,225, 68, 72, 13,106,165, 25,216,165, 77,150,143, 93,218,120,126,109,217,212,193,191, 81,109,203,219, 77, 27,
- 88,237,106,211, 52,125,191, 54, 45,236,178, 41,243,169,239,117,213, 61,171,155,162, 66,221, 26, 94,115,114,121, 39,239,121,248,
-112,177,196,244,172,118,242,251, 39, 93,172, 91, 53, 78,179,185,103,231, 92,145, 77,234,166,217,210,162, 69,218, 84, 58,218, 45,
- 46,117,215,167, 6,191, 84,230, 40,110,227,161, 73,146,120, 14, 75,148,168,234,176,196,137, 27, 12,231, 52, 44, 97,194,122,188,
-207, 51, 65,161,136, 83,221, 89,102, 26, 95,133,162,196, 72, 19,147,102, 44,179, 47,203,234, 51,202,196,164,233, 80,133,162,248,
-104,133,130,103,247,209,186,105,173,123,124,147,137,250,162,222,127,106,221,245, 41,161, 56, 31,141, 64,170, 84,169,206,115,231,
-130, 73, 47, 99,146,165,165,165, 63, 18,119, 60, 82,226, 57,165, 98, 18, 47, 87,130,115,231, 13,236, 28, 49,130, 11,126,205,163,
-209, 9,255,255,200,168, 46,179,164, 73,147, 14,231,114,156, 50, 49, 49, 9, 65,194,255, 56,166, 71,174,174,151, 15,143,190, 87,
- 52, 96, 60, 22, 48, 30, 15,121, 2,208, 71,252,255, 66, 28,227,132,115,218, 54, 93, 50, 83,112, 7, 48,153, 23, 28,126,205,139,
- 0,223,224, 73, 37,163,220,221,221, 95, 51,134,147, 89, 24,175,146, 19, 39,153,113,213, 93, 93,229,204,196, 36,240,156,131,131,
-195,133,104,252,204,240, 63,151,253, 28,255,206, 20,135,114,154,242, 53,165, 25,191,254,220, 9,238,141, 94,230,230, 57,235,210,
- 94,110,163,254, 56,199, 9,121, 52,109,191,180,131, 80, 41, 64,106, 46,231, 43,214,245, 87,124,236,175,180, 66,128, 56, 81,216,
-205, 85,202,132,223,218,218, 86, 79, 94,189,109, 84,178,152,109,181,185, 51, 90,206, 69,194,255, 50,148, 86,175, 76, 53, 25,238,
-188,114,197,187, 79,159, 62, 73, 43, 87,212,170, 85, 43,152,159, 91,238,127, 99,109,223, 17,173,118,205, 51,189, 11,251,244,140,
-194, 63,191,144,210,215,208,167,244,224,206, 65,218,186,126, 24,141, 24, 92,142, 26,215,178, 60,213,176,118,186,172,114,137,150,
-167,171,162,242,128,254, 53,230, 70, 70, 92,157, 91,183,150,215,204,105,211,242,165,190,119, 49,135,213,153,253,217, 10,247,235,
- 81, 48, 10,247, 56,180,119, 6, 53,175,103,117, 78, 7,217, 50,180,238, 50,224,252,101,193,240, 9,134, 36, 75,230, 52, 52,113,
-226,118,195,147, 36,169, 58,218,194,194,115,116,186,116, 78, 72, 99,211,166,117, 25,150, 36, 73, 57,233, 92,226,196, 57, 13,120,
-222, 19,140, 72,156,184,224,172, 44, 89,250,189,191,115,167, 95,248,231,207,131,120,126,182, 33, 72,248, 31,199,102,185,187,247,
-243, 85, 40,242, 11,153,223, 33,160, 73,151,126, 6,158,114,116, 80,228, 81, 34, 0,146,133,117, 7,149, 91, 84, 84, 20,133,135,
-135, 75, 11, 24,227, 37,134, 89,210,149, 11, 25, 99, 89, 14, 44,167,195, 95,145,254,218, 94,104, 42,199,241, 21,139, 70, 95,201,
-235,196,133, 97,230,109, 44, 32, 13,185,123,247,238,165, 92,185,114,133,241,185, 85,156,202,112,210,244,197,171,237,229, 83,142,
-103,155,127,139, 69,171, 49, 35, 54,228, 97,241,102, 76, 48, 57,127,254,252,112,156, 99,121,229, 12,120, 0,145,213,155,137,213,
- 29, 94,130,228, 19,102, 1,199,132,172, 88,131, 17, 75,230,240,210, 54,159,112, 14,121, 12,144,153,128, 73, 70, 51,123,123,251,
- 23,243,230,205,251, 2, 28,207,156, 57,115, 11,216, 97, 45,197, 25, 51,102,124,193, 57,228, 97,153,154, 92, 22,223,213,157,203,
-112, 94, 73,134,245, 17, 97, 3,201,112, 78,103,103,231,123,188, 72,113, 36, 47, 80, 29,198, 68, 99, 43,210,189,123,247, 34,120,
-249,160, 72, 44, 92,204,101, 52,228, 37,153,157, 9,213, 99, 94, 40, 60,132, 39, 1,141,194,204,253, 88,138, 8,139, 95, 99,249,
- 38, 94, 46, 40,138, 39, 8,253,200,228, 24,243,177,101,215,128,169,174, 78,167, 16,147,161, 57,140,221, 41, 94, 18,231, 41, 18,
-254,199, 49,150, 83, 72,199, 83,173,183, 35, 99, 89, 75, 23, 46, 92, 24, 49,106,212,168,112,198,122,169,140, 55,132, 94,153, 50,
-100,168,103,249,169, 50,149,228,105,197, 18,223, 85, 93,218,151, 91,197,191,241, 97,162, 73,255, 18,224, 28,242, 32, 47,136,153,
- 26, 41,251,174,156, 21, 75,101, 24, 95,173,162,203,226,178, 37,108, 91,230,203,103,153,186,106, 69,151,213, 33,239,182,250, 34,
-225,127, 28,195, 57,228, 65, 94, 3,219,221,157,219,249,177,183,183,247, 27, 94,126,235,106,146, 36, 73,218,129,100,225,189,116,
-237,218, 53,105, 29, 81,232, 87,190,124,249,130,147, 37, 75,166,106,217,250,142,104, 53,172,105, 57,152,173, 76, 17, 32, 85, 83,
-198,214,165, 69,115,219,211,177, 67,243, 41,224,229,101,137,120,221,184,188,141,122,117,201, 29, 86,191,166,249,208,214,173,115,
- 37, 81, 18, 46,149,242,254,223, 66,232,174, 40,166, 36, 89,216,103,203,146,112,116,222,156,137, 7,148, 41,110, 50,106,202,200,
-156,147,122,117,204,248, 0, 36, 75,149,108,105,113, 37,254,212,118,143,131, 30,106,187, 68,189,156, 9,152, 72,101, 99, 43, 86,
-221, 89, 25, 50, 88, 76,180,179, 51, 31,147, 50,165,247,168,164, 73, 11, 34,141, 76,153, 50,215, 36, 75,203,244,107,243,231, 79,
-206,100,171, 28,147, 45, 31, 25,237, 14,153,205,252,102,204,232,195,139,225, 14, 9,190,119,175,223,173,201,147,187, 31,174, 86,
-173,203,241,122,245, 58, 63, 89,186,180,203,231,103,207,250,242,185,193,199, 71,142,236, 51, 50,105,210, 70, 66,102, 44, 4, 52,
-181,145,177,241, 52,162, 74,197, 75, 81,202, 96,120,213, 88, 45,221, 21, 65,231, 13,146,133, 37, 98, 54,108,216, 64, 91,182,108,
-145, 94, 92,251,246,237,147,214,232,195, 11,140, 73,130, 68, 62,120, 49,103,105, 13, 52, 25, 68,171, 38, 91, 72, 94, 97, 41, 15,
-144, 12, 77, 27, 8, 29,102,225,230,165,111, 48,243, 54,172, 8, 53,213, 74,170,233,229, 83,194,195,195, 35, 20, 75,229,220,185,
-115,135, 22, 45, 90, 68, 19, 38, 76,144,214,103, 67,185,113, 28,137,173, 70,161, 44,171,132,140, 7, 16, 89,242,112, 71, 29,202,
-139,102, 71, 5, 7, 7, 75,245, 84,110, 32,132, 88,138,135,113,136, 66, 30,228,149, 33, 51, 55,215,253, 70,135, 14, 29, 62, 96,
- 57, 31,108, 60,227,248, 11,158,109, 60, 10, 68, 11, 9,139, 77,163,156, 29, 59,118, 12, 98,185, 55, 88,102,110,125,117, 71, 59,
-129,244, 98,123,245,234,149, 84,111, 44, 31,131,181,250,128, 35,126,131,112,130,204,202, 37,195,188, 12, 80,233, 28, 57,114, 60,
-133, 69, 64,185,241,146, 67,143,184,253, 95, 67, 14,202,136,245, 40, 51,103,206,252,148,137,145, 38,151,218,119,109,196,132,229,
- 34, 48,196,114, 67,220,241,145,171,171, 43,241,130,216, 84,184,112, 97,105,189, 72, 44,130,141,197,144,153, 20, 19,119,138, 23,
-101,224,137, 44, 57, 96, 93,227,165,139,222, 99,113,114,213, 15, 3,204,134,142,197,197, 43, 85,170,244, 46,218, 2,151, 67,166,
- 76,213,108, 57, 75,149, 42,197, 48,188, 39, 44, 6,206, 58,246,158, 79,106, 35,151,202,235,226, 93,231,168, 36, 90, 32, 80, 55,
-174,239,158, 59,110, 76,235,177, 37,139, 37,170,245,254,189,167, 3,125,241,116, 69,194,255, 56,134,115,200,131,188,114,136, 22,
- 8, 84,104,224, 86,223,221,219, 6, 78,235,214,169,212,198, 19, 7,166,111,248, 26,114,108, 5, 18,254,199, 49,156, 67, 30,228,
- 53,160,141,248,113,118,127,133,101,130,176, 8, 61,214, 74,229, 37,189, 62,243,243,250,245,210,165, 75,180,114,229, 74, 26, 62,
-124, 56,245,232,209,131, 6, 13, 26, 68,137, 18, 37,194, 58,139,223,181,145,170,133,106,242,228,106,230,203,231, 54,202,185,112,
- 86,229,242, 11,103, 20,233, 53,176,187,235,202,118,205,109,111, 15, 29, 80,138,158,220, 63, 78,159, 67, 30,211,194, 57,237, 8,
-100, 75, 39,209,202,172, 24, 16, 26,122,126,238,251,247,231,230,222, 98,172,110, 95,223, 61,255,214,245, 45, 75,111, 94, 89,189,
-241,210,233,153,135, 30, 92,104, 63,165,123, 59,231,167, 50,200, 86,188,211, 37, 0, 60, 44,105, 82, 23,118,233,213, 92, 91,171,
- 86, 82, 38, 85, 30, 35,146, 36,241, 25,109,106,154,113, 70,250,244,214, 83, 44, 44,172,198,167, 76,105, 55,194,196, 36, 15, 8,
-215,161,129, 3, 19, 51,217, 42, 53, 60, 81,162,188,186,222,117, 44,175,192,165,185,115,123,115, 91, 15,185, 56,120,112,143,189,
- 69,139,182,123, 52,110, 92,221,224, 61,123,170, 34, 61,159, 53,171,246,165, 22, 45,154,189, 88,186,180,125,228,215,175, 3,143,
- 12, 30,220,107,152, 66,193,115, 10,107, 39, 27,218,100, 62, 92,189,186, 86,163, 50,101,198,101, 72,147,230,188, 67,234,212, 23,
-219,148, 43,183, 32,240,205, 27,223, 31,145,105,204,114,110,247,241,233,176,164, 69,139, 14,215,150, 46,149,234,111,204,186,255,
- 72, 57,227, 37, 53, 50,110,161,213, 39, 40,141,253,155, 45, 10,197, 96, 85,224,228,171,188,175,146,104,201, 33, 89, 88, 32, 25,
- 68,139, 59, 52,117,139,150,122, 53,158,130, 72,225,197,168,111, 3, 89,192,130,213, 44,224,169, 30, 44, 82, 99,109, 68, 44,143,
- 2, 34,232,235,235, 43, 45,168,140,181,222,246,239,223, 47,237, 65, 22, 33,235,246,237,219,132, 53, 22, 89,158, 62, 23,144, 9,
-231,123,162, 36, 87, 32,148, 47, 95,190,140, 41, 50, 44,102,176,112,193, 10,133, 69,156,145,151,101,242,138, 60,218, 55,182,230,
-188,228, 50,156,101, 33, 71,152, 16, 28, 99,203,208,233, 5, 11, 22, 28,159, 52,105,210,229,193,131, 7,223, 96, 75,207,221, 38,
- 77,154, 60,172, 81,163,198, 51,118,119,188,230,133,128,223,179, 59, 45, 72,159, 30, 40,219, 9,132, 18,139,105,131, 88, 97, 3,
- 17, 6, 38, 32,172,216,208, 70, 40,175,140, 54, 82,240, 34,199,119, 65,132, 65,170,128, 25,112, 4, 89, 3,145, 65,221, 81,103,
- 46,187,180, 54, 37, 91, 20,238,234, 43, 35,206,115,190, 0,144, 31,158, 97, 29, 68, 10,139, 49,131,248, 82,129, 2, 5,164, 69,
-143, 27, 52,104, 64,140,131,164, 71, 60,243,186, 62, 61,130,200,156,217,178,101, 11, 64,157, 64, 42, 81, 87, 44,141,131,122,226,
-127, 85, 34,143, 58, 48,177, 67,187,235, 35, 73,170, 85, 73,200,101,188, 13, 66, 13, 2, 11, 29, 0, 73,228,178,221,230, 76,114,
- 98,139,228,192,242, 71,228, 81,137,187, 26, 14, 34,117,255,246,210, 97, 91,215,215, 26,190,119,173,231,240, 55,183, 10,246, 64,
-194,255, 56,134,115,200,227,233,174,152,196,215,169, 91,180,190,171, 15,172, 85, 32, 82, 95, 2, 15,204, 8,120,182,101,253,208,
-254, 69, 31, 53,174,147,246, 19, 18,254,199, 49,156, 67, 30,228,149, 9,136, 43,147,252, 0,180, 43,116, 10, 27,116, 19, 31, 42,
- 76,180, 62,181,107,215, 46,168,111,223,190,212,180,105, 83,170, 82,165, 10, 85,173, 90, 21,239,145,199,154,100,171, 18,173,195,
-139,125, 77,222, 60, 93,109, 27, 20,176,220, 53, 60,112,128, 79,248,135,190,101, 34, 2, 71, 54,217,182,186,230,164,182,205,237,
- 95,239,219, 49,153,190,124,124, 66,189,187,230, 13, 83,186, 17, 53,201,204,226,166, 40,169,180,104, 13,234, 95,115,110,118,207,
-132, 99,139,228, 75, 60,180, 82,185,228, 83,199, 15, 45, 61, 38,242,237,204,246, 31, 30,245, 31,163,137,108,233,137,217,146, 9,
-207,239,203, 54, 68,161, 72, 10,151,224, 2, 55,183, 84, 32, 89, 83,108,108,188,217,188, 88, 58,226,242,101,179, 26,165, 74,197,
-178,146, 14, 74,152,208,206, 55, 73,146,188,171,171, 87,151,174, 25,171, 80, 88,107, 42, 57,119, 74,150, 83, 93, 93,251,193,146,
-117,113,208,160,238,236,107,109,198, 50, 43,106, 74, 79, 39, 78,172,251,122,205,154,214,236, 74,236, 55, 33, 93,186,190,218, 98,
-182, 52,201, 28,217,165, 75, 55,175, 76,153,118,122,102,201, 18,186,116,233, 82,201,245,140,119, 42,222,161,174, 46, 46,159,125,
-138, 20, 57, 83,223,204,108,166, 33, 50, 81, 70,174,123, 37,174,251,180, 76,206,206, 55, 76, 83,166,252,132,228,230,224,112,187,
- 97,137, 18,203,191,134,134,246, 55,164,156,237,254,199,222, 85,192, 71,113,124,225,195,221, 37,184,134,224,238, 78,161, 88,139,
- 83, 92,139, 22, 45,110,109,113, 47,110, 45,238,238, 4, 9, 26, 92,131,187, 59, 4, 8, 26, 2,201, 1,121,255,239,219,102,243,
-191, 92,238,110,247,146, 64, 75,187,251,251,205,239,246,118,103,223,206,188,153,157,249,230,189, 55,239, 21, 42, 52, 54,105,146,
- 36, 47,178,186,185,249, 67,235,244,209, 5, 90,164, 90,229,203, 79,121,180,123,119,109,214,253,217,170, 85, 97,170, 59,203,233,
-115,232, 80,205,198, 85,171,254, 94, 34,127,254, 53,185,179,103, 63,151, 38,117,234,103, 41,147, 39,127,158, 45, 99,198,171,223,
-127,247,221,254,111,226,196, 89,129, 15,212,229,115,246, 46, 91, 88,228,115,190, 47,130,105, 91,239, 58,228,255,255, 31, 4, 89,
-214, 47,228, 4, 78, 80,180,113,227,198, 96, 73,150,167,167,103,176, 36,139, 42, 63, 74,178, 56,177, 1, 52, 40, 65,151,117, 76,
-226,138,148,140,210, 16,198,143, 35,152,178, 62, 24, 92,122,237,218,181, 50,116,232, 80, 69,165,132,114, 57,156,116, 33, 81, 25,
- 56,125,250,244, 15,148,104, 16,100, 17,108,237,222,189, 59, 68, 57, 9,178, 40,133, 34, 88, 2, 93, 51,159,113,196,224,168, 81,
-163,246,234,222,189,187,191, 90,182, 85,171, 86, 41,160, 67, 61, 56,168,119,237,218, 85, 46, 94,188,168,164, 31,127,252,209,159,
-207, 56,162, 9,155, 36,165,238,234, 1,192,114, 25,193,137,159, 67,133, 22, 64, 80,100,157,160,154,124,129,114, 82,221,233,240,
-160,186,144,245, 34, 63,185,146, 39,208, 98,249,200, 71,242,132,131, 4,249,204,246, 33, 96,112,212, 70,136,105, 55, 24,128,231,
- 72,187,118,237,238, 81, 77,204,128,223,236, 3,228, 43,105, 61,124,248, 80, 1,174,252,229, 68,182,105,211, 38,169, 90,181,234,
- 61,168,123,247,103,200,144, 1, 99,151,253, 3,182, 93, 62,228, 33, 7, 46, 74, 24,154, 52,105, 34,229,202,149, 83, 38, 66,210,
- 39,160,103,249,168,154,141, 29, 59,246, 19,141,106,167,196, 68,251,144,234, 97,214, 13,170, 61,153, 52,105,146,140, 25, 51, 70,
-169, 47, 84,176,178,108,217, 50,133, 7,234,193,254, 74, 91, 43,208, 77,169,197, 83,222, 7, 95,187, 67, 69,172,136, 93,201, 91,
-130, 75, 6,104, 6, 40,124, 11, 21, 85,119, 61, 52,190,194, 60,145, 40,181, 34,160,186,119,161,197,194,137,163, 42,120,254,216,
- 52,151, 15, 19,207,121,141,247,152, 7,117,211,181, 27,143,170, 65, 74,173, 8,168,122,117,118,125,127,251,210,104,121,247, 98,
-145,220, 58, 93, 91,102,142, 75, 27,216,188,126, 50, 63,222, 99, 30,230,213,195,179,108,217,210,111, 59,186,167,149, 28, 63, 48,
- 76, 54,173, 27, 43,187,118,121, 40, 38, 2, 28,143, 56,182,224, 91,242,133,164,244, 45, 2,121, 83,162,201,254,196, 49, 4, 81,
-142, 66, 31,150, 64,107,235,214, 41, 49,188,111, 44, 74,254,234,201,210, 76,230, 87, 99, 10,125,120,222,167,226,169,125,173,154,
- 7,248, 76,239,243,242,246,144,159, 9,182,238,222,216, 47,144, 80, 73,211, 31, 18, 31,226,179,246,202, 27,108,163,245,233,220,
-204, 70,245,115,205,246,220,154, 58,205,129, 61, 89,138, 62,191, 53,164,226,244,177,117, 39,236,220,208,123,253,131,139,125,103,
- 88,131,173,230, 13,147,236,214,203, 91, 61,188,250,210,121, 0,152,242,194, 38,235,123,170, 11, 41,201,194, 4, 94,200, 99,214,
-172, 72,163, 97,123, 11, 73, 87,118,166, 17,136, 15,170,150,107, 80,244,232, 57,134, 71,138,148, 17,134,237, 69, 6, 71,142,108,
- 83,130,135,129,165,252,139,203,151,251,191,185,117,107,192, 78, 72,178, 8, 10,210,166, 78,125, 45,121,178,100, 47, 1, 52,148,
-148,210,197,229,101,170,148, 41,149,148,218,197,229, 85,250,116,233,222,164, 75,157,250, 77,202,196,137,185, 48, 10,117, 88,211,
-204,147, 37,139, 59,199,143, 27, 55,110, 40, 99,158,245,193,177,139,125,171,119,239,222,146,196,100, 90,171,135, 38,203,137,186,
- 55,203,144, 38,205,149,218,181,107,191, 63,114,228,136,162, 85, 96,226,121,173,154, 53,253,179,186,186,222, 89, 59,106, 20, 54,
-188,154,108,169, 79, 77,150,229,220, 2, 73, 22, 65, 22,251,185,122,112,254,109,223,190,253,251, 36,137, 19,191,152,254,203, 47,
- 29,239, 13, 31,222,200,124,247,110,215,171,171, 86,245,208, 67, 83,229, 39,203,154, 59,107, 86,207, 78, 29, 58, 60,195,252, 27,
- 72, 33, 3,181, 67, 84,193,115,236,195,184, 26, 88,166, 84,169,151,137,163, 68, 9, 75,188, 82,221,221,208, 22, 22,209,253,240,
- 63, 61,163, 5,138, 44,167,150,149, 19, 56, 39, 91, 85, 93,232, 8,100,113,242,164,122, 13, 18, 0, 45, 73,132, 2, 54, 56,153,
-170, 73, 85,249,176,131,207,156, 57, 83,122,244,232, 33,125,251,246, 85, 38, 99, 2, 46,148,199, 33, 77, 6,162, 38, 13,174, 64,
- 40,201, 98, 57, 15, 30, 60,168,208,167,234,136, 29, 69,237, 48,151, 47, 95,150,195,135, 15, 11,159,113,212, 38,184,239, 73, 9,
-134,122,112, 34, 87, 15, 78,236, 4, 54, 4, 10,124, 15,165, 61, 84,119,241, 25, 71, 52, 45,129, 22, 84,125,111, 80, 14,111, 2,
- 1,124,220,151,172, 65, 22,192,224, 59,168,195,124,131, 38, 8,135,221,135,237, 52,118,236, 88, 5, 96, 48,253,252,243,207,193,
-231,252,223,166, 77, 27, 5,128,140, 30, 61, 90, 9,132,236,168,141, 0,178,142, 83,218, 8,201,205,115, 14, 54,139, 22, 45,146,
-110,221,186, 41, 52, 41,105, 34,192,162, 90,182, 87,175, 94,202,117,242,186,109,219,182,207,216, 71,138, 20, 41,114,196, 81, 65,
- 97, 67, 19,140,122,216,175,216, 95, 8,148,152,200, 7, 74, 39,104,183, 69,117,175,150, 68, 11,247,187,162,125, 21,228, 75,213,
-209,196,137, 19, 5,192, 88, 48,152,189, 43, 81,162,196,155, 42, 85,170,188,253,233,167,159,222, 65, 69,173,140,152, 44, 59,129,
- 22,120,241, 1,210, 52, 61, 32, 41, 57,212,154,207, 84,112, 77,160, 69,144,197,186,179, 47, 96, 37, 73,233,152,205,213,247, 63,
-253, 91,215, 42, 31, 85,132,148, 94, 17, 88,253,220,177,220,135,139,103,183, 11, 19,207,121,141,247,152, 71,139, 14,238, 71,166,
-177, 59,237,176,168, 34,164,244,138, 32, 75, 2,209,108, 72,102,223,237,114,243, 68, 41,153, 48,212, 37,144,247,152,135,121,131,
- 12,228, 29, 74, 12,203,150,202,118,254,252,225,250,242,242,233,122,241,125,177, 83,246,237,158, 34,227,198, 14, 84,218,104,253,
-250,245,130, 5,140,224,155,120, 91,160, 64,129,119,142, 64, 22,235, 96, 9,180,102,206,108, 23,237,246,233,249, 9, 95, 60, 90,
-149,206,231,206,196,236,109,154,102, 28,251,231,180,159, 60,239, 92,223,120,240,221,227,169,125, 40,217, 26,212,175,156, 98, 91,
- 53,229,247, 70,194,221,136,142,248,128, 93,135, 85,105, 8, 95,180, 96,156,126,143, 79,185, 38,219,191,219,181, 64,211,250,105,
-126,159, 53,163,251,158, 59,215, 55, 31,218,190,190,215, 6,107,201,214,128,158, 37, 62,181,108,233, 88, 58,174,131,247,127, 91,
- 22,216,101,213, 29,157, 56,113, 86,216,100,229, 27, 29, 47, 94,122, 72,115,170, 14,137, 20, 41, 49, 1, 22,164, 93,241,149, 20,
- 35,134,235,244,156, 57,211,226,211, 76, 58, 41,115,230,248,195, 98,198, 44, 55, 36,114,228,132, 0,105, 63,217, 42, 56,119,216,
-209,216,253,234, 31,127,244,188, 13,169, 13, 65, 1, 65,150,106, 50,193,177,138, 18,119, 74,177,173,237,134, 83, 37, 75,246, 74,
- 15,205,184,177, 99,223,231, 88,193,177,157, 18,114,235,131, 11, 85,154,204,112, 97, 13,213,197, 35, 61, 52, 41,201, 34,200,194,
-130,237,147, 45,240,198,113, 16, 11,196, 79, 89, 51,103,190, 51, 52,102, 76, 91, 54,101, 38,203,186, 47,104,211,166, 19, 37, 89,
-161, 10,135, 11, 0,129,129, 24,219,223,183,174, 90,117,244,155,125,251, 90, 61, 63,119,174,251,168,152, 49,155,232, 41,167, 42,
- 25, 4, 56,125,206,186, 83, 83,193,177, 56, 72,203,165,156, 67, 82,172,152,203,196,209,161,101, 9, 79,231,179,133, 69,194, 67,
-239, 11, 63,107,233, 17, 94, 61, 15, 93, 4, 75, 52,201, 9,156,147, 32,109,178, 84,240, 66,240,193, 9, 75, 85,209, 80,146,197,
-149, 36, 12,166,149, 14, 30, 22,160,165, 2, 46, 76,216, 2,251, 37,101,194, 84,129, 22,165, 18, 90, 64, 11,147,238, 27, 78,182,
-176, 33, 82,164, 86,180,243,225,202,131,210, 29,126, 20, 4, 89, 4,130, 84, 39,241,156, 96,129,207, 56,106, 0, 12,206,175, 89,
- 55, 30,252, 64, 32, 49, 83,206, 85,144, 69,186, 80,239, 41, 18, 29,218,130,140, 31, 63, 94, 32,125,114, 72, 83, 5, 90, 4, 50,
- 0, 89, 39,169,242, 32,216,152, 49, 99,198, 61, 78, 16, 42,216,162, 10, 48,115,230,204, 79,135, 12, 25,162,174,196, 29,246, 21,
-238,254, 84, 37,131, 28,120, 8,174, 56,232,240,224,224, 64,144,197, 15,154, 7,219,211, 81, 27,193,168,120, 5,192,227, 39,130,
- 83, 72,152,158,240,195,162,237, 11,233,242,151,109, 77,176,202,126, 64, 73, 39, 86,119, 79, 41, 65, 3, 40,166,113,252,114,189,
- 64,147,101, 97,253, 73,143,237,196,118, 35,136, 97,157, 97, 20, 79, 94, 58, 4,215,120,215,126, 75,105, 40, 7, 1,180,217, 7,
-188,159, 6,207,148, 50, 48, 85,135, 93,206, 7, 2,107,182, 61,118,119,202,128, 1, 3, 4,146,218, 99, 90, 31, 31,108,233,182,
- 64,226, 24,188,172, 85, 37, 90, 4,129, 76,144, 54,126,130, 4,115,139, 22,157,175,241, 62,237,177,168, 42,164, 20,139, 0, 75,
- 61,120,206,107,188,199, 60, 90,117,163,251, 6,238, 44,164,209, 59,237,177,168, 42,164, 36, 43, 24,104,249, 29,149,215,119,190,
-151, 77,139,210, 9,239, 49, 15,243,242,153, 32,215, 15,118, 95, 1,201,228,240,163,123, 90, 4,222,185, 52, 72, 1, 90, 76, 87,
-206,175,148,158, 61, 90, 40,223, 42,191, 71, 46,218,160, 90, 14,192,198, 18,120, 17,176,127, 88,239, 34, 60,124,120, 66,172,123,
- 87,230,166,170, 94, 41,245, 47, 83, 39,117,220,122,253,242,250,221, 51,167,119,220,115,241,104,155,166, 84, 35,210,102,139, 82,
- 45,207, 29, 51,164, 93,115,151,126, 90,126,182, 92, 93, 77, 49,188,188,218, 69,187,233, 85, 48, 65,165,242, 81,127,157, 50,161,
-245,246,171, 23, 54,236, 34,216, 90, 56,163,233, 8,241,249,163,195,205,147,157, 39, 13,232,158,229,114,239,159, 11,126,106,219,
- 50,201, 6, 45,222,254,147,239, 83, 5, 56, 35, 93,186, 68,176,127, 42,127,105,196,136,140, 84, 23,194,136, 61, 55, 0,150,178,
-155, 26,253, 41,210,167, 15, 31, 70,157, 90,176, 96, 44,174, 41,128,122, 68,148, 40, 21, 49, 43, 69,195, 51, 61,113, 45,212, 78,
-110,186, 48,192,115,131, 14,212,171,247, 51,109,136, 8, 12, 40,197, 98,223, 36,176,166,148,157, 90, 12, 46,124, 57,246, 83,226,
-195,133, 27, 23, 88,169,147, 39,183, 57, 46, 91,211, 84,129, 22, 37, 57,156,227,104, 34,193, 57,141,139,120,154, 12,112, 78, 82,
-237, 72, 81, 17, 46,180, 66, 29,214, 52,169, 46,132, 84,245,189, 45,144,197, 49,154,160,142, 99, 96,165, 74,149, 2,138, 71,141,
-186, 90,139, 38,109,178,168, 46,180, 5,180,248, 14, 10, 43,178,184,186, 6,180,173, 84,105,130,191,183,119, 55,236,208,180,169,
-101,177,197, 79,242, 52, 99,134, 12, 47, 57, 87,176, 76,228, 1, 55, 43, 49,241,156,115, 40,109,126, 99, 69,139,246,238, 75,244,
-191,175, 92,178,101, 59,152,180,138, 92,137, 38, 85, 38,114, 2,231, 10, 65, 15,200,162, 68,130, 96, 39, 60, 64,139,146, 23,107,
-160,197, 14,174, 7,104,177,156,216,197,167,116, 10,170,187,248,161, 17, 12,169, 64,144,224,138,106, 41, 2, 66, 38, 45,160,133,
-137,254, 45, 59, 23, 87,198,180, 1,162, 52,136, 32,133, 52, 72,151, 96,142,106, 9,170,171,168,154,160, 20,142,207,232, 1, 26,
- 0,123,199, 9, 96, 8,178,152, 56, 32, 64, 13,247,128, 64,139, 43,137, 92,185,114, 61,109,218,180, 41, 13,123,117, 3, 45,174,
- 66, 56,200, 16, 12, 81,186,197,131, 34,101,218,172, 80,138,197,131,109, 68,112,162,209, 70,177,220,220,220,198, 67, 58,181, 27,
- 59, 14, 23,195,253,196, 93,214,159,182, 10, 28, 24,152,184,145,129,125, 34, 99,198,140,119, 48,225, 45, 5, 40,220, 13, 96, 50,
- 30,117,143,165,167,254,234, 32, 65,186, 52, 48,231, 0, 73, 64, 77,169, 20,213,145,216,221,231, 52,208, 34, 77,208, 9,132,225,
-250, 83,168, 48,149,196,115,172,196, 2,105,184,207,126, 65, 85, 47,164, 92,148, 70,209, 53,133,221, 3, 0,170, 60, 6,213, 55,
-148,102,177,190,228, 25,121, 73, 80, 77, 48,207,182,230, 68, 14,155,175,151, 32, 98,107, 99,197,151, 24,135, 62,219, 59, 62, 39,
-208,162,186,144,146, 44, 51, 64, 86,192,179,190,138, 68, 43, 44, 64,139,125,173, 76,201,204,143,207, 30,106, 36, 7,118, 13, 18,
-159,167,103,148,110,117,225,244, 82,105,210,184,182, 2,168, 97,243,168, 44,218, 32,105,230, 6, 6,187,135, 53,208, 26, 60,184,
- 94,244,226,133,227,252, 60,113,124,199, 13, 87, 46,110,217, 52,117, 98,199,173,109, 91,100, 26, 67, 53,226,135,231,253, 42,209,
- 64,222, 99,211, 56,241,126,112, 82, 90, 52, 78,186,149,206, 77,181, 26, 3,170,241,200,133,242, 70,235, 60,225,247, 54,107, 47,
-157, 91,189,121,242,132, 86,219,155,254,144,230,247, 39, 80, 35,142,252,173,220, 40,175,195,211,118, 79, 26,147,127,220,158,141,
- 57, 75,210,207,150, 22,189,127,242,125, 0,173, 46,115,178,102,141, 7,208,244,237,227,165, 75, 21,117, 24, 84,136,249, 38,155,
- 76, 49,208, 68,217,145,202, 16,108, 13,138, 26,181,208,170,191, 22, 68,166, 33, 81,162, 84,224,125, 60,219, 25,219, 78,227, 88,
-215, 79, 5, 6, 71,154, 55,239,242,102,231, 78, 5,104, 81, 85, 72,112, 97, 9,178,212,177,159, 99,170,170,101, 73,227,226,226,
- 16,104,169, 52, 45,129, 22,193,150,154, 40, 0, 96, 95,162, 20,159, 64,139, 26, 12, 45,160,165,210,164, 77, 22, 23,122,214, 7,
-199, 21,206, 73,156,167, 56,110,115,158,203,144, 48,225,109, 71, 64, 75,165,153, 58,101,202, 7, 92, 8, 91, 30,228, 3, 23,174,
- 4,110, 20, 92, 64,218,231,191,114,238,220, 17, 90, 64,203,146,159, 42,208,226,184,199, 49,143,115, 19,129, 38,233,170,227, 31,
-235, 31, 55,122,116,135, 2,133,240,246, 77, 91, 88, 36,188, 52,191,240,243,182, 65,150,189, 66, 16,104, 81,146,161,170,225, 84,
- 73, 22, 37, 26,150, 0,134, 19, 56, 39, 98, 2, 17, 76,184, 78,171, 14, 85,137,150, 45,160,197, 85,169, 22,208,162, 26,144,229,
-225, 7,183,107,215, 46,165,243,178,140, 68,247,148,100,176,243,169,122,113, 74,120, 8, 18,180, 84,135,168,251, 33,126,104,156,
-164,255,252,243, 79,174, 56,168, 34, 83, 12,182, 97,172, 46, 80, 77, 9, 84, 97,180, 79, 82, 86, 58,220,221,196,103,180,128, 6,
- 58,238, 67, 72, 71,124, 85,144,165,254,162,238,247, 40,150,134,241,238,171,138, 21, 43,190,131,141,148, 2, 56,244,168, 14,233,
-203,140, 43, 13,214,149,171, 47, 2, 45,214,147, 32,139,192,144,116,248,225, 48, 17,144,234,104, 35,203,106, 20,129, 11,142, 27,
-108, 99,138,143,249,161,193, 53,131, 20, 42, 84,232, 6, 50, 89,239, 18,114,216,159,173,109,212,236, 1, 45, 2, 67, 45,137, 22,
- 85,135,144,170,217, 92,217,169, 3, 16,251, 46, 37, 81, 4,203,228, 39,236, 24,104, 19,246, 17,246, 85,221, 28, 20, 52, 58, 64,
-218, 61, 85,173,201, 65,135,131, 24, 87,120, 28, 96,233,214,131, 54, 26,216, 21,170, 12,188, 65,174, 40,162,127,225, 15,249,179,
-190,238,115,170, 14,105,147, 69,112, 69, 73, 22,127,119,173,113, 13,147,234, 48,136, 1,197,154, 55,200,233,191,123,251, 68,121,
-247,246,153, 2,182, 40,217, 90,189,124, 8,190,203, 74, 2,213,187, 2,180,176, 19,154,238, 98,116, 1, 45,244,143,168,185,178,
- 70,238, 48,118, 84,251, 21,151, 47,108, 93, 67,176, 69,201,150,207,157,233,217, 21,155, 45, 24,200,115, 55,226,212,113,141, 21,
-245, 97,135,150,153,110,208,131,188, 45,226,193, 27, 12,224,224, 53,119, 54, 83,251,223, 71,183, 91,126,233,252,150,149, 4, 91,
-149,202, 69,253,229,144,103,150,124,135,247,187, 21,169, 86, 57,214,164,203,231, 86,174,174, 80, 54,250,136, 7,151,179, 37,161,
- 83,211,207,218,192,159,153, 56,236,179,154,195,103, 86,154, 81,177, 98,149,160, 19, 80,190,110, 80,172, 88,105,160, 30, 76,171,
-190,154, 54, 90, 84, 31,242,127,175,244,233,163,143,136, 22,173, 18, 37, 89,148,104,217, 42,158,170, 62,123,176,108, 89,183,199,
-179,103,255,160, 2, 45, 2, 22, 85,146, 69,144, 69, 77,139, 10,178, 56,238,115, 12, 0,208,122,165,135,166, 94,160, 69,141,131,
-150,234, 80, 45, 39,141,222, 57,247, 88, 30, 92, 20,171, 32,139,101,167,109, 42,199,168,216, 49, 99,190,215, 83,206, 86,181,107,
-143,248,161,110,221,191, 84, 22, 56, 84,144,165,218, 40,210, 92, 6,192, 45,208, 5, 11,140, 33, 49, 99, 54,211, 67, 83, 85, 29,
- 82,162,165,210,165,100,139,243, 42,231, 84,110,124,226,216,207,185, 4,170, 67,155,252,252,204,221,234,107, 33,175, 79,117,104,
- 89, 27, 78,224, 68,180, 4, 66, 90, 32,139,249,216,129,116, 76,226,222,156,188, 44,109,180, 28, 1, 45,170,105,180,128, 22, 13,
-219,233, 59,139, 82, 34,138,145, 41,113,162,216,151, 32,137,215, 8, 56, 8, 60, 40, 70,230,187,177, 58, 9,208, 50,134,199,125,
-104,177,134, 40,138,122,126,204,156, 88,185,138,160,196,137,136,155, 43,144,210,165, 75, 43,170, 46, 2, 27, 0, 48, 26,216,195,
- 49,177,253,131,110, 45, 0,254,174, 88,131, 44,254,135,234,204, 12, 85,228, 91, 72,144,158, 17, 20, 48, 17,112,232, 5, 90, 44,
- 3, 85,132, 76, 48,204, 87,158,229, 71, 65, 53, 28,236,150, 20, 32,200,178, 14, 26, 52, 72, 79, 27,133,168, 4, 36,108, 87, 40,
- 5, 36,136,227,166, 2, 26,113, 66,218,101,211,192,212, 81,253, 35, 18,104,225, 61,138, 49, 60, 7, 82, 2,124,213, 46,131,171,
- 47,130, 66, 74, 7,161,146, 85,218,141, 19, 46,118,115, 42,124,129, 31, 44,138,252,237, 26,195, 99, 82, 30, 10,192,251,193,122,
- 87, 44,251, 18,129, 48,109,241,126,249,229, 23,101, 55, 27,109, 8, 33,205,244, 71,187, 99, 23,249,191,230,248,172,198,240, 52,
-124,167, 77, 22,165, 88, 76, 60,119,198, 24,222, 26,188, 12, 29,210,233,230,131,187, 94, 66,176,117,252,224,136, 96, 53, 98,135,
-118, 53,165, 86,173, 90,210,160, 65, 3,182,185,195, 13, 37, 57,179, 68,105,153,195, 45,242, 32,254, 18,100,141, 25, 73, 64,180,
-117, 57,193, 22, 37, 91, 84, 35,190,120,180, 40, 29, 13,228, 95, 63,157,227, 74,215, 15, 35, 7,127,167, 0,173,174, 63,101,123,
-106, 23,104, 5, 57,129,133,235,140, 25,160,181,236,210,185,109,203, 8,182, 10,229,139,214,137,106,196,235,176,217,218,183, 33,
- 85,218, 82,197,162, 14,190,116,126,195,194, 34,249,162, 14,240,114,175, 30,219, 30,189,175,165,135,193, 70,171,204,200,216,177,
-203,140,140, 31, 63, 3, 0, 84, 46,181,220,195, 98,196,200, 72, 41,214,160,104,209, 10,192, 0,222, 77, 85, 27, 98, 7, 95,134,
-193, 9, 18,228, 86, 12,229,163, 68,169, 97,171,158,131,105, 12, 15,103,164,239, 31, 61,234,119,182, 93,187, 22, 4, 6, 52,122,
-231,194,145,130, 0, 21,100,169,102, 34, 4, 89, 28,247,185,184, 76,147, 50,165, 77,137,166, 53, 77,189, 64,139,210,119,172,172,
-184,203, 60,212, 17,138,166, 21,208, 34,120, 97,217, 40, 12, 32,200, 90,185,114,165,178,144,103, 2,208,162,155, 32, 77,154,180,
-251, 74,157, 34,197, 35,186, 22,226,252,196,121,141,139,108,210, 84,231, 39,154,251, 84, 40, 95, 62, 0,187, 63,108,206, 73,182,
-248,169, 74,180, 28, 1, 45,106,118, 98, 71,143,238, 80, 66,252,181,244,211,127, 76, 57, 9,180, 8, 80,136,144,185, 82, 80,165,
- 68, 68,206, 68,228, 84, 83, 81,146,197, 73,142,147, 29, 39, 39, 78,166, 26, 21,184,207,206, 79, 26,252, 56, 44, 1,151,165, 68,
-171,127,255,254,193, 96, 1,244,238,107,208, 12,118,239,192,213, 12, 59, 27, 65,129, 42,201, 82,203,200,242,241,125,116, 5, 1,
-122, 90,187,155, 18, 34,159, 15, 85, 91,252, 96,233,118,128, 54, 62, 52,250,166,193,125,159, 62,125, 20,213, 33,119, 70, 18,188,
- 48, 47,104, 38,116, 84, 78, 12,248,143, 96, 72,125, 14,171,151,211,176, 35, 57,135,103, 47,193,160,252, 26, 0,192,109,128,161,
- 7,152,176, 3,160,214,123, 2, 85,220,147,242,229,203,251, 84,168, 80,225, 37,164, 47, 54,109, 1, 44,223, 67, 39,164,170, 77,
- 22,121, 75,144,101,105,147,197, 50,170, 54, 2,252,213,209, 70, 33,170, 1,163,240, 43,148, 12, 17,192,178,205,104, 15,245, 57,
-129, 22,193,162,150, 68, 43,168,128, 5,104,176,206,114, 81,162,199,118,231,238, 80, 74,220,184,250,162, 1, 63, 85,133,148, 64,
- 53,107,214,140,182, 89, 84,245, 57,116,239, 0, 48,124,215,114,119,169, 58,232,176,191,179,222,116,233, 65,192, 74,233, 24,236,
-180, 4,174, 57,216,246, 54, 7,221,127,204,135,172,163, 32, 97,114,239, 0,199,165, 74, 40, 30, 7,225,122,248,234,136,116,239,
-160,250,251, 82,193,203,229, 11,219, 87, 13, 29,210,241,102,195, 31,178,250,159, 62,208, 64,238, 92, 26, 44, 79,239,207,147,121,
-127,182,151, 98,197,138,209,141, 8,141,150,109,238, 54, 84,217, 66,144,245,201,124, 97,121,174,172,166, 63, 85,144,197, 95,130,
- 46,170, 17,105,179,117,243,230,204, 4,222, 55,254, 72, 78,215, 15,139,231, 53, 40, 48,168,255, 55, 10,208,234,217, 37, 63, 36,
- 11,182,119, 95,170,101,157, 58,190,169, 2,178, 8,182, 40,217, 90,133,157,138, 80, 55, 70,165,129,124,163,250,185,255,164,235,
- 7,250,217,202,157, 53,242,104, 24,206, 43,225,122, 80, 54, 93, 59, 58,117, 52,237, 23,207, 2, 23, 13,241,104,167, 53,191,108,
-217,152,195, 99,197, 42,170, 74,181, 88, 16,170, 10,103,194, 22, 75, 45, 20,236, 13, 98, 65, 45, 88, 2,190,181, 98, 2,100,213,
- 1,216,202, 98, 7,108,252,229,222, 65,100,224,227,197,139, 59, 60,152, 60,185,126,234, 84,169, 94,114,238,177, 4, 89,156, 87,
- 84,144,197, 69, 24,199, 65,228,179, 57,134, 2,108,132,160, 25, 47,102,204,135,252,222, 57,215,217, 83, 29,114, 44,229, 98, 11,
-141, 67,103,205,182, 64, 81, 8,154,116,225,192,133, 41, 15,150,133, 26, 6,210,231,162,141, 32,139,246,132,180,113,229,152,146,
- 52,113,226,163,122,104,178,238,139, 71,141,106,147,194,197,229, 29, 23,255,164,105, 9,178, 56, 63,113,195, 14, 23,218, 9, 17,
-201, 68, 47,205,143, 65, 54, 90,142,128, 22,237,127, 99,198,136,161, 57, 39,125,241, 78,247,207,122,161,165, 84, 75,187,100,156,
-192, 9,180,244,128, 44,117,114,178, 49,137, 91,111,215,109, 14, 9,201, 59,110, 23, 37, 80, 35,120,163,241, 34, 1, 16,129, 22,
- 37, 16,220,234, 79, 9, 13, 60, 60,115, 18, 35,202,183,142,187,102,211, 97, 41, 36, 28,126, 84, 23, 82, 84,171, 26,191,243, 29,
-180, 29,227,193,247,192,166,136,118, 84,122, 29,150, 86,134,122,240, 45, 39, 88,138, 79,105,155,179, 98,197, 10, 69,125, 68, 67,
-120,170, 12,153,192, 39,150,177,178, 13,142, 90,151,179, 16, 28,176, 94, 4,168,122, 77, 67,114,242, 64,221,217, 1,209,108, 32,
- 12,119, 95,193, 3,189, 98, 15, 0,135,158,175, 49, 73,232,114, 88,202,118,226, 71, 76, 94,178,189,248,129,241, 96,221, 9,188,
-200, 79, 30, 78,180, 81,136,170,192, 73,231, 21,174, 20,105,180, 78,219, 52,242, 2,246, 89, 90, 18,173, 80,109,132,190,241,216,
- 82,132,110, 75,117, 72,208, 26,100,163, 69, 55, 12,214,135,173,118,207,143,250,159,132,106,247, 53, 7, 46,242,148, 42,100, 14,
- 54,180,113, 35, 24, 2,112,245,133,159,179, 51, 32,166,233,176, 20,237,237,105,203,145, 46, 37,163,172, 59, 55, 62, 16,200,114,
-199, 37,193, 55, 7, 73,208,182,222,109,250,213, 57,153,252, 90, 28,150,218, 3, 47,104,219, 98, 5,243,166,120,236,177,174,102,
- 32,119, 35, 46,158, 85, 89, 96, 4, 79, 96,109, 15,100, 5,183,145, 10,180,166,142,107,170, 72,178, 84,144, 69, 53, 34,237,183,
- 6, 15, 46, 23,149,187, 17, 87,173, 26, 28,157,238, 31, 70,143,254, 54, 65,183,142,185,253, 25,162,167, 91,199, 60, 31, 25,136,
- 58,168,163,134,104,119,181,172,167,143,205, 93, 70,176, 69,112,168,130, 82, 6,154, 38,168,250, 4,215, 15,244,179, 69,167,166,
-170,223,173,250,216,165, 72, 3,122, 91, 52,181, 71,109, 93, 57, 62,123,255,132, 10,176, 12,220, 53,148,153, 92,185,114, 12, 24,
-194,151, 36,128,162, 13,150, 90, 58, 74,179,144,210, 16,100, 17,108,241, 62,129, 22, 22,150,150,246,110, 33,202, 73,231,162, 39,
-166, 78,237, 3,196,242,235,179,149, 43,219,210,133,131, 58, 63,113,124, 34,200, 34,232,224,194, 88, 5, 89, 28,111,172,230, 36,
-187, 52,179,167, 77,123,140,106, 65,106,102,248,189,115,188, 35,224,162,201, 8,199,126,106, 87, 40, 37,175, 92,185, 50,181, 44,
-140, 92,162, 30,118,105, 54, 42, 87,110, 9, 93, 56,112,145, 79, 73, 59,129, 17, 65, 22, 23,132, 4, 89,212, 52,112,174, 43, 82,
-184,176, 63,163, 26,232,161,201,186, 63,132,163,214, 30,245,235,255, 6,159,132, 1, 92, 96,178,172,156, 75, 56, 62,145, 46,199,
- 80,150, 23,115,200, 71,208, 84,109,222, 28,242,147, 52, 51,166, 79,239, 80,117, 72,219, 84,208,180, 20,166,124,142,190,164,171,
- 19,255, 67, 51, 57,118, 88,106,171,208,156,192,217,105, 41,154,100,135,102,162,154,139,157,152,147, 17,165, 88,236,148,150, 59,
- 42,116, 0, 45,190,138,198,158,211,224,168,242, 35,119,219,241, 3,161, 74,138, 82, 34, 54, 36, 1, 23,222,205, 14, 50, 45, 40,
-175,158, 9,151,121,202,211, 25, 41, 38, 88, 51, 87, 57,236,216, 76,236,136,144,110, 4, 4, 73,178,236, 25, 47,219,235, 48, 85,
- 40,173,234,216,177,163,153, 82, 12,118, 96, 78,176,116,128,216,176, 97, 67,210,116, 54,172, 79, 36, 60,211, 18,245,123, 8,195,
-239, 0,130, 22,130, 3,168,162,188, 9, 10, 32, 37, 11, 64, 29, 30, 98,183, 92, 75,212, 71, 87, 8, 30,122,227, 87,109,208, 88,
- 95, 2, 12,213,191, 20,219,137, 42,174, 48,180, 81, 48,207,225,188,244, 58, 7, 8, 58, 23,133,161,188, 2,100,130,194,239, 56,
-234,235,161,248, 9,181,232, 38,170,160,213,131,146, 70, 26, 89,210,102,142, 6,246, 4, 71,148, 26,214,175, 95,159,147,228, 38,
- 27,196, 29,125,212, 12,193, 51, 19,233, 4,163, 9, 64,122,200,248,156,167, 96,248, 62, 15,116,116,135,224,129, 33,252,183,120,
-255, 27, 85, 34,168,150,149,252,101,217,217, 94,148,106,114, 80,163,235, 17,128,208, 87,160,111,237, 25,255,115, 12, 62,159,149,
-230,215, 18,130,199, 17,120, 65, 59,196,130,131,223,225,185,178, 39, 59,159, 44, 89,156,109,248,239,104,103,100, 40,160,117,230,
-232,156,229, 4, 91,148,108, 81,141,104, 47,136,116, 80, 0,234, 1,157, 90,185,249, 52,169,155,228, 23,123,147,163,117, 76, 72,
-107, 47,250, 12, 56,173,130, 43,122,144,103, 76, 68,254,167, 75, 8,123, 52, 35,104,114,249,172,125, 41,168,140,145,232,230, 1,
-182, 85, 69,118, 15, 24, 16,149,170, 66, 26,188, 35,125,195,112, 59,240, 2, 95, 5,106,197, 60, 4, 95, 84, 41,194,174,171, 81,
- 16, 16,179, 28,243,172,203,169,132,224,217, 59,120,112,159, 79,239,223, 15,160,159, 44,206, 77,150, 32,139, 99,138, 37,200,210,
- 2, 90, 28, 99, 85,154,190,207,159,255,214,184,118,237,181,121,243,228,241,163, 20,138, 99, 39, 77, 80,184, 73,135, 54, 84, 4,
- 92,137,226,199,247,197, 51, 93,145,130,165,114, 56,183, 91,206, 15,126,126,191,184,102,202,116, 31, 0, 77,217,148, 67,186, 28,
-235,184,113,139,115, 29,165,247, 48, 19, 9,196,120,197, 88,178,186,235, 78, 63, 89,111,247,239,111,217,239,135, 31,134,194,240,
-253, 29, 84,143,129,180, 33, 85, 37, 89, 20, 0,112,129, 13,173, 20,119, 8,166, 15,106, 19,135,252, 36,205,236,110,110,207, 84,
-223,131, 92,152, 83,112, 65, 96, 72, 0, 71,233, 61,105,226, 27,179,148,230,125,142,190, 20, 65,221,252,111, 33,227, 60,208, 98,
-128,104, 78,226, 76,116,114,201,196, 29,107,106,162, 61, 22, 19,193,149,154, 0, 32,156, 9, 42,205,129,112, 21, 84,100,129,156,
-188,169,226,193, 78,174, 64, 92, 91,169,119,144,180,193,202,248,180,191,162,177, 59,119, 22, 50,241, 60,200, 38,203,145,186,208,
- 81,135, 73, 16, 68,243, 32, 58,217, 59, 38,208, 60, 24, 68,211, 81, 0,108, 71, 52, 99, 3, 8, 76, 4,136,121,138,143, 46, 16,
- 62,185, 30,128,175, 79,177, 90,112, 58,168, 52,140,240,149,118,250, 76,109,100,130, 19, 83,119,130, 75,170, 99,169,166,163,212,
- 17,128,203, 93,163, 27,219,170,123, 50, 0,180, 11,176, 27,123, 75, 85, 36, 7, 73, 14,138, 92, 61, 18, 12, 99, 64, 11, 44, 91,
-182,236,107, 0,209, 11,160,157,204, 73,160, 21,214,175, 42, 84, 57, 1,182,202, 65, 53,250, 24,126,217,252,184, 66, 38,232, 82,
-253,244, 80, 82, 74,105, 36, 60,143,251, 6, 5,153, 46,247,119,149, 51,172, 21,182, 53,137,127, 45, 65,165,181,192,139, 19, 60,
- 9, 5,180,168, 62, 84, 19,165, 92,142,128,150,229, 61,187, 64, 11, 42, 85, 69,181,106,153,172,212,172,170, 83, 83,134,235, 33,
-200,226,127,171, 58,124,142,137,236, 75,209,140, 4, 96,245, 45, 64, 84,171,225,113,227,230,164,177, 59,165, 87,248, 85,130,198,
-171, 82,172,161,145, 35,215,239, 21, 37, 10, 55, 0,164,214, 81,119, 37, 8,242,196,116,233,250,167, 79,147,230, 13,129, 21, 5,
- 0, 84, 33, 82,115,193, 5,166,181,234,223,145, 68, 75, 5,133, 42,205, 27, 27, 55,246, 60,187,123,247, 47,223, 85,170,180, 19,
- 54,184, 31,184, 8, 36, 24, 74,159, 54,237, 7, 72, 7,230, 35,191,173, 57,196, 22, 63,131,203,185,126,252,248,161, 89, 50,103,
-190,143,141, 83,102, 53,156, 29, 77, 16,168,134, 44, 89,162, 4,189,187,123, 57, 91,119,150,243,249,197,139, 61,253,159, 61,235,
-177,121,229,202,161,216,137,248,180, 84,201,146,102, 46,178, 41,201,162, 42,146,118,164, 88,176, 82,250,164,110,214,112, 88, 78,
-210, 28,220,187,247,226,194,144,174,209,221, 14,199, 62,106, 68, 8,188, 8,226, 96,155,250, 30,115,205, 99, 8, 1,106,218,235,
-243, 78,124,127,255,230,172,206,169, 14, 35,136, 19,122, 62,234,194,120, 23, 37, 24, 76, 60,215, 58,244,208,212,162, 97,125,255,
-239,162,153, 30,157,119, 59,140,222, 61, 80, 32,117,229,225,168,236,127, 71, 57,163,226,227,155, 5,207,238, 23, 1,148, 46,230,
-206,157,123, 22, 10, 24,202,215,141,142, 65,146, 89,248,209,151,193, 0,208, 7,106,186,173,168,251, 93, 72,160,238, 2,212,111,
- 5,128,237,195,123, 22, 3,195,223,217, 70, 44,103, 85,148,113, 45, 22, 19,231, 49, 88, 63, 0,144,125,128,114,158, 7, 64,166,
- 87,104, 74, 29,236,121, 5,255, 59,218,200,217,254,206,252,193,229,204,149,197, 84,199, 17, 32,176, 36,110, 97,207,165,128, 8,
- 62,235,228,192, 27,153,126,178,130,124,101,105,186, 70,176, 44,167,245,187,245,216,136,217, 97, 76,112,221, 85, 99,120,130, 43,
- 53,105, 73,180,244, 0, 45,189, 13,146, 11, 1,168, 33, 69,251,133, 97,123,108, 60,243,213,245, 37,235, 58, 0, 88,165,128, 51,
-210,154, 80,253,245,162, 67, 82, 72,144,218,224,188,175,149, 77,150, 46,233,189, 74,155,118, 95,169,224,241, 61, 77,242,228,175,
-145,124,211,186,184,248,166, 75,145,226, 53, 13,223,105,147,229, 96,241,111,151,159,164, 57, 24, 90, 17,168, 60, 91,162,124,253,
- 58, 68,141, 58, 34, 93,164, 72,219,177,226, 91, 3,195,206,236, 14,218, 83,147, 38,118, 92,254, 88, 44, 70,140,141,153, 48,222,
-197,137, 21,235, 61,210,187, 20, 16, 74, 64, 16,208, 25,116,157,174, 59,203,201,157,152,116,123,193,196, 50,231, 54,153, 6,194,
- 38,235, 6,213,133, 88, 4,190, 39,200,162,132, 94,207,183,105, 89,247, 22, 81,163,142,203, 28, 61,250,241,180,137, 19,223,114,
- 73,146,228, 41,104, 62, 64, 57, 15,131,206, 31, 72, 89,116,142,243,122,187,191,145, 47,130, 56,240,213, 15, 20,225,224,131, 81,
-247,112, 48,239,223, 56,233,132,131, 29, 70, 95, 10, 7,243,140,190, 20,130, 3,127, 91, 95, 98, 24, 30, 75,227,120,141, 38,253,
-219,202,233,100, 87,251,167,149,147, 54, 89, 92,180, 91, 47, 4,255,105,229,116,146,205, 95,101,118,231,124,106,133,163,138, 95,
- 75,227, 26,229, 12, 71, 35, 27, 19,217, 63, 99, 34,115,178, 9,141, 62,239, 36,195, 12, 96, 96,151, 3, 70, 95, 50,250, 82,196,
-114,224,223, 65, 45, 4,208,226, 71, 98, 43, 57, 83, 85,123, 52, 28, 93,215,162,111,208,180,221, 46, 97,109, 47,131,159, 6, 63,
-245,246, 1,227,219,180,207, 1,189, 60,180,204,103,240,211,224,167, 45, 14,252,151,251,146,202,143,176,206,103, 90,223,212,223,
-113,223,121,135,165, 17, 84, 74, 99,165, 19, 65,140, 12, 34, 99,240,211,224,103, 68,113,192,232, 75, 17,197,201,191,232, 24,252,
- 52,248, 25, 81, 28,248, 47,247,165,136,226,225,127,138,206,215,220, 97, 82,160,165,152,244, 28,182,242,126,205,117,215, 83,103,
- 71,121,254,109,117,119,166, 47,124,137,186,167, 1,243,153,244, 30,204,155,202, 42,243,151, 40,167,222,242,253,151,250,146, 51,
- 60, 49,218,200, 25,110,105,231, 53,248,169,205, 35,103,114,124, 14,126, 58,243,126, 35,111, 16, 7,108, 53,132,222, 73,203, 94,
- 62, 61,141,171,247, 29,106, 67, 89,211, 28, 21, 41,146,233, 19, 19, 50, 32, 74,132,195,195, 94, 94, 61,229,180, 38,156, 26, 46,
- 50,186,194,169,235, 18,184,123,224,142, 20, 23, 39, 39,199,172,112,143, 48,153, 78, 52,153,120,142,231,179,106,148, 95,111, 57,
-185, 59,166, 61,220, 90,236,225, 46, 60,236,110,217,131,255, 63, 33, 57,181,107,198,162, 44,220,201,195,240, 53,195,144,242,233,
-248, 98,130,203,233,146,187,214,202,228,185,107,157, 65, 58,151, 52, 79,141,172,252,229,127, 94,215, 65,199, 50,139,158,186, 59,
-211, 23, 72, 91, 15, 77, 39,139, 25,130,166,179,229,153,128, 6, 10,180,209,151, 63,119, 57,157,173,163,189,252, 70, 57, 35,138,
-147,127,209, 49,248,105,240, 51,162, 56,240, 57,250, 82, 68,149,237,235,165,131,237,238, 63, 96,146,221,137,180,131,231, 58,106,
- 18, 86, 0,227,104, 50,209,106, 92,203,103,199,233, 40,163,245,224,147,130,147,146,234,172, 18,231,129,216,218, 63, 5,117, 30,
-101,157,120,157,247, 45,242, 18,152,169, 82, 48,173,114, 90, 23, 45, 5, 66,197,172,130,111, 24,119,132,212,113,135, 35, 62,119,
- 4,116, 94,129, 76,150,146, 8,187, 52,177, 5,183,113,209, 98, 37,189,246, 30, 56,122,245,202,181,219, 15, 47, 92,190,121,123,
-211,182, 93,199,243,228,205,119,140,247, 28,240,193,154,166, 2,168,176, 53,120, 15,182, 8,223,231, 47,254,119,128,255,148,141,
-136,117,117, 27,206, 75,189, 17, 95,236,229,222,189,123, 31,180,110,221,250, 90,164, 72,145,232,150,195,122,155,190, 53, 77, 91,
- 18,152,129,112, 86,187, 13, 33, 51, 60,224,222, 98,132, 85,249,108,229, 15,166, 73, 80,245,228,149, 89,152,112,174,252, 6,157,
-159,209,217,222,106, 54,173, 54, 10,213, 23, 0, 52, 45,221,112,124,105, 73,102,168,242,160, 34,106,236,198,194, 56,159, 26,148,
-120,206, 35,101,172,152, 49, 35,170,127,234, 97,173, 22, 63,245,208,176,206, 99,208, 12, 11,215,236, 63, 99,240,211,224,103, 68,
-113,224,115,244,165,136, 42,219,223, 65,167, 96,208, 75, 57,103,211, 94,203, 90,139,160,175, 76, 12, 81, 2,231,112, 94, 76, 56,
-231, 4,172,117, 88, 54, 68,168, 73, 2,206, 74,119, 84,175, 94,221,221, 50,241,154, 3,240,194,247, 57,106, 92,229, 29,102,179,
-191,130,125, 72, 7,161,109,214, 2, 32,117, 77,147, 38, 77, 98, 7,133,181, 91,206,200,145, 35, 5,110,218,180,105, 7,194, 49,
-184, 91, 39, 94,231,125,103,128, 86, 75,147, 41,102,195,152, 49,203, 53, 7,248,105, 18, 45, 90, 39,166, 22,177, 98, 53,202,158,
- 48,225,132,251,119,239,110, 65, 96,100,119,196,214,115, 71, 88, 5,119,208,223, 4, 9, 87, 39,139,114,219,171,123,182,226, 37,
- 74,157,120,253,198,247,253,189,219,119, 95,252,214,117,192,142,158, 61, 6,175,159, 62,111,213,150,131,199,206, 30,201,145, 35,
-247, 17,208,208, 12, 71,130, 60, 4, 76, 27, 16, 98,230, 38,130,158, 62, 64,144,238,231,240, 10,124, 27,206,246, 30,194,105,233,
- 27, 4, 43, 13, 24, 48, 96,128,153,158,242,225,180,211, 12,239,198, 1,240,144,127, 22,207,208, 91,178,229, 97, 89,206, 96,224,
- 27, 57,114,228,241,136, 79, 24,151, 9, 0,110,184, 10,180, 32,121, 27,171, 94,103, 30, 59,210,196,208, 18,173, 60,181,222, 41,
- 0, 11,191,150, 18, 45,244,205,161,244,129,101, 39, 89, 6,129,214, 26, 40, 66,244, 89,244, 83,169, 81,163,198,113,244,167, 62,
- 0,158,127,106,149,211, 78,127,203, 6, 7,179,119,224, 67, 44, 68, 24,163,228,249,234,148,204, 81,166,249,160,164,185,106,149,
-179,241,156, 90,206, 16,229, 65,223, 99, 20,133,254, 65,249,103,194,161,172, 23, 19,254, 35,164, 28,246,210, 39, 72, 80, 15, 64,
- 43,216, 27,127,144, 84, 43,172, 11, 1,173,111, 93,235,219,212,243,188,173, 60, 90,109, 20, 22,186, 6,205,176,112,205,254, 51,
- 6, 63, 13,126, 70, 44, 7,190, 78,106,234, 46, 67,235, 95,231,106,131,137,235, 48, 65, 22, 66,144, 16,104,209,137,153,214, 97,
- 13, 96,130, 65,137, 61, 0,163, 1, 94,180, 6,115, 78, 68,129, 42,208, 82,223, 1, 47,223,238,101,202,148,225,196, 91,220, 78,
-129,109, 73,222, 2,249, 60,164, 45,151, 44, 36, 89, 43, 8,182,240,127,133,122,141,247,153,143,239, 5,109, 75, 53, 99,168,193,
-167, 30,194,130, 52,141, 17,163,189,231,236,217,173,125,159, 60,105,143, 25,176, 51,211,173,139, 23,187,252,212,178,229,113,120,
- 37, 62,123,245,236,217,221,136,171,231,142,112, 10,238, 0, 57,238, 80, 33,210, 35,177,122,216, 28,208,160, 38,156,177,123,239,
-161,203,247,110,223,123,126,245,204,249, 71,131, 59,246,222, 52,164,223,136, 53,191,141,152,186,112,209,138,173,171, 22, 46, 95,
-187,145,121,116,212,189, 43,226,122, 93, 71,220,192, 0,132,134, 48, 35, 28,141,185,113,227,198,102,120, 5, 54,187,187,187,191,
- 71,104, 7,243,204,153, 51,205,136,249,104,238,212,169,147,185, 78,157, 58,102,120,122,191,129, 56, 93,246, 34, 2, 88, 3,131,
- 64, 56,123,244, 68, 32,109, 15,196,178,244,168, 88,177,162,199,183,223,126,235, 81,171, 86, 45, 15, 72,243, 60, 16, 7,210,211,
- 25,224,170, 74,182,248,107, 89, 55, 2, 44,132,139,122, 4, 32,247, 8,222,220, 31,193, 19,253, 35,132,147, 80, 18,239,105,241,
-211,138, 79,163,170, 87,175, 22, 72,144,133,128,213, 47,224, 37,222, 11,193,198,207,186,185,101, 9, 11,128,201,134, 88,105,207,
-232,189, 26, 81, 16,158, 88,190, 39,239,183,173,135,189,124,237,251,186,215,208, 63, 86, 38,207, 89, 59,175, 85, 25,172,129, 43,
-251, 38, 99, 57, 62, 70,120, 41, 47,244,197, 90,200, 63,247,250,245,235, 94, 76, 56,159, 3,105,107,114,120,218,223,131, 54,242,
-142, 28, 41,146,178,232,208,234,159, 90, 31,179,142,251,198,132,171,131, 73, 78,100, 49,248,233, 4,179,116,100, 53,248,169,131,
- 73, 78,100,249, 28,252,116,226,245,255,184,172,214,146,172,144,126,180, 48,137,138,154, 28, 21, 29, 3,250, 58,132, 75,241,194,
- 68,204,193,125,157,179,213,132,180, 98, 26, 7,124, 78,166, 8,237,114,189,124,249,242,238,182, 18,239,169,224,133,207, 56,249,
-158,209,124, 7, 19,202,120,237,167,159,126,114,135,116,198, 29,129,171,169,138, 91,139, 64,156,170,170,197, 33, 89,170, 5, 9,
-250, 8,168,212,140, 60, 15, 2, 90, 33,174, 49, 31,243, 59, 34, 88, 23, 94,117,123,230,200,241,147,223,179,103,237,223,223,191,
-223,230,222,234,213, 13,111, 78,157, 90,215,227,183,223,154, 55,172, 82,101,245, 5,136,176, 16, 83,226,236,198,249,243,207,205,
-153, 54,109, 23, 2, 22,187,247,234,213,107, 19,188,252,182,209,170, 63, 64,212,129, 11,151,110,220,251,165, 75,255,109, 99,122,
-252,186,229,143, 81,147,221,231,204, 90,178, 97,222, 82,247, 21, 75,215,120, 44, 58,122,242, 2,129,214, 1, 45, 58,240,206,126,
- 2,225, 23, 30, 1, 8,153, 17, 18,199,140, 80, 17,102, 76,230,102,134,143,128, 4, 43, 0,113, 40,205,136,241,103, 46, 82,164,
-136, 25,128,201, 12,126,154, 1,200, 94,131,246, 27, 59,180, 21,224,171, 34, 18,182, 41,226, 80,122, 66, 98,231,113,247,238, 93,
-143, 83,167, 78,121, 32,216,183, 7, 2, 98, 43, 9, 18, 51, 71, 64, 43,212, 43, 28, 1, 45,132,230,120,132,246,186, 98, 67,170,
-101, 41,209,210, 98,137, 9,146,208, 60, 8,242,125, 22,146,188,179,136,245,229, 5,201,158, 23,226,149,157,173, 81,163,186, 61,
-160, 21, 76, 19,239,110,143,126,241,144, 9, 30,240, 71, 48,176, 54,131,125,243, 80,129,150, 42,201,114,201, 93,179,251,230,157,
-135,143, 62,122,226,243,180,112,213, 14,191, 39,204, 87, 43,161,189,194,193, 62,206, 21, 65,212, 55,157, 61,123,214,235,193,131,
- 7, 94,136,195,233, 5, 73,155, 23, 64,171,146, 16, 51,211, 11,224,213, 11,223,180, 34,225, 2,224, 58, 6,169, 97, 30,205,202,
- 26, 25, 12, 14, 24, 28, 48, 56,240, 55,114, 64, 47, 22,249, 27,139, 24,190, 87,179,130, 90, 20, 48, 81,204,130,132, 0, 88,195,
-139, 64,139,161, 88,156, 62, 0, 28,126,131,202,105, 7,130,243,186,103,204,152,209,218, 54,199,196,107,188,199, 60,204,235,244,
- 11,254,122, 64,181,157,137,130, 16, 42, 5, 17,252,119, 46,130, 55,187,175, 89,179,134,210,168,222,122,104,218, 3, 85,182,128,
-150,245, 53,107,250, 8, 96, 22,155,146, 44,130,172, 23,199,143, 55, 29,215,160, 65,199, 44, 25, 50, 92,206,128,104,233, 69,139,
- 20,121,217,187, 71,143,123, 55,207,157, 59,121,253,226,197,147, 71, 15, 30, 60, 51, 17,147,250,208, 33, 67,182, 98,146,103,148,
-248, 36, 90,229,133, 45,213,230,115, 23,175, 95, 31, 61,246,207, 77,183,174,223,186,179, 98,241,154,173, 91,119,236,219,242,196,
-231,229, 29,207,131,167,214, 28, 61,113,110, 53,243,104,209,129, 74,203, 23, 82, 52, 95, 74,170,240,107, 70,232, 29, 51, 38,112,
- 51,164,129,230, 82,165, 74,249, 55,106,212,200,220,181,107, 87, 51,164, 81,102, 76,222,230, 98,197,138,153,161, 58,188, 6, 53,
-224, 25,123,180,161, 98,155,171,130,107,196,118,188,213,178,101, 75,143,230,205,155,123, 32,134,152, 7,164, 47, 30,176,251,242,
- 64,172, 71, 15, 72,206, 60, 64,223, 3,113, 6,111, 5, 1,101,205,141, 8,142,128, 22, 84,176,214,210, 43,173,234, 91,223,143,
- 12,160,212, 28, 11,129,163,115,230,204,241, 66,192,107,175, 63,254,248,195, 11, 0,216, 11,177,196,188, 16,200,245, 5, 37, 93,
-142, 54, 76, 48,120, 56,236,237, 4,101, 17,240,202, 23,182,109, 74,108, 54, 30,232,231,138, 68, 75,149,100,245, 28, 60,125,165,
-107,241, 38, 35,111,220,121,112,127,251,190, 19, 94,201,114,215,178, 12, 46, 28,170,236,148, 88, 81,205, 78, 9, 22, 2,214,122,
- 65,122,231,197,111,147,255,175, 92,185,226, 5,224,170,128,172, 97,195,134,241, 91,173,225,108,229,141,252, 6, 7, 12, 14, 24,
- 28,248, 59, 56,160, 7,139,252, 29,229,210,241, 78, 85,162,101, 63,222,161,158,202, 69, 4,208,226, 4, 81,169, 82,165,245, 4,
- 39,136,136,238, 78,137,129, 90, 1,158,243, 26,239, 49, 15,243,234,168,156,102, 22,128,173,236, 42,221,130, 5, 11, 46,212,124,
- 0, 25, 34, 18,104, 53,141, 25,179,180,231,159,127,182, 54, 63,122,212,118,116,253,250,157,146, 37, 77,234,135,168,232, 1, 8,
-130,106, 70,224, 78,243,209, 35, 71, 2,218,181,105,243,220,115,203, 22,175, 25,147, 39,123,149, 45, 80,224, 72,214,228,201, 23,
-163, 24, 25,245,148, 21, 6,218, 3, 86,175,219,124,250,240,241,115,167,230, 45,217,176,206,247,237,251,215,254,254, 1,111,206,
- 93,190,177,251,234,205,251,187,254,156, 61,111, 19,243,104,209,130, 26,244, 44,212,172, 15,160,194, 51, 83,122, 5,201, 8, 1,
-150, 25, 18, 29, 51,164,140,175, 9,186,160,238, 83,174, 21, 42, 84,200,140,137,222, 12, 16,187, 31,116, 17,210,204,254,129,119,
-103, 0,208,203,170,218, 97,161,157,115, 67,229,165, 72,177,186,116,233,226,193,255,234, 61,254, 50, 63,168,105,186, 47,112, 4,
-180,176,169, 32,204, 64, 11,253, 37,125,230,204,153, 23,206,154, 53,211, 11, 18, 56, 47, 0,127, 69, 58, 4,155, 53,175, 37, 75,
-150, 40,231,160, 79, 0,195,141, 0,118, 93,128, 0,104,121, 19,104, 81,138, 53,127,254,124,193, 70, 2, 37,125,250,244, 73, 16,
- 59, 82, 1, 90,201,242,212,252,193,125,231,161, 35, 15,189,159, 61, 73,145,191,238,192,105,243,215,123,240, 60,121,158,154, 29,
-181,218, 11, 64,208, 13, 64,112, 37,108,230,188, 32,113,244,154, 52,105,146, 2,176,176, 72,241, 66,127,247, 2,112, 61,150, 33,
- 67,134,159,181,232, 24,247, 13, 14, 24, 28, 48, 56,240, 79,225,128, 30, 44,242, 79, 41,171, 85, 57,180,109,179,244, 84, 46, 34,
-128, 22, 11,134,137,181, 29, 36, 2,238,187,118,237,114,135, 10,101,130, 90, 88,158,243, 26,239, 49, 79, 68, 49, 19,147, 77, 6,
- 72, 81, 20, 0, 7,144,176, 74, 15, 93, 11,160, 21,108,143, 69,219, 44,107, 27, 45,139,107,118,221, 64, 52,143, 27,183,193,139,
-187,119,219,123,111,222,220, 48,115,186,116,215,183,123,120, 4,124,248,240,193,252,206,207,207, 12,155, 55,179,207,179,103,230,
- 85,176,139,106,222,168,209,237, 38,213,171, 47, 56,176,114,101,171,102,113,227,194,164, 75,247, 17, 55,153, 75, 10,207,243,151,
-174, 93, 63,126,234,226,190, 85,107,183,236,217,179,239,208,177, 71,143,159, 29, 59,119,241,202, 97, 24, 94,239, 5,165,120, 58,
-168, 13,106,218,180,233, 25,128, 32, 69, 45, 88,162, 68, 9, 5,100,209, 70, 11,170, 51, 26,194,251, 67,117,230,255,195, 15, 63,
-248, 3,116,221,133,250,234, 48,118, 29, 30, 7,221, 24, 58,104, 7,103, 65,112,234,158,136, 8,239, 1,208,225,177,117,235, 86,
- 15,254,119,230,121, 53,175, 35,160,245,252,249,115,107,213,161, 46,149, 33,193,126,185,114,229, 14, 31, 61,122,212, 11, 42, 78,
- 69, 53,119,243,230, 13,175,115,231,206,122, 65, 5,173, 72,140, 0,158, 20,169, 22,218,190,161,163,114,131,239,222,144, 50, 9,
-158, 19,240, 80,249, 5,192, 86, 36, 92,120, 86, 1, 90, 25, 50,148,139, 89,185,113,223, 25,175,223,248,189,173,213,114,192,220,
-166,157,135, 45,228,121,233, 90, 93,161,138, 30,172, 39,232,178, 9,224, 52, 58,232,149,132,180, 80,145, 98, 65, 58,232,133,122,
-100,193,247, 20, 31,215, 99, 3, 56,182,163, 36, 23, 18,226,176,237,130, 9, 75,227, 24,207, 24, 28, 48, 56, 96,112, 32, 12, 28,
-208,131, 69,194, 64,246, 75, 60, 18,126,137, 22, 37, 13,144,120,248,163,180, 84, 49, 10,207, 57,144,135,165,244,176, 87, 73, 0,
-192,179, 22,246, 57,238,152,212, 9,170,138, 50,241,156,215,120,143,121,194, 66,219,214, 51, 88,249,183,152, 54,109,154, 59,236,
-143,220,113,254,171, 30,186, 42,208,178,181,219,208,214, 53, 75, 91, 46,107,250,141,163, 69,235, 0, 49, 70,167,251,243,231,215,
- 65, 52,116, 63, 74,178, 8,178,252, 33,205,186,119,247,174,249,192,254,253,102,216, 39,153, 11, 21, 40,224,115,102,197,138, 58,
-175,175, 93,107,196,103,244,148,211, 34, 79,134,114,229, 43,158,122,248,248,217,229,237,158,135, 55, 29, 61,113,118,235,139,151,
-175, 79,127, 83,190, 34,141,163,179,232,164, 21, 3,192,233,232,119,223,125,119, 28,147,246, 93,252,154,139, 23, 47,254, 30,118,
-110,102,203,148, 56,113, 98, 51, 84,130, 55, 65,147,224, 50,150, 78,218, 74, 54, 96,222,132,176,239,218, 12,251, 34,143, 3, 7,
- 14, 40, 54, 90, 53,107,214,220,204,235,206,208, 97, 94, 45,160, 5,163,245, 71, 0,115,143,206,157, 59,167, 91,186, 5, 80, 50,
-137,234, 65,216,244, 1, 84, 93, 83,128,214,147, 39, 79,188,158, 61,123,230,101, 54,155, 21,245, 28, 64,232, 33,244,215, 38, 40,
-130, 45, 31, 98,193,213, 72,152, 48, 33, 93, 97,200,242,229,203, 5, 0, 86,176,137, 64, 73,215,174, 93, 19,108,114,136, 48,160,
-133, 62, 93, 31, 60, 69,145,143,121,209,110,107,213,170, 85, 94,248,134, 54,161, 79, 54,134,250,119, 43, 85,158,171, 87,175,246,
-130, 20,205,161,228,209, 89,254, 27,249, 13, 14, 24, 28, 48, 56, 16,209, 28,248,138,129, 86,248, 88,129,201,167, 12,156,104,238,
- 32,192, 82, 15,158, 67,226, 65,231,149, 97,218,121, 0,154,205,160,234,112,135,113,189, 59,212, 79, 51,152,120,206,107,188, 23,
-190, 18,255,255,105, 76,136,223, 97,146,219, 68, 0,247,219,111,191,113, 23,223, 55,122,104, 71,164, 68, 43, 24,104, 45, 90, 84,
- 39, 81,194,132,126,111,223,190, 53, 51,193, 32,220, 12,233,150,121,217,178,101,230,121,115,231,154,179,101,205,250,196,255,248,
-241, 42,222,231,207, 55,128,219, 7, 58, 3,117,234,128, 81,250,250,107,215,111, 31, 62,121,246,234,138, 43, 55,238,174,184,121,
-231,238, 46, 94,115,138, 8,220, 79, 32,255, 72, 2, 41, 0, 5, 74,178,204,144, 62,153,247,237,219,103, 6, 80, 85,118, 28,130,
-230, 3, 11,154,241, 96,104,189, 48,126,252,248,195,245,188, 7,109,219,100,209,162, 69, 10,192,194, 14, 60,143,195,135, 15,123,
- 64,130,233,193,235,122,158,183,204,227, 8,104, 1, 24,133, 73,162, 5, 48,178, 7,155, 27, 20,245, 32, 19,193, 11,193, 22,212,
-125, 94, 99,199,142, 61, 65,215, 17, 80, 9,234,138, 24, 0,158,120, 99, 67,129, 96,167,166, 64,141,167,168, 15,167, 78,157, 42,
-144,218,210, 45,131, 2,180,146,231,170, 89, 59,172,170, 67, 62, 79,201, 47,164,101, 10,192, 2,168,243,194, 38, 6, 69,221, 9,
-190,122,141, 26, 53, 74,145,194,113, 3, 75,144, 4,238, 71,103,121,108,228, 55, 56, 96,112,192,224,128,193,129,207,200, 1, 76,
- 58,137, 48,177,140,228,174, 38, 24,147, 83, 50, 18, 2,104,113,117,255,251,239,191,123, 65,245, 51,193, 89,123, 42,228,143,131,
-213,246, 10, 2, 32,184, 10,216,193,196,115, 94,227,189, 48, 84, 43,132,243, 72,148, 59, 31,118, 24, 14,131,237,138, 34, 37,163,
-187, 4, 24, 32,143,135, 90, 40,170, 30,218, 17,105,163, 69, 53,224,139, 7, 15,218,189,218,183,175, 1, 85,135,144,112, 4,248,
-248,248,152, 33,209, 49, 47, 7,200, 66,217,204,224,177,127,174,172, 89,143,125,188,113,163,234,209, 69,139, 26, 66,221,168,199,
- 33,108,136,170,228,112, 75,119,169, 65,221,202,239,107,124, 95,198,183, 76,201, 60, 47,203,151, 43,248, 54,123,150,180,151,244,
-212,215, 50, 15,128,211, 78,164,187, 0, 10, 47, 97,239, 99,198,238, 71, 69,125,248,235,175,191,154, 33, 25, 49, 3, 36, 60,229,
-125, 38, 0, 36,111, 0, 19,127,228, 37, 16,119,120,192, 62, 46, 90,201,146, 37, 87, 17,100, 1, 80, 19, 92,253, 9,233,145,135,
-167,167,167, 7,140,197, 87,241,190, 22, 13,189, 64, 11,118, 81,186,165, 88,150, 52,209,111,118, 17, 96,169,118, 89, 60, 71, 91,
-121,193,181, 3, 85,133, 53,157, 41, 31,248,243,112,242,228,201,130,246, 21, 72,132,223, 99,131,129, 76,159, 62, 93,102,204,152,
- 33,144, 10, 42, 64, 43,247, 55,173,126,163, 91, 7,103,141,225,249, 44, 85,134, 80,225, 30, 34,200,194,110, 80, 47,216,205,109,
-163,138, 16, 0,246,216,134, 13, 27,188,208,191, 20,187, 50,228, 57, 74,245, 33, 30,137,226, 76,249,141,188, 6, 7, 12, 14, 24,
- 28, 48, 56,240, 25, 57, 0,144, 85, 31,170,193, 99,152, 92,189, 48, 65,120, 97,101,238, 5, 7,136,102,130, 45, 38,168,246,204,
- 84,169,208,175, 22, 86,232, 94, 5, 10, 20, 56, 78, 21,157, 51, 69,194,224, 95, 23,147,131,226,202,129,137,231,188,230, 12,141,
-160,188,170, 83,204, 64,120, 65, 63, 12,195,237, 37, 52,126,135,253,143, 98,151, 69,155, 47,128,172,113,180, 87,209, 75, 59, 34,
-129, 86,163,168, 81, 75,109,159, 58,181,181,249,197,139,118, 83, 58,118,108,159, 56, 81, 34,191,137, 19, 38, 4,120,108,219,102,
-158, 51,123,182,185, 77,235,214, 1, 80, 41,250,174,159, 50,165,209, 71,111,239, 26, 19,106,212,104,209, 32, 90,180, 98,122,203,
-202,124,144,108,148,107,223,182,169,248,250,190,144,167, 79,238,202,166,117,211,101,193,156, 65, 82,188, 72, 46,225, 61,103,104,
- 65, 98,117, 31, 18, 17, 51,252,121,153,193, 63,101,231, 33, 29,148,246,235,215, 79, 1,133,144,148, 40, 70,252, 76, 0, 77,102,
- 24, 96,155,245, 0, 45, 72, 19,203,193, 69,130, 34,197, 2, 24,216, 8, 30, 39,229, 47,237,181,250,244,233,227,161, 87,218,168,
-214,197,145, 68, 11,125, 51, 76, 64, 11,101,154,209,185,115,103,130,148, 19,180,211,218,182,109,155, 34,205,130, 61,218, 94,103,
-129, 10,212,235,237,209, 31, 31, 50,193,192,127, 4,119, 26,194, 53,138, 0,100, 10,248,165, 74,180, 74,228, 40,221,114, 64,242,
- 92,181,122,234,117,239,160,214, 31,101,138, 7, 73,153,215,153, 51,103,188,176,251,211, 11, 54, 88,138,235, 18, 44, 84, 50, 97,
-135,231, 12,180,155, 7,126,255,228,127,103,218,223,200,107,112,192,224,128,193, 1,131, 3, 78,115, 64,181, 43,215,239, 25,158,
-158,223,225,224,209, 11,246, 36, 94,144,104,208, 23,207, 9, 76, 66,125, 8, 86, 0,192, 98,224,183, 43,189,100,159, 60,121, 82,
-177, 93,129,221,145, 45,111,241, 14,213,138,152,128,210, 90,121,129, 39, 80, 74,171, 81, 61,107,154,161,156, 98,170,158,220,231,
-205,155,231,142, 50,110, 4,120,251, 25, 54, 64, 84,137,217, 59, 66,149, 51, 2,128, 86, 48,205,150, 80,199,209,189,195,243,251,
-247,219,190,187,121,179,209,159,189,122,181,118,205,144,225,106,146,196,137,223,194, 96,218, 55,107,230,204,231, 87, 77,158,220,
-216,255,238,221,106,167, 87,172,168,135, 93,138,109,186,216, 54, 48,119,200, 79, 55,215,116, 50,117,194,175, 50,126,116, 47,233,
-217,249, 7, 37,185,102, 74,163,229,182, 35, 20, 77,128,130,243, 52,214, 70,242,165,147, 82, 26,196,247,236,217, 83, 1, 90, 19,
- 38, 76, 48, 67, 42,101,222,184,113,163,146,134, 14, 29,106,134,219, 12,107,160,101,179,156,232, 55, 19, 1,202, 61,160, 42,245,
- 0,109, 84, 81,217,221,217, 5,224,205, 3, 52, 60,120,223,153, 54,114, 4,180,188,189,189,245, 0,173, 80,229,164,221, 33,250,
- 75,183,252,249,243, 31,225, 2,131,139, 9, 2, 45, 92,219,162,243,179,115,212, 70,217, 0,122,159, 64, 74, 40,216,133, 25,194,
- 97,169, 42,217,210,225,176, 52,184, 24, 4, 90, 4, 88, 84, 21,194,185, 44,193,160,158, 13, 15,234,243, 97, 82,249, 59,249,109,
-234,100,153,195,108, 70, 57, 35,130,139,255,167, 97,240,211,224,103, 68,113,224,115,244,165,136, 42,219,223, 65,199,121,207,240,
-152, 0,119, 16,100,193,190,196, 11, 43,241, 99, 0, 94,214,222,170, 57, 73,102,227, 61,130,172, 32,223, 90, 59,173,106,167,213,
- 16, 33, 28, 90, 6,121,175,214,178,127,209, 4, 90,240, 3,181, 3, 70,220,244, 4,255,147, 78,149,166, 35,160, 21,214, 93,135,
- 33,104, 34,216, 96,166,206, 25, 50,252,244,244,218,181, 31, 63,190,120,209,196,255,226,197, 26,126,167, 78, 85,245,191,112,161,
-178,220,185, 83,149,146, 44,130,172,150,137, 18,253, 84,199,100,178,140,167,103,201, 82,187,252, 12,150,104,189,121, 46, 79,188,
-239,200,198,181,211,100,254,236,129,122, 36, 90,118,105, 2,244,222, 37,208,130,186,203, 12,219, 34, 51,124, 95,153, 33,145, 50,
- 3,180, 62,133,234,235, 49, 19, 36,159,207,186,119,239,174, 11,104, 85,169, 82,101, 21,108,189, 20, 47,240, 80,235, 42,174, 43,
-248,219,160, 65, 3, 15,168,186, 60,160,214,117,199, 37,123, 6,230,193,229, 12, 14, 42,173, 29,130, 71,107,167,161,221,186,115,
-135, 30,250,207,112,248, 12, 59, 1, 99,122, 2, 45, 15,157, 95,174, 86,159,207, 6,199,176,119,224, 77, 63,100, 8,158, 92, 53,
- 75,100, 47,211,226,215, 20,185,107,126,103,227, 61, 54,105,170, 64,235,200,145, 35, 94, 48,134, 55,128,150,206, 6, 66, 54,173,
- 54,210, 79,201, 0, 48,228,128,193,207,176,244, 24,251,207,252,151,249, 25,177,156,252,178,212,172,253,103,105,123, 78, 8, 10,
- 32,189, 3, 96,106, 55,206,237,186, 26,208, 8, 52,173,167,195, 56, 10, 32,109,139, 77,182,104, 6,171, 14, 97,196, 61, 63,200,
-251,187, 51,246, 40,118,129, 86, 56,118, 29,134,162, 9, 95, 0, 25,154,197,140,217,118, 89,247,238, 63, 94,218,177,163, 25,118,
- 23, 54,126,118,225, 66,195, 99,139, 23, 55,162,186,144,146, 44, 7, 32, 75,115, 64,115,205,156,198,163, 74,197, 98,210,185,125,
- 93, 37,241,156,215,194, 33,133,200, 15, 53,226, 61, 0,170, 71, 80, 21, 63,130,113,252, 35,168,188, 30, 81,226,101, 65, 51, 53,
-108,145,246, 67, 66, 99,233,192,214,102,187, 3, 12, 54,134,100,116, 45,192, 89,136, 14,136, 62,214,168,116,233,210,107, 96,235,
-231,200, 93, 66, 48,205, 47, 24, 84,218, 68, 31,108, 72, 19,144,122,232,252,102,245,244,121,157,164,130,179,217,164, 73, 41, 45,
-237,175,104, 4,143,157,155, 39, 52,164,182,214,239,252, 98,229,116,182,178, 78, 46,214,194, 66,254,191, 92,247, 74, 97, 97, 88,
- 56,198,144,176,190,238,191,220, 70,255,229,186, 59,236, 47, 48, 18, 47,130, 84, 45, 40,241, 92,253,111,121, 94,209, 34, 15,243,
-170,255,139,144,184,197, 51,193,215,109, 92, 83,223, 97, 73,171, 40,242, 57,229,202, 40,172,157,223,217,231,244,118,152, 16,134,
-236, 97,252,168,157,161,161, 57,233, 0, 20,180,165,250, 80,111, 98,126, 61, 19, 4, 85,130,176,217, 42,222, 44, 86,172,122,220,
-141,200,221,133, 52,124,167, 77,150, 29,117,161, 37, 89, 93,252,116,115,115, 83,236,232,116, 54,150, 46,154, 58,105,169,217, 62,
- 43,205, 96,137, 86,238, 90,231,146,230,169,145, 21,192,235,156,101, 80,105, 39,202,250, 89,203,233, 68, 57,180,178,218, 45, 39,
- 36,202,157, 16,135,241, 40, 22, 60,221,180,136,232,233,159, 78,210,208,252,142,194, 73,143,143,127,245,109, 20, 14, 30,124,142,
-186, 27, 64, 43, 28, 13, 98,227,209,207,209, 70,255,101,154,118, 91, 71, 5, 67, 65,115, 27, 55,230, 41, 96,232, 47,236, 20,242,
- 92,205,163,222,179,248,101,230,224,103,244, 62,203,124, 48,157,233,143,103,203, 59,209,125,180, 37, 90, 78, 16,115,148,245,191,
-220, 97,140,186, 71, 80, 39, 10, 34, 99,240,211, 14, 63,245,238,164, 53,128, 86, 48, 7,140,190,100,124,155, 17,197, 1,163, 47,
- 69, 20, 39, 53,232, 56, 2, 85,142, 64,151, 21,176, 10, 5,180,108,128,177, 96,224,102, 11,148,125,161,234, 58,245, 26,163, 19,
- 58,197, 46,205,204, 6, 63, 53, 89,228, 84, 6,131,159, 78,177, 75, 51,179,193, 79, 77, 22, 57,149,193,224,167, 83,236,210,204,
-108,240, 83,147, 69, 78,101,248, 28,252,180, 91,128,207, 5,180, 84,186,150,128,203, 90,210,101, 33,209,114, 84,103,235,221,134,
- 33, 36, 90,124,208, 86,114,134,227,246,104, 56,186,174, 69,223,160,105,187, 93,194,218, 94, 6, 63, 13,126,234,237, 3,198,183,
-105,159, 3,122,121,104,153,207,224,167,193, 79, 91, 28,248, 47,247, 37,149, 31,186,231,179,136, 0, 90,182, 84,140,142,174, 57,
- 41,209,114,126,215,161,214,200,160,243,254,231, 64,188, 6, 77,157,204,215,153,205,224,167, 78, 70,233,204,102,240, 83, 39,163,
-116,102, 51,248,169,147, 81, 58,179, 25,252,212,201, 40,157,217, 12,126,234,100, 84,120,179,217,177,209,170, 74,219, 41, 74,156,
- 44,164, 78,223,218, 2,101,106,158,176,216,104, 89,171, 31,237,212,197, 82,130,165,238, 64, 12,111,181,117, 61,111,116, 66, 93,
-108,210,157,201,224,167,110, 86,233,202,104,240, 83, 23,155,116,103, 50,248,169,155, 85,186, 50, 26,252,212,197, 38,221,153, 12,
-126,234,102,149,174,140,159,131,159, 14, 95,108, 99,215, 97, 12, 92,227,110, 64,203,157,136,209,236,236, 70,180,222, 73,232,204,
-174,195, 16, 59, 23,117,113,231, 11,102,250, 28, 13,241, 69,104,230, 79, 25,121, 88,173, 34, 41, 61,152,106, 22, 78,225, 81,163,
- 96,114, 37, 85, 43,144, 76, 73,223,231, 79,186, 77, 73,121, 19,111,251, 46, 79,162,109,121, 93, 76,195,172,248,234, 84, 57,179,
-165, 54, 37, 41,235, 26,107,113,233,204, 49,239, 4,165, 5,185, 19,152, 18, 57, 67, 51, 71, 10, 83,206,130,169, 76, 11,242,167,
- 52,157, 97,226, 57,175,105,180,183,222,114, 70,202,157,220,212,190, 80,134, 56,158,223,230, 79,251,176, 64,250,152,123,114, 37,
- 55, 49, 30,163, 45,191, 87,154, 52, 93, 19,155,138,103, 74,100,114, 71,218,146, 53,137, 73,207, 78, 14, 77,154, 97,232,215, 6,
-205, 48, 48,205,193, 35, 6, 63, 13,126, 70, 20, 7, 62,107, 95,194, 68, 28, 37, 60,201,162,146,193,229, 4,189, 72,225, 73,182,
-104, 70, 20, 51, 65,231,179,242, 51, 2,203,105,144,194,196,218, 33,151,139,233, 9,146, 55,207,117,112, 36, 68,227,230, 74,101,
-170, 88, 56,109,148,187, 72, 15, 64,163, 65,206,100,166, 20,182, 18,239, 49, 15,210, 61, 62,227, 12,216,200,157,198, 84, 53,127,
-170,200, 62,121, 83, 70,122, 13, 58, 83, 80,206,138,197,211,152, 98, 57, 11, 54, 8,176,184,245, 96,247,140,174,226,119,120,170,
-188, 61, 48, 81,222,238, 27,203, 75,178,115, 66, 51,241,221,254,171,188,217,214, 87,222,108,233,169, 92,171,154, 59,193, 86,103,
-202,105,153,151, 32,171, 74, 62,151,135,247, 79,184, 7, 6,190,188, 45, 31,159, 93,149,243,155,167,124,172,144, 35,225,125, 43,
-176,101,247, 99,201,151,202,212,166,102,201,236, 87,247,238,220,118,227,218,165,139,222, 87,206,158,124,224,185,126,209,249,218,
-197, 51, 92,230, 61, 39, 38,199, 72, 4, 80,249,210,197,216, 83, 34,107,146, 7,121,211, 68, 83, 0, 85,158,212, 81, 55,110, 95,
- 62,237,190,249,249,237, 87,239,111, 31,126,243,230,230,225,167,179, 71,116,185,149, 39, 85, 20, 58, 25,141,236,108,221, 1,176,
-214,155,221,219, 5,202,182, 14,146, 35,101, 84, 45, 95, 95, 36,111,179,238, 57, 93, 76,141, 81,190, 63,181, 18,243,217,224,129,
-174,193, 39,135,139,105,110,206,228,166, 67,160,209, 13,239,113,113,182, 47,233,248, 78,180,178,232, 42,167, 22, 17,103,219,200,
- 73,122,118,219, 40, 12,116, 44, 31, 49,234, 30, 78, 6, 26,237, 30,204, 1, 75, 80, 20, 10,104, 69,138, 20,105,159, 94,240,165,
- 23,104, 33, 95, 9,189,224,203, 0, 90, 17,219,209,191, 90,106, 0, 46,207,229,205, 61,145,151, 55, 4,231, 62, 58, 42, 18, 98,
-144, 4,112,122, 36,239,158,137,188,121, 40,179,250,214,148,169, 61,106,202,196, 46, 85,101, 92,135,111,101, 76,219,178, 50,226,
-199,226, 50,180,105, 33, 25,210, 32,151,136,223, 83,145, 23, 55,164, 80,154, 40,143,156, 25, 40, 10,164,142,236, 19,120,115,167,
-200,165,213,178,180, 75, 1, 25,213, 32,139,148,207, 26,251, 41,202,219,218, 6, 32, 80, 73,135, 26,204, 9,180,118,255,209, 85,
-126,252, 54,211, 61, 85,146,213,226,155,244,119, 9,178,154,149, 73,125,151,146, 44,166, 38, 37, 83,222,217, 49,162, 90,184,128,
- 22, 37, 89,119, 15,175, 10,252,116,123,183,152, 55,183,151,119, 27,219,200,235,179, 27,100,215,140,206,159,202,101,137,185, 64,
-235, 3,204,238, 98,202, 85,187, 84,206,203,111, 94,189,242,127,116,247,234,235,249, 35,235,122,205, 31, 88,247,136,199,172,129,
- 94, 23,246,174,187, 84,179,104,218, 75,204, 99,167,189, 44,235, 30, 25, 96, 98,147,251,252,113,247,222, 61,185,250,242,237,141,
- 3,111,158,157,217,250,104,100,215, 58,222, 27,230,141,241,125,127,113, 99,192,253, 63, 42,155,175,142, 41,100, 62,255,123,105,
-243,173, 77, 67, 3, 38,247,109,122, 21,188,237,234, 76, 27, 49,111,250,132, 38,119, 21,104,101,115,137,106, 29, 81,192, 86, 81,
-109, 78,184, 4, 88,230,155,123,228,253,254,209,242,206,115,152,188,219,245,155,248,109,239, 39,126, 91,123,136,159,123, 23,121,
-187,177,189,188, 93,215, 74,152, 47,172, 64, 11,207, 62,120,124,245,120,224,233,189, 27, 62, 52,175, 86,228, 9, 64,215,252,156,
-127, 73,225,172, 1,166, 30,176,145, 45,115,210, 40,119,210, 37,138, 18,194, 51,124,133,108, 49, 75, 54, 43, 28,107, 80,153, 44,
-177,203,133,181,156, 58,190, 71, 3,192,252,197, 1, 3,188, 57,217, 89, 52,178,127,117,252,180, 5,168, 8,180, 80, 79,174,155,
- 53,165, 93,206, 0, 45,228,165,202, 74, 83,218,165, 49,206,247,198,253,171, 65,137,231,206, 30,182,218,136,225,238,232,196,147,
- 73, 43,244,157,238, 49,217,217,130,253,139,242, 91,251,205, 10,155, 31, 45, 76,168,239,228,245, 29,145, 89,185, 9,180,222,233,
- 96, 80,136,198, 45,148, 54,202, 75,121,255, 66,228,249, 85,121,186,111,186,200,149,117, 34,231, 23,139,156,252, 83,228,232, 4,
-145, 3, 67, 69,246,244,147,167, 75, 26, 2,204,221, 18, 57, 62, 69,242,165,142,252,194,234, 61, 14, 63,106, 5,104, 93, 92, 45,
-178,182,158, 60, 89, 80, 91,100, 67, 99,121,183,188,182, 76,106,158,157,101, 94, 97,167,204,161,104, 82, 93,232,119,120,154, 16,
-100,169,207, 80, 85,232,187,227, 55, 33,192, 82,175, 81,146,245,122, 93, 59,169,156, 59,126,152, 37, 90, 80, 21,222,253,248,248,
-140,152,183,116, 16,255,165,223,201,227, 25,229,228,248,196, 58,114,106,245, 72,161, 26, 81,227, 3, 52, 65, 69,184,196,115,219,
-230, 27,143,239, 94,121,253,224,250,254, 23, 91,198,124,115,122,251,136,178, 39,183, 15, 44,115,232,200,159, 93,142,237,157,251,
-203, 33,230,209,170, 59, 1,211,246, 37,147,238,250, 93,221, 17,112,115,122, 21,243,153, 97,249,204, 94, 35, 75,154, 47,173,232,
-107,126,124,122,139,255,237,105,229,205,143, 60, 70,153,159,122,173, 54,159,154, 92,203,188,187,127, 94,243,169, 85, 67,239,230,
- 75, 27,253,132,189, 54,114, 75,102, 42,221,245,135,162, 15,167,244,172, 35,147,123,212,146,137,221,106,202,132,174,213,100, 72,
-219,202,210,179,105,121,233,214,168,172,252,218,226, 27, 25,221,174,188,140,108, 83, 78, 70,180, 46, 35,237,191,203,241, 22,170,
- 69,235,160,218,118, 37, 90, 0, 62, 23, 63,220, 59, 34,239,118,244, 23,158, 91, 74,183,248,223,255,212,252,240, 0,173, 72, 0,
-159,119, 15, 79,170, 19,248,240,180, 71,224,123,132, 56,122,124,227,108,224,212,129,237,223, 66,210,229, 44,120,203,214,173,108,
-140,103,242,209, 95,138,103,136, 26, 34,214, 97,187, 18,177,135, 5,190,188,245,250, 96,247,228, 43,203,102,137,101, 29,238,234,
-171,155,200,116,140, 13,122,179, 24,117,215,203, 41,125,249, 12,126,254,133,166,236, 73,180, 20,163,106, 45,176,229, 12,208,186,
-115,231, 78,126, 61, 96,203,222, 56, 15,103,216,101,131,202,164,104, 79,120, 14, 71,197,190,106, 66, 36, 20, 95,139,116, 63, 40,
-191,117,111, 8,209,238,213,170, 85, 75,141, 12,101, 65, 78, 73, 60,183,151, 16, 21,164, 84, 80,126,135, 52,245,117,191,127,117,
-174,136,217,117,136,137,216,235,206,236,154,114,101,112, 6,130, 22, 47,103, 89,150, 51,133,169,239,252,190,213,196,235,207, 22,
-178,103, 92, 67,233,219,160,168,244,250,161,128,116,175,149, 71,186,124,159, 77, 58, 86,118,149,246, 21,210,203,250, 94,133,228,
-233,236, 74,242,107,141,180,146, 43,133,201, 41,244, 14, 85, 99,165,124,169, 34,191,204,147, 34,210,187, 34,144,160, 53, 47,233,
-242,233,236,196, 42, 34,235,234,203,200,134, 89, 4,147,102, 91, 61,229, 86,128,214,193, 73,161,128,214, 27,143,254,161,128,214,
-171,213,173,108, 1, 45, 61,175, 49, 65,210, 84,108,104,155, 74,175, 62,220,222, 43,126, 11, 42,202,227,233,229,228,192,144,146,
-178,170,223, 55,178,105, 82,103,107,160,101,147, 38,236,177, 46,220, 56,127,234,241,234, 49, 53, 79,123,142, 43,119,222,107, 92,
-169,139,231,127, 47,118,241,204,176,162,103, 78,143,250,230,232,181,141,163,142, 51,143, 86,129,138,100,138,239,229,255,236,198,
-235,171,147,202,155,239,123,140, 53, 63, 62,186,194,124,104, 76, 21,243,150,158, 57,204,251,199,215, 15, 56, 59, 60,191,249,137,
-215, 26,115,161,108, 81,205,158,131, 75,152,215,119,204,104,222, 59,169,217,235,162,153,226,191,177, 71, 59, 75, 98,211,204, 15,
- 55,119,137,220,217, 35,114,107,135,200,141,173, 34,215, 54,137, 92, 94, 43,126,167,151,138,159,215, 66, 9, 60, 51, 95,228,244,
-108, 0,238, 63, 68, 78, 76,145,143,135,199, 73,174,148, 81, 22,105,149, 87,189, 79, 96,245,225,206,126,241,219,242,115, 40, 64,
-165,170, 22,237,168, 14, 53, 95,145, 39,169,169, 70,235,226,241,158,159, 27,146, 45,240,232,128, 44,129,123, 7,228, 9,188,178,
-117, 74,224,243, 59,231, 37,119,138, 72,148,182,218,139,205,104,202,145, 34, 74,251, 44,201,162, 60,100, 74,157, 48,242,136,236,
- 46, 81, 30,127,122,116, 82, 25, 44, 85,160,165, 74,178,190,113,139,217,221,127,109,227,163,159, 30, 28,123,218,181,108,236,223,
-203,185,197, 76,168, 89, 56, 35,131,193,129,127, 56, 7, 18, 36, 72,144, 57, 95,190,124, 11,115,230,204,121, 7,129,218,253,241,
-235,159, 61,123,246,219,188,198,123,127, 87,241, 29, 1,173, 51,103,206,104,130, 45, 91,229,182, 37,181, 66,190, 18, 15, 31, 62,
-204,127,249,242,101, 55, 45,176,101,143, 23, 0, 84,247, 14, 28, 56, 32, 43, 86,172, 80,210,149, 43, 87,148, 49,196,214,113,243,
-230, 77, 65,136,179,123, 90,124, 69,184,179, 50,155, 54,109, 42,187,106,213, 42, 37,161,124,193,160, 75, 5, 95,234,239,254,253,
-251,203, 50,191, 22, 77,227,190,201, 50,214, 97,232, 93,135,238,238,238,193,225, 90, 44,207,173, 25, 71,137,144,172,173, 47, 50,
- 5, 0,200,190,116,200, 33,191,243,165,140,186,215,231,224, 76,241, 59, 62, 91, 74,103,141,127, 55,107, 82, 83, 42,213, 78,139,
-231,197, 51,198,184,243, 98, 81, 45,185, 49,189,178,228,118,137,180, 55,188,141,151, 59,137, 41, 27,128,215,233,203, 83,190,151,
-247, 43,234, 73,145,180, 81, 47,233,161, 73, 73,214,219,253,227,132,134,239,106,126, 74,178,222,108,237, 45, 52,126, 87,175, 81,
-146,245,106,101,115,169,148, 51,158,181, 68,203,225,107,202,153, 76, 81,243,184,152,106,148,202, 20,227,222,147, 19,171,229,221,
-177,153,114,111,230,247,114,112, 88, 41, 89,213,183,156,204,253,165,161, 76,104, 87,250, 99, 89,215,152,150, 49, 4,109,210, 44,
-144,202,116,232,250,233, 67, 15,119, 79,106,122,246,249,165,237, 47,111,141, 47,120,243,225,248,188,119,222, 94,116,127,125,123,
-242, 55,103,174, 47,237,126,144,121,180,234, 93,169, 64,122,223,151,151,119,190, 59, 54, 48,183,249,233,217,109,230,130, 0, 84,
-155,123,229, 51, 47,107,147,206, 60,191,101, 26,255, 67, 3,114,154,143, 77,168,101, 94,223, 35,175,121,245, 79, 25,204,139, 91,
-103, 48,111, 24, 94,239, 86,158,212,209,206,218,163,237,154,212, 84,160, 83,237, 2,190,191,119,170, 34, 99, 59, 86,150, 49, 63,
- 85, 84,164, 87,219, 39,183, 19, 57, 51, 79,182, 79,108, 37,195, 90,150,144, 33,205,139,201,224,102, 69,101, 80,147,194,210,234,
-219,204,143, 51,235, 51,144, 87, 94,171, 0, 45,168, 15,223,110,104,103, 79,114,165, 85,245, 80,247,209, 54,113, 0,206, 70,183,
- 41, 17,255,217,141, 81,121, 62,120, 79,204, 27,120,123,108,174,192, 75,195,178, 7, 30, 31,224, 22,232,115,121,159, 20,203, 24,
-251,113, 65,147, 41,154,221, 1, 50, 73,148,135,129, 1,111, 36,208,231,170, 52, 42, 16,221,215,188,189,187, 64,106,165,140,143,
-133,210,254, 37,209, 82, 37, 89,251,127, 78,186,178,110,190, 88, 35, 63, 94,115,191, 31,176,249, 39, 47, 0,175,170, 78, 23,218,
-120,192,224,192, 63,132, 3, 8,114, 30, 11,241, 75,143, 54,105,210,228,237,194,133, 11,229,246,237,219,114,254,252,121, 25, 55,
-110,156, 32, 48,189,204,155, 55, 79, 16, 76,254,109,177, 98,197,142, 50,175, 51,197,198,231, 19, 21,137,187,205,152,184,195,140,
-139, 29,166,168, 72,252, 30, 53,227,220, 58, 2, 90, 0, 29, 2, 41,148, 67,176,101,171,188, 90, 64,235,193,131, 7, 14,193,150,
- 61, 30, 32,192,189, 55,249,119,245,234, 85,185,116,233,146, 32,254,174,172, 91,183, 78,225,225,156, 57,115,100,217,178,101,146,
-163,224, 55, 74,121,143, 30, 61, 42,136, 71,235,173,131,159,101,239,223,191, 95,246,250,245,235, 10,200, 58,117,234, 84,217, 29,
- 59,118,148, 37,248, 2,109,229, 55, 91,225,111, 20, 41, 23,239,241, 87, 7,205,112,103,209,139, 69,194,253,162,191,131,128,222,
-202, 69, 4,208,194,206,181,226, 35,219,150, 83,212,133, 43, 7,215, 21,128,172, 22,106,157,121, 62,163,117,110, 69,237,247,115,
-229,212,194,188, 17,193, 15, 72,197,202,141,104,156, 83,100, 83,115,105, 92, 52,201, 39, 87, 87,147,102, 96, 72, 5,104,237, 29,
- 45,205,203,166,189,171,238, 46,108, 90, 58,213,221, 55,238,221,133,118, 89, 84, 25, 50, 53, 44,150,244,206,171,229,141,117, 3,
-173,194,233,162,181, 43,231, 22,203,171, 90,161, 84,207, 22, 12,109,233,247,236,140,187,248, 95, 92, 47, 15,230,214,145,243,243,
-126, 18,207, 25,157,100,209,192,134, 50,184, 73,193,143,165, 50,197,188, 3,240, 25, 79,139, 7,249, 82,154, 70,122,174,153,115,
-253,206,222, 69,247,175,140, 41,116,229,195,211, 43,230, 79, 79, 47,125,124, 57, 33,219,131,103, 75, 91, 92,219, 60,164,198, 1,
-230,209,162, 83, 52, 83,130,115, 79, 47,236,244,241,252, 37,191,249,208,196,250,230,213, 61, 10,154, 23,253,152,198, 60,179, 73,
- 10,243,152,218, 73,223,120,116,207, 98,222,208, 41,147,121,121,219,116,230, 5, 45,211,152,151,118, 47,102,238,240,157,219, 49,
- 0,157, 65, 90,180, 45,239,187, 38, 51,229,159,221, 27,102, 11, 39,166,201,204, 30,149,133, 96,204,153,231,173,243, 42,118, 90,
-215,119,200,219,213, 77,131,129, 86,120, 36, 89, 80, 9, 22, 45,148, 33,250,241, 61,147,127,124,231,191,189, 87,224,187, 57, 37,
- 2,223,207, 42, 20,248,246,143,130,129, 79, 39,231, 11,124,180,240,135,192,167,103,220, 3, 33,209, 34,104,183, 43,209,202,152,
- 36,138, 55,129, 22,165, 88, 15, 38, 21,148, 15, 39,166, 43, 73, 62,125,144,188,169,255, 2, 90, 0, 84, 63, 64,146,117,228,211,
-253,195, 79, 42,102,143, 57,240,238,132, 2, 30, 60,199,245,142,225,225,137,241,172,193,129,191,139, 3,144, 88,165, 44, 94,188,
-184,207,218,181,107,149, 69, 5,127, 41, 37,234,214,173,155, 2, 6, 8,180,102,206,156, 41,175, 95,191,150,185,115,231, 74,193,
-130, 5,125,160,250, 74,169, 85,222, 32, 32, 19, 11,191,241,145, 18, 35, 37, 65, 74,180,121,243,230, 68,223,127,255, 61,119,104,
- 39, 64, 74,136,196, 49, 51,166, 35,122,142,128,214,173, 91,183,228,241,227,199,242,234,213, 43,187, 96,203, 22,109,123, 64,235,
-233,211,167,249, 9,178,158, 61,123,230,246,230,205, 27,187, 96,203, 94,121, 19, 38, 76,248, 12, 82, 37, 1,248, 17,127,240,111,
-212,168, 81,114,236,216, 49,121,251,246,173,248,250,250, 42,160,235,231,159,127,150,161, 67,135, 42,252,140, 29, 59,182, 30,251,
-233,178,199,143, 31, 87, 0,213, 7,128,168, 25, 51,102, 40,128,234,253,251,247,101, 65, 83,185,254,219,111,191,149, 29, 57,114,
-100, 89, 0, 57, 3,104,105,117,206,191,238, 59,182,209,250,146, 64,139,165, 1,160,218,116,123,109, 95,121,191,123,144,124,155,
- 45,193,131,156, 57, 77,209,153,202,102,142,121,255,237,210,218,114,126, 66, 5, 2,176, 77,250,234,166,157, 43, 71, 50, 83,189,
-153, 29, 16,220,123, 75, 91,169,149, 63, 81,128, 35, 41,132, 74,141,146, 44, 14, 18, 59,199, 55,197, 14,195, 1,242,102,107, 31,
-121,179,185,187, 50,112,236, 24,254,189,188, 90,219, 70, 94,173,106, 33, 4, 89, 60, 42,229,136,163, 41,209,130,244,106,199,154,
-201,125,252,222,221, 59, 41,159,158,223, 20,243, 45, 79,241, 59, 52, 73, 30,204,171, 45, 87, 86,244,147, 29,163,127,144,214,229,
-210,188, 44, 5,187,172, 50, 89, 98,206,132,157, 82,124,237,218,153, 76, 4, 99,165,179, 38, 56,247,232,212,182, 39,222,107,187,
- 63,184, 52, 48,243,211,155, 67,211,191,241, 93, 82,247,209,131,117,189,174,150,200, 24,227,156, 30, 90, 4, 76, 75,199,247,184,
-124, 98, 94, 87,243,202,159, 50,153,231,183, 72,101,254,163,113, 42,243,193,201,141,204,251, 38, 52, 12,216, 63,169,145,255,145,
-169, 77, 3, 54, 12,250, 46, 96,197,128,202,119, 59, 86,205,114, 36, 87,138, 72,199,245, 0, 87,203,122,100, 75, 30,101,254,147,
-173, 3, 69, 14,143, 21,239,141,125,132,255,245,212,211, 94, 30, 5,104, 93,221, 42,190,203, 0,220,131,108,180,248,251, 30,188,
-181, 99, 4,111,247,117,185,147,153,190,107, 88, 34,245,147,199,123,166,124,252,112,125,187,124,188,186, 89, 62,156, 91, 34, 31,
- 14,140, 10,244, 95, 86, 61,208,188,127, 68,224,251,155,251, 2, 39,255, 92,253, 53,222,241,155,163,114,195,224,221,251, 35,212,
-164, 1, 27, 90,202,222,206, 9,148,223,128,141,173, 20, 9, 23,212,136, 10,208, 42,158, 33, 70,204, 49,213,227,206, 8,124,117,
-247,237,212,186,113,231, 46,111, 22,111, 33,207, 7, 84,140, 51, 37, 89,220,184,182,140,237,195,195, 42,227, 89,131, 3,159,157,
- 3, 25, 50,100, 56, 76, 80,160, 30, 11, 22, 44, 16, 76,228, 18, 55,110, 92, 37, 89, 2, 45,111,111,111, 69, 42,131,160,232,135,
- 29, 21,172,100,201,146, 53, 78,158, 60, 89, 16, 52, 19, 32,185, 32,165, 69, 74,127,246,236,217,140,160,157,169, 89,179,102, 25,
- 65, 35, 13,104, 48, 12,138, 75,171, 86,173, 82,225, 93,229,236,209,116, 4,180,160,234,147, 23, 47, 94, 8, 64,135, 82, 5,208,
-224, 79, 8,155, 46,103,128,214,203,151, 47,243,171, 32,203,223,223,223, 13,180,108,130, 45,123,101,141, 23, 47,222,203,190,125,
-251, 74,249,242,229,165, 64,129, 2,178,120,241, 98,185,113,227,134,112,222, 38,159, 33,137,146,166, 77,155, 74,242,228,201,165,
- 81,163, 70, 18, 61,122,116,187,166, 28, 22,239, 40,219,187,119,239,178,223,124,243, 77,217,194,133, 11, 43, 96,138,210, 45, 2,
- 44, 38, 74,183,192,211,178, 41, 82,164, 40, 11,154, 6,208,210,247,213,132, 31,104,161,199, 70,205,157,194,180, 47, 96, 89, 53,
-241,159,144,134,182, 83, 7, 8,142,244,189, 63,100,174,220, 46,166,220,221,107,228, 8,164,225,251,170,126,229,169,134,252,153,
-105, 81,167,124,138, 52,171, 77, 25,151, 64,230, 9, 11,109,235,103, 88, 70,208,222,115,123, 97, 11,121,176,164, 57, 39, 98, 77,
- 64, 68, 26, 4, 90, 4, 89,234, 14, 67,170, 11,149, 29,134,195,171, 73,163,226, 46,119,168, 50,164,186,176, 65,145,196,119, 60,
-126, 45,169, 9,180, 40,201, 90, 55,125,192,187,192,119, 47,196,236,245, 39, 12,244,107,201,219,133,149,228,225,236,106,144,100,
-181,149,173, 99, 26, 9,128,216,221,176, 74,241, 0, 76, 93, 59,215,204,127,203,247,252,134,103,183,198,228,187,117,119,108,174,
- 59,239, 14, 77,125,240, 83,197,140,215,114,165, 52,101,215,195, 75, 2,166, 60,169,162,158,152,218,167,193,153,157, 19, 91, 61,
- 88,214,171,172,255,140,182,249,238,118,168,146,197,108,153,190,205,153,200, 12,117,225, 77, 72,141, 70,233,112,157, 17,226,213,
-153, 93, 76,201,123,255,144,207, 44, 7,135, 99,119, 32,130,161,123,254, 34,221,106,100, 51,243,186,158, 50,218,202,163, 0,173,
-203, 27,229,205,194,170,242,102, 94, 5,121, 61,187,140,188,254,179,184,188,158, 94,208,105,160, 5, 90, 59, 15,246,207,230, 31,
-176,173, 91,224,135,211,243, 0,180,220,229,227,221,131,242,241,222, 97,249,244,226,150,220, 59,190,241, 67,205, 98,105, 31,163,
- 79, 13, 47,151,193,241,170, 57,101,130,200,222, 84, 23,250,252, 89, 82,166,212,142, 37,207,103,150, 82,210,199, 11,203,196, 45,
-185, 1,180,194,218,222,198,115,255,120, 14,184,194, 22,235, 49, 36, 57, 10, 80, 57,125,250,180, 2,174, 44,211,137, 19, 39, 20,
-137,209,197,139, 23, 37, 75,150, 44,180,117,116,117, 84, 43,168,195, 92, 33,181,105, 29, 16, 16, 0,149,135,164, 65,202, 2, 48,
-148,103,207,158, 61,121,199,143, 31,159, 23, 42,202,220,120,103, 14,208,200,210,176, 97,195,180, 89,179,102,229,174,224, 76, 97,
- 1, 90, 62, 62, 62,226,231,231, 39,201,146, 37, 59,203,157,136,106,178, 4, 91,206, 2, 45, 74,178, 8,178, 0,154, 74,225,217,
- 18,106,178,148,130,233, 1, 90,121,242,228, 81,108,180,166,205, 93, 41, 85, 27,117,149, 18,101, 42, 42,192,235,247,223,127, 23,
-168, 24,195, 12,180,168, 62,156, 50, 99, 94,217,122, 63,118, 41, 91,184,120,233,178,139, 22, 45, 42, 59,118,236,216,178,160,105,
- 0, 45,253,159,155, 26,235, 80,181,207,226,255,255, 31, 64,198,229,136,142,131, 18, 48, 85,200, 3, 18,161,252, 21,221, 98, 92,
- 88,211, 45, 23, 86,227, 39, 68, 94, 95,148, 75, 91,198, 73,237,146, 25,110,192,150,197,122,119,152,174, 98, 97, 66, 91,114,106,
-234, 15,202, 42,191, 98,246, 56, 62, 76, 1, 43,235,202,209,145,101, 57, 57,218,219, 33,167,139,182,154, 73,177,179, 73,110,218,
-184,101,120, 45,101, 55,227,236,206, 37, 9,234,232,230, 65,243, 80,118, 24,194, 87, 86,168, 29,134,107,219,134, 48,124,167, 36,
-235,197,194,234,168, 67,236, 45,142,136, 98, 39,217, 73,127,239,203, 98,198, 14, 56,243,234,186,242,126,113, 21, 24,252,127, 43,
- 39, 70,150,145,189, 51, 58, 74,239,154,217,252, 0,136,106,107, 22,204, 65, 6, 24,188,123, 62, 58,178,236,234,147,249,245,206,
-248, 44,172,123,234,201,238, 41,167,120,205, 25,154, 4, 78, 4, 80,249,210,198,184, 85, 48, 93,140,128,239,242, 38,121,127,111,
-247, 12,243,171, 19,139,205, 47, 14,206, 48,191,240, 24,108, 46,151, 57,250, 3,149, 38,165,105,101, 50, 71, 91, 88, 62, 75,244,
-225,122,222, 3,201,218,192,179,115, 90,201,167,221,253,164,117,249, 12,242,113,123, 55, 57, 57,165,174,240,186,158,231,109,229,
- 33,208, 10,184,176, 86, 94,207, 41, 27, 66,162,245,206,115,184, 83, 64,139,146,206,124,169, 34, 61,122,251,103, 33, 69, 85,200,
-100,246, 0,224,186,188, 94, 62,190,122, 16, 56,105, 64,155, 55, 0,180,171, 29,184,202, 8, 81,188,228,241, 34,123, 63,156, 92,
- 72,110,141,205, 45,227,107,196, 82,212,135, 87,134,103,149,128,245,205, 4,106, 69, 69,162, 85, 54, 75,204,218,134,234, 48,172,
- 45,111, 60,247, 79,229, 0,212, 93,249, 32, 41,241,121,254,252,185,124,250,244, 73, 1, 91,179,102,205, 82, 18,207, 41, 45,162,
-221, 17,128,195,211, 56,113,226, 88,239,178,181, 85,173, 72,169, 82,165, 42,213,186,117,235, 22,120, 14,187,155,164, 56, 36, 79,
- 37,160,150, 44, 54,102,204,152, 98, 93,186,116, 81, 36, 48,237,218,181, 43,144, 43, 87,174, 74,177, 98,197,226,188,100, 87,173,
-239, 72,162, 85,170, 84, 41,165,204, 4, 90,182,242,241,154,173, 2, 90,130, 38,245, 28,249, 74, 0,180,229,207,156, 57,115,121,
- 74,178, 8,180,108,229,227, 53,123,109, 73,137, 86,159, 62,125, 20,137, 22,129,214,242,229,203,229,135,142, 99,165,122,157, 54,
-242, 77,182, 28,210,177,118, 13,241,240,240, 16,240, 60,204, 64,139, 18,173,111,106,183, 45, 91,189, 81,135,178,113, 19, 38, 44,
- 91,189,122,245,178, 91,183,110, 45, 11,154, 95, 26,104, 57,196, 34,255,212,254, 30,174,114, 81,194, 1, 96, 50,178,199,119,105,
- 62, 30, 27,245,141, 28,236,231, 38, 31,159, 28, 83,128,214,115, 24,179,191,189,117, 88,102,141,236, 26,152, 47,117,212, 73, 4,
- 53,206,188, 12,147, 99,230,166, 37, 93, 62,200,186,134,178,174,103, 97, 37, 81,154,213,168,104,226, 15,188,231, 12, 45,235,188,
- 4, 11,148,144, 85,204,153,208,103,207,196,166, 66,233,137,231,184,250,138,113,189, 30,181, 33,233, 17,104,209, 33,169,165,225,
- 59,109,178, 94,173,254, 49, 52,208,154,255,157, 38,208,130,189,213,163,192,183, 79,196,127,109, 51,197,133,195,139,217,229,197,
-107, 84, 89, 89,139,122,111,156,220, 77,202,101,141,243,172,220, 95,198,156, 97, 61, 34,149,118,141,117,173, 77,181,130,239,155,
-148,119,243,173,150, 47,209,203, 58, 69, 83,189,133, 26,242,154,179, 4,203,102,138,182, 19,233,110,165,156, 81, 95, 28, 92,216,
-211,124,120,114, 13,179,207,212,130,230,231, 83, 10,152,223,239, 30,104,174,145, 59,214,211,210, 25,163,221,101,170,154, 59,161,
-247,185,117,195,253,203,103,137,182, 67,235, 61,112, 81, 31,189,110,145,148, 47,100, 87, 47,217, 59,166,134,184, 38, 49,157,219,
- 61,188,178,136,123, 43,169,150, 55,209,115,222,215,162, 97, 23,104,157, 95, 41,175,255, 40, 18, 46, 27,173,122, 48,162,133, 36,
-245,145,223,236,162,129,239,231, 20, 15, 6, 91, 31,142, 77, 11, 92, 52,184,185, 47,250,165, 83, 59, 96, 19,197,142,252,240,210,
-208, 44,114,111, 66,126,249,214, 45,218,251,167, 51,138,203,181,145,217,229,250,168, 28,146, 38,225, 95, 64,171, 85,177,216,191,
-209,173,131, 97, 12, 31,150,150, 55,158,249, 39,115, 0,182, 66,133,176, 91,237, 2,164, 45,247, 96,243,244, 73, 85, 37,242, 28,
-118, 70,247, 0,156,206, 69,139, 22, 13, 67,178,238,131, 96,196, 13, 18,176,186, 80,149,213,154, 52,105, 82, 13, 72, 94,234, 76,
-158, 60,185, 38, 0, 86, 37, 0,187, 10,112, 69, 80,141,121, 28,129, 44,190,205, 30,208,226,173,200,145, 35, 15,249, 43,139,109,
-181,161,179, 64, 11,180,212, 50,209,159,150,211, 54, 90,150, 64,139,170,195,233,211,167, 75,213,218,205,164, 78,161, 34,210,189,
- 80, 46,153,219,186,137, 28, 57,114, 68, 81,203,134, 85,117, 72, 27,173,111, 42, 86, 45,155, 48,105,138,178,160,163,128,214,195,
-135, 15, 43,231, 95, 82,117,168,187, 39,252, 51, 51, 58,222,117,104,103,242,234, 80, 36,173, 41, 96,110,235, 44,226, 57,180,188,
-236,235, 24, 79, 38, 85, 51, 73,217, 76,166,243,229,115,196, 63,190,114,116,115,249,136,109,251,215,247, 45,145, 93, 11, 6,202,
-183,121,146,125, 32,184,113,166,254, 57,146,155,254,216, 61,176,164,156, 24,152, 83,142,253,154, 67,120,206,107,206,208, 96, 94,
-122,143,199,206,194,231,240, 6,255,174,108,150,120,222,157,170,231,248,180, 97, 84, 19, 9, 56, 50, 9,190,184, 38,201,254,169,
- 45, 36, 95,170, 40,135, 33,141,136,171,151,182,178,195,112, 75, 47, 27, 59, 12,155,134, 48,124,167, 36,235,197,220, 74,242,109,
-214,152,154, 18, 45,223, 11, 48,124,223, 55, 92, 94,204, 41, 47, 39,199,148,147, 53,221,242,203,220, 94,223,201,244,222, 63, 8,
- 13,228,245,150,205, 86, 62,172,190, 82,180,172, 85, 90,252, 95,123,203,155, 71, 87,228,244,210,126,168, 55,119, 67, 38, 16,248,
- 85, 41,231, 12,109, 72,172,238,127,188,180,198,252,241,226, 26,179, 92,219,108,118,239,150,198,124,121,184,155,217,103, 98, 46,
-179,159,251, 79,230, 45,115,219,154,229,254, 62, 37,221,222, 49,209, 44,135, 70,152,245, 0,173, 44, 73, 77,141,168, 42,150,109,
- 29,229,199,114,105,222,185, 37, 49,165,110, 81, 58,213, 59,130,237,197,157,243, 11,238,219,242,222,174, 89,116, 74,180,252,207,
- 44,149, 87, 83,114, 57, 37,193,178, 69, 24,210,219,125,115, 91,102,120,243,102,217, 15,159,252, 87,213, 11,124, 63,183,120,160,
-249,252,202,192,226, 25, 99, 62, 42,152, 72, 49,182,213,125, 36,136, 29,185,125,252, 88,145, 31, 50,197,139, 25,121, 4,119, 26,
-190,152, 85, 90, 46, 14,113, 21, 72,187, 84,137, 86,137,166,133, 99, 15,128,100,171,167,225,222, 65, 55,107,141,140, 95, 15, 7,
- 40,253,105, 6, 64, 53, 7, 32,200,147,137,231,188,134,164,185, 59,208, 78, 53,249, 28,253, 64,209, 9,115,225,160,196,115, 94,
-211, 69,211,129, 68, 75,177,197, 2,157, 8, 3, 90, 22,210,173, 48, 1, 45,184,193,240,161,141, 86,133, 10, 21,164, 68,137, 18,
-220,173, 41,243, 97,244,222,171,118, 53, 89,212,170,145, 92, 61,184, 95,134, 12, 25, 34,200, 39,141, 27, 55, 22, 72,243,172,125,
- 79,218, 98, 99,176,141, 22, 54, 46, 40, 96, 10,187, 24,203, 86,173, 90, 85, 57, 63,119,238, 92, 89, 24,215,127,113,137,214,215,
-211,173, 29,150, 84,191,163, 82,128,166,103,175,118,143,148, 87, 59,134,200,162,198,241,164, 94, 46,147, 63, 38,180,158, 92,245,
-227, 21, 12,211,210,161,245,247,249,222, 30, 90,252,155,200,189, 3, 34,119,247,218,242, 22,239,208, 57, 30,221, 57, 52, 40,156,
- 40, 80, 32,233,145, 23,215,133,231,188,166,193,236, 80, 52, 75,185,198,123, 46, 79,207,139, 60, 56, 44,183, 54, 13, 19,185,184,
- 66,228,220, 34,185,186,230, 23,233, 92, 61,251, 39,168, 15, 23,104, 24,131,135,162,169, 0, 45,247,110,210,184, 68, 10,101,135,
- 33,109,178,184,195,240,229,242, 70, 66,187, 44,170, 12, 9,178,234, 22, 76,112,251,249,172,111,108, 1,173,144, 94,241, 97,163,
- 53,173, 71, 77,120, 87,223, 36, 87,151,116,146, 77, 3, 74,203,252,190,213,229,207,161,157,164, 91,173, 92,126,180,225,210,209,
-201, 28,241, 51, 82,174, 20,145,101,193,152,159,101,246,208,246, 50,188,237,183, 74, 66,221, 5,182, 11,142, 36, 69,161,104,150,
- 72, 31,245,124,205, 2,137,159, 52, 42,151,216,119,235,212, 22,230, 9, 77,147,154, 31,253,158, 67, 1, 90,111,151,213, 49,143,
-109,152,204,252,110,114, 22, 37,237,236,153,213, 44, 75,202, 91, 3, 45,155,229, 44,152, 54,250,145,183,107,154,203,141, 63,107,
- 9,220, 55, 40,128,154,191,215,166, 86, 22,223,165,181,164, 64,154,104, 71, 28,240,192,161,195, 82,255, 83, 11,229,229,248, 76,
-138,234,208, 9,159, 89,161,104,230, 73,109, 74, 3,176,255,103,229, 28,113,188,119,143,168,250,222,127,239,240, 64,243,233, 69,
-129,116, 90,170,163,125,152,197, 81, 27,101,131,127,176, 39,231, 6,102,148,164,113,255, 2, 90,234,161, 74,182,254,114, 88, 26,
-211,112, 88,250,127,214, 24, 14, 54,117,118, 60,157,217, 12,126,254,133,162,244,120,127,183, 11,182, 44,120, 29,204, 79,123, 42,
- 65, 43, 59, 44,187, 96,203, 22, 77, 94,131, 68,235,236,154, 53,107,228,208,161, 67,194,221,135,179,103,207,150, 65,131, 6,201,
-246,237,219, 5, 59, 7, 21,117, 44,236,210, 4,182,106, 50,122,244,104, 2, 45, 91,238,118, 66,180,123,212,168, 81,139,227, 57,
- 69,106, 69, 63, 89, 4, 89, 4, 86, 52,130,231,110, 68,254, 39,224,154, 48, 97, 66,217,254,253,251,151,101,126, 27,253,235,115,
-244, 37,157,221,248, 31,155, 77,207, 60,254,255,194, 51,158, 33, 65,214,157, 94, 38, 41,152,198, 20, 0,149, 74, 40,195,194,188,
-144, 72, 96,242,244, 39,200,146,227,147, 9,180, 66, 76, 30, 26,147,142,242, 50,132,229,121, 69,144,197,231,113,254, 90, 7,251,
- 66, 53,110,201, 76,177, 95,200,131,163, 10,141,197, 61, 43,200,220,254,117,224, 93, 60,219, 71,218,122,193,225,100,214,176,208,
-164,202,144, 95,217,142,225,223,201,171, 53,173,132,190,178, 8,178,120,120,252, 82, 66, 94,204,255, 94, 94,204,173, 44,207,161,
- 2,228, 97, 67,162, 21, 26, 16, 98,215,225,200, 31, 75,250, 30, 95,216, 91,246, 47, 29, 37,115, 7,181,144,238,181,243,248,113,
- 55,162,142, 50, 58,156,196, 41,181,234,214,180,162,248,191,130, 68,235,225, 21, 57,181,164,143,236,155,220,140,210, 55, 45,137,
-150,221,143,165, 20, 84,131, 7,167, 54, 48,251,172,108,101,126,187,170,145,249,205,162,239,204,126,179, 75,155,219,150,138,255,
-244,187,236, 49, 30, 51,213,203, 31,243,217,145, 30, 46,186,128, 22,164, 87, 47,100,125, 35, 25, 88, 39,179,100, 76,100,202,195,
- 10,241,247,215, 90,153, 20,181, 49,156,203, 98,247,178, 93,187, 10,155,229,164, 52,235,221,158, 33,242,114,108, 58,121, 57, 58,
-133,188, 24,145,196, 25,169,150,221,186,231, 72,101,202, 15,218,235,126, 44,155,246,217,133,197, 93,204, 0,112, 15,195,219, 70,
- 65,207,103,139, 29, 61,210,157,152,209, 34,133, 8,193, 3,112, 5,201, 86,172, 95,225,214,225,187, 47, 52,160,125,142, 65,210,
-160,169,179,147,232,204,102,240, 83, 39,163,116,102,179, 4, 69, 95, 13,208, 66,221,138, 17,108, 37, 78,156,248, 49,146, 55,236,
-166,188,177, 57,192, 7,170,217,215, 49, 98,196,240, 5,176,122, 5, 21,159, 15,242, 60,198, 53,130, 44, 91,118,211,214,125, 41,
-105, 16,120,114,232, 21, 30,180, 84,144,149,244, 11,141, 75, 58,155,242, 31,153, 45,108,170, 67, 37,120, 52,131, 72, 59, 8, 32,
-205,123, 65,249,108, 5,154,214, 28, 40,130, 2, 77,251, 0,100,249, 48, 32,180, 14,246,133,162, 73, 26, 8, 36, 77,213,225,107,
-120,159, 31,207,157,123,122,220, 25,216, 91, 65,240,122, 94, 23,211, 48,213, 87,150,186,195,144,187, 12, 41,201, 82,165, 89, 4,
- 87,106, 98,126,171,178,219,172, 59, 37, 87, 52,140,167,205, 22,127,117, 74,178, 84,210, 14,249, 9, 48,224, 81, 46,163,137,210,
- 71, 37,241,156,215, 52,120,106, 31,108, 96, 19, 68,153,204, 49,238, 85,204, 22,251, 81,197,172,177, 30,125,235, 22,243, 81,133,
- 44, 49, 30, 81,226,165,210, 36,216, 46,149, 49,234,254,178,174,209, 44, 29,171,218,164, 9,105,229,111, 13,138, 38,125,157, 35,
-121,228,241,150,101,202,146,196,244, 43,174,191,202,238, 18,249, 87, 7,101,181, 43,209,178, 14, 40, 29, 30,137,150,245,251, 65,
-187, 18,210,118,244,241,121, 58,250,166, 67, 48,172,243,121, 91,217, 52,191,163, 48,208, 54,104,134,129,105,206,246,207,112,190,
-194,104,163,112, 50,208,222,152,172, 71,162,165,170, 16,105,179,101,157,223,214,220,161, 71,162, 21,100,244,174,216,108, 89,231,
-119, 52, 31, 69, 0, 27,190,150,190, 20, 1, 85,253,239,145,248, 90, 26,247, 95, 85, 78, 55, 55, 55,197,247,139,206,238,246,175,
-170,187,206, 58,235, 2,174, 78,210, 50,104, 26,193,154,195,216,101,236, 62,102,124,155, 17,203, 81,167, 36, 90,142,192, 88,120,
-128,150,142, 93,135,255,229,118,143,216, 22,255,178,212, 28,251,209,250,140,101,249, 47,119, 24,163,238, 17,219,177, 12,126, 26,
-252,140, 40, 14, 24,125, 41,162, 56,249, 23, 29,131,159, 6, 63, 35,150, 3, 95, 39,181,136, 9, 42, 29,134,186, 27, 31, 96, 24,
-152,230,224, 17,131,159, 6, 63, 35,138, 3, 70, 95,138, 40, 78, 26, 96,195,232, 75, 70, 95,138, 88, 14,124,157,212, 28,218,104,
-241, 35,177,149,156,169,170, 61, 26,142,174,107,209, 55,104,218,110,151,176,182,151,193, 79,131,159,122,251,128,241,109,218,231,
-128, 94, 30, 90,230, 51,248,105,240,211, 22, 7,254,203,125, 73,229, 71, 88,231, 51,173,111,234, 63,117,223, 88,233, 68,108,115,
- 27,252, 52,248, 25, 81, 28, 48,250, 82, 68,113,210,144,104, 25,125,201,232, 75, 17,203,129,175,147,154, 97,163,165,209,110,198,
- 64, 17,177, 29,219,224,167,193,207,136,226,128,209,151, 34,138,147, 6, 32, 52,250,210, 63,191, 47, 69,108, 9,191, 44, 53, 3,
-104, 25, 64,203, 46, 7,140,193, 39, 98, 63, 70,131,159, 6, 63, 35,138, 3, 70, 95,138, 40, 78, 26, 32,243,107,233, 75, 17,219,
-226, 95,150,154,227,160,210,159,177, 44, 95, 75,227, 26,229,140,216, 78, 96,240,211,224,103, 68,113,192,232, 75, 17,197, 73, 3,
-108, 24,125,233,159,223,151, 34,182,132,255, 17,106, 70,199,142,216,134, 54,248,105,240, 51,162, 56, 96,244,165,136,226,164, 1,
- 96,140,190,100,244,165,136,229,192,215, 73,205,121,207,240, 17, 84, 79,227, 3,140, 32, 70, 6,145, 49,248,105,240, 51,162, 56,
- 96,244,165,136,226,164, 1,180,140,190,100,244,165,136,229,128, 65,205,224,128,193, 1,131, 3, 6, 7, 12, 14, 24, 28, 48, 56,
- 96,112,192,224,128, 3, 14,132, 52,142,119,119,119, 87,194,181,168,191, 6,235, 12, 14, 24, 28, 48, 56, 96,112,192,224,128,193,
- 1,131, 3, 95,146, 3,255, 50, 44, 98, 0,173, 47,217,121,140,119, 25, 28, 48, 56, 96,112,192,224,128,193, 1,131, 3,142, 57,
-240,149, 3, 45,199, 54, 90, 95,121,229,140,190,107,112,192,224,128,193, 1,131, 3, 6, 7, 12, 14,124,229, 28,248, 87, 99, 17,
- 84,174, 28, 43,200,223,175,188,157,140,226, 27, 28, 48, 56, 96,112,192,224,128,193, 1,131, 3, 95, 33, 7,254,245, 88,196,176,
-207,250, 10,123,165, 81,100,131, 3, 6, 7, 12, 14, 24, 28, 48, 56,240, 47,226,128,129, 69,254, 69,141,105, 84,197,224,128,193,
- 1,131, 3, 6, 7, 12, 14, 24, 28, 48, 56, 16, 65, 28,248,219, 66,240, 68, 80,249, 13, 50, 6, 7, 12, 14, 24, 28, 48, 56, 96,
-112,192,224,128,193,129,127, 44, 7, 84,160,101,253,251,217, 11,108, 56,178,139, 88, 22, 27,252, 52,248, 25, 81, 28, 48,250, 82,
- 68,113,242, 47, 58, 6, 63, 13,126, 70, 20, 7,254,203,125, 41,162,120,248,119,208, 49, 60,195,107,112,253,191,220,177,141,186,
- 71,236, 39,105,240,211,224,103, 68,113,192,232, 75, 17,197, 73, 3, 12,127, 45,125, 41, 98, 91,252, 63, 66,237,107,105, 92,163,
-156, 17,219, 33, 13,126, 26,252,140, 40, 14, 24,125, 41,162, 56,105,128, 13,163, 47,253,243,251, 82,196,150,240,203, 82,163, 68,
-171,122,208, 43,249,107,109,179,245,217, 74, 99,116,236,136,101,173,193, 79,131,159, 17,197, 1,163, 47, 69, 20, 39, 13, 0, 99,
-244, 37,163, 47, 69, 44, 7,190, 94,106,169,130, 0, 22,127,191,216, 97,124,128, 17,203,106,131,159, 6, 63, 35,138, 3, 70, 95,
-138, 40, 78, 26, 64,203,232, 75, 70, 95,138, 88, 14,124,157,212, 12, 27, 45,141,118, 51, 6,138,136,237,216, 6, 63, 13,126, 70,
- 20, 7,140,190, 20, 81,156, 52, 0,161,209,151,254,249,125, 41, 98, 75,248, 15,162,198,206,103, 43, 57, 83, 68,123, 52, 28, 93,
-215,162,111,208,180,221, 46, 97,109, 47,131,159, 6, 63,245,246, 1,227,219,180,207, 1,189, 60,180,204,103,240,211,224,167, 45,
- 14,252,151,251,146,202,143,176,206,103, 90,223,212,223,113,223,144,104, 25, 18, 45,187, 28, 48, 86,121, 17,251, 73, 26,252, 52,
-248, 25, 81, 28, 48,250, 82, 68,113,210,144,230,125, 45,125, 41, 98, 91,252,223, 74,173,160,201, 20,219,162,110, 95, 75,227, 26,
-229,212,238,144, 41,144,133, 73,207, 97,240, 83, 15,151,244,231, 49,248,169,159, 87,122,114, 26,252,212,195, 37,253,121, 12,126,
-234,231,149,158,156,255,101,126,234,225,207,215,146,231,243,236, 58,204,105, 50,181,153,152, 39,249,199, 60, 38, 83,156, 32, 78,
-216,237, 48,201,147, 39,159,153, 49, 99, 70, 63,252, 62,113,113,113,121,172, 38,252,127,140,244,200, 34,237,183,226,170, 77,154,
- 49, 98,196,152,148, 62,125,250,183,137, 19, 39,126,146, 36, 73, 18,239,164, 73,147,122, 39, 75,150, 76, 73,160,165, 36,188, 67,
- 73,184,119, 66, 15,205,112,182,230,231,253, 88, 68,162, 36,115,113,241, 74,149, 42,149,183,179,201, 37, 69,138,195, 78,130,225,
- 81,145, 34,153, 62, 49,225,185, 81, 58,248,242,121,235,174,163, 0, 58,179, 4,151, 83, 76,166, 40,122, 82,110,147, 41, 81, 52,
-147,169, 67,228,200,145, 47,197,136, 28,185,147,250,140,147,252, 12, 81, 60,255,163,166, 44, 1, 71, 76,245,205, 71, 77,237,248,
-203,255,127, 99,255,172, 27, 45, 90,180,197,248, 70, 54,160, 12,221,144, 92,248,203,255,188,142,243,186, 14,120,235,176,221,203,
-228, 55,245,173, 88, 52,218,213, 82,249, 77,173, 72,163, 92, 65, 83, 82,156,207,169, 88, 52,234,181,210,249, 76,109,236,208,117,
- 68, 51, 18,158,137, 28,148,120,174,247, 8,166,185, 10,237,174, 55, 53, 74,156, 56,231,143,217, 50, 62,110,151,215,245, 80, 61,
- 23,151,140,124, 46, 60,237,174,163,176, 95,252, 59,194,120,217, 18, 99,228, 67,140,151, 15, 49,142,182,212, 81, 70,102,209, 83,
-206, 95,144,111, 92, 80,226,185,214,161, 69,243, 14, 8,224,243, 83, 18,207,245, 28, 90, 52,245,208,176,206,243,111,160,249,199,
-186,117,235,228,213,171, 87, 50,104,208, 32, 65,219,223, 66, 37, 9, 18, 98,104, 48,196,186,238, 97,165, 19, 22,190,127, 13,207,
- 68, 60,208,202,101, 50,125,255,123,149, 98,159, 62,204, 31, 22,168, 53,248,224, 99,158,219,188,121,115,179,224,184,124,249,178,
- 4, 4, 4,200,135, 15, 31,228,227,199,143, 74,226,185,154,210,164, 73,243,192,138,163,161, 58, 54, 38,189,201, 63,252,240,195,
- 27,210, 59,113,226,132,188,123,247, 78,252,253,253, 21,186,239,223,191, 87,254, 91,166, 20, 41, 82,120, 59,162,153, 32, 65,130,
- 19, 0,108,222, 76, 4,109, 42,112, 35,120,179, 4,112,150, 32, 14,121,244,130,183, 42,120,247, 94, 29,137,249,236,127,212, 0,
- 90, 4, 88,172,179,179, 71,218,180,105,239,105,181,145,197,253, 20, 4, 88,234, 59,112, 30, 24, 51,102,204,244,150,247,113,110,
- 45,233,210, 28,124, 82,167, 78,253, 3,202,191, 19,105, 7,207,117,124, 53, 33,104,198,143, 31,255, 4,249,159, 50,101,202, 39,
-106, 2,173, 39,150, 9,116,159,168,137,109,142,246,180,219, 70,142, 64,150,167,201, 20, 53,166,201, 84, 33,106,148, 40,238,160,
-243,250,236,217,179, 10, 63,208,239, 30,132, 23,104, 17, 84,249, 29, 48,253,242,108, 79,204,163,190,183, 70,191,226, 47,255, 91,
-129, 45, 77,126,234,224,159,158, 9,162, 5,142,211,222,222,222, 15, 94,190,124,249,232,207, 63,255,188, 18, 43, 86,172, 3,252,
-229,127, 94,231,125, 16,234,104,231,125,118,203, 89, 34,191,169,120,235,186,169,252, 78,175,111,230, 87,161, 72,212, 83,165,242,
-152,170, 87, 42, 17,253,193,180,126, 57,253,246,205, 46,237, 87,190, 80,228,115, 78,210,140, 20, 53,106,212,146, 88, 92,181,194,
-196,208, 60, 40, 53,195,175,146,208, 39,148,132, 54,175,239,232, 59,210, 11,178,210,197,138, 85,178,126,230,244,126,119,134, 14,
-150,179,221,186, 72, 43,215,116,175, 9,182,156,248,142,194,208, 68,186, 0,140,179,116, 29,246, 37,130, 44,142,189,102,179, 89,
- 48,214, 61,212, 73, 92, 79,255, 28,135, 79, 70, 73,160,201,164,117,104,209, 12, 30,246, 64,136, 96, 75,207,225,136,102,172,168,
-145, 35,247,140, 19, 35,198,142,152, 81,163, 62, 97,226, 57,174,245, 2,225, 88, 14,136,107,149, 83, 79,185,244,124,155, 97,161,
- 99,249,140,163,114,198,195, 55,115,115,210,164, 73,226,231,231,167, 36,158,243, 26, 8,196,115,162,238, 97,165, 19,222,186,253,
- 83,158,255,188, 54, 90,144,100, 21,254, 57,191,219,123,243,138, 73,159, 2,234,102,176,236,244,161, 26,151, 32,171,230,119,223,
- 5,127, 36, 5,179,102,149, 1,205,155,203,232, 78, 29,101, 98,143,174, 74,154,212,253,103,153,209,167,183, 60,126,252, 88,116,
- 0,173,177,117,235,214,245, 81, 9,182,106,213, 74,182,108,217, 34, 71,143, 30,149,243,231,207,203,213,171, 87,229,214,173, 91,
-242,224,193, 3,121,242,228,137, 96,194, 16, 45,160, 69,128, 69, 96,166, 30,129,129,129, 10, 0,228,224, 67, 0,199,123,236,140,
-111,223,190, 85, 18, 87, 2,148,148, 89,181,182,189,142,189,151,249, 89,158,251,247,239,203,189,123,247,228,238,221,187,114,231,
-206, 29,185,125,251,182, 82,214,155, 55,111,146,135,123, 29, 77, 16, 38, 11,160, 53,124,216, 80, 25, 58,168,143,140, 28,214, 71,
-249, 29,208,191,159,244,235, 23, 58, 77,157, 58, 85, 62,125,250, 68,158,134, 25,104, 85,175, 94, 93,106,212,168,113, 28,128,166,
- 79,148, 40, 81,254,180, 35,233,210, 28,124, 0,128, 60,125,125,125,189,152,112,190, 71,199,151, 18,130, 38,219,232,225,195,135,
-242,252,249,115,121,241,226,133,146,216,182, 76,228, 47,211,235,215,175,149,196,123, 0, 9,130,247,216, 5,237,182,128, 22, 68,
- 57,153, 48,208,142, 42, 82,164,200,243, 81,163, 70,189,171, 85,171,150,212,169, 83, 71, 78,158, 60, 41, 99,199,142,253, 16, 41,
- 82, 36, 63,244,253,196,124,214,193,132, 59, 0,247,174, 33, 93, 69,234,109, 93, 79, 74,176, 8,174,142,108,108,164,116, 55,254,
-242, 63,175, 59,160,169,131, 93,154, 89, 66,181, 17, 22, 24,235,193,171,135,168,219,165, 31,127,252,241, 12, 22, 42,143, 80,164,
- 71,252,229,127, 94,231,253,184,113,227,174,181, 67,221,110,187,151, 41, 96,218,181,107,241,143,126,135, 87,181,246,131,100,235,
- 65,253,111,227,191, 58,180,184,166,223,193, 69, 85,252,218,213, 73,234, 7,137, 86, 55, 39,104, 82,122, 85,178, 81,163, 70, 45,
- 80,190,118, 23, 47, 94,108,199, 95,244,237,118,248, 70,219,225,219, 84, 18,250, 86, 59,130, 45, 71,223,145, 30,160, 21,215,100,
-202,153, 49, 99, 26,191, 73, 93, 59,136,249,247,209,226,219,188,129, 28,202,145, 73,218,102, 74,126,232, 75,183,145,102,171,106,
-103,112,248,109, 82,146,197,126,200, 49, 41,103,206,156, 47,241,157, 61, 66,210, 90,153,107,126,239, 40,214, 63, 25,104, 21,141,
- 17, 53,234,253,149,139,166,127,188,123,243,140, 4,188,127, 44,103,207, 28,149,139,103, 15,201,210,217,147, 63,240, 30,202, 95,
-212,137,254,169,221, 10,142,115,232,225,167,179,239,176, 73, 51,101,201,142,117, 82,149,238,242, 36,117,169, 78, 79, 18,185,126,
-243,218, 37, 85,134,143,148,106,113,252,164,148, 11, 47,249, 67, 15,208, 74, 89,172, 99,157,148, 37, 59, 63, 73, 89,162,211,147,
- 4,153,191,121,157,220, 57, 58,206,214,229,191,151, 31, 19,141,107,195,116, 46, 47,222, 45,159,248, 49,160,121, 94,121, 81, 54,
-150, 93,160, 69,117, 33, 86,196, 1,150, 18,152, 46,245,234,137,215,194,217,114,127,203,106,121,177,111,147,188,216,139,180,199,
- 93,118, 79,159, 44,143, 30, 61,210, 4, 90,233,210,165, 83, 36, 89,234,241,219,111,191,201,206,157, 59,229,212,169, 83,161, 64,
- 22, 39, 92, 2, 35, 12,190, 14, 65, 17, 39,113,210,219,177, 99,135,236,217,179, 71,246,237,219, 39,135, 14, 29,146, 99,199,142,
- 41,147,236,153, 51,103,228,194,133, 11,114,229,202, 21,185,126,253,186, 96, 64,119, 6,104, 81, 82,245,234,205,155, 55,202, 96,
-198,115,164,189, 22,233,213,211,167, 79,157, 2, 90, 4, 87,190,247, 22,138,255,245,159,228,245,157,249,242,248,193,117, 89,179,
-110,131,180,104,215, 77, 42,124,223, 64, 6, 15, 31,163, 0, 56, 72, 38, 20,176,232, 36,208, 98,167, 30, 85,189,122,181, 64,130,
-172, 41, 83,166,188, 0,240,244, 66,253,207,186,185,101, 9,230,123,144, 90, 81,149,108,105, 14, 20, 0, 61,135, 9,178, 54,111,
-222, 76,160,101,169,202,180,247, 17,133, 2, 90, 4, 89,238,238,238, 2, 26, 10,184,222,182,109,155,108,223,190, 93,118,237,218,
- 37, 93,103,156,149, 86, 19,207, 75,131,190, 75,229,224,193,131, 10,104,135, 36, 79, 19,104,149, 51,153,226, 70, 51,153,154, 71,
-143, 22,237,116,134, 12, 25, 94,127,251,237,183, 31,213, 74, 66,122, 18, 8,245,217,115, 72,178,110, 71,143, 28,185, 15,196, 25,
- 46,142, 36, 90,232,155,165,144, 55,196,202, 27,234,114, 95, 53,129,158,111,255,182, 73,252,189, 47, 12, 11,180,236,195,175,174,
-143,244,165, 26,241,111,152,196, 27, 64,138,177, 9,239,237,139,212,160,105,211,166,167, 9,180,248,203,255, 72, 61, 32,185,117,
-199,175, 45, 41, 17,139,107,179,221, 1,162,190,239,209, 42,143,223,245,125,131,252,102,143,172,226,247,109,177,104,126,123,151,
- 52,241, 59,183,177,133, 95,243,234, 73,124,203,228, 51,181,208, 51,152, 7,229, 33,200, 42, 86,175, 94,189,102, 4, 87, 76, 75,
-151, 46,109,135, 54,111,119,238,220,185,118, 55,110,220,104,135,239,170, 29, 22, 50,237,176,176, 10, 55,208, 34,200, 74,147, 46,
-169,239,153, 51, 94, 88, 24,221,148, 9,245,170,137, 79,153, 66,114,169, 88, 94,105,153, 54,249,227,191,161,141,194, 59,201, 56,
-250, 54,179, 65, 51,240,130,139, 74,128, 87,225, 56,196,241, 50, 81,162, 68, 90,146,173, 16, 52, 33, 5,229,248,170,168,245,130,
-206, 89,230,223, 96,222, 49,150,137,231, 65,149,112,164, 78,180,164,121, 71,165,135, 95,158,243,176,117, 77,139, 55,182,234, 94,
-164,104,145,124,111, 30,220,189, 40, 23,206,239,146, 55, 47,183,203,135,247,123,165, 83,199,122,210,187, 87, 27,121,235,123, 75,
- 30,222,185, 32,185,115,102,123, 3,226,182,192,150,230, 88,167, 85, 40, 27,247,191, 24, 77, 0, 35,159, 22,191, 31,147, 14, 51,
- 46, 43,169,253,148,115,146, 62,247, 55, 50,100,200, 16,101, 72,202,157, 59, 55,205, 69,146,216,169, 67,112, 57, 83, 20,239,232,
- 83,121,192, 1,169, 49,236,140,146,170, 13, 62, 33, 46, 89,203,254, 69,199,236, 45,141,106,100,254,116,106,177,169,198,135, 35,
-166,114, 76,230,195,166, 34,114, 84, 49, 75, 8, 62, 48,150,151,115,244, 63, 12,124,252,210,143,168,206, 74, 45, 37, 91,127,149,
-129, 19,149, 85,229,244,138, 97, 77,249, 77,166,100, 21, 18,198,185,253,114,222,200, 15,230,174, 21,228, 21, 64,214,249, 34,209,
-237, 62, 79,155, 44,203, 9,133,231,227,186,116,150,115,203, 23,136,247,206, 53,193,183, 8,184,246,204,152,100, 15,104,133, 96,
- 30,109,178, 8,126, 58,116,232, 32,131, 7, 15,150,249,243,231,203,225,195,135, 21,149, 36,193, 5,165, 70,148,100,169, 32,139,
-234, 68,170,220, 28,181, 0, 85,133, 44, 12, 65,214,222,189,123,229,151, 95,126,145,190,125,251,138,151,151, 87, 40,144, 69, 41,
- 20, 7, 35, 27, 18, 45, 71,175,216, 75, 73, 11,203,135, 76,123,173, 50,170,170, 69, 91,170,195,255,103,181,144,104,141, 24,218,
- 91,222, 93,109,247,151,164,237, 74, 91,185,131, 85, 89,199,238,191, 6,243, 51, 99,246,194,114,233,210, 37,153, 49, 99,134, 34,
-145,179, 2, 90,154,157, 17,249,243, 20, 45, 90,244,236,128, 1, 3,206,130,199, 94, 3, 7, 14,244,194,106,231,108,141, 26,213,
-237, 1, 45, 77,154,104,131,117, 7, 14, 28,240, 90,181,106, 21,237,204,214,105, 62, 96,149,129, 96,152,109, 90,191,126,125, 33,
- 0,180, 78, 45,198,159,151,243,119,124,165, 80,245, 94,148,192, 41, 18, 68, 27, 18,173, 96,170,216,193, 81, 48, 82, 66,183,131,
- 49,147,100,122, 59,126,252,248,143,207,158, 61,147,106,213,170,113,160, 17, 72, 73,223,129, 7, 47,163, 68,142, 60,159,249,108,
- 73,191,108,149,223,205,205,237, 22,193,250,138, 21, 43,148, 68, 96,110,125,124,242, 89, 41, 47,189, 74, 43,146, 44, 30,252, 61,
-184, 32,158,191,149, 68,203, 89,246, 68, 84,254, 31, 65,136,192,171,117,120, 8,150,206,111, 90,115,108,203, 32,191,219, 71,198,
-251,117,111,153,211,111,120,143, 98,126, 87,118,246,240, 91, 49,169, 58,165, 91,215,203,230, 55,121, 86, 41, 25,227, 49,206,245,
-188, 39, 50, 0,115, 75, 21,100,241, 23,188,109,135,197, 80, 59,124,243,237,240, 61, 6,131, 44,180, 97, 59,180,185, 45,137, 86,
-112,117, 28, 73,180, 8,178, 82,165,141,231, 59,223,205, 18, 81,186, 0, 0,255,244, 73, 68, 65, 84,189,150,252,185,176,155,120,
-238,219, 41, 11, 22,204,148, 49,141,234, 72,171, 92,110,239,104,179, 21, 30,190,252,195,158,205, 6,205,192,115,142,143, 28,151,
- 56, 86,120,120,120,200,218,181,107, 37, 97,194,132, 90, 64,203,186, 42, 33, 22, 23, 65, 55,105, 75, 23, 53, 40,241,156,135, 94,
- 41,151, 45,122, 17,193,190, 24,177,162, 71,191,243,232,254,101,217,177,253, 79,241,121,122, 22,239,249, 36,159, 62, 62,144, 6,
- 13,170, 72,197,111, 75, 72,191,190, 63,193,252,228,190,220,186,122, 94,130, 36, 91,142,212,136, 17, 81,166, 47, 74,195, 90,162,
-149, 60, 69,186,143, 61,122,244, 80,132, 20, 27, 54,108,224,252, 52, 77, 79,129,172, 37, 90,201, 82,166,251,216,171, 87, 47,185,
-125,237,168, 28,222,214, 95, 22, 12, 54,157,126,178,195,180, 64, 77,207,119,155,198,249, 29, 54,213,178, 4, 91, 42, 22, 81, 1,
-151, 53, 54,209, 83,142,191, 57,143,186, 56, 14, 45, 1,182,168,156, 2,144,244, 86, 46, 43,116,183, 5, 98, 68,191,121,127, 98,
- 31,179,121, 80, 35,121, 83, 46,150, 92, 44, 26, 35,176, 83,178,200, 31,173,118, 30, 6,215,157,134,239,215,174, 93,147, 18,185,
-114, 73,239,198,141,101, 98,215,174,178,105,236, 24,185,177,126,185,188,220,183, 49,248, 99,122,233, 4,208, 34, 40, 34,192,160,
- 52,131,146,140, 35, 71,142, 40,210, 38,107,144, 69,169, 19, 7, 17,170, 1,245, 0, 45,230,163, 36,139,234,182, 38, 77,154, 72,
-231,206,157, 21,189,181,165, 36,139, 32,139, 64,142, 64,203,134, 58,210, 81,155, 43,234, 67,172,190,237, 73,174,180,251,139, 5,
-208,162, 68,235,201,149, 63,228,205,197, 86,242,248,210,116,185,114,209, 75, 90,117,232, 37,115,246, 7, 72,219,185,207, 37,117,
-230, 60,138,132,111,250,244,233, 10, 24,115, 2,104, 69,198, 68,213,188,124,249,242, 71,231,204,153,227,181,120,241, 98,175, 63,
-254,248,195,107,220,184,113, 94, 88,169,120, 65, 66,246,130,146, 46, 39,140,228,131,235,133, 54,152, 5,254, 1,187,122, 17,104,
-205,210,174,112,200, 28, 4, 90, 84, 19,218, 59, 8,180, 46,223,127,171, 0, 45,170, 24,169,162,197,123,236, 78, 24, 80, 3,190,
- 28, 50,195, 93, 98,187,213,150,185, 11,150,202,234,213,171, 63, 66, 53,250, 2,118, 89,135,163,155, 76, 63,212,131,157,134, 35,
- 59, 46, 91,229,167, 61, 31,219,152,160,159, 18, 2,170,178, 79,159, 62, 45, 91,183,110,149, 69,139, 22, 41, 18,198,213, 75, 70,
-201, 25,143,198,114, 96,113, 74,121,120,118,176,220,221,147, 87,134,118,136,238,107,195, 32,222, 89, 22,253, 99,242, 67,162,117,
-244,206,169,185,126,247, 78,254,233, 87,191,170,139,223,254, 53, 61, 20,233,214, 72, 0,174,159,155,185,250, 29, 95,211,210,239,
-228,218,166,126, 21, 10, 71, 62,169,163,208,145, 49,241, 55,163,186,144,146, 44, 38, 72, 52,219, 97,177,165, 72,179, 84, 73, 22,
- 65, 22,190,177, 48, 3, 45, 21,100, 45,216, 92, 91, 22,109,175, 40, 99,230,229,148, 38,109, 74,201,184,241, 99, 4,106,196,119,
-180,217,178, 50,134,215, 81,244,127, 86, 22, 72,246,219, 99,129,200,141, 71, 23, 85,144, 69,179,133,149, 43, 87,210, 62,235, 9,
- 37, 89,224,245, 35,168,148,181, 84,135,122,128,150,173,202, 71, 4,208,138, 22, 39,150,169, 71,134, 20,145,246,187,166, 74,248,
- 32, 67,156, 40,251,227, 68,141,220, 3, 47,131, 96,218,241, 1,105,115,167,205,235,230,126,248, 16,112, 81, 62, 4, 92,135,134,
-225,162,244,232,222, 84,154, 55,171, 33,111,223,156, 70,186,132, 5,250, 85, 41, 82,172,168, 84,175, 89, 87,186,116,232,248, 49,
-200,102, 75,139,244,215,118,159,182, 85,119,126,253,245, 87,153, 55,111,158, 44, 95,190, 92, 17, 90,184, 37, 77,250,113,146,201,
-244,244, 79,147,169,142,206, 10, 41,116,176, 16, 87,250,208,198,141, 27,101,206,228,246, 50,181, 95,236,215,183,221, 77,199,110,
-109, 52, 41, 38, 62,252,189,191,213,116,152, 96,139,146, 45,149,118, 88,177,136,206,178,125,137,108,218, 18, 45,235, 74,106,149,
-202, 45, 90,140, 91, 39,251,182, 12,252, 48,177,171,188, 45, 31, 7,162,244, 24, 31,155, 39,140, 36, 88,226,117,179,247, 44,192,
-200, 99,130,157,223,126,252, 81, 78, 67,242,116,126,241, 98,185,177,106,165, 60,245,112, 87,212,133, 58, 85,135, 33,200,115, 50,
- 35,120,160, 17, 60,140,148, 21,169, 1, 7, 11, 2, 32,218,229, 80,234, 97, 9,178,216,208, 90, 64,139, 52, 41, 62,167,186,176,
-117,235,214,202,132,200,201, 17,106,207, 96,117,161, 10,178,168,146,162,189,150,179, 64,139, 32,129,171, 6, 84,102,111, 80,133,
-244, 73,178,212,218, 91, 0,173,254,253,250,202,133,179,176, 41, 56,119, 72,206,158, 58, 36,167, 78,122, 73,227,150,157,100,246,
-190, 0,105, 51,231,185, 36, 79,155, 85,169,203,180,105,211, 20, 94, 0, 60, 89,218,104,217,108, 46, 12,194,233, 51,103,206,188,
-112,214,172,153, 94,224,173, 23, 84,115, 94,232, 35, 94,235,215,175,247, 90,178,100,137,114, 14,222, 18, 36, 81,226,161,215,237,
- 67,132, 1, 45, 2,108,242,144,171,110,170, 11,169, 46,222,189,123,183,120,122,122, 42, 0,185,110,207, 37, 82,172,118, 95, 41,
- 89,187,151,162, 86,100,123,161,141, 28, 1,173,215, 7, 46,190,148, 74,173,127,255, 16, 41,121, 17, 95,168, 6,127, 73, 99, 50,
-165,214,179, 19,209,202, 70, 43,184,142, 44, 35,129, 63,120, 38,200, 35, 0, 5, 50,124,248,112,101,165, 72, 9, 27,141,142,185,
-240, 88, 60,103,144,204, 30, 91, 89, 54,204,169, 38, 59, 87,181,151,252,217, 99, 63,211,250,254, 62,243,253, 90,160,191, 30, 19,
-236, 57, 24,156,123,224,156,187, 4,129, 61, 76,173,248,159,215,121, 31,137,249, 52,143,202,197, 99,221,240,190,188,198,239,209,
-249, 37,126,141,171,167,246,187,115,124,154, 34,221,234,213, 58,143,223,233, 45, 61,252,230,140,168,236, 87,183, 66,252,215, 26,
- 42, 68,245, 61,145,192,215,166,180,199,130,196,185, 29,164,162, 10,200, 2, 31,219, 65,157,168,168, 11, 85,144, 69, 59,173,176,
- 72,180, 8,178, 82,167,143,247,198, 18,100,117, 31,146, 79,186,247,251, 65,210,101, 76,233,203,251,170, 36, 76,179,242,255,224,
- 12,148,194,179, 15,242,224, 47,199, 77, 74, 94, 49,254, 81, 37,154, 45,172, 69,183,165, 58,180,163, 78,212,187, 19,241, 14,202,
-162,168, 34,145,120,174, 30,174,153,210,198,191,181,123,205,160, 79,190, 15,118, 72,160,247,177,231,175,247,111,144,205,195,186,
-125,202,144, 56, 30, 13,185, 93, 29,213, 33,118,140, 24, 91,158, 63,189, 42, 31,252,247,129, 3,129, 80, 23,214,151,122,245, 42,
- 75,133,242,197,197,236, 79,147,144, 91,242,204,231,182,116,239,221, 91, 18, 38, 79, 43, 3,126, 25, 44, 52,144, 15, 43, 95,254,
-193,207, 77, 35, 48,130,234, 93, 40,205,202,151, 52,169, 76,136, 26, 85, 30, 69,143, 46,119,163, 69,147, 25, 38,147,143,206,178,
- 43,116,168, 61,161, 52, 11,253,235, 78,207, 38,166,113, 15,182,153, 22, 19, 92,173, 26, 13,203, 98, 28,252,229,127, 74,183,168,
- 70, 84,105, 19,131, 80,154,101,249,171,243,189,255,252,108,214, 21,179,214,147,218,170, 65,236,228, 89,127, 90,219,236,187,192,
- 15,152, 32,222, 85, 76, 40,151,138,196,240,175, 19,207, 49,200, 34, 29, 76,202,143, 8, 96,126,239,212, 73, 30, 98,178,241, 6,
- 99,159, 97, 18,124,182,117,139,248,108,223, 34,207,119,110, 86, 18,207,119, 77,177,107,163, 21,162, 72, 4, 69,148, 40,177,147,
-216, 3, 89, 84,151, 81, 66,165, 30,122,128, 22,109,153, 40, 37,251,230,155,111, 20,219, 44, 74,178, 8,180, 56,145,171, 32,139,
-147, 40, 39, 78,174, 0, 96,207,243,196,137,214,222, 75, 0, 72, 73, 7,158,121,133,180,151,191,180, 73, 11, 58,215, 38,101, 1,
-180,250,244,233,163,148,113,255,254,253, 50,123,246,108,101, 53, 82,172,116, 69,153,180,229,169,180, 6,208, 74,150,198, 77, 1,
- 33,148,206, 81,101,169, 5,180,168, 42, 44, 87,174,220, 97,108, 40,240,130, 52,200, 11,160,192,235,230,205, 27, 94,231,206,157,
-245, 2, 29, 47,216,165,121, 1, 48, 43, 82, 45,240,178,161,118, 97, 67,231, 8,175, 68, 75, 5, 90, 84,205,169, 32, 75,181,167,
-195,228, 43,251,246, 31,144,117,235, 55,202,198, 77,238, 10, 72,230, 36,162, 33,209,122, 79,160, 53,106, 21,212,185,169,202,113,
- 71,225, 39, 72,180, 52, 19,242,249, 59, 2, 90, 28,120,104, 84, 10, 21, 41,237,219, 20,208,231,227,227,163,168,183,185,226, 35,
- 0, 38, 80,236,223,191,191,252,252,243,207,202,246,106, 24,155, 59, 84,109,135,133,223, 78, 60,211,182, 98,197,138,247, 33,125,
- 51,179,156, 24, 52, 63,116,234,212,137,125,251, 44,127,249,159,215,121,159,249,112,189,167, 22,237,186, 21, 93, 94, 62,187,233,
-225,247,228,202, 6,191, 78,205,114,251, 61, 56,187, 64,145,110,117,255, 49,143,223,173, 67,163,253,126,172,147,214,207, 37,169,
-137,253, 72, 85, 41, 57, 36, 73,160, 69,149, 33,109,178,168, 46, 84,237,178, 8,180,152, 40,201, 34,200,194,119,239, 52,208, 82,
- 65,214, 66, 11, 73, 86,183,193,121, 1,178,234, 74,102,183, 84, 47, 44, 65,214,215, 46,209,226,174, 93,142,115,148,186,114,145,
-202,241,129,146, 44, 48, 63, 4,200,194,132,217, 22,106,240,135, 88,124,253,172,213,214, 14,238, 71,180,250, 47, 90,186, 84,177,
-110,188,188,189, 41, 80,110,193, 14,232, 96, 6,145,185,137,246, 74,219,108, 34,179,123,201,227, 21,147, 2,211, 37,136,117, 3,
-229,177, 43,217,194,206, 66,111, 26,190,127,240,223, 47, 39,142,239, 14, 6, 89,121,243,102,151, 55,111,110,201,211,103,183,229,
-238,195,187,178,121,199, 30,137, 22, 47,133, 52,111,211, 69,184, 27, 49, 28, 60,248, 39, 62,154, 36, 79,158, 60,138, 29, 42,237,
-169,224,190,198,127, 70,164, 72, 79,102, 69,138,228,205, 4,105,214, 19,157, 18,173, 16,116, 80, 81,110,152,137, 78, 32, 69, 64,
-101, 75,243, 96, 13,180,200, 28,103, 5, 62,255, 68,134,218, 45,147, 51,149,139,159, 34,251,247,195,126,159,250,250,254,249,179,
-114,183,146,139,156, 42, 18,227, 67,149,216,218, 32,203, 18,104,225, 92, 26, 86,168,160, 36,170, 16, 21,176,133,180, 97,244,104,
-229, 26,127,119, 77,214, 7,180, 56, 88,208,176,156,160,133,147, 41, 85, 68,148,100,209, 80,154,210, 27,107,144,165, 87,162, 69,
-187, 46,236,180, 82,118,239,169,234,194,137, 19, 39, 42, 82, 33, 74,203, 40,145, 32,192,225,238, 70, 72,120,164,113,227,198,239,
-156,104,244,189, 44, 31,213, 73,164, 77,149, 18,129, 34, 7,187,176, 2, 45, 74,113,160,214, 83,212,100,116,105, 49,103,206, 92,
-105,208,101,130,180,154,237, 3,137,150,155, 50,193,115,162,167, 20, 72, 11,104, 97, 64,157, 68,245, 32,192, 27, 64,213, 53, 5,
-104,129, 31, 94,144, 20,120, 97, 96,246,162,202, 15, 0,244, 16, 0, 89, 19,148,215, 25,255, 69, 10,139,176,155, 41,110,236,216,
-177,253,217, 15,152,120,238,234,234, 26,223, 9,254,153, 8,180,168,126,165,186,152, 32,210, 18,100, 17,188, 16, 4,179,109,142,
- 31, 63,174,216,214,113,211, 2, 36, 90,143,236,189, 3,128,201,123,249,190,199, 10,208, 74, 95,188,133, 98,100,207,163, 43,212,
-219,180,255, 83, 15,236,116, 19,168, 89,130,255, 19,140, 57, 2, 90, 92,217, 1,180, 74,201,146, 37,185,139, 75,217, 0,177, 6,
-118, 47,117,155,118,144, 2,197, 43,192,254,171,181, 2,182, 40,110,135,154, 70,177, 53,251, 59,129, 22,140,253,247, 97, 7,236,
- 39,128,117,159,188,121,243,222,249,233,167,159,188,249, 13,241,224, 47,255,243, 58,239,163, 31,124,130,132,107,187, 29,158, 82,
- 2, 70,223, 88,251,190, 41,154,208,247,218,233,117,126, 87, 78, 44,247,171, 82, 42,142,223,133,131, 51,253,206,237,155,226, 87,
-231,219, 36,126,103,119,141,240,171, 94, 54,129, 95,229,202,149,159, 69,143, 30,253, 60,242, 87,215,234, 7, 4, 90, 4, 89, 51,
-103,206,108,135,239, 83, 1, 87,214,137, 32,139, 82, 47,103, 36, 90,182, 65, 86, 30, 5,100,185,102, 77, 29, 10,100,125,237, 64,
- 11,160,170, 61,210, 35, 76,180, 47, 41,153,231,166, 18,244,193, 80,210,238,134, 13, 27,222, 13,218,240,115, 93,171,109,190, 20,
-208,138, 28,217,212,113,197,198,238,175, 63, 61,154,122, 95, 60,227,139,146, 8,180, 26,167, 20,166,103, 51,102,220, 24,219,114,
-240,139,200,166,200,246, 92,145,152, 8,180, 46,156, 63,166, 72,178,110, 92,219, 10, 85,225, 89,121,243, 10,155, 0,158, 93,145,
- 68, 73, 93, 36, 86,252,100, 18, 59, 97, 74, 41, 89,161,134, 28,240,186, 38, 71, 79, 93,251, 55, 2, 45, 54,217, 20, 43, 63, 90,
-183,113, 77,143, 31, 45,235,230,182,166,115,203, 25,137, 86, 16,208,218,107,249, 27,142,254,246,117, 62, 90, 48,107,230, 97, 21,
- 74, 20,126, 88,177, 74,109,115,128,249, 99,224,197,187,190, 50,164,125,143, 55,101, 98, 69, 13,204, 18, 45,214, 20, 61,181, 82,
- 37, 90,234, 4,171,245,107,103,215, 97,136, 87, 17,104,113,194,181, 6, 89, 4, 95,156, 24,232,206,192,250,208,146,104, 97, 55,
- 88, 0, 38, 19,233,217,179,167, 50, 73,171,187, 11, 9,102, 48,209, 40, 59,216, 8, 92,104,179,197,247, 48, 97, 2,118, 10,104,
- 81, 42, 64,112,133,202,188, 10, 2, 87,175, 8,224,194, 10,180, 40, 21, 25, 54,108,152, 82,103, 30, 4,112,177, 98,199,149,116,
-174,185,228,219, 42, 53, 21,157, 57,203,203,247,106, 1, 45,236,150,219,179,105,211, 38, 69, 61,200, 68,192, 69,176, 5, 94,122,
- 97,139,255, 9, 60, 63, 20,124,119, 90, 93,200,134, 3,136, 43,147, 43, 87, 46,138,223, 67,172,112, 75,148, 40,177, 7,237,162,
-123,183, 13,129, 22,165,115,148, 86, 81,242,216,105,218, 57,161, 93, 86,173,110,243, 21,169, 35, 55, 49, 80,178, 69, 16, 67,176,
- 69, 21,157, 35,160, 5, 27,173, 27,148,100,165, 43,214, 76, 76, 73,242, 9,252,188, 41,210, 76,238, 26,100,226,185,245,127,170,
-149,113,239,163, 94,160,149, 61,123,118, 69,138, 85,167, 89, 23,233,252,235, 52, 41, 84,184,172,228,117, 73, 38,195,250,245,161,
- 77,152,196,137, 19, 71, 49,192,255, 59,129, 22,218,165, 25,118,134,113,176, 27,140,148, 20,169, 23, 54, 19, 60, 96, 99,241,151,
-255,131,174,255, 10,144,197,124,141,109,125,251, 0,160,171,123,247,238,237, 3,181,243,243,179, 39, 15,251, 76, 29,213,254,213,
-196, 97,173, 94,239,222,186,252,133,122,190,108,238,136,151, 35,251,215,127,189,121,237,172, 23,248,214,159, 65, 13,236, 3,160,
-119, 86,107, 44,129, 29,136, 2,180, 32,189,181, 9,180, 0, 12,218, 49, 81,234,165, 23,104,193, 89, 80,214,212, 25,226,189, 89,
-184,165, 78,176, 77, 86,183,193,142, 65,214,215, 14,180, 84, 62,211,222,145, 64,106,217,178,101, 2,181,176, 53,208,138,133,126,
-251,148,146, 47,124, 19, 47,240,253, 94, 1, 79, 59, 56,106,163, 47,161, 58, 76,154,194,180,237,206,203, 37,114, 65,220,228,230,
-211,104, 39, 3,247,199,191, 65,160,245,178, 78,254, 27,155, 11,140, 57,185,165,194, 60,241, 28,177, 89, 18, 69,141,191,205, 94,
- 89,169, 58, 60,184,207, 67,154, 54,173, 41,243,231,141, 22,255,119, 55,224,214,224,166,120, 63,185, 45, 81, 99, 38,144,168,113,
-146, 74,244,248, 41,101,250,188,181,178,255,228, 45,217,178,245,192,191, 85,117, 24, 7,223,212, 13, 27,126,180, 40, 17, 84,157,
-143,107,125,150,188, 31,138,206,242, 57, 61,100, 90,255,216, 47,239,108, 54, 29,213,178,209,210,243,130,127,120, 30,107, 91, 70,
-231,108, 27,221, 50,167,169,218,174, 81,237,215,119,207,123,201,214, 63,127,151,238,191, 77, 10,252,115,211,165,215,169,178,151,
-125, 26, 47,153, 91, 41,189,149,167,234,134,170,195,170, 21,234, 74,255,159,199,134, 74, 91, 55,122, 10, 19,239,253,216,168,171,
-174, 93,135,244,248, 78,160, 69, 73, 22, 1, 16, 37, 69,142, 64,150, 30,137, 22,193, 27, 39,113, 91,134,239,148,110,208,230,134,
-210, 44, 26, 54,211, 62,140,246, 13, 54, 92, 70, 56, 98,203, 94,238,106,163,155, 8, 11, 96, 21,102, 27, 45, 76,104, 74,153, 8,
- 12,105,255, 67, 29, 57, 36,108, 2, 41,145,178, 11,115,238,220,185, 50,107,214, 44,193,110, 58,101,203,182, 22,208,194,253, 93,
- 4, 88,170, 93, 22,207, 1,208,188, 32, 17,163,170,176,166,222,246,182,204, 7,240,150, 8,116, 71,182,111,223,222, 11, 19,170,
-151, 53,208,162,148,236,247,223,127,247,194,142,178, 9, 80, 85, 36,215,122,135, 10,180,176, 29, 93,152, 44,141,223, 9, 86,212,
-235,252,109,208,160,129, 98, 15, 71,195, 95,123,116, 9,150, 48,201,123, 79,134, 36, 21,128,140,237, 73, 62,113,227,128,160,236,
- 2,240, 13, 35,232,140,146, 41, 83, 38,133,175, 89,178,100, 17, 72, 97,184,125,157,190, 56, 44,253,104, 5,191,130,101,180,150,
-104,209, 6,166, 80,153,106, 82,184, 88, 69,249,198,205, 77, 26,184,101,144,238,223, 87, 82, 36,110,144,232,252, 19,128,150, 45,
- 22,117,193,197,125, 72,186, 85, 71,165, 74,149,186, 9,233, 41, 62,163,215,175,161,218,127,141,254,243,156, 96,202, 86, 2, 40,
-126,134,190,251, 12,125,195, 7, 96,243,178, 86,219, 19,104,225,219,105, 7,195,221,118,216, 17, 28, 66,154,101, 9,178,156, 1,
- 90, 25, 51,164,221,241,196,231,230, 75,143, 35,189,253,104,248,254,243,160,220, 14, 37, 89,255, 6, 27, 45,149,207, 48,122,111,
- 79,163,119, 56, 1,126, 24, 47, 94,188, 22, 22,252,143,137,126,127, 2, 99,107, 32,199, 57,142,179,212, 28,128,255,119, 53,218,
- 72,175,154, 48,216, 24, 30,224,126,130, 3,154,161,232, 37, 74,102,186,253,242,211, 22, 57, 37,177,196, 75, 76,226, 21, 24,201,
-103,228,138,118,171, 22, 22,152,233,179, 54,239, 52, 89, 95,232, 15, 57, 59,233,144, 36,136, 18,143,210, 25,155, 7,141,225,167,
-140, 31,241,241,151, 1,189,165, 86,237,170,242,242,213, 45,121,236,125, 71,110,221,191, 43,209, 20,144,149, 74, 10,151,169, 46,
-158, 39,110,202, 62, 0,173,193,131, 70,127,248,183, 25,195,167, 42,213,165, 81,234,210, 93,158, 58,240,163,165, 75,136,226, 82,
-188, 75,163,148, 37,187, 60,181,246,163,245,218,231,154, 28,220,210, 87, 22, 14, 49,157,210,218,117,168,245,221,127, 5,247,173,
-119, 29,234, 7, 90,156, 32, 11,231,204,250,248,236, 46,119,217,183,104,138,204,237, 92, 87, 10,231,206,233,147, 50,123,233,171,
-206,128, 44, 50, 9, 19,215, 67,174,140,154, 53,237, 37,179,103,237, 11,149, 60,247, 92, 22, 38,222,251,245,151, 89, 78, 1, 45,
- 75,144, 69,213,153, 45, 73,150, 94, 27, 45, 2, 45,218,125,169,146, 44, 75,195,119,130, 35,216,170, 40,118, 89, 28,124,244,238,
-100,180,234, 36,123,169,154,164, 91, 10, 11,160,229, 92, 63,178,176,209, 34,208, 90,184,112,161, 98, 99,241, 29,156,193, 18, 32,
- 80,122, 66,159, 98, 4, 14, 19, 38, 76, 16,168, 2, 5, 64, 70, 1,163, 0, 75, 14,141,225,113,127, 6,118, 89,122, 65, 34,116,
-130,118, 90,144, 24, 41,210,172,172, 89,179,238, 69, 33,109,130, 10, 71,133, 71, 31,170, 15,112,114, 12,187, 90,188, 96, 16,238,
-181, 96,193, 2, 47,172,156,205, 4, 91, 76, 24,232,205, 84, 77,210,175, 22, 84,129, 94, 5, 10, 20, 56,142, 58, 88, 14,248,161,
-200,211, 54,143,128, 90,141, 32,208,124,220, 89, 57,115,227,165,178,203,144,160, 91,141, 50,160,254,114,130, 96,152, 39, 45,160,
-197, 93, 55,101,203,150,149, 10, 80, 97, 87,170, 84, 73,225, 39,221, 67,208, 81, 41, 87,124,220,129,218,172, 89,179, 96,181, 50,
-128,129,183, 30,160, 5,137,157, 80, 74, 10, 23, 25,210,162,229,143,146, 47,117, 42,169,239,150, 94, 70,127, 83, 76,150,142, 25,
-169,168, 42, 1,244,254, 46,160, 69,245, 47, 85, 44, 52,112,111, 31,212,198,150,255,117,217, 78, 89,242,182, 88,177, 98, 55,128,
-177,222, 64, 45,238,131, 29,192,207,109, 1, 46, 21, 96,193, 69,199, 51, 44, 96,158,195,133,202,115,240,192,210, 9,168,205,230,
- 34,208,162,106,208,218,240,221, 26,100,233, 5, 90,112,217,145, 31,253,242,250,235, 23,119,228,254,141, 61, 50,125,110,221,119,
-142,212,133,150, 46, 33,156,251,104,191,142,220, 24,255,126,196, 98,227, 6,192,151,162, 30,166,148, 28,106, 90, 51,119,141, 99,
- 1,114, 25,223,145,214, 4,242,217,129, 86,194,164, 38,247,107,207, 39,201,121,113,253,180,232, 93,230,253,137,175,204,246, 49,
-173,221,183, 55, 82,139,151, 62,117,171, 28,220,191,249,219,249,159,182,247, 89, 35,241,163,196,161,223, 55,123, 71, 12, 72,181,
-238,220,187,121, 1, 70,239, 55,165,126,195,134, 18, 59, 65,114,137,147, 40,181, 28, 57,115, 67,246, 30,191, 42,171,183, 29, 19,
-151, 44,197,165, 80,217, 26, 18, 51,122,116,110,166,249,151,185,119,232,244,252,199,113, 94,255,247,163, 53,237,130,100,202, 95,
- 57,216,143, 22,237,183, 80,103,123,126,180,130,249,154,162, 68,167,231, 85,126, 57, 20,236, 71,171,250,144,147,146, 50,103, 69,
-167,252,104,125, 29, 95,135,195, 82, 58,239, 25, 30,198,221, 49,115,101,201,208, 53,127, 54,215, 7, 11, 70,246,251,180,227,143,
-145, 10,200, 98,202,151, 53,163, 93,201,128, 85, 49, 66,168,130,232,199,136, 32,200, 30,208,218,186,229,156, 48,105, 0,173, 16,
- 52,185,115,134,210, 39,170,196, 56,241,106,129, 44, 59, 18,173, 16, 52, 41, 37, 35,208,162,148,193, 18,100, 81, 26, 68, 35,118,
-190, 71, 5, 89, 42,160,179,161,142,180,167, 6, 83, 28,150, 18,104,113,167, 36,207,145, 28,251,204,250, 63, 83,255, 79,211, 2,
-104, 17, 64, 81, 90,197,196,115,235, 52,102,204, 24, 97, 82,109,184,172,128, 86,168,114,210, 94, 10, 3,106,183,252,249,243, 31,
- 33, 48, 34, 8, 34,208,194,181, 45, 58, 63, 6,235,118,223, 3,131, 91, 47,168,239,188, 32,225,241, 2,144, 57, 65,207,242, 72,
-177,241,174, 24,248,237, 74,111,243,112, 65,161,216,128, 97, 96,183,229, 45, 62, 4, 77, 21,104,169,234,193,198,253,151, 73,137,
- 31,250, 75,185, 6,253,148,157,136,148, 54, 18, 20, 83, 61, 75,201,164, 29,160, 21, 76, 83,149,104,193,141,133,192,157,133, 2,
-178,170, 86,173,170,216, 76, 17,164,210, 62,143, 54,110, 4,179,244, 49,212,166, 77, 27, 33,192,181, 1,180,130,105, 66,162,245,
-120, 52,236, 13,169,114, 36,208, 42, 92,184,176, 0,128, 40,198,251, 3,123,246,144,206, 85, 42,200, 66,128, 44, 74, 55,225, 24,
- 85, 16,218, 72,217,112, 1,213,161, 53, 32,212,173, 82,213,217, 62,204,102, 73,179, 53,236,199,142,225,219,160,189,206, 49,220,
- 91,201, 95,139,255,122, 37, 89,193, 52, 33, 45, 24, 53, 98,196,136,151,176, 25,124, 3,149,248, 75,216, 31,250, 32, 61,199, 55,
-244, 10, 82,215,103,176,127,124, 6, 73,227, 51,244,135,231,216,233,244, 2,234,100, 31,168,111, 55,227,221, 8,149, 26,226, 8,
- 85,119, 2, 45, 26,187,227, 91, 12, 54,124,167, 71,120, 72,113, 21,117,161,101,178,163, 58, 12,166, 73,208,148, 51, 71,182,109,
- 79, 30,156, 10,184,113,126,157,236,223, 54, 70,166,140,239,240,202,158, 77,150,181,223, 45,139,146,126,238, 54,114,162,105, 29,
-102,213, 44, 39,128,214,125,142,169, 28,163, 40,197,194, 66, 45, 0,215,232,122, 3,152,212,230, 17,130,102, 4,169, 14, 45,105,
-222,193, 91,173,119, 29,182, 31, 51,183,241,147, 25, 47,247, 62, 49, 93, 88, 37, 74, 2,208, 50,181,124, 37, 76,205,255,240,189,
-223,178, 90, 15, 2, 35, 46, 28,212,195, 86,221,139, 20,202,151,231,205,245,203,176,149,197, 98, 44, 85,134,236, 18, 61, 65, 26,
- 57,116,250,182,236,129, 36,203,173, 64, 37,201, 87,162,154,100,113,205,250, 22, 68,254,117, 14, 75, 85,137, 86,218, 50, 93,188,
- 19,185,125,251, 42,105,138,244, 31,186,119,239,174,140,151,107,214,172, 33,207, 29,249,209, 10,230,167, 42,209, 74, 85,178,139,
-119,194, 44,164,147,241, 3, 53, 44, 52,217,160, 47, 54, 13, 58, 17,213,183,191, 62, 58,121, 92, 51, 92,235, 84,251,219,119, 43,
-135,119,151,181,195,186, 42, 0,107,108,203,239,228,219,130, 57, 94, 20,112,203, 60, 66,103,141, 66, 1, 45, 2,152, 86, 63, 14,
- 80, 36, 86,214,105,236,152,197,194,164, 94,215,227, 25,158, 64,139,246, 5, 42,200,162, 4, 67,235,208, 2, 69, 4, 90, 28,104,
- 72, 87, 13,179, 67, 23, 14,106, 12, 69, 74,229, 40, 73,209,216,201,104,111, 64,219, 75,131,104,218, 13,113,167, 32, 13,182,193,
-203,189, 78,243,211, 2,104,177, 28, 44, 15,165,107, 44, 35,203,204,242,211,240,157,170, 84, 2, 68,110, 16,160,161, 60,237,192,
-180,128,150, 90, 22,128,153, 84,152,168,134,195,248,251, 4, 0, 11,129, 22,183,250,235, 57, 66,212, 29,239,219, 65,144,133, 85,
-177, 23,212,111,199, 64, 51,175, 53, 17,228,201,198,123, 4, 89, 65,190,181,118, 58,154,112, 9,180, 88, 39,214,141,253,132,245,
-226,230, 2,110, 40,160,207, 48,130,100,170, 11, 41,149,100, 10, 82, 29,218, 5, 48, 4, 90, 80, 95,120,163,140,130,221,116, 10,
-200,162, 10,146, 97,119, 84,245, 35, 55, 66,112,131, 4,109,179,160,230, 82,182, 48, 59, 2, 90, 80,195, 28,133,244, 78,177, 21,
-163,221, 24, 13,247,105, 7,195,231, 56,248,176, 76, 52,226, 87,164, 92, 0, 88,148, 60,210, 57, 46, 0,215, 81, 71,117,215,211,
- 0, 58,242, 88,182,209, 90,130, 42, 0,149,211,252,133,125,222, 53,254,194,238, 80,249, 15, 90,192, 23,186, 14,235, 62, 95, 6,
-252,217,138, 29,149, 47, 80,215,215,144,108,189, 68,219,248, 64,130,229, 3,105,235, 11,216, 20,190,196, 38,129,231,176,245, 34,
-128, 47, 99,231, 13, 54,129, 22, 37, 90,234,238, 66,130, 44, 26,190, 91,131, 44, 7, 18,173, 96,154,169, 92, 98,182,202,150, 43,
-241,219,223, 6,212,251,176,108, 78,143,128, 42,229,115, 94,143, 29, 51,234, 54,218,108,233, 9,207,163, 49,137,235, 98,154,131,
- 76,154,160, 40, 12, 47,208,164, 9,105,214, 56,168,204,159, 99,145,240,158,139, 21,168, 20,185,211,206, 30,200, 98, 17, 52,105,
- 34,143, 94, 41,151, 90, 37, 45,154, 81, 35, 39,138,119,185,151,215,206, 15,109, 30,158,144,244, 87, 55, 75,188,141, 7,247,167,
-233,254, 70,106, 78,246,147, 90, 67, 79, 7, 68,142,153,152,106,104, 58, 73,213,162, 89, 20,210,170,251,147,199, 77, 52,207,248,
- 99,190,148,255,174,158, 28, 60,113, 85, 70,254, 62, 83, 10, 22,171, 16, 24, 51,122, 12,126, 3,255,202, 16, 60, 65,140,137,133,
- 69,225, 21, 2, 35, 74,244,105,207, 59,116,232, 80,201,242,151, 31,173,103,216,117, 72,199,197,182, 14,235, 54, 34,157,203, 92,
-128,210, 68,130, 82,122,238,202,215, 65, 39, 12,221,248, 31,249,136,234, 71,203,210,159,150,227,130,230,113,203,232, 85, 32,135,
-235,147,130, 76,217, 50,123,231,207,154,233, 78,193,236,153,246,103,205,156, 70,175,244, 37,212, 7,200,184,133, 4, 68,156, 24,
-245, 38,173, 88,135,244, 95, 69, 16, 68, 73,150, 30,144,165, 71,162,197, 0,209, 4,112,106,226, 59,212, 68, 91, 44, 53, 17,176,
-169, 9, 43,190,240, 4,149,214,203,211,255,119,236, 32,160,229, 44,200, 98, 76, 69,148,223,153, 88,135, 52, 96,207,142, 52, 1,
-137,142, 0,245, 28,214, 0,155, 1,164,119, 32,237, 6,200,170,103,143, 0,238, 57, 10, 52, 29,130, 38, 12,120, 15,161,125,238,
-169, 9,237,115,207, 50,177,142,150,137,224, 18,109,116,200,234,221,193, 52, 85,160, 69, 9, 20, 29,247, 17,252,112,199, 41, 35,
- 2,208, 30,143,131, 7, 1,146,101,226,192, 68,195,117, 43,213,161,101, 57,243, 18,108,161,172,143,105,112, 12, 85,140,146,112,
-237, 25, 64,221, 91, 0,140,247, 72,254,176,205,122, 11, 64,242,140,146,172, 32,144,101, 13, 68,181, 38, 29, 61,109, 98,157,199,
-146, 38,195,235,172, 65, 90, 96, 37,201, 98,156, 51,110,211,214,235,176,208, 94, 57,203, 64, 85,188, 13,124,124, 1, 73,227, 43,
- 72, 86, 95,125,255,253,247,207,177,219,116, 43,104,219, 3, 88,118, 39, 71,180,121, 53, 74,181,152,208,198, 14, 19,242,212,182,
-193,156,224,114,230, 41,154,240,221,216, 5,185,197, 53, 91,252, 55, 9,226,197,216, 70, 53,162, 30,128,101,195, 70,235,115,183,
- 81, 88,218, 88,207,228,104,143,110, 44,240,249, 5, 55,217, 96, 81,163,229,119, 79, 79,221, 35, 26,104,177,220,153, 34, 39, 78,
-120,174,252,248,223,222,182, 61,189, 67,134,157,187,126,171,225,184,107, 82,160,193, 4,223, 72,177,146,208,215, 91, 38,123,223,
-187,141, 74, 91, 6,149,126,250, 31, 11, 42, 61,158, 0,139, 11,127,142,111,121, 96,163, 58, 50, 74, 20,185, 15,155,209,135, 72,
- 24, 4,158,235, 4, 90,227,185,176,228, 66,151,227,102, 94,253,116,116,245,109,116,160, 34, 72,213,130, 82, 81,252, 98,171,169,
-148, 15,250,255, 45,126,121, 77,189,207,223, 98, 86,247,163,233,122, 81,216, 51,217,247, 12, 31,118,154,186,158,180,158, 28,207,
- 98, 96,164,158, 95,119,194, 71,110,237, 45, 58, 4, 77,220, 63, 97, 11,248, 88,130, 32,235,115, 39, 64,145,174, 74,234,236,132,
-225,161, 21,122,210, 1,208,114, 73,145,226, 8,119,210, 49,209,208,219, 58, 97,146,161,215,231, 16, 9,117,127,148, 52, 89,178,
-189, 22,133,209, 51, 72, 58, 91,246,175,142, 38,193, 18, 86,181, 94, 0, 58,222,106,162, 10, 68, 77, 0, 5,222,106,162, 20, 43,
- 56,197,142, 13, 91, 92,135, 65,165,157,229, 93,120, 38, 71,103,222,101,171,141,104,139, 69, 85, 11,109,181,104,163,229,172,109,
-150, 86,187,151, 1,208, 92, 7,208,197,144, 75, 90, 0,203, 46,208,114,166,146, 90,223,102,234,244,177,220,243, 21, 75,248,142,
-146, 45,103, 0,214,127, 0,104,153, 48,118,140, 71, 58,140, 49, 86,203, 38, 75,171,221, 77,118, 28,150, 58,106, 74, 77,154, 65,
- 15,211,102,180,173, 41, 81,252,141,166,248,137,175,153, 98, 36,221,168,252,183,109, 75,170,151,166, 51, 93,236,107,167, 73,255,
- 87,202,214,124, 46, 48,115,153, 76, 1,211, 45,252,104,205,252,203, 51,188, 30,137, 86,120,232,232,226, 55, 65, 20, 50, 42, 42,
-100, 44,130,251,227,127, 85,254, 90,252, 15,190,207,107,204,111,117, 63,216, 11,189,174, 23, 58,159,201,121, 27, 45,231,223, 97,
-243,137,175,189, 19,134,135, 13, 70,221,195,195,189,208,207, 26,252, 52,248, 25, 81, 28, 48,250, 82, 68,113,242, 47, 58, 6, 63,
- 13,126, 70, 44, 7,108, 80, 83,129,150,163, 95,203,123,118,242,125,246,114,254, 29, 47, 48, 62,192,136,229,186,193, 79,131,159,
- 17,197, 1,163, 47, 69, 20, 39, 13,176, 97,244, 37,163, 47, 69, 44, 7,156, 0, 90,170,148, 75, 85, 27,170,210, 44, 75, 9,152,
-122,237, 51, 23,210,126,172,195,160,213, 8, 63, 20,235,228, 76,153,108, 61,175,117, 77,139,190,214,243, 97, 41,179, 65, 51,116,
- 59, 59,226,137,209, 70,246, 57, 96,244, 37,163, 47,233,237, 3,198,119,100,124, 71,182, 56,160,183,255, 88,230,251,183,244, 37,
-181, 30,246,120, 16,170,158, 95,129, 68,235,159, 97,163,165,213, 67,116,222, 55, 86, 79, 58, 25,165, 51,155,193, 79,157,140,210,
-153,205,224,167, 78, 70,233,204,102,240, 83, 39,163,116,102, 51,248,169,147, 81, 58,179, 25,252,212,201,168,240,102,179, 97,163,
-165,216,100,217, 83, 23,254, 13,170, 67,135, 18, 45,155,245, 71,140,237, 40,247,239,175, 74,252,244,233,150, 20, 76, 60,231, 53,
- 39,153,101,116, 66, 39, 25,166,145,253,107,229, 39,195,245,232, 13,217, 99, 47,239,215, 90,247,136,232, 1, 70,221, 35,130,139,
-255,167, 97,240,211,224,103, 68,113,192,232, 75, 17,197, 73, 13, 58, 86,187, 14,185, 3, 81,221,101, 88, 49, 72,109,200,107,234,
-206, 68,203,243,224,251, 95,168,168,250, 94, 67, 64, 69,112,245,248,241,226,114,143, 31, 47,236,248, 87, 90, 92,142,215,156, 4,
- 91,193,157, 48,153,139, 11,195,183, 4,187, 67,112,184, 43, 16,121,129, 83,163,132, 72,255,142, 65, 82, 47,224, 8, 15,216,208,
-251, 14, 75,209,173,190,142, 17,148,139,113, 14,115,231,206,221, 30, 97, 86, 22,194,209,101, 71, 27,113, 15, 45, 7,159, 81,145,
- 34,153, 62, 49,225,241, 81, 26, 47,114,148, 87,107, 64,203,138,157,128,147,225, 34,193,147,137,231,120, 87,214,127, 41,112,213,
-106, 47,250, 60,106, 2,215, 17, 59,176, 35,247, 53,206,187,219,120, 64,139,159,234, 35,244, 67,212, 23,222,251, 79, 35,252,144,
- 47,118, 12,158,198,255,126, 72,209,244,208, 28,220, 53, 85,137,125, 91,155,108,229,175,173, 66, 15,238,153, 42,233,145,237,245,
- 39,143,236,148,218,158,247,105, 71,229,228,174, 72,150,143,137,231,122, 3,156,235,173, 59,139,204,122,214, 69,162,227, 70,254,
-218,170, 55,243,233,161, 89, 28,249,232,169,124, 11, 82,121,173, 70,212, 73, 83, 7,153, 16, 89,244,148, 83,125, 32, 46,118, 52,
- 79, 71,186, 15, 55, 59,140, 25,152,214,206,203,156,161,169,183,188,246,104,178,173,217,151,126, 10,250,181,244,147,165, 69,219,
- 97, 57,177,187,178, 58,234,186, 13, 59, 45,183,241, 92,139, 88,208,253, 47, 89,247,224, 34,193, 61,204, 36, 56, 21,127, 75,111,
-253,116, 67,100,233,126,200,198,174,122,189,253, 83,103,149,131,179,125,142,186, 59, 91,134,127, 82,126,231,118, 29, 82,122, 69,
- 96,117,230, 84,175, 63,183,108,254,246, 37, 19,207,121,141,247, 82,102,175,147, 62, 93,161,250, 91, 50, 22,109,242, 56, 69,190,
-186, 31,211, 22,106,248,216, 37, 95,221, 45,188,110, 85,235,224,134, 32,176, 10,120,115, 69,252,124, 14,137,217,239, 78,176, 79,
- 21, 91, 39,138, 67,209, 48, 0,173,196,137, 93,227,199, 77,149,123, 96,162,244,249, 14, 38, 72,151,235, 77,252, 52,185,222, 36,
- 76,155,255, 96,220, 84,185, 6,243,158,131, 22,209,236, 48,217,147,154, 82,102, 75,106,234,145, 45,153,201,131,191,252,175,209,
-194,214, 52,245, 2,142,240,128, 13,203,103,199,233,236,129,154,117,183,164,131, 1, 55, 49,194,165,172,128, 39,254, 77,112,144,
-234, 14, 71,164,155,106,215,174,189, 18,215, 83, 91,228, 83,105,166, 32,192, 82,219, 24,231,129, 24, 20,166,160,125, 71, 89, 39,
- 94,231,125,139,188, 4,102,150, 82, 48,187,229,196,214,241,198, 69,139,149,244,218,123,224,232,213, 43,215,110, 63,188,112,249,
-230,237, 77,219,118, 29,207,147, 55,223, 49,222, 11, 99,187, 71, 66, 96,228, 70, 0,108,203,144,206, 6,165,101,188, 6,122,142,
- 38,244, 16,229,196, 0,184,143,177, 37,157, 73,120,230,128,189,239, 72, 71,155,214, 71,124,186,183,116,128, 74, 15,246,140,115,
- 9, 94, 51, 24,180,245, 97,205, 79, 5, 80,161,158,167,209, 22,190,112,101,113, 10,255, 7, 96, 64,247,252,243,207, 63,111,194,
-187,254, 51, 56, 92,125, 11,199,171,143,225,107,231, 82, 80, 64,105,235, 73, 46, 84, 27,117,171,154,114,235,177, 93, 35,223,242,
-215, 86,217,127,237,152,185,231,225, 93,189,110,241,215,201, 73, 60, 50,194,245, 76, 69,120,167,183,152, 88,158, 33, 61, 13,154,
-116, 56,241, 60, 1, 15,149, 4,128,104, 43,118,162,158, 62,159, 29,229, 25,135,231,159,143, 28, 57, 82,137, 50, 64, 31, 67, 0,
-154,244, 41,196,111,139,247, 45, 15, 61, 52,215, 35, 4, 86, 32,163, 88,128,191,122,156,255, 90,210,204,134,151, 45, 70, 98,220,
- 73, 85,179, 64,176, 70, 58, 76,193,192, 13, 94,249,103, 96, 1,244, 16,215,126,213,209,238,118,187, 20, 64,250,210,117,235,214,
-125,164,175, 62, 58, 7,198,255,253, 78,182,145, 61,218,173,224, 66,229, 60,163, 36,128,159,108,159, 54, 54,190, 41,107,126, 18,
-228,181, 66,123, 44, 67,164, 6,119, 56,192,117,135, 31, 59,119, 56, 83, 93,198,235, 72,246, 64,160,238, 54, 34,200,130,227,103,
- 37, 58, 5,128,150,221, 96,212, 97,104,119,187, 60, 14, 11, 63,209,190,147,225, 92,248, 13,199, 74, 56, 1, 22, 58,208,102,132,
- 18,213,129,182, 13,135,220,124,141,158,254, 25,161,229,116,150,216,191, 40,191,150, 59,148,191,170,250,151, 52,107, 97, 71, 2,
-172,183,111, 47,195,211,248,101,225, 57,175,241, 94,198, 98, 77,188,122,141, 92, 16,120,236,252, 29,121,244,252,189,240,183,221,
-128, 63, 3, 83, 22,168,207, 96,193, 54, 59, 54, 27,159, 32, 75, 30, 13,150, 75,235, 19,203,179, 87,239,101,208,210,107, 82,177,
-151,135,148,104,179, 88,154,252,182, 22,180,222, 42,243,108, 88,128, 86, 92,151,172,229,227,167,206,251,180,125,239,113,230,173,
-135,183,201,165,219,103,228,226,173, 43,178,118,251, 9,105,221, 99,140, 57, 65,154,188, 79,153,199,153,142, 93, 48,149, 41,118,
-214,164,166, 38, 57, 93, 34,109,111, 95, 45,247,167,125,127,116,146,231,251, 39,203,190,233,237,164,123,157, 60,159,120,157,247,
-153, 79, 99, 64, 11, 5, 56,224,125,252, 16,194,187,120, 90, 38, 94, 11, 43,216,192,251,149,119,152,205,254, 10, 15, 73, 7,177,
-245,182,129,151,189, 49,201, 59,138, 85,101,243, 3,196,104, 30, 3, 34,145,146,205,226,198,173,215, 56, 90,180, 14, 76, 77,226,
-198,109, 80, 60, 93,186,145, 15,238,223,223, 2,175,243,238,240, 52,239, 14, 7,148,238, 91,183,110,221,132, 16, 42, 93, 45,120,
- 96, 19,104, 69,142, 28, 41, 16, 94,199,119,192,243,187,187,117,226,117,222, 15, 3,208,202, 86,188, 68,169, 19,175,223,248,190,
-191,119,251,238,139,223,186, 14,216,209,175,239,136, 77,179, 23,173,219,118,240,216,217, 35, 57,114,228, 62,130,114,113,146,178,
-117,216, 27,124,210, 99, 34,244, 2, 80, 49,211,171, 60, 61,236,171, 33, 41, 0, 50,223,243, 30,136, 89, 47, 42, 84,250,214, 64,
-203,251,242,238,237,114,255,204, 73,185,115,226,168,226,193,159, 3, 35,211,133,109,238,114,102,227, 90, 57,181,102,133,226,213,
-159,137,113,229, 50,103,206,204, 73, 82,247, 4, 97,145, 49, 53, 36,141, 1,244,200,188,122,245,106, 37,200, 56,194, 40, 17,176,
-118,214,232,159, 81, 17,254,102,247,224,193,131,175,237,222,189,219, 27, 94,157,125, 17,122,233, 62, 60,226, 63, 0,200,240, 69,
-251,154,225,108,212,140,186,155,219,182,109,107, 70, 56, 39,115,243,230,205, 41,217,234,107,175,156,148, 96,117, 7,184,106,240,
- 93,105,121,243,234,161,240,151,255, 45, 37, 91, 85, 17,234,169, 75,141,188, 79,207,159, 88,252,137,191,252,175, 81, 78,245, 54,
-230,154,200, 83, 17,219,240, 5,251, 11, 67, 44,241,224,100, 99, 25, 29,129,206,145,233,179, 79, 39, 77,203,108,163,127,250,233,
- 39,197,155, 63,219,158,116,212,196,112, 73, 12, 77,194,216,151,120, 96,180,141, 62,111,167,171, 41,151,221, 45,128,150,117,228,
- 3,173,254,185,242,230,205,155, 50,118,236, 88,203,112, 38,158, 4,109, 76,120,216, 51,136, 64, 43, 58,215,101, 68, 8, 0,153,
- 0, 92,179, 94, 20,232,157,112,163, 0,188,190,226,228, 77,158, 50,218, 4,192,135,189, 88,161,122,105,178, 44, 51, 24, 85,129,
- 33,178, 24, 33, 3,161,185, 4, 17, 2, 88,254,121, 86,101,181,164,217, 2,125,207,253,240,225,195,238,248,126,220,209,212,193,
- 9,206,170,221, 1, 6,221, 17,193,129,146, 66,135,241, 81,113,223, 97, 57, 41,201, 2,109, 47,148,203, 11, 64,213, 19, 78,134,
- 61,224,188, 90,203, 89,175,222,186, 59,234, 23,214,247, 28,209, 28,139,126,239,163,142,147,224,139, 18,230,134,253, 83, 61, 12,
-160,229, 12,171, 35, 52,175,115, 18, 45, 45,160,149, 60,119, 45,121,254, 54, 80, 94,190,147,224,196,255,188,110,111,224,101,227,
- 83,146, 69,144,117,235,228, 80,185,255,204, 87, 42,245, 98,191,254,235,200, 90,117,128,220,122,252, 90, 57,199,224,248, 33, 70,
-172, 88,227, 77,209,163,215, 54,165, 79,159, 82,145,110,253,255, 8,213, 9, 9,160, 50,229, 43,235,183, 3,225,108,188,159,191,
-150,123, 79,124,228,240,185, 51,114, 4, 0,240,248,197, 71,114,232,236,121, 89,188,105,137,184, 22, 44,253, 46, 78,178,172,182,
-188,176,135,162, 9,201,213,130,118, 85,178,190,223, 59,173,141,188, 4,184,242, 59, 62, 59, 84,122,178,123,188,108, 26,213, 72,
-154,149,203,240,158,249,237,213, 29,215, 9,130,130, 65, 4, 1,197,230,205,155, 15, 1,108,120, 90, 38, 94,179, 2, 27,129,124,
- 86,231, 96,174,188, 67, 5, 90,234, 59, 22, 45, 90,228, 89,166, 76, 25, 15,240,180,180,157, 46, 21,170,238,205, 76,166,140,205,
- 98,198,108,187,107,250,244,214, 47, 30, 60,104,135, 25,172, 19, 16, 92,231,123,151, 46,117,234,254,211, 79, 71,206,238,222,125,
-246,202,153, 51,123, 56,240,193,163,176, 59, 2,108,187,231,203,151,111,137,157,114, 82,202, 22,200,242, 0,160, 92,178,144,100,
-173, 32,216,194,255, 21,234, 53,222,103, 62,230, 7, 45,107, 53,163,205,193, 7,106,194, 25,187,247, 30,186,124,239,246,189,231,
- 55,206, 95,244,158,250,219,168,157,211,198, 78,223, 50,110,202,130,149, 43,214,239, 92,191,116,213,250, 77,204,163,183,238,200,
-151, 30,224,196,155, 43, 69, 14, 94,156, 12, 24,206,135, 30,143,233, 61,153, 97,116,150, 44, 92, 32,233,210,164, 33, 24,178, 5,
-182, 66, 1,173,251,103, 78, 73,215,120, 38, 37,169, 19, 35, 39, 66,245, 26,127, 25, 83,142,137,147, 90,150, 44, 89,194, 10,180,
-234, 49, 78, 25,129, 22, 86,250,175, 80, 62, 2,161, 52, 58,234,222, 23, 33,113,174, 46, 94,188,216,220,170, 85, 43,115,189,122,
-245,148, 4,239,206,102, 76, 98,239, 49,113,155, 33, 25, 51, 3,188,153, 17,108,220, 92,179,102, 77, 51, 66,107,220,132, 71,123,
- 74,189, 44,143,224,186, 83, 93, 72, 73, 22, 65, 22, 15,254,242, 63,175, 83, 77, 72, 9, 86,187,239,243, 63,155, 48,172,187, 4,
-248,191,145,241, 67,187, 73,155,239, 11, 60,227,117,170, 19, 29,244,121,170, 8,199,163,124, 79,212,177, 3,160, 80,105, 23,198,
-181,100, 91, 49,250,193,131, 7, 15, 84, 41, 76, 88,128,150, 55, 1, 6,193, 48, 35, 78,168, 33,190,248,203, 16, 87, 4, 91,236,
- 31, 40,135,183,157,114,150, 6,200,185,139, 9, 81, 44, 19, 67, 58,149, 43, 87, 78, 73, 12, 86,206,208, 78, 4,108, 12,243, 84,
-164, 72,145, 55,160, 85,204, 30, 63, 1, 44,231,239,219,183, 79,169, 50, 65, 32,242,245, 66, 58,202, 50, 49,225,252, 48, 82, 54,
- 0,109, 95, 70,221, 96,104, 47,244,123, 91, 18, 40,221,192, 0, 33,177,142,179, 63, 50,242, 6, 67, 93,181,107,215,238, 21, 35,
- 28, 0,128,237,193,187,104,248,171, 30,122,104, 50, 24,243, 12,150,157,188,155, 53,107,150,194, 3,140, 29, 74,249, 25,176, 29,
-247, 41,217,178, 69,115, 49,193, 21, 34,127,184,163, 93, 66, 0, 45,254, 71,123, 80,178, 78,160, 69,137,159,163,195, 81, 57, 51,
- 32,212,216, 30,198,116, 69, 40, 47, 47,212,215, 11,224,210, 11, 18, 52, 45,201,150,158,186,107, 20, 43,212,109,187, 52,161, 46,
-252, 63,162, 2, 83, 24,226,230,222,189,123,202,184, 97, 0, 45,103,217,252, 55,231,215, 82, 29, 18, 80, 61,125,243, 73,110, 61,
- 49,139,247,235,143,114,228,202, 11,153,181,249,170, 45,160, 21, 92, 19, 2, 45,118,132, 91,143, 94,203,205,135,175,228, 6, 82,
-153, 54,243,100,164,251, 91,105, 50,227,153,100, 40,253,147, 92,190,171, 44, 80, 5,158,106, 17,179,238,116, 32, 68,196,239,176,
-178, 8,136,159, 32,129,181,119,248, 96,186, 84, 9, 38, 76,151,231,217,246,163,187,100,251,137, 37,178,247,212, 46,121, 4, 16,
-119,253,254, 11,217,127,234,158,252,190,104,182,252,248, 75, 13, 25, 62,189,171, 76, 91, 56, 82, 82,100,205,249, 42, 81,162, 76,
- 9,180, 88, 12,224,164,148,229,131,207,117,241,191,178,213, 38,208,122,119,126,141, 60, 58,182, 82,142, 46, 29, 40,204,239,136,
- 38, 6, 74, 56,220,253, 11,112, 20, 40, 80,224, 46, 2, 13,123,218, 74,188,167,130, 13, 60,227, 40,160,167,173,215,141,230, 59,
-152,192,239, 59, 24,212, 60, 17, 75,207, 19,113, 21,249, 46, 15, 43,245,158,205,226, 98,249,150,190,107,150, 44, 63,249, 62,121,
-210,222, 31, 32,235,225,218,181, 13,110, 78,157, 90,247,224,136, 17,141,187, 54,105,178,244,220,233,211,167, 94, 61,127,126,214,
-125,193,130,115,115,167, 77,219, 77, 49, 62,226,243, 81,162, 69,149,134,205,131,106, 65, 74,172, 8,168,212, 12, 60, 15, 2, 90,
- 33,174, 49, 31,243,107,181,143,122, 31,147,201,129, 11,151,110,220, 27,221,111,248,238,217, 35, 39,120,174,156,181,104,247,186,
-213,238,219, 87,109,218,189,126,197,166,221, 75,143,158,188,176,145,121,116,210,139, 68,105, 21, 7, 46, 72, 30, 20,105, 6, 39,
- 90,198, 80,100, 80,233, 33, 67,134,200, 47,189,122,202,220, 41,147,101,254,180,169,140,115, 72,201,150, 67,187, 32,218, 78, 80,
-146,101, 9,180, 8,178, 24,156,220, 26,104, 49, 62, 37, 7, 76, 55, 55, 55,107,160,165,179,248,166,130,156,184,247,238,221, 43,
-176,159,163, 36,139, 54, 65,154, 7,212,171,167, 16,106,229, 49,164, 84,102, 4,205, 54,171,128,171, 74,149, 42,102, 0,183, 0,
- 4,208, 54,175, 90,181,202, 92,176, 96, 65, 51,232,155,209,151,204,136,247,248, 26,245, 39, 56,176,121, 80,114, 69,117,161,165,
- 68,139,255,121,157, 54, 89, 84, 23,158, 59,190,228, 19, 65, 22, 15,254,158,197,127, 94,231,125, 59,100,201,235,168, 80, 23,254,
-181, 34, 11, 58, 24, 87,141, 32,132, 82, 71, 6,129, 87, 65, 22, 65, 45,250,153, 45,160,165,197, 19,101,172, 82,165,153, 12,237,
-165, 74, 28, 25, 94,100,250,244,233,194,208, 52, 32, 98, 9,180, 44,105,206, 36,120,176, 62, 8,222, 24,168,153, 49, 71, 9,170,
-217, 15,216,207,216,223, 24,247, 18,170,208, 69, 14, 10,150, 8,125,233, 58, 65, 36, 1, 32, 99,110,162,125,164,114,229,202, 74,
-108, 78, 6, 37,175, 80,161,130, 18, 59,147, 64,171,120,241,226,102,208,202,161, 85, 81, 7,247,115, 1,204,190,216,178,101,139,
- 2,132, 88, 70, 46, 60, 88, 7, 44, 58, 2, 33,253,209,163,250,100,123,141,195, 34,207, 15,170, 46,101, 92,167, 52,107,208,160,
- 65,228, 29, 85,126, 25,145, 22, 32,200,184, 34, 49, 3,168,185, 96,167, 60, 10,208,162,186,144,146,116,130, 43, 38, 72,127, 21,
- 41, 23, 36,177,238,232,159,122,128,150,189,234, 42, 32, 11,109,236,133,254, 67, 73,182, 23, 2,211,123, 33, 30,169, 23, 67, 71,
-133,131,135, 17,254, 40,213,227,236, 3,148,100, 81, 18,136,111, 85, 1,254,170,148,156,253,212,142, 68, 75,179, 44,229,202,153,
-162,230,116, 77,252, 67,201,194,174,158, 37, 10,101, 62,144,195, 53, 81, 83, 87, 87, 83, 12,205, 7,141, 12, 42, 7, 10, 6,157,
- 88,198, 60,252, 63,119,184, 2,230, 63,245, 87,203, 24,158, 64,235,193,139,143,178,216,243,137,244,156,121, 70,190,237,185, 77,
-106,253,226,161, 11,104, 93,186,243, 92, 46, 34, 93,184,237, 35,133, 27,140, 13, 6, 90,169, 10,212,151,211,215,159, 42, 99, 83,
- 86,183,204,178,111,231, 98,185,119,235, 28, 86, 83,190,212,227,223,183,215,150,180,201,234, 55,177,255, 71,175,171,251,100,208,
-220, 38,226,113,100,173,188,244,245,151,115,160,181,255,244, 61,105, 51,176,158,252,216,191,169,212,239, 82, 83, 38,204,234, 47,
- 45,187,214,255, 20, 63,101,238, 97, 90,125, 67, 5, 90,239, 79, 47,145, 79,239, 94,200, 39,223, 39,226,127,107,175,188, 59,185,
- 64,222, 93,221, 46, 62,215, 14,203,149,189,203,100,221,208, 58,178,110, 72, 29, 77,160,197,247, 97, 37, 56, 28, 43,183, 67, 80,
-197,120, 98,101, 50,193,186, 12,188,198,123,204,195,188, 90,101,180,115, 95, 53,134,143, 2,192, 82, 52, 91,182,108,203, 49,104,
-120, 66, 50,225, 9, 21,226,111,142,104, 82, 93,216, 60,102,204, 54, 88, 18,183,127,233,229,213, 98, 70,139, 22,237,114,186,186,
-158,203,146, 41,211,243, 18,197,139,191,232,221,189,251,189,155,103,207,158,188,113,241,226,201, 99, 7, 15,158,153, 60,112,224,
-217,223, 71,143,222, 10, 9,208,114,216, 5,217,181, 89,179, 7,170,108, 1, 45,235,107, 90, 60, 64,220,192,205,231, 46, 94,191,
- 49,115,246,242, 93, 80, 29, 62,220,181,117,247,190, 67, 71, 78,237,245,121,254,234,158,231,129, 83,171,143, 28, 63,187,130,121,
-180,232,240, 62,237,175,176,210,254,160, 6,228,102, 95,228,196,200,201, 21,131,185,244,239,209, 77,122,180,106, 41, 93,127,168,
- 45,171,166, 79,145, 31,127,168,243, 62,200,102,203, 46,121, 2, 45,170, 11, 85, 73,150, 37,184, 34,144,227,132,203,247, 13,112,
- 77, 33,131,243,103,145,195,139,231,134, 7,104, 65, 8, 28,125, 51, 37, 60,156,188, 96,188,254, 10, 5, 67, 84, 13,199, 7, 6,
-111,223, 37, 75,150,248,194,214, 78, 1, 89, 4, 84,136, 69,104, 46, 93,186,180, 25, 65,159,253, 33,149, 81,212,134,144,188,152,
- 33, 29, 53, 67, 90, 99, 70,192,233, 43,176,211,178,150,104,133,122, 17,213,133,148,100,245,252, 62,213,158,227,187, 27, 77, 90,
- 56, 33,111,106, 74,172, 40,185,234, 84, 61,239,211, 96,137, 22, 36, 91,144,104, 61,229,117, 7,134,241, 10,208,162, 84,133,224,
- 23,101, 22,214,149, 96, 0,253, 70, 81, 67, 89,130, 44,242, 54, 12, 64,139, 18, 51, 5,104,145, 38, 19, 37,101, 4, 47, 12,180,
-203,126,192,180,109,219, 54, 71, 64,171, 0,128,206,107,107,137, 22,131,134, 83, 58,132,197,137,128,215, 2,201,160,192,116, 64,
- 9, 94, 14,158, 19, 92,107, 25,200,187, 98, 33,246,138,160, 68, 85,147,146, 30,251, 15, 65,155, 10,226,184, 32, 0, 45,107,181,
-174, 86, 55,176,188,159, 3,210,182,231,156,180, 25,172,157, 18, 40, 6,107,191,116,233,146,156, 63,127, 94,137,137,135, 54,184,
-171, 65, 48, 50,190,141,141,180, 19,100,255,231, 65,181,248,239,191,255, 46, 88, 64, 82, 5, 25, 61,232,249,212,148,232,241, 40,
- 95,190,188,189,197,170, 2,180, 84,115, 3,148,197, 29, 18, 39,247,174, 93,187,186, 3,184, 41, 9, 96, 91, 5, 90,212,126,204,
-193,184,247, 20,191,125,236,149, 17,224,175, 14,190, 77, 15,140,179,171, 84,144, 5,213,172, 23, 2, 42,123, 65, 93,184,131,146,
- 44,204, 59, 30, 0,191,211, 48,142,122, 97,124,187, 4,213, 41, 23,108, 85,157, 97,100, 68,231, 69, 89,158, 18,168,179, 95,210,
-110,144,106, 67,130, 96, 53,118, 48,239,161,207, 63,115,230,189,110,110,241,146,230,112, 75,210,191, 78,141,178, 79,102, 76, 29,
- 39, 27,214, 97,225,178,123,131,204,152, 50, 92,234,214, 40,243, 50,103,182,100,163,178,103, 76,104,207, 84,194,153, 87,105,230,
-181,198, 34,154, 15,252,179, 50, 88,251,209, 10,105,171,101,171,114,142,220, 59, 16,104,221,241,126, 47, 11,119, 63,150,238,127,
-156,150,242,221,183, 74,141,254,250,128,214, 41, 0,160, 21,155,118, 73,199, 78, 93,228,187,106,181,165,251,164, 93,138, 68, 43,
- 73,182, 74,114,248,194, 3,229,131,203,226,154, 65, 38,141,106, 33,155, 86, 79,130, 26,224,166, 36, 72,148, 8,161,197,108, 31,
-105,242,228, 57,225,126, 96,165, 44,219, 49, 85,182, 28,218, 32, 55, 30,188,144,211, 87,159,200, 30,175,187,178,102,247, 21,153,
-177,230,164, 12,158,117, 64,186, 79,220, 33,173,122, 53,149, 95,199, 12,144, 4,105, 11,208,110,199,225,161, 2,173,151,139,107,
-203,203,165, 63,136,223,161, 73,242,241,197,109,145,192, 79,114,231,212, 78, 89, 63,188,158, 76,105,144, 66, 38,215, 75, 38,171,
-127,171,166, 11,104, 97, 66,115,193, 10,116, 39,213,133,176,117,241,196, 7,145, 95, 45, 4,207,121,141,247,152,135,121,181,202,
-168,231, 62, 62,204, 92, 42, 93, 12,210, 12, 28,108,247,104, 16, 45, 90,177,109, 19, 38,180,246,127,242,164,221,172,150, 45,219,
-186, 96, 2, 6,240, 11, 8,240,247, 55,251,191,127,111, 62,124,232, 80, 64,187,182,109,159,239,219,178,197,107,225,188,121, 94,
-181, 43, 84, 56, 92,212,205,141,170, 63,123, 54, 80,202,187, 62, 39,208,130, 81,237,128,245,238, 30,103, 78,157,191,122,110,253,
-230, 61, 30,239,223,251,251, 6, 4,152,253,206, 92,188,182,227,226,213,155, 91, 39, 78,249, 99, 3,243,232,225, 21, 13,223,105,
- 7, 67,169, 8, 87,136,156,184, 78,158, 60,169,168, 97,250,118,235, 42,221, 91, 54,151,206,181,171, 75,135,138,229,100, 84,139,
- 38, 50,181, 95,111, 74,181,184, 50,183,123, 16,104,145, 22,129,150, 45,117, 33, 39, 73,166, 33, 5,220,100,116,217,130,114,100,
-233,124,103,129, 86, 45, 76, 10,236,207,170,225,115, 6, 72, 46,159, 2, 88, 43,106, 25,128,204, 75,184, 23,211, 81, 25, 41,209,
-130,148,226, 30,129, 22,140,232,205, 80,233, 16, 96,153,161,206, 50, 67, 21,245, 26, 96,192, 12,137,137, 25, 82, 50,115,225,194,
-133,149,115, 87, 87,215, 67,160,169, 57,153,171,187, 14, 71,245,113,155,125,112,123,167, 51, 99,127,201, 61, 80, 45, 11,109,178,
-218, 66, 93, 72,201, 86,167,234,249,236,217,104, 89, 23, 61, 50, 38,194,199, 4, 26,180,161,218,191,127,191,210, 70,156,112, 32,
-129, 81,212,133,228, 53, 65, 22, 1,137, 78,160, 21, 11, 82,207,137, 80,183, 62, 70, 44,198, 79,224,217, 39, 6,197, 61,116,232,
- 80, 48,216, 34,176,163, 49,188, 10,180, 8,238, 80, 48,123, 18, 45, 91,236, 46,223,165, 75, 23,165, 15, 4,169,254,202,233,233,
-147, 54,242, 20,199,194,230, 26,190,105,129,164, 81, 32,129, 84,234, 75, 16,215,172, 89, 51, 2,183, 79,216,192, 48, 7,207, 57,
-235,138, 71,149,204,102, 87, 65, 22, 39,109, 74,218,200, 95,242,131,243, 4,191, 5,168,143, 63,160,207, 77,117, 80,126,218,208,
-205,155, 61,123,182, 50,158, 79,155, 54, 77,208,159, 20,251, 50,130, 2,218,144,225,217,182, 72,124,231, 44,128, 27, 69, 90,134,
- 54,112, 40,209,178,180,235,164,116, 11,245, 13, 6, 90, 52, 95, 0, 45,154, 47, 44,165,244,153, 7,108, 29,253,240, 63,154,173,
-114, 98, 92,220, 65,195,119,226,105,254, 18,100, 1,172, 17,100,109, 71,254, 12, 65,207,252, 2,201,173, 34,209, 38, 31,152,176,
- 0,249,136,123,159, 67, 93,232,176, 59,100,203,150, 40,119,222,156, 41,231,164, 77,155, 38,144, 96,151,109, 66,240,203,115, 46,
- 4,120,174,166, 12, 25,210, 75,145, 2,233, 55,231,202,154, 40,143, 35,162, 57,179, 36,204, 87, 36,127,134, 5, 61,126,110,253,
-113,187,199,102,217,226,190, 94,186,116,250, 81, 10,230,203, 36,189,187,124, 39, 51,167,246,151,189,187,214,138,199,150,149,210,
-227,231,150,129, 37,138,100,218,162, 69, 51,140,125, 58,248,177,175, 28,104, 89, 75,178, 66, 27,197,171, 21,180,195,168,100, 88,
-193, 44, 3,194,247,102, 74,154, 38,155,108,118,247,148, 9, 11, 15, 74,135,241,251,164, 92,183, 45, 82,173,239, 54, 93, 18,173,
-195,231,239, 75,135,142,157, 21, 81, 60, 63,228, 76,174,110,146, 44,219,183, 82,160, 82,107,217,125,252,170,242,129,184,102,206,
- 32, 99, 7, 55,150,163, 7, 54,200,218,181,107,204,166,104,209, 24,224,214,230,145,169,104,182,119,231,174,159,133, 45,214,125,
- 57,127,227,169,120, 93,122, 44, 59,142,221,150, 21, 59, 46, 73,181,182,185,229,219,198,153,165, 92,221,180, 82,170, 90, 10,169,
-211,169,179,140, 91,184, 91,226,165,202,245, 86,171, 67,132, 0, 90, 4, 91, 65, 41,224,166,167, 2,174, 44,211,170, 95,191,211,
- 5,180,248, 78, 12,252, 93, 32, 53,241,132, 77,137, 39, 6, 2, 4, 70,255,235,224, 57,175,241, 30,243,104,149, 79,239,125,168,
- 89, 50, 97, 64, 82, 0, 28, 36, 20, 91, 28, 61,215, 60,110,220, 31,158,223,189,219,214,123,235,214, 6,217, 93, 93, 47, 65,141,
- 23,240, 1, 40, 1,118, 41,230,183,190,190,102, 12,232,230,181,107,214, 4,180,110,222,252, 78,187, 70,141,150, 31, 94,191,190,
- 53,141,229,181,202, 98, 1,180,130,237,177,104,155,101,109,163,101,113, 77,203, 13,132,229, 43,227,186,164, 72,233,121,249,234,
-141,155,167,206, 93, 59,178,126,163,199,254,109, 59, 61, 15, 94,191,249, 96,247,177,147,103,247, 96, 66,216,139,204,241,180,202,
-200,251,220, 89,200, 1,159, 3, 42, 13,172,185,106, 60,114,228,136, 28,218,181, 83,186, 53,111, 38, 29,106,124, 39, 29, 1,178,
-186,151, 47, 45, 3,191,171, 32, 43,134, 13, 36,208, 58,235,136,182, 10,180,108,169, 11, 85,144,197,119,142,253,166,176, 76,170,
- 94, 94,142,173, 90, 34, 89,179,102,213,171, 58, 44, 84,180,104,209, 0, 74, 29,168, 62, 66, 57, 18, 6,149, 37, 15, 84,238,239,
- 9, 68, 8, 14,112,141,129,162, 29, 29,125, 49,185,158,131,154,208, 12,169,130,153,106, 39,208, 53, 3, 84,132, 72, 13, 26, 52,
-120, 85,163, 70,141,171,144,188, 30, 7, 49, 26, 95,235,218, 90,223,189, 94,154, 88, 99,186, 22, 59,115,242,192,184, 55,252,229,
-127,181, 48, 58,118, 29, 90,151, 59, 18, 36, 11,143,168,194,226, 36, 67,117, 33, 37, 89,156,192,235,215,175,175, 36, 21,100, 81,
-130, 2, 41,174,150,234, 48, 22, 0,214, 13, 76,206, 1,180,191,226,193,182,154, 60,121,178, 64, 42, 18, 12,182,172,129, 86,208,
-120,169, 27,104, 65,186,179, 9, 42,124, 69,242, 64, 53, 39,254,111,208,211, 39,237,228, 33, 64, 97, 91,183,160,212,140,234, 71,
-180, 11,219,185, 28, 18, 37,218,220, 84, 48, 22,105, 33,146,195, 69, 16,238,211,133,195, 34, 44,236, 94, 67,253,191, 23,253,224,
- 5,199,102,242,147,117,230,228,205,141, 21,144,252, 60, 4, 8,185, 4, 32,250, 20,115, 1, 13,215,227, 58, 40,219, 60,242,143,
- 7,129, 41,232, 6, 82,213, 10,224,206, 96,192,138, 52, 16, 96,150,160,106,198,248,241,227,149,124, 65, 82,184,214,118,104, 46,
-166,170,208, 17,208,130, 45, 42,165,214,183, 85,144,197, 50,163,191,146, 39, 4,157,161, 14,212,103, 7,119, 23,162,239,120,161,
-142, 94, 0,131,138, 36, 11, 25, 51, 4,101,254,153,234, 57,170,143,161, 82,231,198,162,199, 84,213,113,206,194, 55,175, 75, 66,
- 30,142,246, 13,241,104,118,183, 36,163, 91, 52,173, 45,253,251,245,149,180,105,211, 42,166, 1, 76,252,190,169, 42,102,194, 38,
- 22, 89,191,126,189,178,211, 56, 95,222,220,178,111,207, 70,129, 26,240,156,189, 50,228,112, 77, 60,110,208,111,189, 80,191,139,
-178,114,249, 66,105,210,176,186,228,206,158, 90,114,101, 75,165,164,238, 63,125, 27,156,198, 12,105, 35,219, 55, 47, 20,175, 99,
- 59, 36,187,107,226, 19, 17, 85, 47,123,116, 52,176,200,231,126,253,231,163,175,129, 34, 9,178,188,119,236,216,241, 81, 53, 12,
- 93,133, 78,156, 62, 77, 90, 25,216,127,186,180,238,191, 92, 74,117, 88, 43,223,245,217,170, 11,104,237, 58,118, 69,126,234,136,
-221,123, 24,204,160, 87,151,140,153, 50,201,182,253,103,101,235,190,211,178,121,239,169, 32,160,149, 94,134, 13,248, 65, 30,220,
-187,202, 78,254,206, 20, 59,182,170,251, 12,197,132, 36,153,115,250,158,188,124, 70,214,237, 57, 40, 19,151,204,144,249,155,182,
-200,226,109, 23,100,226,178, 99, 82,171,125, 37, 41, 91,251, 47,144,197, 84,185, 69, 77, 25, 58,123, 79,184,128, 22, 85,135,214,
- 64,107,229,128, 42,186,129, 22, 6,170,132, 0, 60, 30, 39, 78,156,240,252,249,231,159, 9,170, 74, 50,241,156,215,120,143,121,
- 34,170,181, 33, 34,111,139, 65,196, 19,237, 71,213,161, 67,117,100,147,104,209,126, 50,251,251,119,186, 63,127,126,157, 36,137,
- 19,191,133, 90, 66, 1, 89,148,102, 97, 50, 55, 31,216,191,223,188,103,247,110,115,145,194,133,159, 31, 91,180,168,222,235,155,
- 55, 27,113, 55,162, 86, 89, 85,160,101,107,183,161,173,107,150,182, 92, 90,180,131,238,103,168, 80,177,202,169, 71,222, 62,151,
-183,238,220,191,222,115,255,177,213,222, 79,159, 31, 46, 86,188, 36, 1, 65, 22,157, 52, 20,160, 69,251, 7, 72,241,148,129, 12,
- 18, 60, 57,184,115,135,236, 91,191, 86,218,127, 95, 57, 24,100, 13,175, 94, 81, 22,181,109, 38, 71,102, 42,118, 90,154, 64,139,
-187, 11, 85,149,161,165,186,240,215,108,105,100, 88,161,236, 50,182,124, 17, 69,250,194, 68,233,151, 78,160,149, 12,146,171,135,
- 4, 25, 92,221, 98,146, 80,213,120,156,100,169, 46,220,196,201,142, 82, 5,156,107,185,250, 80,118, 29, 66, 45,120,170,101,203,
-150,215,170, 86,173,234, 15,160,245, 14,198,207,102,203,132,110,233, 15, 73, 5,237, 37,237,249,209, 10,197,106,130,170, 34,153,
-210,244,237,211,177,145,220,184,178, 75,248, 91,204, 53, 93, 95, 21,108, 81, 77, 72,155, 44, 43, 3,120,135, 77, 70,160, 69,144,
- 5,183, 19,202,196, 77, 73,150, 10,178,212, 95,130, 44,218, 86,105, 1, 45, 74,178, 32, 13,250,191, 37, 49, 70, 32, 2, 53, 74,
-204, 56,249,131, 31, 10,224,182, 6, 90, 88,132, 56, 35,209,202, 92,169, 82,165, 64,170, 53, 41,125,160,244, 13, 6,241,220,240,
-145, 73,111,223,180,202, 71,160, 53, 0, 54, 90,129, 92, 20, 16, 20,109,220,184,145,253,134,160,178, 63,212, 92,143,105, 71, 6,
- 27, 35,129,122,119,173,163,119,160,223, 76,197,179,168,238, 39,197, 30, 17, 27,114, 20,112, 65,128,197,126, 69,251, 55,240,155,
-192, 95,239,119,212, 26, 54,155,202, 56, 62,122,244,104,101, 55, 33,250,141, 23,237,136,248, 93, 97, 1,160,180, 27, 12,237, 3,
- 41,225,226,193,126,202,124, 72,246,236, 29, 29, 2, 45, 72,247, 54,231,200,145,227,161, 37,200, 98,221,149, 69,187,171, 43, 85,
-136,161,231, 13,236, 38, 68,221, 61, 32,177,245, 4, 80,245, 66,189,105,143,165, 46, 68,167,130,135,129,180,123,195,243, 44, 27,
- 1,171,169,108,217,178, 28, 19, 9, 58, 15,134,177,221,194,244, 88,174,108, 73,189, 31,222, 58, 44,235, 87,195,172, 32, 75,102,
- 69, 50, 8, 96,169,204,159,148, 6, 46, 92,184, 80, 81,201,142, 28, 49, 76,182,108, 90, 38,103, 79,108,145, 29,155,231, 75, 78,
-183, 36,118, 23, 2,188,119,231,250, 97, 89, 52,111,188, 20, 47,236, 22, 12,176,172,129, 86,191,159,171,203,250,149, 19,229,226,
-105, 15,217,182,105,142,228,112, 75,124, 39, 76,149,208,249,208, 87, 46,209, 82,107,105,219,189,131,163,202, 65, 34,176, 20,171,
- 17,140, 89, 31,149, 1,136, 70,188, 20,207,143, 31, 55, 94,202,230, 47, 33,237, 58, 76,149,210,173, 22, 96, 7,225,102, 93, 64,
-203,221,243,164, 76,155,187, 76, 42,124, 91, 17,157, 56,139,116,248,185,143,172,219,126, 88,214,108, 59, 40,171,183, 30,248, 75,
-228,155, 41,189,252,218,179, 6,164, 94,239, 5, 34,222, 0, 83,151, 46,118, 13,242, 18,166, 45,112, 96,233,166, 35, 50,109,197,
-100,249,161,107, 65,169,209, 46,183,252, 54,125,149,244,157,186, 71,218, 15, 95, 35,223,183,106, 18, 12,180,234,247,156, 44,109,
-127,157,239,188,234,208, 66,162,245,118,223,216, 80, 64,107, 69,255,202,186,129, 22, 91, 2, 64,162, 53,236,176, 60,161,246,240,
-196,170,121, 1, 19,207,121,141,247,116,246, 73,205,108,160, 85,179, 73,147, 38,123,104, 12,143, 93,101,164, 93,201,209, 67, 42,
-208,122,180,100, 73,237,100, 73,147, 66,136,229,171, 72,178, 48,144,155,119,238,220,105, 94,190,108,153,121,209,194,133,230, 28,
-217,178, 61,123,123,252,120, 21,223,235,215,235, 59, 3,180, 44,119, 24, 70,160, 68, 75,169, 18, 38,204,245, 87,174,223, 62,116,
-212,235,194,194,211,231,175,207,187,116,245,198, 86, 94,211,100,146, 69, 6,170, 1, 57,129,254,241,199, 31,202, 4,222,171,115,
- 71,233,219,166,181,244,111,218, 80, 86,143, 28, 34, 91, 70, 14,150, 61, 35, 7,202,129,225,253,229,232,168,129,178, 99,220, 72,
- 93,170,195,179,155,214, 5, 3, 45,213, 38,139, 82,172, 97, 69,114, 40, 32,107,114,205,111, 21,144,197, 65,156, 64, 75,143, 49,
- 60,212,161, 59, 96, 8,172,216,189, 96, 49, 34,216,245,233, 15, 99, 99, 63,128, 37, 5,116,208,158,136, 0,129,191,168,162,150,
- 68,139, 92, 80,252,104, 17, 72, 65,194, 19,128,201,210, 12,213,153, 25,147,173, 25,125,211, 12,155, 47, 51,248,105,105, 43,153,
- 20,252,226,142,206, 73,182,120, 76, 91, 44,170, 9, 41,193, 34,184,218,190,105,158,242,109,111,223, 52, 87, 1, 91,188,206,251,
-179,199,228, 73, 51,184, 91,194,132,187, 55,212,253,189,111,187, 68,154,155, 84,248, 46, 76,116,143, 8, 4, 8, 34,251,247,239,
- 31, 10,100, 81,146,193,196, 67, 11,104, 81, 93, 72,190, 91, 30, 4, 66,148,104,210, 54, 15,128, 32, 4,208, 34,128,161, 90, 54,
- 8, 28,216, 83,117, 89,179,100, 50, 1, 11,233, 82,170,195,178,207,156, 57,147,237, 98,147,119, 90,125, 22,109, 52,142,253,147,
-192,141,180,168, 54, 36, 56,162,203, 4,238, 66, 99,191,160, 29,213,175,191,254,202,119, 56, 92, 92, 97, 33,118,143, 32,139,234,
-114, 74,107,168, 46,103,191,161,212,141,246,111, 4,181,160,225,166, 85, 38,245, 62,108, 4,207,147,198,178,101,203,248,238,249,
- 72,180,121,107, 72,105, 11, 15,238, 54,164, 17, 63,119,241,242,160, 90, 17,247, 9,178,152,207,222, 49, 29, 96,200, 29, 18, 96,
-197, 32,158,139,179, 81,163, 70, 29, 7, 80,242,129,164,233, 3,250,160,191, 10,178,248, 75, 21, 42, 15, 72,103, 63,128, 96,127,
- 71,101,135, 16, 97, 7,198, 57, 47,148,215, 11,125,129, 64,171, 23,121,171, 30,228, 49, 0, 23, 65,241,124, 2,111,218,155,225,
-125,122, 54, 2,232,101,153,102,190, 28, 89, 18, 3,104, 29,148,179,199, 86,201,173,203,158,178,106,217,108,233,211,187,151, 96,
- 76,151,129, 3, 7, 66,106,221, 83,150, 47,158, 41,183,175,236,151,131,123,150, 73,175, 46,181,101,212,208, 46,194,231,236, 17,
-231,189, 71,183, 15,200,201,195,203, 20,154,147,199,253, 34, 5,243,102, 12, 6, 92,189, 59, 87,149,229,243,135,200,141, 11,123,
-196, 99,227, 76,233,222,169,230, 95, 52, 13,160,165,217, 94,200,160,207,143,150, 37, 37,170, 10, 41, 82,231, 74,156, 98,111,174,
-114,232, 71,134, 91,221, 83, 39,135, 1,111,175,241, 82,189,253,100,201, 84,161,231, 71,151,124,245, 40, 65,176,121,168,187, 14,
- 67,140,104,118,254,100,202,148, 78, 70, 15,109, 13,219,149,151,146, 56, 73,146,243, 86,238, 29, 66,208,167, 49,124,179,206,195,
-205,158, 39,206, 75,245,182,185,164, 74,243, 28,210,115,210, 14,105, 63,106,155, 52, 25,184, 81,170,247, 88, 42,165,170,167,134,
-100, 43, 51, 36, 94,219,164,116,237, 46, 1,206, 24,195,251,238, 28, 20,172, 54,164,250,240,205,150,158, 33,128,214,172,214,217,
-100,121,191,138, 78, 1, 45,128,199, 56,133, 10, 21,218, 76, 0,212,177, 99,199, 67, 76, 60,231, 53,222,211,211,146, 86,121, 66,
-120,131,199,224, 89, 16, 43,178,113, 16,125, 43, 59, 14,209, 86, 52,190,255, 3,171,104,135,170, 30, 85,117,232,123,248,112,189,
-172,153, 50, 93, 93,185, 98, 69, 0,128,181,249,192,129, 3,102,216, 64,152,231, 97,139, 63,236, 51, 2,242,230,204,121,202,239,
-234,213,239, 78,172, 88,209,208, 73,213,161,230,174, 67,103,141,225, 85, 62,228,112, 75,119,161, 65,221,202,239,107,124, 95,198,
-183,108,169,188, 47, 43,124, 83,232,109,246, 44,105,245, 78,132, 10, 25, 26,182,195,142,230, 61,193,214,207,237,219, 74,167, 6,
-245,164, 77,229, 10,138, 36,107,207,196, 49,178,111,204, 16,217, 55,180,191,220, 94,219, 79, 46,205, 25, 35,163,219,180, 52,235,
- 49,134, 63,181,118,165, 2,180,186, 37,140,162,216, 99,169, 62,153,198, 86, 40, 42, 83,106, 87,146, 89,205,235, 42, 32,139,223,
- 89, 16,208,226,228,230,232,136, 3, 67,106,197, 93, 8, 85,104, 4, 91,164, 73, 91, 29, 78,150,156, 52,105, 40,219,163, 71, 15,
- 1, 32,163, 1,175,106,120,236,144, 40,118, 92, 30, 1,120,122,128,201,231, 5,128,132, 25,188, 80,252,103, 97,226, 81,118, 29,
-210,222,137, 96,139, 9,170,110,111, 72,253, 2, 48, 57, 81,221, 18,234,160,225, 59,109,178,168, 46,164, 36,203,242,224,127, 94,
-231,125,230,235, 90, 51,113,155, 35,187,134,248,116,194,175,158,190, 79,160,197,250,209, 25,235,128, 1, 3, 66, 0, 45, 75,144,
-165, 3,104, 69,166, 77,150,101,217, 40,121,161, 52,147,128,138, 42, 25,212, 79, 89, 88,210,205, 7, 37, 8, 4, 8,144, 58, 19,
- 28,144,175, 5,116,148, 55, 54, 36, 77,175,233,118, 34,200,133,193,125,248, 33, 83,192, 16, 54, 43,208,107,191, 45, 31,124,142,
-200,198,133,100, 37,128, 0,128, 18, 34,152, 6,208,240,121, 38, 36,144,159,248,159, 32,137,253, 23,101,164, 45, 17,253,124, 57,
-108,123, 26,132,179,191,208,208,157,207,210, 6,139,106, 40,250, 96, 3,159,105,180,174, 21, 93, 33, 68, 89, 81, 14,101, 23, 28,
-141,252,113, 67,117, 98, 28, 29, 18,211,251, 4,129, 4,117, 60,168,158,164,196, 11,215,105, 91,229, 8,100,145,126,102,164, 49,
-176,109, 83,220, 56,160,111, 30,231,238, 90,182, 9, 15,190,143, 7, 65, 22,242,173, 70,154,129,254,249, 2,191,189,181,218,135,
-126,178,104,244,142,118,222,134,111,121, 26, 65, 22,203,216,173, 91, 55,101, 23, 39, 54, 41, 8,118,217, 10,190, 3,229, 58, 36,
-156, 4, 93, 53,180,232, 70,228,125,130,162, 7, 55,247,201,225,109,191,202,169,125, 19,228,198,197,109, 0, 64,187,100,218,228,
-209, 74,186,114,110, 39, 0,211, 90, 25,212,175,169, 52,170, 83, 88,154, 53, 40, 33, 35, 6,119,212, 4, 90, 42,205,147,123,199,
-201,165, 83, 27,228, 58,104, 14,232,221, 70,250,116,107, 46,215,206,109,151,163,251, 86,200,111,189, 27,135,164,249,153,129, 86,
- 68,242,237,111,164, 21, 54,160,165,238,106,161,141, 1, 7, 32,126,132, 68,210,137, 18, 39,251,228,146,183,214,135, 20,249,234,
-223, 74,158,183,222,162,100, 57,235, 89,250,124, 10, 81, 79,171, 16, 60,254,208,219, 67,162,149, 73, 50,100, 72, 43, 25,131, 83,
- 58,172, 32,211, 73,214, 44,233,100,209,220,145,114,254,220,217,192, 88,177, 99, 79,113, 4,180,232,222, 33, 94,170, 60, 79,255,
- 92,177, 79,254, 88,185, 86, 42, 54,204, 33, 63, 14, 89, 45, 13,127,217, 32,213,122,172,146,111, 58, 44,149,234, 45, 43,200,176,
-137, 61,165,215,152,197, 18, 47,117,110, 31,157,238, 29,174, 76, 25,240,163,188,125,120, 73, 2,174,239,148,215, 27, 58, 40,128,
-235,213,202,102, 10,208,154,213, 42,171,172,197,110,195, 57,189,191,147,218,133,146, 19,104, 93,113,166, 97, 49,105, 53,196,234,
- 86,113,229,192,196,115, 94,115,134, 70, 80, 94,213, 27, 60,253, 84, 29,135,100, 99, 61,141,223, 97, 7,161,216,101,209,230, 11,
-171,242,233,160,173, 57,160,211, 24,126,251,164, 73,173,205, 47, 94,180,155,211,173, 91, 27, 74,181,254,152, 49, 35,128,234, 66,
- 74,178,126,238,218, 53, 32, 81,194,132,111,151,143, 25,211,236,227,195,135, 53,166, 53,108,216,172, 81,212,168,165,180,202,252,
- 57,141,225,249,110,168,208,202,181,111,219, 20,219,208, 95,200,211, 39,119,101,211,186,233,178, 96,206, 32, 41, 94, 36,151,240,
-158, 86,249, 44,238, 71,162,203,134,165,152, 76,167, 66, 12, 79,144,213,137, 54, 89,223,148, 82, 64,214,129, 17,253,228,238,134,
-190,114,111,211, 8,217, 53,108,128,196,211,233,222,129, 64, 72,149,100, 13,204,153, 94, 70, 20,207, 37,191, 87, 44, 30, 44,197,
- 34,200, 90,209,183, 43, 54, 88,252, 34, 23,118,121, 80,162,165, 5,180, 76,176,113, 57, 70,176, 65,160,213,169, 83, 39,197, 39,
- 17, 37, 5,104,255,119,176,183,185,134, 58,209,168,151,146, 44,173, 73, 44,184,250, 4, 80,232, 51,102, 53,209, 8, 30,147,155,
- 2,180, 32, 61, 50, 99, 69,111,198,124,166, 36,140, 5,102, 72,125,204,246,128, 22, 37, 85,182, 37, 90,243,130, 37, 90, 99, 6,
-228, 24,217,171, 97,178,190,181, 43, 20,255, 72, 63, 91,252,237, 82, 51, 81,251, 81, 29, 18, 36,114,212,102, 4, 90, 84,115,169,
-134,239, 28,159,200, 67,218, 43,169,146, 44, 21, 60,233,145,104,169,182, 89,170,253,212,156, 57,115,148, 73,155,187, 3,193, 19,
-115,211,166, 77, 21, 9, 17, 39, 92,148,139, 0,235, 91, 39,250, 84, 91,142,149,148,144,225, 27,167,132, 37, 31, 38,239, 15,180,
-175, 97,187,225, 63,141,194,157, 57, 82,208, 30,139, 59, 1, 97,152,205,231,115, 6, 61,156, 31,125,226, 8,140,206,159,227,151,
- 62,181,242,233, 36,154, 10, 82,171,131, 0,215, 15,104,131, 71,160, 78,159,100, 4,133, 84,173,233,164, 17,156, 13,192,245,130,
- 42,101, 3,112,161, 95, 43,122,208,223,132,197,164, 98,188,143,254,169, 0, 24,140, 9, 4,153, 92,120,233, 13,155,196,119,176,
- 78, 99, 40,201, 34,200,162,107, 3, 72,180, 20, 21, 41,193, 22, 36,125, 84, 19,234,178, 27,180, 85, 47, 44,116, 21,167,111, 48,
-128, 39,152,154,200, 93,173,234,193, 5, 16, 36,101,188,222,220, 89,158,132, 55, 63,128,214,253, 91,151,119,200,197,227,243,229,
-232,246,193, 10,224, 58,123,104, 58,192,214,118,184, 68,217, 36, 99,135,182,151,198,117,139, 72,211,122,197, 32,121,170, 43, 67,
-127,251, 73,154, 53,172, 64,160,181,203,222,187,255,162,185, 83, 46, 28,155, 43, 71,182, 15, 82,104,158, 57, 56, 85,174,159,223,
- 42,103,142,109,144, 81,131,219, 42, 0,139, 52,123,116,254, 63,205,156, 89, 18,127, 81,251,180,240,242,238,171,121,158, 70,240,
- 16,123,127,160,237, 10, 59, 30,108,137,148,196,157, 39,188,167, 81,145,255,239,206,176, 8,169,131,129,224,241,235, 87, 47,229,
-246,205,203,178,110,213, 44, 72,175, 58, 73,187,230,229,164,101,195,162,210,186,113,113,105,219,172,164, 28,216,235, 78,195,190,
-247,216,175,222, 64,143,195,210, 52, 57, 74,250,141,159,191, 83,102,175,221, 39,157,134, 79,151, 31,250,174,147,239,187,175,146,
-198,191,109,132, 1,252,118,233, 54,114,177,184,100, 41,246, 86,175,195,210,114,248, 96, 17,106,167,125,238, 52,209, 31, 47, 26,
-211, 69,222,220, 56, 36,239,142,205,148,215,235,218,202,230,223, 91,200,150,169,221,164, 99,181,220,146,195, 37,210, 99,230, 99,
-126, 43, 94, 56,220,153,130,157, 94,233,172,188,192, 7,242,154,110,126,254,149, 49,132,199,121, 75, 71,168,148, 98, 97, 64,222,
-141, 1,173, 15,192, 70,176,241,177, 13,250,193,229, 84,221, 59,188,186,127,191,237, 59,216, 95,205,233,215,175, 85,214,204,153,
-175, 65,125,236,151, 48, 65, 2, 63,183, 76,153,174,204, 25, 51,166,197,199, 59,119,190, 63,189, 98, 69,189, 70, 49, 98,180,111,
-105,123, 71, 91,136,186, 71, 16,208,114,200, 79, 55,215,116, 50,117,194,175, 50,126,116, 47,233,217,249, 7, 37,185,102, 74, 99,
-111,187,184,202, 6, 91, 52,211,103, 76,151,238,209,220,137, 19,100,241,239,163,101,120,227,250, 50,176,114, 57,217, 63,252, 55,
- 57, 58,226, 87,185, 56,115,148,236, 25, 50, 64, 10,186,102,166, 88,222,214,150,231, 80, 14, 75, 9,180, 84, 73,214,200, 18,185,
-101, 92,165, 18, 50,181,110,149, 96, 41, 22, 39,250,141, 35,127, 19,143, 41, 99,229,202, 1, 79,218,218, 88, 3, 45, 91,229, 76,
- 11,199,166,207,169,202,167,202, 40,200, 91,189,163, 48, 83,214, 77, 31,138,102,144, 68,235, 33,192,197, 27, 2, 44, 26,196,195,
-152, 94, 1, 90, 80, 79, 41,255, 41,217, 98,130,218, 66,249,181, 2, 90,161,104,210, 22,139, 54, 89, 33,108,180,178,254,101,163,
-181,107, 99,157,113,148,100, 89, 58, 53,229,127, 94,183, 40,108, 40,154, 0,146,143,200, 51,218,121,170, 32,139, 18, 18,168,201,
- 67,201,200,237, 0,173, 96,154, 40,255, 36, 72, 72,240,120,128, 34,209,161,218,152,246, 46, 84,105, 97,247, 47,213, 82, 19, 81,
-150,202, 72,147,144, 28, 1, 44,155,253, 19,207,159,165,244,138,210, 48, 60,191, 60,168, 94,203,169, 58,164,125, 13,120,238,200,
-198,207, 22,205, 20,116, 7, 65,219, 44,130,107,142, 1, 78, 78, 38,118,191, 35, 0, 24, 69,141, 72, 59, 45,170,250, 48, 78,191,
-210, 73,219,146,102, 43, 2, 42,214,153,161,139, 8,132, 40,117,228,127, 94, 7, 61,189, 27, 93,236,150, 19,118, 94, 74, 8, 17,
-210, 6,189,145,252,229,129,235,118,253,186, 5,213,195,225, 24, 2, 0,248,150,128, 10,243, 26,129, 42,143,101, 0, 95, 10,192,
-166, 90, 30,255,107, 57, 26, 63,117,242, 74, 79,182, 16,229,132, 49,124,243,242,165,178,189, 91,190, 96, 24,192,213, 38, 5,100,
- 29,241,248, 77, 1, 71, 4, 67,141,235, 22,149,110, 29,106, 41,170,189,246,173,106, 72,225,252,105,253,105, 64,159, 47, 67, 8,
- 91, 95,251, 52,207,111,148,179, 7,167,201, 97,187, 52,171,147,230,187,156, 89, 18, 13,119,117, 77,108, 57,198,124,241,221,151,
-122,152,247, 55,230,113,206, 51,188, 85, 65,147, 81,125,136,143,230, 35,237, 61,152,224, 61,250, 3, 62, 66, 78, 52,201, 52, 42,
-101, 19,104, 37, 74,156,120, 27, 68,214, 1, 24,204,253,182,109,219,250,225,225,131,251,208,125,155,229,217,211, 71, 0, 88,155,
-101,214,180,193,144, 76, 60,160,142,253,189,201,197, 37,163, 22,208, 98, 25,212, 16, 60,223, 53,233, 19,208,115,244,114, 25, 57,
-103,143, 12,254, 99,135,180, 30, 48, 87, 74,213,234, 28, 16, 63,117, 30,167, 67,240,144,110, 30, 23, 83, 28, 0,169,129, 69, 51,
-197,243, 93, 55,169,187,248,156, 92, 45, 35, 58,124, 39,249,211,196,240,229,117,222,183,195, 3,173, 78, 24,194, 91,124,144, 55,
-116,173, 65,211,154,102, 40,160, 5,145,250,161, 18, 37, 74,208, 19,252,207, 54,130, 61,219, 42,106, 8,154,116, 88,218, 57, 67,
-134,159,188,175, 92,105,245,241,197,139, 38,254, 23, 47,214,240, 63,121,178,138,255,133, 11,149, 1,176,170,126,244,246,174,113,
-122,245,234,122, 45, 19, 37,250, 9, 65, 4,237, 25,243,218, 3, 90,225,217,117,104,151,159,193, 18,173, 55,240, 37,228,125, 71,
- 54,174,157, 38,243,103, 15,212, 35,209,178, 71, 51,125, 28, 56, 46,109, 93,167,198,251,201, 61,126,150,229,191,246,149,211,115,
-103,200,206, 81,131,229,247,214,205,205, 65,146, 44, 91, 32,139,252, 13, 5,180, 8, 10, 40,129, 97, 58,190,114,137,156, 88,179,
- 92, 78,172, 91,169, 0, 45, 38,218,103,157,135, 36,235,194,222, 93,114,113,255,110,129,218,247,161, 85, 67,217, 43,231, 55,152,
-108, 21, 67,102,180, 59, 87,219,246,118,130,105,182,187,101, 6, 0,254, 91,176,125, 50, 3, 12,152, 1, 56,148,144, 59,144,202,
-132, 80, 29, 2,236, 60,133, 68,198, 90,117,104,179,156,246,118, 29,210, 54,139,234,194, 96,137, 86,249,226, 31,169, 70,180,178,
-213,178, 9,180,200, 75, 75,144,165,170,164,172,145,150, 22,208, 66,189,149, 93,135,112,162, 25, 64,181, 25,221, 69, 80,181, 71,
-144,133, 49,238, 38,239,235, 28,184,109,214, 29, 19,181, 47, 53, 1,244,155, 5, 58, 37,131,104,149,164,163, 81,238,140, 3, 56,
-160, 99, 89,123,238, 55,108, 2, 45, 74,178, 40, 33,163, 4, 19,207,106,141, 25,214,197,183,251, 29, 65,178,181, 7,128, 58,144,
-110, 65, 32,189,249, 0,233,148, 35, 7,170,150,116,173,105,206, 98,172, 77,186,199, 32,192, 34, 79,185,131, 15, 15,232, 5, 89,
-161,190, 35,203,151, 65, 82,182,215, 82,162, 69,201, 22,255,243,186,238,249,200, 70, 70,180,213, 83,170,120, 1,100, 63, 64, 37,
-123,142, 27, 33, 14, 30, 60,200,255,252,182,190, 11,227, 56,175,179,251,132,200, 22,170,141,242,100,118, 73,158,221, 53,209,180,
- 26, 85, 10,126,220,184,114,172, 92, 61,179, 74, 78,238, 29, 47, 93,218, 87,151,177, 35,186, 73,175,174, 77,164, 76,241,204, 31,
-177, 43,112,150,155, 91, 18,203,184,179, 42, 97,167,104,142, 25, 14,159,129, 93, 26, 73,169,162,153, 62,230,204,146,100, 70,206,
- 12,201,108,245, 51,173, 57, 46, 44,117,255, 55, 60,227,188,234, 48,168,214, 33,220, 59, 4, 73,178,180, 64, 86,200,143,197, 58,
- 72,116,189,122,177, 76,177, 98, 21, 55, 69,141,218, 3,192,107, 43, 62,106, 31,172, 28, 2,176, 35,229,253,197,139,231,177, 67,
-231,158,224,218,171,224,224,210,255,103,191,221,198, 85,131, 74,211, 64, 30, 46, 28,222, 48, 69, 84, 80,233,204, 46,166,228, 89,
-147,153,166,103, 79, 30,233, 29,127,249, 63, 60, 31,117,208,179,122, 3, 77,219,253, 88, 56,120, 49,198, 33,129, 26, 6,154, 5,
-216,254, 75, 95, 30,206,248,208, 9,197, 79, 53, 4,207,170,126,253, 90,222,242,244,108,138,221,133,141, 95,221,184,209,224, 20,
-108,178,168, 46,108, 28, 51,102,187,122, 38,147,171,131,250,219, 4, 90,225,220,117,232,240,163,118,205,156,198,163, 74,197, 98,
-210,185,125, 93, 37,241,156,215,194,209, 70,193, 65,165,227, 98,103, 33, 19,141,229,157, 13, 42,141,201,235, 4, 93, 60, 56,147,
- 0,144,173, 35, 33, 56,170,123, 99,216,250,220,131,218,132,146, 23,103, 14, 71, 52,179, 66,210,114, 67,181,199, 82,127, 41,241,
-178,120,129, 45, 99,120,187, 52,169, 70,180,246,163,165,210,234, 82, 59,113, 43, 74,178,248,107,163, 2,161,104,194,142,209, 19,
-233, 17, 19,248,234, 48,129,151,182,182,163, 91,211, 36,216,154,132,228,141,186,210,143, 22,127,201, 79,189, 32,203, 46, 48, 64,
-187,140,134,153, 4, 29,219,206,181,170,219, 56, 72, 36,223, 99, 87,224,239,122,191,163,160,124, 9,176,225,225, 19,165,152, 12,
-229,131,107,137,157,105,116,228,117,212,238, 41, 49,182,111,197,194,250, 46,120, 65, 63, 89,122,129,187, 53, 77,170, 3, 27, 97,
- 1,116, 10, 82, 34, 63,252, 30,194,255, 90, 17, 88,206,106, 0,174,129,170,141, 22,127,249, 31,244,171,133,227,123,231,163,191,
- 16, 16, 18, 28, 50, 17, 40, 6,129, 44, 71,234,194,207, 1, 54,236,210,204,153, 57,153, 43, 12,210, 87, 54,249,161,116,224,246,
- 13, 19,101,208,128,159,164, 82,185,220,146, 61, 75,226,181, 89,179, 38,117,100, 79,167,155,230,192, 1,237,165, 98,217, 92,129,
-112, 15,177,130,239,115,178,127, 58,217,204,255,186,236, 97, 6, 89,225,225,196,255, 27,215, 26,104,217,250,159, 42, 85, 58,168,
- 10,235,195, 46,107, 42,192,215,197, 36,201,146, 77,117, 6,104,133,163,160,186, 63, 22, 39, 66, 18,232,165, 25,194,144, 61,140,
- 3,133, 51, 52,172, 95, 97,179,156,246,130, 74,211, 38,139,247,156, 41, 39, 6,218,182, 84, 31,234, 77,204,175,103,194,181, 85,
- 6,216, 55,113,242,209, 82, 25,170,143,234,109, 35,103,186,150, 65,211, 6,183,184, 11,145,134,239,180,221,178,190, 61,184, 75,
-226,248,220,117,200,223,176,182,187, 51, 13,164, 1, 54,116,219,180, 89,189,211, 81,187,219,163,169,101,159,100,147, 38,188,149,
-255,201, 16, 75, 0,111,179,156,172, 55,179,255, 91,250,103, 53, 74,176,168, 46, 12,146,100,105,129, 44,189,117, 31,128,133,203,
- 3,236, 4,247,129, 52,148,182,142, 13,156, 25,235,194,208, 30,182, 30,209,108, 35,184,103, 40,156, 35, 75,146, 77, 65,169,168,
-142,247,234,167,233,154,104,125,182,204, 73,237,186, 84,178,120,151, 38, 77, 29,229,250, 55,101, 9,151,234, 48, 60,140,248, 28,
- 13, 97,208, 12, 79,139,132,126,214,224,167,193,207,136,226,128,209,151, 34,138,147,127,209,113,196, 79,205,205, 45,118,138, 98,
-180,209,151,107,163,176,190,233,191,220, 70, 97,229,217,127,250,185,255,114,135, 49,234, 30,177, 93,223,224,167,193,207,136,226,
-128,209,151, 34,138,147,218,128, 48,172,111, 50,218, 40,172,156,179,253,220,215,194,207,136,173,245,151,167,102, 41,213, 10,241,
-118, 54,128,173,228, 76, 17,237,209,112,116, 93,139,190, 65,211,118,187,132,181,189, 12,126, 26,252,212,219, 7,140,111,211, 62,
- 7,244,242,208, 50,159,193, 79,131,159,182, 56,240, 95,238, 75, 90,223,196,215,120,223,218, 62,235,139,217,107,125, 45, 40,218,
- 40,103,196,118,107,131,159, 6, 63, 35,138, 3, 70, 95,138, 40, 78, 26,210, 39,163, 47,253,243,251, 82,196,150,240,203, 82, 51,
-128,150, 6,191,141, 15, 48, 98, 59,100, 8,126, 78,169, 99, 74,195,164,247, 21,118,242, 27,109,164,151,129,250,242, 25,252,212,
-199, 39,189,185, 12,126,234,229,148,190,124, 6, 63,245,241, 73,111,174,175,133,159,122,235,243, 79,205,103, 87,117,248, 57, 11,
-172,167,113,233,243,227, 7, 36,198,164,170,133,164,181, 93, 89,139,102, 50,208,232,140,208, 14,251,153,120,142,196,107,142,142,
- 96,154,240, 33, 68,255, 96,202,206,181,160,115,238, 12, 82, 19,119, 15,209,117,130,101,226, 53, 91,187,135,130,105, 98, 23,139,
- 55,118,220,209, 27,178, 86,122, 9,255, 87, 12,254, 60, 9,187, 94,170,219, 40,176,195,186,195,239, 88,203,138, 21, 43, 62,100,
-226,185,206,134,213,226,167, 61, 50,197,210,165, 78,121, 57, 69,114,132, 72, 10,189,117, 59,152,230,244,234,166, 81, 51,106,152,
- 62, 50,241, 92,171, 76, 14,242, 59, 91,206,194,216,157,181, 16,238, 46, 24,162,100, 43, 18, 3, 45, 91, 31,161,104,194,127, 78,
-115,180,215, 14,248,178,186,197, 95,254,215, 42,179,213,125,103,203,169,135,188, 65, 83, 15,151,244,231, 49,248,169,159, 87,122,
-114, 26,252,212,195, 37,253,121,254,203,252,212,207,165,127,107,206,236, 73, 77, 41,225,164,179, 7,194,205,120,240,151,255, 53,
-234, 26,162,195,124,159,221,244,161, 82, 22,147, 48, 85,203,106,250, 8, 31, 51, 51,224,167,196, 29, 65,171,221,225,180,209, 29,
-129,139,221, 27, 53,106,180, 9,215,135,130,110, 57, 36, 91,110, 4,108,117, 66,250,123,105,138,180, 13, 14, 28, 63,210,199, 12,
-131, 96, 51,254, 27,163,218, 99, 43, 52,227,126,109, 11,202, 99,203, 55,140, 37,205, 96,159,135,200, 47,245,234,213, 59,142,116,
- 66, 77, 8, 83,113, 2,161, 62,188,240, 59, 5,191, 13,112, 93,241,230,142, 56, 19,197, 38,101,138,110, 25,116, 55,152, 38, 1,
-214,177, 37, 11,228,228,154, 21,114,104,222,204, 16, 62, 21,183,255,214, 75,118,252,210, 77,118,255,242,243,115,220,216,141, 52,
- 1,113,204,154, 35,106,188, 26, 90,195,146,197, 14, 63, 64, 2, 44,214,155,129, 79,225,191,230,161,206,126, 24,150,143, 58,102,
-241,194,249,223, 61,187,123, 89,110,157,130, 39,243,116, 46,111,241, 46,130,101,245, 80,104, 78,255,206,148,130, 0, 75, 46, 44,
- 21,166,233, 53, 76,159, 38, 86, 14,238, 51,229,145,133,126,174,152,120,174,228, 7,208, 10, 84,243, 43,224, 12,215,130,136, 58,
- 83,206,142,112, 54,136, 40, 65, 74, 68, 13,185,127,255,190,192, 55,208, 45,208,177,222,169, 21,130, 38, 66, 21,173,104,209,230,
-231, 19,155,118, 28,189,116,244,244,181, 91,107,183, 28, 58, 86,175, 73,171, 67,188,174,147,151,204,230, 76, 57,245,146, 53,104,
-234,229,148,190,124, 6, 63,245,241, 73,111, 46,131,159,122, 57,165, 47,223,127,153,159,250, 56,244,207,204, 21,118,247, 14, 5,
- 83,153, 98,103, 77,106,106,146,211, 37,210,246,246,213,114,127,218,247, 71, 39,121,190,127,178,236,155,222, 78,186,215,201,243,
-137,215,121,159,249,108,212, 61, 68,135, 33,192, 82, 39,209, 14, 69, 76,114,226,196, 9, 70,155,117,183, 78, 8, 96,237,142,176,
- 63,238,136,154,190, 22, 52,173,253,163, 88,119,194,206,116,252,135,216,126,138,231,109,123, 7,131,176, 34,164, 15, 98, 43,102,
-240, 7, 77, 74,185, 44, 15,187, 64,235,220,185,115, 98, 35,109, 61,127,254,124, 23, 0,186, 44, 36,146, 13,209,237, 39,125, 95,
-242,141,121, 84, 43, 58,205, 83,143, 16, 64,235,228,234,229,210, 53,174, 73, 73,150,199, 31, 37,114,200,146,170,197,158,173,111,
- 80,105, 39,174,143, 67,106, 10, 96,144,155, 68,114,152, 76,249, 91, 39,142,124,198, 22, 77, 91,253,140, 64,139,180,233,192,175,
-110,221,186, 47,225,208,240, 17,156,192,106, 25,228,133,229,163, 46,183,125,213,236,143, 87,247, 46,151,189, 51,186,200,204, 94,
- 63, 72,172, 24,209, 46, 91,151,211, 26,104,205,168, 25, 89, 82,198, 53, 77, 14,202,231,201, 32,200, 76,248,239,201,107,174,137,
- 77,173,167,215,136, 20,220, 71,194, 0,180,162,195,167,206,236,133, 11, 23, 42, 44,102,176, 92,122,165, 38,240, 70,152, 21,129,
-115, 72,245,221,161,218,136,146, 43,130,172, 87,175,222,188,191,119,243,222,203, 95,122,252,190,125,198,130,205, 59,247, 28,185,
-120,172,102,189,198,251,156,144,108,133,133,159, 90,195,134, 65, 83,139, 67,206,221, 55,248,233, 28,191,180,114, 27,252,212,226,
-144,115,247,255,203,252,116,142, 83,255,134,220,144, 92, 45,104, 87, 37,235,251,189,211,218,200, 75,128, 43,191,227,179, 67,165,
- 39,187,199,203,166, 81,141,164, 89,185, 12,239,153,223, 1,128, 49, 89, 3,173,139, 23, 47, 42, 64,107,120, 77,151,119,253,202,
-152,132,137,231, 8,148,235, 14, 96,228, 14,207,188,140,236,190,222, 17, 77,220,123, 68, 41,142,158,131,129, 71, 25,204,149,207,
-216,163,105,169, 58, 68,236,175,143, 8,109,114, 28, 94,135,143,213,170, 85,139,233,104,205,154, 53, 39,224,127, 61,252,166, 37,
- 13,232,163, 92,122, 23,202,238,109, 94, 49,233, 83, 64,221, 12,150,142, 50, 67, 0,173,131,115,254,180, 9,180, 22, 85, 46,242,
-100, 93,189,111,183,111,107, 85,115, 44,234,208,152, 33,187,130,232,166,109,157, 61,211,211,128, 89,191, 17, 24,134, 2, 6,214,
-253, 11,129,106,179,245,238,221,251, 5,121, 1,190,202,211,167, 79,149,208, 46,240, 34, 29, 66,178, 5,226,121, 7,165,142, 50,
- 93, 15, 77, 27,125, 56, 81,153, 18,133, 95, 77, 29, 61, 72, 94,220,191, 42, 71, 22,254, 42,107,135,181,144, 49,173, 43, 75,140,
-104, 81,238,218,162, 73, 85, 32,165, 84, 4, 89, 71, 22,246, 19,132, 93, 34,143,218, 32, 29,244,245,245, 69, 32,104, 95, 53, 80,
-111,106,196, 19,123,177,115,122,103, 97, 94, 62, 99,165,106,212, 26,124, 92,224,205,250, 8, 14, 97, 56, 22,122,118,102,104, 14,
-120,249,246, 71,172,190,192,203,151, 47, 75,159, 62,125, 8,132, 45,131, 96, 7,211,164,154,112,253,182, 35,231,238,223,190,255,
-226,250,197, 27,143, 39,140,154,179,109,194,180,213,235, 86,110, 57,188,105,249, 6,207,213,188,111,235,155, 14, 39, 63,245, 14,
- 19, 90,117,215, 75,199, 50,159, 65, 51, 44, 92,179,255,140,193, 79,131,159, 17,197,129,255,114, 95,178,203, 67,204,141, 69,144,
-170,241,151,153, 44,255, 91,156, 43,247,173,254, 23,197,255, 98, 65,207,242, 62, 19,175,169,244,170,226, 92,203,100, 73, 79,219,
- 58, 22,106,184,187,187, 43, 0, 65,253, 85, 41, 2, 56, 41,248,229,131,207,117,241,191,178,213, 38,208,122,119,126,141, 60, 58,
-182, 82,142, 46, 29, 40,204,239,168, 52, 84, 29, 54,201,103, 18, 74,179,126,254, 38,209,251, 99,199,142,237, 34,168, 34,192, 82,
- 37, 93,221, 75,152, 24, 3,108,219,168, 81,163,220, 23, 45, 90, 68,160,197,228,232,240,126,115,252,144, 28,117, 9, 41, 41,178,
- 4, 94,156,100, 17,218, 71, 16,191, 77,230,206,157,203, 50,210, 14,203,238,129, 24, 98,158,148, 98, 33, 94,215, 41,100,178,235,
- 24, 16,147,108,220,166, 25, 83, 94,242, 95, 49,201, 28,208, 60,175,188, 40, 27,203,102,253,169, 58,180, 60, 70,103, 77, 41,211,
-138,102,149, 5,149, 10, 61,198,245,109, 72,163,145, 26, 34, 49,210,189, 9, 46,121, 19,212, 74,149,244,218,251,149,147,223, 5,
-180, 43,174,233,229,156, 32, 11,193,127,159, 51, 48,238,173, 91,183,132, 1,107,119,236,216,161, 4,134, 45, 93,186,116, 48,208,
- 66,121, 83,180,202,158,193, 59, 96,206, 16, 75,240,166,167, 3, 41,121,162, 69,137, 50,237,248,142,213,114,109,255, 42, 57,182,
-124,148, 44,249,181,177,116,169, 85,204,156, 32,118,204,247,184, 93,193, 30,161, 78,165, 76,110,217, 51, 38,191,194,192,228, 12,
-218,250,227,143, 63, 42,113,218, 24,239, 13, 82, 56,129,228,146,170, 78,217,189,123,183, 80,221, 87,177, 76,161,183,213,115,154,
- 10,235, 46, 24, 66, 82, 66, 82,249,152,117, 39,253, 93,187,118, 41, 32,139,191, 0, 89,228,223, 2,132,214,120,199, 0,204,120,
- 47,213,187,161,108,234,240,252,197,115, 87,238,221,155, 56,114,246,238,133,211,150,237, 94,187,122,199,238, 13, 30,199, 54,175,
-247, 56,190,242,232,233, 27,235,121,223,186, 60,225,229,167, 19,245, 51,178, 26, 28, 48, 56, 96,112,224, 95,207, 1,123, 88,132,
- 21, 39, 64,250,235, 71, 1, 74, 21,173,254, 43,247, 44,238, 7,255,199, 28,208, 95,205,107,153,135,215,249, 31,177,129,151,225,
-190, 91, 4, 48,215,177,234, 80, 11,104,189, 63,189, 68, 62,189,123, 33,159,124,159,136,255,173,189,242,238,228, 2,121,119,117,
-187,248, 92, 59, 44, 87,246, 46,147,117, 67,235,200,186, 33,117, 52,129, 86, 80, 69,118, 81,146, 5, 48,165, 36, 4, 71, 13, 5,
-180,186,118,237,186, 13, 76,112,135, 10, 72, 23,208,122,125, 96,119, 8,160,117,186, 96,122,185,209,165,133, 80,186, 49,108,216,
- 48,233,220,185,179,244,232,209, 67, 1, 90, 4, 33, 40,135, 67,160, 5, 59,175,125, 4, 90,205,155, 55, 39,208,178, 25,239,172,
-156,201, 20,181, 74,146,120,123,222, 44, 24,237,111,238, 90, 65, 94, 1,100,157, 47, 18, 93, 23,208,154, 82, 40,139,204,175, 80,
-224,225,170, 90,101,183,160,129, 71, 34,213, 71, 82,226, 84, 1,100, 69, 43, 27, 47,214,190,151,243, 70,250,154,251, 84,151, 87,
-229,108,131, 55, 0,148,246, 72,143, 0, 82, 46,170, 32,235,230,205,155,138, 77, 26, 12,225,159, 80,146,133,244, 8,246,105, 10,
-202, 46,142,122,124,151, 60,209,153,119,203, 39,190, 11,104, 91, 84, 19,188,217,234,116,201,242,212,174,146, 46,101, 82,217, 48,
-186,149, 44, 25,208, 80,170,162, 30,200, 87, 21, 73, 79, 76,180, 52, 0,132, 79, 41,101,163,196,137,160,144, 1,149, 25, 24,248,
-249,115, 4,131,126,242, 68, 1, 89, 67,134, 12, 33, 77, 91, 49,239,236,125, 7,169, 33,109,122, 66, 9, 30,233,109,222,188, 57,
-132, 36,235,202,149, 43,210,190,125,251, 0, 60, 92, 29, 32,235, 42,226,245, 29,194,121, 84,107, 98,153, 51,103,222,112,234,194,
-141,107, 43, 55,238,219,199, 47,249,205,179,211, 10, 54, 62,116,234,218,198,109,187,143, 46,231,125,203,103, 34,130,159, 17,240,
- 97, 27, 36, 12, 14, 24, 28, 48, 56,240,175,225,128, 30,160,165,130, 41, 75,208,100, 13,176, 44, 65,152,101,126, 75,169,150,229,
- 51,184,110, 43, 16,183,179,124,213,148,104,149, 99, 5,145,128, 31,254,127,168, 18,173,151,139,107,203,203,165, 63,136,223,161,
- 73,242,241,197,109,145,192, 79,114,231,212, 78, 89, 63,188,158, 76,105,144, 66, 38,215, 75, 38,171,127,171,166, 23,104, 41, 54,
- 89,150, 1,134, 7,126,151,248, 29, 37, 89, 76, 63,151,137,245, 94, 5, 90, 11, 22, 44,208, 5,180, 84,105, 17,165, 90,150,146,
- 45, 70, 95,111,215,174,157, 2,180,122,246,236,169, 0,173,233,211,167,107, 2,173,239,191,255,126, 63,129, 86,211,166, 77, 25,
-220, 55,166, 13,110, 71, 42, 28, 51,218,202,199, 83,250,251,153, 7, 53,146, 55, 0, 67, 23,139,198, 8, 28,145, 46,202, 38, 91,
- 45, 99, 45,209,154, 91, 46,223,253,149, 53, 74,111,222,220,236,251,225, 40,123, 61, 36,197,214,139, 71,129,104,209,150,223,155,
-208,251,245,135,145,173, 20,186,151,138,198, 32, 72, 8,117, 0,100,121,211,232,157, 7,213,133, 4, 89, 27, 54,108, 16,216,100,
- 61,166,132,203,234,129,200, 69, 98,199,216,228,243,231, 96, 95,115,223,154, 10, 93,103,123, 16, 65, 86,155,159,135,126, 60,225,
-229, 37,105, 92,146,200, 47, 13,203, 6,102, 77,153,216, 15,116,156, 9, 96,157, 15,101,187,208,182,109, 91,105,211,166,141, 76,
-157, 58, 85,177,209,154, 48, 97,130, 52,107,214, 76,106,212,168, 17, 16, 35, 70,140, 49, 78,148, 45, 14,130,224,158,163, 45, 22,
- 65,214,186,117,235,100,201,146, 37,138,100,204, 90,146, 5,126, 81,181,201, 29,162,161, 64, 22,223,135,248,138,223,245,236,243,
-235,141, 91,247,158,220,220,117,248,252,206,205,219,247,157,184,112,245,238,174,235,119, 30,123,214,107,208,228, 12,238, 91,198,
- 19,179,224,103,141, 48,241,211,137, 58, 26, 89, 13, 14, 24, 28, 48, 56,240,159,224, 0, 49,136, 45, 44,194,202, 59, 2, 79,127,
-221, 86, 36, 93,193, 82, 47,245,154,229,175, 69,190,242,170, 68, 43, 72,226,165,108,200,250,236,135,181,218,144, 47, 12, 1,180,
- 8,182,130, 82,192, 77, 79, 5, 92, 89,166, 85,191,126, 23,102,160, 69,208,117,240,224,193,109,152,124,183, 17,100,169, 64, 11,
-106,190, 8, 7, 90, 52,138, 70,213, 28, 74,180,176, 19,242, 0,129, 86,147, 38, 77, 8,180,162, 89, 51, 63, 83,204,120,251, 78,
-247,111,109,254, 48,177,171,188, 45, 31, 71, 46, 21,139,241,225,199, 68,145, 94, 65,149,100,105,255, 19,252, 24,129,214,186,159,
-219,201,164,252, 25,101,118,153, 60,119,209, 25, 54, 33, 13, 69,170,139,148, 89,205,152, 49,102,252, 93,199,251,182, 8,248, 48,
-173, 55,232,198,149,203,197, 98,188,239,154, 60,178,165, 61, 85, 48, 77, 72,178,188,169, 38,187,113,227,134,156, 61,123, 86, 49,
-244,167, 36,203, 6,200, 50,177,188,231, 7,119, 8,248, 48,182,189,188,253, 38,182, 66, 87, 79,135, 74,150,183,118,169,212,249,
-235,248,165, 41, 88, 79, 90,118,254, 77, 32,125,148,214,221, 71,124, 32,232,138, 23, 51,250,124,208,208,218,117,106,239, 53, 4,
-175,223, 97,135,169, 60,126,252,152, 0,139,109, 66,209, 45, 37, 99, 76,220,117,202,128,185,142, 34,199, 71,142, 30, 61,250,166,
-147, 39, 79, 42,234,194, 45, 91,182, 40, 32,139, 54, 89, 0,212,129,148,100,193, 30, 76, 83,146,101, 89, 64,184,116, 24,177,105,
-203,206,203, 23,111, 60, 56,190,209,227,224,230,219, 15,158,238, 89,184,100,197, 33, 92,167, 77, 89,240, 17, 86,126,234,225,185,
-145,199,224,128,193, 1,131, 3,255,101, 14,216,194, 34,228,135,181,170,208, 22,168,210, 2, 90, 22, 18,173,202, 54,128, 89,120,
-217,110,173, 58, 76, 21,138,160, 51, 64,139,170, 67,107,160,181,114, 64, 21,221, 64,139,118, 89,150, 18, 45,158, 95,186,116,201,
- 29, 0,203,157, 42, 67, 53,205,158, 61, 91, 23,208,242, 89,187, 52,132, 36, 75,149,108,217,146,104,141, 31, 63, 94, 19,104, 85,
-175, 94,253, 32,129, 22,128,192, 20, 48, 42,132,196, 38,142, 75,182,198,155,218,214,253,244, 97,206, 32,121, 87, 49,161, 92, 46,
- 26,227, 93,189,248,145,158,219, 3, 89,100, 52,129,214,250, 78, 63,202,204,210, 57,111, 47,253,190,196, 6, 52,240, 96,164,218,
- 72, 25,213,134,136,155, 34,235, 15,107, 91,213,250,244, 97,193,112,121, 95, 37,177, 92, 41, 26,227, 77,205,184,145,124, 64,215,
- 38,210,134, 77, 83,123, 72,175, 30,193,189,196, 75,130,149,173, 91,183,210,240,253,158,117,195,178,188,238, 63,213,255,244, 97,
-230, 47,242,238,219,248,148,144,189,109,159,196, 54,120,179,124,150, 32, 43, 71,217,230,111,247, 31, 58, 42, 4, 51, 0,194,210,
-180,227, 32, 33,200, 10,111,111,196,243,157,193,227, 15,215,175, 95,151,123,247,238, 41,234,206,236,217,179,223,198,245,110, 0,
- 53, 15, 40,117,164,116, 10,126,176, 22, 56,120,215,239, 80, 61, 11,250,146,236,217,179, 71, 1, 89,252,165,212, 18,207, 44,232,
-216,177,163, 98,147,165, 37,201,178,164, 15,169, 85,172,239,191,205, 18, 48,228,183, 86, 31,154, 52, 40,241,126,202,132, 1, 1,
-181,170,230,218, 1,240, 26, 12,182, 21,126,118,104,224, 52, 63, 35,128,103, 6, 9,131, 3, 6, 7, 12, 14,252,235, 57,160, 7,
-104,217, 2, 94,196, 98,127,225,177,255, 75,182,248,223,158,141,150,154, 63,232,254,183,159,129,177, 90, 59,254,255,122,165, 61,
-137,214,219,125, 99, 67, 1,173, 21,253, 43,107, 2, 45, 26,195,183,135, 33, 60,141,223,169, 46,180, 4, 91,214, 64,107,248,240,
-225,238, 48, 96,215, 5,180,158, 46,157,227, 16,104,117,233,210, 37, 88,117, 56,102,204, 24, 77,160,133, 29,133,135, 1,180,182,
-210, 79, 22,216, 16,108, 56,157, 48, 69,182,114,163, 38,252,241,244,229,189, 59,114,191,114, 42, 57, 87, 44,230,251, 42,113,162,
-188,117, 4,178,130,129,214, 79, 77,111,194,141,195,186,117, 13, 42, 14, 68, 71,168,137,148, 94,109,216, 88, 46, 89,138, 14, 25,
- 61,229,233,171,123,119, 2, 31,126,159, 86,206, 23,141,249,190,114,236, 40,190,246, 64,150,101,135,128, 11, 7,111,238,220, 91,
-185,114, 37, 13,223, 67, 0,173, 16,229,173,148, 66,206,160,188,149, 98,107,151,151, 32, 43,103,185, 22,111, 15, 28, 58, 38,112,
-179,161,128, 30,248, 56,147,228,185,107, 57,173,114,180,238,188,240,145, 54,120,192,128, 1,138, 61, 22, 37,113, 4,190,148, 62,
-209, 5, 3,218, 92,217, 45,136, 77, 18,242,235,175,191,242, 93, 52, 86,180,117,212,161, 74,152,199,209,163, 71, 67, 72,178,174,
- 94,189,234,180, 36, 75,125, 1,128, 86,185, 46, 29, 26, 66, 66,246, 82,222,188,188, 34, 55,206,207,247,172, 81, 37,207, 96, 24,
-194, 39,100,158,176,242,243, 51,124,192, 6, 73,131, 3, 6, 7, 12, 14,252,167, 56,128,225, 62,172,187, 14,249, 28,119, 25,170,
- 59, 14,131,141,233,131,174,241,126, 40,205, 85, 4, 48,215, 57,160,229,187,115, 80,176,218,144,234,195, 55, 91,122,134, 0, 90,
-179, 90,103,147,229,253, 42,106, 2, 45,107,247, 14, 30, 30, 30,187, 32, 45, 81,164, 91, 42,208,130,241,186,251,188,121,243,220,
-199,141, 27,231, 94,160, 64, 1, 2,173,129, 26, 21,126, 64,195,106, 30,199,210, 68,183,105,163, 69,160, 5,131,113, 25, 52,104,
-144, 12, 30, 60,152, 19,248, 3, 71, 52,233,194,129,126,178, 0,180, 20, 23, 14, 5,179,102, 30, 86,170, 96,222, 7, 21,171, 84,
- 15,120,239,255, 33,240,226, 93, 95,153, 50,124,234,139,210,241, 98,127, 72, 31, 59,161,166,225, 54, 36, 90,215, 81,188, 53, 72,
-191, 34, 85, 71, 82,232, 22,200,154,249,151,146, 5,114,221, 41, 95,177,122, 64,128,249, 99,224,229,123,111,101,218,208,169,175,
-202,197,141,245, 33,109,236, 68,157,244, 52, 52,128, 86,123, 26,189,115,119, 97,201,146, 37, 91, 88,151,151,116, 89,222,201,195,
-166, 62, 47, 29, 87,187,188, 4, 89,185,191,105,249,246,208,145, 19,220,253,169,216,125, 81, 82,180, 96,217, 58, 73,157,191, 46,
-109,178,194,115,196, 68,121,223,211,167, 25, 37,112,144, 94,113, 71,228,148,194,133, 11,127,224, 42, 6,253, 64, 54,109,218, 68,
-192,104,198,245,193, 72, 54,237,169,224, 15,107, 43,140,231, 3, 73,103,233,210,165, 74,249, 8,222,144, 95,145,100,193, 15,155,
- 83,146, 44,203, 10,185,185,166,147, 93, 27, 6,137,199,234,190,158,203,255,104, 56,216,213, 53, 77, 57,203,246,119,150,159,225,
- 97,150,241,172,193, 1,131, 3, 6, 7, 12, 14,124, 53, 28,208, 86, 29,218,170, 10, 36, 90, 87,166, 12,248, 81,222, 62,188, 36,
- 1,215,119,202,235, 13, 29, 20,192,245,106,101, 51, 5,104,205,106,149, 85,214, 98,183,225,156,222,223, 73,237, 66,201, 9,180,
-174, 56, 98,137, 53,208, 90,181,106,213, 46, 24, 67,187, 15,169,150, 52,216,143,214, 47,149, 18,188,131, 90,201, 29,146, 15,122,
-227,174,105,111,178,181,120, 79, 27, 55, 55, 55,127, 78,212,183,250,252, 36,103, 75,231, 80, 64, 23, 15,170, 14,233,183,169,111,
-223,190, 10,200, 2,128,146,184,113,227,210,181, 65, 8,155, 27,235, 50,195, 95, 86,125,213, 25,169, 91,230, 52, 85,219, 55,170,
-251,250,238,185, 19,178,101,218,112,233, 53,112,226,167, 89,238,151, 95,164,202, 81,254, 78,236, 84,217, 11,232,233, 2, 0, 90,
-171, 80,156, 1, 72,223, 35, 41,187, 27,114,100, 74, 87,161, 77,189, 90,175, 72,119,243,180, 17,210,119,248,180,192,121, 91,174,
-190, 76,151,167,194,157, 88, 46, 57, 44, 13,175,245,188, 34, 56,143,117,121,187,255, 58,254,211,204, 77,151,124, 82,102, 47,171,
- 89,222,228, 57,235,148, 44, 88,177,205,219,195,199,188,100,237,218,181,220, 28, 33,123,247,238,149,133,203,214, 75,250, 34, 13,
-124, 9,194,156, 42, 76,232,204, 9,105,143, 69, 55, 12,216,112, 64, 96,164, 74,245,114,196,137, 19,103, 23,182,217, 62,130,141,
-149, 39,217,227,232, 61,201,146, 37,123,197,246,133,159, 53,197, 38, 11, 32, 43, 48, 60,146, 44,245, 93,148,104,117,254,169,129,
-248,191,243,246,124,253,252,242,224,211, 7,250,149, 11, 15, 63,195,201, 43,227,113,131, 3, 6, 7, 12, 14, 24, 28,248,183,115,
-160, 28, 36, 10, 8,181,211, 62,119,154,232,143, 23,141,233, 34,111,110, 28,146,119,199,102,202,235,117,109,101,243,239, 45,100,
-203,212,110,210,161, 90,110,201,225, 18,233, 49,243, 49,191, 21, 79, 66, 56, 94, 11, 17,130, 39,155,233, 3,242, 14,128,253,203,
-250,206, 69,255,239, 71,139,231,184,254, 19, 82, 60, 59,252,181,229,204,141, 70,103,179, 10, 21, 42,244,145,210,141,203,245, 43,
-202,201, 28,201,164, 83,167, 78, 50,112,224, 64, 26,181, 75,242,228,201, 25,134,135, 6,214,161, 13,212,172,194,166,168,206, 72,
-225, 13, 60, 81,225,156,110,143,207,236,218, 36,251, 22, 77,145,185,157,235, 74,177,188, 57,159,165,204, 81,246,180, 14,144, 21,
- 92, 78,196, 47,164, 31, 15, 58, 69, 83,222,157, 53,107,210,120, 5,115,184, 61, 60,189,115,147,236, 95, 60, 77,161, 91, 60, 95,
- 46,159,180, 57,203, 95,210, 0, 89, 14, 29,217,217, 44,111,158, 28,207, 82,184,149, 60,229,160,188,193, 52, 51, 23,109,176,225,
-254, 67,111, 69, 29, 71,227,114,122, 85, 95,180, 98, 3, 64, 86,125,103, 65,150,189,114, 38,196, 70, 3, 33, 40,130, 11, 13,182,
-115, 66, 39,190, 33, 75,154,235, 9,214,104, 71,103, 41,201,122,245,234,149,179,146,172, 80,229,116,205,148,102,116,157, 26,101,
- 6,119,254,233,135,114,225,229,167, 19,117,211,202,250, 95,118, 96,104,212, 93,171,119, 56,119,223,224,167,115,252,210,202,109,
-240, 83,139, 67,255,157,251,156,223, 41,213, 82,127,225,173,201,137, 35,143,139, 41, 14,128,212,192,162,153,226,249,174,155,212,
- 93,124, 78,174,150, 17, 29,190,147,252,105, 98,248,242, 58,239, 59, 1,138,172,179,198,177,148,116,241, 92,163,104,142, 58, 54,
-125, 81,173,105, 91,170,168,156,109,219, 80,113,237, 0,251, 26,210, 91, 67,124,227,128,110, 8,154,120, 38,102,174, 44, 25,126,
-206,159,205,245,193,130,145,253, 62,237,248, 99,164, 2,134,152,242,101,205,104,237, 85,222, 30,217,255, 3,152,204,153,191,129,
- 20, 38, 69,206,156, 57,163,103,203,156,174, 93,190,172,153,239,207, 25,214,231,227,206,153,163,131,233,230,215, 71,215,102,221,
-195, 89,222, 96,154, 41,242,214, 42,210,166,215,216,247,222, 79,158, 9,157,188, 46, 94,185, 49, 44, 32,139,252,176, 11,180, 40,
-201,226,238, 69, 58, 44, 13, 7,208,114, 67,236,194, 43,211,166, 77,147,107,215,174,133,217, 38,203, 94, 57,161,222,204,133,246,
-239, 26,198,246, 55, 6, 94, 39,198, 22, 29, 89, 13,126,234, 96,146, 19, 89, 12,126, 58,193, 44, 29, 89, 13,126,234, 96,210,127,
- 36,139,106,147,101,253,235, 92,245, 51,187,152,146,103, 77,102,154,158, 61,121,164,119,252,229,255,112,128,162,224, 71, 45, 37,
- 93, 60,143, 0,154,116,209, 79,159, 86, 76,138,187,126,103,104,230,113,205,112,173, 83,237,111,223,173, 28,222, 93,214, 12,235,
-170,128,161,177, 45,191,147,111, 11,230,120, 81,192, 45,243, 8, 45, 98, 65,247, 67,125,128,185,179,100,184,216,161,102,133,183,
- 43,134,117,147,181,195,127,150,121, 93,126,144,241,173,170, 73,165,194,185, 94,230,207,150,105,188, 14,186, 54, 63,234,112,150,
- 55, 4, 77,170, 7,219,246,254,253,253,237,187, 15, 37, 83,209,134,206, 74,178,212, 42,216, 27,124,162,229,205,155,247, 25,141,
-221,115,231,206, 77, 21,174, 51, 6,136,214, 52, 99,192, 86,107, 12,195,235,208,233,169, 51,187, 11, 45,248,252,217,249,169,163,
- 77,245,100, 49, 6,115, 61, 92,210,159,199,224,167,126, 94,233,201,105,240, 83, 15,151,244,231,249, 47,243, 83, 63,151,254,121,
- 57,195, 30, 84,218, 86, 93, 92, 93, 77, 49,116,214,241,171,236, 48,121,220, 50,122, 21,200,225,250,164, 32, 83,182,204,222,249,
-179,102,186, 83, 48,123,166,253, 89, 51,167,113,198,181, 65,104,160,229,150,241, 92,193,236,174, 79, 11,229,200,242, 12,116,159,
-130,238,253, 2,217, 50, 29,207,157, 57, 67,173,240,240, 51,156,229, 13, 85,206, 20, 57,235, 20,206, 94,186,217,114,218,108,233,
- 44,151,117, 54, 71,237, 94, 25,129,159, 87,226,129,111,156,164,109,143,102,145,170, 85,171,222,182,231,241,221, 25,128,173,230,
-141,104,126, 58, 89, 79, 91,217,191,202,239, 40, 2,234, 77, 18, 70,221, 35,136,145,246, 22,128, 17, 64,222,104,163, 8, 96,162,
-214, 2, 48,156,175,248, 90,218, 40,156,213,252,111, 62,254,181, 52,174, 81,206,136,237,159, 95,154,159,116,193, 97,115,135, 98,
- 88,128, 86, 56, 89,241,165,235, 30,214,226, 26,229, 12, 43,231,108, 63,103,240,211,224,103, 68,113,224,191,220,151, 34,138,135,
-127, 7,157,136,149,104, 57, 81,131,255,114,135, 49,234,238, 68, 71,209,145,213,224,167, 14, 38, 57,145,197,224,167, 19,204,210,
-145,213,224,167, 14, 38, 57,145,197,224,167, 19,204,210,145,245,107,225,167,142,170,124,157, 89,216, 0,182,146, 51,181,177, 71,
-195,209,117, 45,250, 6, 77,219,237, 18,214,246, 50,248,105,240, 83,111, 31, 48,190, 77,251, 28,208,203, 67,203,124, 6, 63, 13,
-126,218,226,192,127,185, 47,105,125, 19, 95,227,125,235, 93,135,250, 28,150, 70, 64, 77,191, 22, 20,109,148, 51, 2, 26,219,130,
-132,193, 79,131,159, 17,197, 1,163, 47, 69, 20, 39,255,162, 99,240,211,224,103, 68,113,224,115,244,165,136, 42,219,223, 65, 39,
-124,187, 13,195, 81,226,207,209, 16, 6,205,112, 52,136,141, 71, 13,126, 26,252,140, 40, 14, 24,125, 41,162, 56,105,128, 34,173,
-190,196,192,244, 76,246, 14, 91,247,181,104,134,165,245, 12,154, 97,225,218,191,243,153, 8,181,209,114, 3,143,152,244, 28, 97,
-237,132,157,225, 77,253, 28,156, 90,126,130,151,118, 41, 95,190,252, 96,139,151, 5,211, 44,147, 43,234,137,111,242, 68,245,254,
-127,138,230,253, 77,222,152,222,223,228,143,237, 93, 38, 95,236, 19,122, 10, 24,148, 39,172,229,116,244, 10,131,166,118, 3,100,
-136,157, 32,249,217, 56,137, 82, 94,137, 25, 47,201,149,104, 49,227, 33,197, 13, 78, 81,162,199,244,176,213,238,234,181,148,249,
-235,164, 79,150,167,214,138,100,121,106,150, 70,176,235,229,252, 77,158,167,238,178,191,126,235, 44, 77,158,191,118, 94,254,166,
- 42, 88, 47,157,157,162,124,117,109,132,104, 10, 81,194,147,236,241, 51,117,234,212,238,136,176,112,197, 94,194,247,184, 71,187,
- 57,191,122,105, 73, 89,212,241, 28,146, 18,156,214, 34, 93,196,185, 86,208, 89, 93,125,169, 28, 54,109, 52, 52,153, 58, 53, 55,
-153,238, 50,241,156,215,254, 73,253, 19,206,157,247,161,189,189,227,199,143,127,131,229,226, 47,255,243,186, 86, 57,193,180, 40,
-122, 82,110,147, 41, 81, 52,147,169, 3, 34,128, 92,138, 17, 57,114, 39,245, 25, 71,223,187,197,189,142, 56,247, 11, 74, 60,183,
- 62,236,221,215,213, 70, 58,250,185,101, 22,131,166,147, 12, 51,178,219,230, 64, 54, 92,166,167,118,134,196,121, 92,164, 72, 17,
-201,145, 35, 7, 7,161,199, 65,215,120,143,121,108, 29, 78,119, 66,124,120,227, 38, 79,158, 44,129,129,129,193,161,116, 16, 14,
-103,176,173, 15,144, 0, 75,238,120,202,177,141,127,136,188,243, 65,122, 46,242,254,165,200,179,139,242, 77,254,184,222, 78, 52,
-168,101, 57,227, 39, 78,156,120, 98,146, 36, 73, 30,194,201,168,183, 86, 98, 62,230,231,120,100,245, 62,205,186,199,141, 19,243,
- 67,204,152,209, 2,109, 37,222,179, 81,254, 96,154,120,239, 33,150, 13,131, 95,136,228,226,226,226,173,166, 20, 41, 82,120, 91,
- 38,120,168,247,102,194,115,150, 32,212, 81, 57, 99, 69,142, 26,189, 95,148,104,113,247, 68,137, 17,251, 81,148, 24,113, 30, 69,
-141, 17,111, 15,175,161,108,177, 28,240, 87,179,238,120, 54, 67,170,116,174,247,126,159,185, 70,154,117, 29, 42,151,175,221,148,
-150, 93,126,147,171, 55,110, 75,199, 62, 35,148, 95,130, 46, 71, 3,175, 75,254,134, 75, 39,205, 89,247,220, 37,127,131,135,147,
-230,172, 85,126, 39,207, 93,239,131,235, 15,248,155, 34,127,195,123,147,231,172,243,113, 41,208,104,113, 88,251,103,227,172,169,
-223, 54,201,236,242,209, 86,226, 61, 71,109,228, 68,255,211,202, 26,204, 79, 21,100,193,157, 5,189, 14, 75,147, 74, 5, 71,141,
-239, 90,179,147,173,212,191, 94,193, 81,245,114,153,164,113,129,216, 5,213,231,236,241, 51,115,230,204,151, 62,126,252,136,128,
-218,102,121,255,254,189, 48, 80, 57, 61,237, 35, 68,150, 18, 0,220,213,213, 85,153,116, 53, 14, 61,237, 94, 3, 52, 78, 35,157,
- 65, 98,208,118,173,195, 17,205,120,240,165, 54, 16,225,155,246,196,136, 17,227, 9, 19, 66,108,237,225, 53, 16,181, 23, 89,130,
-239,179, 71,243, 52,226,103, 42,126,217,158, 61,123, 38,143, 31, 63, 86,210,211,167, 79, 37, 86,172, 88, 87, 35,160,238, 38, 2,
-171,169,165, 75,127,124,131, 24,162,222,221,187, 75,255, 4, 9, 62,240,154,158,254,137,250,121,160, 28, 87,156, 73,124,198,217,
-113,137,160,138,131, 47,127,249,172,245,127, 71,125,222, 17,200, 66,108,173,168, 16, 51, 85,136, 26, 37,138, 59,198,165,215, 8,
- 42,255,137,239,193,152,255,192, 9,160, 69, 73,149,159, 58, 57, 68,138, 20,233, 3, 66,119, 45, 65,156,215, 5, 72,243,139, 23,
- 47,190,144,215,212,251,204,139,164, 74,190,244,244, 79,173,254,104,125,223,160,233, 44,199,254,189,249,195,100,147,181,133,157,
-148,192,106,226,196,137, 2,176, 35,239,222,189, 11, 6, 63, 28,136,182,111,223,174,132, 64,201,149, 43, 23,129, 23, 59,180,221,
-143,250,219,234,165,187, 84,111, 92, 81,152,138,150,206,255, 16, 31,111, 95,228,143,108,197,115,215, 22, 45, 90, 40, 8,139,193,
-133, 17,212, 89, 28, 73,180, 20,160,117,113,133,108,235,154, 94,100,119,111,145,121,133, 69, 86, 34, 48,247,150, 54, 97, 6, 90,
- 4, 77, 67,134, 12, 81, 98,253,173, 89,179, 70,150, 47, 95, 46,139, 22, 45, 18, 4,186,150,153, 51,103,202,168, 81,163,132, 65,
-172,153,252,253,253, 21,158, 32,223,199, 32,176,101, 89,157,224, 15,176,120,161,116, 39, 74, 22,206,224, 93, 34, 40, 21, 47,144,
- 86, 1, 58, 4, 88,193, 12,181, 58,225, 61, 71, 3, 26, 6,170,123, 62,112,252,249,226,204, 25,121,126,242,164, 60, 63,113, 66,
-248,223,231,216, 17,164, 67, 72, 7,196,231,232, 62,121,118,216, 83,158, 30,216, 45, 79,246,236,144,199, 59, 60,228, 62, 6,120,
-117, 0, 13,162,111,111,160, 40, 25, 45, 70,236,187, 63,118,254,205, 60,115,233, 86,217,113,224,172,108,221,123, 90, 38,207,219,
- 36,205, 58,244, 55,199,136, 29,255, 46,158,183,231,103, 75,115,240,137, 17, 39,193,213,117, 91, 60,165,223,176,201,146, 50, 87,
- 5, 73,145,179,124,136,212,185,223, 40, 45,160,149,216, 37,247,247, 23,192, 54,191, 20,249,234,189,225,111, 74,245, 55,111,200,
-255, 41,114,127,127, 30,101, 77,236,136,159,246,218,136, 0, 75,109,154, 39,127,252, 33, 15, 16,148, 92, 61,120,207, 17, 77,203,
-123, 4,183,228,187, 86,178, 2,193, 42,137, 16, 64, 11, 32,171, 16,110, 8,128, 17,251,136,108,253,115,192, 58,185,180,122,150,
-101, 58,189,108,192, 58,130,172, 64,255, 55,129,252,109, 86, 36,118, 33,130, 45,139, 50,133,104,163,140, 25, 51, 94,121,251,246,
-173, 32,200,187, 18,220,219, 58, 1,104,105, 1, 13,146,254, 95,123, 87, 1, 38,197,209, 68, 47,184,123,112, 75, 32,193,221, 37,
-184, 75,112,130, 91,144, 16,220, 37,200, 5,119, 9,238,238,238,238,206, 29,238,122,232,113, 56, 28,183,248, 93,253,239, 13, 59,
-251,207, 45,187, 59, 51,199, 65, 66,178,243,125,253,205,238, 76, 79, 77, 79,181,189,174,170,174,114, 84,239,236,227,227,226,197,
-139,199, 54,207,232, 12,135, 9,100,248, 46,128,128, 83,248,159, 61, 86,172, 88,199,153,199,193,120,224,140, 38,175, 23, 70,116,
-128,155, 59,118,236,120, 1, 64,104,185,114,229,138, 37, 48, 48,208, 2, 80,100, 65, 48,116,127, 72, 97,216, 62, 41,161,114,116,
- 56,107,159,175, 17,144, 92,145,162, 35,222,170, 45, 17,104, 85,201, 19, 62,168, 69,153,168,150, 6, 69,163,112,236,170,136,104,
- 12,177,236, 8,235,182,121,230,167, 20,139, 32, 11,131,170, 72,145, 34, 2, 81,153,240,154,145,114, 18, 96, 45, 91,181, 88,214,
-110, 92, 37, 43,215, 46,147,197,203, 23,200,252,197,115,100,214,188,233, 50,117,230, 36,153, 48,229, 47, 25, 61,110,132, 12, 27,
- 53, 88, 6, 15, 31, 32,253, 6,246, 37, 64,180,143, 63,171, 91, 78, 21, 88,253,240,195, 15, 47,248,155,103, 45,240,114,213,230,
- 29, 1,173, 4, 30, 30,223,135, 11, 19,102, 48,230,146,199, 24, 63, 95,146,191, 85,171, 86, 85,218,218,176, 97,195,222, 1, 24,
- 89, 50,160,127,242, 89,103,237, 83,115, 61, 24,208,194,247, 9,234, 62,232,214,173, 91, 74,226,111, 94,115, 3,173,143,106, 73,
-183,222,157,180, 65, 87,151, 63, 7,205, 16, 20,227, 31,243, 72,136, 84,135,194, 1,241,201,147, 39, 28,208,157,225, 1, 5,108,
-156, 57,115, 70, 1, 36,248, 92,123,112, 96,171,136, 89,187,135,181,217,113,111,174, 48,109,190, 53, 91,122, 77,108, 43,144,174,
-216,123, 67, 31,124,240,224, 65,101, 53, 25, 41, 82,164,221,160, 23,211, 85,167, 86, 85,135,133, 51,133,247, 47,149, 59,214,139,
-194,153, 34,248,127,170,234,144, 18,170,233,211,167, 75,245,234,213,131, 13,182,234,192, 91,175, 94,189, 96,147, 16, 1, 40, 87,
-252,124,206,217,192, 75,128,165,101, 96,133,146, 25,159,228,203,153,194, 47,121,210,184,202,138,142, 96,149,169, 71,143, 30, 74,
-162, 84, 65, 15,104,129,119,183,158, 28, 63, 46, 23,199,140,177,165,203,227,255,146,171, 83,199,201,181, 89,227,196,103,222, 56,
-185,177, 16,105, 1,126,207,197,181,153,227,228,202,148,113,114,103,221, 26, 35, 64, 43, 79,210, 20,105,158,204, 93,177, 67,166,
- 46,222, 46, 69,107,117, 71, 40,158, 26,242,125,222, 95,164, 84,253, 62, 50,114,230, 38, 25, 59,107,157, 36, 73,241,227, 99,124,
-179,163, 0,216,186, 29, 48, 98,228, 24,183,206, 32, 20, 79,185,170,245, 37, 75,161,202, 50,112,244, 52, 25, 61,121,158, 2,182,
-166,207, 95, 41,251, 14, 31,119, 9,180, 48, 57,143, 47, 86,189,125,192,132,217,235, 44,197,235,244,181, 76,152,179,206, 82,162,
-158,122,246, 84,254,151,172,255,167,114, 46, 83,167,115, 0,234,103,188,171,182,244, 81, 29,149,250, 80, 71,141,210, 36, 83,234,
-136,199, 97, 76,138, 76, 33, 1, 90,234,228,229,180, 35, 89,111,216,129, 96,181,200, 54,126,170,146, 44,246, 73,182, 59, 0, 3,
- 5,108,109,154,210,115,133, 10,180,142, 47,232,185,130,224, 42,240, 21, 0,205,174, 65,242,230,218,238, 64, 85,178,229,108, 34,
- 67,123,218, 8,181,225, 5, 38,196,120,124,129,243, 27,109,194,100, 27,224, 72,173,104,167, 82,116, 84,239,227,216,167,253,253,
-253, 5, 65,187, 31,161, 95,189, 3, 32,146,245,235,215, 75,246,236,217,131,138, 22, 45,250,150,253,189, 73,147, 38, 28, 63, 8,
-182,236, 15, 71, 52, 75,194,156,224,145, 5,199,187,119,239, 44, 24,167, 44, 43, 87,174,180,128,142,242,155,215, 32,137,178,164,
- 77,155,246, 33,136, 57,124,222,201,208,252,218,215,215,247,253,209,163, 71,229,220,185,115,114,227,198, 13, 69,162,199, 49,174,
- 65,145,240, 34,155,210, 75,155, 42,137,100,248,148,181,231, 50,101,201, 62,142,177, 48, 13, 0,131, 96,175, 34,168,162, 36,139,
- 32, 11, 31,108, 26,104,109,219,182, 77, 16, 31,214,101,202,147, 39,143,252,244,211, 79,130,168, 9,186, 64, 11,253, 98, 5, 36,
-224, 7,180, 9, 82,242,231,221,186,117,123,207,122,226,193, 51,255,243, 58,243, 97, 49,176,194,217, 88,167, 2,173, 34, 30, 30,
-209,194, 3, 87, 70, 8, 31,254, 4, 64,233,243, 18, 37, 74,216, 38,145, 20, 41, 82, 4,133, 15, 31,254, 49, 36, 89, 62, 17,194,
-132,233,250,157,135, 71, 2, 19, 18, 45,190,250,119, 74,173, 8,168,160, 93,241,193,130,124, 1,210, 66,166, 95,126,249,101, 49,
-175,241, 30,243, 48,175,217, 58, 50, 57,109,235,142,117, 38,233, 49,251,127,153,166, 83,118,161, 41,230, 68,130, 36,197,150, 74,
-106,126,231,197,239, 60,214,255,218,235,204,207,235,218,103,237,255,243,217,104, 72,144,212, 40,180, 25,151, 56,110, 8,234,205,
-181, 68,107,221,186,117,162, 38, 13,113,165,147, 49, 92, 10, 7,158,139, 23, 47, 42, 98,116,170, 21,252,252,252,100,251,246,237,
-242,215, 95,127, 73, 7, 12, 26, 29, 59,118,148,137, 19, 39,170, 54, 13, 14,203,167, 74,180,126,174, 91, 82,254,156,217, 69,150,
-159,155, 46,149, 26,150,123,143,129, 90,141, 65, 24, 46,115,230,204, 15,248,206,145, 35, 71,146, 22, 85, 12,134, 14,208,232,188,
-227,148,165, 47,207,134, 30,112,145,137,128,137, 82, 43,174,184,180,171, 90,103, 64,139,171, 50, 2, 77, 7, 64,203,246, 22, 78,
-216,218, 9,246,202,249,221,114,236,224, 98,169, 92,169,188, 2,170, 30, 63,126,172,128,203,251,247,239, 43, 60,230,217, 9,208,
-178,209, 36,208,162, 20, 43, 24,208,154, 8,160, 53,125,156, 92,159, 3,128,181,104,156,237,149, 4, 92,188,118,117, 26,128,214,
-154, 85,246, 64,203,158, 27,145,195, 70,136,226, 51,125,241, 22,105,215,127,182,164, 40,220, 70, 18,101,173, 98,163,149, 42,127,
-109,201, 93,227, 79,105, 59,112,161, 12,159,186, 90, 32,217,242, 1, 1, 87,106, 68,135,220,142, 16, 41,234,173,154, 53,107, 10,
- 84, 53,210,182, 99, 87,233,218,119,152, 12, 27, 63, 75, 1, 90,147,103, 47,147,221, 7,188,236,129, 86, 48, 58,144,102, 92,131,
-148, 13, 32,171,143,165,231,160,201,150,162,181,122, 89,250, 12,155,174,252,239, 55,106,182,165,100, 61, 79,203,144,241, 11, 44,
-229, 26, 15,180,108,222,115,220, 2,137,227, 53, 87,109,195,190,142,174,162,142,142, 31, 90, 44,127, 86, 40, 43,126,136,169,168,
- 5, 88,252,125, 60, 89, 50,113, 34,209,114,248, 26, 21,104, 49,206,163, 35,137, 17,175,243,112, 2,180,180, 52, 21, 73, 22,249,
- 70, 58,236,151,103,206,156,166,100, 77, 84,160,245, 65,146,245, 92, 94,236,232, 47,247,251,199,151,167, 11,106,202,211, 21, 45,
-222,240,186,145,254, 65, 53,162, 86,117, 79, 80, 71,176, 65, 41, 20, 23, 95,108,175,108,163, 55,111,222, 20,128,175, 43,174,104,
-130,239,222,124,102,215,174, 93, 2, 48,164,168, 35, 25, 71,147, 65,203, 55,111,222,172,212,255,249,243,231, 5,210, 54, 65,157,
- 82,178,165,119,196,128,122,240, 54,202, 98,193, 88,100, 65, 89, 20,128, 69, 73, 22,127,239,219,183,207, 82,168, 80, 33,229, 26,
-222, 99,129, 90,241, 54, 8,218,171,245,157,189,227,213,181,107,215,222, 49, 88, 57,206,202, 55, 2,203, 41,245, 2,137,150, 52,
- 43, 21,229,213,111,149, 82, 88, 54,123, 61,125, 59,106,198,230, 11,168,171,202,122,133,181,191, 79, 53, 97,143, 88,177, 2, 41,
-201, 98,234,240,205, 55,129, 46, 84,135,193, 30,167,116,138,146,172,106,191, 84, 86,202,196,179,125,250,165,110,117,169,215,168,
-142, 52,105,214, 80,145,106, 57,144,104, 5,163,137,113,228, 0,192,250, 37,240,243, 18,212,197,151, 80, 63,151,192,203, 75,136,
- 19,251, 20, 17, 23, 20,164,197,115,221,186,117,159,249,248,248, 92,130,196,232, 18,159,113,246,221, 81, 60, 60,114,124, 19,235,
-199,253,145,226,126, 31,128,113,252, 61,199, 53, 6,146, 71,200, 45,130,233,151, 0,219, 79,195,134, 9, 51,139,249, 28, 73,191,
-140,242, 51, 91,182,108, 51, 80, 30, 1,176, 90,138,126,144, 86,155,120,141,247,152,199, 40, 61,119,190,127, 6, 7,156, 96, 17,
-165,112, 4, 65, 60,169, 73,251, 31,139,138, 30,234,127, 71,249,180,215,172, 96,202, 70,203,250,108,121,158, 73, 27,170,232,133,
-200, 99,212, 14,221, 60,227,248,145,154,167,108, 64,139, 96, 75,155, 26, 55,110, 44,205,154, 53,147,223,127,255, 93,218,182,109,
-171, 0, 45,130, 46, 43, 3, 92,190, 24,171,177,240, 41,190, 75,177,109,194,182,145, 50, 96,126,111,129, 17,110, 47,235, 3, 63,
- 19, 96,241, 32,224,194, 53,195,158,190, 67, 19,104, 81, 5,216,168, 81, 35,105,221,186,181,180,108,217, 82,249, 78,254,199, 64,
-195, 78,173,168, 51,185,218, 37,184, 58, 9,181,221,161, 67,135,152,231,157, 3,213,161,141, 15,121,115, 36,247,187,112,122,187,
-172, 94,208, 83, 86,206,235, 46,203,230,116,149, 37, 51, 59, 75,197, 10,101,148,137,171, 77,155, 54,202,251, 90,181,106,165, 36,
- 78,186, 70,128,214, 67,188,251, 35,160, 5, 48,165, 0, 45,128, 43,245, 80,128,214,236, 15, 64,235,246,202,229, 46, 39,243, 48,
- 97, 34,116,171,213,180,235,155,169, 75,118, 72,202, 34,109, 37,117,137,142,146, 44, 71,117, 27,173,180, 63,213,151,130,117, 7,
- 75,209,134,195,101,232,140,205, 82,179,105,151,215,225, 34, 68,166, 26,216,212, 65,160,229, 57,104,140, 84,131,228,144, 82,211,
-150,109,218, 75, 55,128, 45, 2,173,241, 51, 22,203,246,189,135, 93, 2,173,216,177, 99,251,160, 80,150,141, 27, 55, 90,160,194,
-182, 64,133,100,217,189,123,183,101,255,254,253, 22,212,137, 5,139, 3,203,241,227,199, 45,176, 3, 81, 38,100,172,198, 9, 8,
-157, 30, 31,234,104,155,173,142,150,163,142,150,206,234, 34,158, 0, 90,183, 32,109,180, 7, 90, 71,194,134,149, 58,223, 59, 84,
- 29, 58,124, 7, 1, 20,193, 11,164, 13, 79, 84, 91, 57,237,153,215, 9,102,120,205, 85, 57, 85,137, 22, 64, 69, 32, 1,203,249,
-243,231, 2,217,239, 28, 73,180, 94,159, 95, 23,244,116,126, 53,121,182,180,193, 59, 7, 18, 45,167,175,161, 26,145, 42,113,103,
-106, 68, 45, 80,132,164, 75,207,118, 43, 3, 37, 89,171, 86,173, 18, 38,154, 4,168, 32,139,210, 25,212,153,236,221,187,151,193,
-223,223,160, 64,217,245, 26, 17,237,175, 0,208, 94, 80,106, 69, 96, 5,137, 83, 48,144, 85,169, 82, 37,203,140, 25, 51, 44, 40,
-163, 34,213,234,211,167,207,179, 8, 17, 34,208,102,203,200,113, 8,160,239, 61, 65, 22, 36, 91, 74,223, 84,165, 58,224, 59,213,
-156, 30, 80,129, 38,234, 51,124,238,209, 45,199,158,191,203,156, 53,231, 48, 35, 68,181,121, 96, 88, 23, 62,119,244,232,247,246,
-173, 92, 25, 52,184, 94,189,247,121, 99,196,240, 41, 98,112,172, 35,104,162, 73,131, 42,209, 98,167,212, 74,183, 96,159, 4, 65,
- 89, 17, 41, 85,170,148, 2,110, 32,133, 50, 2,180,246,227, 59, 47,129,167,151, 80, 47,151, 0,134, 47, 65, 59,113, 9,227,249,
- 85,168,139, 21, 41, 20,234,248,125,191,126,253,124,120,157,135, 43,160, 5, 41,210,211, 63, 39,174,147, 40, 63, 86,145, 25,179,
- 23, 8,212,184,239, 17,114,235, 9,236,178, 14, 70,240,240,168, 94, 3,139, 50, 87,118, 92,142,248, 9, 51,137, 61,152, 39,110,
-105, 83,178,100,201, 2, 32, 17,101,187,177, 64, 66,118,143, 9,237,214,139,128,139, 64,139,245, 7,222, 76, 53, 91, 63,238,252,
-255, 12, 14,216, 97, 17,165, 80, 90, 32,165, 5, 75,246, 0,203,254,158,253,115, 31, 72,125, 0,109,206,158,197,245,164, 33,224,
-132,190,141,150,131, 15, 51, 5,180, 70,141, 26,101, 8,104,177,240,232, 48, 53,219, 14,109, 45,227,182,140,145, 31,210,164,218,
-135, 75, 49,169, 42,228,234,135,106, 6,252, 31,108,230, 35, 29, 1, 45,128,181,205,176, 9,184,232, 40,241,158, 11,250,161,101,
- 12,111,123, 69,158,108,201,252, 78,123,111,146,249, 83,219,203,220,201,109,101,246,196,214, 50,115,220,239, 82,174,108, 73, 69,
-253,115,224,192, 1,193, 74, 92,246,236,217,163,172,252, 1, 26,116,129, 22,190,249, 22, 7,210,108,223,125, 39,189, 32,125, 75,
-151, 36,137,172,233,209, 21,234,193,191, 20, 53, 33,213,133, 84, 27,122, 79, 28, 36, 29,170,150,147, 6, 37, 10,203,214,126,189,
-229,230,210,197, 46,129, 86,216,136,209,118,140,158,177, 90,106,180, 29, 43, 63,148,236, 40,105, 74,182,151,164,153,203, 74,226,
-244, 69, 36, 89,198, 98,146,169, 68, 83, 41,214,104,132,148,110, 54, 70,154,245,157, 39,127,254,181, 76, 34, 71,143,179,195, 76,
-125, 49, 47,129,214,204,133,107,165,119,255,145,138,228,144,210,146, 72,209,227,217,236,180,126,109,239,233, 18,104, 1,216, 42,
- 64,107,235,214,173,150,157, 59,119, 90,192, 59, 11,248,104, 57,124,248,176, 50,201, 66,165,107,129,100,194,130,137,147, 26, 38,
- 93,160,197, 58, 58,229,189, 49,120, 29,141,111, 37,158,229,203,216, 64,166,170, 58,100, 89,105,183, 99, 6,104, 17, 64, 81, 26,
-236, 12, 72,113,211, 2, 39,118,158, 93,241,146,118, 86,170,141,214,201, 19, 39,222,114,176,112,101,163,245,112,126,237,247, 78,
-108,180,156,190, 70,171, 70, 84,213,137,206,206, 58,187, 17, 21,195,119,128,159,119,252, 54,130, 44,128,158, 87,184,118,146, 9,
- 96,224, 53,175,179,253,163,159, 82, 5,202,235, 46, 13,228, 33,161,218, 5, 96,110,129,244, 69, 1, 89,148, 92,169,146,172,242,
-229,203, 91, 22, 44, 88, 96, 1, 64,180,120,121,121, 89, 46, 95,190,172,128,111,168,153, 97,135,109,232, 96, 0,250,189, 72, 79,
-145,158,105, 18, 37, 56,249, 85, 10, 21,170, 53,152,177,253,164, 69, 42,213,108, 50, 95,143, 42, 84,109, 61,192,207,147, 56,159,
-193, 24,183, 1, 64,228, 10,165, 59, 60, 56,230,162,190,105,159,165, 85, 65, 58, 37, 73,160, 69,155, 44,173, 20,139,116,170,215,
-170, 34,117, 26,252, 34, 13,154,212,147,166, 45, 26, 99,209,210, 66,218,117,108, 45, 67, 70, 12, 50, 4,180,192, 71, 5,104,173,
- 89,179,230,210,146, 37, 75, 46,205,153, 51,231,210,136, 17, 35,174, 34, 0,188, 2,180,178,102,205,250, 30,128,213, 7,182,170,
-151,176,112,185,132, 58,223,239,172,144,248,190,231,251,206, 61,149, 82,191, 14,127,247, 77,252,220, 47,160, 26,252, 3, 51, 86,
- 18, 35, 59, 17,237,108,180,108,175, 96,159,216, 63, 99,178, 28, 95,190, 88,188, 22,205, 83,164,171,236, 75, 76,187,198,141,148,
- 93, 99,135,203,202, 14, 45,185,104,127,228, 6, 90,122, 45,242,159,127,223, 17,200, 98,169, 85, 80,244,225,231, 7,245,161,250,
-219,254,236, 12, 92,217, 63,195,231,236, 37, 90,214,255,197, 66,192, 41,215, 54, 90, 78, 62,204, 20,208, 26, 62,124,184, 75,160,
- 5,155,138, 54, 52,130,116,148, 40, 37,226, 32,204,131,198,240,248,192,212,102, 62,146, 64,107,202,146,195, 35,112,238,195,223,
- 76,185,114,229,186, 79,122,148,196,105, 15, 26,177, 19,124,153,161,255,169,121,115,103, 77,226,231,125,112,141, 76, 25,221, 92,
-254, 26,210, 72, 70,245,111, 32,195,250,214,145, 62, 93,171,201,224,190,245,197,179,251, 47,210,171,115,117,233,222,190,178,116,
-106, 85, 65,218,181, 40, 35, 63,124, 23, 55, 40, 71,230,132,239,114,101, 77,244,220,209,251, 9,180,218,183,111, 79, 59, 4,155,
- 40,149,141, 70, 47,113,227,130, 43,245, 20,118, 22,222, 90,190,249,136,228,255,197, 83, 50,148,239, 46, 89,138,214,193,202,158,
-182,230, 31,142,140,133,235, 74,153,230, 99,165, 98,171, 9, 82,187,203, 12,153,184,120,143, 68,137, 22,251,150, 51, 30, 69,141,
-147,104,115,204,132,223, 95,140,241,109,202,139,209,227, 37,191, 24, 45, 78,146,139,116,231, 16, 35,126,138,199, 81, 99,198, 3,
- 72,139, 45, 69, 74,148, 17,136,157, 8,172,164,109,143, 33, 82,175,101, 79,233,246,231,104, 67, 64,139, 19,169,171,111,230,100,
-203, 3, 19,157, 75,137, 22,235,200, 11,117, 52,121, 84,115, 25, 51,232, 67,253, 12,232, 89, 83,122,183,253, 89,250,253,129,186,
-234, 82, 83, 58,213,206, 47,109,170,231,150, 86, 77, 75, 73,179,250, 69,165, 64,166, 68, 65, 89, 51,124,251, 46,123,134,248, 14,
-235, 72,203, 19, 78, 22, 80,209, 56, 5, 82,188, 79,240,102, 4,104, 89,193,150,178,235,240,151,146,217, 70, 12,254,189, 98, 7,
- 71,169, 75,245,108, 35, 92,236, 58,252,212,102,109,228,249,195,180,205,226,161,170, 11,173, 6,240,202,179, 80, 79, 93,161,106,
- 14,224, 88, 0,140,148, 13, 55, 0, 19,138,228,200,217,129,231, 31, 64,149,105, 33,216, 82, 85,134, 4, 93,216,113,102,153, 60,
-121,178, 13,100, 81,146, 9,187, 71, 11,164,104, 22,208,164,132, 60,212,142,114, 85,234,205, 36,208,250,185,122, 99,103,187, 89,
-109,239,130, 73,193, 37,136,254, 5,198, 68,130, 50, 74,187,118,237, 20, 73,185, 10,180, 10, 22, 44, 40, 0,206,175,241,192,116,
- 36,151, 18, 61, 2,173, 89,179,102, 5,147,104,113,179, 18,105, 96,124,165,138, 79, 0,106,165, 70,141, 26,138, 4,158,246,158,
- 6, 84,135,251, 33,249, 83,128, 22,120,117, 9, 64,245,210,184,113,227,174, 0, 4, 63,175, 93,187,182,162, 58,172, 83,167, 78,
- 32,254,251, 15, 29, 58,244, 26,164,197,122, 64,235, 21,129,214,224,165,215,197, 35,113, 17,238, 40, 12,132, 68, 75, 55, 33,223,
-107, 87, 64,139, 32,171,109, 52, 15, 37,209,110,142,137, 42,236,174,241, 34,202, 31,137,162,201,174,145,131,130, 1, 45,183,234,
- 48,212,154,251, 23, 37,228, 12,100,177, 16,246,224, 41, 52,128,150, 14, 77,179,223,254,105, 54, 90, 70, 84,135,131, 6, 13,114,
- 9,180,160,102,107, 19, 12,241,216,253,161, 90,133,110, 29,232,222,193,236,215, 17, 88,249, 62,126,183,133, 96,139,182, 90, 76,
-133,139, 22,127,200, 45,234, 84, 71, 66,218,109,179, 65, 99, 69,234, 0,173, 24, 88, 1,143,134,196,196,144,123, 7,230, 99,126,
-148,217,169, 29, 72,174, 44, 73,252, 14,238, 89, 33, 35, 7,212,151, 65,189,107,202,203, 23, 15, 12,165,103,143,174, 74,214, 12,
-241, 29,185,121,160, 84,240,214,162, 89,107,164,117,195,222,210,170, 65,175, 96,169,109,163, 94,210,190, 73, 47,153, 59,101,137,
-146,248,155,215,152,207,179,203, 40, 73,150, 36,137, 83,169, 9,128,214,237,197, 27, 14, 73,161,186, 3, 37, 91,229,222,146, 58,
-223, 47,146, 52,125, 97, 91,109,101, 45,222, 80, 42,181,158, 40,213,218, 79,149,134, 61,231,202,248, 69,123, 37, 74,244,216,180,
-131,113,120,196, 78,148,234, 34, 31,158,178,246,164, 66, 99,233,214, 19,202,121,199,161, 51,202,249,244,197,235,202,121,252,140,
- 37, 18, 46, 98,180,231, 46,252,104, 5,163,143, 9,204, 7,143,217, 84,133,148, 96,168,170, 66,168,118, 45,176, 93,178, 92,189,
-122,213,130, 1,215, 66,123, 30, 61,160,149, 43, 75, 98,191, 3,187,151,203,136,254,245,164, 95,207,234,134,234,135,245,168,212,
- 81,250,111, 29,214,145, 61,208,162,109, 35, 93,111, 56, 98, 20,175, 99,215,148,211,251,234, 51,159,226, 67,203,110,215,161,217,
-110, 22,146,252,135, 9, 46,217,231,160,226, 85,118, 41,219, 3, 45,170, 40,169,138, 36,200,162,109,148, 30,208,130, 17,245, 3,
-214, 43, 1, 20,248,169,212,243, 53,128,233,149,209,162, 89, 46, 79,153, 98,129, 74, 95, 81, 23,243, 58,108,200, 44, 48,104, 15,
-125,160, 85,185,238, 44, 2,173,138,213, 26,204,213, 97,202, 72, 74,107, 47, 52,104, 32, 75, 49, 79,120, 98,199, 42, 19, 22,129,
- 54,160,197,223,189,122,245, 82, 22,160,232,211, 28, 67,237, 55, 8,217, 94, 65,208,196,221,133,170,141, 86,205, 58,213, 96,143,
- 85, 59,216, 72,218,161,115, 91,233,218,163,179,252,209,183,135,140, 24, 61,204, 8,208,218,135,118,119,105,211,166, 77,138,218,
-112,234,212,169, 87,202,148, 41,243, 26, 26,138, 32,173, 49,252,152, 49, 99,130,224,215,240, 53,128,216,117, 87, 18, 45,140,223,
-126,139,246,220, 83,128, 86,138,124, 13,149,186,231, 65, 19, 19, 21, 96,242, 63, 64,156, 84,171, 86,205, 86,118,130, 49, 87, 64,
-235,232,194,185,193,128, 22, 65, 22, 77, 14, 8,178,254, 76, 25, 71,118,193, 30, 13, 42,234,215, 84, 27,194, 24,254,134, 19, 99,
-248,144,180, 97,247, 51, 95,144, 3,161,101,163,101, 7,160,114,171,255, 63,224, 53,231,210, 48,222,183, 74,180,244,252,230,133,
- 26, 87,148, 78,192, 65, 80, 15,104,117,238,220, 89,160,195, 15,177, 68, 11, 43,177, 32,116, 94, 58, 10,108, 29,146,210, 59,146,
-104,101,200,144,225, 60, 0,213,117,179,170, 67,130, 38,184,107,192, 24, 99,219,108,102, 27, 12,120, 13,182, 33,138,107, 7,138,
-173,185, 26,167,113, 47,220, 62, 4, 90,193,150,195,226,231,204,156,216,111,247,182,197,210,175,123, 53, 72,173,202, 43,147,248,
-169, 3, 19, 12, 37,103,147, 56,129,214,250,213, 94, 50,180,223, 10, 25,242,231,114,135,105,254,172,221,194,164,189, 63,113,244,
- 6,151, 18,173,112,145,162,239, 26, 60,113,185,212,235, 60, 89,242,212,236, 39, 5,235, 12,146,244,133,254, 63,152,231, 44,221,
- 68,170,119,152, 38,181,187,206,146,246, 67, 87, 74,159, 49,203, 36, 90,204,120, 78, 85, 51, 4, 90,253,231,123, 75,249,174,203,
-164,100,155,153, 82,184,233, 95,146,175,238, 32,201, 81,173,135,100, 42,215, 70,210, 20,109, 36,223,229,173, 46,139, 86,109,113,
- 41,193,178,103,172, 10,180,168, 42,100,231,112,150, 96,108,173, 0, 45, 72,138, 92, 74,180,114,102, 78,228,183,107,235, 34,241,
-236, 86, 85,186,182, 45, 23, 42,117,164, 45, 51,129, 20,141,199,157, 1, 45,250, 67,131,161,177,240,236,170, 15, 56, 3, 90,170,
- 58,145,103, 87, 96,204, 17,109,171,170,208,169,179, 82,251,221,134, 58,234, 66,237, 43, 20,213, 33, 38,190,183, 4, 89,220, 64,
- 3,245,222,155,166, 77,155,222, 96,130,228,228, 29,129, 22, 65, 22,236,139, 12,169, 14, 97, 8,191,155, 42, 67,238, 46, 36,144,
-162,234, 24,230, 6, 10,200, 90, 22, 54,172,229,234,180,105,150,235,215,175, 43, 0,155, 64,140,246,123,104, 43,187, 93,240, 52,
- 47,238, 81, 93,168,236,222,180, 38,254,230, 53,222,251,232,168, 80,181,254, 28, 2, 45, 72,182,230,232,140, 87,126, 52, 7,160,
- 57, 4,141,253,185, 24, 37,208, 34,232, 32,192, 98,226,111, 21,128,209, 62, 19,244,156,214, 63,129, 22, 23,163,180,203,162, 61,
- 86,225,194,133,165,100,201,146,228,169, 84,169, 82, 69,177, 31,173, 95,191,190,128,183,138,253, 44, 1,156,158, 68, 11,117,185,
- 23, 54,105, 54,160, 53,105,210,164,171,144, 94, 41, 42, 67, 0,161, 32,254,230,153,255,127,254,249,231,247, 24,235,124,116, 84,
-135, 87, 41,201, 74,158,183,190,120,196,205, 42, 13, 0, 50,177,179,148, 11,104, 37,241,183,253,255, 95,127,253,149,247,222,187,
- 2, 90, 84, 23,170,146,172,246, 49,194, 72, 23, 72,178,122, 37,142,206, 93,183,202, 24,204,241, 24, 99,190, 80,146,229,194,189,
- 67, 72,166, 23,247, 51,255, 16, 14,160, 9, 42,128, 73,147,180,187, 11,121, 79,221,117,200,223,106, 94,154, 3, 16, 93,105,159,
-213,222, 87,105,216,211,194,166, 89,211,135, 26,235, 80,171, 66,212, 37,114,145,182, 19, 4, 21, 80,191,124,100, 12, 15,177,191,
-210,153,233,150, 96,192,128, 1,138,216, 26, 20, 13,171,228,208, 89,243,215,235, 80, 87,198,109, 29, 43,121,139,230,121,130,103,
-181, 62,181,190, 1,144,104,144,242,251, 20, 27, 75, 84, 46,244,178,196,207, 5, 61, 93,149, 54,148,141,225,239, 18, 80, 97, 85,
- 44,233,210,165,115,184, 67, 76, 53, 6,230,125, 26,196, 83,229, 67,201,150,179, 50,230,200,148,200,111,235,134,121,210,181, 77,
- 89,105,221,180, 88,168, 76,226, 4, 90, 35,134, 77,149, 12,233,114, 75,186, 52, 57, 29,166, 34,133,202, 10,147,246,126,195,186,
- 29, 93, 27,195,135,139,208,163,122,227, 46,111, 70,207,222, 34,133,234, 13,150,130,181,250,202,119, 89, 75,216,192,102,186,220,
-229,164, 90,155,191,164, 97,175, 5, 50,116,230, 78,169,209,180,219,107,216, 91,113,183,134,195,131, 64,235,185,229,141, 60,246,
-127, 37,143,159, 91, 20,160,245,232,233, 11,121,248,196, 95, 30, 60,126,174, 0,173,107, 55,239,202,165,107, 55, 67, 4,180,104,
-143, 67, 9, 6, 54, 16, 40,187,204,232, 79,137, 19, 45, 86,233, 22,216,191, 41,147, 45, 38,115, 93,160,197, 58,218,178, 97,174,
-116,105, 93, 70,126,111, 82, 56, 84,234,200,202,144,248, 0,121, 43, 0, 54,158,179, 31, 57, 0, 82,184, 20, 95,185,207, 77, 16,
- 33, 1, 90,246,126,181, 92,129, 45, 71,149, 68,227,119, 86, 48,219, 61,119,193,114, 82,227, 34, 66,117, 90, 74,201,129,186, 43,
-150, 82, 55,131,206, 75,213, 87,101,192,214,254,167,180, 69,164,225, 59,109,178, 8,174, 84, 27, 27,238,236,163, 36,235,251,239,
-191, 55,106, 12,239,137,133,144, 63,202,169,108,122,224, 38, 8,110,128,160, 36,139, 32,139,146,173, 39,176,219, 98,221, 19,140,
- 97, 87,244, 83,216, 70, 57, 29, 63,192,171,211,148, 52,170, 78, 74, 89, 30,126, 43, 39,112,124,192, 81,123,126,161,126, 18,244,
- 30, 50,235,232, 22,239,231,239,179,102,207, 51, 92, 15,104,209,120, 29,230, 16, 2,181,230, 71,128, 75, 5, 88, 84,247, 65, 26,
-163, 0, 16, 61,160, 69, 63, 89,181,234,213,128, 61, 86, 93,249,181, 69, 35,105,217,186,185,180,237,208, 74, 58,117,109, 47,221,
-255,232, 42,189,255,252, 67,250, 15,250, 83,134, 12, 27, 36, 99,199,143, 54, 2,180,246, 64,250,167,168, 14, 87,175, 94,125, 9,
-229,188,138,221,192, 10,208,226, 25, 82, 40,238, 14, 86,254, 3,200,189,199,238,114, 31,140, 61, 78,109,180, 8,150, 32,117,244,
- 35, 32, 68,187,167, 77,162, 34,169,227,247,193, 29,134,192,104, 93,208,222, 88,223,108, 71, 52,180,151,210,165, 75,179,156, 15,
- 92, 1, 45,182, 23, 85, 93,168,130,172,126,223,197, 85, 64, 22,235,142,247, 49, 15,188,132, 61,217, 84, 23, 14, 75,117, 39, 61,
-119, 6, 55, 7, 62,129, 3, 33,138,117,152, 10, 47,220, 6,253,188, 2, 36,232,118,128,187,144, 40,221,226,174, 67,238,148,163,
- 93, 22,125,181, 96, 7, 8, 7,136,237, 72,124,198,232,241, 77,238,194, 57, 31,206, 60, 56, 81,154,245,106,196, 78,162, 58,191,
- 36,200,154,217,101,100,115,217,116, 99,134,226,119,107,214,158,161, 95, 12,104,209,219, 58,213,152, 4, 81, 70,128, 22,243,112,
-112,230,115,206, 62, 60, 91,198,132,126,235, 87,205,148, 86, 77,138, 72,195, 90,121, 67,101, 18, 39,208, 82, 39, 43, 78,142,174,
-124,157, 5,211, 45,224,143,142, 11,129,200,240,113,229, 51,120,242, 42,233, 52,116,137, 20,168,222, 77, 14, 30,246,178,145, 56,
-116,196, 91, 42,183, 24, 42,189,199,111,146,254, 19,215, 74,212,152,113, 40, 41,114,234,222,129, 64,235, 89,128,107,160,229,115,
-203, 87, 46,126,236, 9,222,101, 59, 2,191,125, 80, 40,197,224, 29, 25,157, 74,180,104, 40,205, 93,135,122, 18, 45,214,209,186,
-149, 51,228,183, 70,133,164, 65,141, 92,161, 82, 71, 40, 87, 54,248, 51,122,200,190,195, 54,117,251,246,109,251,118,146, 13,246,
- 53, 15,185, 67,138,247,233,183, 9,187,218, 76, 73,180, 52, 32, 75,217, 41, 7, 80,164,236, 66,116, 6,182, 28, 49, 21,238, 28,
- 46,178, 45, 57,114, 59,241, 9,206, 75,149, 87, 65,210,235, 69,224, 66, 23, 14,220,240, 65,233, 14,199, 16,173,186,144,187,120,
-185, 9, 4, 59, 73, 13,185,119,192,164,124,155,245, 74, 64, 77,144, 69,181, 49,219, 1, 36, 51,150, 71,247,239, 43,224, 26, 64,
-201,130,247,232,185,119,136, 8,227,250, 55, 4,146,246,174, 92,120,173, 82,174,176,210,172,100,196, 23,141, 75,198,122, 88,182,
- 82,157, 57,144,100,205,237, 61,108,246,209, 13, 71, 30,189, 30, 51,115, 11,221, 59, 84,210, 25,236,110, 47, 92,184, 80, 96,219,
-164,248, 9,163,170,140,110,112,200, 3,158, 85,128,197,241, 19, 0, 65,177,181, 2, 61,167,106,120, 74,167,134, 12, 25,162, 0,
- 50,168,247,148, 50,211,223, 31,199,104,142,201, 92,252,114, 92,238,212,169,147, 98,159, 69, 32,103, 64,162,181,135, 42, 67,140,
-227,151,186,118,237,122, 9, 59,168,175, 66,173,247, 26,146,177,247,176,245,122, 7, 16,116,139,103,128,197,247,240, 33,248, 26,
- 11,107, 67, 64,139, 14,158, 41,113, 43, 94,188,184,178, 11, 18,106, 71, 74,196, 20,183, 57, 80, 67, 42, 54,100,148,190,177,220,
-156, 67, 80, 15,126,122, 64, 75, 85, 23, 82,146, 69,144, 53, 40, 77, 66, 5,100,169, 64, 75, 99,223,168, 23,162,199,232, 28,229,
-206,231,230,128, 25, 14,132, 72,162,165,190,160, 46, 58,235,253,105,211,166, 41,254,179, 56, 96,210,115, 58,255,179,227, 64,183,
- 78, 67,211,250, 78, 74,227,210,241, 26, 6,170, 9, 19,183, 12,149, 41,219,135,203,247, 63,124,191, 23,171,159,116, 88,249, 76,
-233,133, 93,121, 4, 88, 19,214,123, 74,189, 54, 85,196, 78,162,245, 17, 77, 39,170,195, 11, 38, 84,135, 54,154,148, 76,113,210,
- 49, 42,209,162,218,131, 19,164, 3,137,150,141,102,214,244, 9,238,111, 94,191, 80, 6,121,254, 46,158, 61, 27, 72,192,115, 95,
- 67,106, 67,170, 23,237, 84,135, 54,154,224,211, 45, 74, 27,207, 98, 82,229, 68,166,213,109,187,250, 77,196,100, 7,180, 28,213,
- 81,129,132,201, 82, 61, 25, 48, 97,133,244, 25,189, 68, 74,212,104, 45,133, 42,181,148, 34, 85, 91, 73,185, 58, 29,164,207,216,
- 21,242,231,120,248,227, 74,158,154,146, 72, 71,222,225,109, 52, 9,180,158,250,191,118, 46,209, 42,210, 72,174,222,184, 35,227,
-224,210,193, 46,228,142,125,147, 10, 86, 78, 2, 45, 26, 69,115, 87, 33, 13,222, 57,201, 82,149, 68, 85, 33,183,245,211, 80, 90,
-221,157, 6, 62, 89,208,182, 28,169, 14, 53,117, 20,223, 86, 71,125,187,215, 15,149, 58,130,154,112, 33,235,134, 0,139, 96, 2,
-246, 45,148, 88,217,118,104,242, 62, 23, 49,108, 63,148,140,206,158, 61,155, 64,203,209, 14, 78, 91, 57,237,213,130, 4, 85,244,
-171, 69,144, 69,240, 66,163,115,208,226,206, 62,170,171, 62,138,139,168, 97,170,141, 38,218,195, 38,103, 49, 14,185,141,222,153,
-243, 82, 7, 42, 68,135, 14, 75, 9, 50,176,205,159, 91,241, 31, 97, 75,254, 91, 0,160, 32,246, 27, 24,135,191,135, 84,227, 41,
- 65, 22, 85,104, 40,155, 81,135,165,101,225,140,244, 1,213,131,172,103,218,108, 81,146,217,187,119,111, 11, 22, 61,138, 36,139,
- 32, 11, 19, 47,199,166,178, 14,198, 38,181,156,145,160,138,124, 77, 73, 9,125, 5,114,108,163,196,142, 19, 58,251, 86,253,194,
-225, 20, 39,165,109,171, 38, 22,170, 10,153, 40,201, 34,200,130, 52,107,130,157,119,120, 71,223,222, 0,237,212, 66, 48,193,239,
- 35,176, 34, 40,162,211, 99,128, 91, 69,202, 67,128, 69, 67,118,124, 15,119,100,114,209, 0,159,166,182, 35, 24, 77,130,166,209,
-216,101,215,172,229,175,210,170,237,111,210,190, 83, 91,233,210,163,147,244,236,221, 93, 60,177,163,120,224,144,254, 50,108,228,
- 16, 25,253,215, 72, 25, 63,105,156, 76,157, 62, 89,215, 97, 41,234,112, 15,190,247, 18,218,143,146,208,127, 46, 1,188, 94,135,
-154,215, 7,106,217, 96,137,215,192,231, 43,104, 19,220, 41,174, 61,108,229, 84, 37, 90,116,250,204,239, 34,200,162,182,131,160,
- 16, 59, 25,149, 40, 35,116, 5, 4,181,177, 2, 54,169,230,236,210,165,139, 35,160,101,163, 73, 0,181,115,236,136,143,212,133,
- 4, 88,127,229, 76, 45,147, 10,164,151,189, 67,251,216,111, 36,161, 7,121, 53,244,142, 90,214,255,178, 35,208,175,229,219,205,
- 0,155,127, 93, 94,110, 63,158, 2, 7,112, 65, 20,255,211,161, 39, 36, 42,180, 99,160, 67, 56, 71,161, 77, 12, 53,108, 76,126,
- 57,107, 52,255, 57,104,253,245, 89, 50,126, 67, 63,105,216,161,186,140, 90,254,135, 2,178,134,204,239, 42, 73,147, 39,157,139,
- 60, 41,156,117,106,245, 58, 6,139,214,215,239, 62,255,200, 24,158,160,194,224,174, 67, 91, 35,164,173, 21,252,240, 4, 82, 36,
-205, 29, 83, 60,115,117,203,193,152,147,162,234, 84,148,170, 16, 78,160,244,185,211,183,111, 95, 71, 54, 90, 54,154, 89,210,199,
-159, 82,182, 68,230,215,126,190,215,229,233, 35, 31,217,186,246, 47, 89, 58,187,135,203,180,122, 97, 31,169, 88, 42,195,155,220,
- 89, 19,159,116, 52,240, 98,194,222, 15,191, 55,111, 29,217,146,217, 75,176,180,255,177,125,251, 45, 6, 46,120, 42,112, 60,152,
-255,255,114,184,130,145,162,196,188, 85,189,113,231,183,125,199, 44,129,209,251, 30,153,176,120,175, 98,147, 85,243,215,174,111,
-163,197,140,115,203, 35, 92,184,130, 78, 90,122, 48,160, 85,165,207, 38,216,104, 45,213,216,104, 13,148, 28, 85, 97,163, 85,182,
-181,164, 1,208, 74, 95,164,174,180,198,110,195, 8,145,163,187, 10,243, 18,108,160,160, 3, 82,168,184, 20, 21,161, 86, 85,200,
-137,150, 54, 60, 12,203, 66,176, 65,105, 22,243,129, 95,142, 28,150,126,214, 58, 2,104, 58,197,141, 24,148, 4, 99, 98, 9,178,
-174,184,109,158,244,241, 13,167, 8,140, 56,201, 99, 2, 10,178,218,111,185,244,180,111, 15,158, 84,137, 22, 37, 89,164, 5,201,
-142,226,242,193,128, 68,203,208,192,203,208, 59,108, 63,148,152, 18,124, 80,165,200,126,193,126,224, 64,133,232,136,166, 18,130,
- 7,206, 72,169,134, 83, 66,240,176, 79,210, 15,157,213,240, 61, 3,248,192,240, 60,102, 67,240,148,194, 55,222,129, 84,253, 57,
- 37, 90, 0, 9, 22, 44, 48, 20, 55, 31,152,184,159, 65, 66,114, 7, 52, 75,233,180,207,136, 0, 90,111,184,128,228,194,202,222,
- 73, 41, 37, 90,191,150,136, 96,105, 88, 34,214,195,114, 48,128, 47, 91,185,238,108,170, 11, 49, 38, 85,195,152, 19,207,217,184,
- 4,190, 68,196,248,152, 15,121, 26,227, 60, 16,210,155,187,180,191, 35,224, 66,200, 25, 5, 88,192,117,130, 34,229,201,153, 51,
- 39, 65, 6, 29,206, 50,114, 65,124, 87, 99, 29,129, 22,220, 44, 40,246,176,170,218,145,103,140, 63, 74,226,111,222,235,223,191,
-191, 80,242, 69,151, 59,122, 33,120, 80, 62,186,213,185,132, 5,219, 37,180,157, 75,176,193,162,250,208,105, 34, 24,211, 3, 90,
-216,240,224,199,112,101,180, 31, 35,200,162, 79, 47, 26,251, 83,250, 70, 95,132,227,225, 0,152,188,160,109, 86,139, 22, 45,132,
- 54,190, 14, 36, 90,193,129,214,152, 97,210, 43,105, 12,233,151, 42,158, 77, 93,200,118, 56,185, 64, 6,153, 81, 44,155,236,251,
- 24,104, 57,170,122, 67,109,222,228,236,237,166,105,146, 97,238,236,250, 28,200, 15,253, 55,195,174,248, 35, 21,210,207,174, 31,
- 74, 0,131, 81,183, 54,253, 27,217,212,132, 91,111,207,146, 63,167,183, 23,216,103, 45, 4,125,251, 88,136,124,229, 71, 13, 27,
- 19, 88,122,208,105,171,186,118, 80,221, 59,152,216,117,168,165, 25, 90,187, 14,131,149, 19,146,169,141,185,179, 38, 13,202,157,
- 45,121, 32,128,151,211,132, 93,134,239, 41,197, 98,178, 3, 89,246,223, 30, 13,224,225, 32,165, 83,102,146, 21,100, 69,211, 7,
- 90, 74,142,200, 17, 34, 69,239, 25, 53, 70,156,189,145,163,197,188, 23, 5, 41,122,172,111,247, 2,128,245,228, 61, 23,245, 31,
- 12,104, 93,189,251, 92, 1, 90,151,111, 61,146,210,191, 79,144, 43, 55,239, 75,245,182,163,229,250,109, 63,249,181,203, 8,185,
-121,199, 79,114, 23, 46, 27, 24, 62, 74, 76,110,113,119,118,216, 75,180,198,195, 14,228, 5, 93, 55, 16, 76, 49,209, 22, 75, 5,
- 86,148, 98,209,169, 37,207,204, 7, 94,185, 12,193,195,151,254,191,142,146,133, 74, 29,193, 86, 37, 7, 12,177,207, 32, 93, 1,
-152,216,128, 87, 36,211,126, 28,239,227,250, 25,168,204, 28,222,119, 84, 71,142,164, 84, 54,191, 90, 86, 73,150, 65, 27, 45, 67,
- 19, 4,193,148, 51,181,162,131,248,135, 70,104,134,102, 80,233,216,176,191,234, 7,254,237,135, 52,232, 17, 19,248,185, 31,223,
-223, 15,188,115,229,155,202, 86, 78, 58, 34,165,119,122,170,119, 41,125,228,228,173,170,225, 65,227, 35, 27, 45, 35,237, 19,224,
- 58, 45,104,121, 2,240,159, 35, 77, 0,184, 87,144,100,237,135,179,213,245,144, 14, 6,209,193, 51,165, 61, 0,226, 92,172, 98,
- 67,162, 83,119, 54,193,248,249, 57,130, 74, 67,226,182, 8,146,212,115, 0,206,151,232,230, 65,155, 84, 41,151,246, 12,155,184,
- 75,120,102,139, 29, 31,130, 73,180, 8,180, 8,244,104,140, 79, 27, 94,170, 6,233,243, 15,170, 73, 5,100, 18, 88,105, 19, 85,
-157, 0,188,246,170,195, 96, 64,107,163,103,119,184,112, 24,136,221,133,253,109,246,125,108,151,251,134,246, 85, 64,214,222,126,
- 93,117, 93,163, 56,154, 59, 12,204, 97,122, 89,140,180,121, 61, 26,246,247,255,203, 52,205,242,202,157,223,104,195, 6, 80,168,
-149,234,199,239,247, 21,255,185,224,139,180,233,127, 56,132,255,212,177,107, 3,140,106,153,105,168, 17,154,116, 88,106,136,166,
-201, 26,117,211, 4,195,254,239, 71, 43, 5,252,104, 37,181,249,209,138, 28, 51,254, 69, 56, 40,189, 24, 49, 90,156,139, 17, 34,
-199,188, 20,209, 53,200, 34,235,237,249, 25, 7, 3,254,120, 76, 86,215,232,186,129, 54, 88,106,162,154, 80, 77,148,100, 89, 65,
-150,203,160,210, 38,235,214, 85,246,207, 90,239,161,184,235,208, 80, 57,169, 30,116,166, 86,196, 61,167, 19,238,223,192,207,111,
-240, 78, 38, 35,135,246,219, 77,239, 58,116,242, 2, 27, 77,168, 20, 35,209,230, 20,169, 9, 36, 70,157,144, 26,161,173, 38,180,
- 62,151, 11,231,181,214,196,223,127, 91, 91,178,190, 56, 10,202,182,216, 62,222,161,179,255, 88, 52,236,196,115,193, 22, 12,218,
-190, 73,213, 97,164, 8, 17,188, 1,128,253,212, 4,169,154,159,154, 0,108,253,212, 68, 41,150, 45, 69,137,226,109,103,163,101,
-227, 39, 3,146, 83, 26,172,151,172,129,203,255,110,126, 26,105,127,122,121, 12,245, 77, 61, 34,118,247,191, 22,154, 38, 63,235,
- 31,149,221,222,143,150,190,167,248, 80, 42,254,215, 82,185,238,114,134, 82,133, 91,201,184,249,233,230,103,104,113,192,221,150,
- 66,139,147, 31,232,184,249,233,230,103,104,113,224,115,180,165,208, 42,219,223, 65,199, 13,180,254, 1, 43,199,208,168,248,207,
-209,176,221, 52, 67,163,102,254, 79,195,205, 79, 55, 63, 67,139, 3,238,182, 20, 90,156,116,131,204,175,165, 45,133,110,141,127,
- 89,106,246,187, 14,249,223,118,176, 2, 28, 37, 51, 69,116, 70,195,213,117, 61,250,110,154,142,235, 37,164,245,229,230,167,155,
-159, 70,219,128,187,111, 58,231,128, 81, 30,106,243,185,249,233,230,167, 35, 14,252,151,219,146, 94,159,112,223, 55,193,129,175,
- 5, 69,187,203,105,162, 82, 13,100,117,243,211, 0,147, 76,100,113,243,211, 4,179, 12,100,117,243,211, 0,147, 76,100,113,243,
-211, 4,179, 12,100,253, 47,243,211, 0,123,254,177, 89,220,170, 67,157,170,249, 47, 55,108,247,183,135,110,191,117,243,211,205,
-207,208,226,128,187, 45,133, 22, 39, 63,208,113,243,243,159,207,207,208, 45,225,151,165,246,233, 64, 43, 90,194,244, 25,190, 77,
-153,117,118,156,100, 89, 78, 50,241, 55,175,253, 71, 1, 76, 20,124,119, 93,108,215,222,138,221,109,207,241,187,131, 3, 62,252,
- 27, 58,117, 76,124, 87, 13, 36,110,151,175,138, 20,213, 96,187, 53,244,237, 69, 60, 60,194,213,242,240,104, 5, 15,141, 55,153,
-248,155,215,156,188,195, 16, 77,131,229, 83,179,125, 17,154,158,109, 19,231,223,179,177,238, 70,158, 29,149,207,179, 83,226,120,
-135,182,212, 28, 59,168, 85,146,184,161,244,237, 49,176,107,108, 42,119, 97,226,124, 3,105, 38,232,198,178,163,253, 69,190,221,
-100,125, 56,202,238, 46,103, 40, 48, 81, 67,194,205, 79, 55, 63, 67,139, 3,159,163, 45,133, 86,217,254, 14, 58, 46,109,180, 60,
-224,232,175,136,213,155, 56,230,185,143,143, 56, 41, 50, 55,205, 83,172,218,165,109,123,143, 93, 62,123,233,214,221,147,231,111,
-248,172,220,176,215, 59, 83,190,114,231,121,207,197, 23,185,170,136,111,224, 85,190, 54,182,247, 46, 68, 58,101, 77, 11,121, 13,
-244, 92,109,211, 14, 70, 19,147,201, 30,134,163, 49,147,240,140, 83,207,198, 6,106,167, 38,226,117, 5, 48,126, 25, 61, 27,195,
-185, 41, 61,173,211, 57,162,253,225,244,219,227,196, 73, 29, 35, 90,226, 76,125, 98,125,151,115,127,204,164,153,252, 99, 36,205,
-232, 31, 35,121,206,253,209, 18,103,244,228, 61, 19,252,164, 63,171,203, 72,116,244,217,197, 64,217, 93, 78,100, 13,179,123,188,
-171,147,197, 67,152, 26,229,240,120, 15,231,173,219,224, 16,114, 23, 98,161,237,130,223,155, 93, 49, 98,196,216, 12, 2,157,145,
-126,208,121,151,161, 14, 72, 96, 53,238,167,159,222,251,175, 94, 45,126, 29, 58, 72,143,152, 49,223,241, 90, 8,192,198, 55, 17,
- 34,120,212, 76,146, 36,252,188,196,137,195,159, 79,146, 56,252,133,164,137,195, 47,136, 16, 33,108, 29,208,114,228,139, 77,125,
-133,145,114,214, 69,102,198,240,100,226,111,189,227, 35,154,237,203, 38,218,120,100,251,160, 0,158, 29, 61,220,235,247, 84,157,
- 14,110,239,124,157,231, 16,124,187,253, 35, 81,225,206,226, 58,226, 0,190, 99, 88, 31, 38, 56, 8,125,143,107, 55,145,145,192,
-217,204,183,235,125,171,225, 54,143,140,145,195,133, 9,211, 57,106,196,136, 91, 35,133, 11,119,159,137,191,121,141,247, 76,180,
-121,179,101,114,217,230, 67,131,152,149,134,145,182,100,246,117,110,154,102, 57,230, 58,191,155,159,255,112,126,234, 97,145,208,
- 45,254, 23,166, 70,144,197, 87,170,103,237,235,163, 37, 72,151, 49, 95,137,234, 23,158,249, 91, 94,249,248,220,121,210,177,213,
-192,173,205,219,141, 88, 53,114,218,186, 13,187, 15,159, 59,148, 33, 79,233,179,204, 99,114,130, 72, 1, 95, 42,222, 0, 42,111,
- 49,137, 43, 1, 92,233,213, 26,193, 98, 5, 65, 76, 95,241, 30,232,217,123,132,119, 56, 65,208,183,202,133, 29, 91,228,246,201,
- 99,114,195,235,176,192, 73,165, 18, 24,151,233,236,166,117,114,114,205, 10, 57,190,124,177,226,213,154,137, 1,115, 17,254,226,
-174, 93,121,141,118,192, 36,153, 50,101,122, 67, 62, 49,164, 8, 29,237,193, 91, 62, 99,203,181,118,240,253, 14,105, 70, 75,144,
-166, 88,140,164, 89, 31, 52,237, 62,225,237,250, 3,155,229,204,181,227, 72,151,100,233,182,115,210,168,243, 95,111, 99, 36,205,
-246,128,121,244,248, 9,199,140,249,224, 60,214,230,244, 29,249, 25,172,245,133, 54, 1, 16,190,208, 38, 4,117,125,129, 96,174,
- 87,224,111, 38,135,163, 9,151, 0, 75,206, 46, 80,210, 31,133, 61,232,189,251, 16, 94,176, 75, 77,112, 8,186, 11,113,209,118,
-193,203,243, 46, 60,239, 42,206,155, 33,126, 82,138, 69,144, 5,183,232, 34, 69,138,200, 57,124, 3,175,233,125,187,221,253, 84,
-137, 18,133, 63, 62, 98,120,243, 55,171, 87,207,146,141, 27,215,203,134, 13,235,100,213,202,153, 50,102,116, 43,120,193, 15,127,
- 26,249,127, 52, 65,147, 18,181,129, 72,163,144, 40,185,188,168,198,250,228,111,235,181, 81, 0, 46, 35,241,219,145,244,205,246,
-237,148, 96,117, 0,184,250,165,220, 79,226,255,236,174,240,204,255, 90,201, 86,217,212,169, 99,180,249, 57,203,131, 51, 94,243,
- 2,121,230,127,163,109,201, 46,159,226, 71, 10, 11,142,137,112, 42,169, 4, 1, 86, 15,246,137, 57,115,230, 4,162,205,204,114,
- 84,239, 78,120,147, 22,223,120, 3,126,147,130, 5,138,143,159,181,106,129,244,133, 26,244,141,151,177,114, 17, 19,229,204, 19,
- 57, 66,132,219, 91,151, 76, 10,124,116,243,148,188,121,233, 39,207, 46, 31,147,219,231, 14,201,156, 41,163,222, 69, 12, 23,142,
-241,253, 28,121,196,231, 43, 12,181, 37, 39,223,224,236,178,155,166, 73,134,233,100,119,243,211,205,207, 80,225,128, 43, 44, 18,
- 42, 47,248, 59,137,104, 99,227,217,151, 35, 94,138,172,243, 55,239,242,186,232,115,253,206,227,243, 39,206,251,182,105,210,107,
-205,111,191, 13, 88,216,160,221,152,201,163,103,109,156, 63,125,225,134,181,204, 99, 98, 34, 75, 1,112,226,135,176, 41, 74, 48,
- 80,196,167, 19,134,167, 96,156,183, 89,179,102, 9,226,105,201, 28,156,147, 37, 77, 74, 48,228, 8,108,217, 75,180,252,110,159,
- 60, 46,109,163,123, 40,137,161,114,212, 40,239,234, 53,158, 25, 74,135,137, 96, 11, 17,227, 67, 10,180,106,116,128,228,133,252,
-130,116,231, 25,202,215, 13, 41,169,209,111, 39,128,250, 46, 91, 49,203,230, 35,199,228,222,147, 0,185,121,255,153,236, 57,121,
- 78, 14,156,123, 32,135, 46,242,247, 69,153,181,106,129,164,206, 94,248,101,212,111,211,148,113, 53,145, 1, 44, 94, 70, 44, 50,
- 89,188,120,177,146, 8, 88,141, 28, 12, 53, 2,135,138,148,130,169,135,141,159,246, 64, 11,177,223,130, 1, 45, 72, 71,118,193,
-211,245, 46,196, 22, 36,208, 26,227,162,205, 26, 26,120, 9,170, 40,201, 34,200, 2,210, 15, 9,208, 74,149, 51,103,202, 7,247,
-253,246, 65,178, 56, 89, 16,192,153,222,161,149,196, 0,189,147, 38,254,133, 80, 49, 71,165, 80,161, 31, 30,162,172,105, 13, 2,
-131,129,140,227, 9,176,194,248,149,119, 16, 24, 55,144,109,134,241,217, 32,185,124, 15,224,113,135,193,145,225, 56,148,239, 33,
-216,178, 63,108,223, 78,117, 33, 37, 89, 4, 89, 60,120,230,127, 94,167,154,144, 18,172,230,229,179, 61, 28,213,191,131,188,121,
-237, 47, 35,251,181,151,166,229,179, 63,228,117,170, 19, 29,213,145, 71,141,165, 97, 51,151,242, 68,168, 22, 79, 85, 82, 71,128,
-197,223, 74, 74,152, 56,201, 93,109,128,113,246, 51,198,240, 99, 28, 68, 72,141,181, 32,214, 85, 29,165, 69, 48,225,135,164, 3,
-239,239,247,181, 31,152,165,196,175,253,159, 62,127,241,188,115,191, 73, 75,226,103,168,146,197,238,227, 29,209,204, 83, 48, 95,
- 78,127,127,223, 11,242,226,210, 22,121,235,191, 93,222, 6,236, 16,239, 63,235,200,177, 17,109,228,141,197, 71,110, 95, 59, 37,
-233,210,252,192,104, 19,185, 13,214,209,167, 14,151,134,218,167,201,151,184,105,154,100,152, 78,118, 55, 63,255,131,252,116,133,
- 69, 66,151, 29,127, 3, 53, 87, 40, 50, 78,242,204,103, 79,158,247,185,213,238,247, 1,155, 58, 54,237,189,186, 71,167, 17, 75,
-250,244,159, 54,191,239,216,101,211,134, 78, 94, 51,105,251,190, 83,203,152,199, 96,177,191,161,180,138,129, 91, 25,242,130,146,
- 44,134, 81, 96,192, 93, 6, 27,101,176,234,158, 8,207, 48,125,220, 95, 50, 99,252, 56, 78, 12,148,108,185,244,246, 76,137, 22,
- 37, 89, 90,160,165, 70,121,183, 7, 90, 4,118,156, 52,225,233,218, 30,104, 25, 44,190, 71, 14, 70,159,103,188, 71, 76,228,148,
-100,229, 51,250, 32, 85,130,177, 82,100,126,184,233,240, 46, 89,187,127,150,108, 59,186, 85,238, 60,122, 45,151,238, 4,200,206,
- 83,143,101,224,204, 57,242, 75,219, 82,210,107, 88, 51, 25, 51,173,159, 36,252, 49,211,179,216,177,191,215,170,122,130,189, 10,
- 82,169,123,140,205,198, 88,122,148, 6,146,135,140, 31,199,224,196,199,143, 31, 23,196,127, 83,226, 60, 30, 60,120, 80, 16, 36,
- 86,154,182,255, 83, 26, 33,190, 24, 3,248, 34,220,197, 61, 71,229,166,234,176, 67,126, 15, 69,154,213,175,124,220,215,120,254,
- 16,193, 21, 19, 36,129,187, 64,139, 0,139, 32, 67, 15,104, 25, 98, 11,213,132, 61, 98,197, 10,164, 36,139,169,195, 55,223, 4,
-186, 80, 29,218,211,252, 38, 65,130,240, 39, 30, 62,216, 43, 79, 30, 77,145,213, 43,190, 67, 80,222,111, 40,153, 85, 82,184,112,
-223,200,146, 69,153,228,233,147,217,136, 85,121, 68, 18, 37,138,192, 54,234, 74,141,168,210, 31, 85,165, 74, 21,217,185,115,167,
- 48, 80, 51, 99,250, 33,126,158, 48, 72,238,194,133, 11,109, 49,241, 24, 90, 4, 15, 80,234,229,244,160,228,138,234, 66,173, 68,
-139,255,121,157, 54, 89, 84, 23,158, 62, 58, 63,144, 32,139, 7,207,167,240,159,215,121,223, 25,225,177, 11,246,151, 43,223,108,
-212,239,137,115, 52,207,110,253, 38, 70, 81, 64, 74, 29, 49, 81,210,239, 44, 4, 72, 84, 25, 18,124,179,111,111,218,180, 73, 86,
-172, 88, 33, 8,141,226, 80, 90, 8, 41, 88, 11,216,113,221,101, 66, 56,155,129, 0,148,247, 40,197,227,161, 2, 45, 85,146,149,
- 32, 83,165, 14,235,183, 29, 60,236,123,255,209,131, 92,101, 91, 14,143,149,181,114, 44, 23, 44,136, 28, 37, 98,196,219, 47,238,
- 93,148, 39,251, 39,200,219,167,231, 65, 49, 80,222,191,189, 41,123,218,253, 44,235,234, 21,145, 3, 35, 58, 97, 12,184, 35, 87,
-206,159,148, 72,225,195,223, 0,173,136,134, 26,143, 59,147,155, 3,110, 14,252,235, 56,224, 10,139, 96,240,200,137, 84,193,154,
-242,226,156,199,250,155,103,245, 94, 73, 77, 30,230,181,255,175,205,203,251,218,255,218,223,164,159,203, 74,171, 44,206,206,236,
-103,181,117,160,218,104,105,109,181,254,127,223,213,199,197, 77,145,245,192,177, 51,215,174,118,241,156,182,242,226, 5,159,107,
- 99,255, 90,186,108,250,162, 45,139,239,248, 61,186,178, 98,203,145, 57, 59, 14,156, 94,200, 60, 70,106,156,246, 87, 83,167, 78,
-125, 71,192, 67,144,197,131, 19, 25,129, 1,131,162,118,235,208, 94, 58,252,218, 88, 90,213,172, 38,139, 38,142,151,134,213,171,
-190,178,218,108, 57, 37, 79,160, 69,213,136, 42,201,210,130, 43,190,131, 82, 44,190,175,103,234,132,226,153,237, 7, 57, 56,111,
-198,167, 0, 45, 15,196, 83,219,176, 96,193, 2, 89, 13,149, 23,212,112,207, 80, 48,103,106,211, 96,101,166, 77, 86,215,209,127,
- 4, 30, 57,183, 83, 58,141,174, 44,107,247, 46,149,167, 47,222,201,201,107,254,178,235,244, 99,169,211,225,103,169,213,174,182,
- 84,104, 82, 94,134,141,239, 44, 13,219,214, 10,140,145, 40, 83,127,103, 31, 14,160,229, 71, 48,181,126,253,122, 89,181,106,149,
- 34, 97,161, 84, 8, 42, 34,153, 48, 97,130,192,182, 74, 6, 12, 24,160,128, 87, 6,153, 77,158, 42,131, 2, 64, 40,173, 97, 92,
- 49, 23,245,117, 8,192,237, 16,212,184, 74, 66,160, 89, 69,138,213,166, 77,155, 93,205,154, 53, 83,128,150, 53,141, 49, 82,231,
-174,242, 64,127, 25, 62,119,244,232,247,246,173, 92, 25, 52,184, 94,189,247,121, 99,196,240, 41,226,220, 24, 62, 24, 41,218,100,
-205,157,211,246,245,171,151,199,229,242,133,116, 72,105,164, 71,183,111,109, 64,171, 99,135,228,226,115,181,152,220,184, 86, 94,
- 44, 1, 7,160,234,237,242, 38,106,212,176,141, 12,148, 57, 74,152, 48, 97,110, 33, 62, 91, 16,121, 72, 73,150, 10,178,200,103,
- 74, 17,113, 14, 66,156,194, 91,160, 69,213,162,238, 65,117, 33, 37, 89,157, 42, 38,222, 7, 0, 53, 97,146,103,170,140,148, 88,
- 81,114,213,170, 98,150, 7, 54,137, 22, 36, 91,144,104, 61,224,117,103,134,241, 69,138,120,134, 91,182,227, 66,169,181, 7,110,
-253,209,180,247,162, 41,137,242,180,232,239,241,125, 14, 2,242,240,145,126,252,165,105,209,114,181,159,108,217,178, 69, 81,145,
-159, 56,113, 66, 1, 90, 44, 51,212,189,129,232, 75, 90,213,161,173,220, 8,193,114,151, 11, 16,246,151,188,121,243,190, 32, 48,
-103,159,225, 1, 85,180, 34,209, 82, 37, 89,157, 60, 39, 44, 73,157,175,238,160,171, 55,238,220,222,178,199,203,251,219, 76,149,
-203, 58, 99, 0,237,175,182,111, 88,240,254,253,155, 51, 18,248,246,170, 4,220, 58, 45,167,134, 54,145,131, 61,107,203,171, 23,
- 39,144,206,203,179, 39, 23,101, 76,201,124, 50,161,118,117, 25,220,178,197, 59,240,190,189, 46, 67,221, 25,220, 28,112,115,224,
- 95,201, 1, 29,160, 85, 65,157,127, 48, 62,247, 32, 8,226,127, 21, 88,169,191, 53,115,148,114,207,254,191,246,154,253,179, 90,
-154,124, 7,159,205,159, 63,255, 66, 92,119,102,126,162,173, 7,117,215,161,249,208, 59,177,147,101, 30,180,104,245,246, 83,219,
- 15,156,241, 26, 62,105,245, 34,255, 23, 47,159, 6, 88, 94, 63,219,123,228,226,234,211,151,110,109, 28, 51,121,222, 6,230, 49,
- 82,235, 52,124,167, 20,198,199,199, 71,177,161, 34,200, 58,118,236,152, 28, 62,124, 88,186,182,107, 43,237, 26, 55,148,223,170,
- 86,146,102,165,138, 74,191,198,245,101,116,143,174,148,106, 49,184,180,211,131, 64,139,180,156,169, 11, 57, 97, 48,253,153,253,
- 71, 25, 82, 56,135, 28, 90, 48,203, 44,208,170,140, 85,254, 33, 20,160,151,181, 16, 41,147, 38, 77,250, 0,182, 74,178,104,209,
- 34,137, 30, 61,250,121, 92,143,164,247,253,137,179,102,245, 90,189,103,137,204, 90, 55, 74, 86,239, 94, 37,151,239, 90,228,216,
-149,231,178,237,196, 35, 89,188,231,158,140, 89,125, 83,122,204,190, 44,191,143, 63, 45, 13, 59, 55,150,158,195,250, 74,140,100,
-185,248, 94,135, 7,129, 22,165, 20, 90,160, 69,137, 11, 13,244, 57,177,222,189,123, 87,177, 87,163, 90,118,230,204,153, 74,112,
- 87,130,217,126,253,250,233, 1,173, 93,104, 84,187,160,106,178, 37,168,159,118,213,171, 87,207, 6,180,216,122,173,141, 87,239,
-179,131,221,135,196,164, 7,118,105,158,196,249, 12,226,160,109,128,141,217, 21,216,188, 41, 19, 58, 59, 24,234,242, 6, 30,112,
- 21, 12,216, 70, 47, 73,162,240,115,239,220,217, 44,190,119, 90, 43, 32,139,233,202,197, 12,178,111,119, 38,217,191, 55, 23, 64,
- 86,113,185,113,189,188,220,244,169, 42, 15,252,250,201,237, 91,171, 36,105,210,112, 43,116, 10,172, 24,190, 23, 42, 84, 40,144,
-129,134,199,141, 27,199,239,124,195,107, 76,173, 90,181,122, 15,181,169,210,102,161,186,125,111,189,174,107, 32,175,238, 58, 28,
-208,249,199,217,251,183,180, 58, 57,236,143, 12,127,170,229,160, 77, 86, 51,168, 11, 41,217,106, 85, 49,171, 51, 27, 45, 77,177,
- 61,195,212,106, 63,169,200,162, 45, 23,250,110,240,186, 63,202,115,234,174,101,113,179, 52, 90,235,145,180,116,238,116, 37, 59,
-239,222,125,242,161, 95,178,239,211,189, 25, 63, 97, 98, 16, 37,113,243,231,207,151, 10, 21, 42, 16,192,216, 27,195,219,104, 2,
-104,249, 17,104, 81,138, 69,245, 61, 37,163, 76,129,129,129, 2,187, 62, 5,104,125,155,185, 82,245,117,219, 14, 28,186,235,247,
-240,126,194,108,213,250,140,159,181,106, 51,127,199,207, 92,137,113, 73, 29, 30, 52,118,127,254,248,154,188,123,189, 23, 18,182,
-119,114,162,127,125,217,219,190,146,108,250,181,148,188,125,125, 69, 94,188,184, 46, 15, 31,249,200,156, 46,237,165, 77,170,239,
-100, 30,218, 39, 36, 96,220,112,225, 62,220, 28,112,115,192,205,129, 96, 28,208,130, 32,206, 63,206,128,150,221,117, 69,162,165,
-230,215, 3,103,142,222, 97, 5, 99,206, 76,132,180,101, 36,192,178, 79,198,106, 49, 94,188, 52,209,147,164,201,123,234,248,185,
-107, 87,246, 30,189,176,123,238,210,141, 91, 55,108,221,119,224,246,189,199, 7, 79,157,189,114, 56,241,143,121, 78,235,236,148,
-179,189,136, 59, 11,253,253,253, 21,117,215,217,179,103, 21,187, 17,236,142,146,253,176,203,106,219,160,190, 52,175, 84, 81, 1,
- 89,173,138, 23,146,238,229, 75,201,188, 1,125, 9,180, 78,185, 42,169, 10,180, 28,169, 11, 85,144,197,119, 14, 43,154, 75,198,
- 84, 44, 38, 71,150,206,151, 52,105,210, 24, 85, 29,230,204,147, 39,207,155,219,183,111, 75,201,146, 37, 57,233,198,178,150, 37,
-115,134, 12, 25, 94, 81, 13,199, 40,244,184,214, 66,143,155,223,231, 73,247,242,228,229,211,114,232,194, 99, 57,117,221, 95,142,
- 92,122, 38,155,188, 31,201,252,157,190, 82,180,250,119, 82,176, 2,236,138,172,233,231,118, 61,101,240,130, 19, 18, 61,113,230,
- 0,103,116, 9,180, 90,180,104, 33,185,115,231,150,236,217,179, 75,150, 44, 89, 36, 93,186,116, 10,160,242,243,243, 83, 84,134,
-107,214,172, 81,212, 94, 4, 49,197,139, 23,167, 93,153,242, 29, 58, 18, 45, 69, 85,168, 7,180, 66, 2,182, 96,223,116, 73,126,
-255, 93, 36,125,122, 41, 80,160,128,180,107,215,142,155, 31,108, 64,139,118, 85, 80, 45,191,198, 55, 79, 71,162, 90,204,233, 1,
- 3,248,115,111,223,250, 42, 82,171, 15, 32, 43,163, 92,189,148, 19,234,195, 48, 10, 8,188,116,161,172,220,242,169, 38,183,111,
-214, 5, 24,107, 11,169,214, 81,193,174,196, 43, 58,245,164, 24,190, 19,116,236,221,187, 87,145,100, 33,255, 69, 79, 79,207,214,
- 35, 71,142, 92, 14,160,250, 6,103,233,213,171,151,180,111, 15,123,170,166, 77, 9, 68, 94,232,213, 61,239, 55, 47, 17, 59,230,
-208,118,121, 79, 31,219, 55,194,127, 88,187,188,167,126, 47,242,109, 52,245, 57, 3,187, 14,131,189, 34,117,217, 54, 17, 43,180,
- 24,213,110,230,186, 11,227,214, 29,121, 52,103,234,154,115,155,191, 43,212,102,247,226,237, 87, 47,205,223, 19,112,225,215, 49,
- 62, 39,138, 86,104,248, 60,249,247, 63,190,139, 24, 37,214,203, 48, 97, 35, 44,209,180,221,143,138,139,122,241,227,226,135,118,
-105,127,252,241,135,114,166,234,148, 18, 46,168, 17, 21,160,149, 50,101,145, 72,165,235,116,155,248,220,223, 18, 80,185, 81,207,
- 25,245, 90,247,159,195,223, 63, 85,110,251,151,198, 94, 44, 24,109,238, 44,124,251,250, 30,128,214, 62,121,124,114,187,236,237,
- 80, 89, 54, 52, 44, 38, 75, 42,231, 19,127,255,235,242,224,225, 13,185,121, 23,106,196, 13,155,164, 81,130,132, 50,177, 85, 59,
-225, 51, 70,248,233,206,227,230,128,155, 3,255, 45, 14,104, 37, 81,174, 36, 90,118, 96,137,136,204, 16,208,178,151,116,169, 18,
- 45,235,187,156,109, 80, 51, 94, 9,122, 91, 42, 99,124,155, 33,117,225,242,117, 47,223,245,123,114, 97,235, 94,239,205,199,207,
- 94,218,251,204, 63,224, 66,169,159, 27, 93,136,150,232,135,116, 70,223, 68,208,116,227,198, 13,236, 12,219,168,216, 57, 29, 60,
-112, 64,246,109,219, 38,187,215,172,146,166, 21,202, 74,115, 43,200,234,243,115, 25,153,217,178,177,236,159, 62,217, 16,208,226,
-238, 66, 85,101,168, 85, 23,246, 74,155, 84,250,231, 76, 39,195,138,229,150,128,128, 0, 37, 81,250,101, 16,104,125, 11,201,213,
-221,171, 87,175, 42, 18, 12, 76, 70,199,173,223,201, 93, 97, 84, 23,174, 29, 59,118,172,162,138,195,239, 17,122, 60,136,251,125,
-134, 23, 94,231, 79,201,146, 29,222, 50,120,246, 20,153,186,122,187,204,218,118, 71,134, 44,189, 46,101, 27,148, 8, 6,180, 74,
- 54,170, 35,189,103,157, 54, 4,180, 8,176, 0,250,248, 77, 52,114, 23,242,119, 57, 36, 93,213,234,181,148,172,121,138, 74,237,
-218,117, 20, 27, 29, 2, 48, 72,145, 92, 2, 45,218,104,209, 62,107, 68, 25, 15, 25, 87, 35,222, 43, 21,108, 57,146,104, 41,232,
-200,156,100,107,100,197,138, 21,229, 66,131, 6,178, 20, 64, 8,224, 69, 73,185,114, 81, 13,254, 65,162,197,223, 4, 49, 80,115,
- 1, 20, 37, 33, 95, 29, 25,155, 43,172, 78,148, 48,252,185,149, 43,151, 11,118,198,217,212,133,139, 23,102,178, 1,173, 77,235,
-139,219,174, 67, 34, 9, 73,205,116, 67, 64,139,182,131,148,100,209,109, 7, 37,132, 4, 90, 80,193, 46, 86,191,215,254,140,141,
- 21,148,120,185, 60, 58,212, 72, 26, 57,103,234, 36, 61,187,254, 94, 91,174, 94,220, 46, 60,231, 73,157,188, 7,175,243, 65,170,
- 9,105,147,101,103, 0,239,146,102,172,148,141, 98,229,168,210,119,248,172,141,151, 23, 45,217,251,104,249,142,211, 1, 71,119,
-157,123,121,177,253,236,103, 7,199,172,127,113, 97,221,145,103,119,146,228,111,179,211, 35,121,165,244, 32,228,210, 54, 13,110,
- 60,252,168, 46,164,132, 22,146, 75,219, 6, 11, 74,239,176,144, 9, 49,208,138, 28, 62,252,253,103,151, 14,203,201,193, 13,229,
-249,157,237,242, 58,224,180, 88,252,207,203,195,123,103,196, 51,211,247,210, 54, 89, 66,105,158, 36,145,252, 89,169,186, 28,240,
-190, 44,135,188, 46,184,129,150, 94, 99,114,223,119,115,224, 95,204, 1, 87, 88, 36, 36, 18, 45,178,202, 12,208,178,207,107, 15,
-218,116, 88,239,218, 97,169,145, 45,149,113, 83,100,217,117,233,250,173,163, 80, 23,174,190,118,235,193,198, 27,183,125, 15,240,
-154,153, 58,167, 26,112,237,218,181, 50,105,210, 36,233,222,173,155,116,110,211, 74,186, 54,107, 42, 93,234,213,150, 37, 67, 7,
-200, 90,164,109,195, 7,202,158,161,125, 97, 36, 59, 72, 54,141, 30,106, 72,117,120,106,237, 74, 27,208, 82,109,178, 40,197,234,
-159, 59,189, 2,178,198, 86, 42,161,128, 44,139,197,162, 0, 45, 35,198,240, 0, 37, 91, 41, 21,162,173, 75, 3,128,131,172, 89,
-179,190,206,156, 57,179, 5,106, 37,169, 89,179,166,162,130,163, 68,142,103,240, 64, 87,162, 5, 63, 89,251,230,110, 56, 37, 35,
-231,142,149,178, 13,211, 74,177, 26, 41,165,203,132, 77,210,110,202, 69,105, 56,252,128,148,110,246,155, 13,108, 85,238,177, 88,
- 26,121,174,209, 85, 29, 54,111,222, 92,145,100, 17,104,225,155, 20,160, 69, 59,162,170,245,219, 72,235, 94,227, 37,103,174,194,
-146, 37,193,183,242, 7,212,178,176,141, 19,216, 21,185, 4, 90,246,187, 14, 97,235,115,136, 96,139, 64,171,126,253,250,187, 32,
-209, 81,108,180,236, 15, 94, 51,208, 14,252, 40, 93, 35, 79,105, 79, 54,104,208, 32, 5,104,181,109,219, 86, 1, 88, 76,252,173,
- 2, 48,168,233, 72,211,169, 45, 25, 84,135,243,150, 46,157, 76,253,185, 13, 80,149, 45,147, 64,206,156, 42, 35,103, 79, 85,146,
-230,205,210,217,174,163,238,100,208,192,238,134, 85,135,220, 93, 72,208, 65, 59, 60, 72,220,222,117,235,214,237, 13,191,121,240,
-224,193, 54,154, 84,195,242, 72,150, 44,217, 19,103,223, 62,103, 84,150, 36,195,254,200,212,103,104,219,188, 39, 9,174,182,172,
-157,169, 60,179,101,237, 12, 5,108,241, 58,239, 79, 27,154, 57,169,103,251, 88,177,118,172,174, 54,188, 91,243,216, 78, 55, 64,
-216,189, 39, 76,148, 52,181, 18,103,255,185,215,146,213,135, 30,110,152,185,253,241,230,126, 75, 31,237,232,189,248,217,209, 13,
-222, 1,119,190, 47,214,105,143, 71,138,178,217,172, 32,203, 37,208,130,164,211,143,187,126,167, 76,153, 2, 96, 94, 91, 81, 31,
- 18,108,114, 7, 48,212,138, 10,208,138,159,177, 82,149,144,168, 14,239,122,237,144, 3, 93,107,202,149,181,227,228,245,203,171,
-176,153,188, 38,119,110, 67, 69,158, 40,158, 52,249, 54,158, 52, 76,144, 72, 86, 46, 92, 43,123,143, 93,151,213,107,118,186, 85,
-135, 6, 58,146, 59,139,155, 3,255, 86, 14, 24,181,209,178,218, 77, 85, 80,165, 78,156,131,172,146,167, 18, 58, 18,173,220,246,
-146, 43,103, 64,204, 58,175,217,232, 26,224,185,189,141, 86,112,224,101, 96, 75,229, 55,217,178,164,188,220,180,126,161, 87, 77,
-106,231,127, 81,190,196,247, 79, 43,149, 73, 31,192,107, 6, 94,110,203, 66,195,118, 24, 85,191,226,251,218,255,214, 92, 90,214,
-170, 41, 77,202,148,148, 22,144,100,109, 31, 55, 74,118,142, 28, 36,187, 6,245,149,107,171,123,203,217,185, 99,100, 96,243, 38,
-111,141, 24,195, 31, 95,177, 68, 1, 90,237, 99,133, 85,236,177, 8,178, 20,117, 97,241, 60,242, 87,149, 82, 50,181, 65, 53, 5,
-100,193, 15,148, 10,180,124,117,202, 29,181, 82,165, 74, 65,156, 20,185,123,139, 96,139,244,104, 7, 70,219, 39,170, 89,184,187,
-175, 99,199,142,148, 18,209,249,105, 4, 61, 62,208, 24,190, 78,187, 81,111,183,123, 93, 1,200, 74, 33,133,126, 78, 42,173, 38,
-158,149,134, 35,207, 72,213, 1, 39,165, 68,143, 3, 82,176, 98, 82, 41, 92,229, 7, 25,182,196, 75,242, 87,239,254, 70,207, 24,
- 94, 5, 90,233,161,138, 83,129, 22, 93, 61,228, 44, 84, 65,114,229, 45, 41, 69, 1,190,126,249, 49,165,180,135, 26,150, 82, 57,
-240,210, 52,208,130, 42,109, 23, 84,145,187, 48,249,238,130,253,151, 67,160,101, 80,178,165,216,148,209,209,235,228,201,147, 63,
- 2, 92, 42,192, 2,223, 1,136,146, 74,209,162, 69, 93, 2, 45, 24,195,215, 26, 57,162,249,155, 97,195,134, 9,253,137,177, 83,
-180,111,247, 35,212,133,213,161, 46,172, 39, 99,199, 20,177,129, 34,186,228,232,214,181,250,187, 40, 81,194, 54,209,171, 39,220,
-143, 66, 23, 14,220,113, 72, 96, 72,169, 14,193,180,179, 3,121,157, 2,173,163, 59,106,143,161, 77, 22,213,133,148,100,105, 15,
-254,231,117,222,103,190, 86,149,226, 52, 61,180,253,207, 71,109,113, 54, 80, 70,102, 81,220, 58,196,205, 88,191,106,195,238,115,
-182, 44, 61,240,108,103,239, 69,143,182, 46, 59,100,185,210,176,231,146, 99, 17,190,175, 78, 79,254,220,141, 72,144,229,114,231,
- 46, 22, 64,119, 41,157,165, 20,143, 42,113,110,246,224,134, 10,218,251,193,197,133, 2,180, 50, 21,109,210,155,110, 29,204, 26,
-195,111,156, 50,226,189,247,216, 94,178,169, 67, 29,121,250,236,186,220,243,187, 33,151,175, 94, 81, 64, 86,131,132,137,165,123,
-185,170,178,203,235,154,236, 1,208,234,217,189,223, 91,183, 49,188,193,218,119,103,115,115,224, 95,200, 1, 87, 88, 4,227,167,
- 2,146,172, 41, 31,206, 9,145,212,157,135,188,206,251,225, 53,249, 20,119, 49, 46,254,171,207,168,116,121, 86,127,107,119, 43,
- 42,116, 13,176,219,181,141,150,158, 68, 11,171,218,132, 77,155,212, 32,236, 0,240, 8,148,115, 94, 67,101,223,250,134, 82, 36,
-255, 15,156, 20,139, 24, 40,128,154,229, 27,186,108, 88, 48,103,182,252, 53,176,191, 52, 46, 93, 66, 1, 89,109, 96,147, 69,144,
-181, 23, 6,224, 62,235,123,201,205, 13, 67,101,203, 96, 79,137,110,208,189, 3,129,144, 42,201,234,147, 33,133, 12,204,151, 81,
-134, 99, 39,147, 42,197, 34,200, 90,220,173,173,172, 26,240,135,156,221,190,153,160, 68, 15,104,121,192,200,253, 8,193, 20,129,
- 22,165, 43,229,202,149,147, 50,101,202, 80,178,245, 18,234, 42, 2,204, 45, 72,148,100, 25,113, 25,224, 65, 59,182,232, 73,178,
- 60, 24,191,252,184,252,181,104,131, 20,173,154, 70,234, 12, 58, 32,149,250,157,144,226, 61,188, 36, 79,135,195, 82,174,113,121,
-233, 55,246, 15,105, 55,114,189, 68, 79,146,245,145,142,123, 7, 63,123,160,133, 29, 98,210,165, 75, 23,169, 5,117, 97,214, 36,
-137,165,230,143, 41,100, 72,209,188, 50,111,112,127, 69, 29,164, 7,180,236, 61,195,227,219, 22, 80,146,133,221,107,187, 96, 63,
- 69,144,181,252, 67,187,253,255, 1, 63, 83, 4, 52,158,188,174,211, 14,110, 83, 21, 55,116,232, 80,105,210,164,137, 84,171, 86,
- 77,153,200, 41,225,226, 89, 5, 88,144, 16,145,199,138, 31, 44,208,163, 35, 75,103, 71,152,248,241,195,157, 94,176, 96,170,160,
-140, 18, 57,114, 56, 57,125,178,146, 2,178,238,220,106, 10, 67,248,150, 80,247, 70,145,242,229,203, 67,122,214, 85,190,141, 23,
-142, 6,237,206,194,251,104,223, 49,138,146, 74,110,218,128, 68, 43,136, 59, 98, 41,105,227,225, 72,162, 5,160,253,202, 89, 1,
- 41,169,114, 44,209,154,105,147,104, 13,237,153,126, 80,231, 90,223,118,171, 82, 60,223,123,250,217,226,185, 77,165,216, 45, 6,
-183,140,105,100, 83, 0,219, 94,216,232, 25,234,207,153,186,246,210,161,101, 7, 95, 28,159,178,246,250,229, 40,233, 27,114,119,
- 33,191, 85,245,175,229,178,106, 96, 23,215, 34,114,228,200,119,153,240, 61, 3,185,211,112,201,146, 37, 50,102,204, 24,218,245,
-169, 18,173,252,233,127,106,212, 51,126,198,202,157,204,184,119,136, 30, 37,242,109,223,155,231,229,241,195,107, 50,171,121,125,
-105,155, 34,137,180, 68, 59, 61,122,242,170,236, 61,122, 73,214,108, 56, 32,127,100, 46, 35, 67, 74,213,145, 88,225, 35,112, 39,
-167,219,189,131,137, 1,213,157,213,205,129,127, 19, 7,244,176,200, 87,253,173, 6, 62,238,155, 31, 82, 37,147,157,107,251,201,
-206, 53,127,202,226,201,181,148,148,250,251,164, 92, 1,187,146,230, 56,114, 58,151,226,187,228,201,125,167,141, 30, 37,179,135,
- 15, 17,207,122,181,164,123,217,226, 80, 23, 14,144, 3,195, 7,200,233,153, 35,101,203,192, 62,146,245,135, 84, 84, 27,165,112,
-192,216,143, 28,150, 18,104,169,146,172, 65,249, 51,201,136, 82,249,101, 92,181, 50, 54, 41, 22, 37, 89,107, 6,245,150,205,127,
- 13,147,139,251,118,209,158,201, 30,104, 57, 42,103, 50,216,223, 60,126,242,228,137,178, 77,222,234,173,222, 85,120, 28,251,162,
-126, 68,147, 14, 75,147,164, 47,100, 25, 58,239,136, 76, 90,115, 66,154, 15, 89, 36,229,251, 30,147, 98, 0, 90, 85, 7,156,144,
- 65, 11,143, 75,171, 97, 27, 37,193, 15,249, 2,244, 28,150, 66,146,114,175, 79,159, 62,138,234, 80,149,104,193,221,132, 2, 82,
-184, 35,178, 59,212,178,173,203, 20,151, 89,131,250, 11,220, 51,192, 39,104, 17, 69,117, 88,167, 78, 29,123, 63, 90,174, 28, 3,
- 82, 34, 66,199,169,189,145,202, 91, 39,111, 5,116,168,128,203, 10,180,116,191, 29, 25, 26, 0,176, 91, 8,178, 8, 92, 8,172,
- 88, 22,218, 4, 97, 7,159, 34,197, 98,217,139, 21, 43, 38,105,211,166,133,173, 85, 4, 11,159,209, 16,118, 84,206, 31,243,228,
-249,254,225,210,165,211, 96, 95, 52, 89, 30,222, 31, 38,126,119,187,136,223,189,158,242,232,225, 56,120,135, 31, 7,201, 76, 31,
-201,147, 59,197, 35,208,113,228,134,195, 17,205,129,227,199,143, 87, 0, 43, 93, 56,192,143,212,123,170,142,157, 29,228,131,221,
-199,127, 68,147,182, 88,185,211,166,168,163,181,209,202,155, 38,121, 55, 94,223,190,166,234, 8, 74,178,180, 78, 77,249,159,215,
-117,190,157,183, 63, 56, 43,141, 87, 50,113,202, 66,173,183, 46,218,253,224,100,234,226,157,118,241,191, 6,100, 57,147,102,185,
-116, 88,138,250,184, 79,195,127, 44, 56,130, 25,167,171,146, 45, 51, 14, 75,243,228,204,241,226,234,165,115,114,233,252, 57,105,
-141,186,109,156,252, 59, 57,112,194, 71,118, 66,146,213, 47, 95, 53, 25, 88,180,166,100, 74,253, 35, 55,126,184, 29,150, 6,111,
- 76,110,167,157,161, 59,179,186,249,249, 15,231,167, 1, 44, 18,186, 95, 16,186,212, 92,199, 58,212,123, 23,165, 86, 93, 58, 54,
-177, 73,180,206, 30, 29, 44,123,215, 55,144, 34, 5, 82,235, 73,180,156, 53,108, 37, 4, 79,163, 42, 63,191, 26,213,169,189,204,
-233,221, 93,142,205,158, 38,155, 97,159, 53,164, 89,227,183, 86, 73,150, 35,144,197,162,126, 4,180, 8,164,232,248,148,233,232,
-146,249,226,181,124,145,120,173, 92,162, 0, 45, 38, 74,182,206, 64,146,117,118,247,118, 57,183,119,135, 32, 44,141, 81,207,240,
- 69, 33,201,194, 46,247, 64,129,163,210, 32,188,219,182, 83, 76,143,103,246,229, 84,243,171, 33,120, 74, 55,252,243, 77,219, 17,
- 27,197,115,246, 73,233, 57,237,184, 52,236,187, 74,242, 85,235,254, 6,146, 44, 67, 33,120, 48, 1, 30,230,214,125,238,218,164,
-167,114,238,128,164, 77, 13,109,139,184, 19,114,222,188,121,138,127,178,205,155, 55, 75,239,222,189, 21,149,221,168, 81,163,148,
- 93,101,144, 90, 28, 54, 48,137, 59,251, 68, 85, 37,199,251, 54,208,229, 12,108, 0,168, 68,132, 97,123, 62,216, 61, 53,198,121,
- 96,221,186,117,239,210,229, 68, 99, 56, 79,165,218,143,128,134, 96,145, 18,195,156, 57,115,210, 38,143,110, 19,198, 35,193,251,
-121,176,195, 89, 91, 74,141, 48, 59,167,230,204,110,253,250,214,205, 21,216, 93,120, 72, 2, 94,236,147,235,215,230, 34,194, 64,
-243, 55, 9, 19,132,167,163,210, 52, 78, 62,198, 17,205,143, 66,240, 16, 20, 58,147,104, 25, 1, 90,234,187,135,181,207,239, 69,
-117, 33,109,179, 84, 67,120,218,102, 81,109,104,147,104, 21,203,247,158,234, 67, 59, 91, 45,167, 19, 4,162, 44,164,192,174, 83,
- 0,248,226, 3, 35,167,174,114, 53, 81,250,210, 3,113,173,112,142, 28, 57, 82, 89,129,152,179,122,212,155,116,210, 2,236,222,
- 0,216, 12, 30,130, 39, 99,165,252,233, 10, 53,236,149, 48, 83,165,114, 14, 8, 59,163,153, 39, 74,164, 72,183,199,141, 26,243,
-110,197,164,105, 50,176, 70, 29,197,248,125,230,240, 41,210,183,104,133,192, 88, 17, 34,176, 63,186, 67,240,124,204, 80,189, 58,
- 50, 48, 12,125,148,197, 77, 51, 36, 92,115,254,140,155,159,161,203,207,175,153,154,107, 99,120, 35, 95,150, 58, 85,210,205, 21,
- 17,171,173,117,139,106, 74, 42, 83, 50,175,240,154,206,179,174, 26,161, 45,168,116, 52,236, 70,100,162,177,188,217,160,210,112,
-115,224, 69, 23, 15,102, 18, 36, 43,199, 12, 78,226,204, 86, 7,146,162, 91,176, 29, 25,109,132, 79, 70, 0,140, 26, 84,154, 6,
-242,209, 19,103,242,103, 10, 65, 80,233, 44, 4, 91,176,161,185,135,228,199,196,221, 99, 76,184,254, 16, 94,192, 3,194,133, 11,
-247, 10,233, 53, 38,204, 0,240,246, 33, 61,194, 91, 65, 86, 22, 35,229, 52,240,189,186, 64, 11,174, 60,210, 66,162,230, 9,251,
-182,115,148,172, 65, 37,247, 10,146,172,253, 40,215, 6,168,112,131,104,231, 70, 41, 22,234,145, 64,150,110, 8, 82,155, 0, 69,
-106,214, 48,145, 34,133,173, 11,247, 13,139, 16, 84,250, 98,226, 68,225, 47,225,247, 82, 56, 40,109,136, 12,148,202,133, 20,108,
-240,185,186, 80,165,189,253, 20,137,150, 13,104,253,145,169,215, 7, 63, 90,153,250,216, 23,168, 77,149, 56, 77, 40,201,226,217,
- 40,128, 1,192, 74, 13, 64,213, 11,105, 41,126,159,204,150, 45,199, 37,156, 15,225,255, 84,164,223, 51,102,204,152,236, 19,191,
-221, 64, 19, 8,150,197, 85,127,183, 5,149,142, 26, 46,220, 3,119, 80,105, 67,172,117, 79,226,134,216,100, 56,147,155,159,134,
- 89,101, 40,227,231,224,167,161, 23,255, 67, 51,133,220,143,150,253, 7,209,232, 26,215,244,236,113,212,199, 62, 71, 69,184,105,
-134,110, 43,251, 84,126,170, 54, 90,218, 82,217,104, 98, 39,100, 36, 72,179, 10, 32, 53,129, 68,171, 19, 82, 35,218,252, 89, 51,
-231,194,121,173, 53,241,183,171,227, 83,203,233,136,182, 33,154, 40,251, 49,168,106,253, 33,133,125,163, 26,222, 91,251, 0, 85,
-202,246,126,159,156,210,164,205, 22, 13,223,121,182, 47,140,103,155, 56, 49,184,235,144,103,163, 64,139,249, 40,209, 2,168, 42,
-138,115,109,164,150, 72,213,144, 10, 97, 23,231,247,184,237,202, 8,222,208,183,155,108,106,110,154, 38, 25,246, 79,109,243, 38,
- 63,195, 93,239, 38, 25,230,174,247,208,101,216,127,157,154,187, 3,134,110, 11,112,243,211,205,207,208,226,128,187, 45,133, 22,
- 39, 63,208,113,243,211,205,207,208,226,192,127,185, 45,133, 22, 15,255, 14, 58,161, 39,209, 50, 89,250,255,114,131,113,127,187,
-201,198,226, 94,229, 57,229,128,187, 45,185,219, 82,104,113,192,221,150, 66,139,147,110,128,253, 57,218, 82,232,214,206,223, 67,
-205, 97,172, 67, 50,203, 81, 50, 83, 68,103, 52, 92, 93,215,163,239,166,233,184, 94, 66, 90, 95,110,126,186,249,105,180, 13,184,
-251,166,115, 14, 24,229,161, 54,159,155,159,110,126, 58,226,192,127,185, 45,233,245,137,175,245,190,249,128,210,161,240,165,159,
- 3,241,186,105,134, 66,197,104, 72,184,249,233,230,103,104,113,192,221,150, 66,139,147,110,105,137,187, 45,253, 55,219, 82,232,
-126,245,151,165,230, 86, 29,186,213, 82,110,181,148, 3, 14,184, 7,243,208, 29,136,190, 58,126, 34, 28, 84, 88, 35, 41,108,202,
- 82,149, 99,101,170,117, 44,108,242, 50, 53,180,249,221, 11, 22,133, 3, 95, 93,189,135, 98,179,119,127,123, 40, 50,243, 63, 71,
- 42, 85,170,100, 25,127, 72,153,228,183,212, 41,146,181, 74,245, 93,210,230,169,227,124,188, 27, 42,121,242,228,177, 83,165, 76,
-222,144,121,152,151,207,216, 49, 74,175, 17, 70,132, 91,130, 78,112,205,176, 25,129,127,207, 97,103,215,102,184, 33,232, 4, 26,
-174,188, 67,235,209, 12, 73, 93,185,164, 9, 7,154,117, 16,108,184, 21,124, 66,253,138,120,135, 13,121,134, 47,168, 86,112,104,
- 90,199,197,203, 92,210,196,238,187,226, 8,246,220, 28,110, 3,154,147, 14,124, 93, 53,226,127, 94, 15, 1,205,140,216, 13,119,
- 28, 46, 40, 78,225, 89,173,235, 6, 35,188, 48,195, 79,188, 34, 76, 75,184,224,216,134,179,143,245,220, 18, 47,177,247,142,111,
-148,102,117, 60, 59, 11,180, 78, 51,241, 55, 18,175, 57, 58,254,118,154, 12,138,206, 20,154,229, 68,189,157, 98,250, 4,154,141,
-177,243,241, 32, 19,104, 52, 54, 82,225,214, 60, 54,126,202,228,244,146, 61,145,135,146,248,219,236,127, 51, 96,195, 25,253, 16,
-180,121,237, 35,229,225,248,150, 60,172,108,240,251,109,223,110, 4,100, 49, 79,210,124, 77,239, 44, 57, 26, 36,137,114, 55,190,
-102, 4,104, 97, 32, 44,149, 35,108,216, 9, 56,255,130, 50,113,247,103,120,140,111, 13,177,131,117, 38,199,185, 4, 9, 18,204,
-132, 43, 22,186, 31, 9,255,137,223,174, 60, 46,231, 60,226,188, 57,234,145,225,237, 97,143, 28,106,226,127, 94,183,163,111,180,
- 31, 25,100,165,146,205, 8, 77,142, 17, 29,144, 90, 35, 41,193,212,117,142,143,104, 50, 60, 19, 34, 71,236, 69,180,130, 77,152,
- 47, 54, 34,109,194,252,177,137,252,100,194,110,230, 45, 56,207, 53,194,207,104, 41, 60,210,197,205,240,141, 87,172, 31,191,217,
- 19, 45,185, 7, 3,175,123, 68, 79,238, 81, 0,191,167, 68, 77,238,177, 45,250,119, 97, 78, 69, 77,225,177, 9,169,115,244, 36,
- 30, 63, 26,161,169,247, 65, 38,238, 27,225,167, 74, 46, 37,126,208,245,208,106,107,218,128, 51,221, 23,205,224, 39,105,222,105,
-134,166,209,162,126, 14,154, 70,223,253, 79,204,103, 47,209,162, 3,211,255, 31,154,248, 66, 69,120,149,128,169,123,231,246,107,
-111, 92,185,180,238,246,245, 43,235, 54,172, 89,185, 41, 86,204,152, 43,208,168,143,192,211,104, 64,138,168, 81,253,225,247,104,
-127,204,152, 49, 22,111,217,176,118, 35,243, 48, 47,159,177, 3, 91,174, 42, 34,109,162, 68,137,142, 34,198,218,237, 27, 55,110,
-248,190,121,243,198,247,226,197,139,190, 8,214,123, 19,239, 57,138, 98,164,117,194, 73,189,202, 45,148, 40,110,152,129,105,146,
-133, 61,146, 38,166,199,145, 68, 81, 60, 6,130, 78, 33,179,157, 90,155, 31,157,251,208,213,171, 87,233,201, 60,136, 78, 81,127,
-249,229,151, 32,254, 7, 40, 34, 48,112,118,184, 44, 39,188,211, 95,164,111, 38,184,203,184, 2, 2, 56,253,120,133, 52,121, 61,
- 4, 52,189, 30, 63,126, 44,183,111,223,166,171, 5,111,147, 45, 80,143,159, 42, 57,250, 61, 91, 13,103,175,171, 16,158,165, 21,
- 98, 0,246,135,179,212,190, 8,149,179, 18,215,215, 33,147, 22,108,233,209,140, 3,112,177, 12,245,191,123,206,156, 57, 83,207,
-159, 63, 63, 23,129,171,151, 0,104, 46, 77,151, 46,221, 1,222, 3, 61,179, 19,132, 66, 19,206,117,119,207,157, 59,119,214,185,
-115,231,230, 3, 12, 47, 93,191,126,253, 50, 68, 47,216, 31, 82,154, 24,220,151, 34,128,233,118, 4,216, 30,123,235,214,173,137,
-136,117, 57,227,240,225,195,179, 16,142,105, 55,239,133,180,156, 88, 92,236, 64,204,199,191, 78,159, 62, 61, 25,237,126, 38,130,
-129,207, 70,221,239, 54, 83, 78, 76, 42,197,208, 15,223,225, 16, 38, 76, 52,129, 88, 4, 4,192,239,155, 45,193, 7, 88, 0, 19,
-248,226,203,252,142, 6, 94,130,159,191,254,250,171, 98, 72, 18,159, 53, 50,152,171, 64,110,196,136, 17,149,237, 19, 66,253,252,
-204,251, 38,251,123,229,226,197,139,159,196, 51, 45, 16, 23,243, 58,186, 18, 3,190, 95,194,255,182, 8,140,125, 28,188,168, 97,
-164, 31, 25, 5, 90,169, 10,183,126,180,212, 91, 68, 57,107,164, 96,206,190, 61, 91,152, 48,227, 94, 87,171,246,118, 92,250,244,
-135, 49, 75,247, 4,192, 90, 59,100,200,144,163,104,147,222, 24,235,188,207,156, 57,227,221,181,107,215, 35, 0, 11,107, 64, 35,
-165,201,111, 15,150,157, 96,234,197,126,143,162, 15,119,120,116,126,176,221, 99,160,154,248,159,215,237,192,150, 94,223, 52, 57,
-124, 40,217,141,208,244,100,176,242, 30, 61,122,176,158, 9,182,244, 14,123,154, 29,225, 52,122, 39,234,217, 27,227,143, 55,226,
-205,122, 35, 34,136,146,224,176,218, 27,142,169,189,225,152,218, 27, 0,150,161,209,156, 29, 54,154, 81,147,121,108,156,119,227,
- 87,233,114, 44,145, 68, 73,233,177, 38, 74, 50,143, 21,101,218,166,145, 9,199,235,200,130, 59,205,100,229,243,150, 50,227, 90,
- 29,233,188,180,160,100,175, 22, 63, 16,192,140,243,136, 35,159,124, 70,190, 93,239, 91,237,239, 27,166,137,254,191,131, 81, 81,
-232, 84, 91,155,224,191,144,124, 30,105,164,111,218,189, 60, 37, 66,204, 29, 32, 93,107,187, 76, 9, 96,187, 31,237,247, 60,254,
- 87,182,203,107,184,156, 70, 25, 96,143, 69,140, 62,247, 15,205,247,113, 80,105, 22, 84,117,127, 79,233, 20,129, 83,222, 92,217,
-167,198,137, 29,115, 50, 24,239,143, 73, 53,240,197,139, 23,242,112,240, 96,185,135, 32,189,152,116, 24,132,246,109,204,152, 49,
-159,197,139, 19,107, 52,243,242, 25, 62,107,160,114, 35, 18,100, 17, 88, 97,130,240, 69,224, 98, 5,100, 33,198,156, 47, 38, 93,
-223,109,219,182,249, 98,181, 71,176,229, 72,178,229,172,114, 19,254,152, 44,156,215,200, 62,191,188,184,112, 96,156,188,184,189,
- 89,252,143,174,146,179, 11, 6,202,224,166, 21, 94,252, 24,235, 27, 47,208, 83,253, 55,153,106,216,112,242,249, 19, 36, 89,247,
-219,183,111,175,248,173,164,147, 77, 76,222, 12, 17,148,210, 72,167,118,148, 7, 82, 50, 5,104,241,140,251, 63,242, 76,160,101,
-253,175, 59, 80,216,101,240, 83, 29,106,226, 58,203,101,230,176,231,103, 24, 12,254, 19, 1,168, 30,162, 14, 8,122,111, 96,130,
-246,129,179,211,251,144, 96,110, 14,176,188, 58,243,232,241,211,115,221,123, 15,107,142,122,234,130, 65,110,101,217,178,101,215,
- 82,210,101,160,222,149, 44, 4, 19,136,117, 56, 27,177, 36,231, 46, 93,190,106,227,178,149,107,129,177,182,108, 64,253,111, 69,
-240,238, 35,127,254,249,231,122, 43,224,208,126,135,203, 78,205,252, 0,194, 11,224, 13,127,225,130,197,203, 54, 46, 92,186,106,
-195,186,117,235,215, 0, 20,173, 7,205,189, 33,161, 73, 32,133,136,240,211, 48,168, 79,246,242, 62,177,244,228,153,115, 75,208,
- 78,231,223,188,121,115, 49, 6,248,205,104,255,203,173, 96,203,112, 57,145,113,105,229,202,149, 9,214,166,206,153,191,112,217,
-188,133, 75,151,173, 92,185,106, 33, 98, 62, 46,193,128,185, 21,146,205, 21, 70,191, 29,117,116, 27,116,100,217,178,101, 74,162,
-199,125,251,195,242,242, 67,196, 4,246, 87,128, 45,109,236, 72, 27, 63, 9,114, 8,178,240,108, 14,179,201, 14, 32, 57,172,163,
-192, 73,233,133,224,138,128, 10, 19, 98, 46,251, 4,103,182,185, 93,128, 45,135, 52, 17,195,210,139,224, 10,160,218, 82,186,116,
-233, 39,252,205, 51, 34, 35, 88, 16,159,212, 82,163, 70, 13, 74, 72,117,251,145, 81,160,149,178, 80, 75, 95, 2,173, 12,101, 58,
- 7, 32, 0,122, 56,245, 57,103,109, 62, 3,194, 71, 17,100, 5, 86,175, 30,228,153, 54,237,147, 65, 29, 59,222,124,251,246,173,
- 55,156,246,122,163, 13,121, 35,200,187, 55,198, 58,111, 52,124,111, 76,100,244, 37,231, 40,148,153, 35,169,206, 8,244, 67,127,
- 60,115, 23,253,244, 14,210,221,130, 57, 98,220,255,163, 89,148,231,203,134,135,127,189,102,212, 55, 65,108, 3,155,199,121,188,
-184,181,209, 99, 35,193, 22, 37, 91, 70,251,166,171,129, 35,102, 50,143, 84,209,190,247, 88,244,125,225, 40, 15, 0, 60,180, 96,
-201, 81, 29, 85,199,152,177, 0,244, 42, 91,105, 46, 70, 61,139,117,142, 89,108,189, 86, 28,253,103, 38,126,231,119,240, 94, 45,
-205,182,232, 51,155, 9,178,152,170, 87,175,238,141,168, 24,222,104,251,222,232,239,222, 88, 84,121, 99,225,231,141, 5,187, 25,
-160,117,114,203,203,238, 50,236, 89,114, 73,154, 35,218,187,113, 71,234,201, 90, 75, 43,153,230, 95, 72,254,122,158, 73, 70, 61,
-251, 65,198, 63,207, 38, 51,252,139,201,162,231,181,165,246,208, 12, 2, 73,215, 86,140,248,145,236,202, 26,234, 96, 3,244, 13,
-211, 36, 40,218,179,103,143,112,238,176, 79,160,163, 93,116, 27,165, 57, 3,227,165,236,220,185,147, 64,109, 6,162,118,248, 62,
-125,250, 84, 25, 91, 32,112, 96, 44, 82, 51, 99,157,153,121, 72,201,251,149,135,224,177,255,222,143,129,150, 21, 73, 22, 97, 78,
-170, 2, 41,165,250, 54,118,236, 9,213,171, 85,195, 56,253, 74, 25,191, 25, 83,208,167, 68, 9,185, 94,160,128,144,249, 76, 12,
-188,156, 42, 69,138, 23,241,227,196, 26,193,103,248,172, 94,167,166,186,112,220,184,113,183, 65,210, 23,180,125,253,252,252, 20,
-160,133,142,227,139,144, 49,202, 25,241,240,110, 90,213,136,246,133,119,212, 96,190, 75,155, 58,193,221,187,167,103,128,226, 92,
-145,147,152, 51, 14,164, 17,233,146, 72,100, 88, 65,145, 13, 3,196,103, 65,159,160, 31,146,196,189, 11, 98,223,233,116,106,103,
-141,163, 34, 98,241, 5,146, 15, 56,211,139,121, 37,157, 86,228,178, 97, 67,130,117,145,113, 20,237, 37, 90,188,238,130,174, 51,
-154,161, 5,180,194, 0, 56, 79, 5, 96,121,202,137, 11,147,191, 5,224,218, 2, 0, 96, 65,120,156,199, 11, 22, 44,104,253,240,
-241,243,243,247, 30, 60, 57,222,185,231,192, 90,115, 70,141,170,114,231,250,245, 63,160, 86, 93, 76, 53,162, 94,189, 91,239, 87,
-135, 36,112, 23, 64,213,236, 83,231,174, 92, 58,115,225,250,181,149,235,182, 31,218,178,125,247,129,189,123,247,109, 66, 92,201,
-101,152,144,206,195,195, 57, 85, 97, 90, 53,162, 43,126, 86,167, 36, 11,131,238,130,211,231,175, 94, 60,119,233,250,149, 21,107,
-183,237,219,184,121, 39, 3, 97, 91,112,125, 17,164, 8,199,243,228,201, 99,138,102,222,188,121,183,195,147,253, 36,191,251,143,
- 79, 63,121,250,226, 28,105, 49, 65,170, 53, 31,192,101, 50, 22, 9, 7, 49, 1,236, 53, 83, 78,172,184,183,163,125, 79,241,245,
-123,116,235,254,131,199,119,150,172,222,188,109,237,134,109,155,182,109,219,177,144,224, 11,229,164,103,119, 67, 52,177,234,244,
- 99,240,107,174, 94, 47, 32, 30,167,151,151,151, 44, 95,190, 92,102,206,156, 41,211,166, 77, 19,212,151,164,207, 81, 72,137,113,
-201, 80, 77,136, 24,160, 5,225, 95, 4,104, 17,100,105, 1,150, 51, 32,167,130, 45, 59, 9, 25,155,140,125,189,171,146,172,133,
- 4, 89,168, 91,203,232,209,163, 45,108,175, 24,195, 20,144, 69,176,133,231, 22, 66, 66,184, 31,231,202,174,250,187, 10,152,176,
-152,226,216,119, 0,233, 20, 38,255, 25, 0, 48,201,181, 32, 44, 66,170, 10,107,230, 29,120, 45,245,254, 88, 42, 97,147,149,105,
-164, 7,180, 64,231,155, 76,144,182, 13, 76,147,230, 58,192,150, 44,172, 92, 57, 96,234,160, 65, 55,209, 87, 20,160, 69,144,128,
-177,206,251,200,145, 35,222,191,255,254,251, 33,188,191,169,129,113,105, 52,164, 58,143, 57, 6, 49,232, 55, 22, 0, 10,136,126,
-253,228,160, 60,187,216, 85,182, 77,142, 38, 19,187,127, 8,139,197, 51,193, 22,165, 91, 84, 37, 26,236,155,142,135,158,196, 30,
- 81, 32,241, 25,151,179, 78,236,119,158, 94,217,101,170,255, 79,146, 60, 95, 36,142,165,234, 97, 95, 71, 89, 17, 94, 43,136,147,
-245, 79, 63,253,196,144, 90, 81,144,236,129, 86,100, 56,213,125,198, 5, 2, 36,145,129,184,159,217,238,229, 54,154,152,224,119,
-171, 32,139,231,150, 45, 91,122,175, 88,177,226, 35,144,229,235,235,235,141, 5,188, 81,137,150, 13,104,205,185,220, 92, 22, 6,
- 84,151, 1,183, 83, 74,137, 94, 49, 36,105,129,112,129,241, 50,132,125,149,182, 82, 68,169, 57, 45,142,140,121,158, 78,230,191,
-168, 44,205,166,102, 19, 72,194,180, 49, 72, 29,181, 79,157,105,193,208,109,163,160,136,196, 82, 34, 45, 65, 91,127,181,120,241,
- 98,193,152,173,204,211, 4, 93,184, 78, 77,131,179, 58,114, 86,144,213,148,140, 89,181, 43,175,158, 61,123, 38, 16,132, 8, 36,
-250,140, 63,187,202, 89, 29, 25,250, 42, 3,153,190,114,137,150,190,234,144, 60, 80,209, 36,237,174,214,173, 94,177, 25,234, 13,
-127, 86, 26, 25,207, 78,141,201, 81, 16, 56, 78, 73, 23, 46, 92, 80, 86,201, 0, 73, 74,140, 61, 76,208, 79,182,110, 92,183,145,
-246, 92,122,252,132, 24,114, 51, 58,133,175, 51,160,133, 78,228,139,138,245,197,170, 77, 47,196, 15, 95,245, 77,146,248,223,156,
-185,115,114,170,200,165, 14, 34,187,227,137,236, 77, 44,178, 63,133, 72,135, 56, 34,109,163,139,180, 12, 15,187,147,234,114,109,
-102,199,160,164, 81,195,157,225, 51,122,101,180,187,159, 26,129,155,149, 32,187, 60, 58,117,234,196, 64,206,244, 8,238, 44, 92,
-140, 46,121,170, 29,217,152, 33,193,120, 10, 27,173,155, 60, 27, 80, 71, 58,163,171, 5, 90,239, 17,122,229, 81,228,200,145, 23,
- 34,179,253,234,203,101,185, 40,201, 82, 65, 22, 39,174,129, 3, 7, 90, 48, 89, 91,246,239,223,111, 97, 88, 31, 76, 16,253,254,
- 24, 58,173,237, 31,127,142,174,127, 96,227,198, 78,183, 14,236,233,245,252,148,119, 91,228,189, 67,155, 45,221,143,254,144, 97,
-214,244,233,211,199,205, 89,180,124,245,153, 75, 55,174, 93,186,122,235,238,142,189,135,125,188,142,122,223, 58,119,204,251,204,
-133, 83, 39, 55, 3,192,239,192,187, 56, 73,186, 82,205,106, 95, 7,173,196,172, 25,243, 22,175,220,120,230,226,141,171,151,175,
-221,190,185,117,215, 65,198, 56, 84,128,209,217,227,199, 86, 96,176,216, 8, 9,194,110, 51, 52, 33,109, 24,117,212,251,228,146,
- 71, 79,252, 47,248,191,120,121, 77,165,247,252,233,211,173,143, 31, 60,152, 5, 16,186, 20,210, 45,182, 81,195,229,132,186,112,
-204,172,121, 75,150, 3,188,221,125,240,240,169,223,230,157,251, 79, 28, 60,112,240,216,169,195,135,182,157,241,246,154,131,114,
- 46,195, 10,221, 16, 77,244,143, 39, 7, 14, 28, 80,130,136, 91, 0,166, 80, 95, 10,216, 82,227,123, 66, 29, 41,109,218,180, 17,
- 6, 31, 7, 40, 17,132,101,122,230,168,142, 84,213,161, 61, 8, 66, 63,101,115,119, 45,229, 10,174, 58, 12, 70,158,210, 46, 21,
-100, 57,162, 99, 79,159,146, 46, 7, 64, 43, 24, 77,173, 36, 11, 55, 54, 67,202,108, 1,104,177,156, 61,123,214, 2,190, 89, 0,
- 50, 89,231,155, 33,161, 83, 22, 9, 8, 88, 78,201,184,211,131,128, 9,109,183, 45,212,195,129, 0, 65, 66, 21, 60,249,246,235,
-175,191,190, 67,152,168,210, 42,160, 10,155,188,116,205, 95,186,206,151,197, 71, 3, 37, 99,185,174,175,163,164,174,152,157,247,
-116,218,252, 55,169, 17, 38,107,110,249,242, 1,129, 53,106,200,130,159,127, 14,248,171, 79,159,155, 24, 59,109, 64,139,128,129,
-128, 11,117,233,202,182,136,175, 25, 86,165, 74, 21,142,153,202, 1,169,142, 48,214, 41, 37,154, 23,142, 45, 16,159, 67,205,212,
- 91,193,206, 14,128,150,193,110,250, 33, 91,148, 20, 30,137,226,165, 11,119,188,245,202,116, 10,192, 26,121, 61,143, 20,106, 25,
- 95, 34, 39,240, 24,227,132,208, 55,224,229, 25, 72,151, 4,253, 71,114,231,206,205,250,224,241, 17,208,194,247,188,161,164,132,
- 11, 2,204, 31,236,155, 14, 15,140, 75,155, 97, 2,224, 93,191,126,125,111, 44,192,189, 1,172,189, 17,219,245,131,250,181,123,
-239,155, 57, 10, 22, 11,136,151, 44, 69, 96,156,196, 41,222, 71,141,157,244,105,248, 40,113,154,129,144,203, 49, 30,128,201, 6,
-180,198, 63,207, 46,221, 79, 39,150, 4,217,195, 6, 70, 79, 26,214,127,236,196,209,103, 32,121, 60, 58,119,193,156, 83, 53, 26,
- 87,124,144,163,113, 20, 25,241,228, 7,153,247,188,138,100,174, 20, 39, 80,181,233, 50,197,200,207,151, 57, 37,165, 78, 4, 68,
-108,191, 11, 23, 46, 84,230,107, 43,208, 90, 29,130,215,218,128, 22,129, 27,105, 18,100, 1, 11, 80, 26,158, 50, 4,244, 76, 61,
-242, 47,147,104, 5,255,118, 13,138,244,228, 29, 26,185,211, 38, 11,131,182, 34,193,225,170,153, 3,122,155, 86,173,222, 99, 69,
-254, 28,210,131,103,221,187,118, 13, 98, 39, 97, 69, 16, 51, 53,109,218,244,117,140,232,209,103, 57, 50,154,183,231, 52, 64,198,
-105,130, 44, 38,216, 83,124, 36,209,130,141,137, 34,213, 66,231,163,129,171,222,241,203,208, 73, 85,159,189,124,177,236, 94,208,
-238, 56,143,100, 95, 50,145,131,105, 69, 14,103, 22,233,249,189, 72,215, 36, 34,237, 99,201,171,166,177, 31,249,204,216,122,173,
- 93,217, 22, 79, 65,144, 6,170,134, 15,148,119, 14,191, 19,101, 13, 98,131,230,121,245,234,213,180,209,154, 99,152,200,199, 25,
-191,135,154,240,158, 86,220,203,255,200,198,208, 41,102, 15, 27,208,194,170, 67, 25,104, 9, 10, 65,228, 76,166, 76,153, 30,161,
-190,168, 54,213,237, 36, 84, 23, 18, 96,169,169,127,255,254, 22,172,156, 45, 88,117, 91, 80,182, 59,104, 3,125,183,236,216,213,
-125,193,216,177,181,110,236,220,222,219,114,226,232, 20,185,113,117, 33, 6,165,245,118, 18, 45,167,229,167,225, 55, 6,200,201,
- 51, 23,174, 89, 89, 48,119,170,215, 37,127, 74,253,190, 90,169, 76, 65,245, 42,102, 15,106, 88, 49,107, 96,157,210, 25,223, 62,
-127,252,120, 61,164, 90,215,172, 6,242,186,188, 96, 62, 76,180,115,230, 44, 94,183,113,241,234, 93,251,183,238, 62, 68, 48,173,
-128, 44,251,132,247,223,209, 37,136, 12, 48, 46, 63,133,201,226, 47,239, 19,231,104,135,229,144,150,197,223,127, 42,164, 90, 39,
-152,215, 8, 77,126, 59, 36,118,227,103,204, 91,181,220, 25,205,135,190,190,211, 33,213, 58, 97, 53,144,119, 73, 22,117,253, 10,
-210, 16,129,244, 79, 0,214, 5,246,110,202,226,103,235,214,173,178, 99,199, 14,161, 74,161,102,205,154, 12, 19, 36,144,188, 9,
-104, 82, 18,251,209,225, 10,104,233,130, 45, 29,160, 69,149,161, 51,176, 70,218,246,244, 93,216,106,169,229,110,171, 74,178, 8,
-178,112,113, 51,193, 21, 0,111, 48,144,133,246, 99, 33,216,194,253, 22,174,152,136,182,211,191,121,243,230,130,252, 54,128,130,
-252,106,152, 49, 74,109, 88,183, 74,250, 38, 78,250,253, 61,167,122,201,164,205, 15, 36,108,202, 50,192, 89,186, 64,203, 3,223,
-183,117,230,176, 97, 55, 41,209,162,100,107,110,133, 10, 1, 67,187,116,185, 9, 9,163, 2,176, 32,193, 86, 64, 23,128,214, 86,
- 87,229,132, 84,231,153, 22, 65,253,246,219,111,138,186,152,129,227,175,158, 94, 42,183,142,254, 38, 91, 39, 69, 53, 34,209, 50,
-210, 84,149, 60, 81,147,122,100, 78,154, 39,226,189, 62, 71,178, 41, 32,171,225,148,212, 18, 55,125,216, 91, 17,227, 40, 70,237,
-206,226,104,230, 34, 80,197,152, 33, 80,215,147,143, 61,172, 47,252, 72,117, 8,222,247, 99,249, 9, 22, 25,244, 30,249,114, 59,
- 42, 28, 52, 32,155,239,223,191,239,141,239,245,198,184,171,128,172,205, 91,182,157, 74,151, 53,159,165,108,141, 22,129, 91,240,
-252,169, 43,222,114,238,154,143,172,220,113, 78, 10, 87,168,253, 50, 66,140,196,135, 61,162,196, 11,110,140,172, 33,174, 5, 90,
- 67,159, 36,151,165,143,154,202,154, 39, 29,100,246,149, 38,146,189,204,247,175,208, 7,189,218,181,107, 71,251, 47,175,198,109,
-234,248, 85,155, 16, 91, 38,251,231,149,142,171,115, 73,148,228, 30,125, 13, 51,241, 51,103,196,130,122, 53, 53, 75,170,212, 9,
-182,137, 47, 63, 17,104,173, 83,159,167,116,140,192,141, 52,241, 25,140, 67,155,242, 51,127,142, 34,236,177, 38,207,207,253,174,
-127, 4,125, 26,190,195,184, 80, 17, 67,194,158, 64, 58,182,111,255,158,149,138,194, 37, 71, 74, 13,253,251,246,241,227,198, 5,
-209, 16,143,186,119, 2, 15,128, 48,173,168,210,233,119, 96,226, 63,163, 5, 90, 48, 44,182,169, 14, 49, 97,248, 18,104,237,219,
-183,143,118, 90,174,236, 44, 20,250,209, 99,121,204, 61,117,103,176, 92,148, 66,114,250, 93,116,255, 23,231, 51, 28,148, 35,185,
-222,137, 23, 84,134,253,179, 73, 96,239,140,239,206, 55,108,115,112, 77,222,201,254,219,170, 44,148,245, 93, 23, 73,212,176,145,
-245, 86,143,193,202, 78,117, 30,121, 1, 67,227,135, 40,223,101,156, 31, 16, 32,233,168,249,140,212,227,143, 88, 41,252,133,193,
-248, 2,207,120,192,213,238, 22,123,122,180,137,162, 42,104, 28,207, 28,132, 89, 87, 80, 65, 8,212, 39, 2,245, 22, 69,189,202,
-111,216, 82,113, 16, 35,136,163, 65, 99, 62,103, 5,163, 77, 22,165, 3,148,100, 17,100, 77,156, 56,209,130,201,192,114,234,212,
- 41, 11,140, 88,159, 67, 13,176, 15, 82,135,229,190, 80, 23, 62,221,191,183, 67,224,213, 11,139,228,205,235,187,176,183,226, 46,
- 68,173,141,150,211,111, 39,128, 0,239,102, 45, 94,186, 98,193, 79, 57,146,188, 61,177,109, 69,208,229, 61,235,228,246,161, 77,
-242,240,192,242,160,230, 63,103,123,247,234,209,131,205,152,248,174,155, 1, 90,176,209, 88,180,106,245,186, 85,107, 55,237,221,
-117, 96,207, 33,182,155, 79, 6, 90,216, 92, 48, 5, 82, 18,182, 21,135,180,222, 6, 4, 76,199,160,116,206, 12,208,130, 52, 99,
-234,178,101, 43,231, 59,163,105,185,127,111, 22, 85,167,206,128,150,118,103,160, 22,104, 65,114,163, 72,157, 39,206, 90, 33, 69,
-171,252, 38, 25,179,229, 21,174, 72, 1,116, 4,253,214, 37,208,114,102,163,101, 5, 65, 31,129, 33, 45,112,114, 6,140,180, 42,
- 67, 87, 64,139,237, 86,121,143,117,231,163, 78,167,169, 76,131,119,218, 98, 65, 82,166, 72,178, 8,178,212,133, 1,234,203,194,
-235,148,100, 17,140, 21, 46, 92,248, 49, 13,229, 65,179,188, 11,186,167,236, 69, 65, 4, 93,152, 96,133, 99, 27, 37, 92,148,218,
- 99,162,151,158, 61,255,120,144,163,106, 31,161,173, 86,226,220,141,175, 26, 1, 90, 0, 72,219,208, 7,189, 9,182,134,102,207,
-174,128,173, 89,101,203, 6,120,182,110,125, 19, 27, 63,188, 49,214,121, 99,172,243,198,162,210, 37,208,130, 84,199, 23, 82, 29,
-129, 84, 71, 32,213,145, 81,163, 70, 41,118, 52, 88,180,200,245,243,235,229,238,201,158,114,123,127, 49, 5,108,241,112, 97,163,
-101,100, 92,242,136,148,194,227,187,148, 5, 35, 63, 25,126, 37,143, 2,178,170, 12, 74, 46,145, 19,121,172,240, 8,231, 81, 0,
- 4,236, 55,170,104,105,254,142, 13, 30,202,152, 3,105,214, 11,220, 80,109,207, 28,217,104, 69,197, 2,253, 21, 54,194,200,208,
-161, 67, 57, 70,105,237,123,109, 52, 9,180,104,236, 78,112, 74,219, 54,208,247, 78,159, 45,191,101,204, 92, 44, 44,238,223, 22,
-223,199,175,229,220,205, 23,178,231,204, 19,217,125,250,145,108,220,185, 74, 58,252,217, 37, 40, 74,220, 68, 92, 96, 58,148,108,
- 65, 42, 53,245,207,131, 5, 20, 27, 45,166, 17,207,190,151,145,207, 82,137,231,213,228,146,163,252,119,168,254,151, 94, 88,156,
-208,200,222,107,199,174,237, 71, 83,149,140,168,168, 16,199, 92, 42, 65,245, 33, 77, 18,254, 17, 7,237,166, 40,240,208, 72,157,
-102,176,221,114,145,133, 2,114,231,161,217,195, 91, 5, 90,170, 54,139,255,105,183, 69,123, 48,179,196,220,249,117, 56,144, 56,
-122,116,255, 71, 24,164,111,148, 46,173,168, 10, 33,189,161, 36, 40,149,230,177,140,176, 37,121,118,187,118,109,185,154, 37,139,
-146, 39, 41, 12, 51,141, 48, 86, 11,180, 28,217,104, 65,138,226,139, 85,139, 33,160, 21, 59,190,135,207,131,119, 75,228,148, 36,
-144, 19, 18, 83, 78, 75, 74,241,121,153,239,206,187, 11,213, 47, 62, 28,216,254,226,158,250,139,239,108, 42, 59, 71,214, 22,152,
- 42,107, 11, 78,147,227, 35,247, 72,204,176,209,141,170,185,148,207,161,129, 58,129,150, 73,195,117, 35,172, 8,113, 30, 72,144,
-252, 40,158,135,202,145, 29, 74, 49,128,101, 7,163,244,130,224,138,131, 23,127,179,147, 80,157, 68, 59,157,163, 71,143, 10,192,
-203,113,103, 47,165,225, 59, 6, 24, 69, 93, 72, 73, 22, 58,175,101,211,134,117,150,170,197,243, 89, 42,149, 42,170,216,192, 0,
- 20, 31, 2,136, 91,132,119,220,194, 42,106, 3,140,142, 55,113, 55, 34,104,218,187,120,112,246,154, 89, 27, 54,108,152, 11,233,
-216,226,130, 89, 98,189,190,178,103, 69,208,157,177, 37,130, 30,206,172, 31, 20, 48,183, 81, 96,235, 74, 57,222,137, 37,224, 48,
-164,168, 84,249, 24, 86,201, 65, 77,177, 4, 3,241,186,237, 59,118,175, 61,129,165,152,207, 49, 47, 74, 33, 20,128,244,234,216,
-145,245,242, 50, 96, 39,120, 98,138, 38,232, 77, 7,120, 89,120,227,214,237,133, 80, 23,110, 87,233,189,245,127,182,243,253, 3,
-191,197, 0,153,235, 49, 1,211,158,202,112, 57,215,174, 93, 59, 19,223,190,104,211,150,237,139, 78,236,223,191,243,154,215,225,
- 99,119,189,143, 28,127,118,226,232,174,151, 94,135,151, 74,128,255, 70,124,251, 62,103, 52, 9,108, 6, 15, 30, 92,133, 9,160,
-250,141, 42,209,194,132,173,168,188, 42, 52,233, 39, 21, 43, 55,150, 98,105,211, 74,227,210,197, 21,201, 22, 84,134,159, 4,180,
-108, 96,200,129, 26,209, 21,208,114, 37,205, 34,176, 82,129,156, 74, 95,175, 51,208,133,131, 86,226, 74,117, 33, 37, 89,188, 6,
- 3,117, 5,120,169,137, 82,216,247,239,223, 43,247,172,174, 31,156,145,183, 1,173, 41, 83,166, 40,187, 55,121, 32,179, 54, 93,
-198,255, 16, 73,180, 8,180, 64,206,155, 96,107, 82,255,254, 55, 85, 53,226,140, 82,165, 2,186, 52,110,124,147, 70,221,148,208,
-232, 1, 45,244, 77, 95,130, 61, 74,177,184,168,197, 51, 10,200,162,125,222,205,235, 39,228,254,181,101,242,240,188,167, 60, 62,
-215, 73,134,119,140, 26, 64,149,161,147, 93,135, 90, 62,124, 3,163,246,170, 48,242,166, 75, 25, 27, 32,137,149,210, 35,214,183,
-153,195, 95, 30,112, 42,135, 2,178, 42, 15, 72, 70,144,197,157,192,105,244,250, 57,218,228, 20,238,126, 38, 40,196,194,251,144,
-230,101,142,128,150, 71,190,124,249,206, 80, 35,194, 29,137,200, 59,220, 81, 37, 97, 51,206, 22,128,103, 5,100, 81, 93,216, 5,
-234,194,122,237, 27, 4,157,247, 57, 38,253,167,253, 38,143,159,191,149,203,119, 2,100,231, 73, 63,169,208, 40,151,148,173,149,
- 86,102, 45, 26, 37,229,106, 21,121,111, 85, 35,126, 68, 54,242,247, 30,201,241,237,203,226,101, 12,115, 57, 94,250,176, 15,211,
- 21, 78,252, 42, 75,201,148,175,138, 87,207,251,108,197,218, 37,231, 9,176,126,254,249,103, 5,104,237,221,187,247,192, 15,121,
- 18, 91,122, 93, 76, 42, 35,175,229,151,168, 73,195,220,208,107,171, 95,240,126,101,238, 8,132,224,131,166, 22, 41,153,184, 99,
-208, 10,138,248,223,217,193,123,163,145, 86, 91,211, 6,156,233, 22,226,140, 34, 37,181, 51,174, 39,168,183,238, 68,252,130,159,
-246,213,189, 74,181,133,164, 36,149, 38, 84, 31,185,119, 40,162, 53,134,231,231, 37,140, 22,237,153, 31,182,226,250, 20, 46,172,
-128,168,148, 41, 83, 62,193,101,173,193, 98,158, 18, 37, 74, 60,247,235,218, 85,174,229,201,243, 1,140,197,142,109,191, 43,193,
- 33,167,140, 0, 45,168, 63, 12, 1,173,152,113, 61,110, 61,120, 63, 79, 78, 74,124, 27,208, 58, 35,249,239,120, 62,154,124,177,
-246,136,199, 23, 23, 55,221,242,127,160, 5,176,117,124,232,110,137, 22, 54,170,161,114,170,133, 7,192,186,192, 85, 45, 37, 89,
- 90,137, 22, 12, 16, 47,252,141, 77, 97, 63, 7, 52, 14,190, 40,131, 50, 57, 80,124, 76,176,197,213, 56,109,232, 84,155, 19,216,
- 88, 9,108,158,148,213, 57, 0,151,211, 93,137,220, 93,136,129,197,130, 21,182, 5,160,204,178,125,235,102, 75,181,194, 57, 44,
-199,214,206,177, 44,110, 89,216, 82,165,116, 81, 11, 86,158,254,152,184,111,106,252,104,113, 21,106,198,230,173, 58,118,112,238,
-195, 10,105, 87,197, 66,201, 95,220, 62,188, 58,232,225,136,188,129, 47, 38,150, 13,124, 61,169,124,224,176, 54,213,184,243,226,
-105,129, 2, 5, 56, 72, 59,243,169,101,207,246,234,176,153,219,135,111,223,199, 93,135,231,189,142,172,186,123,236,232,246,103,
- 39,143, 42,224, 40,232,246,141,101,100, 15, 36,114,246,198,240,174,170,175, 58,218,247, 46,176, 99, 19, 13,223,159,220,191,111,
-147,108,189,127,112,127,105,224,211,199, 51, 65,243, 62, 84,115, 4, 69,134,203, 73, 23, 14, 40,231,102, 26,190,159, 57,114,104,
-254,237, 35, 7,215, 61,241, 62,180,193,114,120,255, 10,185,121,109, 22,105,226,219, 57,104, 58,164, 73,128, 66,144, 69, 41,145,
- 22,104, 81,117, 8,219, 55, 41, 94,182,186, 84,203,153, 71, 58,229,202, 36,147,234,215, 80, 84,254,148,108, 86,170, 84, 73, 1,
-228,142, 62, 88,199, 70,203, 38,240,113,168, 70,116,162, 58, 36, 0,115, 10,180,172,207,104,129,150, 65,176, 85,158, 18, 42, 74,
-180, 8,250, 85,155, 44, 74,178, 8,176, 0,140, 21,195,120,254,158, 52,105,146, 5,121,159, 88, 93, 62, 84,118, 81,209, 54,160,
- 69,144,197,190,195,213, 59,251, 10,199,196,108,217,178, 5, 97, 83, 78,166, 16,218,104,121,168, 64,139, 96,139,110, 8,104,163,
- 69,137, 22,109,182,166, 22, 47, 30,208,174, 94,189,155, 88,208, 24, 2, 90,180,189,227,166, 6,106, 24, 84,144, 69, 41, 38,165,
-215,143,238, 95, 22,255, 7,135, 21,195,248,178,133,227, 62,162, 1,188, 19, 63, 90, 54, 86, 0, 96, 13, 42,221, 45,177, 48,193,
- 95, 20,119,255,113,177, 20, 38,102,234,111,118,116,221,158, 73, 1, 89,141,166,167, 38,200, 90,137,235,220,185,168,219,207, 49,
- 46,140,225, 2,112,227,198,141, 92,156,159,208,240,189, 53, 55,104,208, 94, 16,215, 60,213,235,216,189,125,146, 99, 24,165,175,
-184, 54,217, 81, 61, 17,104,193,100, 67,145,100,113, 35, 65,206,194,133, 44, 27,246, 47,147,105, 43, 7,203, 46,239,189,114, 9,
- 32,107,239,217, 39,178,226,128,159,244,152,184, 70,186,205, 56, 47,237, 6,120, 74,175, 33,109, 37, 82,236,228,236, 75, 46, 15,
-216,159,206,129,250,205, 11,239, 56,138, 49,244, 40,198,250,163, 4, 88,197,138, 21,243,230,111,140,135,251, 39, 78, 31,127, 42,
-121,254, 40,239, 83,228,139, 18, 24, 51, 94, 84,237,198, 31, 61,242,159,122,223,140,187, 5,195,239,210,113, 11, 65,211, 11,130,
- 46,130,175,213,214, 68, 80,150,210,240, 11, 66,152, 17,125,238, 35, 44, 18, 66, 82,127,199, 99,170,125,186,253,249, 67, 89, 28,
- 25,160,161, 34,246,221,185,115, 71,104,147,196, 85,211,159,125,251, 6, 98,192,217,141,236, 57,145, 10,162,113,122,115, 2,167,
-196,132, 34, 70,210, 0,138,166,237,137,238, 97, 15,180, 32,105,240, 5,130, 86,236,178,214,172, 89,227, 11,137,135, 47, 36, 20,
- 4, 90,186,182, 47,209, 98,122, 44, 62,126,167,135, 92,144, 60,114, 76, 98,248, 15,125,214,240, 80,166, 43, 27,223,229,184,182,
- 77,114,120,190,144,244, 61,253,223,149,109,121,253,208,194,130, 51,253,183, 84,152, 39,171,126,159, 43,145,195, 70, 86,183, 23,
-235,150,149, 25, 96,187,164,248,209,194,164,170,216,104, 65,138, 19,200,255,176,101,155,109,136,128,243, 76,249, 49, 24, 45, 5,
- 63,174,243,140,108,142,182, 57, 59,123,186, 49,141, 72,169,182,197,106, 94, 1, 88,172, 47,218,211, 17,100,113, 55, 40, 37, 88,
-172, 35, 74, 53,104,152,202, 1, 89, 15,104, 81,237,130, 1,205,178,103,247, 14, 5,100,157,220,180,192,178, 99,100, 27,203,240,
-159,211, 88,154,252, 82,209, 2, 9,164, 5, 59,123, 76, 73, 4, 53, 31,192,129, 60, 65,133, 10, 21,158,247,234,213,235,225,225,
-125, 27,223,248,123,207, 11,124, 49,181,232,187,183,243,171,188,151,189, 3, 2, 31,221,191, 27, 56,102,212,136, 67, 14, 92, 28,
- 56,227,131, 66, 19, 42,149,135,152,120, 3,208, 22, 79,192,102,108,211,227,123,190,203, 94, 62,184,191, 66, 94,191,218, 65,240,
-130,137,119,187, 89,154, 80, 29, 60,128,250,244, 46, 84, 73, 7,193,151,101,150,103,207,102,190,183, 4,204,130,216, 99, 29,196,
-134,126, 48,100,222,224,192,189,131,203,114, 98,149,252, 0,254,147,238,130,143,135, 80,119,203, 31,223,189, 51,235,213,253,123,
-115,228,149,101, 3,105,142, 31, 63,126,147,171,114,106,129, 22,250,163,165,117,235,214,130,221,148,220, 9, 43, 80,225,202,202,
- 21, 43,165, 67,229,242, 50,189,225, 47,114,229,208, 1,233, 0, 87, 44,200, 39,216,173, 38,144, 60,190,118, 84, 56,103, 14, 74,
-237,129,144,189,154, 79, 85, 99, 58,162,233, 10,104,169, 82, 48,103,244,117,250, 84, 11,213,133, 3,220,107, 40, 54, 90,170, 26,
-145, 32,139,255, 7, 12, 24,160, 72,178,120,198,255,182, 58,244, 20,160, 69,144, 69,137, 22, 65,150, 86,162, 5,158, 53,167,138,
-208,192,174, 67,135,175,209, 2, 45,250,124, 66,255,244, 30,214,181,235, 77, 74,180, 8,182,166, 0,108,117,251,245,215,155,122,
- 18, 45,128,141,123, 44,155, 10,178,184,112,162,212,154,125,158, 11, 44,142, 75, 4,137,144,226, 9,250, 39,205, 4,116,143, 88,
- 63,132,241, 35,152, 98,170, 59,225,123, 5,108, 65,202,211,170,206,184,239,149,107, 84, 27,194, 38,203, 7, 46, 85,115,129,152,
- 81,137,117, 83,117,204,129, 81,252, 43, 60, 23,195, 90, 16, 58, 41,165, 75, 8,218,119,169,180,162, 99,179,134, 50,150, 90,237,
-185,126,117, 84,104, 2, 45, 0, 33, 5,100,209,127,214,119, 89,147, 5, 94,240,185, 44,222,151,158,200,169,235,254,178,227,212,
- 99, 89,180,231,158,148,173,151, 79, 74,214,202, 37,197,106,230,148, 74,173, 90,200,160, 57,187, 37,124,244,248,254,122,140,192,
-130,101, 59, 36, 54,222,144, 54,123, 17, 88, 1,184, 31,185,231,235,123, 52,102,248,240,222,215, 23, 47,246,194,120,120, 0,192,
-118, 63,242, 28, 0,255, 15, 67, 21,191, 83,143,102, 40,222, 55,227,110,193,240,107, 77,184,133, 48, 76, 51, 52, 50,126,229,198,
-240,246,146, 44,167,238, 29,184,170,240,160, 65, 59,156,145, 46,132,253,195, 27,118,110,118,102,136,232,101,238,156, 57, 65,117,
-242,231,127,222,188, 84, 41,255,163, 48,118,100,167,102,162, 77, 67,221,186,117,177, 51, 45,218,100, 26,210,235, 49, 28,131,207,
- 89, 12,102,138, 49, 60, 6, 7, 95, 24, 8,251,210,105, 41,129, 22, 12,122,125,209,152,125,193,112, 67, 64, 11,239,250,117,216,
-180,146,143,207,191,159,115, 35,225,165, 25,143, 98, 95, 88, 45, 73, 47,173,147, 84,151, 55, 74,170,174,254,146,180,131,191,196,
-110,245, 92, 34,252,250,236,209,196,177, 87,206,183, 43,210,226, 33,159,209, 43,163,246, 62, 58, 98, 49, 24, 28, 63, 84,253,104,
-113,242,194,206,190, 7,200, 19, 18,195,117,133, 52,128,108,109,172,152, 30,113, 80, 87,197,180,252,207,235, 6,203, 22, 5, 0,
- 16,243,255, 11, 69, 63, 79,233, 22, 65, 22,118,214, 41, 32,139,198,168, 88,137, 41, 32,139,171, 75,170, 27, 56, 48,187, 2, 90,
- 48,122,244, 33,208,194,128,102,169, 83,174,160, 13,100,141,172,156,198, 82, 46, 87, 90,203,245,171,151, 45, 0,214, 22, 76,144,
-166,129,214,143,241,163,102,201,146, 36,198,133, 14, 77,106,189, 63, 0,240, 87,174, 92,185,103,185,178,167,121,125,106,237,152,
-192,183,119,143, 5,189,189,227, 29,116,124,227,212,192,188, 57,210, 5,198,138,234, 65,227, 75, 87,118, 32, 10,139, 50,128,102,
-230, 36, 49,206,119,110, 94,231, 5,118,196, 90, 8,182, 80, 79, 28, 20,247,192,152,245, 28,218,229, 21,170, 11,161,158, 56,232,
-196, 17,232, 71,172,182,167, 9, 96,116,159, 46, 28,184,187, 16,244, 78,226,251,207, 99, 5,190, 15,187,190,246, 58,113, 88,170,
- 75,179, 98,197,138,247, 33, 41,217,139,114,110, 69, 57, 79,130,238, 5,212,221,126,216,180,236,211, 43,167,170, 58,164, 68, 11,
- 19,234, 37, 74, 2, 40,181,162, 77, 6, 37, 90, 4,221,172,115, 26, 24,211, 62, 11,139, 2,197,158, 7, 54,119,180,213,210, 74,
- 24,116,155,153, 35, 32,100, 80,242,228,161,250,206, 98, 57,181, 73,171,106, 12, 9,125,250,199,210,184,112,176,237, 46, 84, 85,
-134, 86,112,165,128, 45, 94,131, 20, 90, 79,162,113,138, 99, 24,221, 36,176, 47,209,229, 10, 37, 44, 4, 50, 83,167, 78,165,170,
-189, 29,129,150, 1, 63, 90, 14,249,137,241,112, 59,165, 89,170, 68, 11,125, 83, 1, 11,180,209,154, 80,164,136, 13,108, 37,139,
- 20,137,246,147, 78, 37, 70, 24, 23,238, 17, 76,209,254,201, 21,200, 98,253, 24, 5, 90, 81, 18,123,204, 32,192,210,130,173, 31,
- 75, 69, 13,154,252,180,160,114, 45, 79,195,184, 65,225, 99, 42,155, 9,140,120,114, 87,191, 63, 35,219, 29,213, 79, 0,192,228,
-223, 4,103, 13,141,106, 70,154, 53, 48, 97, 7, 34,231,158, 20,142,242,210,227, 59,234, 69, 1,169,152,139,188,227, 37, 75, 30,
-120,246,218, 77, 25,179,112,129, 12,155, 53, 67,166,109,184, 32,131,151, 94,151,178,141,202, 74,193, 10, 9,149, 84,166, 78, 78,
-233, 54, 5, 38, 19, 6,128, 22, 54, 34, 44,132, 4, 83, 1, 89,208, 2, 28, 37,160,130,245,193,193, 75, 19, 38,120,173,138, 25,
-211,251,198,210,165, 94,120,247, 1,140, 1, 7, 48,190, 30,132, 26,151,139,226, 47,117,152,113,183, 96,166, 76, 41,145,217,136,
- 91, 8, 51, 52, 63, 57,175,198, 24, 94,193, 34,255,170,195, 30, 69,210, 69, 3, 93, 53, 64,162,244, 24, 32, 72, 32, 33, 80, 36,
- 39, 28,136,238, 52,110, 44,247,123,245, 82, 36, 89, 28,160,184, 18,220, 0,125, 60, 26,223,253, 61,219,183,174,167,107, 8, 29,
-230,132,131,154,131,206, 58, 21,160, 69, 73, 22, 36, 48,244,246,160, 0, 45,236, 20,242, 5,104, 80,128,150,193, 93,135,225,195,
-198,141,118,165,211,153,221, 65,149,111, 66, 77,114,110,185,196, 56,191, 74,226, 2,112,197,109,253, 92, 98,180, 4,200,106,250,
- 76, 10, 12,124, 33,149, 6, 95, 8, 10, 19, 41, 30, 61,177,135, 15, 65, 5, 86, 85,253,104, 97,146,164,223,151, 26, 33,160, 97,
-123, 4, 32,233, 4, 7,197, 46, 93,186, 60,134,106,242, 26,207, 4, 92,188,110,130,238,120, 72,113, 20,127,102,124,150, 32,139,
-219,248, 9,178, 32, 25, 81,220,110, 12, 26, 52, 72,177,221,161,127, 37,230,197, 10,221,169, 29, 29, 86, 57, 62,244,153,117, 96,
-223, 94, 75,157,220,201, 44, 27,250,214,181,216,131, 44, 74, 10,204, 2,173,180, 9,162,102, 42,150, 41,133,223,209,149, 51,100,
- 73,235,146,210,177, 73,173, 64,140,220, 73, 99,197,240,232, 31, 59,154,199,133, 40, 17, 61, 94, 33, 5,149, 44,156, 59,176,127,
- 73,143,183,197, 51,122,208,149,130,203,131, 52,139,103, 76,113,239,248,186, 57,150, 37,191, 23,181,116,105, 86, 39,128, 52,241,
-144,153,176, 62,193,222,161, 71,211, 96, 8, 30, 83, 52, 13,134,224,177,209,212, 2, 45, 0,255,250,152, 84,207,161,222, 30,170,
- 9, 70,211, 79, 96,175,225, 15,251, 60, 11,128,213, 83,148,249, 62,164,207,190,248, 77,195, 96, 74,163, 13, 31,246, 64,136, 18,
- 51, 92,243,228,117, 61, 34, 42,208, 82, 92, 54,104,193,150, 70,213, 24, 18,250,244,248, 78,207,239,120,255, 66,238, 42,228,238,
- 66, 26,190,171,234, 66,141, 36,107, 33, 60,226,211, 38,175,178, 78, 89, 79,169, 32,139, 18, 45, 74,135,120,192,181, 3, 23, 37,
- 59,176, 35, 49, 60,129,150, 1,207,240,142, 94, 19, 6, 64,207,230, 3,138, 64,129,174, 29, 32, 89, 86, 12,187,127,173, 84,233,
-230, 28,171,235,135, 94, 63,252,240,140,126,183, 64,196, 33,216, 34,208, 98, 63,215, 3, 89, 44, 59, 54,214,248,234,213,143,245,
-126,130, 40, 73, 60, 54,106,193,214,216,187,249, 20,144,213,106, 89, 58,137,156,216,131,128,226, 7,131,180,108,217, 32,129, 90,
- 77, 87, 64, 52,136,111,209,162, 5,249, 56, 13, 55,233, 75, 75, 61, 98, 1,128,253,197, 93,178, 92,252,205,158, 61,155,243, 7,
- 61,145, 59, 60,208,182, 21,160, 69,144,197,221,135, 57, 10,148, 10, 88,182,253,172,244, 24,214, 82, 1, 85, 77,122, 15,145,214,
- 19,207, 75,189, 97,199,165,120,163,134,202,181,186,221,255,148, 58,221, 23, 26, 85, 29,246, 0, 0, 62, 10, 59, 92, 74,175, 14,
- 1,104,237,167,186, 16, 11,161,131, 87, 38, 77,242, 90, 27, 47,158,247,227,135, 15, 15, 99, 14, 60, 8, 41, 54,129,214,151,220,
-117,248,185,220, 45,132,182, 91, 8,179,205,196, 97,254,175, 92,162,229, 58,168,180,253,199,169, 14, 75,233,132, 52,101,178,100,
- 1,148,152,112,149,167,120,136, 77,159, 94,174,229,200,161, 72,177, 8,178,182,163, 51,197,141, 29,219, 63,193,183,113, 7, 26,
-113, 88, 10,123,145, 58,127,252,241,199, 85, 21,104,161, 81, 43,192, 10, 43, 10, 95, 44, 34,124,177,250, 86, 64, 23,119, 29, 98,
-146,112,228, 3,199,145, 51,183,172,177, 82, 36,189,211,234,236,174,160, 54,190,199, 37,243,213, 45, 18,239,226, 26, 5,104,165,
-233,238, 47, 53, 38, 88,164,242,208,171, 65, 81,227, 38,163, 47,144,172, 14,106, 88,207, 65, 92, 90,128, 44, 63, 74, 6,120, 64,
-245, 67, 85, 13,109,157,156,133, 9,226, 43, 92,210,164,221, 23,105,193,102,135,134,182, 63,242,108,245, 12,239,202,238,203,158,
-102,102,110,139,102, 93,112, 0, 38, 40,230, 42, 28,198,155,138, 52, 3, 42, 88,197, 38,130,206, 13, 41,241,176,238,236,153, 98,
-247,253, 54,154, 42,208,162,205, 75,221, 10,197, 44, 53,179, 37,180,252, 92, 32,147, 77,146,197, 73,204, 32,208,178,209,252, 33,
- 81,180,116, 69, 1,136,142,173,155, 27,180,121, 72, 75, 25, 81, 41,109, 80,250, 68,209,104,215, 20,236, 40,154,193,195, 71, 46,
-174,120, 47, 3, 60, 44,197, 51,121, 92,117, 85, 71, 25, 65,179, 68,166, 20,119, 85,181,230,232, 42,105, 45,160, 73,163,116,179,
-135,173,156, 95, 11, 77,173,234,208, 94, 90,244,209,127, 23,174, 23,244,218, 39, 25,105,183,235, 80, 81, 77,234, 48, 56, 88,251,
-204, 6, 59, 45,244,153, 74,122, 64, 75,125,143, 19,250, 14,251, 17,253, 99, 81,250, 74,176, 69,103,186, 4, 90, 60, 27,148,100,
-217,104, 98,194,239, 4, 59,174, 32, 26,111, 19,100, 81,189, 78,233, 61,141,179, 1,130, 87,170,126,180, 24,227,144,177, 14, 25,
-243,208, 72, 8, 30,242, 9,182,140, 21,186,117,235,182, 79,149,104,209,232,157, 96, 1, 19,182, 55,198, 58,111,244, 81,239, 49,
-189,122,221,156, 86,178,100,192,123,236, 70,164, 39,121,122,148,215,240,216, 86, 78, 0,204,123,148,182, 81,106,173,218,102,114,
- 60,166,221,150,106,192,175, 12, 78,250, 64,203,158,159, 73, 62, 2, 91,119,242, 73,162, 28, 17,239, 99,135, 33,243, 58,242, 88,
-111,223, 12,236,105, 38,131,196,247, 21,213,156, 4, 91,112, 94, 74,199,165,111,105, 28,143,157,218,167,106,213,170,245,146, 18,
- 47,126, 7, 77, 26,224,130,134,246,191,137, 92,140, 75,138,234,144, 32,139,231,254,131,135,223, 44, 86,169, 73,224,142,163,103,
-165,116,205, 52, 82,191,223, 66,120,110, 63, 37,229,250, 28,147,130,191, 77,146,226, 85, 83,202,188,181, 43,229,187,172,165, 2,
-236,140,225,157,141,201, 63, 96, 60,223,134,113, 20,194, 53,175,131, 4, 89, 56, 19,104,237,135,166,229,192, 99, 63,191,195,104,
- 27, 7, 49, 71, 29,132,173, 50,119,135,106,119,135,235,205, 29,102,199, 36,251,185, 35,180,220, 45, 4, 43,103, 40,185,133, 8,
-245,111,255,202,129,150,185,186,214,134,224, 73, 16, 55,238,144, 88,177, 98, 62,132,106,240, 37,108, 35,108, 14, 75, 41, 33,193,
-202, 50, 0,232,254,110,226,248,241,250, 25, 13,193,131,149,217, 17, 12, 14,116,235,239, 11,189,252, 29, 74,174,248, 27,157,200,
- 23, 78, 2,111, 66,220,172,248,213,226,117, 26, 41,154, 0, 69, 25,191,137, 31,231, 82,158,126,157, 31,215,217,191, 74,218,221,
-242,146,223,103, 63,147, 74,253, 78, 72,166, 42, 67, 30,123, 68, 78,200, 56,104,246, 65,175, 85,242, 46, 27, 12,236,167, 22, 17,
-104,210, 70,139,118, 16,140,117,104, 53,246, 92,228,130,179,122, 64, 75,241, 12,111,114, 39,163, 35,154,171, 96,215,166, 12,184,
- 20,193,195,227,190, 50,184, 97,194, 81, 28, 89, 18, 20, 98, 21, 38,187,119,239, 22, 72, 40, 57,160, 57,141, 33,168, 2, 45,240,
-223,130, 65,197,114,245,202, 69, 75, 0, 38, 51,170, 11, 85,144,101, 22,104,101, 76, 18, 99,201,209, 85, 51, 20,144, 53,236,231,
- 31, 3,115, 38,143,225, 75, 53,162, 67,160,117,244,175,119, 4, 90, 37, 51,121, 80,234,232,116, 48,207,152, 36,230,146, 99,144,
-100,209,118,140, 18,183,156,201,162,251, 82,229,103,174,149, 43,185,255, 15,180,190, 18,154, 95, 26,104,169,210, 43, 45,232, 50,
-218,230,237,237,180,236,119, 40,170,126,180,236, 65,157,179, 9,215,238,122,101,171,231,247,182, 80,227,159, 39,208,194,153, 0,
-189,133, 1, 73,150,173,222, 9,154, 32, 1, 76, 15,192,197,177,230,255, 62,179, 0,178, 32, 25,250,246,255, 14, 75,203,212,136,
-149,169,214,177,176, 41, 75, 85, 54, 10,180, 48,214,173,229,110, 57, 38,198, 57,196,194, 71, 1, 10, 12,195, 3,239,230,135, 17,
-231,213,155,158,226,187, 98,220,243,252,225, 7, 63,198, 70,100,140, 68, 71, 64, 11,125, 83, 1, 90,122, 32, 43, 4, 64,139,175,
-179,129,173,137,143, 10, 72,209,182, 9, 4,190,178, 58,227,122, 74,131,125,202,209,184, 84, 24,113, 80,159,210,167, 27,119, 72,
-194, 77,140,162,226,198, 78, 81, 69,250, 78,137, 23, 35, 24, 64, 93, 78,187,193, 34,174,250, 59, 3, 69, 51,134, 33, 19,234,100,
- 51,164,184,155,163,196, 78,252,188,121,207,169, 65,139,119,156,146, 86,131, 39, 74,229,254, 39,164, 88, 15, 47,105, 48,252,168,
-204, 90,179, 74,170,255,230,249, 62, 66, 76,248,210, 10, 46, 33,116, 58, 38, 67, 2,220, 18, 59,184,119, 67,170,117, 20,170,221,
- 67,144, 60, 30,232,215,175,223, 97,240,251, 0, 37, 89, 80,219, 30,196,162,118, 59,180, 44,246,110,108, 66, 29,108,104,199, 37,
-252, 14, 45,119, 11,193,202, 25, 74,110, 33, 62,199,183, 27,108,114,255,130,108,246, 65,165,119,110,221,180, 1,246, 87, 83,176,
-170, 90,158, 36, 86,172,219, 72, 55, 49,136, 44,138, 17, 45,202,120,170, 11,205, 4,149,198, 42,111, 7, 86, 49, 87,176,130,184,
- 10,144,246, 39,118,139, 93,162,125, 22, 92, 69, 92, 5,202, 30,130,109,234, 23, 33,190,245,197, 32, 74,255, 55,185, 92,117, 64,
- 7,247,194,225, 90, 67,143,104, 81, 23,120,196,138,113,211, 35, 82,220,155, 30, 17, 98, 44, 80,174,121, 96,125,230,252,112,217,
- 96, 24,232,217,234, 71,235, 17,118,204,221,133,234,243,225, 39, 4,128, 86, 74,193, 29,139, 86, 95, 92,156, 28,210, 96,165,135,
-191,138,111, 46,218,106, 56, 59, 28,149,147,222,223, 55, 83,106, 69,176,165, 58,175,227,128, 76,122, 84, 23,114,101, 9, 91, 35,
- 74, 35, 26,185,226, 39, 6, 50, 31, 2, 44, 12,232,138, 47, 34, 24,239,126, 4,178,204, 2,173,188, 41, 99, 29,155,211,164, 64,
- 16, 65, 86,142,100, 49,238, 82, 61,231,232,227,114,167,245, 56, 67,169, 22, 83,190,116, 30,142, 92, 80,216,190, 61,239,247, 49,
-143, 45,104, 81, 80, 1, 89,185,146, 69,191,227,140,166,129,174,248,213,209,212,170, 14,245, 36, 90, 58,206, 63, 77, 13,146, 33,
- 1, 90,228, 63, 85,136, 70,124,100,185,160,111,164,156,149, 49,110,112, 82,117,229, 47, 75,219, 28,130, 1, 45,163,241, 14, 29,
-229,211, 16,253,168,156,144,222, 47, 1,200,216,135,177,109, 63,198,206,158, 24, 59,246, 80,109,136,208, 78,251, 49,177, 3, 91,
-253,176,139,241, 14,177,243,238, 64, 74, 15,143,238, 57,194,134,157,128,149, 96, 41, 71, 52, 9,180,216,183, 85,205,130, 35, 73,
- 86, 8, 37, 90,234,235,146, 96,119,225,124,236, 68,188, 31, 57,190,199, 4, 92,228,198, 28, 61,207,247,234,179,206,234, 40, 9,
-198,148,253,240,149,165,216,107,209,132, 1, 27, 24,184,107,150,139, 85,218, 12,134, 60,160,118,228,184, 73, 0,164,142,101,253,
-169,138,165,237,208, 53,210,103,230, 49,233, 54,249,168,212,238,190, 64, 82,102, 46, 26,224,196, 97,169,171,182, 20, 22,182, 90,
-109, 49, 47,109,133, 49,255, 97, 72, 30, 15, 19, 28, 99, 28, 61,132,249,234, 32,234,106, 43, 22,170,220, 88, 97,207, 19, 35,237,
-211,192, 80, 20, 44,139,150,230, 72,110, 70, 11, 5,119, 11,246,229, 12,169, 91, 8,135,253,200,236, 7,186,243, 91, 57, 64,176,
- 69,201, 22,213,136,180,187,114,100,228, 78,163,121,218,115, 49, 15,243,242, 25, 59, 6, 58,106,132,169,177, 42,216,136,129, 53,
- 59,243,162,241, 86,134, 93,201, 25,158,249, 31, 82,172,202, 72,231, 32, 78,110,230,164, 50, 62,119,195,254,232,181,144, 58,213,
- 1,240,248,157,103,222,228, 25, 78,226,108,255, 67, 82, 78,240,179, 4, 36, 80,181,161, 62,168, 14,112, 85, 25,182, 84,213, 49,
- 16,213,198, 74,195, 17,184,212, 27,208, 8,182,230,211,208, 29, 64,246, 62,207,106,130,173,137, 31,125,110,225, 62, 85,134,142,
-236, 63,108,252,228, 78, 83,172, 24,125,152,184,179,144,137,246, 88,246, 9,147,198, 71,170, 63,103,245,158, 62, 81,244,159,242,
-166,136,177, 63, 75,226,232,251, 50, 36,140,150,254, 19, 58,152,173,156,164,153, 39, 69, 44,208,140,177,247,191, 70, 83,235,176,
-148,191,245,254,187,224,183,233,126,100,149, 64,121,134, 38, 77, 45, 45, 39,244, 77,151,211, 64, 27,251, 82, 52, 83, 99,242, 94,
- 4,187, 75,117,172,251, 25, 99,223, 78,140,111, 63, 91,199,186,159, 33, 77,219,141,177,174,145,222, 24, 2,169,142, 23, 64,203,
- 61,107,242,165, 29, 22, 19,254,223,101, 2, 16,187,163, 38,140,167, 90,255, 85,246,164, 93,125,123, 2,100,166, 67, 99,142, 65,
- 49, 13,240, 81,111, 92, 82,239,211,255, 34,237,207, 56, 6, 13, 65,226,216,158, 85,135,190,145, 58,250, 38,124,148,184, 45,233,
-194,129, 70,239, 76,145, 98, 37,219,239, 34, 4,143, 17,154,233,192,235,129,168,167, 85,168,187,189, 72,171, 49,222, 13, 66, 89,
-211,233,213,145, 9,126,233,101,213,150, 51, 58, 50,211,241,232,167,186, 91, 48,242,237,122,229, 50,211,150,204,210,250, 55,228,
-215, 13, 63,248,185, 62,242,107,169, 92,119, 57, 67,183, 5,184,249,233,230,103,104,113,192,221,150, 66,139,147, 31,232,184,249,
-105,156,159, 70, 92, 90,184,249,105,156,159,255,246,156,174,141,225, 63,227,215,187, 27, 97,232, 50,215,205, 79, 55, 63, 67,139,
- 3,238,182, 20, 90,156,116, 3, 24,119, 91,114,183,165,208,229,192,215, 73,205,165, 68,139,157,196, 81, 50,243,169,206,104,184,
-186,174, 71,223, 77,211,113,189,132,180,190,220,252,116,243,211,104, 27,112,247, 77,231, 28, 48,202, 67,109, 62, 55, 63,221,252,
-116,196,129,255,114, 91,210,235, 19,238,251, 38, 56,224, 94,233,152, 96,150,129,172,110,126, 26, 96,146,137, 44,110,126,154, 96,
-150,129,172,110,126, 26, 96,146,137, 44,110,126,154, 96,150,129,172,110,126, 26, 96,146,137, 44,159,131,159, 38, 94,255,143,203,
-234, 86, 29,234, 84,201,231,104, 48,110,154,161,219, 15,220,252,116,243, 51,180, 56,224,110, 75,161,197,201, 15,116,220,252,116,
-243, 51,116, 57,240,117, 83,251,226, 70,241,255,198, 14, 72, 3, 73,198,236,218,131, 68, 15,204, 60,243,191,189,225,164,209,111,
-231,238,158,193, 72,220,201, 71,122, 60, 15, 68,226,110, 19,251,195, 40, 77, 51,205,244,171,164,201,237,242,216,165, 54,156, 9,
-187,175,148,132, 93, 87,195,177,115, 82, 73,112, 29, 50, 28, 59,135,122,126, 70,128,237,108,235,251, 71,252, 84,203,170, 45,167,
-182,172,159,185,156,206, 88,240, 85,214,187,153,134,237, 34,239, 63,225,219,211, 98,119,155, 55,202, 24, 98,167,199, 33,228,197,
- 63,225,219,141, 20,221, 93, 78, 35, 92, 50,158,231,139,242, 19,227,219,111,240, 36,192,157,176,246,126,199,140,151,248,235,204,
-233, 26,100,193, 65,232,110, 38,245,219,176, 69,248, 0, 6, 2, 63, 51,137,207,216,241, 38, 88,229,242, 62, 38, 65, 63,251,132,
-137,230,165,179,247,224, 30, 67,135,104,143, 47,218, 96,236,222, 77,247, 8, 27, 48,137, 47,159, 48, 97,194, 47,240,129,211, 5,
-206, 65, 59, 32, 36,207, 50, 92,223,140,164, 5, 91, 70,202,153, 31,222,167, 47,195,207,206, 16,120,184,110,141, 32,208,157,224,
- 8,245,207,198,141, 27,207,128, 3, 69, 58, 88,205,245, 15,250,118, 51,205,222,200,183,155,161,199,188,193,104, 18, 96,193,145,
-234, 20, 38,132,130,154, 2,175,206, 83, 16, 74,101, 10, 98,115, 78,129, 47,176, 41,240,238, 61,133, 96, 43,180,129, 22, 92, 94,
-228,192,187, 15,193, 15,218,123,156, 15, 34,101,211,171, 35,251,178,194, 63,153,173,172, 8,130,240, 89,202,105,128,185,159,189,
-142, 12,148,193, 72, 22, 71,229,108, 10, 55, 38, 43,224,151,234, 14, 92,163,156,134,251, 18,134,120,177,247, 44,238,138,182,222,
-183,199,194,195,163, 16,139,239, 32, 92, 47,220,129, 63,172,131,252,143,196,235,206, 14, 61,154,218,231,210, 22, 41, 82,132, 65,
-208, 5, 94,233, 25,123,213, 25,216, 50, 67,211, 8, 47, 63,234, 71, 70, 31, 10,237,126,100,224,189,238,111, 55,192, 36, 19, 89,
-156,242,147,174,155, 48, 86,174, 64,186, 1, 87, 33,111,224,253,254, 13,252, 91,222, 64,220,216,149,112, 58,235, 42,118,177, 83,
-154,152,207,233,136,156, 14,185, 95,160, 15, 61,192, 34,243, 38,232,211, 77,133,174,219, 16,123, 44, 98,226, 27,255,238,172,250,
- 33,120,240,113, 69,152,212,146, 98, 21,126,139, 78,241, 16,192,213, 22,211, 16, 1,112,149,224,171,188,206,184,135,136,139,167,
- 68,141,167,199, 98,120, 56, 22, 62,227,106,210, 1,186,189,141, 73, 70,245,171,167,156,249, 31,192, 43,144,116,237, 15, 94, 99,
-140, 47,189,137, 44, 20,184,107,180, 83,183, 66, 3, 90, 16, 16, 96, 57,255,240,209,211, 75,149,107,255, 86,109,249,202,149,205,
-224, 45,126, 9, 6,206,213, 40, 7, 37, 91,234,161, 71, 51, 22, 64,214, 21,132,232,168,231,217,111, 80,251, 74,191, 52,111,154,
-227,167, 82,149,155, 53,251,173, 10, 66, 63, 12, 64, 56,157,169, 86,176,165,149,108,233,209,244, 64, 99,222,132,137,253, 34, 19,
-126,111, 49,192, 27, 93,154, 6,104,216,103,209,163,233,200,121,172, 43,135,178, 31, 77, 16, 42,120,129, 3,199, 41,240,228, 60,
- 5,147, 22, 3,212, 78, 65,168,161, 41,112, 48, 56, 5,142, 6,167, 0,216,135, 54,208, 10,135, 65,233,246,130, 5, 11,100,196,
-240,225,140,251,199,100,239,179,232,163,111, 87,203, 74, 80, 5,199,131, 83,224,144,119, 10, 60,153, 79, 65,248,169, 41,240,194,
-239, 6, 90,174, 27,152, 61, 63,187, 35,162,132,226,192,145,142, 28, 25,118,138,206,122,225, 80,242, 49,200,164, 54,216, 86, 93,
-181,207,248, 0,209,143, 38, 77,154,164, 4, 70,102,128,118, 70, 85,128,151,112,198, 33,125, 4,250,241,157,188, 67,175,205,219,
- 30,163, 36, 11,126,248, 4,237, 65,113, 48,140,133, 22, 3,212, 59, 2, 91, 70,105,134,193, 56,217, 30,105, 29,250,252, 86,164,
-126,160,231, 44,116,142, 43,154,137,225,227,235, 32, 22,183,126, 76,144, 72, 40, 9,244, 2,213,133, 48, 23,201, 24,231, 5,255,
-181,139,106,163,229, 52, 88, 61, 74, 54, 55, 77, 51,220,210,207,235,144,159,168,207,166, 88, 72,188,129,191, 48, 1,192, 18, 56,
-207,149, 44, 89,178,176, 77, 74,129, 2, 5,164, 68,137, 18,111,138, 21, 43,214, 84,175,205,231,207,158,176,113,254,156,137,110,
-255,148, 43,137, 47, 83,225,252,105, 24, 77, 68,224,228, 87, 9, 17,199,132, 96,247,239,225, 39,242, 38,104, 57, 5, 91,214,160,
-210,193,176,136,254,167,125, 37, 57,212,248, 66,218,226, 2,217,222, 98,208,104,134, 77, 64,236, 39,221,196,192,211,122, 64, 11,
-168, 86, 1, 90, 28,192,212,164, 2, 45, 2, 58,251,247, 48,112, 53, 99,124,125, 73,160, 85, 35,163,135, 48,209,155, 53,147,246,
-127,161, 31,162, 48,196,205, 47,247, 31, 62,189,130,116,162,112,233,154, 69,187,214,173,155,247,250,249,243,173,224, 73,120, 46,
-202, 73, 53,162, 81,160, 53, 36, 87,174, 92,131,123,254, 57,184,131,207, 45,191,147,183,125, 31, 28, 45, 90,177, 65,165,210,229,
-171,149,200,151, 47, 95, 54,196,214, 26, 51,124,248,240,149, 32, 54,208, 4, 77, 15,132, 11,186, 8,169,142, 50,128,227, 55,165,
- 98,122,199,151, 30,208,232,188,145, 94,234, 21,231,175,214,131,191,121, 77,113,236,168,215,169,121, 95, 5, 47,224,251,148,203,
-151, 47, 79,193,132, 56, 5,241,227,166, 32,144,246,148,181,107,215, 78, 65,176,218, 80, 7, 90, 73,147, 38,205,140, 56,157,175,
-255,130,151,107, 53,124, 12,206,239, 81, 28,173, 26,241, 35,126, 82,101, 72,201, 27, 1, 33, 60, 79,191,196, 10,239, 45,194,197,
- 40, 9, 65,135, 95, 0, 80,115,162, 61,105, 77,140,165,102,127, 56,170,163, 84,112,118,185, 18,233, 38,158, 15,100,194, 96,121,
- 19,255, 71,227, 97,109, 0, 95, 67,252,212,100, 74,142,223,244,176, 94,193, 73, 42, 15,207,222,206, 0,141,179,182, 20, 90, 52,
-191, 3, 47,131, 16, 30, 69,241, 52, 94,178,100,201,183,149, 42, 85, 10,162,199,113,254, 71,121,219,233, 53,118,235,125, 87,109,
-190,241,226,197,139, 5,139, 29, 37, 78, 40, 34, 42, 88, 16,240, 93, 24,114,139, 1,218,241,124, 35, 35,237, 83,167, 28,149, 81,
-238,231, 92,176, 2,116, 11, 2, 76, 19,196, 57,138,157,234,170,156,116, 82,220, 21,105, 51, 36,122, 47, 59,119,238,236, 15, 41,
-238, 43, 44, 48,252, 59,118,236,120, 18, 64,233, 50, 38, 81,163,230, 7,148,196, 15, 64, 8, 52, 95,132, 47,122,205,152,143, 28,
-143, 25, 67,145,139,107,134, 29, 99,100, 12, 46,174,153, 56,182, 64,178,171, 93, 84, 87, 50,200,119, 51,217,190,200,184,132,126,
-243, 22,133, 98,189,146,159, 30,122,255, 13,246, 77, 51,223,233, 40,239, 23,249,118,128,229,150, 88,236, 43, 99, 25,164, 87, 10,
-184,178, 79, 0, 90,130,240,123, 82,185,114,101, 71, 42, 64, 91, 57, 11,228, 74,228,243,232,234,116,145, 39, 75,149, 52,122, 80,
-147, 0, 2, 45,132,233,147,209,163, 71, 11, 3,136,115, 81,132, 0,226,239,172,146, 45,135, 60,114,132, 69, 62,149,153, 95,240,
-121,123,181, 97,240,255,206,128, 22, 59,218,145, 35, 71, 4,171,111,221, 68,160, 69,112,230,234,163,112,255, 14,165, 96, 20,153,
-171,137,255, 41,209, 34,226,181,127, 15,175, 65, 10,102, 52, 18,189,250,234, 70,152,108,198,226,143,209,213,109,176, 34, 19, 92,
-161, 49,212,118,148, 48,160, 61,198, 0,220,233,151,223,254,172, 91,177,122,243, 82, 91,230,207,111,114, 99,199,230,214,143, 14,
-236,170,135, 54,197,201,210, 76, 89, 15,141, 31, 63,190,101,197,186,157,126,247,123,248,228,252,163, 39,207,207,245,233, 53,232,
-215,233, 35,134, 54, 92, 58, 98,104,117,239,131,251,106, 32,198,214, 46,208,212,243,194, 30,172,252, 4, 90, 28, 36,217,176, 1,
- 12, 28,197, 12,252,130,237,238,163, 87, 41, 32,139,135,117,112,227,127, 71,215,248,160, 75, 9, 23,193, 11, 85,134,170, 52,139,
- 0, 70, 5, 47, 42,128,193, 32,162, 5, 48, 39, 65,211, 17,136,209,229, 7, 6,162, 45, 28,140,176, 26,147,206, 29, 59,190,230,
- 89, 3,180, 92,121,225, 86,104,171,101, 37, 32, 36,200, 98,187,118,116,176,222,144,157,229,212, 59,210, 35,224,250, 83, 72,196,
-130, 56,241,145, 30, 39, 67,246,159, 42, 85,170,188, 68,251, 39,192, 14,175, 71,196,201,253,242, 8, 74, 94, 24,210,150,130,142,
- 18, 64, 78, 17,148,221,217, 10,215,217, 43, 67,139, 38,219, 68, 37,240,127, 19, 34, 30,140,180,182,145,236, 12,241,194,224,196,
- 8,107,195,144, 46,159,116, 96,140, 90,195,240, 85,144, 52,179, 46, 74, 88,137,149,104,222,188,185, 18,164, 29, 82,210, 79,125,
- 71,218,194,133, 11, 63, 60,117,234,148, 34,137,163,196,108,203,150, 45, 2,211, 1,210,230,162,210,149,205,150,250,109, 25,161,
-214,244, 70, 44,211, 75, 0,106,129, 12, 40,207, 69, 49,195,243, 32,156,153,162,117,232,213,171,215,113, 72,167, 86, 24, 96, 6,
- 65,214,160, 41, 83,166, 60, 97,155,172, 87,175,222,123,126, 63,227,218, 82, 26, 65, 16,171,198, 43, 68,104, 26,129,121,131, 2,
-182,236,128,150,171,215, 60,195, 77,242, 50,150,129,178, 24,201, 66,122,140,143,168, 36, 68,192,120,141, 5,198,107,212,219,107,
-128,213,215,232, 7, 93,240, 25,122,210,113,219,123, 48,166,191,179,150,143, 30,241,195,232,253, 55, 82,192, 47,144, 39, 25,198,
-182, 21, 72, 79,145,158,163,204,107, 48,198,164, 52,243, 94,140, 95,241, 32,201,122,139,249,194, 6,174,176,240,231,248, 33, 21,
- 42, 84, 16, 4,104,183, 93,199,162, 64,126,255,253,247,183,232, 3,241,156,189,163, 64,142, 68,191, 21,200,153,208,183, 80,158,
- 36,126, 76, 69, 11,164, 85, 36, 90, 61,123,246, 84,226, 90, 82,136,194,152,151, 12, 7, 7,128,247, 30,229, 94, 14, 90,197,237,
-233,253, 75,128,150, 10,176, 62, 2, 90,158,246,122, 81, 84,220, 45, 14,224, 68,161, 90, 9,148,179,223, 0, 5, 4, 69,183, 93,
- 85, 54, 58,131, 47,243, 81,108,174, 38,254,135,212, 74, 81, 29,218,211,230,181, 16, 0,173, 78, 24, 36, 71, 3, 53,143, 64, 89,
- 76,131, 45, 21,104,161,141,112, 66, 9,150, 64,243, 36, 36, 38, 29,151,173, 94,219,226,207,230,205,139, 94,223,184,166,245, 75,
-175,131,163,228,218,165, 89, 0,154,171,241, 62,173, 68, 75,175,221, 63,198,196,216, 41, 87,209,154, 53, 43,214,235, 82,187,159,
-231,208,223, 86, 78,153,214,229,208,146, 5,189,206, 46, 91,216,254,218,222,157,213,240,126, 2, 55, 51,224,205, 3,224, 74, 1,
- 90, 12,250, 13, 53, 23,227, 40,254, 83, 14, 14,126, 10,190, 96,157,175, 95,191, 94, 5, 91,202, 53,170,160,169, 74,177, 14,122,
-186,101, 38,120,161, 93, 22,212, 71, 83,208, 70, 21, 0,195,213,183,179,131,210, 81, 16, 61,169, 75,216, 65, 6, 12, 74, 5, 1,
-222, 94,183,109,219,150, 82, 66,130,172, 23, 72,254, 72,119,105,179,165, 71,147,101,165, 93, 22,213,155, 44, 39,203,200, 9, 17,
-113,239,132, 11, 20, 46, 54, 8,148,172, 0, 84,183,140,152,100,103,162,191, 6, 81, 34, 2, 41,134, 0,108, 42,103, 72,247, 20,
- 21, 62,236, 42, 44,200,211, 87,175, 92, 78,238, 87,112, 6,178,212,235, 40,167,217, 93, 53, 14,105,222,186,117,235, 39,180,209,
-181,136,121,119, 51, 4, 52,213,226,127,147, 63,127,126, 11, 3,169,163,142,238,135,240,155,109,143, 17, 4, 65,157, 43, 56,191,
-194, 69,117,194, 14,135,224,199,175, 8,136,160, 86,161, 77,149,209, 35, 45,108, 93,110, 21, 45, 90,244, 17, 76, 11,148,132,192,
-244,207,217,214, 25, 92,121,222,188,121, 82,166, 76, 25,129,189,167, 2,108,250,247,239, 47, 0, 71, 52,144,119,117, 68,134,125,
-218,113,240,206, 66,112,197, 9,140,192,135,245,206,241, 19,170,115, 69, 66,134, 54,113, 23,192, 83,143, 31,193, 64, 22,193, 22,
-218,205,115,106, 25, 56,126, 16,100,177,159, 2,208, 11, 65, 22, 23,221,124, 7,223,135,182,239,114, 81,173,249,128,103,214, 62,
- 45, 0, 69, 12,108, 31,203, 40,243,156,228, 35,192, 82,198, 9,210,163,202, 11,115, 4, 37,130,180, 7,162, 41,202,191, 29,104,
- 37, 37,184, 66, 27,120,131,249,136, 66, 10, 46,168,223,160, 93,190, 40, 85,170,212,119, 70,121, 11, 80,191,145,188, 83, 37, 89,
-117,234,212,145, 97,195,134, 81,138, 27,136,113, 46,176,126,253,250,242,211, 79, 63, 41, 96,139, 0,172, 93,187,118,210,186,117,
-235,141, 70,233, 99, 78,247,211, 2, 45,130, 45,246, 43,158, 33, 53, 85, 22, 22, 80, 77, 6,129, 94,125, 45, 77,140,107, 31, 97,
- 17,163,239,252, 7,228,211,119,239, 96,111,163, 69,160,197,137,139, 3, 2,197,232,122,201, 8,208, 98,108, 46,174,186, 40,154,
- 86, 19,255,163,163, 4,114,210,176,127, 7,197,213, 4,103, 38, 25,216,201,211,211,115, 10, 84, 60,220,121,102, 26,108, 81, 85,
- 72,105,150, 35,160, 5,195,213, 9, 24,112,247,162, 92, 11,111,156, 61,219,234,209,150,245, 13,229,242,133, 89,242,246,245,195,
-242,229,203,111, 67, 57,181, 54, 90,122,197, 62,132,149, 98,239, 58, 13, 26, 87,170,215,168,117,229, 57, 67, 70,182, 56,188, 96,
- 78,239,155,219, 54, 77,185,183,126, 85,191,151,103, 79,118, 3,208, 60, 7, 34, 46, 37, 90,140,102,207, 64,220,106,194, 74,196,
-143,160,130, 43,124, 4,175,189,143, 70,125, 81, 77,204,171, 87, 40,222, 71, 39,220, 12, 0,113,145,210, 49, 2, 55, 12, 98, 10,
-141, 84,169, 82, 93,132,241,241, 69, 12,104, 23,161,203,191,136,137,141,215, 13,209,180,190, 87,145, 94,113,240,102,123,161, 58,
-134, 7, 85, 17,156, 32,172, 3,168, 86,165,232,180,184, 4, 47, 52,126, 71,251,156,130, 85,246, 20, 74,177, 72, 11, 27, 20, 20,
-251, 29, 2, 15, 2, 55, 2, 25, 78,108, 38,164, 69, 31,189, 19,224, 72,153, 4, 1, 10,130, 84, 73, 22,120,147, 5, 60,112,102,
- 7, 19,140,134, 90, 86, 21, 16,178,156, 4, 69,236, 3,252,118,182,125, 85,202,133, 7, 79,234,213, 17,164, 89,190,156, 88, 9,
-212, 8,178, 48,233, 42,223,202,190, 68,190, 82, 90,130, 9,243, 29, 82, 0, 6,211,187, 0, 50,236, 7,174,140, 90,181,175,252,
- 98, 64, 11, 54, 33, 84,141,211, 54,100,205, 39, 0, 45, 15, 76, 4, 79, 8,180, 48,217, 60,209,227,157,222,125,128,161, 39,156,
- 16, 0, 86,131,209,194,132,243,196, 10,180, 12,191, 3,147,141, 55,235,135,135, 42,117,100, 29,173, 94,189, 90,168,158,156, 53,
-107,150, 50,129, 97,133,255,146, 54, 96,104, 83,142,212,135,246, 69,238, 14,213,248,101,130, 44,154, 8,144, 6, 23,164,180, 87,
-131, 36, 82,233, 83,228, 5, 36,101, 47, 49, 25, 63,213,249,222,190,170, 36,139,103,228,221,133,103, 94, 52,107,214, 76, 1,128,
-229,202,149, 83,164, 27,107,214,172,177,129, 44,142,209, 28,151,209, 15, 92, 46,170, 53,239,125,198, 58,134, 4,146, 32,210, 6,
-138, 80,231,138,170, 46, 4, 71, 68, 60, 67, 73, 86, 48,122,176,171, 99, 63,239, 1, 86, 27,150,102,241,221, 26, 85,161, 34,209,
-210,251, 31,130,242,134,234, 35,148, 4, 17,100,105, 36,234,138,116, 29,237,245, 13,192,209, 6,163, 47,163,237, 29, 1, 15,129,
- 20,230, 52,129,153,138,180,105,211,102, 5,104, 68, 5, 96,139,138,250, 95,129,197,134, 77,170, 69,224,133, 57,149,237,211,225,
-161, 39,209,162, 96,133,237, 20,230, 29, 20,172, 4,181,106,213, 74,230,207,159, 79,201, 25, 77, 47, 24, 11,211,118,216, 99, 17,
-163,223,244, 85,230,163,104,152, 43, 27,138,165,141, 36,236,244, 18,218, 96,185,250, 88, 12, 40, 47, 8,170, 28, 36, 69, 5, 98,
-255, 30, 94, 3,205,187, 38, 25,168, 0,173,144,130, 45, 71, 64,107,205,178, 5,181,242,167, 75,118,190, 98,137,194,239, 40,218,
-132,113,224, 65,136,215,231,161, 83,223,219,190,105,174, 84,172, 88,145, 13,156,201, 72,108, 44,245,115,134,161, 97, 79, 4,194,
-239, 93,174, 72,129,156,171, 7,255,249,203,185,133,179, 59, 61, 88,183,172,255,171,117, 75,187, 99,100,222,143, 85, 37,193, 27,
- 93, 63, 56, 61, 8,126,236, 55, 18,176,222, 56,232,114, 2, 87, 15,254,102, 94, 35,188, 36,200,162,148,133, 7, 7, 85, 78,222,
-234,196,174,130, 23, 14,242, 4, 47,152,220, 12,209,212,188, 87,177,199,226,132, 64, 21, 5,219, 13, 87,229,188,134,228,202, 70,
- 43, 88,209, 9, 94,208, 62, 20,105, 22,236, 8,109, 64, 11,234, 57,241, 4, 45,130, 16, 21,200,240,127, 72,129, 22,118,182, 41,
- 18, 39, 78,140,168, 47,170, 15,149, 65,206, 8, 31,213, 60,116,229,192,178,106, 1, 33, 39,115,110, 34, 97, 27,231,130,134,229,
- 51, 42,209,194, 64, 27,192,103,249,141,170, 20,139,223, 74, 94, 18, 84,178,206, 88,223,172, 43,108, 16, 16,136,254,105,236,186,
-208, 96,153, 63, 27,208,234,221,187,119, 61, 74,177, 40, 25, 67,187, 97,128, 97, 78, 18,219, 96, 79, 87, 40, 36, 64, 11, 3,182,
- 23,218,170, 31,192,127, 0,192,193, 91, 76, 28, 1,224,181, 31, 19, 87,212,234,238,102, 7, 59,151, 29,178,130,244, 0,158, 3,
- 48,161,188,197, 98, 34, 0,109,204, 15, 11, 61,133, 30, 22, 50, 1,176, 97,122, 11,128, 16,128, 73,202,126, 39,180, 51,214,166,
-197,226,236, 1, 65, 22, 23, 63,108,155,156,104,184,168, 0, 45, 5,188,227,251,105, 96, 95,217, 42,201, 50,162, 54,220,132,186,
-126,203, 5, 4,193, 22,108, 70,149,190,206,246, 64,201,211,230,205,155, 21,169, 1,212, 60, 15, 1,180, 93,246, 77, 72,188, 78,
- 58, 21, 1,107,110,192,102, 84, 81,249, 16,100,113,140,102,219, 50, 3,180,160,218, 18,168,179, 57,193,114,177, 34, 4, 69, 80,
-245, 11,233,154,149, 64,145,209, 0,109,175, 85,208,166,165, 23, 18, 90,214,138,227,184, 67,201,180, 58,126,235,253, 55,216,149,
- 66, 63, 27,128,214, 35, 44,132,181,166, 11,202,111,236,124,167,186,251,133,209, 55,162,111,188,167,225, 59,129, 22,164,172, 4,
- 81,239,209,102,108,230, 6,184, 30, 30,117,244, 30, 11, 88, 37, 15, 85,138,144, 66, 17, 20, 57, 60,156,217,104,193, 60, 70,105,
- 73,156,163,174, 93,187, 70, 59,199,183, 16,128,204, 2,160,157,193, 77, 45, 67,134, 12,225, 88, 74,187,210,127,195,161,235,218,
-129, 86,254,162,221,117,168, 2, 45, 50,199, 72, 98, 71,167, 13,150, 43,110, 81,220, 76,187, 47,237,193,255, 4, 94,156,184,237,
-223,195,107, 84,207,152,172, 1, 27,208, 34,216, 2, 82, 31,130, 65, 18,115,173,177,195, 94,117, 72,144, 85, 54,103,154, 71,199,
-214,206,145,197, 45,139, 72,165,146,133,223, 3,233,255, 69, 53, 34, 86, 85, 15,191,141,173, 0,132, 86, 72,116,253, 96,244, 96,
-135, 78,139,149, 68, 0, 6,198,205,152,116,199, 28,219,191,191,230,181, 13,171,106,191,185,114,190,155,188,122,121, 4,147,251,
- 9, 12, 40,151,145,207,229,118, 88, 74,152, 56,161,114, 32,180, 79, 28,112,181,137,121,141, 20,144,146, 44,214,231,178,101,203,
- 20, 64,196,129,156, 42, 3, 78, 20,124,151, 10,178, 88,143, 33, 0, 90, 54,155, 44, 2, 56, 78, 66,156,124, 80, 46, 83, 64,139,
-224,133,174, 28,212,221,123,248, 54,101,219, 42, 38,109, 5,192,105,129, 12, 42, 63, 68, 64,139,187,111, 8, 90, 56,121, 77,159,
- 62, 93, 41, 35,213,136,180,217, 50,194, 71, 53, 15,203, 10,126, 42,128, 16,147,204, 43,130, 33, 74, 32, 40,121, 83,203, 75,208,
- 68, 48,139,103, 78,234,209, 70,187,120,203, 58, 96, 93,240, 59, 57,233,178,190,120,141,147, 32,129, 54,251,149, 10,222, 72, 23,
- 82, 45,163,131,240,103, 1, 90,237,219,183,111, 66,254, 97, 98,220, 0,187,141, 6,152, 48,222, 2,176,156,132,205,151, 98, 15,
- 22, 18,160,133,122, 80,212, 19,218,131,128,134,192,149,124, 32,159,201, 87,238,152,211,227, 41,239, 59,163,167, 74,163,200, 95,
-242,210, 40, 61,235, 59,105,147,245,152,101, 34, 29,130,161,185,115,231,202,208,161, 67, 5, 0,144,117, 98, 4, 92,105,139,127,
-154, 0,139, 99, 37,203,194,205, 74, 52, 86,230,248, 77, 41, 46,141,235, 23, 46, 92, 40,176,191, 9, 4,184, 41,172,243,221,158,
-142, 36, 90,180,121,163, 36, 11, 27, 1,104, 4,173, 72,200, 72,151,155, 16,248, 94, 78,154, 70,129, 22, 38,212,103,144,192, 42,
- 42, 46,218, 54,162,159, 42,187,218, 32,109, 23,168, 84, 67, 4,180,240, 77, 17,209,167, 94,107, 65, 86, 72,164, 89, 70,218,196,
- 63, 45, 15,250,254, 35,204,205, 31, 1, 45,242, 19, 27, 66,140,246,113,154,152, 4,170,187, 11,171, 86,173, 42,144, 48,189,193,
-124,169, 21, 20,132,193,194,229, 13, 54,235, 40, 64,139,121,102,204,152, 17,232,140, 31,206,118, 29,142, 26, 53, 74,153,131, 56,
-198, 19,100, 1, 36,250, 88,231,180,184, 0,218,239,169,158, 6,110, 56,171,210,181, 74,179,130, 97,145,127, 90, 29,184, 40,143,
-190,123, 7, 62,172, 53, 68, 35, 40,226,128, 77,181,132,145,196, 65, 13, 12,115, 9,138, 72,147,131, 4, 7, 63, 53,241, 63,158,
- 83,128,150,253,123, 62, 21,104, 1, 77,143, 4, 64,152,216,181,107,215,188, 70, 43, 75, 11,180, 84,144,117,114,211, 66,217, 49,
-162,141, 12,255,249, 71, 41,152,249,187,195, 24,216,255,111,187, 5,227,121,163,180,153, 47,253,183, 81,178,101, 73, 18,195,167,
- 75,243,186,129,108,128, 0, 91, 22,216,104, 44, 6,176,218,143,137,241, 17,120,126, 25,146,172, 45, 88, 5,210,144, 61,191, 30,
-109,116,152,205,152,188, 47,170, 9, 43,232,123, 28,212,185,242, 44, 94,188,248,125,237, 61,230,213,163,199,251, 88,121,110,118,
-165, 46,132,148,231, 34, 1, 22,147, 73,213,161, 34,205,226, 65,112, 64, 0,199, 14,200,195,172, 84,139,224,133,174, 29,232, 30,
-129, 6,241,148, 12,144,142, 39,232, 51, 17,196,109,233,209,195,246,223,168,180, 72,229, 15, 87,220,156, 80,104, 96, 78, 85, 15,
-203,109,132,119, 14,242,164,198,192,120, 22,131,202, 83, 38,128,216,215, 84, 65,241,219,249,205, 52,136,230, 68, 73, 49, 61,212,
- 86, 2, 0, 79, 55, 5,223,187,122, 23, 13,118,105, 68, 93,171, 86, 45,101, 53,202,118, 68,201, 24,237,188, 88,247, 4,113, 20,
-245,211,238,130,191,121, 96,128,230,106,212,136, 90,229,179, 0, 45,171, 61, 22,165,190,130,242, 91, 48, 1,191, 30, 56,112, 96,
-173, 79,176,251, 82,128,209,227,167,207,101,255,145, 83,178,251,192, 49,217,190,231,136,108,222,113, 64,214,111,217, 35,171, 55,
-236,144,229,107,192,231,131,222,134,129,145, 74,239,160,215, 25,217,123,232,132,236,220,231, 37,219,118, 31,146, 77,219,247,201,
-186,205,187,100,213,250,237,178,239,208,113,195,244,172,117,152, 12, 54,100, 55, 97, 90, 16,196,246, 68, 9,228,180,105,211,132,
- 19, 16,213, 55, 33,104, 83, 27,209,238,223,208,198,143,146, 49,142,153,148,106,113,162,133,196, 90,177, 85,194,152, 18, 8, 32,
-123,212, 0,237,143,108,180, 0,200, 21, 27, 50,108,197, 87,218, 40,237,189, 84,144,197,133, 1,223,199,121, 1,188,114,185,168,
- 86,223, 13,144,245, 12,192,148,118, 68,116,193, 33,148, 16,231,201,147, 71, 5, 88,157,209, 52, 9,178,205,104, 2, 20,210, 0,
- 89,175, 41, 25, 83, 65,219, 39, 72,179, 12,176,201, 92, 22,189,157,139,246,247,205, 80,199,119, 47,135,148,233, 35,213, 33,118,
-157,190,129,212,221,176,234, 48, 93,186,116, 15, 85,251, 44,170, 14, 27, 52,104, 32,165, 75,151, 30,138,178, 80, 96,240, 13,132,
- 19, 67,177, 16, 80, 36,101, 4, 90, 84,245, 77,156, 56,209,176,125,162,234, 71,139,182,172,148, 46,211, 71,151,189, 31, 45, 72,
-135, 31,209,140, 4,210,227,103, 42, 15, 84, 12,242,149, 26,197,235, 74,180,148, 21,145,246,227, 48, 33, 40, 54, 90, 92, 49, 27,
- 73, 4, 69,122, 64, 75,165, 73, 59, 5, 53,241, 29, 4, 90,156, 40,236,223,195,107,232,160,134, 58,180,166,177, 42, 18, 45, 21,
-100, 65, 36,106, 24,100,145,134, 86,117, 88, 46,111,218,155, 42,200, 26, 89, 57,141, 20, 72, 29,255, 1,193, 87, 72,129, 86,134,
-111,163,102, 45,158, 41,197,179,227,235,230,200,146,223,139, 74,151,102,117,130, 96,228,147, 17,175, 29,134,196,221,107,156,100,
-121, 30,130, 20,203, 76, 7, 84,243, 82,106,197,137,149, 82, 29, 12, 68,255, 72, 99,120,170,185,184,178,231,164,203, 68,192,193,
-131,128,193,122, 45,151,222,183, 99,101,212, 83,235, 5,158, 46, 18, 72,131, 82, 30, 79,208,228,100,193, 51, 37, 59, 60,155, 1,
- 90, 28, 92, 40,125, 32, 72,161, 17,176,181, 76,122, 69,114,116, 63, 51,140,161,239, 83,242, 64,201, 24,219, 55,109, 21,232,159,
-134,147, 35,237, 34,104,104,202, 50,171,247, 57,153, 97,224,225,238,179, 31,157,189,144, 3, 53,212, 90,138,132,145, 18, 6, 74,
- 11, 84, 94,242,236,226,158, 17,187,152,207, 2,180, 8,168,168, 34,164, 68,139,101,132,109,198, 95, 90,163,251, 79,145,104, 81,
-122, 69,181, 41, 23,111,164,205,177,136,210, 93, 74,123,200, 31,163, 18, 40, 85,162,197, 49,137,234, 98,142, 81,164,199,186, 33,
-216,160, 26,150, 0,199, 40, 61, 60,155, 28,182, 46, 87, 81, 54,203,200,145, 35, 95, 1, 12, 5,145, 6,119,243, 13, 24, 48, 32,
-164, 64,171, 43, 22, 98,231, 89, 62,238,130,164,116,108,196,136, 17,202, 68,200,173,248,116, 73,209,161, 67, 7,250,184,162,235,
- 7, 35, 71, 48,176, 69,208, 79, 59, 71,150,147, 96,158,187,195,181, 27, 55,216,175,120, 24, 85,159,131, 87,207,180, 32, 11,146,
-215,158,120,156, 0,203, 8,232,119, 89,126,128,172,215, 4,152,255, 36,144,197, 2,235,237, 92,180,191,111,164,146,212, 60, 0,
-169, 73, 33,109,124, 78,115, 0, 2, 86, 44,172,185,179,239, 13, 22,131, 47,176, 89,193,176, 49, 60,198,184,221,228,157,186,187,
-144, 11, 61,210, 2, 16,126, 13, 0,196,157,156,138, 4,146, 32,139,121,168, 2,196,226, 96,183,209,178, 26,240, 12, 31, 17,101,
-120,199, 29,173, 0,117,182, 5,135,138, 67,190, 82,160,229,154, 61,142, 80, 36, 65, 17, 39, 27, 14, 96, 70, 18, 7, 35, 61,123,
- 42,210,228,106,136,106, 14, 53,241, 63,158, 11,228,243,246,239,225,181,144, 0, 45,136, 80,199, 82,146,101, 22,100,145, 75, 42,
-208, 90, 58,127,110,157, 58,185,147,201,134,190,117,197, 41,200,130,100,139,249,141, 52,190, 52,241,163,102, 6,200,122,170, 2,
-183,209, 85,210, 74,250, 68, 81,141,172, 58,141,144,183,229,193, 74, 69, 1, 90,228, 47, 38,249,127,164,123, 7,205,238, 66,155,
-123, 7, 13,200, 50,108,167,101,199, 24,197,222,132,147, 35,129, 21,219,206,246, 94,189, 66, 34,209, 82,236,105, 8, 6, 9,180,
- 62, 1,100,121, 64,146, 53,151, 32, 11,146,155,103, 0,192, 87, 33,134,191, 89,163, 70,141, 32,168,209, 20,128,197,196, 73, 18,
- 91,234,149,149, 57, 1, 88,247,238,221,223, 99,101, 26,132, 62,241,151,171,138,135, 36,113, 59,129, 22, 12,163, 9,180,246,107,
-243,186,186,103,160, 49,149,131, 52,180,168,179,157,135,144, 20, 22, 3,155,205,186,119,176,209,164,100, 11, 6,224,191,170,182,
- 90,124, 79, 8,105, 58,148,104,193, 94, 82,252, 30, 60, 82, 36, 90, 43,214,110,145,109,187, 14, 26, 6, 70,142, 36, 90,164,119,
-255,225, 99,155, 68,107,199,158, 67, 70,233,209,168,248, 60, 54, 59, 88, 0,136, 44,216,209,101,193,226,224, 42, 38,175,135,220,
-113,101, 85, 29,134, 68,162, 21, 9,106, 65, 47,216,251, 61,162,218,153,106, 66,250,249,106,209,162,133,192,191, 25, 39,195, 27,
- 48,105,160, 13,153, 17, 80,173, 54, 7,130, 45, 79,216,141,221,197,164,247,154,125, 8,186, 28,197,173, 3,221, 90,216, 39, 43,
-208, 50,180, 73, 9, 99,254, 51,170,159, 66, 19, 96,169,133,134, 36,230, 53,165,192,255, 37,160,197,111,135,171,133,100, 61,122,
-244, 88, 1,240,254, 20,110,124,158, 99,254, 94, 3, 91,213,148, 6,250,182, 45, 11,120,247, 29,128,249,123,242, 79,235, 59, 11,
-115, 6,129,143, 98, 67,167, 94, 39,136, 95,177, 98,197,123,216, 20, 26, 6,114, 6,202,210,150, 54,175, 28,191, 32,125,101,100,
- 21,229,248, 23, 72,180,236,213,135,255,103,133,163,143, 3,192, 81,236,169,216,225,232,226,193, 81,135,211, 94,163, 88,220,193,
- 14,193, 96,142,215, 72,147,192, 74,251,156, 10,180,168,246,176,127, 7,175, 97, 96,178,151,104,233, 57,115,107, 4,144, 53,201,
- 36,200,178,209,212,170, 14, 11,101, 76,121,170,102,182,132, 82, 48, 77,130,187, 31, 73,178,172,234, 67, 23, 64,203, 70, 51,125,
-194,104, 25, 74,100, 74,241, 68, 43, 29,203,153, 44,198, 83,170, 17, 13, 52, 72,109, 22,189,111,247,192, 14, 57,197,189, 3, 87,
-229,248,253,181, 56, 44, 85,157,152, 26,118, 88,234,128,111, 10,208, 34, 88,167, 36,148,237,138,128, 73,123,224,153,147,118,207,
- 57,226,167, 34,205, 34, 80, 13, 33,200,178,209,196,196,125,157, 18, 42,168, 76,148,173,240, 24,192,218, 19, 0,218, 31,188,134,
- 13, 22, 10,176, 3, 72,122,197, 51,158,189,160, 41,171, 67,135,165,144, 14,109,135, 88,126, 55,242,165,177,251,174, 84, 46,238,
-169, 89, 29,182, 37, 72, 91, 82, 19, 72, 81,194,228, 36,241, 94,122, 39,237,246,139,209,228,251, 85, 9,148, 86,162,165, 70,173,
-160, 77, 33,213,210,220,129,233, 64, 2,229,176,156,142, 36, 90,170,179, 78, 85,162, 69, 9,143, 19,137, 86, 48,154, 0,191, 83,
- 0,178, 95, 64,170,102,153, 60,121,178, 5,160,155, 59,136, 57, 25,166,133, 10,229, 30, 39, 25, 24,116,223,208,233,255,206,250,
-123, 70,128,169,227, 0,107, 71, 48,118,251, 97, 87,224, 27,216,207,220,198,132,184, 7, 42,226,227,160, 73, 41,185,179,195,213,
- 24,146,128, 97,210,160, 46,127,207,246,207, 29,177,148,156,177,125,170,106,105,206, 9, 84, 89, 98, 33,160,117,101,211,205,217,
-203,208, 86, 58,132, 80,130,165, 59,214,105,104, 23, 50, 56,142,234,210, 52, 72,199,229,152,172,183,115,209,254,190,131,119,126,
-145,114, 2,104,245,165,249, 65,217,178,101, 29, 58, 43,165, 36,171,101,203,150,138,166, 11,210,119, 71,238, 98,204,150,147, 82,
- 76,218, 36, 14,194,187,223, 81, 53,253,203, 47,191,112,156, 45,163,242,224, 43, 7, 90,234,103, 24,119,127, 3,209,223,126,236,
- 50,129, 9,213,123, 91, 8, 30,118, 50, 53,169,110,245,213, 51,252, 75,189,179,235,124,124,105,176,138, 32, 77,172,238, 20,135,
-141,106,226, 68,132, 65,233, 29, 85, 42, 4, 7,218, 4, 35,228,119, 24,160, 40, 6,119,217,176, 67,208, 57,236, 31,113, 8,180,
-208,145,139,108, 90,191,178,198,179, 71,143, 74,240,183,195,228,220, 70,203, 70, 51, 67,210, 24,171,143, 65, 93, 72, 59, 47, 74,
-199,114, 37,139,241,132,106,196, 16,148, 91,183, 97, 67,236,187, 73, 99, 63,101,196,104, 91,151,230,103, 40,167, 35,181,129,158,
-186, 80,175,156, 39, 9,172,212,164, 26,130,155, 4, 90,170,138, 49,164, 32, 43, 88,155,167, 68, 11, 78, 37,109, 18, 45,216,208,
-220,196,192,242,134, 18, 45,172, 22,223, 34,189,235,212,169, 19,109,169,130, 32,241,122, 8,149,225, 53, 24,140, 62,119, 32,209,
-210,251,246, 16, 84,209,215, 31,226,132,192,232,209,147,103,114,248,216, 89, 57,232,117, 90,246, 29, 70,184, 28,216,106,237,216,
-123, 68,182,236,252, 96,171,181,110,211, 14, 83, 64,139, 54, 95,135,143,157, 3,189, 51,176,253, 58, 41,123, 14, 30,135,173,214,
- 81,217,186,235,144,108,220,182, 79, 54,108,217,173, 11,180, 0,118,126,130,170,229, 14, 36, 67, 22, 72, 44, 31, 99,220, 59,129,
- 10, 74,161,169,164,180, 6,119, 25,186,170,119,213, 51,252, 58,208, 61,141,196, 51,213,133,122,146, 44,189,182, 20, 13, 64,242,
-160,186,123,147,187, 46,169,113,224, 14, 76,238,240,100,162,106, 26,239,137,170,249, 30,167, 64, 43, 36, 13,211,250,140, 94, 57,
- 67, 66,250, 75,210,212,219,185,104,127,255,139,205,113,218, 23, 97,179, 67,127,128,169, 64, 2, 42,130, 30,213,165, 7, 93,124,
- 80,242,138, 13, 81,129,216, 25,216,223, 9,179,131,241, 19,187, 24, 83, 99, 28, 43,139,113,172, 13,210, 88,152,174,108,192,249,
- 18,210, 35, 38,168, 58,223, 17,216,141, 29, 59, 86,113, 23,194, 29,135, 0,157, 51, 67, 82,145, 95,250,153,179,217, 63,104,174,
-206,228,244, 40,194,223, 60, 59, 41,131,113,144,101, 37, 16, 13,157,237,160,218,185,244,206,232,124,180, 45,210,118,190, 96,147,
-142, 51,154,120,199, 13,220, 43,199,179,253, 59,208,201, 15,227, 94, 52,187, 15,250,172,157,197,149, 31,173,144, 2,173,188,223,
-199, 58,183,160, 69, 65, 21,100, 61,166, 26, 49,132, 13,229,179,126,123, 8,203,228,232,177,191,163,156,244,250,126, 82, 39,217,
-123,134,119, 40,209,250, 68, 62,104,105, 42, 54, 90, 52,166,231,130,130,137, 11, 10,216, 65, 80,101, 68, 27,172,143,238, 59,177,
-209,250, 59,248, 25, 18, 54,124,209,114,170,238, 29,172,147,191,205, 21,131, 1,247, 14, 14,203, 73,122, 4,111, 42, 61,173,123,
- 7, 26,244,170, 46, 35,156,184,119,176,209,132,251,141,213, 80,133,223,131, 74,248, 26,164, 87,116, 99, 97, 63, 46, 26,229,237,
- 23,229,167,209, 66, 57,200,215,249, 19,158,117,246,232,215,242,237, 95,125, 57, 1,176, 82, 65, 29,121, 16, 90,160,167,176, 29,
- 13,130,116, 52, 8, 27,180,158, 65, 13,125, 8,234,194, 96, 62,174, 92,205,197,176,235, 75,131, 84, 9, 32,170, 43,206, 51,144,
-246,163, 31, 60, 84,119,190,211,110,146,155, 43,168,238,166,218, 18,180,232,186,200,144, 47, 66,190, 23,243,111,110,164, 10,214,
-179,250,187,164,122,237, 51,180, 65, 27, 73, 21,104,217,159,237,222,169,239,176,244, 51, 21,242,171,107,132,206,226, 28,218,199,
- 61,212,254,119,194, 59,219,183,167, 77, 24,173, 72,158, 20, 49,189,177,219,240,104,186, 4,209, 92,137,245,245,170,225,171,227,
-167,222, 7,153,184,255,181,126,123,106,216,169,204,225, 38, 5, 38,252,158,133,111,214,238, 42,212,187, 79, 22,125,173,223,110,
-162,122,157,102,253, 26,191, 61, 5,193, 22, 37, 91,159,200,128,175,229,219,233,222, 38,180,143,175,229,219,255, 85,229,132, 13,
-105, 88, 38,131,149,249,145, 68, 11, 11,203,178, 72,109,144,198, 34,109, 64,186,132,244,136, 9,230, 12,151,177, 17, 96, 21,104,
- 15, 64, 50,235,214,132, 64,139,241, 87,169,117, 32,216,178,253, 86,175, 25, 44,115,136,178, 17, 96,169,137, 4, 84,192, 21, 34,
- 98,159,225,161,127, 85, 35, 52,201, 31,247,183,155,100,152, 78,118, 55, 63,221,252, 12, 45, 14,184,219, 82,104,113,242, 3,157,
-186,161, 75, 78,161,230,174,163,208,101,234,215,194, 79,167, 95,253,119, 2, 45, 19, 85,161,149,106,153,120,236,211,178,126, 45,
-149,235, 46,231,167,213,179,253,211,110,126,186,249, 25, 90, 28,112,183,165,208,226,228, 7, 58,159,131,159,229, 66,183,136,159,
-173,156,159,227,219,221, 52, 63, 67,229, 59, 34,249,119, 2, 45,213, 54, 75,149,106, 57,177,209,178,183,207, 10,246,159, 13,197,
- 81, 50,195, 62,103, 52, 92, 93,215,163,239,166,233,184, 94, 66, 90, 95,110,126,186,249,105,180, 13,184,251,166,115, 14, 24,229,
-161, 54,223, 63,157,159, 53, 81, 64, 35, 6,237,204,163, 77, 13,241,159, 32,203, 61,206,135,108, 14,253, 55,182, 37,245,155,244,
-218,188,233,251,127, 39,208,178, 25,195,103,247,240,100,193,157,168, 14, 93, 2, 45,211, 31,108,226, 1, 55,218, 55,193, 44, 3,
- 89,221,252, 52,192, 36, 19, 89,220,252, 52,193, 44, 3, 89,221,252, 52,192, 36, 19, 89,220,252, 52,193, 44, 3, 89,221,252, 52,
-192, 36, 19, 89, 62, 7, 63,157,190, 30, 64,171, 24,252, 12,246, 64, 6,101, 87, 56,127,219,217,106,153, 40,186,185,172, 6, 37,
- 90, 36,234, 86, 29,186, 96,237,231,104, 48,110,154,230,218,178, 94,110, 55, 63,245, 56,100,238,190,155,159,230,248,165,151,219,
-205, 79, 61, 14,153,187,239,230,167, 57,126,233,229,254, 90,248,233, 10,104, 69, 4,176,202,163, 26,195, 91,119, 31,170,255,115,
-235, 49,224,223,124,223, 85,229, 38, 9, 19, 46, 66,247,136, 81, 98,108,141, 24, 57,218, 61, 37, 69,141,185, 53, 28,174,129, 33,
- 73, 62, 5, 20,193,155, 98,134,202,177,163, 92, 45, 19, 35,226, 45,252,206, 99,128,193, 14,203, 89,195,195,163, 96,253,136, 17,
- 45,205,224, 55,198, 81,226, 61,230,113, 66,255,107,105,216,238,114, 26,104, 32, 38,178,184,249,105,130, 89, 6,178,186,249,105,
-128, 73, 38,178,184,249,105,130, 89, 6,178,126,173,252,140, 6,215, 35,135,225,195,210, 79, 77,170, 11, 19,158, 85, 63,106,234,
- 25,190,213,232, 8,247, 91, 59,126,216,127,123,104,208, 52,192,242,191, 63, 75,136, 84,135,154,248, 66, 69, 66,249, 19, 28, 54,
-194,176,225, 35, 53,139,253,109,162, 7,191,119, 29, 18, 52,118,230, 26, 89,181,253,152,172,218,118, 76,198,204, 88, 45,173,186,
- 13, 13,138,151, 48,201,131,240,145, 34, 53, 11, 9,128,201, 0,191, 91,229,162, 71,122,242,112,104, 51,121, 58,180,177,148,141,
- 30,225, 9,175,233,124,215, 71,229, 36,128,106, 30, 47, 94,192, 99,120,197,183, 63,232, 12,147,142, 92, 31, 33, 54, 95,243,184,
-113, 3,156,128,173,175,181, 3,134, 70, 19,248,183,124,123, 34, 4, 86, 29,138,129,232, 40, 98,127, 61,192, 0,228,141,193,105,
- 4, 24,148,244, 83, 22, 2, 33, 96,240,191,133,159, 33,248,244,207, 98,188,109,136,159,233, 18, 69, 43, 84,245,167,140,183,243,
-164,142,183, 58,109,146,232,113,205,142, 33, 33,249, 88,157,137, 44, 20, 72,126,113,126,186,138,105,232,234,158,161, 58, 50,201,
-144, 96, 52,225, 52,214, 11,253,219,143,137, 1,190,153,208,191,149, 68,239,255, 76,246, 32, 4,215, 14,232,212, 81,106,228,217,
-202, 24,143,120,214,101, 98, 30,230, 5,189,212, 46,104,198, 64,121, 70, 35,223, 93, 45, 16,114,246,155,249,152, 31,244, 98,184,
- 42, 39,242, 28, 66,236,213,160,143, 38, 55, 7, 23,232,164, 28,254,253,130, 64,251,252,231,166,249, 25,177,136,201,166, 18,162,
-236,174,109,180, 62,163,219,251,143, 58, 75,132,200,209,215, 20, 41, 83,227,197,146,141,135,165,219,144, 89, 82,174,126, 55, 41,
- 80,165,157, 20,170,214, 65, 42, 53,238, 37,221,134,206,145,121,107, 15, 73,177,114, 53,253, 35, 71,139,181,198,193,231,186,236,
-128,121,162,134, 27,188,187, 97,225,183, 50,189,137,200,212, 6,178,163, 86,158,183,188,102,102,144,180,129, 44, 4, 85, 61,191,
-121,179,180, 75,156, 88, 58,197,143, 47,189, 32,217, 26,152, 40,145,140, 74,146, 68,166, 34,126,215,109,132,162,184, 15, 15,183,
- 78,192,214,103, 31, 40, 66,212, 20, 62,126,200, 93, 78, 7,140,196, 32,220, 24,222,140, 31, 50,168, 52,227, 21, 50,172, 15,131,
-235, 34, 90, 65, 16,226, 73, 62,196,224,220, 34, 36, 11,129, 16,214,153,187,142, 66,200,184, 79,169,163, 52, 9,162, 77,123,182,
-119,162,156,159,219, 94,126, 74, 27,255, 98,186,120, 81, 18,185, 1,182, 67, 14, 56,107,159,174, 66,107,233,133,221,114, 72, 51,
-114,228,200,116,246, 27, 44,136,186,253,127,248, 48,115, 22, 67, 50, 24, 77, 2, 44,246,107, 46,156, 9, 38, 24,149,132,161,228,
-212,176, 75,188,167, 38, 6, 42,103, 72, 34, 56,179, 85,194,105,105,142, 96, 52,177, 32,219,194, 69,184,246, 32,125,103, 9, 49,
- 63,133,207, 56,163, 73,208,228,233,233, 41,140, 48,193, 4, 79,237,178,100,201, 18,197,233,231,252,249,243,101,244,232,209, 74,
-148, 21, 53,162, 10,203,143,144, 76,129, 86,176,229,180,156, 0,129,247, 88, 70,189,208,122,140, 75,203, 60,214, 80,121, 12,118,
-255, 89,105,126, 70, 44,242, 73, 35,136, 65,207,240,137,241, 18,173,141, 22,255,255,255,248,140, 31, 23,172, 17, 66,146,213,164,
- 96,137,170,254,203, 54,123, 73,149, 22, 67, 36, 93,193, 90, 31,225,231,156,165, 26, 73,131,206,227,100,222,186,163, 82,188, 98,
- 29,255,240,145,162, 52,113, 85,185,218,123,144, 92, 37,252, 37,110,212,128, 55, 19, 91,203,237,133, 37,228,253,230,159,229,237,
-136,250, 82, 35, 86,164, 0,222, 51, 50, 72,218,131,172,142,113,227,202, 10, 68, 50,223, 31, 59,182, 28,138, 19, 71,142, 34,121,
-227,218, 62, 94, 79,158, 92,238,236,222, 45,119, 15, 28,112, 4,182, 92, 78,142,209,162, 69, 59,110,141,117,102,198,129,233,223,
- 61,225,102,100,153, 89,118, 51,192,245,147, 90,248,255, 31,118,245,237,108,208,142, 86,199,244, 58,156,192, 72,189,107,243, 68,
-130, 52,181, 73,147, 38, 1, 28,112, 25,184,151,158,141, 25, 50,130,241,238,124,124,124,228,206,157, 59, 12,155,243, 2, 3,100,
- 59, 7,180, 93,149, 51, 28, 98,212,205,164,199,113, 4,109, 13,192,160,125, 31,239,154, 7, 26,159, 18, 54, 37, 12,104, 54,128,
- 51,212, 85, 69,139, 22, 61,132,184,138,107, 65,243, 87,208,100,160, 96, 87,135, 94, 91, 34, 79,185,163,172,129, 53,149, 64, 28,
- 70, 87,188,228,187,204,210, 44, 30, 66,154,148, 80,111, 64, 58,169,147,152,199,145, 52, 91,175,156, 10,223,210,197,143, 82,185,
-115,213,236, 65, 47,215,182,147, 43, 83,234, 74,241, 12,241,125, 50, 36,142,156,220, 9, 83, 13,209, 52,217, 23,190,102,154, 10,
-144,226,193, 51,146, 54,142,169,171,123, 42,139, 28,126, 59, 2, 16, 7, 17, 88, 56, 59, 8,140,152,199, 72, 29, 17,104, 49,100,
-215,130, 5, 11, 4, 49, 62,101,213,170, 85, 2,175,232, 74, 48,237, 93,187,118, 9, 23, 89, 8,222,173,196,250, 61,123,246,172,
- 2,186,244,128, 86,212,168, 81,159,177,108, 42, 48, 67,192,116, 37,208, 61, 2,181,203,133, 11, 23,148,241,131,209, 31,248,159,
-113, 51, 57,166,240, 25,187,242,218,190,157, 18,170,105,211,166, 73,245,234,213,133, 1,206,237, 19, 3,210,171,158,215,121,102,
- 89,249, 62, 62,231,140, 38,175, 67, 34,230,203,114,170,207,176, 28,252, 70,150,145,193,234,175, 93,187,166, 44, 44,111,223,190,
- 45, 4, 91, 4,112,248,118,151, 64, 43, 52,104,126, 70, 44, 98,178,235, 5,207,110,208, 51,188,235,119,124,161,143, 75, 18, 35,
-118,130, 7, 11,215, 29,148,134, 61,166, 75,246,178, 45,157,118,150, 18,181,187, 73,251,161, 43,100,214,170,131, 18, 47, 65,146,
- 7, 40,189, 43,155, 45,219,199, 21,136, 17, 97,222,137,223,203, 4, 62, 26, 91, 69,206,109, 70,120,194,171, 53, 68, 38, 85, 17,
-175,250,121,223,231,143, 17, 97,174, 17, 78,211,238,138,234, 66, 74,178, 8,178, 86, 70,141, 42, 27,144,118, 3,108,169, 32,235,
- 64,204,152,178, 37, 90, 52, 57, 4,240,181,235,187,239, 20,176,117, 11,210, 45, 62,107,228, 29,204, 67,241,244,206,157, 59, 5,
-113, 9, 31,226,111, 78,163,207,253,141,249,114,102,203,150,237, 17, 7, 35,150, 61, 52,202,129,213,105,117,128,182, 7, 60,135,
-144, 30,193,196,128, 95,127,253,213, 23, 0,131, 65,110,181,225, 28,194,241, 26,238,113,192,241, 68,210, 3, 30,106, 17,146, 34,
- 38,225, 3,130, 44, 14, 90, 12,124,202,176, 17,184,166,252,231,224,200, 65,136, 3, 16,130, 68,179,109,166, 52, 88,246, 8, 80,
- 77, 92,195, 74,244, 5,104, 91, 16,252,218,242,240,225, 67, 11, 98,226,189,192,234,242, 6,104,232,129, 45, 71,175, 9,131,144,
- 49,179, 17, 63,244, 48, 86,156,222, 8, 4,236,141,129,221,123,246,236,217,135,112,125, 62, 30, 48,234,225,217,158,118,118, 12,
-254, 13,186,116,233, 82, 6, 65,145,139, 49, 97,229, 92,162, 97,195,134,213,250,245,235,151,195,224,247,218,103,203, 9, 96, 90,
-159, 52,193,211,226, 8, 92, 92, 20,113, 0, 75, 54,109,218,180,250,192,129, 3,179,154,164,185,129,193,154, 33, 13,120,129,122,
-240, 71,122,206, 4, 0,252, 12,147,194, 83, 72, 32,159, 96,178,121,178,123,247,110,127,208,117, 36, 21,255,232,117,233, 18, 70,
-251,189, 67,157,146,150, 63,154,148,151, 30, 13, 74, 73,215, 58, 69,164, 83,141,124,210,173,102,110,217, 57,168,178,188, 94, 82,
- 87,110, 77,172, 32,101,179,124,251, 44, 83,220,232,166,189, 90,155,252,190,175, 61, 59, 23, 61,202,248, 78,160,177,126,253,122,
- 45,216,178,129,172,103,207,158, 41,147, 56,243, 34,185, 82, 35,218,248,129, 62,180,117,226,196,137, 65,236,159,148, 48, 65,253,
- 37, 55,111,222, 84,192, 1,250,147, 2,140, 48,166,216,135,218,114,200, 79,170, 10, 9,218, 84,144,197,120,127, 44,203,162, 69,
-139, 20,144,197,197, 21,131,147, 19,128, 48,208, 59,129, 22,250,149,189, 68, 43, 24,109,188, 91, 1, 90, 44,155,250,237,136, 39,
- 40, 45, 90,180,144, 94,189,122, 41,241, 3, 73,151,227, 8, 3,158,147, 62,159,113, 86,225, 4, 76,136,127, 42, 85,171, 86, 53,
- 4,180, 72,143,101,117, 0,180,130,189, 66, 5, 69, 28,211, 8,178, 88, 30,130, 63, 71, 32,139,192,205, 9,208, 10,117,154, 95,
- 8,139,152,238, 95,161,226, 25,254, 75,232, 69, 97,248,222,173,105,135,129, 65, 67,167,111,146,226,141, 71, 72,174,242,173,108,
- 64, 43,123,137,134,146,187,116, 99,219,255, 82,245,122, 74,163,222, 11,100,212,220,221,210,178,219,240,192,112, 17, 34,235,250,
-120, 65,240,192, 52,191, 37,137,107,121, 55,177,133,156,156,249,147,132, 13,243, 65,188, 44,123,127,150,192,129,149,164,105,252,
-232, 1,204,163,199, 97, 26,189,243,160,186,112, 37,192,213,250, 40, 81,228, 29,196,198, 94, 77,154,200, 62,252, 63,128,196,223,
-188,182, 61,122,116, 57,151, 32,129,156,201,158, 93, 89, 69,252, 10,245,162, 30,125,245, 62,245,255,124,207,131, 7, 15, 24, 96,
-248, 17,194,117, 20, 54,250,172,125, 62,198, 94,211, 26, 53, 58,251,237, 36, 70,155,238,107, 89,182,130, 5, 11, 62,230, 55, 18,
- 96,176,236,186, 15,233,100,128,120,191,108,237,218,181, 49,214, 62,227,106,237, 25,255,155,164, 73,224, 52,104,202,148, 41, 79,
-200, 71, 43,160,210, 74, 92, 18, 19,128,241, 30,243, 48, 47,146, 46,216,130,196,110, 32, 87,179, 28,188, 85,144,197, 85, 95,132,
- 8, 17,148, 1,140,177, 10,185, 42,229, 0,143, 1,154,118, 11, 99,140,148, 27, 82,166,217, 4, 89, 4, 88, 24,184, 45,231,207,
-159,183,128,142, 5, 3,178,101,216,176, 97,254, 24,108, 23, 27,161,163,205, 67, 73, 22, 38,177,195,207,159, 63,247,198, 0,235,
-141,119,120, 99,240,246, 14, 8, 8,240,198,128,126, 16,255, 77, 7, 56, 5,253,196, 0, 89,141, 48, 25, 20, 3, 96, 41,170, 77,
-248,246, 34, 80, 75,212, 3,200,209, 6, 72, 54, 82,236,164, 4,110,251,246,237, 43, 81,178,100,201, 33, 0, 92, 23,153,240,123,
- 40, 0, 87, 41, 0,197,250,123,246,236, 73,102,132,144, 53,207, 73,240,206,223,209, 10, 95,123, 13,125,139,245,126, 18,201, 85,
-188, 54,133,100,213,124, 63,220,125,119,116,154,188, 59, 52, 65,222,238, 29, 46,111,183,123,202,219,141,157,228,245,170,223,228,
-205,134,142,242,102,245,111,242,122,102, 25,241,159, 92, 72, 90, 22, 74, 28,152,254,219, 24,102,219,171,137,207,251, 87,100, 85,
- 0, 21, 65,150, 29,216, 82,198, 87, 2, 17,212,185, 35,105,151,222,199,103,135,129,118,128, 42, 49, 82,129, 22,165, 68, 84,217,
-229,206,157,251, 37, 8,104,165,103, 78,233, 17,104, 17, 64, 80, 37, 71, 0,196, 62, 78, 80, 67,176,162,130,172, 51,103,206, 40,
- 0,132,146,109,244, 43, 2,173,219,174, 10,168, 2, 45,130, 62,180,107,249,165,102, 77,241,246,242,146,203, 24, 59,152,206,130,
- 30,191,155,224,134,239, 65, 60, 64,151, 64,139, 42,192, 70,141, 26, 73,187,118,237,164, 77,155, 54,130,152,132,242,219,111,191,
- 9,131, 62, 99,124, 83, 18,199, 37, 74,162, 88, 86, 2, 77,220,127,231, 64,117, 24,172,216,224,161, 50, 54,178, 28,197,138, 21,
-147,252,249,243,219, 18,223,193, 52,124,248,112,217,190,125,187, 82,127,228, 19,194,135,249,186,250,118, 45,205, 54,209, 61,228,
-215,104,255, 79, 88, 84, 9, 19,213,158,124,167, 51,154, 95, 2,139,232, 53,176,175,250,126,196, 40, 49,183, 12,153,180, 66,126,
-239, 55, 95, 74, 55, 27, 35, 69,235,122, 74,254,202,176,125,168,214, 81, 10,215,232, 44, 69,170,254,110, 3, 90,101, 27,244,150,
-166,158, 75,228,143,241, 27,101,216,212, 53, 18, 45,102, 92,123, 29,246, 71,188,248, 41, 86,248, 29,215, 58,253, 28,116,239,175,
-114,114,121, 71, 41,155, 14, 95,174, 65,170, 53,165,180, 92,104,152, 51,136,121,244,152,168, 2,173,142, 0, 77, 7, 40,177, 2,
-152, 34,176, 10, 66, 39,230, 89,251,251, 4,212,136,215, 96,179,117, 53, 83, 38,197,142,167,201,183,223, 26, 6, 90, 4, 67,170,
-232,150, 19,119,174, 92,185, 30,135, 0,108, 40,159, 19, 59,118,236, 27, 28,104, 92, 29,188,207,124,122,223,111,127,159,101, 66,
- 68,247,167, 92, 65,178, 19, 19,128,176,236,102,233,104,243, 3, 0, 20,198,132,248,148,171, 73,170,225, 32,137, 17, 0,185, 39,
-188,110,144,110, 48,144,101, 5, 82,158, 14,158, 29,160, 2, 49,163, 96, 11, 43,189,131, 4,147, 39, 97,159, 71, 73, 22, 65, 22,
- 87,180, 28,132,239,222,189, 43, 22,139, 69,177,231,224,234,150,146, 45, 12,188,199,140,148, 25,131,208, 93, 72,157, 44,219,182,
-109,179,204,157, 59,215,130, 1,197, 2,137,139, 5,245, 98,193,247, 91,168, 70, 52, 66, 71,155, 7, 82,182,149,148,100, 97,176,
-246,198, 0,230,141,123,202, 25, 34,127,111, 0, 88,239,164, 73,147,174, 55, 75, 19,249,203,116,232,208,161,140, 61,200, 82,255,
- 99, 80, 47, 11,176, 88,205, 36,221,114,221,186,117, 43,141,118,212,159,147,175, 54, 17,108, 1,116,150,199,192, 91,197, 4,205,
-147,152,248,158, 1,184,250,172, 88,177,194,103,237,218,181, 62, 91,182,108,241, 1, 63,125, 80,103, 62,152,192,124, 80,103, 62,
-160,249, 24, 52, 79, 34, 49,128,183,203, 3,246, 88,109, 27, 22, 73,243,182, 85,217,244,114,121,106,109,121,179,172,161, 2,176,
-130,158,248,216,186, 85,208,163,171,242,122, 65, 53,121, 57, 38,131,212,203, 25,251,117,234, 56,113,236, 13,142,245, 94,243, 57,
-238,115, 91,251,126, 36,142,109,121, 63,199, 11, 62,129,102, 48,176,181,113,227, 70,133,151,236,239, 33, 4, 89, 74, 81, 48,142,
-237, 67,127, 14,210, 74,180,184, 96,101,159,197, 66,105,159,209,242, 82, 50,207,254,204,201, 29,113,248,148,118,137,152,124, 2,
-201, 61, 23,191,146, 51,103, 78,142,203, 12,128, 44,104,163, 74,223, 55, 10,180, 8, 0, 17, 51, 48, 24,200, 82,193, 22,207,228,
- 1,199, 83,142, 49,174, 36, 90, 40, 83,104, 25,195, 7, 99,139, 10,138, 40,201, 34,200,162, 29,152,154, 8,130,212, 68, 16, 71,
- 62,211, 70, 11,227,137,189,234,208, 41, 77,130,172,245,223,254, 63,105,231, 38,214,149, 81,154, 70,235,242, 75,231,115,178,235,
- 80,149,246,171,182, 90,193,109,180,190, 68, 33, 97, 4,127,123,193,186,195,242, 75,199,169, 82,254,183,113,242,115,171, 9, 82,
-165,237,100,169,244,251, 88, 41, 92,173,157,173, 30, 38,207, 90, 34,229, 27,245,149,223, 6, 44,151, 78, 35,215,201,220,117,222,
- 18, 37,122,108,151,171, 8,216, 95, 21,232,147, 54,177,229,221,184,134,114,124,193, 79,242,242,108,149,224, 64,203,171,146, 4,
-245, 41, 42,221,146,197,164,173, 86, 1, 87,223,171, 2,173,158,144,108, 41, 54, 89,180,199,178, 74,177, 8,182, 84,192,117, 12,
- 32,140, 32,235, 6, 36, 95,119, 50,103, 86, 0, 67, 72,128,214,142, 29, 59,132, 81,205,185,106,194,106,236, 73, 8,213,104, 25,
- 97,247,115, 31,134,218,138, 56,218, 62,241, 58,239,227,187,205,216,131,121,176, 44,148, 58,177,147,113, 21,194,178, 82,111,255,
-137, 64, 43, 39,108,137, 30,211,120,147,160,141,101, 37, 8, 36,216,196, 32,103, 84,141,218,215, 14, 64,237,194,183, 77, 66,154,
-104,151,120,109,151, 93,222,174,174,234, 31,131,184, 47, 7, 1, 2,172, 52,105,210, 56, 52,186,133, 93,145,208,182,131, 96, 11,
-171,188, 59, 70,250, 79,198,140, 25,253, 33,121,178, 96, 64,167,122,217,150,240,188, 5,134,178, 22, 12,224, 1, 70,232,104,243,
- 20, 40, 80,224, 32,213,133,168, 39, 5,100,169, 9,146, 46, 69,141,136,114, 30, 49, 75, 19,249,235,163,158, 63,146,102,169, 64,
- 11, 19, 72,113,116,214,206, 38,233, 54,160,250, 17,188, 61,205,201, 76,155, 40,217,130,164, 20,122,126,233,100,130, 38,129,214,
- 19,130, 44, 72, 76,124, 96, 83, 19, 12,100, 97,242,240,129, 10,196, 7, 60, 96,123, 58,137,164, 11,180,144, 39, 76,134,132,209,
-103,173,237, 95, 93,222,172,105, 41,175,231, 87, 1,200,186, 46,199, 46,222,151,218,189,215, 43,137,191, 3, 31, 92,144,151, 67,
-147,139,119,219,120,130, 0,241, 4,142,127,247, 65,149,185,202,211, 19,127,119, 97, 28,188, 95, 1, 91, 4, 89, 92,192, 0,164,
- 11, 36,155, 33,145,100,105, 73,231, 71,127,121, 65,125, 24,145,170, 0, 0, 17, 55, 73, 68, 65, 84, 48, 64, 64, 67,131,114, 74,
-155, 32,153, 97,191,202,111,148, 7, 4, 90,236,195,155, 54,109,146,100,201,146, 41,101, 34,192,162,241, 55, 85,125,148, 28, 81,
-157,216,160, 65, 3, 69,165, 70,169, 14,222,235,178,191,171, 18, 45, 74,152,218,181,109,171, 72,177, 72, 87, 5, 89,234,111, 46,
- 92, 41,205, 34, 47,116,128,150,209,207, 49,149,143, 11, 63, 78,186,156,119, 92, 1, 45,242,149,210, 67,142,215, 0, 90,122, 18,
- 45, 27, 77, 87, 64,139,239, 53, 74,211,212, 71,253,253,153, 85, 13,130,253,249, 67,201,128,232,139, 88, 69,118, 69, 62, 87, 89,
-225, 39,235, 14,119, 19,214,237, 50, 29, 32,107,162, 84,109, 55, 69,106,116,156, 38,197,106,117,147, 19,167, 47, 40, 64,107,242,
-172,165, 82,161,241, 7,144,213,106,240, 42,233, 58,102,163,204, 93,127, 76,162, 68,139,237,178,113, 23,141, 21,225,220,189, 63,
-170,201,237,241, 37,197,103,119, 25,161, 20, 75, 29,124, 20,137, 22,211,172,226,114,171, 65, 70, 97, 94, 87,223,168, 2,173,254,
- 0, 80, 4, 89,199,226,197,179,169, 11,181, 64,139,210, 44,130,172,219,216,129,120, 27, 18, 45,118,118, 51, 64,139,219,115,249,
-205, 92,209, 48,113, 53, 70,113, 53,221, 8,132,176, 14,114,162, 35, 60, 56,120,240,160,162,222, 82, 19,255,243, 58,104,154,182,
- 3, 99, 89,168,218,227,160,161,150,147,224,136,101, 15, 97, 25, 51,230,201,147,231, 17,129, 27,213,144,218,114,146,127, 4,115,
- 41, 82,164,208, 5,132, 81,162, 68, 57,233, 82,124,231,226, 38,158,229,234,223,233,129, 1,232, 48,129, 31, 87,176,148,100,241,
-123, 57,160, 67,178,167, 12,230, 60,184,131,136, 3, 15,237, 75,192,219,147, 70,120,193,129, 77, 85, 27, 82,146,165, 38,170, 15,
-121,221, 10,132,141,144,178,229, 73,153, 50,229, 74,128, 66,111, 12,150,222,152, 44, 20,160, 5, 27, 58,111,128,126, 5,104, 97,
- 82, 88,103,138,224,135,204,117, 80,182, 96, 42, 67,173,116,203, 10,138,168,134, 53,115,212,165, 77,150, 11,160, 85, 18,108, 29,
-104,130,224, 73,212,209, 35, 21,100, 65, 58, 98,147,100, 17,100,225,158, 15,218,147, 15,128, 45,219, 61,235, 71, 15,104,125, 0,
- 89,127, 86,129,138,176,165, 60,157, 86, 26, 54, 89,245,148,186, 38,192,202, 88,103,182,146,248,155,199,203,113,217,196,210, 39,
-178, 20,251, 33,186,203,177,196,196,247,124, 74,214, 83,234, 88,135,179,215,167, 16,250, 76,207,218,108,178,216,143, 40,197,230,
-152,100, 45,179, 33, 21,159,163,114,209, 12, 98,250,244,233, 10,208,226, 88,194,133, 17,198, 43, 83,223, 79,160,133, 54,162,168,
-199,102,206,156,169, 72,173,203,151, 47,175, 72,170,217,239, 41,193, 38,109, 74, 96, 88,118,142, 91,102,128, 22,213,144,174,128,
- 22,199, 84,244, 53, 61,160, 21, 3,223, 58, 26,101, 53,228,222,129,249,152, 31, 60,115, 41,109, 77,144, 32,193, 29,182,101,142,
-193,122, 64,139,160,144,245,134, 69,162, 75,160,165,165,169, 7,180,156,209,252, 18, 88, 36, 36,237, 92,245, 12,175,198, 56,116,
- 34,209,178,151,100, 5, 55,221,248, 18, 6,104,145,162,198,220, 54,104,226,114,105, 55,120,137, 21,100, 77,151, 90, 93,102, 74,
-201, 58,244,162,255,225,168,208,216, 83, 90, 2,100,181, 6,200,106, 55,108,173,244,159,186, 83,134, 77, 91, 39, 49, 98,197,221,
-230,140, 57,153,195,122, 84, 27,159, 55,245,203, 55,163,107,201,241,165,133,228,205,197,106,142,129,214,153, 42, 34,221,115,200,
-208,212, 49, 45,124,198, 25, 61, 2, 45, 78,164, 35,146, 38, 85, 64,214,161, 88,177, 28,170, 14,189,161, 70, 60,139,251, 42,208,
-162, 68,198, 12,208,162, 35, 56,126,179, 42,125,162, 61, 16,140,183, 31,133, 80,162,165,124, 14, 85,111, 80, 39, 61,164, 56,152,
-131, 4,207,252,111, 66, 37, 23,140, 45, 44, 11,203,196,178,169,229,228,170,148,101, 15, 73, 99,133, 61,211, 13,130, 23,130, 55,
-150,207, 62,113,208,132,228,131, 54, 96, 55,116,232,123,126,130, 68,171,163, 43,218,216,137, 52, 4,170,168, 32, 14,180, 4,152,
- 28,136,168, 50, 32,208,226,138,150,101, 39,224, 34,208, 66, 62,193,224, 50,206, 8, 47, 80, 7,115, 70,142, 28,137, 5,244, 11,
- 5, 88,241, 12, 26, 22, 52, 1, 75,251,246,237, 67,106,163,213,100,242,228,201,135, 48,104,121,195, 38, 68,177,209, 66, 59,244,
- 6, 77,239,206,157, 59, 31, 0,168,108,105,164,108,118,121, 10,192, 94,165,132, 51,213, 33,202,141, 14, 38,109, 77,210,253,137,
- 52,157,169, 14, 81,126,172,132,164,149, 9,154, 4, 90, 15, 41,201, 34,200, 2,136,243,129, 81,175, 15,192,177, 15, 38, 73, 5,
-100, 97,130,244, 65,189,177,157,234, 1, 45, 5,100,173,243,172, 36,111, 86,254, 42, 75, 91, 3, 68, 77,200, 45,175,231,254,236,
- 28,104,141,201, 40, 47, 7,124, 43,117,114,197,161,177,253,223,125, 20,181,126,227, 21,156,139,253,221,133,177,123,191, 13,100,
-209,102,137,227, 8, 65, 22,143, 80,144,106, 21,195,196,255,130, 38, 27, 4, 75,165, 75,151,166, 52,203,212,247,211,214,148,253,
-153,106, 76,130, 30,168,183, 21, 0, 72,219, 42, 46,182, 56, 6,112, 49, 69,144,197,119, 16,108, 0,104,217,239,230, 11,246,201,
-170, 68,139, 96,141,224,237, 28,198, 59,173,202,144,191,175,227, 30,199, 16,130, 44,130, 60, 87, 18, 45,130,166,229,203,151, 67,
-128, 30,248,209,242,145,215,180,110, 41, 56, 78,241,123, 48, 54, 6, 90,193,150,211,230,160,130, 34,218,158,209, 30, 75,171, 46,
-212,170, 17,137, 13, 56,214,241, 93, 70,129, 22,105,210, 30, 75,123,104,213,136,167, 59, 53,119, 74,243, 75, 96,145,144,244,145,
- 80,219,117,168, 26,161,133,164, 16, 70,158,161,199,247, 95, 59, 12, 12, 28, 49,107,155,212,236, 56, 93,106,119,153, 37,245,186,
-207,149,210,245,254,144,236, 69,170, 75,142,162, 53,164, 82,211,126,210,122,200,106,105, 55,124,173,116, 26,181, 65,198, 47, 57,
- 36,191,119, 31, 25, 24, 33, 66,100,122,139,255,232, 40,130,157, 42,165,163, 71,188,247,212,179,186, 92,159, 88, 84,238,236, 47,
-247, 65,122,229, 44, 45, 44, 42, 15,234,165,146, 82,209, 34,220,227,179,142,104, 18,104,209,168,114, 10,252,100,237, 7,144,218,
-138,221,133,170, 49, 60,213,133,148,100, 17,100,241, 26,119, 34, 42, 64, 11,122,124,118, 44, 51, 64, 11, 13, 93, 1, 90,156,200,
- 57,248, 64,205,243, 48,164, 54, 90,218,239,192,228, 90, 22, 42,184, 71, 4, 9, 60,243,191,145,250,113,150,135,101, 98,217, 84,
- 73, 25, 7, 54,150, 61, 36, 52,161,114,244,162,107, 3,189,196,124, 58,244, 29,217,104, 13,112,240,140, 61, 32, 51, 98, 16,159,
-130,187, 14,169, 10,166,154,148,131, 45, 7,179, 76,144, 90,114,160, 85, 65, 22, 87,183, 0,161,148,152,216, 59, 27,116, 86,244,
- 72, 0,113, 55, 6, 12, 24,192, 93,114, 22,238, 60, 4,109, 5,100,225,250, 77, 60, 20,162, 93,135, 0,189,243, 96,180,122,144,
-146, 45,117,231, 33, 65, 22, 86,182, 52,174, 55,180,147, 75, 91, 96,172,110,227,119,236,216,177, 26, 38,154,143,164, 90, 24,140,
-139,161,201, 14, 69,130, 6,222,248, 1,117, 76,162, 78,157, 58, 85,133,237, 84,113,123, 99,120, 72,227, 32,130, 22,142,202,122,
- 82, 39,237, 11, 79,162,191,221,199,196,237, 3, 41,176, 15,164,193, 54,144,133,122,243,129, 4,130,210, 44, 31, 76, 16,180, 41,
- 57,137,228,148,118,250, 68, 81, 7,173,235, 83, 65,177,201, 90,242,123,102,201,144, 48,234,249, 83,221,191,147,151,195, 82, 74,
-224,253,115, 31,171, 14,253, 78, 67,154, 21, 73, 2, 70,252, 40,121,191,143,125,193, 56, 23,254,115, 57,131,129, 44,238,176, 6,
- 7,148, 68,144, 21, 26, 96, 11,253,230, 12,253, 73,113,135, 32,108,179,206,152,229, 48,129, 22,205, 4, 56,182, 81,141,199,197,
- 36,129, 15,199,100,246,125,130, 44, 2, 68,130, 23, 74, 96, 8, 54,140, 2, 45,218, 54, 81,202, 70,179,144, 43, 80, 59,170, 96,
- 75, 5, 89,220,237,199,119,193,182, 80,207, 24,254, 46,223,203,178,193,127, 95, 48, 87, 14, 90,183, 14,252,205,251,212,140, 80,
- 2, 71,201,150, 43,126,192, 38,244, 54,235,128,227,155, 30,208, 82,253,130, 65,219,224, 82,162,165,165,169, 7,180,156,209,212,
- 24,195, 27,182,119, 54, 91,239, 33,201,175,149, 96,169, 59, 16, 29,208,209,250,208, 82,127,255, 63,219, 23, 66,145, 73,226,124,
-155,248,254,244,101,123,225,186, 97,185,212,239, 49, 87, 26,245, 90, 32,229, 26,246,177, 1,223,170,205, 7, 72,251,225,235, 20,
-144,213,111,218, 78,153,185,234,168,196, 79,148,156,147,186, 67,247, 14,217,195,135,105,189,172, 76,166, 87, 47, 71, 84,146, 19,
-171,138,200,251,203,213,109, 32, 75,237,212,193, 64, 23,165, 93, 61,178,200,156,108,113, 95,242, 89, 71, 12,167,139,134,135,232,
-116,183,176,218, 88, 6, 3, 73,186,112,216, 6,131,248,227, 0, 88,215,173, 54, 89,231, 97,244,190, 27, 46, 30, 46,194, 96,254,
- 54, 26,183, 15,108,160,206, 1,249,155,113,239,160, 2, 45,118,112,216, 7, 60, 8,169,212,201,209, 55, 96,133, 84, 29,106,154,
- 7, 60,135,164, 81,217, 63,195,178,177,140, 44, 43, 87, 62, 33, 5, 90,161, 81, 22, 13, 13,251, 93,135, 28, 4,180,198,135, 9,
-184, 19,145,141,203,168, 33,188, 74, 27,124,107, 83,179,102, 77, 2, 34, 69,117, 64, 59, 14, 14,118,170, 83, 64, 14,186,176, 93,
-243, 7,143, 93,218,123, 57,248,222, 8,244,155, 69, 27, 55,240, 48,128,103, 72, 13, 9,136, 66, 2,178, 84,242, 97, 64,179, 49,
- 38,128,181, 80, 99, 30, 1,136,197, 70,217, 40,236,228,166, 65,150, 74,112,194,132, 9, 89, 49,249,212,193,247,151,195, 36, 83,
- 28, 60, 40, 5, 30, 80,234, 52, 4,169, 82, 72,234,113,210,164, 73,217, 72, 19, 0,169, 28,218, 80, 9, 72,245, 74,130,230, 47,
-224,235, 48, 10,179, 77,210,228,174,195,123, 48, 38, 86, 64, 22, 22, 21, 62, 88, 69,251, 64, 66, 74, 3,120, 5,100, 1,116,250,
- 0, 32,115,178,113, 9,180, 42,102,137,127,239,245,252,202,178,228,183,244, 4, 89,179,210, 38,136, 82,161, 79,201,152, 98,249,
- 51,166,188, 26,151, 85, 2, 1,172,212,131,191, 95,253,149, 5, 54, 90,201,100, 83,251, 12,146, 54, 97,212,225, 38,203,253, 95,
-201,110,115,239,192, 73, 95, 3,178, 8,190, 20, 0,166,130, 45, 2, 4,235, 88, 29,146,246, 90, 50, 76,152, 48,239,153, 64,195,
-180,207, 49,246, 63, 26,165,115, 92, 35, 64,161, 6, 64, 5, 89,148,182,171, 32,139,146, 34,213,119,151, 81,160, 69,211, 3,154,
- 66,168, 70,244, 28, 51, 72,135, 11, 53, 21,100,209,118,150,210, 51, 87, 18, 45,154,105, 80,195, 66, 16,101, 4,104, 49, 15,199,
- 44, 61,243, 14, 21, 20,113, 65,201,221,133,174, 36, 90,106,251, 7,208, 50, 4,222, 72,147,187, 11, 93, 73,180,156,209,252, 66,
- 88,228,239,233,135, 95,234,227,224,124,180,217, 79,165,107,248,207, 94,125, 88, 58,141, 88, 45,191,246, 93, 44, 21,155,120,218,
-234,163,250,111,131,164,243,232,141,210,127,218, 46,153,179,254,132,148,170, 84,255,121,164, 40,209,155, 57,227, 74,149,184,145,
-206, 60,237, 83, 85,222, 47, 44, 37,175,175, 79, 18,185,183, 88, 63,109,104, 44, 15,235,164,146,202,113, 34, 58, 92, 1, 41, 14,
- 75, 17, 86,199,239,240, 97,185,133, 85,216, 78, 24, 62,159,135, 11, 7,130,172,155,170, 77, 22,165, 88, 76, 42,200,194, 22,230,
-102,177, 99, 59, 11,197,227,176,248,148,234,176, 35,195, 24,154, 54, 73,166,237,167,254,134,150,146,147,101,229,224,193,178,255,
- 13,239,119,244, 74,130, 45, 79, 2, 42,171, 31, 45,237, 96, 29,193,234, 71,139, 0,140,210, 46, 93,215, 14,218, 23, 64,244,222,
- 6,126,178, 30,114,192,160, 40,156,131, 36,165,121,236, 43,144,120, 61,194, 32,109,198,120,251, 31,194, 46,227,197,192,132,147,
- 20,192, 18, 43, 23,161,110,159, 82,172,246, 38,165, 78, 31,189,204, 74,147,128,141, 52, 9,176,218,134,144,230, 6,184,214,120,
- 12,169,195,125, 76,136,208, 56,251,249, 1,184,221, 3,192,242, 69, 61,249,162,220,119,153, 96, 44,207, 93,135,220,141,231, 84,
-162, 5,255, 89,173,106,100,143,119, 7,146,173,177,214, 54,242, 13, 0,212,230,149,117, 99,136,165,127, 92,177,244,139, 41, 47,
-199,102, 86,146,101, 64, 60,236, 56,204, 40,151, 6,231,147, 60,223,197,242, 77,157, 48,218,183,198, 57,250,159,203,169, 0, 42,
-141,159,172,143, 28,150,106, 64, 86,136,109,181, 62,133,171, 4, 90, 52,206,167, 75, 16,150, 83,207, 93, 8, 39, 42, 0, 45,151,
- 82, 29,213, 97, 41,199, 73, 2, 42,126, 35, 84,219,138,253, 45, 37,103,116, 29,131,157,199,140, 48,161,128, 44,184, 75,113,228,
-176,212,246, 89,148, 76,209,100,193,168, 68,139,239,164, 52, 78, 79,162,197,221,147,252, 30,142,105,148,172, 81, 2, 71, 16,200,
-164,149, 42,161, 15,217,230,103, 61,160,165,165,201,239, 39,200, 86, 15,170, 11,213,116,188, 69, 29,167, 52,191, 20, 22,249,148,
-118,227,226, 89,215, 18,173,207,244, 82,135,100, 97,171,181,233,167, 82,213, 95, 76, 91,182, 95, 70,205,219, 35,109,250,205,145,
- 95, 90, 13,150,218,173,135, 74,167, 33, 11,101,220,226, 67, 50, 99,213, 17, 41, 82,182,230,139,232, 49,226,108,114, 85,182, 10,
-177, 34, 28,184,210,180, 88,144, 12,169, 44, 50,160,188,200,159,165, 68,122, 23, 21,249,163,160, 72, 55, 4,245,238,148, 29,211,
- 67, 38, 12,231,233,131,165, 51,197, 18, 5,241, 89,103,180, 85,176,229, 11,123,161, 59,232, 24, 39,177,221,247, 10, 84, 71,220,
- 93, 72,195,119, 37, 65, 93,168, 72,178, 66, 0,178,248, 94,172, 56,188,160,246,185,129,159,166,118, 2,126,201,186,114,240,174,
-140, 44, 51,203,254, 55,151,195,254,245,244,159,165,117, 86,170,222, 39,240,250,148, 45,182,223,225,123,167, 2, 88,158,165, 20,
- 15,171, 64, 96,238, 4,211, 65,243,135,127,216,247,255,215,138,163,122,134,167,234,206, 85,218,141,251, 89,144,190, 51,195,160,
-172, 64,217,105, 19, 68,221,217,173, 4, 54,195,116, 75, 37,207,198,192,110,107, 98,126,185, 60, 56,183, 76,168,151, 70,178, 37,
-137,113, 51, 77,252,168,112,203,231, 62,116, 56,160,128, 45, 36, 71, 64,202,213,189, 47,194, 88,168, 14, 15, 67,154, 21, 72,169,
- 22, 85,136,180,195,226,110, 56,130, 13, 74,160, 40,193,166,217,128,122,192,166,234, 29,198, 2,238,242,116,122, 48,156, 14,237,
-117, 9,120, 40, 41, 35,200,162,221, 41,237,192, 40,217, 83, 65, 22,253,139, 17,100,209, 43,189,131, 16, 60, 54,250,180,181,130,
-183,250, 64,170, 47, 89, 54,158, 89, 94, 74,160, 8,100, 40,189, 34, 88,162, 4,142, 18,120,154,176,244,237,219, 87,215, 70,139,
-142, 87,249, 93,164, 65,176, 73,186,148,220,171,223,109, 31, 70,136,121,177,249,198,165, 68,235,115,208,252, 34, 13, 33,244, 95,
- 18, 18,255,133,161, 95,138,240, 81,162,180,138,155, 32,233,131,230,157,134, 4, 13,158,180, 74,102,173,241,146,217,107,142,201,
-144,201,107,228,183, 46,195,130,226, 39, 74,241, 32, 74,148,104,186,198,177, 48, 20, 73, 93, 49,102,132,227,213,163, 69,120, 89,
- 61,106,248, 15, 41, 74, 56, 91,170, 22, 57,236, 75,251, 84, 21,215, 42,196, 8,127,140,207,186,250, 50, 21,108,209,227, 59, 27,
- 51, 87, 60, 20,137, 82,167,205,142,196, 6, 77,117,161, 89, 73, 86,232,115,211, 77,209,205,129,255, 44, 7,232,136,148,210, 42,
- 87,137, 32, 43, 36,106,169,111,224,190,161, 86,218, 4,209, 86,166, 79, 16,229,106,198,132, 81,111, 3,124,109, 75, 27, 63,106,
-231, 28,137, 61,162,252,103, 57,110,254,195, 67, 26, 84,218,252,155,204, 63, 17,141, 96,139,155,123,152,184,152,210,218,143, 98,
- 97,197,197,149, 31, 0,132,146,112,239, 16, 94, 17, 85,231, 53,169, 9,156, 40,217,162, 74,208, 85, 98, 30, 43,200,114, 53, 23,
-125,150, 93,135,144,230, 93,209,238,162,166,105,132,154,168,170,180, 63, 40,241, 2, 47,124, 92,125,251,231,160,105,190, 74,191,
-204, 19, 78,118, 29,254,115, 36, 90, 26, 54, 36,137, 16, 41,122,207,232,113,226,239,136, 26, 61,142,111,212, 24,113,124, 99,198,
- 77,176, 3,170,194,158,200, 99, 40,228,206,231,102, 41,193, 22,237,174,232,241,157,134,238,246,137,247,152,231,115,151,195, 77,
-223,205, 1, 55, 7,220, 28,112,115,192,205,129, 80,228, 64, 90,238,238, 86,129,165, 10, 42,181,192, 82, 5,152, 60, 3,136, 18,
-100,233,133,158,250, 28, 52, 67,241,147,191, 34, 82,170, 14,213, 96,145, 13, 25, 40,154,116,187,255,183,210, 52,248,221,204,102,
-182,156, 70,118, 89, 24,165,169,250, 69,243, 52, 80, 94,163, 52,109,186,251, 80,164,105,198,127,155,209,114,134, 42, 77,141,205,
-128, 81,186,186,229,212,246, 33,131,253,201, 48, 77, 19,125,233,111,167,105,160, 29, 25,234, 71, 90,187, 14,131,187,167,205,124,
-187,209,190,100,134,166,209,190,100,134,102,168,183, 79, 19, 62,141, 92,150,211,190, 77, 26,164,107,138, 38, 27,138,129,190,100,
-138,166,193,190,244,143,160,105,160, 47,133,180,156,174,230, 37, 67,237, 83,235,163, 83, 83,247, 70,230, 38, 3,159,245,101,179,
-168, 59, 14, 85,127, 90,118,111, 15, 29,149,161,193, 65, 76,251,110,221,138,208,102, 54,208, 81, 12, 13,188,159,139,166, 73, 67,
- 61, 67,223,110,240,155,213, 79,250,219,104,170, 5, 48, 88, 94,163,229,220,109, 29, 32,149,179,206, 97,148,166, 50, 48,132, 70,
- 57,181,237,221, 68,221, 27, 26,208,212, 50,134,118, 57, 77,212,147,225,114,126, 14,154,159,139,159,122,141,200,122,223,240,183,
- 27,172, 31,221,113,201,209,216,105,128,182,153,114, 26,237, 75,102,104, 26,237, 75, 33,234,155, 58,223,111,154,230,167,242,211,
- 89, 59, 15,205,114, 26,236, 75,166,191,221,192,152, 23, 34,154,161, 49, 38,107,203,102,160,142, 12,118,225,191, 55,219,103, 87,
- 29,154,100,148,161,202,213, 76, 58, 69, 12,176,207, 20, 77, 3,244,116, 7, 73,109,231, 48, 1, 54, 13,149,211,224,170,201, 52,
-208,210,174, 34, 66,179,179,112, 69, 98,128,167, 70,191,221,232, 42,220, 76, 29,169, 52, 67, 69, 66,104, 15, 8, 12,180,127,221,
-111,215,210, 48, 64,207,208,183,219,211, 52, 80, 79,127,107, 57, 53,237, 94,175,158, 12,151,211, 68, 95,250, 91,105,154, 24,239,
-204,148,211,104, 95, 10, 9,205, 80,169, 35,181, 77, 90,235,201,243, 83, 1,140,253, 24,103,160, 47, 25,250,118,109,223, 49, 48,
-142,134,136,230,167,142,201,218,114, 25,236, 75,166,202,105,176, 47,233,210,180,111,235, 6,233, 26,152, 98,254,158, 44, 95, 68,
-162,101, 0, 53,219,127,189,225,138, 48,193, 54, 67, 52, 13,174, 28, 76, 1,152,175,133,166, 9,105,129,161, 73,220,228,119, 27,
-166,249,185,202,105,162,157,234,182,165,175, 13,104, 25,152,108, 12,183,121,123, 90, 6,104, 27,230,167,137, 54,245,183,210, 52,
-209, 70, 77,149,211, 0, 47, 13,245,163,207,221, 62, 13,246, 37, 93, 41,153,118,124, 55,200, 83, 83, 52, 63,103, 57, 63, 5, 20,
- 57,171,231, 79, 1,153, 95, 11, 77, 71,117, 98,176,238, 77,192,129,127,105, 86,131, 3,132,225,193, 92,131,120, 21,187, 5, 3,
-108,211, 29,208,236,104, 22, 9, 45,154, 38, 38, 7, 67,131,228,231, 42, 39, 87,100, 6, 86, 98,166,234,200,224, 64,102,138,230,
-231, 40, 39,104, 42, 43,101,237,170,212, 69,253,235,182, 37,205,192, 96,148,167,134,105,154,224,169, 97,154, 6, 87,183,134,218,
-167,118, 80, 52,200, 83,195,229, 52,209,151, 12,211, 52,177, 90, 54, 67,243,107,169,247, 80, 47,167,137,190,164, 11,138,212,186,
-177,182,121, 35,101, 53, 69,211, 96, 95, 50, 69,211, 96, 95, 10, 41, 77, 87,243,146, 41,154, 6,251,146, 41,154, 6,251,146,161,
-126, 20,130,186, 55, 48,101,127, 93, 89,254, 7, 92, 51,104,174,242,165, 70,254, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13,
+ 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,
+105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103,
+ 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136,
+ 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,
+163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81,
+ 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,
+126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,
+192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227,
+ 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104,
+ 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16,
+ 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174,
+ 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2,
+ 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,
+142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59,
+ 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,
+161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,
+190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,
+211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223,
+ 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,
+193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,
+179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,
+194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112,
+ 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,
+142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242,
+ 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,
+132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,
+192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,
+245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,
+218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19,
+ 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155,
+ 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157,
+ 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17,
+ 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,
+105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40,
+ 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,
+182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,
+125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,
+126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,
+129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63,
+ 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,
+150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,
+103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,
+152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,
+219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,
+163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,
+166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120,
+ 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,
+214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,
+182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,
+180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,
+157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,
+113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,
+195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,
+183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,
+111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,
+191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,
+231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88,
+ 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,
+218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,
+226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,
+240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242,
+ 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118,
+ 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,
+139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,
+137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29,
+ 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,
+174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,
+223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,
+169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,
+245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250,
+ 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,
+213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,
+182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226,
+ 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154,
+ 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,
+218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,
+116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,
+254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,
+255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,
+188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,
+254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,
+158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235,
+ 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,
+255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,
+255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,213, 0, 0, 13,213, 1, 61,214, 88,241, 0, 0,
+ 0, 7,116, 73, 77, 69, 7,219, 12, 30, 22, 40, 19, 0, 83,187, 87, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,
+213,226, 61, 51, 59,179,187,217,146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,197,
+134, 5, 84, 68, 68, 32, 54, 64,240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201, 38,
+219,203,220,223, 31,217, 89, 55,203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,191,
+ 59,103, 11,198,157, 52, 35,231, 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,151,
+112,146,230, 14,103, 75,113, 54, 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,226,
+ 12, 48, 79, 53, 53,156,164,185,195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69, 86,
+192,200,204,204,100, 92,248,153,191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,153,
+204,234,213,171,183, 2, 24,208,156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,101,
+201,157,179, 57,242,189,167,251,222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,220,
+ 57,155, 35,223,255, 25,156,205, 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119, 22,
+ 68, 45, 37, 54,155,224,192,252,229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,223,
+157,167, 57,238,147, 39,206,171, 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,230,
+151,129,129, 46,191,223,109, 78,206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,105,
+ 41,222,107, 26, 45,213,124,214,220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,115,
+ 54,247,180,100, 56,155,147,179, 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,108,
+ 78,206, 0,185,175, 9,206,171,184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195, 57,
+176, 37, 28,194, 22, 64,179,135,211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176, 25,
+157,162,102,117,158,221, 57,155,227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41, 39,
+229,164,156,148,147,114, 82,206,235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+226, 31, 5,175,237,187,113,113,113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71, 20,
+255, 32,176,248,195, 65, 23, 0, 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,110,
+183,195,102,179, 57, 63,205,102, 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,101,
+101,125,125, 28,178, 19, 64, 10,195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194, 37,
+126,247,201, 25, 18, 18,178,159,227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,115,
+ 56,142,107,114,254, 44, 45, 45,245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,136,
+236, 4,144,226,243, 13,202, 45, 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92, 86,
+ 84, 84,212, 51,122,189,222, 8,128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117, 33,
+180, 4, 65, 96, 77, 38, 19,242,242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,181,
+138,116,114,151,157, 56, 6,155,213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,224,
+224, 96, 24,141, 70, 24,141, 70,152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76, 38,
+100,103,103,219,173, 86,171, 79,206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,155,
+124,114,114, 28,151, 80, 82, 82, 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208, 61,
+186,158,209, 97,218,210, 53, 81, 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,163,
+157,251, 59,117,234,228, 51,127, 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,173,
+ 4,131,193, 16,229,224,191, 76, 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173, 48,
+155,205, 48,153, 76,176, 90,173,176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183, 61,
+190,102,205, 26,213,207, 63,255,172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51, 67,
+179, 32, 5, 5,197,117, 35,180, 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,159,
+231,175,185, 42, 56, 42, 26, 19, 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20, 10,
+ 48,174,175,209, 94,160, 82,169,112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68, 97,
+ 24, 6,106,181, 26, 83,166, 76, 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183, 64,
+ 56,165, 82, 41,142, 30, 61, 10,142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240, 51,
+115,176,235, 61, 50,155,205,177, 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79, 0,
+128,162, 89,207, 59,239,221,158,103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,232,
+161,135,182, 7, 7, 7,175,215,106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115, 38,
+160,184, 27,141, 70, 44, 88,176, 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,195,
+ 48,248,236,179,207, 32,149, 74, 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,240,
+ 85,231,241, 0,110, 4, 16,233, 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21, 12,
+195,236,115,249,109, 6, 32,243,176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15, 1,
+216, 2, 96, 96,102,102,230, 86, 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205, 83,
+ 82,155,205,214, 65,108,170, 18,221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,177,
+ 88,240,192, 3, 15, 0,128,215,135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66, 87,
+207,192, 86,171,195, 61,106, 43, 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,152,
+ 55,111, 30, 30,122,232, 33, 72, 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,108,
+ 26,155,205, 22, 97,183,219, 35,154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50, 51,
+ 51,119,203,229,242,133,209,209,209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26, 52,
+ 40,160,112,154, 76, 38, 48, 12,131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,117,
+235, 52,226,177,173, 90,181, 2,207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181, 11,
+ 79, 90,196, 5,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,191,
+174, 22,127, 19, 66,122,185,138, 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,196,
+180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,215,
+158, 18,155,168, 78,157, 58,229,173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113, 62,
+192,230,246,104, 7,149, 74,133, 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,126,
+185, 11,138,170,100,120,119, 87, 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172, 36,
+176, 62,189,132, 16,143, 2, 75,252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5, 33,
+ 36,140, 97,152, 58,135,203, 21, 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,159,
+247, 33, 0, 96, 80,247,155,253,150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,155,
+ 21,129,132,213,147,208, 18, 93, 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130, 78,
+167, 51,175, 92,185, 18,115,231,206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80, 40,
+ 20,162,123, 77, 51, 32, 5,197,245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,249,
+121,254,175,118, 23, 79,226,117, 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,235,
+ 22,144,154,208,235,245,165,254,196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,113,
+227, 70, 40, 20, 10, 12, 31, 62,252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,146,
+ 95,128,131,101,229,120, 57, 99, 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116, 19,
+ 92,251,173,192, 71,211, 97, 68, 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,208,
+ 31, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,118,
+131,249,155, 11, 23, 46,236, 6, 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,168,
+208,178,217,108,141, 4,212,233,211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137, 65,
+104,104, 40, 4, 65,128, 32, 8, 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,134,
+ 97, 86, 59,156,165, 99, 62, 4,149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,225,
+240,212, 92,233,172, 85,221,166,221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12, 67,
+252,113, 89, 44, 22,103,197,255,204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,185,
+226,198,114, 60,206,197,116,132,228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225, 56,
+ 14,237,219,183, 71, 65, 65,129, 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,198,
+188,188,188, 23,105,209,189, 58,145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,223,
+220,112,195, 13,167,209,120, 10, 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,213,
+106,189, 76,240,124,252,241,199,141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,174,
+ 93,241,243,207, 63, 67, 16, 4, 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,248,
+210, 34,166, 25, 51,102, 28,155, 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,158,
+ 92, 50,119, 1,230,186, 47, 43, 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110, 46,
+156,119,115, 71,168,212, 42,168,130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,226,
+104,177, 50, 14, 43, 18, 46,129,200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,151,
+ 53, 21,142, 29, 59, 22, 12,195, 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149, 70,
+ 90, 98,175, 36,127,238,255, 18, 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248, 30,
+ 94,189, 34,206,170,170, 42,195, 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,128,
+202,164, 56,184,194, 93,100,185, 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,141,
+ 6,106,181,218, 57,226, 54, 40, 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,105,
+114,244,173,202,116,253,237,201,241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19, 21,
+164,235,103, 76, 76,204,175,106,181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21, 20,
+193,106,175,174,151, 47,161, 37, 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,177,
+ 65,190, 9, 18, 25,215, 72,100,113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38, 77,
+154,228,124,131,119, 21, 89, 77,137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,120,
+241,226,173,180,188,250, 80, 6,118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150, 82,
+169, 20, 71,155,250,191,199, 44,235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,234,
+100,137,104, 74, 57, 18,195,186,117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,167,
+ 66,161, 80, 64, 38,147,209,204, 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,138,
+223, 25,134,177,122,224, 53,187, 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,151,
+ 39,231,229,229, 57, 39,194,244,245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74, 77,
+ 48, 20,106,181,187,224, 96,252, 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,192,
+125,180, 68, 78,216, 25, 20,147,179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,133,
+ 26,156,221, 22,240,168,195,234,234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,141,
+187, 39, 39,107,242,249,106, 39,143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251, 17,
+ 69,130, 45, 32, 81, 21,104,254,116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,124,
+245,213, 87,122, 0,178,229,203,151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175, 99,
+124, 32,121, 94, 12, 43,195, 48,176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,251,
+ 2,174,199, 9,233,229, 34,170,246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,179,
+117,207,155,241,222,133, 90, 48, 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228, 42,
+ 53,226,250, 13, 13,168, 34, 23,155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62, 62,
+ 30, 23, 47, 94,196,242,229,203, 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,195,
+ 78,163, 18,253,141,199, 33,219,240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217, 96,
+181, 90, 97,177, 88,240,193, 7, 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,128,
+ 74, 90, 92,125, 35,182,247,243,136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142, 73,
+ 67,155,196, 89, 85, 85,101,184,125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,178,
+ 44, 36, 18,201,101,205,133,222,196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27, 27,
+235,116,178,222,123,239, 61, 40, 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,224,
+177, 38, 53, 26,141,133, 93,187,118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,158,
+ 42,117,134, 97, 16,172, 9, 70,144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113, 21,
+ 90,226, 86, 91, 91, 11,158,231, 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,179,
+ 33, 11,218,137,118, 67, 31, 66, 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,155,
+214,193, 27,226,227,227,253,198,221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0, 3,
+128, 10,131,193,112, 62,144,244,108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117, 65,
+ 65,129,232,100,133, 40,149, 74,124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,179,
+ 60,246,201,242, 36,186,154, 82,142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,187,
+221,238, 28,109, 40,206, 62,239,227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,182,
+109,219,230,229,229,229,181, 23,151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,193,
+173,239,100,129, 97, 1, 22,141, 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,171,
+175,175,135,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,130,
+ 26, 53,253,248,113,172,152, 64, 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196, 1,
+ 11, 0,144,218,103, 56, 4,193, 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,101,
+101,165, 97,212,168, 81, 91, 1,252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46, 93,
+ 10,185,112,225,130, 96, 52, 26,219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,123,
+ 32,249, 83,108, 46,247, 52, 35,188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169, 84,
+ 2, 0, 62,253,244, 83,231,228,171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19, 19,
+155,116, 49,187,221, 94,230, 71,184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,201,
+221,240,182,192,180, 63, 78,187,221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,143,
+ 23,121, 93, 59,145,194,111, 94,243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,118,
+ 68,244,234,213, 43,194,245,152, 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,201,
+ 67,254, 44,246,151,231,247,238,221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,171,
+213, 90, 65,115, 33, 5, 5,197,117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29, 1,
+171,213,218,231,159,192, 89, 89, 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,252,
+ 38, 0,208,233,116,240,183,172, 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10, 42,
+180,154, 0,186, 24,241,223, 3, 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,150,
+ 1,131,134,145, 3,158,208,148,209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,211,
+209,140, 45, 44,192, 40, 39,229,164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20, 20,
+ 45, 4,142, 38,193, 95, 6, 9,154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,155,
+ 56,209,145, 21,128, 5,128,133, 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90, 31,
+ 98,152, 59,204, 0,160,138,238,212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7, 5,
+197, 95,130,187, 0, 76, 65, 67,183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30, 17,
+142,181,204,138, 47, 93,186,212,179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44, 7,
+ 96,187,194, 56,105, 0, 60, 0,224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246, 6,
+128,136,136,136,221, 86,171,149,209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,152,
+219, 76,247, 82,206,178,172, 71,129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184, 11,
+ 0, 36, 36, 36, 28, 29, 61,122,244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,172,
+252,196, 3, 0, 16, 19,219,101,153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,173,
+177,105,231,193, 27,199,189,248,102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,118,
+123,113,117,117,117, 79,111,156, 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,113,
+201,129,114,137,159, 54,155,173,216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240, 22,
+206,203,226,222, 28,225,188, 18, 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,137,
+ 68,130,240,240,240, 55,205,102,243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,202,
+234,235,235,137, 8, 65, 16,136,213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150, 84,
+ 85, 85,145,200,200, 72,247,201, 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,133,
+133,133,228,163,143, 62, 50,105, 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,163,
+209, 72,116, 58, 29, 89,182,108, 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,181,
+111,220,184,209, 18, 18, 18,146, 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0, 24,
+ 57,126,252,248,178,194,194, 66, 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195, 36,
+151,151,109,132,144, 88,199, 49, 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,157,
+149,159,159,223,154, 16,162,242,197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,212,
+184, 71,151,198,182,237,190, 32, 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,236,
+ 47, 34, 18,211,159,106, 66,122, 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38, 19,
+209,235,245,164,190,190,158,212,213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,213,
+ 29,102,179,217, 89,127,232,245,122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20, 4,
+129,216,108, 54, 98,177, 88,156,188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72, 18,
+ 18, 18, 74,188,113,134,135,135,151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74, 79,
+ 7,230,230,230,230, 18,131,193, 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129, 3,
+ 45,149,149,149,228, 95,255,250, 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,151,
+227,112,253,222,166, 77,155, 64,175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,231,
+158,123, 78,118,215, 93,119,181, 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,250,
+193, 7, 31, 68, 68, 68,163, 73,183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,235,
+235,235,199, 1,248,209, 23,169, 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,219,
+119,232,208, 65,145,144,144,192, 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,184,
+203, 34, 34, 34,222,124,250,233,167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,124,
+ 11,224,203, 43,113,178, 8, 33, 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,147,
+201,212,253,153,103,158, 57, 63,125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,206,
+157, 7,239,218,181,235, 62, 66,136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,156,
+150,124,110,223,241, 34,129, 83,104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13, 3,
+106, 47, 28,207,129,143, 25,210, 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,208,
+ 80,191,171, 27, 4, 5, 5, 97,227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,216,
+177, 3, 44,203,122, 92, 26,200,125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,127,
+239,133, 82, 46,199,246,237,219,189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223, 42,
+149, 10,140, 31,210,176,176,176,222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,159,
+ 62,157,185,225,134, 27,248,210,210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224, 70,
+ 0,145,104,232,118, 83, 7, 32, 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,129,
+ 80,225,186,248, 52, 33,164,151,131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241, 97,
+ 54, 48, 51, 51,115,171,107,228, 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200, 63,
+226, 96, 50,153, 80, 87, 87,135,250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,142,
+ 68,243,198, 57,235,226,197,139,209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,152,
+ 65,131, 6,205,114, 19, 90,151, 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,124,
+107, 65, 16, 80, 84, 84,132,211,167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,229,
+151, 95,238, 24, 22, 22,198,126,244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,255,
+ 77,118,236,216,177,216,113,227,188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,137,
+ 97,152, 26, 15,156, 12,128,144,161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66, 66,
+ 66, 84,179,102,205,138,206,204,204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78, 78,
+ 65,192,225,152,216, 46,203,114,118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126, 5,
+234, 12, 54,220,123,107,195, 2,230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,199,
+215,248, 72,207,171, 5,229,132,179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,111,
+189, 21, 60,207,227,137, 39,158, 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,112,
+ 28, 7,150,101,189, 46,164,237,206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12, 39,
+199,113,232,211,167, 15, 14, 29, 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56, 0,
+ 84, 85, 85, 57, 23,188,151, 72, 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,125,
+105, 17, 0,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,226,
+196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121, 28,
+101,174,209,177,158,126,187,127,122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,
+126,250,244,233,209,190, 68, 86,125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,125,
+208, 74, 37, 18, 9,246,238,221,139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154, 26,
+244,232,209, 3,104,232,220,237, 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,199,
+247,223,127,143, 54,109,218, 64,169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,221,
+ 86, 93, 93,189,249,220,185,115,239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108, 7,
+240,252, 91,111,189,245,248,176, 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,219,
+ 77, 6,131,193,108, 50,153,172, 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75, 47,
+189, 84,224, 16, 89,167,208,208, 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,159,
+ 27, 59,118,236,242,111,190,249,166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,174,
+122,190,117, 81,209,133,246, 17,173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4, 39,
+138,106,209,255,246, 81,252,153,188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,187,
+192,243, 60, 20, 10, 5,102,207,158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,190,
+253,223,255,253, 31, 94,122,233,165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,183,
+219,237,224,121, 30, 11, 22, 44, 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15, 44,
+ 22,139, 51,204,167, 78,157,242,200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,127,
+255,253, 38,139,197,146, 7, 0,119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,144,
+167,104, 97,120,210, 34,226, 51, 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,139,
+174,147,155,136, 75,115,117,164, 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,254,
+ 68,150,143, 55,199, 70, 8, 9, 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,103,
+ 79,105, 72, 72,200,240,170,170,170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172, 95,
+191, 30,181,181,181,224,121, 30, 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226, 27,
+221,146, 37, 75, 64, 8, 65,100,100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,185,
+231,158,190, 83,166, 76,225,125, 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,198,
+141,139, 40, 44, 44, 52, 63,249,228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,160,
+190,190, 30,173, 90,181, 74,116,117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,212,
+215,215, 67,167,211, 89,107,107,107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,202,
+ 8,145,188, 53,127,254,124,245,176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195, 13,
+154,132,174,101, 59, 14,231,227, 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21, 57,
+ 57, 57,184,253,246,219,157,101, 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221, 39,
+127,112, 21, 69,238,226,200,147, 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,195,
+184,113,227,192,243, 60, 94,127,253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,223,
+189,123, 55,186,119,239,238, 12, 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,102,
+ 93, 93, 93, 55,181, 90,141,220,220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0, 32,
+ 0, 73, 68, 65, 84,215,235,219, 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104, 49,
+184,107, 17, 23, 24, 38, 76,152,240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,155,
+136,171, 96, 24,102, 31, 33,228, 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,131,
+209,104,188, 49, 42, 42,202,171,200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,124,
+249,229,151,144, 74,165,144, 74,255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,250,
+169, 98,192,128, 1,145,195,134, 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215, 95,
+127,173,236,208,161, 67,171, 61,123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216, 39,
+151,203,215, 78,155, 54, 45,204,108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,236,
+236,111, 5, 65,152,221,212,140,234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,224,
+140, 51,135, 27, 12,141,196,176,217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,251,
+207,133,134,134,226,145,135, 31,102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,237,
+ 86,100,111, 88, 47, 16,193,186,129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,255,
+254,247,191, 1, 9, 3, 81, 84,121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151, 95,
+126,185, 81,115,162, 43,127, 64,118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155, 59,
+119,110, 64,142,214,157,119,222,233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,214,
+172, 89,227, 20,169, 34,222,126,251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221, 59,
+133,101,217,195,165,165,165,133, 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,238,
+206,146, 47,231, 73, 20, 88, 14, 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,226,
+169,242, 13,164,249, 48, 64, 59,157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,215,
+151,167, 55, 89,127, 66,235,232,209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187, 34,
+ 57,142,131, 70,163,129, 70,163,193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126, 47,
+ 45, 45,125,219,171,130,225,249,161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,205,
+ 76,155, 54,205,120,246,236,217,217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,249,
+ 0,140,129,198, 89,167,211, 53, 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222, 27,
+135,155, 37,222, 31,194,113,156, 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,104,
+ 52, 26, 76,122,251,109,233,123,227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,105,
+205,243, 39, 64, 20, 6,119,223,125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,114,
+ 37, 10,131,187,238,186,203,233, 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207, 62,
+251, 12,175,188,242, 10, 88,150,197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21, 45,
+170,230, 69, 3, 0,130, 53, 26, 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115, 58,
+ 89,195,135, 15,119, 77, 71, 18, 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,130,
+ 57, 61, 52, 52,116, 74,167, 78,157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,234,
+ 84,165,135,115, 20, 0,186,117,238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,143,
+ 23, 57,220,197,145,195, 33,203,241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149, 71,
+202,203,203, 51, 20, 10, 69, 35,145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29, 2,
+ 48,158, 62,125,122,188,203,239, 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,220,
+139,101,101,101,255, 2,176,177,178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,238,
+ 57,198,106,181, 98,222,188,121, 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,252,
+ 22,160,200,178, 11,130,112,153,192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,114,
+121,176, 86,171, 53,185, 10, 44,145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,193,
+131, 57,247,123, 80, 86, 86,134,210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245, 39,
+ 57, 90, 68, 44,235,226, 40, 65, 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118, 88,
+119,107, 58,244,107,141,139,199,127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19, 38,
+ 76, 0,199,113,126,155, 14, 93, 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,220,
+188, 64, 90, 2, 92, 57,197,243,130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,191,
+127, 63,102,206,156, 41, 53,153, 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,112,
+235, 95,197,184, 54,227,249,248,116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,188,
+ 58, 90,254, 42, 11,127,130, 43, 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58, 58,
+ 26,199,142, 29,179,233,245,250,223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,195,
+104, 52,162,166,166, 70, 2, 96, 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192, 1,
+ 84, 87, 87,255, 8, 96,216,148, 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67, 16,
+ 4,179,205,102, 75,102, 89,214, 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,214,
+109,239,249,243,231, 49,117,234,212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,149,
+124,222,188,121, 10, 0,232,214,173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105, 41,
+202,202,202, 80, 87, 87,135,148,148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,187,
+ 10,152,187,239,190,219,217,183, 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4, 5,
+ 5, 97,214,172, 89,141,154, 14,221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,162,
+243, 32, 56, 2, 10,231,244,233,211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,184,
+233, 48, 45, 45,109,201,234,213,171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,229,
+ 65,180,228, 80,252,201,245,212,190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,241,
+185, 33, 67,134,132, 7, 7, 7,163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211, 44,
+127,226,192,106,181, 34, 42, 42, 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30, 24,
+ 22,139, 5, 86,171, 21, 86,171, 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65, 65,
+ 40, 40, 40, 0, 26, 70,246, 13,185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,114,
+146, 1, 64,161, 80,228, 2, 64,113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,150,
+ 74,165, 4,222, 71, 53, 26, 87,174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,202,
+ 13, 6,131,193,104, 52, 18,137, 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,220,
+155,243,166, 82,169,138,245,122,125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,162,
+229, 32,190, 84,185, 59, 47,238,251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152, 51,
+103,206,101,142,214,180,105,211, 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,196,
+240, 53,173,204,131,227, 56, 76,157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120, 56,
+ 30,121,228, 17, 12, 29, 58,212,217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14, 13,
+ 13, 13,254,207,127,254,195,213,212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,104,
+ 60,215, 70,173, 94,175,127,228,182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134, 84,
+ 42, 69,108,108, 44,106,106,106,240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,160,
+244,244,116, 84, 87, 87,163,190,190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,252,
+112,122, 82,115,176, 88, 44, 78,193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63, 31,
+ 0, 10, 83, 82, 82,166,180,109,219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,155,
+205, 82, 0,168,173,173,181,180,106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,253,
+250,245, 51, 3, 40,117, 91,163,208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,143,
+ 62,249,228,147,108,124,124,124, 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,249,
+243,167, 0,208, 50, 12, 35,120,226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,172,
+172, 12,157, 58,117,194,174, 93,187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50, 21,
+ 40,167,171, 40, 26, 53,106, 84, 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,188,
+209, 72,180, 77,154, 52,201,107,117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,210,
+164, 73, 1, 59, 90,184,188,143,214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,152,
+ 51,103, 14,209,104, 52, 55,107,181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142, 40,
+ 39, 90,102,126,174,235, 71,104, 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,238,
+187,229,150, 91,190,125,225,133, 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,106,
+245,122,253,163, 0, 2, 25,117,182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,181,
+181,181, 8, 11, 11, 67, 84, 84, 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183, 88,
+ 44,120,232,161,135, 32, 8, 2,102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,159,
+ 62, 13, 0,231,146,147,147,131, 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,229,
+ 40, 58, 89,162, 11,230, 47,220, 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,126,
+217,113, 26,141,102,233,204,153, 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28, 57,
+ 18, 28, 20, 20, 4,157, 78,135,170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,248,
+215,192, 85, 24,120,115,181, 2, 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165, 72,
+156,150,198,211,148, 17, 77,172,215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,188,
+193, 38, 87, 42, 33, 8, 2,238,188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,228,
+174,105,208, 68, 23,159,130,130,194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,245,
+ 58,157, 46,101,230,204,153, 47,170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208, 21,
+ 0,158,223,189,123,247,236, 97,195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43, 28,
+ 46,214,217, 43, 73,164,240,240,240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,171,
+171, 3,165, 40,223,180,105,211, 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,215,
+174, 37, 0,142,109,222,188,121, 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,139,
+147,229,139, 83, 75, 8,177, 60,254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,210,
+171, 87,175,189,203,150, 45, 59,229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,227,
+218,183,111,143,194,194, 66, 28, 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32, 52,
+ 52,180,209, 75,148, 56,228,191,169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155, 6,
+210,101, 65, 16,124,207,199, 70, 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,213,
+106,117,242, 6, 48,242,179,169,106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61, 91,
+248,218, 90,147,201,244,158,201,100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,132,
+169,240,191, 94,162, 79,156, 60,121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20, 14,
+187,221,254,248,174, 93,187,158,131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,227,
+252,221,196, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100, 89,
+ 29,155,209,173,185,208, 23, 54,235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,211,
+235,245,111,161, 97,141, 42,138,191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,135,
+ 14, 29,252,190,156,121,224,188,224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,244,
+ 23,247,228,228,100,143,113,247, 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104, 52,
+242, 38,147,137,183,217,108,141,236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209, 92,
+ 48, 29, 57,114,228, 49,167, 61, 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,149,
+245,245,245, 79,138, 63,196, 62, 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,184,
+247,188, 94, 57,125,161,164,164,228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25, 48,
+104, 24, 57,224, 9, 77, 25, 77, 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,205,
+216,194, 2,140,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,133,
+ 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181, 30,
+233,221,187,119,149, 92, 46,223, 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39, 79,
+118,202,206,206,142,139,143,143,255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174, 80,
+108,165,182,105,211,230, 68,106,106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116, 1,
+208,149, 10, 45, 10, 10, 10,138, 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,115,
+ 47,237,220,185, 19, 9, 9, 9, 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,236,
+236,248,168,168,168, 79,154, 51,124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,191,
+ 51,228, 0, 30, 99, 24,102,111,151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,189,
+117,245,234,213, 91,105, 30,161,160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,183,
+ 0,248, 13,192, 74, 15,219,155, 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,252,
+248,113,146,154,154,106, 8, 80,208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,156,
+156, 28,114,246,236, 89,178, 97,195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,124,
+245,213, 87,100,213,170, 85,228,199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,132,
+113, 68,140, 0, 24, 8, 0,153,153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221, 26,
+ 60,207,123, 60,176,188,188, 28, 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,230,
+205,169,193,193,193,206,157,130, 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32, 60,
+ 60,252, 40,124, 55, 97, 56,221, 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70, 69,
+ 69,229, 44, 90,180, 40, 50, 37, 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,238,
+187,239,190,105,209,209,209,108,151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,200,
+201,201,193,230,205,155, 77,151, 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,130,
+130,162,153,112,164,182,182,182,139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,168,
+188,166,123,247,238,123,114,114,114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,222,
+222,196,187,116,233,178,127,215,174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,209,
+176,142,234, 57, 15,255, 37, 2,120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163, 70,
+141,170,206,205,205,237, 5,160,128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,222,
+ 41,180, 36, 18, 9, 8, 33,176,217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,161,
+ 69, 65, 65,209, 18, 72,237,208,161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,187,
+120,137,142,142, 78, 91,184,112, 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,205,
+ 98,177,224,208,161, 67, 24, 51,102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173, 86,
+139,145, 35, 71,234, 79,157, 58,213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,149,
+250,140,156,193, 96, 64, 82, 82,210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22, 11,
+138,139,139, 33,147,201, 96, 50,153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,135,
+238,221,187,163,115,231,206,168,175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,231,
+215,170, 22, 17, 59,166, 77, 17,219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,173,
+ 88,177,162,213,240,225,195,209,174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,162,
+162,162,100,199,174, 94, 94, 56,123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,201,
+100,216,183,111, 31,198,142, 29, 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,249,
+243, 16, 4,193,228,233, 63,150,101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,205,
+102, 51,122,246,236,137,130,130, 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,232,
+223,191,191, 59,207, 53,169, 69,156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,209,
+162, 69,145,177,177,177, 24, 52,104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,207,
+149, 28,147,152,152, 88,177,111,223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,109,
+216,176, 33,156,101, 89, 28, 59,118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161, 67,
+135,190,251,247,239,151, 50, 12,131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231, 66,
+122,247,238,141,226,226, 98, 92,184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15, 30,
+132, 92, 46, 71, 66, 66, 2,212, 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62, 62,
+190, 28,158,231,165, 10, 27, 57,114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71, 71,
+231, 3, 8,243,112,204,216,152,152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,221,
+186,117, 36, 34, 34,162, 37, 70, 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71, 30,
+ 82,252,243, 17, 12, 96,106, 74, 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39, 25,
+ 25, 25, 36, 35, 35,131,140, 26, 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,154,
+ 23,137, 0,102, 57, 4,213,202,145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,150,
+150,146,210,210, 82,113,106,132,124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,237,
+218,181,196, 33,216,154, 13, 10,133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,110,
+184,193, 58,123,246,108,178,114,229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210, 4,
+ 32, 11, 64, 8, 77,174,171, 7, 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,176,
+ 97, 3,137,137,137, 57,134,198,243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,158,
+ 60, 73, 0,108,109,134,112,166,198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202, 43,
+ 42, 42,200,166, 77,155, 72,100,100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,211,
+ 79, 63, 77, 18, 19, 19,237,142,151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,185,
+227,247,223,127,119,157, 71,203,219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150, 45,
+ 0, 96,106,134,176,229, 94,184,112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43, 93,
+187,118,157, 94, 87, 87,167,213,235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0, 8,
+128,247, 1,156,184,222, 18,130, 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226, 82,
+ 65, 65, 65,159, 59,239,188,243, 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,151,
+208, 44, 64,113, 29,225, 24,128, 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,130,
+130,130,226,111, 7,186,168, 52, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,114,
+ 32,187, 9, 60, 87, 50,162, 33,155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,156,
+148,147,114, 82, 78,202,249,207,230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,240,
+226,141, 16,208, 48,228,147,226,239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,137,
+171, 40, 16,174,242,185,212, 18,113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35, 38,
+147,105, 62,128, 93, 87,121,205,175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,182,
+182, 86,115, 37,164,145, 93, 70,188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,120,
+120,120,104, 69, 69, 5, 97,217,134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195, 67,
+197,243, 25,134, 65, 85, 85, 85, 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,189,
+ 94, 95, 85, 85, 85,117, 11,189, 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141, 81,
+252,190,254,194, 87,103, 2, 57,127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134, 33,
+ 12,195,128, 97, 26,222,179,220, 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,245,
+ 14, 62,143,188, 0, 96,181, 90,139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,127,
+132, 16,215,135,249,217,202,202,202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142, 30,
+163,211,233, 2,226,244, 17,247,203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3, 0,
+140, 70, 99,215,185,115,231, 62,246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,178,
+189,122,245, 2,195, 48,176,219,237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,242,
+133,114, 96,154,191,253,190, 4, 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,228,
+ 95,186,116,169,143, 15, 1,211,236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,216,
+237,118, 88,173, 86,220,112,195, 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143, 61,
+134,190,125,251,230,149,151,151, 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118, 27,
+170,170,170,254,209,133,235,230,244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,229,
+114,121,180, 95,181,236,242, 32, 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,108,
+ 54, 91, 52, 0, 72,165,210, 50,137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,233,
+ 71,214,153,132,225,202,182, 89,169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13, 11,
+ 74, 63,141,134,121,128,174, 6,241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,185,
+ 68, 16, 4, 83, 85, 85,213, 19,240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15, 40,
+150,101, 63,205,204,204,252,215,138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,217,
+159,171,193,177, 44, 59,123,228,200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139, 11,
+ 52,239,127, 53,116,232,208,209,139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,110,
+ 17,252, 71,157,253,244,158,123,238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136, 17,
+ 15,127,247,221,119,202, 35, 71,142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,120,
+217,178,101,202,131, 7, 15, 42, 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,183,
+130,101, 89,132,135,135, 99,236,216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71, 71,
+ 32,159, 7,198,149,155, 33,149, 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193, 96,
+133,177,100,191, 82,161, 80, 56, 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,251,
+246,237,191, 61,118,236, 88, 39, 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,119,
+ 46, 74, 38,147,129, 16,226, 44,196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130, 32,
+186, 81,102,179, 25,245,245,245,254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42, 21,
+ 20, 10,133,147, 51, 80, 72, 36, 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,120,
+ 56,214,173, 91, 7,141, 70,131,196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,238,
+206,125,238,120, 84,130,101, 1, 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,208,
+ 52,178,217,108,136,139,139,147,248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224, 56,
+ 78, 20,232,137,132,144, 68, 65, 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183, 58,
+147, 48,124,219, 33,220, 52,114,200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,161,
+ 61,123,246, 4, 89, 44, 22,244,238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125, 86,
+ 18, 26, 26, 10,153, 76,134,186,186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,119,
+239, 94, 12, 26, 52,232, 69, 0, 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,220,
+143, 38, 16,236, 66,241,222,195, 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251, 16,
+ 30, 30, 14,165, 82, 9,169, 84, 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44, 94,
+188, 24, 35, 70,140, 64, 68, 68, 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23, 45,
+ 90, 4, 0,120,235,165,151,112,199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,124,
+223,125,247, 61,240,253,247,223, 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,129,
+ 66,161, 8, 40,238,247,221,119,223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74, 27,
+109,238,162,211, 19,231,189,247,222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,213,
+148,123,244, 55,231,188, 62,132,214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,142,
+ 7, 31,124, 16,155, 54,109,122,170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7, 38,
+237,127,234,169,152,172, 51,245,216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,223,
+ 70,152,173,175,140,139,185,113,246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,130,
+201,151,187, 32,149, 74,113,244,232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,169,
+ 83, 16,151, 42, 9,128,147, 9, 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10, 72,
+ 24,179, 44,139,111,191,253, 22, 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,194,
+194,194, 16, 22, 22,214, 72, 32,254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,187,
+112, 6,147,223,253, 40,224,167, 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73, 42,
+149, 78,249,249,231,159,101,223,126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,183,
+132,132, 4,230,127, 61,184,254,121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,156,
+132, 40,219,102,165,142, 28,242, 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,119,
+238,220, 25,164,215,235, 33, 8, 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,220,
+121, 75,100,100, 36,106,107,107,161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31, 51,
+102,140, 81,161, 80,136,206, 70,146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,244,
+202,228,128,194,216,186,117,235,167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30, 95,
+178,100,137,147,179, 85,171, 86,224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,207,
+230,249, 13,103,100,100,228,252, 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,130,
+ 27,210, 73, 96,240,251,169, 2,191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,248,
+102,179, 25, 61,123,246, 12, 40,238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112, 54,
+226,224,121, 30,203,215, 45,242,234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,124,
+124, 60,230,204,153,227,183, 94,114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,209,
+ 98, 21,137,134,126, 99,117, 0, 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41, 30,
+152,153,153,185,213,241,189, 70, 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66, 66,
+142,121,112,117, 14,153, 76,166, 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,244,
+ 73, 51, 48, 44, 51, 19,235,227,101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203, 80,
+146, 32,142, 67,239,237,107, 48,126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,136,
+ 62, 26, 57,100, 38, 29, 88,150,245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,194,
+ 9, 66, 8,186,117,235, 6,134, 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,223,
+126,251,205,121,204,224,193,131, 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17, 17,
+ 17, 1,165, 82,201, 44, 90,180,104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173, 54,
+194, 27,167, 68, 34,193,179,207, 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,167,
+216,242, 80, 0, 91, 98,184,111,203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,198,
+221, 29, 46,230,151,196, 19,144,134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227, 96,
+ 52, 26,241,243,207, 63,227,228,201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102, 12,
+146,146,146,252,198,157, 16,178,176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,217,
+192,113, 28,130,130,130,160, 80, 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,124,
+194, 77, 35,223, 32, 88,241, 1,131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23, 42,
+ 95,157,248,201,243,127,250, 61,186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,202,
+ 41, 41, 41,233,239, 67,108, 93,198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,118,
+ 41, 46, 46, 46,100,224,192,129,236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,219,
+ 33, 8, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,169,
+ 84, 34, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,160,
+ 84, 42, 33,147,201,192,113, 28, 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202, 71,
+ 23, 46, 92,216,200, 2,137, 14, 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,117,
+117,198, 61,123,246,168,247,239,223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,224,
+219,111,191, 69, 70, 70,134,223,184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,141,
+231,121, 72, 36, 18,164,164,164,160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,130,
+211,113, 19,197,209, 7,159,191,219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52, 80,
+169, 84, 78,110, 95,156, 94,180,136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,156,
+216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225, 58,
+222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83, 83,
+131,224,224, 96,205,204,153, 51, 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86, 96,
+ 89, 22,125,250,244,193, 49, 71,107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,137,
+110, 6, 33, 4, 6,131, 1,177,177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,172,
+132, 65,119, 82,133, 95, 7,245, 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104, 57,
+226,197, 92, 41,167,232,104,236,220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,153,
+239,190,251,238,237,228,228,228,216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243, 27,
+151,173, 91,183,226,139, 47,190,192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,208,
+215, 27,156, 77,186,118,187, 29, 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,190,
+ 44,117, 64, 24,191,103,235, 37,235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,243,
+206, 59,248,247,191,255,125,153,171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,116,
+180,148, 74, 37, 24,134,129,209,104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115, 37,
+163,248, 93, 41,215,175,109,155,192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24, 8,
+ 1, 17, 0,129, 0, 38,147, 14,207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69, 69,
+ 56,113,226, 4, 58,116,232,128, 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,111,
+252,180,190,190,190,186,190,190,254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147, 37,
+110,125,116, 36,222,236, 81,171,213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,187,
+192,243, 60,148, 74, 37,212,106,117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,180,
+ 17,167,152, 15,135, 15, 31,142, 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,230,
+205,138, 87,159,122, 10, 55,182,111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18, 9,
+186,116,233,130,178,178, 50, 20, 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96, 50,
+153, 2,142,123,251,246,237,113,235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,149,
+ 43,145,154,154,234,151,179, 83,167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,111,
+ 18,231,134,189,231,241,229,198,205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193, 2,
+212,212,212, 56,141, 3,241,165, 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,156,
+152,185,228, 89, 89, 89,211,221,207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,195,
+107,107,107,113,250,244,105,176, 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203, 33,
+145, 72, 96, 54,155, 1,160,187,183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,254,
+135, 31,126,128, 90,173, 70,112,112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,192,
+178, 4, 44,195,128,221,149, 3,134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,101,
+203, 22, 4,202,217,174, 93, 59,168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16, 16,
+ 21, 21, 5,158,231,153, 69,139, 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148, 0,
+ 82, 34, 77,225,194,165,151, 0, 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32, 72,
+151, 46, 69,164,131, 5, 20, 36,129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,158,
+121,118,167,189,115,206,156, 51,103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33, 1,
+245,235,215,119,219,103,171,168,168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53, 26,
+ 77,126,159, 62,125,202,248,109,228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,142,
+234,227, 15, 63, 16, 45,155,250, 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,202,
+248,117, 58, 29, 76, 38, 19, 34, 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25, 25,
+157,162,163,163,127, 93,177, 98, 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49, 24,
+ 12,255,182,153,206, 93,226, 68,198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,107,
+140,119, 76, 12,151, 0,142, 1, 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,215,
+174, 97,204,152, 49,150,188,188, 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87, 95,
+221,163,215,235, 95,116,147,250,219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,227,
+242,193,100, 1,138,162, 96, 52,154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,181,
+125, 49, 88,199,113, 28, 72,130, 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252, 32,
+ 18,137,240,237,183,223,226,198,165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,114,
+ 75, 16,250,251,251, 99, 64,199,142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,131,
+ 8,176,246,116, 6, 5, 5,225,183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,187,
+ 17, 21, 21, 85,237,188,219, 45,120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,247,
+191,255,141,156,156, 28,183, 56, 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,130,
+ 0,129,171, 59, 62, 40, 35, 10,215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130, 32,
+174,217,141,173, 51,103,206,156, 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176, 1,
+ 14,219,174, 85, 75,104, 41, 20,138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,242,
+164,185,185,185, 48, 24, 12,186,249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,224,
+128,107,159, 13, 18, 44,203,150, 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,120,
+245,251,195,184,126,253, 58, 28,195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193, 93,
+223, 47, 87, 51,115, 42, 66, 70, 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177, 88,
+ 76,136,197,226, 48,187,200, 18, 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,220,
+175, 86,171, 59,169,213,106, 60,143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189, 51,
+ 13,147,251, 70,245,172,238, 48,181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237, 11,
+165, 82,137,153, 51,103, 98,248,240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,176,
+ 88, 44,176, 90,173,176, 88, 44, 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243, 31,
+102,246, 30,249,170,241,118,206, 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,185,
+244,139, 15, 78,177,224, 64,146,132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,159,
+159, 8,160, 23, 0,228,231,231, 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244, 4,
+ 48, 25, 64, 31,148,248,129,216, 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,102,
+209, 50,153,160,206, 47,196,132,119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152, 38,
+173,170, 67,224,234, 69, 88, 13, 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224, 40,
+ 35, 96, 53, 0, 86, 29, 88,139, 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129, 0,
+ 34,145, 16, 44, 5, 16, 12, 81, 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12, 25,
+ 50, 4, 22,139, 5, 38,147, 9, 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,240,
+ 1, 94,126,249,101,204,155, 55, 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,140,
+236,247,211, 46,182, 28,135,248, 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,171,
+213,229, 44, 89,246,255,161,161,161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,157,
+ 50,199,197,197,221,138,139,139,139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,118,
+119,220,105,191,209,190,190,190,130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,238,
+187,239, 26,233,116, 58,220,190,125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,112,
+ 32, 26, 52,104, 80,198,154, 37,151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197, 98,
+132,133,133,201,179,179,179,141, 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,175,
+227,255, 67,135, 14, 85, 57,116,104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,191,
+191, 91,156,118, 81,107,115,128,135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178, 82,
+107, 38, 15, 87, 13, 2, 11, 11, 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5, 5,
+ 5, 56,113,226, 4,126,248,225, 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,160,
+142,175,175, 47,172, 86, 43, 30, 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,163,
+197,103, 95,108,173,176,234, 1, 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181, 69,
+ 6,131, 97, 56,128,101,142,253,169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,166,
+206,170, 87,175, 94,153,141,102,179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39, 1,
+172,171,168, 46,217,135, 14,117, 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43, 90,
+170,152, 25, 87, 46,169,246, 99,237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,119,
+253, 24,132,202,118,143, 38, 31,118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128, 93,
+ 63,253,132,145, 61,122, 64, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,238,
+149, 9, 67,193,113,156,187,249, 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156, 59,
+119, 14, 51,102,204,192,248,241,227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103, 78,
+231,247,126, 77,202,221,206,185, 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,231,
+117, 0, 62,246,109, 51,103,206,156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20, 92,
+189,122,245,106, 11, 15, 15, 15,220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,182,
+108, 89, 24,203,178,200,201,201,193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7, 15,
+ 30,116,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88,
+ 49,137,191,102, 42, 84,101,125,170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90, 97,
+ 67,114,238,220, 57,176,182,134,214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34, 75,
+ 42,149, 86,249,224, 84, 21,144, 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,161,
+ 67,112,160,173, 52,140, 70, 19,116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,137,
+172, 26,154,231,211, 11, 10, 10,186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,164,
+ 87, 75,108,178, 28, 40,171, 21, 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251, 52,
+ 77, 71,219,227,190,185,129,127,213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,198,
+ 95,209,179, 43,234,197,151, 88, 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68, 16,
+ 68,169,211,247,212,169, 83,113,243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,172,
+218,220,187, 29, 92, 32,150,237,222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,252,
+ 59, 10,152, 21, 43, 86, 96,198,140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27, 55,
+ 96, 54,155,221, 78,167,163,223, 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251, 79,
+255,142, 97, 81,109,107,196,249,217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,101,
+ 95,183, 56,137, 30,231,117,231,227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254, 89,
+101, 44, 90, 78, 88, 52,120,240,224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,254,
+254,254,161, 42,149, 10,249,249,249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,171,
+221,178, 5, 0,227,199,143, 47,103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,207,
+ 63,255,100,250,246,237,139,161, 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67, 0,
+ 95,186, 33,182,106,205, 49,222, 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119, 56,
+237, 67,135,142, 15, 32, 73,146, 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,211,
+200, 62,241, 34, 47, 47, 15, 61,123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,127,
+ 30, 54,110,220,136,196,196, 68,152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215, 15,
+ 87,175, 94,133, 84, 42,165, 80,131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,194,
+ 98,177, 96,222,188,121,204,175,191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,123,
+ 0,182, 86,246,242,166,104,155,104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,161,
+119, 29, 13,134,190, 20, 0,125,214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13, 70,
+171,102,229,195,131,117,238, 85,210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159, 57,
+251,253,107,211,166, 13,154, 52,105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121, 19,
+133,133,133,213, 46,163,239, 79,238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154, 14,
+248, 12, 0, 80, 39,192,187, 90, 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147, 68,
+ 69, 66,235,129, 90,173,238, 48,114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236, 40,
+148, 72, 36,184,124,249, 50,246,239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,149,
+130,197,139, 23, 19,155, 55,111,174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99, 18,
+ 19, 19, 33, 22,139, 49,104,208, 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181, 26,
+247,202,238, 24,239, 9, 55, 29,224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252, 78,
+146, 36,172, 86, 43,218,182,109,139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177, 88,
+208,181,107, 87, 16, 4,129, 53,107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,101,
+ 98, 99, 99,203,136, 41, 87,145,151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24, 24,
+ 24,216, 33, 55, 55,247,160,211,230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,192,
+129, 94,135, 14, 29, 74,184,123,247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,207,
+ 51, 50, 50, 42, 17, 90,182,251,104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144, 34,
+ 12,105,237,141,248, 35,151, 48,186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,107,
+253,200, 14, 32, 31,221,171,118,222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,224,
+222,189,123, 56,127,254, 60,238,221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131, 36,
+ 72, 20, 20,231,195,100, 54, 34,118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,103,
+103,151,177,100, 61,142, 95,214,179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,130,
+192,138, 21, 43,224,235,235,219, 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111, 95,
+175,215, 91,163,162,162, 68, 33, 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,112,
+ 33,194,195,195, 49, 96,192, 0, 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239, 70,
+146,100,130,195, 11,164, 12,167, 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172, 89,
+149,187,122,108,216,176, 1, 40,239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84, 70,
+ 92, 57, 46, 46, 26,162, 50,156, 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,170,
+ 44,163, 26,224,111,229,100, 56,246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50, 91,
+255,154, 74, 45,105,219, 11,150,235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,121,
+119, 83,108,149,231,100, 57, 66,225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,249,
+249,249, 33, 61, 61, 61, 64, 36, 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,206,
+156, 57,210, 81,163, 70, 97,232,208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,161,
+ 86,171,111, 87,150, 78,150,227, 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154, 34,
+203,101,253, 4,128, 95,127, 60,136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,163,
+ 95,198,178, 29,191, 1, 0,206,159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57, 78,
+123, 39, 81,171,213,162,168,168, 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29, 20,
+ 10, 69,141,202,232,195,183,102, 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110, 88,
+179, 42,228, 92,185,114,101, 77,235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,169,
+ 32, 73, 50, 2, 40, 25,194, 11, 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129, 3,
+113,248,240,225, 42,123, 20,193,193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,187,
+160,160,160,128,227,184,106, 77,115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,163,
+160,146,151, 95, 41,206,159, 63, 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42, 20,
+ 10,145,148,148,132,185,115,231,130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,130,
+128,213, 82,126,164,218,179, 80, 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,238,
+148,251,133, 11, 23,104,142,227,170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,190,
+ 61, 38, 34, 8, 11,174,156,219,135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134, 12,
+ 25,245,213, 87, 95,181,112,181,211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,222,
+124,245,213, 87,209,186,117,107,132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,227,
+193, 69, 95,204,137,137,223,113, 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162, 59,
+ 85, 89,139, 28,173, 89,181,249, 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,134,
+117,207,104,180,122,109, 27,118,206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,171,
+169, 61,239,149, 89,174,170,107,209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,113,
+227, 6,110,220,184,129,105,211,166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,186,
+ 52,121,242,100, 0,248, 71, 89,183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,178,
+172,161,186, 5, 99,177, 88,236,193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,165,
+ 75,233,240,137,227,226, 32, 76,112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,187,
+118,237,122, 74, 40, 20,186,245, 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81, 85,
+ 1, 73,133, 66, 33, 60, 60, 60,240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,128,
+161, 95,238,122,120, 46,223, 90,111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229, 78,
+211,244,131,236,236,236,106,135, 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,190,
+240,243,169,126,253,162, 58,180, 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,177,
+105,178,179,179, 59, 13, 27, 54,108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5, 48,
+ 23, 64,218,165, 75,151,214, 94,186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,190,
+ 13,142, 13,235,215,251, 95,125, 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,202,
+225, 11, 28,181, 62,100, 63,101,202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103, 16,
+202,112,183, 59,124, 0, 48,251,255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15, 73,
+ 73, 73,200,201,201,129,193, 96, 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,159,
+ 56,124, 88,109,161,101,181, 90, 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11, 79,
+ 36, 18,153,154, 52,105, 66,184,154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,177,
+255,103, 89,150, 17, 10,133,113, 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,172,
+244,139,246,206, 49, 81,108, 31, 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,131,
+224,210,250,143,122,179,222,185,124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,177,
+252,235, 95,255,250, 86,171,213, 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,223,
+211,105,219, 31,118, 65,101,143,107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233, 85,
+237,119,142, 17,230,136, 91,240,198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,121,
+ 15, 9, 9, 65,157, 58,117, 74,127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,220,
+225,172,237, 50,170,140,179, 78,157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228, 57,
+121, 78,158,243, 9,114, 62,151,224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,166,
+ 79, 77,148,237,105,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,231,
+228, 57,121, 78,158,147,231,228, 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131, 7,
+ 15, 30, 60,120,240, 66,139, 7, 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,131,
+ 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,163,
+ 9,254,182,240,224,193,131, 7, 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212, 14,
+ 72, 94,108,241,224,193,131, 7, 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,188,
+224,226,193,131, 7, 15, 30, 60,120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120, 76,
+129, 85,217, 47, 15, 30, 60,120,240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,231,
+228, 57,121, 78,158,243, 31, 11, 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,224,
+193,131, 7, 15, 30,181, 39,178, 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,
+224,193,131, 7,143,199, 3, 1,126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,200,
+107, 50,251,224, 52,207,201,115,242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,183,
+253, 86, 40,188,106, 27,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81, 21,
+132,168,124,136,185,170,253, 60,120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142, 47,
+ 73, 87,104, 12, 96, 22, 0,111,135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,109,
+252, 82,219,194, 2, 48, 1, 48, 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66, 72,
+ 72,136,220,199,199,167,207,245,235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35, 95,
+ 93,158, 11,244, 5, 48,211,246,127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,193,
+144,169,215,235, 79,209, 52,253,165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59, 0,
+236, 1, 48,188, 78,157, 58,163,235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9, 68,
+101,214, 8, 87,152,203,113,220,232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3, 24,
+ 87,133,200,242,187,124,249,114,189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,171,
+ 86,173,250,142,227,184,116,130, 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93, 47,
+ 44, 44, 60, 65, 81,212, 55, 0,106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243, 9,
+154,166,215, 2,176,212,128, 83, 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,172,
+181, 9,206,167, 13, 33,128,104,142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207, 63,
+255,220,134, 97, 24,210, 86, 63,162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175, 95,
+191,222,116,247,238,221,204,215, 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,253,
+252,252,150,147, 36,233,239,206,245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144, 94,
+195,250,253,247,113,154, 98, 56, 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,148,
+ 40, 47,242,113,133, 86,104,104,104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,125,
+223,190,125, 47,107,181,218,225,213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,109,
+223,126,251,237,247, 55,110,220, 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,193,
+227,159,134,110, 40,235,163,245, 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80, 40,
+180, 91,180,218,235,245,250, 32, 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,201,
+171,175,190,170, 37, 8, 66,176,123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,237,
+102, 38, 91,248,250,250,238, 95,178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,243,
+207, 63,255,176,160,160, 96, 8,128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76, 38,
+ 19, 18, 19, 19,123,159, 56,113,162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127, 28,
+212,225,141, 55,132,190,190,190,224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,211,
+132, 68, 34, 33,183,111,223,222, 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91, 44,
+ 22,187,220,207, 48, 12,186,118,237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,191,
+118,237,218,215, 0,148, 19, 90, 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230, 79,
+ 53,255,241,241,178, 48, 0,211, 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,225,
+255, 99,167,213, 1,245, 0,224,216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,172,
+ 86, 43,178,179,179, 17, 25, 25, 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,219,
+183, 91,162,162,162, 68,227,199,143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,226,
+226,226, 2,142, 30, 61, 58, 48, 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16, 87,
+131, 1, 64, 36, 18,181, 9, 10, 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118, 80,
+ 85,150,172, 49, 99,198,116, 60,126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64, 74,
+ 74, 74,195,129, 3, 7,134, 78,157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34, 35,
+ 35, 47,159, 63,127,222, 75,165, 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,114,
+ 23, 0,127,186, 35,136, 26, 55,110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37, 70,
+140, 24, 33,238,214,185, 83,221,169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15, 31,
+ 66, 46,151, 67,167,211, 1, 0,188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,108,
+ 73,109,191,102, 0, 71, 4, 2,193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30, 12,
+185, 92, 14,139,197,194,162,100,232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243, 97,
+ 54,155, 81, 84, 84, 4,150,101, 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,105,
+232,245,122,152,205,102, 88,173, 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,123,
+194,217,207,179, 11,162,248,120,217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,183,
+ 89,199, 30,212, 2, 31, 11, 0, 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,156,
+156,188,238,197, 23, 95, 36,110,221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,196,
+198,198, 46, 2,176,117,247,238,221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128, 0,
+123,219, 98,107,119,253, 28,214,111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53, 65,
+ 16,191,214, 52,153, 78,191, 37,157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,214,
+ 60, 43, 43,203, 39, 43, 43,203,231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,229,
+203,151,235,237,223,191,127,209,233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167, 79,
+238, 79, 63,253,196,116,232,208, 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169, 84,
+170,239,207,157, 59, 87, 78,100, 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,190,
+159,126,250,201,211,203,203, 11,185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5, 43,
+190,152,239, 37,151,203,247,186,104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,210,
+ 33, 87,171,213,138, 75,147, 39, 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1, 20,
+216,150,201, 0,174, 68, 70, 70, 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,246,
+236,105,213,165, 75, 23, 36, 38, 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,152,
+ 58,117,234,228,238,223,191, 31, 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76, 38,
+ 24,141, 70,232,245,122,164,164,164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,184,
+ 30, 20, 20, 84,239, 9,231,221,234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,242,
+ 86,118, 63,179,109,105,213, 3, 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85, 96,
+197, 42, 48,126,237,144, 44,121, 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96, 89,
+108,108,236,231, 4, 65, 92,136,141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,206,
+255, 45,206, 42,180, 72, 0, 65, 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218, 23,
+135,237, 1, 28,199, 13,112, 56, 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,226,
+ 16,128, 95, 68, 34, 81,155,214,173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,139,
+193, 34,145,168, 13,128, 95,148, 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,144,
+160,232,208,161,131,158,166,105,130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,117,
+250,244,233, 99, 92, 8, 14, 71,188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,145,
+ 72,244,102,101,119, 75, 40, 20, 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147, 94,
+ 7, 74,171, 1,165, 41,130,250,254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37, 53,
+ 21, 41,123,246,128,161,203, 27,127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107, 41,
+199,113,114,142,227,228, 4, 65,172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,154,
+166, 69, 52, 77,139, 46, 92,184,208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,157,
+ 59,119,190,191,121,243,102, 42, 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,106,
+181,194,108, 54,195,104, 52,194,100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,198,
+198, 42,125,125,125, 63,124,146,249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62, 89,
+118,248,219,184, 45,181,116, 43,104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19, 70,
+ 74, 85,184,104,233,143,239,216,207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205, 95,
+ 1,232, 10, 96, 85, 77, 78,126, 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,208,
+123, 80, 51, 50, 61, 42, 2,220,160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47, 90,
+180,104,161,195,251,221,190, 46,119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,210,
+ 33,115,165,179, 11,131,130,130,226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,158,
+158, 30, 83, 69, 34, 36,217,217,217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,246,
+246,102,138,139,139, 69,122,189, 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,254,
+253, 43, 28, 58,160, 40, 10,122,189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,135,
+ 84, 26, 21, 21, 21, 37, 42, 40, 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90, 13,
+ 56, 77, 49,242,239,221, 65,135,102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15, 15,
+116, 31, 93, 50,207,224,120,179,102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,109,
+219,162,212,106,245,178,167, 81,217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,247,
+208, 75, 36, 18,200,100, 50, 88,173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,252,
+252,252,133, 89, 89, 89, 41,238,242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,121,
+ 50, 99, 48, 24, 26,174, 94,189, 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,227,
+101, 98,155,229,215,242, 63,198,201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0, 29,
+ 0, 47,155, 40,120,149, 32,136, 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,178,
+ 44,222,110, 95,132,201, 29, 5,160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,122,
+246,145,201,100,245,105,154, 38,117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,102,
+205,154,213,201,219,219, 27,191,255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26, 26,
+168,194,141,243,135, 67, 23,110,216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,103,
+161, 84, 45,179,211, 99,158, 95,133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86, 22,
+ 50, 50, 50,160, 86,171,225,227,227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,161,
+ 80,176, 34,145,136,179, 93,135,176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113, 28,
+215,222,207,207,207,229, 62,179,217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46, 45,
+ 77,183, 12, 8, 8, 64,102,102, 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,245,
+ 26, 80, 22, 3, 66,155, 52,131,125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,180,
+205, 57,218, 62,156,232,239,239, 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171, 76,
+157,152, 52,105, 82,169, 79, 86,215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81, 82,
+ 70, 52, 13,127,127,127,125, 94, 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,255,
+ 29, 50,153, 76,196, 48,204, 45,154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,113,
+ 56,207,112,209,144,184,117,235,220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235, 16,
+168,106, 61,208, 67,175,144, 8,244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,156,
+156,108,154, 63,127,126,131,237,219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,165,
+ 68,113,113, 49,212,106, 53,114,114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,175,
+191, 62,246,165,151, 94, 18,217, 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,209,
+158,217,179,103,123,188,242,202, 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21, 72,
+146, 12,122,220,250,106,178,178,161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,215,
+183,179, 91,164,170, 16, 75,198,153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,174,
+109,177, 85,173, 64,147, 44,203, 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227, 8,
+130, 96, 79,157, 58,229,115,249,242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,124,
+241,226, 69,213,237,219,183,131,108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237, 69,
+248,251,181,107, 37, 34, 75,167,181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,139,
+ 44,171, 77,104, 89, 44, 22, 80, 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,119,
+225,144, 33, 67,240,238,187,239, 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,192,
+241,231,237,161, 55,155,205,165, 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3, 7,
+246,227,194,133, 11,100, 66,194,173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,170,
+ 40,164, 66, 4, 42, 31,178,227, 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69, 66,
+ 18, 95, 79,107,233, 43,251,176,149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22, 46,
+252, 34,228,246,237, 59,230, 57,115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69, 21,
+ 25, 93, 6, 13, 26,116, 53, 48, 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,209,
+120,218,106,181,158, 6,112,173, 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,209,
+169, 83, 39,193,161, 67,135, 90,212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149, 6,
+ 3, 96,180, 90,109,142, 94,175,255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,114,
+ 30,183, 14,200,196,228,163,155,231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193, 81,
+ 64,185, 16, 72,151,227,226,226,228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,243,
+143,145,198,138, 45, 90, 21, 41, 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36, 72,
+ 75, 75,131, 68, 34,201,114,167, 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178, 83,
+167, 78, 47,202,229,114,134,227, 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,221,
+187,141,168, 36,254, 21, 65, 16,191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,215,
+ 43, 75,168, 80, 40,188,153,148,148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13, 36,
+ 52, 13, 17, 67, 65, 46,147, 33, 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,104,
+186,100, 97, 24, 88,104,186,212,162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144, 15,
+ 4, 5, 5,177, 29, 58,116,192,148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90, 55,
+ 26,141,208,233,116, 40, 44, 44, 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,155,
+ 48, 43, 21, 93, 44,203,130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,104,
+ 16,113,232,208, 33,176, 44,155,254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254, 28,
+183, 17, 46,142, 41,135, 15, 62,248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183, 83,
+247,237, 93,141,126,222,183, 43,127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,246,
+189,201, 15, 31, 62,212,172, 93,187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115, 92,
+ 97, 97,161, 56, 62, 62,126,119, 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152, 95,
+ 89,127,141, 32, 8,252,244,211, 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243, 78,
+177, 88, 60,175, 73,147, 38,125,111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,147,
+105, 52, 26, 99, 31,219,162, 69,177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,178,
+ 65,237, 96,141, 82, 3, 32,156,214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17, 44,
+157,171,168,141,171,200,162,245, 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,201,
+ 65,110,110, 46,132, 66, 33,148, 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,219,
+183,111, 15,254,250,235,175,133, 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,237,
+183,223,142, 88,177, 98, 69,170, 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,161,
+211,167, 79,151, 90, 44, 22,151,150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163, 93,
+255, 51,114,164,152,210,106, 64,105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,
+127,253,131, 50,155,205,149, 6, 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74, 42,
+ 21, 87, 86,171, 21, 7, 91,182, 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29, 61,
+122,244, 53,150,101,219,226, 9,125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187, 38,
+ 38, 38,138,255,252,243, 79, 92,184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,176,
+249, 31,238,222,185, 7,239,188,243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,225,
+228,247,228, 34,164,194,239,112, 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,165,
+ 12, 49,166, 24,141,205, 33, 62,171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,225,
+238, 93,231,110,188,244,146,143, 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183, 46,
+ 63, 63,191,179,171, 50,141,142,142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,115,
+110,223,190,221, 78, 36, 18, 17, 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12, 8,
+101, 96, 84,173,144, 38,110,142,176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,248,
+176,110,221,186,113,215,175, 95, 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,118,
+166,109, 85, 72,179,197, 27,172, 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,149,
+196, 10, 13, 24, 21,108,111,111,139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,126,
+253,250, 32, 8, 2,235,214,173, 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,218,
+182,109,155,234,218,181,107, 2,154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34, 34,
+ 34,194, 68, 16,132,244,199, 31,127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,148,
+ 20,152,205,102,104, 52, 26, 20, 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139, 18,
+ 95,153,101, 99,237,154,117,235,213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234, 54,
+146, 67,166, 80, 34, 71,163, 67,252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,112,
+ 88,109, 67,133,142, 66,139, 33, 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88, 42,
+203, 7, 88,150, 77, 79, 76, 76,220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59, 23,
+ 98,177, 24,115,231,206,197,167,159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,159,
+ 63,127,158,139,139,139,203,139,136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,197,
+146, 37, 75,176,121,243,102, 28, 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,240,
+160,113,213,170, 85, 16, 10,133,196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,144,
+197,199,215,181,137,163,100, 7, 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,166,
+ 59,247,175,100, 25,103, 3,248,193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,223,
+203, 2, 3, 3,241,237,183,223,202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,247,
+190,173, 35,218, 11, 64, 11,148,204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,214,
+173, 91,235, 23, 48,190, 56,166, 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97, 54,
+ 85,179,220, 95, 31, 50,100,200,214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,243,
+198,142, 29,155,181,105,211,166,144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,254,
+207,205,205, 93, 93, 88, 88,120,233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169, 43,
+191,146,222,176,197,218, 32, 8,130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,123,
+247,250,247,232,209,195,192,178, 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100, 98,
+108,108,172,154, 32, 8,214, 21,167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,131,
+ 1, 6,131, 1, 28,199,193,219,219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,228,
+247,167,159, 90,245,249, 92,175,240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,163,
+ 93, 7,180, 70,147,233, 53, 23,189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,192,
+108, 54,131, 97, 24,136, 68, 34, 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,145,
+115,242,141, 27, 55,198, 54,107,214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99, 1,
+ 92, 7,176, 14, 37, 67, 29,112, 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207, 63,
+255, 28,118,193,105,175,215, 83,166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,238,
+255,205, 55,223,188, 14, 32,214,153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,126,
+252,120, 88,173, 20, 4, 2,161,197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,224,
+232,248,110,113,244,207, 66,197, 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,106,
+112,218, 5, 97, 77, 56, 79,217,150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,252,
+231, 71, 31,125,116, 99,211,166, 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66, 66,
+ 66,132,157, 59,119,150,245,239,223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130, 32,
+240, 97, 87, 45, 98,123, 8, 96,177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251, 1,
+152,253,221,119,223,133, 74, 36, 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,122,
+145,254, 44, 62,239, 60,231,255, 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,112,
+248, 4,192, 92, 7, 43, 88, 85,230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,112,
+249,242,229, 97, 52, 77, 91, 19, 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16, 86,
+ 55, 50,152,144,156,156,220,169, 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,248,
+227, 15,203,238,221,187,211,139,138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244, 5,
+ 73, 72, 72, 8, 96, 52,226,206,195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,235,
+221,115,198,140,125,243,254,243,159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,155,
+200,122,210, 81,225,165, 0,150,178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0, 8,
+ 9,130, 88, 10, 96,203,179,110,197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86, 11,
+154,166,153,140,140,140, 59, 62, 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,242,
+ 1,165, 82,153,118,230,204,153,198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,210,
+247,160, 75,151,157,192,134,152,215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,198,
+179, 11, 34,155, 21,170,185, 44, 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,245,
+ 96, 24,166, 50,107,222,239,123,247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29, 15,
+ 48, 26,141,236,225,195,135,245,235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,161,
+119,255,254,253,155, 0, 40,245,207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141, 26,
+ 53,106,233,182,109,219,234, 76,152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144, 9,
+ 19, 38,100,163,196,143, 44, 29, 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,156,
+ 78,167,227,224,250, 43,240, 7, 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,242,
+216,177, 99, 71,163,208,208,208,207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47, 14,
+229, 56, 78, 92,137,138,174, 8, 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,232,
+ 29, 0,162, 42,148,121, 69,144, 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,132,
+202, 3,169, 86,202, 41,145, 72, 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,211,
+ 43,177, 11, 45, 3,103, 3, 65, 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,179,
+ 89, 91, 12,168, 56,120,227,223,153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,103,
+142,102,219,182,109,108,100,100,228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,137,
+142,140,140, 44,112,138, 12,255, 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205, 62,
+ 60, 1,160, 79, 5,101,239, 46,103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,104,
+209,226, 30,231, 0,139,197,194,169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56, 28,
+ 28, 28,124,187, 99,199,142, 15, 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,193,
+217, 81,165, 82, 45, 12, 11, 11, 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171, 91,
+231,123, 12, 29, 58, 52, 77,167,211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,250,
+159,240,188,243,156, 79,133,243, 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,156,
+128,227, 56, 15,142,227,188, 57,142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,148,
+193,246,223, 25, 85,237,127,174,239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,143,
+218,181,107, 55, 53, 52, 52,212,231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,172,
+ 39,153,119,137, 77,196, 52,179, 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,175,
+109, 57,100,219, 22,246, 20, 56,203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,123,
+ 77,155, 54,189, 23, 17, 17,113,175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239, 30,
+ 25, 25,121, 85, 38,147,185,140, 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,149,
+240,217,227,148,162,242,207,140, 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,189,
+ 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104, 60,
+126, 0, 0, 32, 0, 73, 68, 65, 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119, 0,
+231,236,189,194,138, 84,105,117,102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,138,
+ 10,182,223,113, 90,255,250, 25, 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,248,
+140,138,172,110,246, 21,126,232,144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141, 26,
+ 53,158, 97,152,169,246,117,129, 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,139,
+ 38,202, 73,126,222,138,247,138,138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,231,
+248,241,227,155, 56, 95,167,126,152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,151,
+ 76, 60,168,133, 74,220,241,207,124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0, 90,
+ 24, 12,134, 64,133, 66,145, 11, 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,245,
+220,217, 87, 21,250, 68,192,196, 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65, 76,
+ 0,230,147,247, 33,123,142,138, 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,186,
+ 46,172, 64, 76,116, 21, 11,137,175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227, 63,
+ 7,137, 34,138,198,187, 91,182,108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3, 22,
+ 47,178, 60,200,139,213,106,181,164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,197,
+138, 21,217, 53, 77,231, 7, 31,124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,138,
+110,209,139, 62, 7,120,161,245, 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,233,
+186, 65,159, 94,201,156,158,174,179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,176,
+ 97, 67,200,100, 50, 24,141,198,144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,236,
+214,255, 3, 0,116, 26, 51, 63, 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,213,
+234, 72,142,108, 91,134, 65, 99, 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,150,
+ 33,122,236, 71, 21,126, 71,177,111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88, 57,
+ 74,148,124,208,217,229,241, 3,154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,210,
+182,138,133, 96, 14,166,120,159,157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238, 91,
+ 50,255,248,242,224,241, 92, 11, 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40, 44,
+ 44,132,143,143, 15, 36, 98,177,104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,159,
+ 79,216, 62,165, 35, 20,144, 34,137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74, 79,
+249,155,147,103,118, 70, 73,252,159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,236,
+ 47, 22,190,142, 61, 21,204,222,248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230, 49,
+ 39, 82,103, 1,248,244,121,201,108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104, 52,
+ 34, 52, 52, 20,103,207,158, 21,207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112, 19,
+ 0, 12,108,233,229,188,175,158,125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153, 10,
+182,155, 0, 40, 42,227, 98, 89, 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,233,
+233, 89,209, 41, 65, 58,157, 46,220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118, 0,
+ 0,190,252,104,180, 96,211,207,121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245, 63,
+120,240,224,202,138,132, 42, 15, 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,255,
+128,174, 93,187,150,238,107,208,160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,145,
+ 95,205,127,152,173,187,114,228,200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,138,
+189,148, 30, 24, 21,243, 14, 92, 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,180,
+108,214, 20,133,251,215,226,143, 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122, 46,
+132, 86,112,112,112,211,128,128,128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,157,
+ 59, 55, 50, 56, 56,248,180, 27,195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,213,
+118, 31, 55,223, 11, 0, 72,161, 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,206,
+145,211, 98, 49,151,110, 95,188,120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138, 5,
+144, 73, 68,240,170,223, 14,210,194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155, 86,
+101, 58,199,143, 31,207,169, 84, 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184, 65,
+ 24,164,156,209,237,180, 10, 4,101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,115,
+129, 10,103, 24, 10, 1,224,200,145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,195,
+150,126,231,139, 32, 9, 76,126,163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,110,
+226,155,255, 1,195,178,127, 13,148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,135,
+164,173, 38, 16,101, 63,246,248,119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,250,
+ 64, 82,149,170, 94,245, 90, 7,153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34, 43,
+ 39, 39,135,212,233,116,176, 90,173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143, 43,
+ 78,155,223,213,140, 91,183,110,213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21, 21,
+229,187, 96,193, 2,107,255,254,253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,214,
+112, 0, 64, 16, 4,162,162,162,210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53, 34,
+ 4, 32,247, 44,245,196,139,138,138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,175,
+191,254,250,195, 59,119,238,184, 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,180,
+ 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,127,
+222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255, 27,
+ 15,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,218,
+ 43,110,246,184, 83, 12, 3,176, 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123, 28,
+156,175,179,253,187, 61, 3,207, 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193, 98,
+161,161,181,176, 22, 0,122, 19,197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,203,
+252,215,173, 91, 23, 10, 0,195,134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157, 59,
+ 3,192,186, 10,120,245,225,225,225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,227,
+198,122,177, 88, 12,146, 36, 97, 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,155,
+ 3, 39, 73,146, 46,175, 87, 97, 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,113,
+184,126,253, 58, 82, 82, 82, 32, 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,243,
+224, 81,138,179,207,160,192,114,182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20, 13,
+138,178, 2, 28, 87, 43, 66,171,162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247, 88,
+134, 2,203, 82,112,117, 29,130, 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164, 18,
+228, 25,209,240,133,102,130,223, 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45, 89,
+235,214,173, 11,181, 88, 44, 36, 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224, 89,
+ 10, 96, 11, 42,137,238, 47, 22,139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,173,
+ 42,136, 29,133, 22,184, 18,171,150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,190,
+ 43,166,213,106,133, 78,167, 67, 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,200,
+ 51, 44,182, 92, 11, 45,148,152,236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122, 58,
+114,228,200,173, 33, 33, 33, 29,236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137, 69,
+203, 82,225, 55, 65, 10,139,245,159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,162,
+144, 8, 97,134,191,253,217,120,135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,164,
+246,252,199,227,254,117,192, 81,204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185, 59,
+ 94,126,239, 43,156,249,228, 99, 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188, 42,
+ 20,138, 92,131,193, 16, 98, 52, 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,241,
+237, 95, 84,201,105, 15,225, 48,176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,252,
+ 93, 47, 0,184,113,100,173,102, 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,217,
+133, 31, 30, 60,120, 80,215,108, 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138, 50,
+ 8,133, 66, 88, 44, 22,183, 84, 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237, 60,
+115,110,116, 68,109, 98,235,137, 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156, 99,
+ 15,145,166, 40,155,200,250, 75,244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,115,
+230,204, 49,143, 28, 57,114, 57,203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,138,
+130,151,151, 23,188,188,188,208,180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,165,
+226,167, 80, 99, 14, 59,116,250,122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,130,
+205,155,165,133, 76,192,180, 81,175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,130,
+131,179,143, 22,143, 39,132,228, 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,144,
+ 66, 49, 18, 10, 77,212,115,148,221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40, 76,
+ 40, 18, 17,209,163,166,178,217,217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,149,
+ 53,203, 49,132,131, 87, 84, 84,148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22, 17,
+ 35, 71,142,148,135,135,135, 19, 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,211,
+ 95,193, 1,197, 15,128,226,212,114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,100,
+ 95,119,139, 43,166, 13,168, 80, 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,207,
+ 20,186,217, 4, 98,119,219,111,169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149, 43,
+ 87,226,253,247,223, 7, 0,241,244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33, 33,
+ 33, 57, 28,199,137, 72,146,236,178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,248,
+153, 91, 31,165,124,193, 15,123,166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,143,
+ 31,196,134,245, 27, 10, 65,112,183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,173,
+107, 89, 7,166,126, 48, 43,114,248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,104,
+ 61, 45,248,158, 60,117,138, 24, 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,206,
+206,134, 70,171, 19, 2,240,197,115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163, 71,
+143, 60, 53, 27, 42,155,248,206, 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,191,
+206,251,179,227, 54,102, 93, 94,191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141, 27,
+231,214,248,161,197, 98,225, 22, 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,170,
+253, 62, 73,146,160,223, 90,176,131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,224,
+164, 82,169,216,157,116, 78,157, 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,120,
+ 7,169,151,151, 23,180, 90,109,105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,203,
+201,205, 11,244, 15,170, 15,154,166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31, 0,
+ 80,101, 99,182,107,215,174,249,211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186, 20,
+ 34,137, 12,190, 1,117, 75,175, 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,150,
+162, 64, 81, 20, 8, 65, 73,214, 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76, 48,
+187, 97, 4, 36,111, 93,203, 58, 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177, 44,
+ 72, 82,192,251,104, 61, 37,145, 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3, 7,
+ 14, 36,112, 28, 7, 31, 31, 31, 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242, 93,
+179,102,205, 26, 53,115,230, 76, 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,169,
+202,178,114, 2,133, 72, 44, 1, 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50, 77,
+247,113,243,149, 0, 32,150,202, 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,113,
+177, 2,133, 92,166,143,138,138,122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,129,
+ 64,128,196,131, 75, 52, 67,198,197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255, 71,
+118,127,177,212,212,212, 58, 3, 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231, 46,
+155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,220,
+ 84,171,162,214, 81, 23, 42, 46, 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121, 62,
+159,124,146,220,189,247,220,123,251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138, 9,
+ 19, 38,188,123,254,252,121,109,163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,162,
+ 98, 30,173,170, 51,195, 43,148,138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0, 35,
+141,216,154, 59,119,110,141,101, 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,137,
+242,177,211, 87, 20, 84, 88, 15,104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,109,
+105,217,221, 75, 5,160,144,224,171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,129,
+154,197, 22, 77,120,124, 59,119,129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,103,
+124,191,218,208, 59, 43, 79,180,221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42, 61,
+ 34,114,185, 28, 66,161, 16, 69, 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,247,
+237,126,251,246,237,174,115,231,206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,179,
+179,179, 41, 99, 83, 75,129,173,131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,212,
+219,180,105,147, 76, 59, 18,112,248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248, 43,
+111, 48,251,197,139,103,205, 42,114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153, 92,
+ 29,111,131, 6, 13,196,124, 62, 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154, 54,
+109, 90,172,175,211,190,145,145, 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,212,
+168, 81,252,121,243,230,225,224,193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,192,
+255, 25,170,207,163, 85, 17,135, 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197, 86,
+149, 52,235, 1,117,174,141,202, 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134, 12,
+ 25,242, 30, 39, 77,144, 12,146, 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72, 12,
+160,103, 69,177,133,191,202,140,148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,226,
+108,245,138, 41, 38, 36, 73,116,172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,153,
+ 76, 86,150,184, 83,227, 44,158,150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,213,
+219,183,111,119, 56, 58, 58, 94, 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125, 71,
+136,100, 52,147,151, 42,200,108,114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,113,
+104,210,164,137, 72, 91,168,212,173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255, 75,
+ 84,211,254,212,136,182,138,105, 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244, 14,
+229,116, 90, 72, 72, 72,143,144,144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,243,
+255,149,243,115, 70, 87,252,229,155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,106,
+212,168, 81,213, 46,147,145,145,113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,153,
+ 27,173,185,117,126,161, 85,215,126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1, 12,
+170, 74,149,246,250,114, 32,142, 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251, 49,
+207,224,163,245,207,128,205,102,251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,199,
+114,163,163,163,253,228,114,249,141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227, 92,
+ 22,117,120, 98, 23,164, 18, 49, 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,252,
+216, 85,147, 91, 75, 34,145,232, 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103, 13,
+167, 84, 42,213, 41,234,144,195,225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,183,
+140, 32, 8,130, 54, 12, 27, 26, 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26, 62,
+124,120, 57,145,229,239,239,175, 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,242,
+105,231,182, 77, 65,146,228,211,165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,117,
+ 16, 48,238, 91, 4,140,251,214, 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9, 8,
+130,128, 84, 42, 45, 19, 88, 69, 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,147,
+203,229,202, 69, 43, 55, 29,102, 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,204,
+ 74,167,127, 42,206, 37, 75,150, 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25, 96,
+128, 1,255, 49, 84, 26,186, 87, 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221, 74,
+ 75, 75,203, 41, 34,145,232,143, 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243, 10,
+138,165,193, 21,231, 85,180, 60,105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138, 86,
+ 20, 22,138, 87,250,245,223, 56, 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,194,
+ 66,148,148,148, 64, 93,146, 6, 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48, 63,
+241,230, 14,237,115,251,153,246,188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76, 61,
+249, 50, 1,128,205, 98,100, 85, 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,125,
+255,255, 84, 43,238, 97,224, 52,112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202, 48,
+249, 51, 17, 90,116, 37, 31, 0,181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,164,
+181,103, 84,165, 74,245,137, 38,168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,237,
+229, 39, 3,216,247,153,136,173, 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,135,
+ 6, 24, 96,128, 1, 6, 24, 96,128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,240,
+191,182,137,254,254,254, 12,125,218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,109,
+ 27,180, 26,109,204, 51,158, 46,147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,125,
+124,124,210, 1, 20,105,189, 41, 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,185,
+118, 22, 30,227, 64, 18,205,180,166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,197,
+181, 87, 50,207,112,157, 27,240, 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,104,
+ 36,134, 14,174, 21,143,219, 55,117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228, 19,
+189,249,234,251, 79, 67,213,229, 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,202,
+103,112,174, 45, 56, 0,124, 73,146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76, 48,
+ 53, 49,233,227,106,198,105,245, 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,198,
+ 6,205,234, 1, 75,191,141, 11, 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4, 57,
+ 34,155,159, 14,134,108, 10, 9, 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150, 45,
+251,117,197,138, 21, 52, 81,117,165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,248,
+ 44, 56,235,212,169,227, 68, 81,212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,222,
+ 75, 16,196,100,154,166,247,233,241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249, 39,
+215,245, 15,189,127, 79,186,114,231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,238,
+129, 4, 77,211, 88,185,114, 37,177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,206,
+ 13, 98,203,128,207, 21,250, 21,149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,140,
+152,180, 80,169, 55,151,235, 88, 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,139,
+ 73, 54,193, 65,203,118, 3,240,169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,245,
+152, 21, 0,126,210,243,174, 68, 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,167,
+167, 37,143,199,227, 72, 36, 18,135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,224,
+185, 19,218, 53,111,224, 10,150,172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,228,
+228, 16, 0, 96,107,107, 75,151, 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,243,
+205, 64,191,181, 63,204, 52, 77,203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,134,
+133,251, 85, 42,213, 23, 0,218,168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,106,
+183,110,221,234, 79,156, 56,145,104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,161,
+ 46,123,162, 3, 88, 0, 26, 51, 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,255,
+254, 68,227,198,141, 17, 31, 31,223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,127,
+142, 19,196,100, 0, 78,106,157,188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,185,
+ 61,122,174, 43,150, 32, 8,107,117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214, 5,
+ 80, 93, 34,104, 35, 0,232,213,169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206, 10,
+ 86,241, 45,118,229, 74, 98,197,138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138, 21,
+ 43,182, 87,115,157, 27, 96,192,231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135, 26,
+121,122, 52,132, 4,166, 72,202, 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,158,
+120,158,166,192,227, 52, 21, 74, 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48, 72,
+128, 36, 9, 48,200, 90,146, 81,178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171, 86,
+ 89,102,100,100,152, 68, 70, 70,130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60, 9,
+ 64,142,142,156, 30,125,219,120,223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,244,
+ 77, 67,107,255,176,196,211, 15, 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,207,
+170, 30,149,206,108,147,155, 77, 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95, 90,
+ 33, 99,121,117,121,179,141,141, 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151, 22,
+ 8, 24, 49,204,228,212,111,161, 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,217,
+108, 54,193,227,241, 70,173, 93,187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,209,
+ 32, 36, 36, 68, 25, 17, 17, 17, 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233, 66,
+113,185,127,165,159,170, 13, 39, 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,118,
+221,122,245,234,197,236,212,169, 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,149,
+ 43, 59,158, 60,121,114, 35, 41, 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,154,
+154,140, 10,133, 2, 42,149,170,236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,243,
+161, 42,251,230,112, 56,182,154,132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,223,
+159, 69, 34, 81,178, 64,106, 25, 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,101,
+175,188,213,223, 34,130, 32,110,146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74, 71,
+133,160,126, 78, 18, 0,108, 42, 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133, 42,
+252,180,152, 0, 16, 22, 22, 70,247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225, 85,
+ 22, 16,241,142, 6,147, 84,128, 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30, 8,
+154,205,136,205, 98,226, 80,120, 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,231,
+123, 7, 6, 80, 81,234,119, 64, 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125, 85,
+156, 94,141, 26, 53, 26,241,195, 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159, 55,
+109,218,180, 70, 78, 78, 78,230,131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108, 53,
+201, 61, 21, 12, 89,194, 83, 92, 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,147,
+176, 81, 65, 81, 1,213,113,222,187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,197,
+194,221, 17, 78, 37, 82, 57, 99, 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,228,
+242,250,206,246,230,136, 78, 18,227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,100,
+200,144,195,234,183,246, 71, 0,190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,232,
+218,181, 43, 60, 60, 60,152, 93,186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50, 51,
+ 51,203,173,236, 65,165, 15, 39, 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,220,
+220,188,156,245,215,196,196, 4,141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130, 40,
+123,104,191,103, 44,118,117,133,163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,173,
+149, 21,142, 83,149,195,111,149,181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,178,
+174,247, 56, 73,146,196,210,165, 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,102,
+ 47,100, 50,153, 19,165, 82,169, 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52, 49,
+ 49,113,125,245,234,149,123, 85, 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,137,
+182,219, 52, 77,119,209,250,175,141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,191,
+143,179, 6, 45, 98, 71, 16, 68,152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,214,
+175, 95,255,130, 32,136, 48,237,233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,255,
+ 14,145,168,143, 69,203, 60, 91, 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220, 65,
+226,233, 68,221, 44, 89,254,157, 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207, 80,
+ 41, 85,191,131,160, 31, 3,100, 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188, 73,
+147, 38,195,150, 45, 91,102, 27, 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,125,
+ 59, 39, 40, 40,200,203,203,203,139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,192,
+137,141,196,210,167, 57,170, 63, 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,248,
+197,229, 73,170,181,100, 25, 27, 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239, 68,
+116,106,102,131,172, 2, 41,102,239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242, 48,
+186,179, 41,186,175, 77,135,127, 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4, 0,
+208, 6, 64, 98, 74, 74, 10,223,199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175, 98,
+ 43, 43, 43,136,197, 98, 72,165, 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,195,
+204,204, 12, 20, 69,125, 48,167, 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,244,
+241,176, 97,195, 94,219,219,219, 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100, 66,
+ 44, 22,131,203,229,130,201,100, 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241, 6,
+250,158,133,170,186,225,183,218, 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1, 8,
+106, 90, 23, 65, 16, 96, 48, 24, 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,227,
+120,244,232, 17, 88, 44, 86, 89,123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245, 16,
+ 27, 27, 91,119,195,134, 13, 11,175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165, 82,
+196,198,198,234,179,204,123,104,216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81, 27,
+ 34,154,166,191, 36, 8,162, 16,192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173, 95,
+191,190, 95,101,226,170,146,107,179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,180,
+194,194,194,170, 87, 32, 20, 6,133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83, 87,
+248,253,140, 72, 6,243,151, 61,235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,194,
+ 15, 62, 18,245, 6,121,217,219,216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74, 36,
+ 18,222,157, 59,119, 74, 66, 66, 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,114,
+121,117,190, 11,173,230, 79, 28,115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208, 40,
+250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249, 26,
+145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155, 20,
+232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,246,
+ 43,162, 30,220,126,202,231,243,195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229, 0,
+ 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,248,
+120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,240,
+219,155,106,195, 73, 81, 20, 1, 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,235,
+ 81,177, 88, 92,206,114,160,171,208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131, 54,
+ 45, 45, 45, 63,137,208,170,194, 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149, 96,
+179,217,240,241,241, 65,112,112, 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,111,
+ 23,169,136,136,136,133, 95,127,253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39, 79,
+110,120,227,198,141,229, 40, 13,126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,190,
+ 76,128, 85,140, 72,124, 31, 5,203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,252,
+253,253,105,130, 32, 52, 15,164,103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147, 85,
+ 9, 40,125,132,154,182,197, 75,131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85, 14,
+ 25,150,217,190, 72,190,163,189,141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,170,
+ 83,119,184,156,160, 53, 63,204,105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,161,
+222,142, 14,246,183,142,237, 93, 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,190,
+ 29,151,203,229,189,122,245,138, 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137, 68,
+114,185, 92, 46,169, 70,100, 57,251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,187,
+185,215,169, 67,240,204, 64, 3, 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165, 49,
+151,165,186, 27,147, 67, 69,222, 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,236,
+234,119,203,130,138, 75, 68, 69,112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,109,
+ 64,169, 51, 56, 0,188, 60,117,234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30, 30,
+ 30,194,220,220, 92,196,196,196, 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207, 51,
+165,105, 26,249,121,185, 38, 63,252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,242,
+221,187,119,230,218,243,116,229,148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,150,
+122,253,159,204,162,165,249,205,227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,113,
+ 88,227,246,232,120,220,193,102,179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,158,
+ 61,193,225,112,244,181,104,209,108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,185,
+ 70, 92, 46,119,164,190,166,123,129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,239,
+239, 79,251,251,251,211, 26,193,101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2, 26,
+145,213, 85, 75,120, 17, 26, 11,151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200, 22,
+ 36,163, 77, 7, 63,196, 62,143, 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,138,
+241, 42,242, 50, 10,178, 5, 59,145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41, 41,
+ 73, 56,251,235, 86, 90, 33,151, 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231, 32,
+ 69, 6,128,240,173, 91,183,118,111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13, 14,
+ 14,118, 72, 73, 73,193,181,107,215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,190,
+ 83,134, 62,138, 25, 0,224,146, 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86, 69,
+152,147,147, 67,148,148,148,184, 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203, 34,
+233,217, 3, 93,211, 31,158, 13,181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93, 46,
+149,120, 53,105,210,152,126, 28,113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133, 72,
+ 95, 75,145, 62,208,149,179,162,208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191, 62,
+ 22, 42,237, 33, 67,141, 63,157, 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4, 69,
+ 81, 96,179,217,104,209,162, 5,194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139, 36,
+117,142,210,161,165, 82,105,221,186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,148,
+182,123, 3, 12,248,123,239, 43, 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,193,
+ 85,206,186,197,212, 86,144,149, 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242, 41,
+ 74,225,250, 54, 62, 26, 32,241,139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,179,
+248,163,137, 44, 7,219, 27,135,119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135, 80,
+143,100,179, 7,178, 93,222,245,155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,103,
+159,221,186,117, 43,241,227,143, 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,235,
+206,157, 59,162, 27, 55,110,208, 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,108,
+207,126,173,155,221, 61,184,126,185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66, 81,
+156,171,108,195, 23, 9, 3,135,216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,238,
+ 90, 63, 63, 4, 64,200,144, 33, 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,220,
+142, 29, 59, 18, 62, 62, 62, 15,182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150, 83,
+219,162, 85,147,208,250,148, 22,173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,108,
+ 68, 71, 71,195,197,197, 5,114,185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60, 30,
+239, 93, 76, 76, 76, 99, 59, 59, 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163, 14,
+203,193,209,209,209,226, 99,236, 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,255,
+179, 81,154,195,173,159,250, 55, 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,112,
+ 97,214,100,201,178,183,182,186,113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,181,
+211,161, 32, 80,130,183,161,183,116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,240,
+209,113, 27,212,194,222,218,246,198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,107,
+ 75, 59, 1,176, 98,152,240,118, 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225, 60,
+225, 73,170,152,154,158,118, 95, 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,169,
+169,169,188,168,168, 40,241,222,189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199, 7,
+ 68, 4,140,155,200, 75,188, 22, 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78, 78,
+114, 65, 65, 65, 99, 19, 19, 19,228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,144,
+149,162,128, 74,165,202,208,213,154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30, 50,
+100,200, 97,173,168, 67,109,103,120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,213,
+219, 81,186,170, 40,198,218,112, 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130, 14,
+ 65, 21,127,171,104,209,142, 14,172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,231,
+206, 97,220,184,113, 80,169, 84, 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,145,
+245,235,215, 47,217,179,103,143, 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41, 58,
+198,196, 68, 89,109,212, 97,101,203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96, 72,
+239, 96,128, 14,247,147, 71,255,226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230, 71,
+ 31, 17, 72,124,251, 22, 55,127,219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68, 43,
+ 39,123, 75,228,137, 40, 20,230,188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,234,
+201, 29, 66,165, 82,242,197,135,136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,236,
+ 80,172, 62,254, 13,204,236, 24,104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,250,
+245,135,222,191,127,223,214,219,219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,209,
+228,177, 17, 27,247, 31,230,145,108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,193,
+193,193, 82,146, 36,145,151,151,135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,251,
+186,118,240,222,189,123,245,211,210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,105,
+166,167,166,166,214,123,240,224, 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156, 56,
+113, 2, 0,242,170,227, 96,179, 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,249,
+165, 36, 50, 50,178, 82,139, 86,109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,184,
+ 92, 46, 50, 50, 50, 48,101,202, 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,250,
+ 64,105,134, 6,105,154,134, 70,112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,223,
+251,244,120, 40,148, 9,173,216,216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3, 14,
+135, 3,205,190,208, 85,191,249,248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,187,
+183,228,238,221,187, 9, 98,177,120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,145,
+144,144,224,170, 82,169, 26,211, 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169, 26,
+ 37, 36, 36,184, 26,228,132, 1,159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144, 68,
+ 74,114, 2, 30, 95,220, 45, 84, 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,208,
+140,218, 8,173,114,156,160,200,224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26, 85,
+ 27,206,145,108,246, 50, 22,131, 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75, 39,
+222, 37,228, 72,126, 35, 61,208,119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,112,
+183,172, 44, 69,249,126,190, 15, 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,139,
+ 47, 2,136,208,105,219,223,135,115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,140,
+170, 19, 96,150,227,228,114,185,199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,237,
+236,236, 16, 27, 27, 75, 37, 38, 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186, 80,
+171,105, 99,129, 64,208,150,207,231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226, 62,
+125,250,192,200,200, 8, 34,145, 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92, 63,
+ 37, 18,113, 93, 0,164,184,164,164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,188,
+188,188,166,127,252,241,199,156,232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,231,
+231, 91, 68, 69, 69,109,234,220,185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176, 16,
+171, 86,173,194,157, 59,119,148, 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,223,
+222,207, 10, 62, 93, 80,167,112, 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30, 45,
+ 77,250,135, 42,184, 43,219,118,250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,147,
+116,133, 66,241,139, 88, 44, 94,139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210, 59,
+148, 75,225, 80, 97,153,114,169, 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,179,
+ 88, 98,133,119,120, 2,241, 33, 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245, 65,
+155,165,238,231,237, 4, 2, 73,137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26, 79,
+231,140, 67,122,129, 8,151,222,230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,106,
+ 91,135,133, 45,243,127, 1,111,145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29, 50,
+100, 72,101, 14,242,250, 34,245,209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,106,
+225,225,225,161,186,119,239,222,188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,111,
+ 16, 30, 30, 46,123,251,246,109,122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,109,
+160,142, 46,212, 52, 82, 39, 45,109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66, 66,
+ 58,156, 61,123,182,195,220,185,115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229, 80,
+ 0,162,148, 74,229,243,160,160,160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153, 63,
+133,132,132, 44,191,118,237,218,248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,107,
+187,244,226,197,139,191, 92,185,114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,177,
+ 88, 99,114,114,114, 68,159,226,174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63, 63,
+191, 50, 43,163,198, 10,167,221,134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,115,
+188,174,140,205, 4, 82,203, 24, 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,166,
+112,208,110, 84, 49,245,195,202,149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176, 66,
+169,144, 9,105,200,253,241,230,116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,253,
+ 36, 44,172, 81,180,106, 26,126,123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,156,
+ 88,103,230,124, 97, 67, 92,200, 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,181,
+197,130,254, 51, 23, 49,218, 53,114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,101,
+196,237,219,183,123,136, 68, 34, 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,232,
+149, 43, 87, 18,113,113,113, 52,131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,237,
+226,226,226,200, 85,171, 86,117, 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,206,
+108, 14, 87,116,239,222,189,107, 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,127,
+126, 8,167, 90, 68, 13,182,182,182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105, 81,
+105,117,129,232,149,122,212, 58,212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,165,
+249,175, 78,229,162,203, 62,213, 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58, 39,
+ 73,242, 44,128,151, 36, 73,190,174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,214,
+214,147,246, 31, 52, 87,126,156,126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75, 19,
+152,171,222,153,235, 50,238, 98, 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21, 15,
+243,114, 69,165,171, 66,104,104, 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,167,
+245,220,118, 6, 0,213, 71,222,159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117, 1,
+129, 73,208,206, 29, 84,173, 69, 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,201,
+ 0, 10, 42,244,163,178,121,180,225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112, 26,
+ 56, 13,156, 6, 78, 3,103,109,133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,152,
+ 4,107,163,108,175, 25, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,235,
+183,193,172,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,128,
+207, 6, 61,220,193,103,170, 64,254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255, 23,
+160,142,140, 55, 8,173,207, 23,141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,175,
+245, 89, 25, 73,146,235,187,116,233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0, 22,
+ 65, 16,111, 50, 51, 51,215, 43,149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174, 81,
+ 42,149, 55, 63,128,211,204,193,193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150, 93,
+ 40, 82,178, 0,192,220,132,169, 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,105,
+ 37,190, 87, 1, 68,175,250,216,113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,211,
+229, 55,168, 54,210, 94, 23, 78, 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86, 43,
+180,134,185,131,175, 98,130, 25, 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255, 54,
+ 44,167,105, 58,160,220,201, 90, 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192, 88,
+ 61,214,101, 63,108,216,176, 69, 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,150,
+193,251,247,239,183,107,223,190, 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,227,
+173,173,173, 71, 90, 90, 90,110,217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,199,
+ 51, 51, 51,103,232,203,105, 99, 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,169,
+ 83, 29,211,210,210, 98, 51, 51, 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,103,
+ 55,206,247,175,105,154,127, 96,236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,227,
+ 87,207, 26,233,132,205, 71,210,171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,171,
+157,143,143,237,183,119,239, 38,200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,196,
+241,171,137,140,240, 47,190,248,162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,165,
+ 82, 69, 2,120, 1,221,179, 90,179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,233,
+245,235,215,207, 49,153, 76,141, 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,125,
+188, 95, 82,163, 42, 56, 27, 27, 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,205,
+158, 49,248,230,205,155,225, 69, 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84, 84,
+ 4, 71, 71, 71,236,223,191,223,114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63, 55,
+210, 20,148,150,201,100,112,118,118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,178,
+148,114,105,208,225, 93,129, 46, 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,173,
+109,109,109, 67,115,114,114,110, 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18, 61,
+ 5,240,170,182,132, 54,110,126,253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,228,
+ 24,141, 7,232, 22, 36, 64, 17, 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152, 31,
+131,111,120, 3,240, 73, 10,228,209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,185,
+ 67,116,213,167, 90,193,231,137, 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,128,
+131,187, 54,145, 61,251, 15, 41, 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101, 68,
+ 68,196, 83, 0, 39,170, 90, 89,111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9, 0,
+ 61, 27,146,111, 89,214, 13,158,142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210, 73,
+169, 84,242, 0,128,201,100, 74, 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,250,
+237,183,223,162,110,221,186,152, 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,239,
+182,102,114, 76,208,106, 97, 34, 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,111,
+111,191,106,255,254,253,214,198,198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,250,
+ 8, 45, 7, 7,135, 78, 59,119,238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,207,
+156, 57,147,251,226,197, 11, 63,129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,162,
+ 84, 42, 79, 3, 56,253, 17, 94,166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,158,
+203,238,221,187,199,110,222,188,249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7, 72,
+165, 82, 36, 38, 38,154,159, 60,121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177, 83,
+231,161,131,191, 49,115,176,177,128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186, 87,
+172, 47,103,183,110,221, 59,247,232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166, 8,
+197,168,172,231, 87, 75, 62,229,177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,162,
+ 53,107, 22,192,220, 81, 90,246, 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195, 48,
+165, 6,189, 0,174,165,181,181,207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179, 41,
+181, 23,219,255, 82,107, 86,165, 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,180,
+174, 48,187,124,145, 85,128, 27,182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,165,
+191,124,244,235,146,177,215,142,110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,255,
+ 40,167,163,163, 99, 19, 95, 95,223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,142,
+142,142, 77,202,118, 21, 77,235,211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46, 94,
+188,200,220,188,121,243, 58, 0, 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60, 80,
+ 36,161,145, 39, 44,132, 88, 44,129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,167,
+184, 88, 4,153, 76, 14, 46,151,107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2, 66,
+ 40, 20, 66, 38,147,129,197, 98,177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,147,
+205, 93, 32, 51, 43, 84,233, 50,205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,114,
+182, 5,176,206,200,200,232,154,135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,122,
+242,228,201,208, 63,255,252,179,254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235, 31,
+124,240,224, 65,219,142, 29, 59, 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,120,
+ 60,244,232,209, 3, 0,252, 62,132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135, 15,
+161, 84, 42, 49,109,218, 52,238,152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,167,
+239,228, 56,116,237, 29,126,143, 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,246,
+153, 60, 62,192, 44, 70, 64,225,220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,245,
+ 49,218, 15,180,159, 61,123,182,221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,124,
+215,174,147,140, 74,235,197, 86,203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,151,
+145, 52,129, 89, 35,157,202,221, 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,217,
+238, 46,232,115,205,152,153,218,192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31, 1,
+ 0,161,177,200, 31,220, 20, 27,135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,169,
+ 84, 10, 54,155, 13,137, 68,130,119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233, 71,
+225, 92, 60,182, 7,247, 77, 74, 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,121,
+246,236, 25,238,221,187,135,252,252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,182,
+ 85,177,132, 50, 79,202, 84,176, 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113, 91,
+ 83, 77, 69, 30,128, 38,254,254,254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,223,
+191,223,104,222,188,121,184,117,235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,228,
+ 42,170, 76,223, 23, 22, 22,130, 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,196,
+187,172, 18, 20, 22,203, 32, 22, 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68, 65,
+ 84,186, 90, 71,120, 60, 30,148, 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,116,
+ 33, 84, 59,185,255,174, 30, 6,196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,150,
+ 67,127,241, 40,155,246,105,253,179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143, 64,
+ 32,104, 9,253,107, 50, 26,147, 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36, 36,
+116, 59,121,242,228,194,131, 7, 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28, 62,
+124, 24, 15, 31, 62,164,218,182,109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181, 67,
+135, 14, 46, 12, 6, 3, 29, 59,118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,237,
+ 90, 84, 70, 70,134,159, 30,219, 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199, 69,
+218,183,110,221, 26,201,201,201,104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,187,
+119,119,241,243,243, 35, 66, 67, 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30, 61,
+114,135, 14,195,136, 54,110,126,253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,224,
+130,203,102,192,221,179, 13, 35,254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,251,
+239,111, 80,144, 22,171, 74,139,187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,146,
+ 46, 61,242, 19,110, 95,251, 20, 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,184,
+ 15, 0,183, 0,162, 47,208,220,187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,223,
+149, 0,195,214,209,177,199,212,169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,120,
+189,134, 41,251, 3, 28, 7, 71,199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,185,
+ 57,142, 91, 48,113, 0,225,194,183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,208,
+170,136,223, 98,177,220,140,141,250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49, 49,
+ 49,184,126,253, 58, 94,190,124, 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,185,
+216,225, 91, 23, 59,118,102,110, 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,178,
+232, 66, 23, 23,151, 78,135, 14, 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,213,
+171, 87,139,198,143, 31,239,145,146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49, 99,
+ 10,239,223,191,239, 14, 32,235,250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,164,
+195,194,194, 86, 1, 8,124,239,137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20, 82,
+147,222, 32,238,217, 67, 56, 58, 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70, 70,
+242, 93, 93, 93, 81, 92, 92,140,212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,178,
+178,228, 50,153,108,153, 80, 40, 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66, 36,
+ 18,161,168,168,136,184,112,225,194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,161,
+ 73,181, 96, 82, 49,153,204,205,147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,188,
+153, 83,200, 38,239, 29, 0,126,252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,242,
+ 70, 83,167, 78,157, 12, 96,171, 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,219,
+183,111,149,245,235,215,103,250,248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,191,
+ 98,197,138,129,157, 59,119,198,216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,140,
+214,173, 91,215, 99,222,188,121, 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133, 22,
+199,198,198,230,194,225,195,135, 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170, 83,
+167,206,198,179,103,207, 54,172,106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,254,
+251,239,209,162, 69,139,230,237,219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,205,
+135, 15, 31,206,121,240,224, 1, 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12, 26,
+ 52,136,151,148,148,212, 60, 39, 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,199,
+195, 30,241,169,133,136,140, 77,133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,220,
+160,129, 95,153,158,139, 72, 71, 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,173,
+219, 48,252,122, 14,176, 58,125, 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,249,
+161,153, 66,177, 83, 51,175, 55,208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,128,
+154, 82, 5,223, 78,192,117,232,192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167, 25,
+ 51,102, 24,237, 89, 53,253,113,239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,246,
+236,217, 32,228,242,203,101, 2,138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,240,
+230,115, 85, 85, 21, 80,165,143, 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,120,
+254,252, 57,242,243,243, 17, 28, 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,118,
+ 76,169, 68,196,203,206,206, 46, 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104, 23,
+ 34,227,104, 23, 66, 88,162, 48,149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,181,
+107,215,194,203,203, 11,114,185, 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159, 62,
+ 77,244,232,209, 99, 97,101,231,147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45, 70,
+216,156, 66, 94,230, 59,236,219,183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58, 97,
+213,117, 50, 61, 61,125,237,140, 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20, 18,
+202, 8,187,118,238, 38,159, 61,123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,183,
+223, 74, 10, 11, 11, 33,147,201,228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,175,
+ 49,111,222,188,197,190,126,253,186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,215,
+ 46, 7, 31, 31,159,102, 21,134,162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,219,
+153, 3, 7, 14,196,174, 93,187,112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,184,
+117,235, 86, 15, 15, 15, 15,140, 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,117,
+234,236,128,128, 0, 73,131, 6, 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,230,
+205,155,131, 81,250, 64,149, 1,184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,155,
+ 46,235,211,167, 15,194,195,195,209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,235,
+213,171,135, 53,107,214,192,205,205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,225,
+ 66,122,240,224,193,121, 53,125,230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,253,
+251,184,122,245, 42,150, 46, 93,138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,176,
+180, 46,188,151,151, 23,158, 60,121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,141,
+146,246,178,181,182, 64, 86,190, 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27, 30,
+ 92, 92,234,130,166, 41, 47,157, 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,130,
+196,187, 41,114,169,100,202,227, 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,142,
+185,250,243, 50, 34,108,255, 98, 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,102,
+ 38, 21, 48,108, 88,222,218,192,192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,192,
+ 1,112, 25,240,205, 55, 93,150, 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,192,
+ 91,195,123,249,242,101, 90, 12, 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,201,
+ 91,151, 45, 20,244, 23,255,161, 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,134,
+255,162,208,210, 64,161, 40, 29, 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,182,
+108,217,130, 87,175, 94,129,205,102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,155,
+ 49,126,252,120,250,222,189,123, 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,222,
+ 64, 42, 42,192,154,245, 27, 81,162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,244,
+171,166,159,247, 51, 51, 51,247, 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,109,
+179,112,119,119, 31,200,100, 50,187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235, 95,
+175, 94, 61,171, 13, 63,110, 33, 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,153,
+ 29,106, 18, 89, 71,142, 28, 25, 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157, 60,
+113,226, 68,209,252,249,243,173,131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,230,
+204,153, 71, 82,169, 20,195,135, 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,181,
+ 6,176, 5,165, 67,185, 52,128,100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,192,
+219,113,196,136, 17, 30, 20, 69,225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,160,
+207,141,156,205,229,114, 79,173, 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,214,
+ 53,160, 51,184, 92,238,190,159,126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,141,
+ 93,187,118, 13,228,112, 56,122,149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,132,
+167,167,103,161,151,151, 87, 27,165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,191,
+126, 96, 48, 24, 58, 11, 45, 6,131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96, 98,
+ 98, 2, 35, 35, 35,144, 36,169, 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25, 96,
+ 49, 9,128,166, 96,105,194, 2,143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,142,
+ 76,149,145,145, 17,135,176, 53,231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83, 88,
+ 92,140,193,131, 7,231, 37, 61,122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243, 95,
+ 3,165,206,241, 28, 39,167, 97,219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,136,
+213,120,220,217,108, 71, 13,175, 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21, 21,
+ 39,248, 54, 60, 21, 95,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,
+244,161,156,149,137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0, 0,
+107, 83,166, 80,174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67,
+ 68, 72, 72,136,213,136, 17, 35, 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,
+165, 41, 51,170,204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,
+105,180, 93,146, 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5,
+ 5,225,175, 94,189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,
+108, 76,159, 62,221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38,
+ 38,109, 35, 34, 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,
+163, 64, 32,232, 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124, 14,
+192,107,254,252,249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,
+243,243,183, 1, 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,135,
+ 15, 31,142, 75,151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,207,
+ 63,247, 1, 80,157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,
+119,111,172, 95,191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,
+153, 63,127,254,249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,
+193,207,207, 15,243,230,205, 83, 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166,
+ 9,179,103,207,206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53,
+ 34, 34,226,118,163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159,
+ 94,102, 98, 98,162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205,
+ 70,102,102, 38,180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,
+200, 16,160,101, 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94,
+ 54, 17,127,100,135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,167,
+ 56, 64,167,222, 33,165,171, 27,239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,
+216,218, 34, 32, 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,
+224, 17,180, 96,129,141,189,163, 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21,
+ 48, 48,107,254, 0, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62,
+ 43,117,170, 54,174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37,
+ 37, 37,110,194,132, 9,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,
+142, 29, 59, 20, 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,
+145, 72,212,234,249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,
+104,156,156,156,220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,
+252, 98, 70, 70,134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,
+236,108,100,103,103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,
+100, 20, 40, 16,189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244,
+ 29, 54,108,152, 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231,
+ 19, 3,192,140, 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,
+204, 67, 21,153,160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,
+241,120,109,107,104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,176,
+ 87,175, 94,207,110,220,184,209,182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,138,
+220,221,221,113,235,214, 45,143,145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,232,
+147, 39, 79, 6, 0,184,162,158,119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100, 34,
+145, 72,168, 82,169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63,
+ 79, 3, 8, 3, 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,
+244,168,212,194,194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14,
+ 28,144, 20, 21, 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,
+164,163,117,211,186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,
+204,216,104,220,196, 19, 35, 39,204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184,
+ 20,118, 38, 95, 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,
+130,193,240,232,251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,
+148, 64,147,175,190,250, 10,217, 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8, 2,
+ 40, 4, 0,130,137,190,237,188, 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,228,
+204,155, 55, 15, 92, 46, 23,124, 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218, 55,
+ 60, 64, 58, 96,218,122, 74,170,160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,252,
+ 12,208, 78,157, 19,171, 29,128,252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,207,
+ 51,150, 44,156, 39, 76, 77, 77, 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58, 58,
+ 58, 26, 0, 16, 25, 25,137,177, 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,228,
+ 87, 88, 88,136,244,244,116,200,100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198, 32,
+148,197,101, 34, 43, 59, 59, 91,243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149, 74,
+ 85,213,131,140, 74, 75, 75,187,124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,153,
+119, 53,109, 55,109,218,148,135,247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32, 16,
+ 8, 22,225,175, 92, 60, 84, 78, 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,161,
+157,157,157, 51,147,201, 68, 84, 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91, 91,
+ 55, 52, 51, 51, 67, 90, 90, 26,160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,193,
+129, 3, 7,152, 47, 94,188, 64,247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175, 94,
+189,138,141, 27, 55, 18, 45, 90,180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,133,
+ 38,199,118,237,218, 53,107,239,222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,189,
+210,169,226,129,142,237,187,249,248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,254,
+253,244,233,211, 24, 53,106, 20, 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,174,
+232,215,175, 31, 2, 2, 2,208,188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,155,
+231, 19, 19,255,199,222,121,135, 55, 85,253,127,252,125,179,119,210,180,105,210, 69, 75, 89,157,172, 2,101,143, 66, 41, 83,150,
+ 40, 34,130, 56, 0, 25,162,130,226, 96, 8,178,100, 15, 89, 21, 20, 68, 80, 64, 4,164, 44, 21,191, 32,155, 22, 40, 5,218, 2,
+221, 51,233, 94, 73,155,117,207,239, 15, 90,126,165,118, 36, 45, 78,238,235,121,238,147,228,220,220,119,206, 93,231,190,243, 57,
+ 43,254,226,141,171,231,205, 28, 54, 11,158,174,142, 24, 29,218, 17,111,140,237,137, 78,126,238, 72,209, 25,112,246,236,207,230,
+164,164,132,203,182,244, 56,172,210,140,189, 27,125,233,206,141, 11, 22, 46,135,130,159,111, 27,204,255,248, 3,229,178, 69,243,
+ 28,218,180,244, 68,116, 98, 17,126, 62,115,210,156,153,158,246,219,223,213,227,240, 28,192,147, 10, 40, 9,155,197,130,149, 37,
+ 40, 99, 87,118,164,105, 27, 16,224,163,113,113, 65, 68, 68, 4, 88,118,244, 8, 61, 7,240,164,210, 71,181,224,165,165,165,168,
+210,107,229,235,235,235,233,229,133, 19, 17, 17, 96,211,244,189,190,118, 14, 48, 26,247,168, 26,250,177, 46, 5,148, 79,111, 6,
+ 89,171,102,106, 95,165, 66,130,171,209, 15, 80, 97, 38,215,190, 45,192,223, 58, 30,217,159,200, 20, 52,178,234,112,245,246,237,
+219,131,119,238,220, 57,240,189,247,222,147, 78,154, 52, 9, 66,161, 16,122,189, 30, 30, 30, 30,176, 90,173, 56,117,234, 20, 34,
+ 35, 35, 75,105,154,254, 25,127, 28, 54, 32, 20,213,122,105,156, 78,128,232,145,223,210, 7, 31,125,225,133,167,162, 9, 0,210,
+ 7,180, 60,175,185,113,239,166,131, 23,198,236, 59,125,131,122,103,124, 95, 86, 39,223,102, 0, 0,141, 70, 3,185, 92,110,183,
+230, 83,224, 79,215,172, 94,173,155,157,157, 29,151,157,157,173,123,243,205, 55,253,170, 26,190, 11, 4,130,242,202, 72, 86, 65,
+109,219,216,144, 79, 19,128,233, 59,119,238, 60, 86, 84, 84,116,250,253,247,223,199,178,101,203,240,211, 79, 63,245, 6,112,177,
+145,251,110, 45, 40, 40, 40,188,118,237,154,166,181,127, 16, 90,168,185,232,179,224, 62, 8, 33,112, 18, 19,148, 20,230,227,230,
+205, 27, 40, 41, 41,185,106, 79, 62, 77, 38, 83,161, 78,167, 83,169,213,106,228,231,231, 35, 55, 55,247,177,201, 42, 40, 40, 64,
+126,126, 62,161,168, 63,140,217, 82,159,102,153, 78,167,211,199,198,198,242, 53,205, 90,163,165,154,135,174, 31,199, 1,132,192,
+211,145,133,146,226, 66, 92,190,124, 25, 69, 69, 69,255,171, 75,147,166,233, 57, 19, 38, 76, 96, 3,152,248,254,251,239, 59, 2,
+232,240,193, 7, 31,252,140, 26, 61, 11, 57, 28,206,250,189,123,247,182,173,170, 98,156, 55,111,222, 58, 0, 59,255,170,107,201,
+201,201,105, 78, 68, 68,132,204,100, 50, 97,211,166, 77, 88,183,110,221, 46,252,113,160,202,136, 47,190,248, 98, 11,139,197,154,
+ 49,115,230, 76, 76,157, 58, 85,220,185,115,231,247,178,178,178,190,173, 77, 51, 35, 35, 99,126,167, 78,157, 22,234,116,186,229,
+ 54,153,229,251,247,167,116,234,212,105,190, 78,167, 91, 85,223, 57,146, 72, 36, 18,171,213,138,164,164,164, 2,160,206,246, 29,
+229, 73, 73, 73, 25, 86,171,213, 67, 44, 22, 59, 54,116,125, 22, 20, 20, 44,239,220,185,243,167, 90,173,246, 12,128,165,181, 24,
+242, 91, 89, 89, 89,129,179,103,207,158,181,114,229,202, 49,217,217,217,223, 53,164,153,146,146,178, 60, 36, 36,100, 65,124,124,
+252,110,212, 93, 5,252,197,226,197,139, 77,123,247,238,125, 43, 41, 41,105, 69, 3,154,199,115,115,115,143,219,113,126,235,250,
+254, 99, 77, 54,155,253,193,202,149, 43, 89,219,183,111, 7, 33,100,141,213,106,173, 43,159,209, 71,142, 28,217,211,179,103,207,
+ 73, 7, 15, 30, 20, 6, 6, 6, 78,173,168,168,216,223,208,245,169,215,235, 15, 31, 60,120,112, 76,116,116,180,199,164, 73,147,
+132, 62, 62, 62, 48,153, 76,200,202,202,194,246,237,219,203, 99, 98, 98,210, 11, 11, 11, 15,219, 83,134, 88,140,197,227, 47,157,
+ 61,186, 63,249,126, 76,247,126,131, 71, 42,141, 38, 15, 8,242,216, 40,204,203,198,169,227,135, 11,146,146, 18, 46,235,245,133,
+227,237,209, 52, 85, 20,189,116,249,183, 99,223,165, 39,197,118,235, 19, 50, 84, 89,110,244,130,128,199, 66,158, 54, 3,167, 34,
+142,230, 39, 37, 37,254, 94,110,174,120,245,239, 42,231,217,222, 88,202,206,142,124,115,218,115, 29, 33, 82,122,220,228, 2,155,
+122, 2, 34,149, 70,195,171,188,119, 32,125,212,230,209, 38, 77, 45,192,111, 93, 89, 75,165,215,235,193, 5,140,147, 1,174,179,
+179,179, 8, 0,226,227,227, 33,126, 84,171, 97, 87, 62, 75, 1,137,184,154, 46, 11,208,231,113,224,222, 74, 46,161, 0, 32, 61,
+ 59, 15, 70,115,189,207,141,127, 59,225,213, 12, 87,120, 99, 4,120, 0, 66,165, 82,233,178,133, 11, 23,174,185,122,245,234,154,
+225,195,135,175, 17, 8, 4,203, 42, 15, 54,175,158, 19,241,151,105,118,113,131, 99, 72, 75,234,124, 88, 43,138,158,214, 91,105,
+125,181,171,196,216,191,127,255, 45, 77,204,103, 83,110,150, 63, 83,243,168,217,108, 38,120, 84,109,119, 20,117, 87, 9,126, 84,
+109,125,118,106,106, 42,169,124,111, 79, 62, 85,227,198,141,163, 75, 74, 74,200,139, 47,190, 72,208,240, 20, 62,245,106, 10, 4,
+130,144, 62,125,250,152,181, 57,249, 36, 46, 49,131, 92,137,186, 75, 78,159,189, 68,190, 59, 28, 65, 54,111,217, 65,218,183,111,
+111, 4,224,101,143, 38,135,195,233, 31, 18, 18,146,167,213,106, 73,108,108, 44, 57,127,254, 60, 57,116,232, 16,217,177, 99, 7,
+217,182,109, 27,105,214,172,153, 22,128,198, 30, 77,145, 72, 52,114,200,144, 33,230,194, 98, 61, 73,202,200, 35,183, 99,147,200,
+197,107,183,201,169,179, 23,201,183,251, 15,146,128,128,128,114, 27, 52,217,108, 54,123,243,119,223,125, 87, 76, 8, 33, 35, 71,
+142, 76,199,147, 3,169,182,152, 51,103,142,142, 16, 66, 86,173, 90,149,135,218, 27,194,255,217,215,210, 96,119,119,247, 56, 30,
+143, 23, 1, 96, 98, 3,219,189,196,225,112,126,114,113,113,185, 14, 96,244,223,112, 31, 13, 87,171,213, 87, 0, 52, 52,195, 65,
+213,247, 70,253, 71,238,247, 63, 67,179, 63,135,195, 57, 15,212, 63,137,112,181,242,250, 51, 54,155,125, 2,192, 0, 59,243,217,
+ 70,165, 82,189,168, 84, 42,223, 81, 42,149,239,168,213,234, 23,249,124,126,155,166,236,187, 83,155,208,231, 60,131, 70, 28,105,
+214, 97, 88,138,103,199,225, 41,222,157, 70, 30,113,106, 19,250, 92, 83, 53,189, 58,141, 60,234,217,113,120,170,103,199,231,146,
+ 91,116, 25,121, 68,229, 27, 58,228,239, 60, 71, 19,221,225, 54,176, 5, 44,228,252, 2, 66,206, 47, 32,161, 45, 64,119,119, 64,
+ 64, 48, 32, 27, 20, 26,186,150, 88,173,107,199,140, 26,181,182, 53,224, 68, 0,118,205,165, 54,205, 32, 64,254,120,219,145, 35,
+215,182, 4, 84, 3, 1,113,223,222,189,215, 16,171,117,237,132,151, 94, 90,235, 9,184,212,166, 87,151, 38, 1,216,238,128, 91,
+117, 93, 21,208,106,172, 55, 2, 63,122,206,155,144,243, 11,200,226, 23,124, 72, 39, 13, 38, 54,160, 89, 87,164,232, 95, 29,209,
+178, 23, 73,101,225,186,162,242, 85,242, 20, 46,194,167,174,217,205, 21, 62,161,173,168,216,161,190,156,124, 60,234,146, 44,249,
+ 15, 22,146,187,141, 70, 35, 41, 47, 47, 39,122,189,158,148,150,150,214, 52, 80,143, 13, 89,102,102, 38, 73, 79, 79, 39,169,169,
+169, 36, 57, 57,153,224,255,219,222,216,156, 79,185, 92,190,243,133, 23, 94,176,114,185,220,205, 79, 99,223, 29, 29, 29, 87,116,
+237,218,213,180,113,227, 70,114,228,200, 17,242,229,151, 95,146,153, 51,103,146,182,109,219, 86, 56, 56, 56,140,111,140,166,139,
+139,203,124, 95, 95,223,188, 93,187,118,145,111,191,253,150,108,216,176,129,124,242,201, 39, 86, 15, 15,143,108,153, 76, 54,168,
+ 49,154,106,181, 58,188, 87,175, 94,166,240,240,112,242,243,207, 63,147,125,251,246,145, 57,115,230, 16, 63, 63,191, 10,137, 68,
+242,188,141,154,108, 14,135,179,118,218,180,105,217,110,110,110, 17, 53,214,137, 3, 2, 2,174, 79,152, 48, 33, 19,192,188,255,
+208,245,201,104, 50,154,140,230,159, 96,180, 94,118,131, 59, 1,216, 98, 30,239,165,190,189,123,175,225, 1, 47,217,107,138,132,
+108,246,216,158, 93,187,174,225, 1,227,171,190, 43,100,179,199,246,237,221,123, 13,151,205,126,165, 46,189,250, 52, 9,192,230,
+113, 56,243,122,118,239,190,150, 3,124, 92,149,214,191, 5,117,111,206,224,102,164,183, 23,245,224, 21, 53,196,255, 97,163,245,
+212,225,252, 9, 23,225,191, 69,243,159,114, 83,183,174, 52, 76, 71,237,136,104, 29,197,163, 89,212, 91, 55, 50,159,162,167,188,
+239,237, 84, 42,213,201,214,173, 91,231, 52,111,222, 60, 83,169, 84,238, 7,224,209, 68,205, 64, 23, 23,151,111, 52, 26,205,125,
+ 87, 87,215,104,149, 74,181, 30,143, 70,157,111,180, 38,151,203,237,170,209,104,254,231,237,237, 93,232,229,229,165, 85,169, 84,
+223,213, 18,201,178, 69,211, 21,181, 23, 42,188,202,117,204, 67,135,209,100, 52, 25,205, 39, 12, 76, 88, 75,172, 28,216, 2,150,
+129, 45, 96, 13,243,198,250,234, 6,101, 56, 32,106,172, 41,122, 21, 16,212,252,126, 67,122, 13,105, 18,128,221, 3,144,214,220,
+102,168, 7, 2,108,212,252,183, 71,180,170,202,121,251,134,119,168, 3,203,159,144,201,127,139,230, 63,133, 7,168,167, 49,114,
+ 53, 86, 60,197,223, 52, 60,229,125,184,157,155,155, 59, 36, 55,247,169,246, 77,184,147,157,157, 61,241,105, 10,154,205,230,171,
+ 90,173,182,223, 83,144,170,171,235,181, 9, 54,118,203,102, 96, 96,120,118,160, 0, 43, 18,240, 97,104, 27,108,226, 88,193, 58,
+149,136,140, 26, 93,242, 12, 84, 99, 52, 31, 97,221, 93, 75, 25, 79, 53, 54,159,255, 79,233, 31, 52,210,113,151,122,118, 78, 91,
+ 22, 30,181,209,106,178,209, 98, 96, 96, 96, 96, 96, 96,248, 11,248,229, 62,243, 71,236, 95, 64, 4,158,140,190, 69, 84, 51,162,
+117,134, 62,237,233, 73,209,152,240,233, 47,140, 38,163,201,104, 50,154,140, 38,163,201,104, 62,115,154, 85,212, 53,119,106, 92,
+141,207,141,234,197,247,172,192,212,179, 51,154,140, 38,163,201,104, 50,154,140, 38,163,249, 95,167,209,227,104, 49, 48, 48, 48,
+ 48, 48, 48, 48, 48,212, 79,157, 81, 55,198,104, 49, 48, 48, 48, 48, 48, 48, 48, 52, 13, 87, 60,154,162, 42, 2,255, 63, 85, 85,
+ 56,208,240, 20, 60, 79,176,114,229, 74, 86,235,214,173,165,124, 62,191,109, 66, 66, 2,107,250,244,233, 77,238, 72,176,102,253,
+102,150,151,151,151, 20, 64,219,188,130, 18,214,107,111,188, 79, 49,231,139,129,129,129,129,129,129,225, 95,196,176, 74, 99, 85,
+245,250, 56,194,101,151,209, 90,186,116, 41, 82, 83, 83, 37, 0,198, 5, 6, 6,242,183,110,221, 74, 14, 28, 56,208, 36, 99,244,
+241,188, 57, 72, 73, 73,145, 0, 24,167, 86, 57,240,191,218,185,154, 28,252,233,194, 83, 55, 91, 42,149,202,233,175,220,142,129,
+129,129,129,129,129,225,153, 98, 74,181,215, 41,141, 50, 90, 28, 14,135,205,231,243, 91,178, 88,172, 33, 66,161,176, 11, 0, 84,
+ 78,201,210,104, 56, 28, 14,155, 47, 16,180,100,179,217, 67, 4,130, 71,154, 47, 60,215,171,169,154, 3, 36, 18, 73,154, 88, 44,
+142, 4, 32,146,201,100, 55, 76, 38,211, 93,153, 76,118,201, 30, 29,153, 76,118,169,114,187, 27, 0, 68, 98,177, 56, 82, 34,145,
+164,113, 56,156, 1,204,245,196,192,192,192,192,192,192, 80, 73,120, 45,203, 31, 57,126,252,120,157, 6,135,207,231,179, 2, 3,
+ 3,123,121,121,121, 93,244,247,247, 55,122,120,120, 28, 18,139,197,146, 38,102,140,213,218,199,175,151,155,171,230, 98,199,150,
+174, 70,181, 90,125,136,203,229, 54, 69,147, 45,147,201, 54,132,133,133, 21, 93,188,120,145,200,229,114, 45, 0, 7,103,103,231,
+ 76, 66, 8,113,113,113,161,237, 17,115,113,113,161, 9, 33,196,217,217, 57, 19,128,131, 92, 46,215, 94,188,120,145,132,133,133,
+ 21,201,100,178, 13,104,120, 68, 91, 6, 6, 6, 6, 6, 6, 6, 59,168,207,139,252,131,169,138, 98,185, 54,122,231,248,124,126,
+144, 74,165,138,121,247,221,119,173,225,225,225,196,203,203,235,154, 90,173,238,174, 82,169,158,104, 80, 63,121,242,100,123,170,
+253,130,100,114, 69,204,238,217,131,173,134,175, 70, 18,119, 87,245, 53, 7, 7,135,238,114,185,252, 9,205, 9,175, 77,181, 69,
+211,142,216, 78, 12, 0, 0, 32, 0, 73, 68, 65, 84, 77,161, 80, 68,175, 92,185,178,188,176,176,144, 16, 66,136, 66,161,208, 2,
+ 80,106, 52,154,204,196,196, 68,162, 82,169, 8,108,143,226,177, 84, 42, 21, 73, 76, 76, 36, 26,141, 38, 19,128, 82,161, 80,104,
+ 9, 33,164,176,176,144,172, 92,185,178, 92,161, 80, 68, 3,112, 99,110, 11, 6, 6, 6, 6, 6,134,103,218,104,213, 52, 92,182,
+ 85, 29,118,233,210, 69,160,209,104,186,203,100,178, 81, 82,169,116,203,136, 17, 35, 2,199,140, 25,195,170,168,168,176, 6, 6,
+ 6,186,121,123,123,207, 82, 42,149, 19,133, 66, 97,123, 62,159,255,138, 92, 46,119,221,191,127,127,235,250, 52,219,117,232, 44,
+112,112, 80,118,231,243, 5,163,164, 82,217,150,105, 99,251, 7, 78,124,239,121, 22,207,152,108,237,223,222,211,173,109, 75,215,
+ 89, 46, 74,201, 68, 14,155,213,158,162,168, 87,132, 66,161,235,183, 95,237,104,221,192,142,181,116,115,115,187,177,127,255,254,
+182,227,198,141, 19,196,198,198, 2, 0,172, 86, 43, 31,128,153,205,102, 67, 32, 16,192,100, 50, 21, 0,176,245, 4, 18,147,201,
+ 84, 32, 16, 8,192,102,179, 1,192, 92,169,135,216,216, 88,140, 27, 55, 78,176,127,255,254,182,110,110,110, 55, 0,180,100,110,
+ 13, 6, 6, 6, 6, 6,134,103,150, 42,115, 21,129, 26, 85,135,156, 42,247, 56,124,248,240, 39,162, 70,124, 62,127,107,124,124,
+124, 79, 71, 71,199,150, 92, 46,215,250,210, 75, 47, 9, 38, 76,152,128,156,156, 28,186,180,180,148, 29, 20, 20,164,185,126,253,
+250, 16,139,197,210,219,193,193, 65, 95, 88, 88,168,170,168,168,120, 0, 96, 86, 61, 25,217,122, 63, 46,166,167,147,210,177, 37,
+159,203,182,206,124,125,130,224,227,121,131, 65, 85, 68,209, 86, 93, 30,251,179, 78, 14,154,245,151,202,134,196,155,172,189,203,
+ 20, 66,125,118, 81, 69,131,154, 42,149,170, 19,143,199,139, 60,121,242, 36,196, 98, 49,138,138,138,192,231,243, 1, 0,165,165,
+165, 10, 0, 28,138,162,192,231,243, 81, 92, 92,172,180,231,168, 21, 23, 23, 43,249,124, 62, 40,138, 2, 0, 78,165, 30,248,124,
+ 62,138,138,138,208,186,117,107,234,228,201,147,234, 33, 67,134, 60, 52,153, 76,157,115,115,115,163,152,107,141,129,129,129,129,
+129,193,126,106,243, 34,255, 34, 26, 28, 71,171, 95,101,168,174,250,196,185,123,156,157,157, 93,164, 82,169,255,148, 41, 83, 88,
+ 42,149, 10,145,145,145,116, 89, 89, 25,139,203,229,130,203,229,178,251,247,239, 47,181, 88, 44,226, 19, 39, 78, 80, 15, 31, 62,
+204, 49,155,205,159,229,229,229, 93,175, 39, 35,123, 90, 57, 8, 92, 68, 14,124,255,159,222,239,195,114,110,157, 7,156, 94, 76,
+147, 82, 29,139, 67, 19,168, 36, 52,123,109,111, 74,154,173,240, 22,207,252, 46,135,250,253, 97, 97,142,217,108,254,172,164,164,
+164, 62,205, 12, 0,168,204, 19,228,114, 57,172,214,234,243, 91,130,176, 88, 44, 8, 4,130, 70, 29, 57,129, 64, 0, 22,139, 5,
+ 84,139,132, 41, 20, 10,176,217,108,176, 88, 44,112,185,220, 39,242,193,192,192,192,192,192,192,208, 40,106,243, 34,255, 22,170,
+143,163,101,219,220,148, 26,141,134,146,203,229,174, 29, 58,116,248, 52, 44, 44, 44,113,244,232,209,250,141, 27, 55,146,117,235,
+214,145,181,107,215,146, 93,187,118, 89,127,251,237, 55,243, 27,111,188, 81,222,166, 77,155, 7, 91,182,108,241, 7,128,161, 67,
+135,214, 89, 29,233,160,116,164,164,124,142,107,128,127,187, 79, 95,238,215, 54,113,193, 40, 31,189,105,119, 16,161, 23, 54, 35,
+214,205,222,196,122,112,128,149,196,175, 54, 47,127,115, 64,121,115,175,230, 15,182,237,250,222, 31, 0, 66,195,134,214, 91,197,
+169, 82,169,186,120,120,120,104,207,156, 57, 67, 23, 20, 20,144,188,188,188,170, 54, 90,133, 0, 20, 94, 94, 94,153, 22,139,133,
+ 40,149,202,124,123,142,154, 82,169,204,183, 88, 44,196,203,203, 43,243,145,191, 82, 20, 18, 66, 72, 94, 94, 30, 41, 40, 40, 32,
+103,206,156,161, 61, 60, 60,180, 42,149,170, 11,115,127, 48, 48, 48, 48, 48, 48, 60,179, 76,169,241,218, 48, 61,123,246,164,228,
+114, 57,171, 93,187,118, 82, 55, 55,183,110,110,110,110, 87,215,175, 95, 79,214,173, 91,103,217,190,125, 59,249,230,155,111, 44,
+175,190,250,106,177, 68, 34,137,224,243,249, 74, 0,240,246,246,174, 55,228,215,165, 91,119, 74, 36, 20,176,124,125, 3,164, 42,
+ 39,167,110,206, 78,142, 87, 77,235,218, 18,178,216,221, 66,118,118, 36,228,224, 96,203,234, 23,131,139,185, 92, 94, 4, 0, 37,
+ 0,120,184,185,218, 26, 70,116, 83,171,213,209,139, 23, 47, 46, 51,153, 76,164,178,151,161, 22,128,131,151,151, 87, 38, 33,132,
+120,120,120,164, 1, 80,217,168,167,242,240,240, 72, 35,132, 84, 25, 45, 7, 23, 23, 23, 45, 33,132,152, 76, 38,178,120,241,226,
+ 50,181, 90,205, 52,134,103, 96, 96, 96, 96, 96, 96,168,115,174,195, 58, 35, 69, 23, 47, 94, 36,197,197,197,116, 70, 70,134,181,
+180,180, 84, 30, 20, 20,164,100,179,217,208,104, 52,108, 54,155, 77,151,149,149,177, 85, 42, 85, 38,151,203,253,214,104, 52, 22,
+140, 26, 53,138, 74, 74, 74,170,183,161,249,245, 43,151,137,161,188,130, 78, 79, 79,179,234, 75,139,229, 19,219, 59, 42, 57, 22,
+ 19,232,160,158,236, 98, 81, 27,154, 54, 20,176,253, 92, 5,153, 60, 30,247, 91, 0, 5,163,135, 15,163,210, 51,179,108,109,188,
+158,169,211,233,130,182,110,221,186,179, 79,159, 62, 5,122,189,190,170,109, 85,205, 33, 24, 28,108,212,171,249, 61, 54, 69, 81,
+208,235,245,232,211,167, 79,193,214,173, 91,119,234,116,186, 32, 0,153,204,245,197,192,192,192,192,192,240, 76, 83,231, 56, 90,
+ 13, 14,117,160,215,235,149, 60, 30, 47, 52, 56, 56,184,121, 89, 89, 25,189,116,233,210,180,141, 27, 55,238,125,240,224,129,217,
+193,193,161,165, 72, 36,122,103,220,184,113,170, 35, 71,142,144,222,189,123,215,140, 62,213, 58,187,183,193, 80,170, 20,240,184,
+161,239,116,149, 53, 79, 51, 41,105,255,119,174,165,245, 93,120,105,239,143,119, 56,230,118,142,134,150,142,124,234,157,113,227,
+ 94, 84,253,120, 60,130,116,239,222,205, 38,205, 74,172, 58,157,238,157,200,200,200, 23, 91,180,104,145,110, 54,155,211, 1,228,
+ 25, 12, 6,173,155,155,155,206,100, 50,165, 3, 48,213,178, 93,109,154, 38,147,201,148,238,230,230,166, 51, 24, 12, 90, 0,121,
+102,179, 57,189, 69,139, 22,233,145,145,145, 47,234,116,186,119, 0, 88,235,201, 11, 51,171, 59,163,201,104, 50,154,140, 38,163,
+201,104, 62, 59,252, 33,154, 5,216, 48,169,180, 64, 32,232,227,233,233,217,235,206,157, 59,214,203,151, 47, 23,177, 88,172,109,
+ 67,135, 14, 61,116,248,240,225,174,142,142,142,234,102,205,154,105,126,253,245,215, 16, 0, 7,126,255,253,119,155,162, 79, 34,
+ 1,175, 79, 71, 15, 69,175,240, 91,196,250, 85,228,253, 34, 43, 91,176,173,255,243,207, 31,122,123,239,190,174,110, 42,153,186,
+163,171, 92,115,226,196,169, 16, 0, 7, 46, 95,190, 98,247,120, 26, 22,139,229, 87,157, 78,215,172,234,115, 78, 78, 78,144, 74,
+165,242,199,163,232, 83,145,141, 50, 41, 52, 77, 15,165,105,218, 45, 55, 55,247, 30, 0,228,230,230,118,102,174, 35, 6, 6, 6,
+ 6, 6, 6,134, 90, 76, 86,120,109,159,235,141,104,241,249,124,119, 54,155, 29,144,158,158,158,114,226,196,137, 59, 93,186,116,
+ 25,146,146,146,178,146, 16,146, 44, 22,139,167,164,165,165,221, 79, 75, 75, 51, 26, 12,134,105,118,100,198, 29, 44, 94, 64,100,
+166, 33,229,243, 95,239,222,105,215,125,208,144,236,236,204,149, 86, 66,146,249, 98,249,148,248,212,156,251, 87,116, 21,198,242,
+114,187, 52, 27, 36, 55, 55,247, 94,110,110,110,145,157,219, 20, 85,153, 44, 6, 6, 6, 6, 6, 6, 6, 6,123,105, 40,162,101,
+178, 90,173,171, 43, 42, 42,148, 63,254,248, 99, 70, 88, 88, 88, 5, 0,108,221,186,149,126,253,245,215, 47, 36, 36, 36, 12,184,
+119,239,222, 16, 23, 23,151,179, 0,168,196,196, 68, 91,162, 79, 38,154,182,174, 54, 26, 43,148,191,254, 22,149,209,167, 87,187,
+ 10, 0,216,254,197, 38,250,165, 41,179, 47, 36,196,222, 25, 16, 31,115, 99,136,139,139,203, 89,171,133, 67,101,101, 39, 19,230,
+ 52, 49, 48, 48, 48, 48, 48, 48,252,131, 9,199,147, 85,134,225, 54, 25, 45,163,209,152, 99, 52, 26, 1,160, 32, 44, 44,236,137,
+117,187,118,237, 34, 0,202, 0, 28,204,203,203,179, 39, 51, 57, 6,131, 1, 0, 10,250,244,106,247,196,138,239,194, 55, 62,214,
+ 44, 45, 41,102, 78, 27, 3, 3, 3, 3, 3, 3,195,191,201,108,253, 1, 22,115, 92, 24, 24, 24, 24, 24, 24, 24, 24,154,196,148,
+186, 62, 83,168,187,231,192, 47,118,252, 64, 99,122, 31,252,194,104, 50,154,140, 38,163,201,104, 50,154,140,230, 51,167,217,144,
+246, 47,248,247, 81,103, 99,248, 63, 27,166,235, 43,163,201,104, 50,154,140, 38,163,201,104, 50,154,255,117, 92,241,228,240, 14,
+174, 85, 43, 56,204,177, 97, 96,248,119, 67, 14,130,141, 2, 95,111, 16,226, 6, 54, 63, 11, 89,183, 19,168, 79, 65, 55, 89, 83,
+ 27,224, 5,145, 89, 3,139, 48, 7,218,232,196,166,106, 50, 48, 48,252,247,112,233, 49,125, 52,197, 98,111,163, 8, 13,131, 54,
+ 86,192, 51, 36,139,117, 89, 41,207,162,183,200, 66, 29, 17, 44,198,104, 49, 48,252,219,201,241,243, 1, 7, 43,192,130, 43,136,
+233, 33,156, 3, 86, 0,119, 99,154,172,201,163,151,194,202,242, 0, 49,197, 67,237,187, 18,136,187,203, 28,236,255, 30,179,102,
+190, 69,238,197, 92, 69,106,106, 38, 90,182,114,133,143, 95, 15,108,220,180,133, 98,142, 12,131,109,255,202,168,240,208,231, 38,
+ 56,138,196, 50, 0, 0,109, 49, 99,215,123, 29,127,182, 88, 44,123, 0, 28, 1, 96,120,214, 15,209, 95,222, 24,158,203,229,106,
+ 1,208, 66,161,240, 48,170,133,214, 24, 24,254, 4, 92, 43,175, 51,186,242,186,179, 7, 41,135,195, 89, 40, 22,139,127, 19, 8,
+ 4, 58,129, 64,160,147, 72, 36,191,113, 56,156,133, 0,164,255,152, 50,238,155,182, 98,176,172, 67,140,102,218,253,212,237, 66,
+181,190,194,234, 3,150,101, 40,217,213, 70,218, 36, 77, 14, 21, 86,110,162, 61,191,189,166,215,148, 25, 45,254, 32,104,146,102,
+ 53, 28,120, 60,222, 41,216, 62,231, 40,195,159, 76, 74, 98, 12, 78, 28, 95,139,165, 75, 38,225,235,240,105,136,187,119,165, 73,
+122,254, 64,231,206, 28,206, 92, 63,160, 63, 30,181, 3,102,248, 47, 67,145, 41,191,252,244,109,206, 79,251,191,200,249,126,237,
+ 52,114,116,197,112,108,218,180, 41,116,210,164, 73,223,122,122,122,230, 0,120,129, 49, 90,127, 49,102,179, 89,157,155,155, 75,
+237,217,179,103,132, 66,161,120,200,225,112, 62, 2,192,123, 86, 14,184, 84, 42,189, 36,151,203,181, 10,133, 66, 43,151,203,111,
+ 52,148,254, 31,197,199,217,217, 57,197,209,209, 49,190,122,162,115,251,209, 61, 90,247,156,184,200, 41, 96,100,223, 38,234,243,
+ 56, 28,206, 71, 10,133,226,225,158, 61,123, 70,100,100,100, 80,102,179, 89,109,199,246,125,148, 74,229,189,171, 87,175, 46,200,
+205,205,237,155,118,101,151,115,246,213, 29,206, 41,255, 91,219, 47,242,196,230, 5, 14, 14,138,187, 0,250,252, 35,142,100, 57,
+173, 1,139, 29,114, 39, 75, 47,206, 42, 54,107,162,146,245, 50,128,221, 15,198, 38,252,137, 41,162, 53, 0,233,127, 43,221, 32,
+185,148,239,172,249, 61,161, 66, 14, 22, 43, 4,229,148, 75,147, 11, 28, 22,235, 45,154,166, 7,242,120,188,119,152, 39,212, 63,
+ 3,129,128, 7, 16, 2,169, 68, 8,128,128,213, 68,107,196,103,177,122, 94, 26, 49, 98,233,188,246,237,103,249, 1,207,213, 97,
+182, 40, 0,111,251,249,249,157, 4,240,210, 83,220,157,207,125,125,125, 51, 0,204,126, 90,229, 82,167, 78,157,122,132,132,132,
+ 44,234,216,177, 99,223,167,165,249, 95, 34,251,210,214, 31,179, 46,108, 86,103, 94,220,162, 46, 76, 60,255,182,171, 70, 73, 39,
+ 38, 38, 98,216,176, 97,248,226,139, 47,196,129,129,129,123, 1,184, 61, 3,183, 82, 80,213, 31,124,212,104,163,101,179,209, 26,
+235,141,158,227, 91,224,220,139,222, 40, 25,215, 2,165,175,180,192,133,231,189,209,191, 49,185,113,114,114, 66,159, 62,125,216,
+ 25, 25, 25,162, 57,115,230, 44, 18, 10,133, 73, 0, 6, 53, 70, 75, 36, 18, 69,138,197,226, 52, 14,135,243, 68, 94,196, 98,113,
+164, 68, 34, 73,227,112, 56, 3,170,167,203,100,178, 75,114,185, 92, 43,147,201,110,212, 97,132, 34,229,114,185, 86, 42,149, 70,
+ 86, 79,231,112, 56, 3,164, 82,105,186, 76, 38,171,153,222, 95, 38,147,165,213, 76,175, 11, 46,151,235,145,150,150,166, 78, 79,
+ 79, 87,243,249,124, 77,245,244,212,212, 84,117, 90, 90,218, 19,233,246,192,225,112,250, 75, 36,146, 52,177, 88, 28, 89, 91,122,
+205,125,170,139,106,199,174,191, 45,233,246, 22, 60, 97, 97, 97, 23,178,178,178, 60, 29, 28, 28,158,152,184,219, 81,225, 48,232,
+155, 93, 91,222, 27, 57, 52,236, 45,103,255, 81,237, 26,169, 63, 72, 40, 20, 38,205,153, 51,103, 81, 70, 70,134,168,123,247,238,
+108, 22,203,174,255, 19,161, 35, 71,142, 60,170,213,106,221, 59,116,232,192,182, 88, 44,184,115,108, 33,196,209,239, 64,152,180,
+ 29,205, 68, 57,156,135, 63,175,244, 8,235,215,249, 40,254,230,198,160,228,160, 63, 15, 20,221,135, 38,196,249, 94, 70,185,243,
+176, 17, 47,112,110,166, 25,156,205, 86,171, 35,192,238, 71,190,246, 18, 52, 74,147, 99,238, 77, 19,162,249, 53,153,235, 28,242,
+226, 44,246,217,100,142,179,217,106,117, 2, 11,125, 27,163, 89,253,242,103,179,217,239,173, 93,187,150, 5, 96, 38, 0,254,179,
+100,104,130,221,224,222,191, 21,251, 90,144, 43,122, 62, 69,217,192,202,251,221,167,169, 66, 59,191, 62,137,215,167,134,163,141,
+ 95,183, 38,233, 24,105, 58,238,187,196,196,211,175,180,106, 53,124, 94,251,246,147,107, 49, 91, 20,128,121, 43, 87,174,156,120,
+231,206, 29,231, 22, 45, 90, 76,125, 74,127,250, 55,172, 92,185,242,131, 59,119,238,184,121,123,123, 47,182, 83,179,206,114, 73,
+169, 84, 14,218,185,115,231,123,195,134, 13,123,171, 83,167, 78,237,158,134,230,127,152, 47,110,221,186,229,185,118,237,218, 15,
+ 95,127,253,245, 98, 0, 24, 48, 96, 0, 15, 64,247, 38,151,119,132,240, 9, 33, 33,132,144, 97,132,144, 1,132,144,224,202,247,
+ 93, 42,151, 97,132,144,208, 26,175, 93, 42,183,173, 90,223,181, 14,141, 97, 53,183,171,182, 77,205,207, 79,188,175,197,104, 13,
+195,163,182, 90,195,158,216,129,227,199,143,147,234,175, 53, 25,231,141, 79,103,245,112,215,223,251,105, 31, 41, 77, 75, 36, 5,
+177, 55,201,205,240,229,100, 86, 23,103,253,203, 45,240,185,253,199,139,144,139, 23, 47,146, 59,119,238,144,210,210, 82,114,255,
+254,125,210,181,107, 87,131, 88, 44,254, 21,128,183, 61, 98, 50,153, 76,251,235,175,191,146,176,176,176, 34,169, 84,186,166,234,
+230,146,203,229,218,139, 23, 47,146,176,176,176, 34,153, 76,182, 1, 0, 27, 0,158,127,254,121, 29, 33,132, 56, 59, 59,103,214,
+166, 55,114,228,200, 2, 66, 8, 81, 40, 20, 85, 85, 77,108,153, 76,182, 97,198,140, 25,165,215,175, 95, 39, 74,165,178, 42,157,
+ 37,151,203,215,204,156, 57,179, 52, 42, 42,170,122,122,189, 56, 58, 58,166, 89,173, 86,242,211, 79, 63, 17,181, 90,157, 89,237,
+102, 78,179, 90,173,228,232,209,163,117,230,173,190, 64,129, 84, 42, 93,253,202, 43,175,148, 36, 39, 39, 19, 39, 39, 39,109,181,
+244, 53,147, 38, 77, 42, 73, 77, 77, 37, 42,149,202,166, 60, 58, 57, 57,105, 47, 93,186, 68,198,140, 25, 83, 92,253,152, 58, 57,
+ 57,105, 47, 95,190, 92,149,190,218,150,130,204,205,205,109,170, 90,173,206, 84,171,213,153, 14, 14, 14,203, 92, 93, 93,179,115,
+114,114, 8, 33,132,180,108,217, 82, 87, 61,146,165, 14, 28,241,238,246,131,151,175,158,143,201,203,105, 63,240,173,213,138,246,
+ 35, 21,118, 28, 3,111,177, 88,252,107,223,190,125, 13,105,105,105,164,172,172,140, 68, 71, 71,147,139, 23, 47,146, 7, 15, 30,
+ 16, 0,182,204, 48, 32,147, 74,165, 25, 21, 21, 21,116, 69, 69, 5,157,147,147, 99,213,233,116,214,216, 53,174,132,124,197,125,
+188, 20, 30,125,142,100,159, 95, 65,203,165,226,116, 0,178,191,205,104,109, 9,240, 32, 59,124,191,187,187,208, 51,246,252,202,
+193,102,146,124,150,236,155,236,108, 62,247,174,251, 67,178,205,239, 7,178,195,191, 89,163, 52,183,249,239,139,254,196, 51,110,
+243,226,183,205, 41, 41, 41,100,238,164,193,150, 51,179,220, 19,200,118,191,131,141,209,172,198,248,209,163, 71,151,166,166,166,
+146,128,128,128, 50, 54,155,253,250,179,100,178, 66,125,248, 25,209,223,206,165,159, 11, 20,231, 61, 37,179, 21,168, 86,171,115,
+119,239,222, 77,100, 50,153,174,177,102,107,236,168,126,196, 80,244, 43, 25, 53, 60,184,222,123,228,197, 23, 95, 36, 33, 33, 33,
+100,214,172, 89, 13,221, 75,148, 31, 48, 98, 79,251,246, 71,233,177, 99,173,123,218,183, 63,234, 7,140,168, 52, 88, 20,128, 15,
+ 87,173, 90, 21,101, 54,155,163,190,254,250,235,168, 17, 35, 70, 68, 1,152,219,196, 99,177,241,243,207, 63, 39,102,179,153,124,
+253,245,215,100,196,136, 17, 4,192,166,166,148, 75, 85,145,172,160,160,160,119,143, 28, 57,114, 53, 46, 46, 46,103,248,240,225,
+171,219,183,111,175,104,172,230, 63, 17,169, 84,218,186, 93,187,118,123, 3, 2, 2, 82, 59,116,232, 96,244,247,247, 47,247,241,
+241, 73, 14, 12, 12,220, 45, 16, 8,188, 27, 41,219,173,103,207,158,214,115,231,206,145,209,163, 71,147,106, 38,164, 94,234,243,
+ 34,132,144,224, 15, 63,252,240, 35, 0,228,195, 15, 63,252,136, 16, 50,172,210, 79, 12,171,254,190,230,107,149,121,170,250, 92,
+155, 70,213, 82,155,102,109,191, 81,227,119, 80, 71, 36,107,202, 31,118,238,248,241,227,125,143, 31, 63,126,174,230,206,189,208,
+ 2, 61,102,245,112, 55, 24,114,178, 72,204,242,119,200,111, 33, 30,228, 98, 63, 23, 18,255,222,104,146,245,237, 6, 50,189,163,
+ 82, 63,182, 5, 66,236, 53, 90, 81, 81, 81, 36, 42, 42,138,220,184,113,131, 36, 37, 37,145,162,162, 34,242,253,247,223, 91,157,
+156,156, 12, 2,129, 96, 37, 0,145, 45, 98,114,185, 92, 75, 8, 33, 21, 21, 21,100,217,178,101,229,149,145, 42,141, 66,161,208,
+ 18, 66, 72, 97, 97, 33, 89,185,114,101,185, 66,161,136, 6,224,166, 82,169,210, 18, 19, 19,137, 70,163,169,213,204, 40,149, 74,
+109, 92, 92, 92,149,113,114, 87, 42,149, 49,199,142, 29, 51, 17, 66, 72,122,122, 58,113,116,116,212, 2,208, 56, 57, 57,221, 60,
+126,252,184,137, 16, 66, 50, 51, 51,171,210,109, 50, 90, 6,131,129,156, 57,115,230,137, 60, 84,165,159, 60,121,242, 9, 3,102,
+ 3, 26,133, 66, 17,245,253,247,223, 27,173, 86, 43,137,137,137,169, 50,137, 26, 7, 7,135, 27, 7, 15, 30, 52, 90,173, 86, 18,
+ 27, 27,107,179, 25,108,222,188,185,142, 16, 66, 44, 22, 11,217,190,125,123, 69,213, 49,173, 74, 55, 26,141,100,235,214,173, 21,
+114,185, 60, 10, 64,189,209, 55,149, 74,149,105, 52, 26, 73, 97, 97, 33,233,218,181,107,233,197,139, 23, 73,113,113, 49, 33,132,
+144,230,205,155,235, 0,192,183,239,235,159, 93,189, 95, 90,252,218, 7, 91, 14,120, 7,191,188,252,244,181,140,244,157, 71, 34,
+163, 84,129, 35, 7,219, 18,212, 20, 8, 4, 43, 93, 93, 93,203,127,255,253,119,171,201,100, 34,169,169,169,228,198,141, 27,143,
+175,177,219,183,111,219,100,180, 56, 28,206,194,171, 87,175,154,172, 86, 43,157,155,155,107,213,233,116, 86,157, 78,103,169,105,
+180,200, 87, 92,146,123,242, 77, 18, 17, 62,219,200,227,241, 22,254, 61,209, 44,176,201, 14,223,145,100,135,111,212,238, 87, 84,
+185, 37, 55,246, 19,242,243,108,146,240, 89, 11,178,112,176,172,132,222,225, 27, 69,118,248,141, 37,159,246,229,216,165, 25,238,
+255, 28,217,225, 27,245,249, 11, 94,121, 55,163,174,147,115,231,206,145,173, 27, 86,145, 89,161,238,101,244, 14,223, 40,178,205,
+127,140, 61,154,213, 17, 8, 4,247, 47, 92,184, 64,206,159, 63, 79, 22, 47, 94, 76,196, 98,113,234,211,136,234,145,109, 62, 94,
+228, 75,159,190,100, 87, 27, 87,242,191,190,255,184, 14, 62,193,110,112, 31,232,195, 79,207,189,121,132,144,252, 7, 36,123, 77,
+ 0, 25,236,203,109,170,217, 10, 84,171,213, 57,201,201,201, 36, 59, 59,155,172, 91,183,142,200,229,242, 70,153,173,177,163,250,
+ 17, 67,225, 47,245, 26,173,145, 35, 71,146,245,235,215, 19,179,217, 76,186,117,235,102,203,159,150, 63,152, 45, 95, 96, 36,128,
+143, 86,175, 94,253,216,100,109,217,178, 37,234,246,237,219, 81,158,158,158, 39,154,112, 44, 54,173, 94,189,250,177,201,218,178,
+101, 11,185,125,251, 54,241,242,242, 74,107, 74,185, 52,112,224,192,207,146,146,146,138,231,207,159,127,160, 79,159, 62,203,111,
+222,188,153, 30, 17, 17, 17, 21, 20, 20, 52,184,177,154, 79, 33,170,195,169,140,236,240, 9, 33, 92, 66, 72,149,121,229, 0,224,
+ 86, 5, 20,108,225,149, 87, 94, 17,247,232,209, 35,106,194,132, 9,250,221,187,119,147,228,228,100, 18, 29, 29, 77, 86,175, 94,
+ 77, 22, 45, 90, 68,190,250,234, 43, 50,102,204,152,178,174, 93,187, 94, 29, 59,118,172,208,142,108, 6,120,123,123, 23, 29, 61,
+122,148,236,219,183,143,240,120,188, 8, 91, 55,172,207,139,212,101,166,234, 50, 88, 53,215,213, 99,196,234, 53,108, 54,252,222,
+ 31, 77, 85,205, 72, 72,181,247,255, 27, 62,124,120,223, 63, 60,124, 8,150, 76,153,243,153, 48,105,247, 58,104,191,255, 2,236,
+ 66, 45,184, 37,121,168,184, 16, 1,243,133, 99,152,216,189,187, 72, 68, 81, 75,237,189, 96,248,124, 62,248,124, 62,120, 60, 30,
+244,122, 61, 50, 51, 51,209,171, 87, 47,214,141, 27, 55,132, 83,167, 78,157, 45, 18,137, 82, 1,140,106,240,110,166, 30, 69,164,
+ 47, 93,186,132, 55,223,124, 83,176,119,239,222, 14,206,206,206,183,172, 86, 43, 31, 0, 98, 99, 99, 49,110,220, 56,193,254,253,
+251,219,186,185,185,221, 48,153, 76, 98,129, 64, 0, 54,155, 93,167, 30,159,207,135,217,108, 22,180,105,211, 38,250,214,173, 91,
+129,195,135, 15,231,166,164,164, 32, 49, 49, 17,102,179,153,239,227,227,115,251,198,141, 27, 29,134, 13, 27,198, 77, 75, 75, 67,
+ 74, 74,202,227,124,216,146, 95,163,209, 8,129, 64,128,234, 85, 90, 20, 69,161,162,162, 2,124, 62,223,102, 45, 14,135,211,223,
+207,207,239,246,173, 91,183,130, 70,142, 28,201,187,126,253, 58,210,211,211, 97,181, 90,249,254,254,254,183,111,221,186,213,113,
+196,136, 17,188,232,232,104,104,181, 90,216, 90,133, 86,245,189, 91,183,110, 97,194,132, 9,252, 83,167, 78,117,116,117,117,141,
+182, 88, 44,124, 0,184,125,251, 54,198,141, 27,199, 63,125,250,116, 80,179,102,205,162, 27,168, 74,100, 3,128,217,108,198,212,
+169, 83, 37,114,185, 28,105,105,105,160,105, 26, 86,171, 21, 0,144, 87,144,119,251,214,237,152,216,137,227, 95,232,107, 48, 85,
+ 84, 92,190, 22,121,175,101,115, 47, 15,138, 34,205, 27,200,234, 40,137, 68,146,186,102,205,154,119,147,147,147, 5,126,126,126,
+172,132,132, 4,148,148,148,128,199,227, 61,190,198,108,221,111, 62,159,223, 47, 32, 32,128, 83, 94, 94, 14,154,166, 1,128,176,
+ 88,181,183, 88, 17, 22, 94,128,191,198,194, 21,137, 68,253,254,150,167,119,113,128, 19,104, 12, 76,201, 49, 10, 4, 14, 30, 50,
+169,171, 15,144,122, 30, 45,156, 5, 96,179,216,194,235,137,122, 9, 64, 6,194, 51,215,201, 62, 77,122, 96,162,206, 40, 48, 59,
+182,149,186,121,120, 34, 47, 47, 15,205, 90,250,161,156,239,204,191,244,160, 76, 10,202, 78,205,255,167,119,155, 54,109, 92, 90,
+183,110,141,220,220, 92, 4, 5, 5, 65,169, 84, 42, 1, 12,108,244, 67,231,107, 47, 1,138,209, 19, 96,173,129,149, 90, 12, 51,
+103, 5, 30,228, 4,145, 29, 65,220,127,146,201,146, 75,249, 87,246,127,247,189,187,147,167, 63, 16,241, 26, 52, 14, 2,236,122,
+ 43,200,209, 89, 33, 56,218, 72,179, 21,168,209,104,206, 94,189,122, 85, 37, 20, 10,113,227,198, 13, 4, 4, 4, 96,221,186,117,
+206, 74,165,242,124,227, 34, 91, 4,132,170,219,100,245,233,211, 7, 51,103,206,196,222,189,123,225,232,232,136, 9, 19, 38, 52,
+100,182, 72, 44,240,211,231,209,209, 95,239,125,248,240,248, 43,173, 90, 13,159,224,227,179,108,218, 75, 47,189,254,246,219,111,
+ 99,213,170, 85, 56,122,244, 40,122,246,236,137, 41, 83,166,152, 83, 83, 83,247, 52,182,170,106,205,154, 53,179,102,207,158, 93,
+ 83,211,148,146,146,242,121,147,202,165,188,188,219,209,209,209,177,227,199,143,239, 91, 94, 94, 94,113,237,218,181,123,222,222,
+222, 30, 0,154, 55, 86,179, 9, 6,139, 34,132, 8, 1,136, 43, 23, 9, 0,241,254,253,251, 21, 35, 71,142,148, 87,166,137, 42,
+151, 6,171,247, 3, 2, 2, 60,238,223,191,159,241,222,123,239, 5,237,221,187, 87, 36, 22,139, 81, 88, 88,136, 47,191,252, 18,
+ 31,125,244, 17, 40,138, 2, 33, 4, 95,125,245,149,120,242,228,201,193, 15, 31, 62,204,240,242,242,178,165, 73,139, 64, 42,149,
+ 30, 92,182,108,153,156,166,105,204,155, 55, 47,215,100, 50,205,172, 92, 55,223,193,193,225, 10, 30, 25,238,250,168,213,139, 84,
+123, 86, 30,175,113,108,134,215, 76,171,185,142, 16, 50,188, 62, 13, 59,207, 69,109,191, 23, 81,159,217,170,254, 4,234, 87,171,
+139, 4,218,187,120,251,162,232,231,131, 16,113, 40,136,216,149, 11,135, 2, 43,225, 54,154, 9,185, 48, 19, 18,216, 88,163, 85,
+181,112,185, 92,232,245,122, 88,173, 86,124,244,209, 71,130, 51,103,206, 56,177, 88,172, 31, 26,210,169,110,152,226,227,227,225,
+239,239, 79,253,244,211, 79,154,153, 51,103,138,170,126,167,168,168, 8,173, 91,183,166, 78,158, 60,169,254,228,147, 79,164,245,
+153, 25,138,162,192,227,241, 48,123,246,108,209,181,107,215, 28,221,220,220,144,144,144,128,252,252,124, 72,165, 82,204,158, 61,
+ 91,116,245,234, 85,103, 55, 55, 55, 36, 39, 39,163,168,168, 8, 82,169,212,110,163,197,227,241,158,216,134,162, 40,152, 76, 38,
+187,140,129, 66,161,216, 23, 21, 21,229,172, 80, 40, 16, 29, 29, 13,139,197, 2,133, 66,129, 89,179,102,137,162,162,162,156, 29,
+ 28, 28, 16, 27, 27, 11, 66, 8,228,114,185, 93,121, 4, 0,154,166, 17, 27, 27,139,230,205,155,227,252,249,243,234,105,211,166,
+ 9,171,210, 31, 60,120, 0, 15, 15, 15,156, 63,127, 94, 45,145, 72,246,213,165, 69,211, 52,178,178,178,112,231,206, 29, 36, 36,
+ 36, 32, 39, 39, 7,185,185,185, 40, 41, 41,129,197, 98, 1, 0,136, 75,138, 35,246, 31,248,233,150, 72, 36, 18, 7,248,180,241,
+188, 29,115, 87, 39, 18,137,196, 94,158,158, 62,192,167,172,122, 12,225, 15, 41, 41, 41, 78,147, 39, 79,230,101,103,103,163,160,
+160, 0, 28, 14,231, 15,215, 22,159,111, 91, 83, 32,139,197,226, 47, 20, 10, 41,147,201,244, 56, 2,198,231,243,241,238, 62, 61,
+ 2, 22,226,137,229,165, 13, 58, 16,171, 25, 70,163,209,255, 47,143,102, 1, 20, 40, 99, 27, 80, 84,208,149,132, 50,199,222,195,
+199,243,144,120, 10,160,205, 0,139,131,126,237, 61, 56, 71,111,151,105, 64,208, 30, 21,240, 35,164,225,158, 95, 4,160, 0, 83,
+107,128,234,124,230,190,197,169,231,232,183,120, 25, 25, 25,224,241,120, 16, 8, 4, 8,234,255, 60,103,255, 45,179, 11, 40,116,
+128, 9,190,182,104, 62, 17,118, 20,137, 22, 44, 90,180, 72, 82, 93,243,245,215, 95,151, 40, 20,138, 69,141, 54, 89,101,226,238,
+176,144,217,119, 50,244,205,151, 69,100,251, 63,212, 25,124, 65,200,123,128,185,227, 83, 48, 91,253, 4, 2, 65, 34,128, 94, 77,
+ 50, 89, 50,254,229,239,190,251,222,221,177,217, 35,147, 5, 75, 57,192, 21,193,197,217, 1,187,222, 13,113,116,118, 16,217,107,
+182, 2, 53, 26,205,175, 87,174, 92, 81, 9,133, 66, 68, 69, 69,129,199,227, 65, 40, 20,162, 93,187,118,216,177, 99,135,179,163,
+163,163,221,102,139,128,212, 26,243, 29, 53,106, 20,233,211,167, 15,102,204,152,129, 61,123,246,192,104, 52, 98,217,178,101, 72,
+ 73, 73,177, 73, 54, 22,248,105,101,116,244,238, 21,119,238,196,127, 24, 24,232, 55, 74, 34,113,156, 49, 97,130,226,147, 79, 62,
+ 57,126,236,216,177,175,135, 13, 27,150,123,237,218,181,245, 0, 14,218,121,120, 41, 0, 91,214,174, 93, 59,163,202,184,125,242,
+201, 39, 95, 29, 59,118,108,197,176, 97,195,178,174, 93,187,246, 30,128, 45, 77, 41,151,104,154,142,248,225,135, 31,110,137, 68,
+ 34,177,175,175,175,103, 76, 76,140, 78, 36, 18,137, 61, 61, 61,125,250,246,237,203,106,140,102, 99, 80,171,213, 3,174, 92,185,
+ 18,128, 71,157,198, 4, 85, 70, 43, 38, 38,198,161,184,184,216, 65, 42,149, 58,184,186,186,202,170,204,214,232,209,163, 29, 56,
+ 28, 78,189,215,109,105,105,233,177,249,243,231, 43, 70,143, 30, 93,245, 25, 23, 46, 92,192,158, 61,123, 32,145, 72,158,248,238,
+136, 17, 35,240,230,155,111, 42,141, 70,227, 15, 54,100,119,210,212,169, 83,125, 53, 26, 13, 22, 44, 88, 80,145,145,145, 49, 0,
+ 64, 10, 0, 69,104,104,232,103, 49, 49, 49, 93,131,131,131, 15, 0,232, 84,223,189, 87,155, 23,169,110,116,108, 73,107,236,247,
+109, 53, 91, 53,146,234, 28, 67,235, 9,163, 53,124,248,240,115,168,163, 39,149, 41, 95, 11, 1,172, 16,177, 41,136,217,213,204,
+ 22,104,112,138,116,160, 26,209, 75,165,182,135, 33,159,207, 7,155,205,134,209,104,132,173, 19, 85, 87,153, 2,185, 92, 14,169,
+ 84, 10,131,193, 0,139,197, 2,161, 80, 88,101, 70, 32,151,203,193,229,114,193,229,114, 33, 20, 10,255, 16, 77,170, 25,205,225,
+241,120,144, 72, 36,200,202,202, 66, 74, 74, 10,104,154,134, 84, 42,133, 68, 34, 1,159,207, 71,102,102, 38, 50, 51, 51, 65, 8,
+129, 68, 34,129, 68, 34,129, 61, 13,174,173, 86,107,173, 15,127,179,217,108, 87, 68,203, 98,177,224,222,189,123, 72, 77, 77,133,
+ 80, 40,124,188,175, 2,129, 0, 15, 30, 60, 64,118,118, 54,196, 98, 49,228,114, 57, 20, 10,133,205,186, 85,251, 34,147,201, 32,
+ 18,137, 80, 80, 80, 0,189, 94,255,248,152,202,229,114, 72, 36, 18, 20, 21, 21, 65,167,211,213,187,239, 86,171, 21,153,153,153,
+200,201,201, 65, 90, 90, 26,114,115,115, 31, 23, 64,149, 81,163,166, 5,118,138,139,145,151,151,247, 56, 18, 89,215, 98, 11, 52,
+ 77,163,164,164, 4, 87,174, 92,161,104,154, 70, 97, 97, 33,157,147,157,109,157,158,201,199,209, 79,183,145,239, 79,221, 44,223,
+127, 34,202,112,248,215, 59,134, 45,135,111, 27,132, 93, 23, 91,240,119,176, 53, 80, 1, 51, 55, 44,183,212, 44,200, 49,241, 20,
+154,192, 80, 32,241, 36,192,226, 0, 66, 37,186,181,109,129,148, 2,171, 36, 78,107, 20,130,194, 32,108,241, 81,218,164,105,229,
+ 14,204, 41, 49, 11,146, 77,206,114,255,246,157,160,213,106, 33, 16, 8, 32, 16, 8,208,185,103, 40, 18,243,172,226,187, 25, 6,
+ 49, 8,194,108,210,252,127, 90, 74,165,210,238,189,122,245,162,170,107, 14, 29, 58, 20, 20, 69,181, 3,224,103, 87, 33,183,169,
+ 37, 31, 38,113, 55,112,200,236,187, 89,122,183,163, 49,229, 62,207,141,122,222,113,227, 47, 58,255,123,217, 21,222, 32,230, 57,
+ 32,166, 78, 77, 48, 91,125,101, 50,217,241,205,155, 55,123, 11,133,194,147, 0,122, 55, 70, 68, 42, 98,111, 95, 48, 99,188,187,
+178,202,100,153,245, 0, 71, 4,112, 69, 0, 71, 4, 23,181, 10, 75,223, 28,232, 40, 22,114, 15,219, 97, 88,247,111,217,178,197,
+185,166,201,170, 90,130,130,130,176,112,225, 66,103, 71, 71,199,125,182,232,173, 89,189,138, 20, 22, 21, 1, 4, 40, 46, 46,197,
+154,213,171, 10,170,214,141, 30, 61,154,244,238,221, 27, 51,102,204,192,138, 21, 43,112,226,196, 9,116,235,214, 13, 83,166, 76,
+ 65,112,112,112, 67,210, 97, 10,133, 98,111,104,104,232,149, 76,153,236,205,172, 78,157,248,191, 42, 20, 69, 3,138,138, 20, 94,
+ 49, 49, 38, 95,224, 54,128,173,233,233,233,131,237, 48, 89, 47,201,229,242,168, 1, 3, 6,152,100, 50, 89,234,186,117,235,166,
+207,156, 57, 19,171, 86,173,194,252,249,243,191, 4,240, 6,128,143,211,211,211,221,234, 51, 89,127, 86,185,244,103,149,117, 86,
+171, 53,237,224,193,131,193, 38,147,201,163,178,122, 80, 80, 88, 88, 40,207,207,207,151,153, 76, 38, 9, 77,211, 18, 7, 7, 7,
+ 41, 0,241,196,137, 19, 57,119,239,222,245,183, 88, 44, 25,245,105,102,103,103,191, 60,111,222,188,220,220,220, 92, 0, 64,187,
+118,237, 80, 88, 88,136,185,115,231,226,157,119, 30,117, 8,238,216,177, 35, 8, 33,208,106,181, 88,179,102,141, 54, 59, 59,251,
+ 85, 27,178,219,170, 77,155, 54,136,137,137,193,189,123,247,126, 1, 64,227, 81, 59,214,162,155, 55,111,222,202,201,201,193,190,
+125,251,120,238,238,238,199, 80,199, 16, 47,245,121,145,198, 64, 81, 84, 68, 99,182,171,138, 92,213, 22, 17,171,131,250, 35, 90,
+195,135, 15,167,170,191, 62, 17, 49,162, 16,157, 26,121, 30,142,129,157,158,136,102,137,217, 20, 68,114, 5, 18,211, 82,192, 3,
+117,231,105, 25,173,130,130, 2, 76,159, 62,221,240,242,203, 47,231,209, 52,253,188,173,166, 64,161, 80, 64,161, 80,224,238,221,
+187,100,204,152, 49,218,117,235,214, 25,170, 27,173,248,248,120, 18, 22, 22,166, 91,180,104, 81,105,125, 70,171, 42,162,181,114,
+229, 74, 67,191,126,253,114,238,220,185, 67,170,204,148, 84, 42,197,154, 53,107, 12, 33, 33, 33,218,235,215,175,147,170, 52,123,
+ 34, 90, 44, 22,235,177,209,170,190, 13,139,197, 2, 77,211,118, 25,173,178,178,178,151,135, 13, 27,166,141,141,141, 37, 85,251,
+169, 80, 40,176,110,221, 58,195,192,129, 3,181,119,238,220, 33, 85,105,114,185,220,102, 51, 88,245,251, 50,153, 12,114,185, 28,
+119,239,222, 37, 97, 97, 97,218, 77,155, 54,149, 87, 79,191,119,239, 30, 25, 49, 98,132,182,164,164,228,229,250,204, 75, 85,117,
+158,197, 98, 65,121,121, 57,114,115,115,145,150,150,246, 56,156,110,144,200, 7,143,127,241,185, 14, 6,131, 65,127, 55,254,126,
+106,187,182, 1,106,131,193,160, 79, 73, 77,141, 7, 62,165,235,209,126, 62, 48, 48, 48,111,250,244,233,134,130,130,130, 38, 27,
+ 45, 62,159, 31,203,225,112, 72,239,222,189,137,209,104, 36,105,105,105,230,220,130, 2,139,223,242,229,228,206,187,239, 82,162,
+200, 72,129, 84, 42,165, 42, 53, 89, 9, 9, 9,180, 72, 36,138,253,203,141, 22,139,118, 1, 69,122,253,126,191,212, 97,224,115,
+227,248, 84,246, 53,192, 84, 10, 8,148,128, 64, 9,142,196, 9, 67,122,119,100,239,190, 82,236, 2, 66,247, 0, 79,224,209,160,
+ 38,151,104, 0,186,247,207,241,229,202, 94, 99,103,241,243,243,243,193,102,179, 31,155, 34,177, 68,130, 1,163, 38,178,190,186,
+ 86,225, 2,144,158,160,216, 30,118,220,235, 31, 44, 88,176,128, 87, 80, 80, 0, 22,139,245,255,154, 98, 49,166, 77,155, 38,144,
+203,229,243,109, 46,252, 14,250,243,192, 21,116, 3,200, 59,113,217,229,110,199,110, 27,124,231,172,220, 37, 10,236, 24,140,169,
+253,212,162,149, 17,186,192, 91,105,134, 22,128,245, 93, 88,140,157, 27, 97,182,122,203,100,178,136,200,200, 72,241,208,161, 67,
+177,102,205, 26,137, 72, 36, 58,217,152,130,191,172,212, 58,115,201,166,111,180,209,235, 7, 1,166,178, 71, 6,171,218,162, 43,
+165,177,112,215,217, 34,179,153,140,183, 85,211, 96, 48, 76,122,227,141, 55,242, 14, 31, 62,252, 7,147, 37, 20, 10,145,148,148,
+132,101,203,150,229,231,231,231, 55,248, 80, 92,183,118, 77, 84,204,173,223,240,213,151, 75, 0, 16,108, 94,247, 22, 46,255,254,
+157, 67,191,190,125, 72,243,230,205, 73,112,112, 48,166, 79,159,142,165, 75,151, 34, 46, 46, 14, 42,149, 10,111,189,245, 22,250,
+246,237,139,181,107,215,214, 87, 72,133,205,156, 57,115, 89,122,122,186,239,207, 63,255,204,201,201,201, 81,175,221,185,179,232,
+ 80, 81, 81,254,138,152,152,184,143,219,182,109,243, 97,251,246,175,214, 51,244, 67,173, 38,107,198,140, 25,251,211,211,211,131,
+126,249,229, 23,110, 78, 78,142,199,140, 25, 51,176,122,245,106,204,159, 63,127, 7,128,169,176,173,195,139,205,229, 18,155,205,
+ 30,252,252,243,207,119, 48, 24, 12,250,184,184,184,212,182,109,219,170, 13, 6,131, 62, 53, 53, 53,254,220,185,115,116, 99, 52,
+ 27, 67, 94, 94,222,195,125,251,246,197,207,154, 53,125,217,169,123, 0, 0, 32, 0, 73, 68, 65, 84, 43, 40, 61, 61,221, 31,128,
+ 83, 73, 73,137,164,164,164, 68, 96, 52, 26, 69, 74,165, 82,217,177, 99, 71,213,148, 41, 83,164, 55,111,222,244, 79, 79, 79, 47,
+173,140, 34,213,137,201,100,138, 43, 40, 40, 24, 62,104,208,160,194,130,130, 2,180,111,223, 30,207, 61,247, 28, 92, 92, 92,224,
+230,230,134,145, 35, 71,194,199,199, 7,121,121,121, 24, 63,126,124,126, 78, 78,206, 32, 0, 9, 54,100,247, 97,118,118, 54,122,
+244,232,129, 37, 75,150, 12,127,225,133, 23,238,244,238,221,187,184,109,219,182,122, 15, 15, 15,191,141, 27, 55,194,221,221, 29,
+ 7, 15, 30,116, 21, 8, 4,251,106, 49, 89,117,122, 17, 0, 57,149,134,199, 88,227, 53,167,129,117,182,110, 91,235,123, 27,190,
+ 87,211,108, 85, 95,254, 80,117, 88,251, 9, 1, 22,238, 57,184,187,156,239,217, 26, 10,223, 14, 16, 11,133, 16,241,249, 16, 41,
+157, 80, 65,211,216,153,148,173, 47, 35,100,190,189, 23, 79,205, 7, 33, 69, 81,248,226,139, 47, 44,221,187,119, 47, 63,123,246,
+236,102,131,193,224,137, 71,163,202,218,108, 10, 54,109,218,164,159, 61,123,246, 45,157, 78,215, 65, 40, 20, 26,171,210, 55,111,
+222,172,159, 56,113, 98, 76,122,122,122,144, 88, 44,214,215,213, 62,171,186,209, 18, 8, 4, 21, 58,157, 46,248,245,215, 95,143,
+221,186,117,107,153, 88, 44,134, 68, 34,129, 64, 32, 48,234,116,186, 14,211,167, 79,191,181,122,245,106,189, 72, 36,130, 68, 34,
+177,171, 90,142, 16,242, 7, 67, 85, 61,221, 86, 44, 22,203, 89,157, 78,215, 97,246,236,217, 55, 55,110,220, 88, 86,101,128,170,
+231,113,237,218,181,122,169, 84,106, 87, 68,171,234,123, 18,137, 4, 27, 54,108,208,207,154, 53,235,150, 78,167,235, 32, 16, 8,
+140,213,210,203,102,206,156,121, 83,167,211,117,176, 88, 44,103,235,249, 55,102, 45, 46, 46, 6,135,195, 65, 76, 76, 76, 5,143,
+199, 3,139,197,194,131, 7, 15, 30, 23, 62,142,142,142, 1, 29,218,181,245,251,102,255,193,115, 34,158, 64,208, 61,184,179,127,
+ 66,114, 74, 58, 33, 84,114, 3, 89, 61, 98, 48, 24, 60,207,158, 61,187,185,123,247,238,229, 95,124,241,133,165,174,200,150, 45,
+ 84, 84, 84,156,187,113,227,134, 89, 40, 20, 82, 89, 89, 89, 22, 54,155, 13,171,213, 74, 42,130,131, 43,218,109,220, 72,238,126,
+248, 33, 37,151, 72, 56, 60, 30, 15, 98,177,152, 58,117,234,148, 81,175,215,159,251,235,141, 22,196,160, 32,186,175,171,144, 9,
+ 89, 22, 10,241, 71, 30,153, 44,161, 3, 32, 84, 2, 66, 37,220,221, 61,112, 45, 73, 47, 3, 11,124, 88,109, 24, 67,140, 16, 9,
+ 40,136, 99,180,144,113,249, 34, 42, 59, 59,251,177, 33,170, 90,188, 91,251,227, 70, 74,169, 20, 20, 17,128, 13,123,134, 32, 25,
+238,228,228,196,201,202,202,250,131,102, 64, 64, 0,219,108, 54,219, 62,180, 75,166,213, 21,160,103,196,103,151,187,254,120,171,
+204,247,221, 21, 95,137, 68,214, 66, 32,114, 19, 2, 91,186,225,221,177, 29,249,159, 28,203, 9,188,158,172,111, 9, 54,153, 10,
+186,212,217,142,124,246,146,201,100, 39,175, 95,191, 46,150,201,100, 72, 72, 72, 64,112,112, 48,194,195,195,197, 98,177,248, 4,
+ 0,187,218,227, 93,213, 34,165,180,196,218,253,131,131,169,217,209, 89,150, 39, 76, 86, 78, 25,193, 27,159, 31, 43, 44, 40, 46,
+127,254, 74, 90,221,247, 79, 45,220, 44, 44, 44, 12,155, 63,127,126, 94, 78, 78,206, 19, 38, 43, 37, 37,165,234,161,216, 15, 64,
+131,127,126,255,247,219,233,160,229, 75,103,227,122,228, 29, 12, 25,254, 14,110, 68, 63,196,199,243, 70,193, 65, 46,194,217,179,
+103, 49,122,244,104, 44, 89,178, 4, 15, 30, 60,192,247,223,127, 79,133,135,135, 83, 87,174, 92,161, 62,255,252,115,170,129, 38,
+ 13, 19, 86,172, 88,129,235,215,175, 99,232,208,161, 56,127,254, 60,242,243,243,241,221,201,147,247,247,221,191,255,113, 85,155,
+173, 58,134,126,168, 21,185, 92, 62,103,197,138, 21,136,140,140,124,172,153,151,151,135, 21, 43, 86,164, 3,120,203, 30,147,101,
+ 79,185,212,190,125,123,191,253,251,247,159, 19, 10,133,130,224,224, 96,255,164,164,164,116, 0,201,141,208, 44,110, 74, 77, 85,
+110,110,238,165,240,240,240, 43,253,251,247, 23, 79,154, 52,201,249,232,209,163, 78,122,189,222, 77, 32, 16,168,141, 70, 35,255,
+222,189,123,236, 67,135, 14,185,220,189,123, 55,169,188,188,252,154, 45,199, 67,167,211, 93,139,139,139, 27,212,190,125,251,123,
+155, 55,111, 78,119,117,117,165,167, 76,153,130, 55,222,120, 3,206,206,206,214, 13, 27, 54,164,246,238,221, 59,230,225,195,135,
+161,122,189,254,182,141,121,253,122,249,242,229, 23,247,239,223,143,231,158,123, 14,159,127,254, 57,190,251,238, 59,252,246,219,
+111,162,223,127,255,157, 31, 30, 30, 14, 30,143,135,110,221,186, 33, 44, 44,108, 64,101,117,167,173,207,165,235, 20, 69, 69, 80,
+ 20,245, 75,141,215,235,245,173,179, 99,219,186,222,215,251,189, 26,217, 12,175,177,216,206,132,150,248,116, 90, 91,153,254,210,
+ 43,221, 72,246,148, 94, 68, 59,206,159, 92,232,235, 72, 94,111, 69,149, 77,106,228,240, 14, 6,131,225,241,114,248,240, 97,226,
+226,226, 82, 38,147,201,236, 30,222,193,197,197, 69, 91, 92, 92, 76,186,116,233,146,239,236,236,252,120, 40, 2, 87, 87, 87,109,
+ 89, 89, 25,233,214,173, 91,190, 90,173,126, 60,188,131,135,135, 71, 26, 33,132,120,121,121,101,214,165,103,177, 88,136,139,139,
+ 75, 85, 15, 61,174,163,163,227,182,174, 93,187,230,107,181, 90,226,234,234,250,120,232, 4,103,103,231, 53,193,193,193, 53,211,
+ 27,202,111, 90,122,122, 58, 73, 79, 79, 39,205,154, 53,203,172,158,158,146,146, 66, 82, 82, 82,136,135,135,135,221,195, 59, 56,
+ 59, 59,175,174, 37, 47,141,202,163,167,167,167,214, 96, 48,144, 30, 61,122, 60,113, 76, 61, 61, 61,181,229,229,229, 85,233, 54,
+ 13,239, 32, 18,137,166, 10,133,194, 76,161, 80,152, 41, 16, 8,150, 53,111,222, 92,119,224,192, 1,178, 97,195,134,170, 46,233,
+112, 14, 24,209,189,117,143, 87, 63,118, 14, 24, 57,167, 41,195, 59,200,100,178, 95, 93, 92, 92,202, 14, 31, 62,252,196,245,101,
+ 48, 24,108, 30,222, 65, 36, 18,165,151,150,150,210, 90,173,214,124,241,226, 69,125,100,100,164, 62, 38, 38, 70,159,148,148,100,
+200,211,233, 76, 90,173,214, 80, 84, 84, 84,113,235,214,173, 10,177,248,239, 25,222,129,132,251,180, 38,219,252,142, 61, 92,226,
+125,119,118, 31,113,249,237,165, 29, 8,249, 97, 52, 33, 39,222, 32,228,236, 7,228,218,142, 41,164,135,183,192,122,113,110,179,
+120,178,221,247, 71, 91,134,100, 32,225,237, 90,147,109,126, 39,238, 47,246,190, 59,169,183, 91,249,206,173, 27,200,213,171, 87,
+ 73, 76, 76, 12, 73, 72, 72, 32, 39,142, 28, 32, 61, 90,138, 31,105,110,243, 59,102,231, 48, 15, 61, 5, 2, 65,233,186,117,235,
+200,149, 43, 87, 30,107, 30, 59,118,140,136,197, 98, 61, 96, 91,175,101, 2, 80,100, 91,192, 40,203, 86,223,223, 63, 25, 40, 45,
+201, 59,254, 1, 33,183,119, 19, 18, 30, 72,200,215, 93, 9, 57, 48,140,144,159, 94, 37, 87, 54,140, 37, 61,189,121,102,178,221,
+247, 60,217, 17, 96,115, 99,123, 46,151, 91,124,248,240, 97,146,153,153, 73,206,159, 63, 79, 34, 35, 35, 73,108,108, 44, 73, 77,
+ 77, 37, 17, 17, 17,132,203,229,150,163, 17,211,150,117,213,192, 43,180, 13, 47,235,214,202,158,132, 28, 29, 79,114,246, 77, 32,
+195,219,202,242,187, 53,107,210,120,116, 29,157,156,156,114, 35, 34, 34, 72, 82, 82, 18, 57,119,238, 28, 81,171,213,185, 0,108,
+110, 47, 59,124, 72,111, 66,140,183, 72, 72,159,182,164,125,251,182,164,111,207, 54, 36,227,225, 38, 18,220,169, 57,217,182,109,
+ 27,209,106,181,164,121,243,230,196,222,140,133,134,134, 94, 37,132, 68, 13, 29, 58, 52, 10,192,169,208,208,208,168,196,196,196,
+168,224,224,224, 43,168,127,232,135, 58, 25, 48, 96,128,137, 16, 66,134, 14, 29, 74, 0,100,134,134,134,146,196,196, 68, 18, 28,
+ 28,108,108,204,193,179,165, 92, 10, 10, 10,234,222,191,127,255,143,131,130,130,230,216, 50,188, 67, 3,154, 79,107, 16,106, 54,
+ 30, 13,254, 25, 0,160,115,229,226, 95,153,198,110,130,230,171, 92, 46,119,167,163,163,227,111, 74,165,242, 44,155,205, 14, 7,
+240, 10, 26, 55,190, 25,171, 50,194,120,198,217,217,249, 65,251,246,237, 13,131, 6, 13, 34, 67,134, 12, 33, 51,102,204, 32, 52,
+ 77,147, 3, 7, 14,144, 37, 75,150,144, 86, 78, 78,150, 13, 64,238,118, 96, 50, 24, 30, 13, 88, 58,185, 37,117,238,229, 22, 40,
+ 25,223, 2,165,175,181,162,108, 25,176, 52,180, 46,163, 69,211, 52,137,143,143, 39, 33, 33, 33,101, 18,137, 36, 3,182, 15, 88,
+250,132,166, 74,165,138, 84,171,213,127, 24, 68,179, 90,250, 19, 3,150,170,213,234, 75,174,174,174, 90,103,103,231, 27,181,105,
+170, 84,170, 72, 87, 87, 87,173, 74,165,122, 98,112, 79, 54,155, 61, 84,165, 82,101,212, 76,231,112, 56,253,213,106,117, 90,205,
+244, 58,246, 29, 46, 46, 46,105,153,153,153, 36, 39, 39,135,120,122,122,102,214, 52, 96,217,217,217, 79, 24, 48, 91, 52, 27,202,
+ 75, 61,121,172, 85,211,134, 99,218,152,243, 94,133,143,187,187,187,110,237,218,181, 68, 42,149, 62,209,229,217,183,207,107, 11,
+174,222, 47, 45,126, 99,222,182, 3,181, 12, 88,106,235,224,160,131, 36, 18, 73, 70, 72, 72, 72, 89,124,124, 60,161,105,154,208,
+ 52, 93,151,209,170, 77,115,112,231,206,157,243,114,115,115,173, 37, 37, 37,150,180,180,180,138,196,196, 68,195,210,165, 75, 77,
+ 57, 57, 57,229,165,165,165,198,232,232,232, 10, 87, 87,215, 28, 0,131,237, 61, 71,141, 36,180,102,245, 25,217,225,223,147,108,
+247,143,136, 93,228,117,239,213,174,146,138,168,181, 67, 9, 57,251, 1,185,178,237, 13,210,221,155,255,200, 16,237,240, 59, 73,
+190,242,233, 67, 54,181,228,219,164,185,179, 85,111,178,195,239,228,221,133, 94,247, 70,119,114, 54,238,223,189,131, 60,120,240,
+128, 28, 59,180,143,116,107, 81,105,178,182,251,159, 33,219,252, 67,108,209,172,205,108,237,218,181,139, 60,120,240,128,252,248,
+227,143,182,154,172,208,218,140,214, 71,161,210,194, 55,186, 10, 43,198,119,228, 27, 71, 6,242, 76, 97,173,121,150, 30, 94, 28,
+107, 7, 87, 22,237,239, 12, 18,230, 43,170, 32,219,125,207,147,237,254,131,108,205, 39,159,207, 79, 69,181, 49,117,106, 46, 2,
+129, 32,167, 30,163, 21,218,160,217,242, 17,100,253,186,164, 63,121,174,189, 44,207, 70,147,213,208,181,212, 81,165, 82,229,126,
+253,245,215, 68,163,209,228,216,104,178, 30,107,142, 24, 30, 70, 82, 30,158, 32, 63, 30, 88, 65, 66,250,248,147,189,187,102,147,
+171,231, 23,145, 97, 67, 66, 72,104,104, 40,201,205,205, 37,253,251,247, 39,246,230, 83,161, 80,236, 45, 45, 45,141, 58,125,250,
+116, 84,104,104,104,212,222,189,123,163, 46, 92,184, 16, 37, 22,139,247, 86, 5, 39,106,154, 45,255, 63,150,255,161, 53, 34, 90,
+ 81, 37, 37, 37,228,244,233,211, 36, 52, 52,148,236,221,187,151, 92,184,112,129,136,197,226,168,198,222, 71,182,150, 75, 3, 7,
+ 14, 92,144,148,148, 84,188,112,225,194, 3,181, 12, 88,106,171,230,131,167,148,207,167, 82,134,252, 13,154, 50,145, 72, 20,117,
+235,214, 45, 82, 80, 80, 64,218,106, 52,100, 57,155, 77,210,121, 60,146,201,227,145,109, 64,254,127,192, 38, 77,169,171,234,240,
+207,166, 86,163, 85, 94, 94, 78,230,206,157,107, 20, 10,133,122, 30,143,103,239, 20, 60,255,234,139, 80,165, 82, 93,210,104, 52,
+ 90,141, 70,243,132,217,171,158,174, 82,169,110,252,199,111, 64, 31, 30,143,151,194,229,114,159,156,130, 39, 96, 68,247, 86, 61,
+ 39,205,215, 4,142, 24,210,196,124,242,120, 60,222, 71, 66,161, 80, 63,119,238, 92, 99,105,105,169, 61, 70, 11, 0, 6,138,197,
+226,140, 61,123,246, 24,238,223,191,111,206,207,207,183, 92,189,122,213, 28, 25, 25,105,252,244,211, 79, 75,196, 98,113, 6,234,
+ 30,150,224, 47, 57,158,100, 83, 75,126,149,217,186, 61,223, 43,246,185,182, 98, 83,248,123, 97,164,123,243, 26, 38,171,238,145,
+220,107,215,172, 52, 91, 55, 63,241,140, 13,241,145, 90, 86,204,127,151,116,107, 33,122,210,100,217,161, 89,211,108,137,197,226,
+146, 69,139, 22,217, 19,201,122,210, 16,238,244,245, 36, 59,252,246, 62, 50, 81, 13, 44,219,124,191, 36, 95,248,122,254, 83,238,
+163,174, 26,120, 13,240, 17,220,177, 35,146,101, 75, 62, 59, 42,149,202,123,118, 68,178, 30,107,126,241,197,102, 50, 97,220, 64,
+242,240,222, 97, 82,154,119,130,220,184,188,142,140, 25, 17, 68,186,117, 11, 38, 59,118,236, 32,113,113,113,164, 75,151, 46,164,
+ 17,249, 12,155, 54,109, 90, 84, 98, 98, 98, 84, 66, 66, 66,212,133, 11, 23,162, 70,141, 26, 21, 5, 32,172,122, 77, 80,149,217,
+ 50,141, 25, 83,209,145,197,122,183, 1,205,151,166, 77,155, 70, 18, 19, 19, 73, 66, 66, 2,185,112,225, 2, 25, 53,106, 20,129,
+125,211,247, 52,170, 92, 10, 10, 10,234, 30, 18, 18, 50,191, 83,167, 78, 67,158,150,230, 51,104,180, 36,163, 71,143,166,173, 86,
+ 43, 25, 50,100,136,117, 35, 80, 24, 78, 81,218,112,138,210,238, 0,114,254,235, 17,173, 63,123,194,207, 80, 0,191, 84, 79, 16,
+ 10,133,218,242,242,114,103,169, 84,122,164,180,180,116, 22, 30,117,139,108,146,230,159,145, 79, 70,243, 63,161,233, 42,149, 74,
+ 55,151,150,150,142, 18, 10,133, 57,229,229,229, 26, 59, 52, 29, 4, 2,193,187, 66,161, 48, 68,175,215,251, 0,128, 68, 34,137,
+175,168,168,248,205, 96, 48,172, 7, 80,248,119,239, 59,217,212,146, 15, 62,191, 51, 8, 62,140, 74, 45,107,177,226,116,190,215,
+123,253,149,169, 61, 90, 73,146,192,165, 63, 7, 85,113,141,154,156, 82, 97,183,166,136, 10,134,149,251,225,181,100,125,243,207,
+127, 46,241,154, 19, 34, 77,237,209, 82,154, 10,130,207, 33,208, 95,182, 87,179,166,217,146, 72, 36,123,202,202,202,222, 4,240,
+155,189,251, 78, 14,250,243, 80,102,118,135,153,221, 22,164,158, 41,124, 8,209,131,197,142, 65, 54,180,212,167,247, 76,204,125,
+ 84,187,230,214,173, 91,200, 47, 63,159, 64,133, 62, 31, 89,186, 98, 76,120,229, 53,116,236, 24, 4,149, 74,133,229,203,151,163,
+117,235,214, 88,178,100, 9,213,136,124,134, 73,165,210, 9,126,126,126, 45,239,222,189,155,160,215,235,191, 5,112,166,230,243,
+199, 15, 8, 17,115, 56, 29, 12, 22,203,249,123, 64,100, 3,154, 47, 73,165,210, 57,126,126,126,129,119,239,222,189,163,215,235,
+215, 2,248,142, 41,235,254, 29,154, 44, 22,107,189,151,151,215,152,164,164,164, 15, 1,236,199, 51,196, 95,110,180, 24, 77, 70,
+243, 95,168, 89,117,159,144,127, 90, 62,255,223,108,209,179, 64,161, 5, 8,149, 14, 30,189,161, 1,147,213,176,166,136, 10,134,
+133,243, 14, 40, 52, 3, 65, 54, 8,107,125, 3, 38,235,175, 53,153, 0,133, 79,235, 41,191, 62, 5,161,234, 62, 95,204, 53, 95,
+ 11, 11, 22, 44, 32,167, 78,157,130, 88, 44,134,193, 96,192,160, 65,131,240,217,103,159, 81, 76, 25,194,104,254,133,154,255, 73,
+ 56,204, 33, 96, 96,104, 16,242, 79,205, 24,245,118,130,145, 28,244,191,142, 92,246, 92,176,208, 2,176,164,160,204,146, 77,189,
+157, 98,108,162,230, 85,228, 82,179,193,134, 15,248,150,135, 40, 53,102, 83,111, 53, 94,243, 79,248,135, 72,240,233, 63,247,188,
+252, 27,169,105,170, 34, 35, 35,153,131,194,192, 96, 59, 83,240,100, 79,195,199,159, 25,163,197,192,240, 47,135,122,225,158, 9,
+ 64,122,229,242,143,213,100, 96, 96, 96,120, 6, 13, 23, 40,212,221,160,205,158,144, 96, 99, 26,218,253,194,104, 54, 74,147, 13,
+ 64, 1,192, 1,143,198, 32,169,234,210,219,208, 48, 27, 67, 0,152,153,227,201,104, 50,154,140, 38,163,201,104,254,205,154, 13,
+105,255, 27,171, 36,107,235,101, 24,254, 87,252,112, 40,163,249, 84, 25,244,159,217,119,130, 14, 32,216, 80,185,116, 96,206, 59,
+163,201,104, 50,154,140,230, 51,175,249,159,132,169, 58,252,119, 33,252,215,230,156, 16, 87, 0, 85,131, 92,198,160,156,242,131,
+ 16,179, 1, 0, 37,184, 65, 8,238, 3,104, 91,185, 62,141,162,236,238,141,202,192,192,192,192,192,240,119, 17, 4,224, 6, 0,
+ 87, 0,195, 0, 68,160,114, 84,133,191,213,104,137,156,218,184,130,195,106, 79,209,196, 15, 0, 8,139,138,133,133,142, 54,228,
+221,111,242, 67, 86,234,230,227, 72,192, 63, 72,193,248, 66,105,102,124,147, 7, 67,107,235, 35, 31,163, 81,201, 38,100,231, 21,
+237,185, 19, 87,122,212,158,109, 21, 10, 47,133,208, 81, 57,182,194,100,110,203,231,241, 82, 77,133,197,225, 5, 5, 9, 37,141,
+200,134, 99,125, 43, 63,253,148, 80,199,179,110, 80, 60,177,137,229, 36,231, 81,165, 40, 37,165, 89, 82,218,187, 48,137, 28, 58,
+244, 2,177,247,220, 80, 44,244,147,200,100,157, 4, 66,113,176, 88,166,108, 67, 19, 32, 95,155,145,108, 52, 91, 46, 88,141,250,
+ 40, 66,227,127,118,156,171,137, 0, 86, 0, 0,250,247,255, 5,109, 33,199,250,170,140,227,173,254,183, 49,241,236, 89, 84, 13,
+ 46,251, 17,128,149,118,100,215, 1,128, 23,128,162,182,109,219,234, 99, 98, 98,114,158,214, 53,218,148,243,206,192,192,192,192,
+240,204, 25,173, 97,120, 84,101,216,112, 99,120,175,128, 94,215,133, 66,145, 55, 0,208,132,128, 38, 64, 89,113, 97, 84,118, 66,
+228, 32, 0, 80, 53, 15, 58,205, 21,202, 59,209,228,209,122, 43, 13, 88, 76,229, 73,197, 41, 87,187,216,146, 35,137,179,207,232,
+254,161, 3,198, 12, 31, 62,204,183, 93,219,118,173, 0,224,118,204,237,135,199,143, 71,196,157,253,133, 58, 92,150, 19,255, 99,
+147, 2, 40, 16,126,214,185,115,199, 94,145,145, 55,150, 0,152,209,212, 35,232,228, 36,157,117,230,135,185,125, 6,140, 89, 35,
+ 1,236,123,224, 10, 29,149, 99, 71, 62, 55,184,227,251,111, 79, 99,189, 49,119,185,247,245,139,255, 91, 37,117, 13, 44, 36,180,
+249, 76,153,118,220,239,245, 77,156, 92,211, 63,214,101,176,190,205, 63,197,218,240,117,119,165, 33,255,225, 56, 66, 91,199, 81,
+ 20, 5, 54, 95,124,200,185,101,175, 3, 14,253,222, 43, 0, 96,115,143, 49,185,107, 64,168,218,213,227,240,184,215,222, 21,138,
+ 21, 26, 14,216, 60, 0, 20, 50,147,239,225,236,119, 43,148,239, 44,222, 21,116, 49, 58,197,242,235, 15, 91,202, 41, 30,119,140,
+ 62,235,110,195,245,233, 41, 41, 14,240,242,122,244,254,203, 47, 23,192,187,197,109, 60,106,107, 6,172, 67,209, 55,153,104, 11,
+ 60, 50, 90,201,201, 80,218,154,215, 65, 67, 95, 28,152,154,114,127, 73,102, 70,234, 81, 22,135, 67, 23, 20,149,189,231,228,164,
+ 46,205,203,211,133,160,178, 33,183, 74,165,146,228,230,230,154, 0,152,254,202,243,206,192,192,192,192,240,204, 16, 81,105,174,
+ 34,106,174,168,211,104, 9,133, 34,239, 43,255, 59,238,248,227,133, 52, 0, 64,104,144, 11, 62, 94,186, 57,108,239,166,200, 56,
+ 0,232,222,127,184,207,146,143,222,198,165, 59, 58, 16, 66,208,177,181, 19,134,140,124,193, 54,227,161,241,239, 50,118,236,243,
+ 47,207,157, 59,103,196,131, 7, 15,146,247,239,223,255, 59, 0,244,238,211,167,245,242,229,203, 95, 92,163,116, 20,124,127,232,
+135,140,114,237,189,235,141,217, 91,161, 91, 75,119,223, 54, 45, 38,124,255,213,102, 86,191, 65,207,143, 79, 70,217,138,242,204,
+132, 12, 91,182, 85,169, 84,179,185, 92,174, 2,120, 52, 27,123, 21, 38, 19,113, 1, 0,139,149,150, 41,221,124, 75,216, 60,161,
+ 85, 32,224,221, 45, 41, 45,221, 83,156,113,111,103,125,154, 21,102,115,224, 59,111, 77,102,221, 76,200,131,119, 96,111,246,134,
+ 21,159,128,182,154,149,239,126,180,116,108,228,213,239, 81,166,197, 57, 27,119,141, 91, 51,193,221,189, 27,251,179, 21,210,129,
+ 20,133, 87,189,186,191, 54,106,201,238, 67,220,206,173,229,168, 48,211, 56, 25,149,215,125,219,250,207, 86, 95,220, 54,236, 39,
+ 0, 59, 0,252, 10,160, 65, 83,231,232,228,248,237,236,249,235,165,101,198,255,239,237, 93,105,178,240,229,158,131,184,149, 70,
+195,207,215,143,227, 50,123,149,116,199,210, 41,187,245,143,230,217,170,205,238,182, 4,208, 19,136,117,196,212,197, 3,240,205,
+202,101, 80,171,203, 32,147,165,130,130, 6, 64,155,202, 47,222,231,231, 34, 13,192, 71, 58, 29, 36, 75,166, 97,208, 77, 96, 94,
+ 7, 64, 7,224, 34, 85,223,172,241,196,178,226,157, 15, 87,183,117,110,209, 54, 56, 38, 46, 3, 87, 34,182, 32, 39, 59,197,161,
+160, 32,119, 79,179,214, 29,136, 68,225, 28, 84,152,157, 8,185, 3, 18, 41, 98, 29, 89, 84, 84,144, 13,192, 98,203,193,118,113,
+113, 89,228,238,217,181, 79,213,121,119,244,234, 88, 80,181,142,197,230,124,155,155,120,253,109,166,108, 97, 96, 96, 96, 96,192,
+163,106,194,234,141,223,195, 27, 52, 90, 0, 32, 21,113, 16,151,152, 13, 0,112, 16, 1,179,166, 78, 66, 94,110,142,143,209, 66,
+227,181, 73,175,224, 70,108, 22,226,146,114, 64, 8,129,143,135,205,147,112,131, 13,186,243,107,175,191,214,247,244,153, 51,215,
+ 22,204, 95,240, 13, 69,225, 50, 0,236, 8,255,178,251,194, 69, 11,223,124,101,210, 43, 3, 15, 29, 58,116, 7, 64,163,140, 22,
+135,146,109, 94,189,114, 25, 63, 61,183,188,124,246,220, 15,233, 57,239,205,222, 0,224,121,155,156, 12,151,171, 72, 79, 79,151,
+178, 88, 79,206,165,249,249,178, 15,207, 15, 28,179,230,126,114,106,225,205,211,199,142,117, 9, 8, 8, 64,122, 70,118,207, 85,
+ 27,183,119, 56,121, 90, 52,185,164,216, 48, 70,159,123,175,214, 73,155, 5, 92,238,157,197,171,182,117,164, 29, 90,179, 62,126,
+115, 40, 2, 91,185, 33, 67, 87,136, 62,131, 70,112,162,174, 95, 15, 3,108, 54, 90, 53, 7, 15, 28,107,164,117, 29,150,239,185,
+ 58, 96, 84, 15,183,206, 44, 22, 27,165, 6, 51,114,138, 42, 96,165,129,222,254, 10, 12,222,187,145,147, 95,102, 30,189,244,135,
+180,209,151, 55, 13,215,150, 23,101,206, 4,112,184,254,159, 33,142, 30,106, 57,226,210, 74,106, 53, 89,101,229,143,124, 10,143,
+109, 5, 5,226, 84,143, 80, 79, 0, 95, 3,126,192,207, 51, 95,134, 70,179, 95,163,209,140, 85,107, 92,162,124, 94,158, 76,185,
+123,251,203, 74, 13, 38,220,189,115,187, 36,160, 83, 12, 41,201,215,189, 91, 94, 86,112,232, 30, 16,227, 7, 28,168,212,152,140,
+122,140,214,253,251,247, 10, 39,191, 20,194,185,249,176, 4, 9, 18, 9, 2,123,140, 66, 81, 78, 58,119,240,228,197, 93, 13, 37,
+ 69, 66, 39,141, 23,238, 93, 58,136,156,212, 7, 29,203,141, 21, 63, 58,122,118, 15,249,233,235,121,198,134,162, 91, 46, 46, 46,
+139,166, 78,157,250,105, 78, 86,236,103, 3,199,172,105,159,156, 90,120,243,229,197,191,117,153, 62,186, 53, 78, 70, 23, 99,217,
+235, 33, 19, 0, 48, 70,139,129,129,129,129, 1,168,167,215, 33, 11, 0,142, 31, 63, 94,107,251, 29,171,149, 32, 46, 41, 11,113,
+ 73, 89,184, 22,155, 3, 19,225, 98,195,170,197, 88,187, 98, 17,242, 13, 44,252,120, 41, 13,241, 73,217,136, 79,202, 70,110, 65,
+105,109, 18, 79, 84, 41,173, 89, 33, 10, 90,191, 94,190, 58,172,143,164,159,163, 82,169,188,127,231,155,178,133,239,105,253, 23,
+191,147,198,227, 26, 5,233, 18,169,164,199,193,131, 7, 2, 52,206,106,137, 84, 42,251, 64,236,222, 97,151, 66,241,135,153,210,
+235,173,166, 18,169,253, 70,140, 24, 54,184,191,139,139,134,158,182, 33, 42,182,173,191,159,185, 77,235, 54, 61, 69,234, 54, 35,
+234,217,236,177, 38, 77,211, 96,177, 88,208,106,181,200,204,204, 68, 98, 98, 34,226,227,227,145,150,150,172,165, 9,225, 90, 65,
+179, 92, 93, 61,192,225,240,225,221,220, 11,219, 54,172, 16, 47,253,244,227, 96,161,132,127,180,134, 17,122,172, 89,158, 95,112,
+232,196,169, 51, 25, 39,247,111,179, 2,128,174,160, 20,103,175, 63,192,141,187,105,246,158,200,154, 67, 56, 52,207, 72,121, 80,
+108, 73,138, 96, 47,249,100, 78,218,133, 11, 23,147,139, 74,140, 40,209,155,160, 47, 55,163,194,104,133,217, 74,195,203, 89,136,
+ 35, 31,182,197,177,223,162, 53, 20, 69,173,111,232,120, 86, 84,152,173,189,252, 36, 24, 31,210, 12,126, 30, 18,100,196, 93,198,
+236,249,235, 17,153, 88,129,130,130, 66,152,203,114, 65,151,166, 35, 55,233, 6, 44, 86, 43,105,232,188, 63, 34,168, 0, 0, 4,
+ 2,193, 71, 63,254,116,202,109,225,178, 13,174,131, 71,191, 34,233, 61,228,101,201,232, 41, 75, 92,199,190, 27,238,198,226, 10,
+ 62, 2, 0, 63,160,196, 6, 77, 1,128, 33,201,137,241,102,163,209, 74,151,155,172, 8,244, 84, 32, 57,238, 58, 60,218,245, 45,
+151,201,157,133,154,102,173,192,225,114, 17,216,231, 37, 72,100,142,112, 86, 55,235, 36,149, 11, 58, 84, 59, 79,191,212,103,178,
+ 22, 45, 90,244,232,154,168, 60,239, 0,176,245,199, 6,231,134,253, 51,186, 37, 51,154,140, 38,163,201,104,254,231, 53,235,242,
+ 34,255, 18,194,107, 89,240,216,104,213,197,195,180,124,196, 37,102,163,147,159, 59, 90, 53,119,197,181,248, 2,124,123, 54, 13,
+187, 78,167,224,236,173, 28,208, 28, 25,178,139,129,251,201, 90,220, 79,201,109,112,252,108,182,128, 59,238,157,119,138,230,182,
+ 11, 40,238,246,191,147,179,224,238,124, 63, 96,222,188,194, 89,108, 1,119,156,178,153,108,255,135,115,223,157, 32, 19,139,249,
+198, 10, 35, 90,182,240, 18,190, 61,115,214,100, 74, 41,176,121, 78, 36,153,187,191, 82, 32, 18,237, 92,250,233, 7,130,245, 63,
+222, 79, 45, 51,162,236,240,101,109,194,156, 15, 23,230,115,184,194,109, 50,119,127,155,219,254,152,205,102, 84, 84, 84,192,104,
+ 52,194,100, 50, 33, 35,237,222,136, 95,127,124,127, 80,139,102,142,131, 4, 66, 33, 8,128, 98,131, 5,137, 89,122,132, 12, 24,
+200,238, 20, 20, 20, 40,117,245,127,189, 54,173,162,162,148, 34,154,176,101,199,143,236, 99, 31,248,249, 38,190, 57,126, 29, 71,
+127,187,137,107,231, 78, 90, 8,109,126, 60,255,151,212,181,181,143,212,181, 93,138,212,173,189,246,241,226,222,182,222,225,153,
+217,108, 22, 9, 25, 16,250,203,212, 25,111,255, 79, 95,146,167,219,185,121,113, 70, 78,102,242, 61, 1,143,178,136, 5,108,148,
+150, 91,176,251,215, 76,140, 93,113, 11,119, 83, 75, 65, 8,105,112, 2,111, 26,120,111,220,235,239, 91,205, 38, 19,124, 61,165,
+216, 23,190, 18, 35, 66, 58,160,127, 59, 37,186,180,146, 64,204,169,192,157,216, 56,124,183,111,183,133,166, 89,115, 26,184, 17,
+ 7, 87, 46, 81, 0, 80, 90, 90,250,254,188, 15,230,228, 24, 45, 52, 76,102, 26,166,202,215, 95,191,251, 60,199, 90,174,127,191,
+114,187,168,106,219,213,117, 51,111,122, 99,250,188,144,157,223,254, 50,240,240,249, 44,150, 54,207,132,179,167, 14,193,181, 89,
+ 75,240,216, 44, 17, 40, 0, 20, 5, 80, 20, 8, 33,112,246,242, 71, 57, 77,227,135,237,159,184,163,158,246,106, 85, 38,107,202,
+148, 41,184,119,239,222, 19,231,253,225,131, 36, 60,124,144,132, 95, 78, 95, 1, 0, 56,122,117, 44,112,244,234, 88,160,106,209,
+101, 7,243,103,142,129,129,129,225,153,143,104, 85, 45,174,213, 87,212, 89,117, 88, 94,110, 72,122,126,220, 43,112, 85,187, 72,
+ 71,246,123,149, 23,245,176, 16, 57, 89, 41,120, 16, 31, 3,125,185, 25, 60,101, 11, 64,232,130,230,222, 94,136,142, 59,106,218,
+180, 58,162,148,182, 84, 36,213,165, 55, 98,132,171,199,131, 88,138,181,122,149,231,149,248,184,130, 78,251,230,127,141,151, 95,
+150,170, 86,175,242,188,146,156, 32, 97,137,133,164,199,228, 73,227, 41, 22, 69, 48,111,222, 92,140, 28, 62, 24,175, 77,158, 72,
+237,217,179,187, 91,161,141,123, 73,131,251,197, 71,159, 44,230,107, 11, 45,198,107,241,165, 21, 98,137, 72,116,241,126,105, 89,
+160,183,167,104,232,152, 87, 51, 35, 14,238, 92, 15, 96,146, 45, 90, 85, 6,203,108, 54,195,100, 50, 1,128, 21, 0, 88,172, 71,
+175,121, 37, 70,232, 10, 43,160, 45,172,128,197, 74, 99,204,184, 73,162,235,145,183, 38, 1,168,163,189, 22, 77,155, 45,102, 28,
+254,249, 6, 50,174, 31,162, 41, 22,187,168, 90, 99,120, 72, 93, 91,251,184,184,120,158, 31, 62,102,162, 51, 95,248,168, 26,182,
+164,172, 2,123,182,175,170, 55,159, 44,138, 34,180,213, 82,104, 49,155,203, 90,182,104,153,225, 23,208, 65,120,225,127,167, 71,
+ 92,252,229,112,169,165,229, 68,135,135,201, 89, 96,115, 5, 96,243,132,168, 48,217,246,103, 65,251,224,202, 22, 0,212,235,211,
+231,110,248, 63,246,190, 59,172,138,227,109,251,222,221,211, 11, 29, 14, 77, 64, 65, 4, 59,118,236,177, 19,107, 52,177, 68,141,
+ 70, 99, 77, 52, 49,106, 98, 18, 19,123,137,189,198,196, 22, 99,239,189, 70,177,198,222, 65, 5,165,119, 56,212,211,203,182,239,
+143, 3,138, 74, 57,104,222,239, 45, 63,238,235,218,235,156, 93,206, 62,204,236,204,206,220,115, 63,207,204, 76,153,254, 35,245,
+237,154,171,176,152, 12, 48, 27,245,208, 20, 21, 64, 38,160, 17,125,253, 24,195,179,244, 20,125,230,131,245,229, 91, 34, 50, 0,
+100,148,190,146,159,159, 31,121,253,234,149,227,183,174, 95, 29,229, 21,212,140,180,208, 28, 94, 68,221,226,210,159,223, 61,110,
+ 54,107, 34, 97,147,155,242, 0,156,173, 72,184,116,112,116,118, 26,245,229,244,209,206, 50, 5, 25,149, 86,136,228, 76, 13, 88,
+153, 47,188,106,212,126, 37, 43,114,182,252,182, 12,245, 64,247,176, 65,184,246, 56,133, 61,187,111,125, 55, 0,199, 0, 24, 42,
+ 34, 89,247,238,221,131, 72, 36,122,173,220,107, 7,215, 66,137,235,176, 48,127,146,243,182,165, 35, 1, 0,157,219,117, 24, 11,
+ 96, 92,117, 59, 83,141,106, 84,163, 26,255,177,120,115,251,157,151,215,202, 37, 90,201, 79,174,181, 0,128,144,230,221,243,148,
+ 82,129,171,128, 36,144,157, 22,135,191,150,125, 13,142,227,209,115,204, 82, 56,212,242,130, 76, 68,193,172,203,211,229,199, 93,
+174, 40, 86, 7, 4, 65,119, 91,255, 71,122,173,137, 19,130, 28,119,237,210, 9, 1, 96,215, 46,157,112,194,120, 63,199,223,254,
+ 72,172,213,170, 93, 51,240, 44,139,222,253, 62,198,224, 33,131,145,148,101,192,193, 43, 41,208, 27, 45,118,205,150,147,185,215,
+ 13,115,119,243,136,248,102,100,132, 66, 64, 17, 68,157, 0, 39, 42, 85, 77, 51, 20, 37,100,143,223, 41,202, 24, 48, 96,136,123,
+228,169,125,157, 89,247,186, 97,198,220,103, 15, 43,179,103, 54,155,193,178, 44,204,102, 51,104,154,134,171,123,224,169,110, 31,
+ 47, 75,203,204,210,158,204, 42, 48,181,210,211, 12,178, 11,205,200, 41, 52,163, 80,111,133,151,131, 11, 24,218,210,168, 60,123,
+ 60,207,111,255,232,227,225,159, 1, 32, 9,146,249, 83,151,249, 44,214,246,151, 87, 36, 43,162,223, 80,143, 43,247,226,240,226,
+238,233, 2,158, 99,108,171,184, 19, 92, 90,197,207, 21, 60, 69,128, 19, 9, 8,154, 34, 73,206,106,213,209, 42,149, 71,228,229,
+200, 51,125, 76, 76, 60, 40,145,228,229,111,141, 22,214,238, 26,147,253,226,230, 58, 0, 88,189,102,213,242, 54,221,134,138, 46,
+223, 79,132,145, 6, 90, 55, 13,193,145,189,155,204, 60, 79, 79,215,103, 62, 88, 87,133, 74,232,236,231,231,247,181, 80, 44,238,
+ 44,147, 59,248,121,120,251,147, 86,134,133,149,102,161,112,243, 37, 37, 74,215,110, 28, 41,186,198, 88, 45,145, 86,189,122, 53,
+128,114,249,245,223, 55,159,116,254,125,245,242, 79,188,221, 20,240,115, 23,225,248,229, 2,150, 22,112,164, 42, 32,148, 0, 0,
+127,149, 35,158,220,191,132, 71,143, 30,163, 81,235, 8,184, 57,212,128, 82,196,242,185, 47,254,201,247,244,242,109,146,157,149,
+ 46,122,147,104,121,121,121,205, 26, 62,124,248,108,111,111,111,172, 90,181,234,229,245,210,229,222, 16,104,245,219,225, 23, 8,
+168,165, 2, 96,151, 27,177, 26,213,168, 70, 53,170,241,159,165,106, 1,165,214,208,122,141,104,149,248, 70,123,247,238,253,214,
+110,237,233,217,249,112, 83, 10,224,225, 83, 11,195,190, 94,142,237, 43,191, 5,203,210,224,121,128, 97,237, 91,153,128,231,133,
+127,127, 57,161, 86,221,154,181, 40,143, 97, 67,229,198,157,187, 12,178, 97, 67,229,198,134,141,220,138,190,156, 80, 43, 81,107,
+242,111,203,176, 44,254,137,206, 65, 84, 98, 17,162,146, 52, 80,202,236, 95,230,139, 18,139, 38, 44, 89,188, 72, 36,160, 8, 34,
+ 58, 89,167, 75,203, 99,116,148, 80,104,149,203,196,188,133, 23,152,147,114,249,188, 46, 31,125,110, 60,190, 99,245,104, 0, 95,
+149,171,138, 21,207, 52, 44, 81,178, 74, 62,121,158,231, 9,128,227, 8,150, 77,203, 53, 65,103,165,145, 93,240,138,104, 17, 76,
+249,158, 83,165,119,112,136,163,131,242, 12, 69, 81, 18,158, 7,104, 43, 51, 8,222,193, 61,116,153, 47, 98, 75,147,172,155,209,
+ 25,136,123,112, 62,155,181, 26,134, 27,114, 98, 46,216,155,119,130, 0, 79, 81,224, 40,146,224, 8, 2,156,144,228, 45,224,121,
+238,205, 20, 25,170, 64,180, 74,200,150, 88, 72,205, 60,183,103,165,106, 84,175,122,216,123,197,198,249, 76, 90,181, 70,159, 94,
+ 37,146, 5, 55, 55,183, 17,223,125,247,221,172,190, 31, 15, 69,145,137, 64,118,129, 77, 13,180,208, 28, 68, 10,119,116,251,114,
+171, 95,166, 90,227,247,226,246,241,182,185, 15,118, 21,209,166,162, 85,229,166, 43, 46,227,182,209,160,135,198,104,203,207,180,
+ 17,161,212,207,235,255, 6,195, 11,224,234,225, 11, 15, 71, 17, 70, 14,250, 16, 87, 2,106,226,233,179,103,152, 57,231, 36, 60,
+157, 29,163,110, 92, 58, 86,187,105,120,251, 21,167, 14,239,126,139,196,101,101,101,205,217,177, 99, 7,194,194,194,102, 55,107,
+214, 12, 89, 89, 89, 37, 4,249,101,185,199,189,176, 9,182, 37, 68,235,254,253, 71,104,218,180,113,117,211, 82,141,106, 84,163,
+ 26,255, 18, 42,226, 34,255,139, 84,173,215, 20, 45,178, 36, 67, 37,199,219, 4, 9,120,158,156, 11,177,128, 67,141,154,181,193,
+151,234,188,121, 0, 12,107,159, 59,234,216,177,204,180,160, 96, 61,247,221,119, 41,173, 27, 54,114,123, 52, 97,188,223,179,134,
+141,220, 30,125,247, 93, 74,235,160, 96, 61, 71, 51, 66,150, 47, 94,175,171,100,109, 46,158,175, 74, 92, 28,217, 50,172,126, 32,
+ 53,103,215,243,148,137,191,197,198,136, 68, 34,186,134,187,156, 8,240,148, 83,254, 30, 50,177,153, 38,205, 33, 13,154, 90, 64,
+ 18, 77, 43,178, 82, 66,180, 44, 22,203,107, 71,158, 58,174,239,185,131,211,250,249,122,186,140, 76, 87, 27,145,146, 99, 64,170,
+218,128, 20,181, 1, 6, 51,131,199, 79,227, 1, 74, 20, 85,150, 77, 71, 7,215,179,187,119,110,247, 15,171, 23,164,170, 31, 82,
+ 83,181,121,219,118,127,169,212,249,172,210, 59, 56,196,191, 86,232,189, 91,231,247,121,220,140,206, 64,114,204,221, 44,198,172,
+217, 93, 21,146,245,146,108, 1, 60,199,115, 68,126,129, 70,105,102, 32, 69, 25,188,207,108,229,222,169,230,232,140, 12,142,223,
+202,194,137,195,123,112,237,194,137,119,178,225,228,228, 84,175, 67,135,142, 32, 4, 98, 88,104, 14, 22,134,131,165, 84,140,150,
+149,230, 64,243, 66,200,189, 27,131, 20,201,234, 85,100,235,179,207,186,231,167,167, 38,237,255,233,219, 49,216,121,228, 34, 18,
+178,105,196, 60,186, 14, 93, 97, 46,172,180,133,191,145, 88, 64,251,186,203,248, 17,253, 90,160,123,247, 62,232,222,239, 11, 72,
+ 92,253, 27,137, 68,162,184,148, 23,207,202,117, 73,102,101,101,205,121,248,240,225,236,123,247,238,193,203,203, 11, 86,171,245,
+181,114,175, 29, 92, 11,181,131,107, 33,246,153,109, 18, 67, 9,201,226, 56,190,186,117,172, 70, 53,170, 81,141,247, 68, 69, 92,
+228,127,137,154, 85,114,156,132,189,203, 59,148, 32,160,134, 39,110, 69, 37,162, 81,221, 64, 56, 57, 58,224, 89, 92, 26, 40, 82,
+ 8,146, 0,104,198,254, 78,134,183,210,123, 87,172,112, 66,114,162,130,252,109, 67, 98,173, 47, 39,212, 74, 92,177,194,233, 6,
+111,165,247, 2, 24,206,243,128,141,108,217, 8, 23, 91, 5, 94,192,115,180,159,167,171,156,186, 27,175,207, 35, 73,202,236,230,
+ 36,229,220,156, 36,164,155,131, 88, 40, 18, 82, 28,195,147,214, 26,170, 90, 38,158,227,236,217, 87,239, 53,215, 33,203,178, 32,
+ 8,146, 45, 38, 98,138,212, 60, 35,138, 76, 20,178, 11,205, 40,208, 90, 81,199, 87,129,243,145, 7, 12, 44,109,220, 85,166,218,
+ 38, 20, 57,213,174, 85, 3, 63,206, 91, 1,163,153,197,243,116, 29, 68, 18,137,151,167, 87,131,135, 6, 52, 92,103, 0, 0, 32,
+ 0, 73, 68, 65, 84,195, 39,206,144, 76,222, 24,135,209,157,221,240,237,213,184,116, 67,182,116, 70, 85, 74,150,101, 89, 24, 77,
+ 22, 81,118,110,129,139, 70,171,119,148, 73, 37, 70, 15, 87,167,220,178,126,107,170,162,162, 85, 2,185, 84,128, 62,225, 94, 48,
+ 89, 63,133,209,204,224,250,133, 67,239, 98, 38,208,211,167, 6,116,150, 82,228,170,152,108,149, 38, 93, 66,165, 7, 0, 34,176,
+178,108, 63,121,124,111,208,147,199,247,230,222,185,113,121,247,146,205, 23, 26,238, 88,247, 11,214, 30,141, 3, 69, 81, 4, 79,
+ 51,194,213, 71, 19, 81,195,153,226,117,180,144, 48,177, 4,244,249,106,132,182,252,176,193,238,245, 63,205,128,109,201, 8,115,
+121,100,171,248,235,236,102,205,154,161, 32,251,238,203,114, 63,115,250,229,188, 5, 20, 60,220, 86, 24,119,113,173,141,226, 83,
+130, 3,213, 77,100, 53,170, 81,141,106,252, 71,163,220, 13,164,237, 34, 90, 74,185, 20, 60, 37,197,213,123,113, 8,173,223, 24,
+219,142,221, 70,112,163,112,100,106, 25,240, 32, 43,157,109, 88,130,105, 63, 24,239, 3,184,223,183,175,188, 70,255,254,190,221,
+120, 94,248,247,134, 63, 52,105, 0, 16,216,208,102,134,227,120,240, 60,192,115, 54,194,101,191,164, 35, 72, 78,204,212,212,172,
+229,165,192,147, 52,171, 89, 33, 17,145, 46, 10, 49,229,225, 36, 22,137, 4, 2,176, 60, 97,206,204,140, 51, 19, 64,146, 61,230,
+222,116, 29,202,149,222,167,186,124,180, 84,157,148, 82,116,183, 78,190, 33,172,200, 42, 6,207, 3,117,124, 21,136,186,121,146,
+205, 78,127,241,220,152, 29,243,123,217, 42, 25, 40, 43,195,225, 97,124, 17, 10,245, 52, 10,117, 86,180,237,212, 71,212,182,107,
+ 95, 92,141,202, 5,199,208, 88,178,233,164,150,229,233,193,192, 83,186, 10,153, 38,111,221,143,174,161, 46,208, 75,132, 2, 65,
+ 97,221,224,128, 4,177, 72,200,104, 52, 26,241,235,191,162,160,144,137,145,175,163, 1,128,174,106,237, 41,210,211, 56,118, 51,
+ 11,199, 15,237,134, 76, 38,195,187,232, 55, 34,145,200, 89, 40,146,194,170,183,185, 11, 75, 14,235, 27, 7, 41,144, 0,164,192,
+217, 78,179, 79, 45, 22,227,245,196,152,155,245,216, 78,193,212,136,174,181,240,217,216, 41,240,173,221, 8,125,250,244, 71,227,
+ 90, 14,196,161, 27, 41,160,105, 70,235, 21,212,192,129,183, 41,184,207, 1,132, 1,184, 89,145,178, 85, 66,182, 28, 74,149,123,
+189,182, 65, 97,175,136, 22,144,159,252,192,165,186,109,169, 70, 53,170, 81,141,106,224,245, 61, 14,123,149, 38, 95,164, 93,170,
+ 9,199,195,221,205, 21, 82,133, 35, 18,179,173,208, 18, 42, 20, 24,120,176,172, 77,209,170, 64,120, 42,115,119,239, 99,199, 50,
+211,142, 30,205,221,114,236, 88,102,169, 64,239, 87, 74,214,203,207,178, 93, 50,101,218, 36,120,246,252,177,211,151,138,250,182,
+242,112, 33, 41,202, 40, 18,146,102,129,136,178,138, 4, 36, 45, 18,144, 22, 79, 71, 33,117,233,248, 30, 49, 79,224, 82,101, 54,
+ 77, 38, 19,186,118,237,138,158, 61,123,162, 95,191,126, 24, 56,112, 32, 66, 66,234,169, 72,138,176,240, 4,199,121,136,181,168,
+237, 65, 64, 96, 74,197,133, 61,191, 26,162,254, 57,242,144, 53,155,250,224,117,202,249,202, 38,207,115,249, 69,102,152,172, 44,
+ 10,116, 86, 20,232,173, 96, 60, 90,227,200,245, 12, 24, 45, 44,146,239, 29, 48,170,179,210,190, 54,231,188, 72,172,164, 40,190,
+127, 67,199, 75,251, 98,212, 8,181,131,148,124,209,190, 77, 11,181,187,155, 43, 67, 16,175, 20, 87,130, 32, 32,117, 84,193,197,
+217, 1,137,247, 79,227,220,146, 46, 70, 0, 63,217,243, 60, 75,195, 81, 46, 64,223, 86, 94,232, 51,224, 83, 52, 10,239, 97, 15,
+177,126,203,166, 92, 46,151,149,168, 87,165,151,117,176,148, 82,181,216,226,242, 38, 5, 18, 89, 25, 54,187,149,245,143, 52, 69,
+ 69, 39,239,223, 56, 79,153,104, 30,217,133,102, 24,243,226,240,215,146, 9, 23, 14,238, 92,196,169,156,133,152,210,175, 54,154,
+ 4,121, 56, 56,170,252,224,228,238,135,136, 79,167,125, 2, 64, 93, 89,222, 75,220,136, 4, 37,159, 89, 82,238, 37,127,203,200,
+200,168, 82,222,255, 5, 84,219,172,182, 89,109,179,218,230,127,130,205,255,205, 40,217,227,176,228,179, 42,174, 67, 30, 65,222,
+ 10, 4,251, 42, 96,178,170, 96,178,176,208,155, 88,104, 12, 86,104, 12, 52, 18,179, 12,136, 58,246,254, 41,180,169, 88,182,149,
+ 36,121, 30, 0, 97, 35,120,246,170, 39, 98,171,101,222,242, 37, 11, 7,237,105,218,196, 50,185,151,183,223,163, 68, 75, 6, 65,
+144, 70,146, 18,208,174, 14, 2,225,179,103,143,212, 55,174,156,234, 32,101,216,207, 12, 21,216, 97, 24,166,200,215,215,183, 88,
+137,122, 69, 33,235,213,150,245,251,231,228,247,129, 29,251, 46,241, 88,185, 96,154,129,164, 68, 28, 33, 16, 69,177,180,113,183,
+ 49, 59,102, 3, 42,160, 31,164, 72,250,244,214,131, 39,225,206,174,126,120,145,174,135,222,196,192,202,112,112, 81,138,144,246,
+248,172, 53,241,217,221,125,186,140, 71,219,222,225,177,237,138,125, 26, 85, 35, 34,162,199,199,225,225,173,169, 95,126,249, 25,
+161,161,161, 48, 26,141, 32, 73, 18,126, 53,107, 35, 49,246, 1,110,158,156,199, 26,242,146,126, 7, 48,183, 20,201,176, 27,185,
+ 26, 11, 78,223,205,193,201,195,123, 65, 9,197,239, 82,188,164, 76, 38,147,150, 69,174, 74,147,174,151, 63, 22,138,165,197,131,
+ 0,238,181,138, 88, 54,206,196,197, 62,121, 58,114,216,144,122, 14, 78,206,232,217,127,112,206,141,171, 23,122, 31,254,235,143,
+ 85,121, 73,169,131,126, 94,180,198,177, 91,115,111,194, 85, 41, 70,161,158,195,174,228,167, 65,176, 83,131,205,202,202,154,147,
+154,120,119,248, 63, 39,191,239,211,177,239, 18,143,187, 7,103,190, 12,162, 39, 41,193,206,234,118,165, 26,213,168, 70, 53,170,
+ 81, 10, 99,223,248,220,104, 23,209, 50,153, 76,137,237,186,246, 1,199,241, 96,121,128, 99,139,149, 39,238,149,250,196,210,166,
+196,247, 77, 29,199,177,183,215,109,220,210,179,105,203,142, 84,125,127, 37, 52,121, 89,184,249,207, 69, 6, 28,127,195,158,251,
+243,242,158,235,100,158,193, 31, 15,250,164,255,254, 17,163,198, 23,118,232,212, 73,161, 82,121,153,211,210,211, 12, 91,119,236,
+164,207,158, 58,218,129, 3, 51, 36, 47,239,133,174, 34, 59, 69, 69, 69,171,203,186, 46, 17, 43,219, 2, 8,164, 4,132,197,168,
+126,174,168, 18, 81, 73, 79, 29,176,112,222,236,164,161, 99,166,136,131,124,107, 35,167,136, 66, 98, 90, 22,158, 93, 57,106, 78,
+143,189,115, 88,147,118,127,180,157,166, 50,203,184,150, 6, 96,229,205,155, 55, 26, 68, 68, 68,244,232,220,185, 51, 63,118,236,
+ 88,240, 60,112, 97,227, 4, 62, 63,241,230,129, 98, 21, 43,254, 29,203, 37,249,202,141, 7,174, 3, 59, 52, 23,184, 57,140,198,
+150,189,167,104,240, 92,114, 21,205,120,214,240,175, 41,176,185, 11,109, 75, 58,188,121, 88,232, 87,241, 99, 34,165,167,192,128,
+ 40,207,114,242,251, 22, 71,127, 17,251,164,209,139,216, 39,163, 0,228,236,223,185,233, 56, 0,152,141,198,241,145, 23,142, 37,
+ 63,137,190,251, 89,223, 97, 83,107, 55, 8,107, 33, 56,176,109, 37,172, 38,253, 33, 0,118,215, 87,137,152, 74, 42, 41,247,106,
+ 87, 97, 53,170, 81,141,106, 84,163, 28,188,123,140, 86,234, 83,219,122, 90,255,213,208,102,229, 12,223,182,109,251,252,237, 59,
+246,180, 53, 89, 44,190, 60, 68,169, 44, 99,185,172, 99,241,139,189, 54,140,217, 47,238,186,185,213,105,184,117,211,186,159,182,
+110,249,173, 35, 56,182, 46, 1, 36,241, 4, 46, 73,105,118, 68,101, 36,171, 66,178,148,171,253,163,219,199,203,140,121,121,186,
+237, 85,189,215,152, 23,147, 69, 82, 86,191, 63, 86,205, 91, 74,146, 84,119,150,229,132, 28, 75,191, 96,173,166, 95,141,234,152,
+ 99,176, 59,202, 13,249, 21,252, 45, 26, 64,116,100,100,100,251,200,200,200,150, 0, 86,195,182,135,226,221,247, 41, 23,115,158,
+182,203,244,105,211, 47, 76, 5, 17,192,113, 60, 24,150, 75, 22, 25, 13, 93,170,104,198, 47, 40,168,182,220, 74,179,111, 5,192,
+151, 14,132,127, 73,180,156,106,200, 1,248,217, 73,180, 0,219,162,162,155,222,186,200, 48,139, 51, 51, 82,247,110,248,245,235,
+113, 0,106, 1,184, 6, 96,221,255,175,114,175, 70, 53,170, 81,141,106,252,199, 96, 44,222, 94,180,212, 62, 69,235,255, 23, 10,
+ 10,226,181, 40,120,255, 77,122,243,242,158,235, 0,188, 53,115,207,240,158,118,163,158,107, 14,226,185,230,224,187,222,175,207,
+ 73, 80, 3, 9, 35,222, 51, 25,246, 4,178, 95, 45, 62,254, 21,228,230, 62,213, 35, 23,173,222,183, 88,118,237,220,241,108,207,
+158,189, 66,158,164,132, 28, 79,137, 24,158, 16, 50, 28, 33,164,105, 14,102, 43, 77, 91, 25,134, 6,203, 88,193,177, 52,207, 89,
+105,216, 86,135,255, 55,144, 12,224,135,255,174,114,175, 70, 53,170, 81,141,106,252, 71, 19,174,255, 57, 68,171, 26,255,167, 17,
+ 31,247, 34, 54,188,250, 49, 84,163, 26,213,168, 70, 53,254,143,147,172,210,159, 0,108,177,231,229,205, 28,168,202,206,220,239,
+ 50,251,224,124,181,205,247,182, 41, 4, 32, 6,160, 4, 80,153,107,171, 7,138,247,237,251, 31,158,247,239, 1, 60,168, 46,247,
+106,155,213, 54,171,109, 86,219,252, 63,107,179, 50,219,231, 81,141,255, 82, 2, 86,109,179,218,102,181,205,106,155,213, 54,171,
+109, 86,219,252,207,179,249,191, 25, 99,203, 56, 0, 84,187, 14,171, 81,141,106, 84,163, 26,255,129,112,115,171,163, 4, 94,198,
+245, 86, 10,185,123, 61, 79, 0, 48,228, 62,205,174,126,122,213, 40, 3,165,247, 57,124, 45, 70,139,124, 71,131, 66, 82, 32,158,
+ 46,119,112,123,170,112,114, 75,255, 15,127,184, 68, 72, 77,197,164,110, 29,106, 29, 9, 13,148,245,171,202,141,114,143,144, 63,
+189,106,183, 74, 81,168, 66, 38,193,187,169,236,125, 18,161, 80, 5,122, 40,253,154,255,227,224,219,224,195,255,130, 60, 74,234,
+215,175,223,186,126,253,250,173, 1, 72,254, 13,131,114, 85,200,167, 53,130,195,175,168,130,154, 92, 84,120,214,249,228,223, 78,
+176,210, 59,216, 77,233,215,236,160,210,167,113,129,210,187,177, 70, 89,163,217,101, 7,247,122, 65,149,221,231,215,119, 97,221,
+ 57,187,163,118,251,245, 93, 88,183,172,191,187, 68,172,113,152,181,231,249, 2,183, 62,191, 42,171,219,149,119,131, 95,219, 79,
+157,189, 59, 78,117,171,234,125,190, 33,225,209, 53, 27,180,207,241,169,211, 42,202,222,123,106,132,182,190, 31, 80,191,109,118,
+141,144,214,119,171,159,188,125,144,122, 4,182,150,186,248,159,148,184,248,159,146,184, 6,118,122, 95,123,222,222,222,178,186,
+117,235, 70,132,135,135,143,235,210,165,203, 55, 77,154, 52, 25, 27, 16, 16,208,253,191,115,160, 47, 87,133,252, 96, 22, 18,185,
+102, 33,145, 43, 87,133, 84, 58, 89, 70,161, 10,157, 79,144,108, 6, 65,178, 25, 10, 85,232,252,255, 41,101, 37,241, 12, 9,144,
+171, 66, 86, 56,120,213,191, 45, 83,213,233, 83,213,251, 93, 92, 92,186,123,120,120,124, 84,114,184,184,184,116,175,126, 3,222,
+ 25,165, 85,172,247, 86,180, 40,161, 68,126,109,232,168, 47, 27, 46,158, 61, 67,186,106,203, 17,172, 90, 48,237,137, 89, 95, 88,
+255,127, 98,206,221, 3, 91,222,165, 72,170, 70,233,107, 44,199,166,229, 38,220,110,254,111,216, 15,173, 41, 27,253,211,119,195,
+191,253,116, 80,215,128,174,189,191, 38, 98, 18,140, 71,237,167,104, 8,219,119,240,176,223,149, 75, 23,215,108,217,178,113,174,
+154, 9, 93, 33,148, 8,214,105, 82,163, 11,171,146, 6, 71,143,160, 64,129,194,253, 74,187,126, 95,122,221, 59,191,115, 27,107,
+225,186, 25,114,159, 62,250, 23,178,231, 81,187,118,237, 22, 20, 69,185, 77,154, 52, 73, 4, 0, 43, 87,174, 12,102, 89, 54, 47,
+ 46, 46,238, 14,222, 97,241, 83, 27,193, 12, 29,190,122,233,156,237, 31,126,216, 19, 25,185,122, 44, 89,177,254,131, 51, 39,246,
+ 13,212,103, 63,255, 87,246, 12,116,118,174,229, 8,145,195,227,175,191,155,171,138,248,160, 5,165, 51, 49, 56,115,229, 65,251,
+157,235,231,222, 6,234,181,212,230, 62, 45,119, 77, 49,206, 80, 52,211, 83,201, 71,112,134, 34, 0,248,244,173,206, 94, 73,119,
+245,144,177, 17,222, 18,193,131, 60,160,210, 77, 31,157,107,182, 61, 43,148, 72, 2, 72,146, 4, 73, 0, 36, 73,128, 34, 8,219,
+ 62,161, 86, 99,114,250,179,171, 61,254, 39,188, 39, 14,254, 45,179, 64, 9,220, 72,226, 85,250, 8,178,248,147,231, 53, 89,207,
+175,185,253, 11,255,198,169, 97,176,115,131,182,193,250,173,151, 19,242, 21,130, 14,223,156, 36,120,242,183,148,171, 43, 30,218,
+ 69, 0,164, 82,151,227,199,143,123, 68, 68, 68, 56,169, 26,244,187,108,207, 61, 98, 74, 87,255,196,137, 99,162,136,136, 30, 85,
+168,159, 33,221, 64,146, 59, 8, 64,200,113,252, 74,138,227,247,233,242, 98,227,128,170,237, 62, 37, 83,133,142, 38,193,219,221,
+206,112, 32,238, 26,115, 98,182,188,235,195, 21, 72, 28,187, 8, 69,162,111, 2, 67, 26, 53, 77, 79,122,113, 87,175,211,174, 96,
+204, 69,151,171,108,136,102,166,159,191,122,239, 67,129, 80, 72, 68,116,105, 69,153,129,139,239, 83,232,158,158,158, 31,173, 93,
+187, 54,168,117,235,214, 0, 0,134, 97, 28,247,239,223,239, 53,111,222, 60, 69,108,108,236,161,119, 52,235,235,225,225,225, 47,
+ 22,139,125, 1,192, 98,177,164,171,213,234, 20, 0,149, 14,252, 21,158, 65,238,224, 49,247,234,149, 43, 2, 0,104,223,190,195,
+124,255,118, 95,185, 80, 34,165,177,204,199, 97,209, 42, 10,227, 46, 78,185,121,235, 6, 1, 0,225,173, 90,207,144,187,215, 91,
+247,223,169,108, 73, 85,161,173, 72,224,219,240,246, 93, 7, 12, 30, 50,156,108, 80,199, 31,221,187,117,254,222, 8, 28,175, 82,
+157, 17, 8,100,183,111,223,174, 77,146, 36,197, 48,140, 41, 60, 60, 60,229,125,210,229, 19,210,250, 58, 1,210,207,202, 88, 54,
+169,227,239,206, 7,222,218, 56,134,114,242,107,250, 19, 40,193, 24,142,227, 82,181, 41,119,219,252, 31, 84,180,222,126,206, 85,
+181, 68, 10,196,223,124,250,249,196,134, 83,166,254, 40,253,122, 85, 36, 78,174,159,145,251, 63,149,100, 1, 0, 69, 82, 53,206,
+158, 59,171,146,139, 41, 0,128,206,196,224,195,136,136,202,123,132,154, 45, 47,145, 4, 17, 90,178,161, 13,203, 88,165, 2,161,
+216, 68,216, 8, 18, 8, 0,238, 62, 53, 35, 61,153,107,242, 79, 7,117, 13,216,177,231,239,180,148,180,188, 42, 55,106, 4, 37,
+ 66,120,135,238,232,218,173,135,211,237, 91,215,231,110,252,125,195, 15,140,149,222,192,209,220, 10, 83,254,139,140, 74, 27,115,
+175, 58,205,196, 74,247, 51, 3,198,205,115, 51,145,174,248,101,193,106,247, 43,167,119, 93, 78, 79, 13,227,146,147, 83, 77, 60,
+ 65, 60, 41,200,207,252, 70,159, 21, 23, 99,239, 35, 83, 42,149, 65, 74,165, 50,172,113,227,198,210,105,211,166, 9, 63,248,224,
+131, 87,148,125,236, 88,209,165, 75,151,188,151, 45, 91,214,243,209,163, 71, 38,157, 78,247, 80,167,211,197,163, 10,129,246, 94,
+ 94, 30, 95,125,220,191, 15, 58, 15,248, 18, 44, 71, 96,236,196, 41, 56,123,250,208,120, 0,255, 10,209,162,229,142,243,198,140,
+155,230, 17,222,162, 9, 53,119, 87, 12,100, 98, 1,122, 52, 15, 37, 62,159, 52,211,121,203,154,185,155,145,139,142,101, 41, 89,
+156,161,104,102, 67,119,203,144,190,173, 3,113,108,183,101, 8,186,124, 7, 82,238, 52, 63,245,216,143,207, 0, 32, 40, 98,146,
+131,132, 85,175,245,113,166, 84, 18, 86,189, 54, 40, 98,210,249,248, 51,107,181, 21,165, 69, 40,145, 4,236,222,181,171,142,139,
+131, 8, 2,146, 0, 69, 17, 16, 80, 36, 76, 22, 22, 3, 7, 13,249,215,170,185, 76, 85,167, 39,105,219, 44, 27, 28,240,167, 49,
+231,249,169,170,148, 9, 65,137,220, 78, 28, 59, 44, 80, 57, 73, 64, 81, 4, 40, 18,160, 72, 2, 73,217, 70,140, 30,253,185,211,
+251, 18,246, 15,219,170, 90, 76, 31, 28,218, 35,188,161,107,227,189, 55, 8,167,240, 15, 7,187,229,154,228, 35,247, 28,189, 56,
+132,111, 63,229, 22,207,115, 75,211,174,173, 62, 87,145, 17,179,217,156,221, 35,226, 67, 71, 66,160,144,159, 63,178,173,131,128,
+ 36, 64,179, 60, 24,150, 7, 91,188, 55, 42, 81, 60,130, 33, 73, 2, 60,199, 99,204,152,209,232, 17,241,161,129, 99,184, 52,251,
+ 27, 57,114,199,153,243,255,120,152,105, 14,203,214,110,153,171, 47, 82,207, 77,120,230,150,164, 43,202,157, 98,204,121,110,247,
+ 62, 24, 36,248,230,169,241, 81,227,118,157,184,137,134,245,235,129,229,108,233, 12,173,161,192,174,147, 55, 81, 55,180,174, 45,
+221, 28,143, 16, 63, 37, 90, 52,111, 1, 0,239, 68,180, 4, 18,135, 95, 58,246, 26, 62,167,247,192, 81, 80,121,120,128,228,233,
+222,231, 79,238,234,253,231,111, 75,167, 51, 38,205,178, 42, 25,227,217,151,253, 2,207,113,239,173, 58,249,248,248,120,180,104,
+241,106, 57, 70,134, 97, 80,171, 86, 45,164,167,167,135,190,203, 56,205,219,219,187,215,172, 89,179, 84, 61,123,246, 20,122,121,
+121, 1, 0,178,178,178,124,207,156, 57,211,116,214,172, 89, 57,153,153,153, 39, 81,193,138, 62, 44, 77,138, 72, 1, 40,169, 84,
+110,203, 35, 8,114,218, 87,159, 53,246,244,246, 41,115,163,121,181, 58, 75,252,221,151, 23, 9,129, 64, 84,252,123,144, 60,207,
+ 17, 21,168, 68, 93,133, 66, 97,153, 30, 10, 43,229, 24,206, 11,157,190, 32, 41,210, 86, 89, 25, 90, 93,144,114,191, 94, 21,148,
+184, 6, 66,177,104,195,199,131, 71,181,249,100, 64, 63,120,123, 56,225,252,181, 71, 24,255,213,183, 52, 99,165, 87,188, 83,227,
+ 65, 81,130,156,156,156, 36, 23, 23, 23,175,247,239,111,137,192,191,207,158, 86,157,191, 16, 57, 99,249,170, 53, 19,172, 22,134,
+230,120,254,229, 62,198, 50,153, 68,216,173,247, 32, 71, 85,237,112,233,154, 89, 95, 8,255, 15, 42, 90, 27,255, 21,162, 37,150,
+ 57, 12,250,249,187, 73,210,121, 59,111,226,228,250,241,185, 6, 77,174,199,203,145,130,163,243,125,189,166,176,233,187,164, 80,
+233, 17,210,154,160, 4,227, 8,138, 82, 16, 36, 33,230, 88, 46,149,177, 88,230, 27,243,158,103,190,111,238, 57,142,199,193,235,
+ 57, 85, 35, 64, 60,130,119,236, 61,172,242,116,150,192,100,101, 49,248,211,225,216,190,125,187,131,135,147, 24, 38, 11,131,165,
+203,151,107,117, 73, 39, 85, 73,169, 5,233, 93,251,124,123, 46, 62, 49, 39, 42, 37,211,180,175,170,105, 51, 91, 89,104, 12, 12,
+ 12,102, 18,117, 26,180,192,210, 21,117,165, 41,201, 9,223,110,251,115,243,228, 39, 79,168,237, 28, 69,206, 49,101, 62, 77, 45,
+243,165,243,106,216,195,209,197,109,119,255,113, 11,156,159,231, 8,192,195,138, 56, 71, 41, 6,141,156,236, 24,228, 37,131, 66,
+ 74, 57, 39, 36,167,123, 79,155, 62,253, 90, 60,203,183,212,168,227, 19, 42, 75, 79,205,154, 53, 7,244,238,221, 91, 62,117,234,
+ 84,161,159,159, 31,254,220,181, 63,160,125,143,129,125, 50, 50,179,253,120,158,135,167, 74,149, 58,230,243,129,199, 79,157, 58,
+149,156,154,154, 42, 92,178,100, 73,171,195,135, 15,215,207,202,202,178,123,100,202,242, 60, 76,102, 22,108,113, 7,169, 46, 50,
+ 87,153,159,250,250,250, 74,210,211,211,205,165, 84, 6,226,149, 80, 72,244,232,210,177,149,224,143,211,137,208,153, 88, 40,164,
+ 66, 36,102, 27,208,188, 73, 35, 98, 19,203,132,149,101,112,244,160, 94, 51, 61,149,124, 68,223,214,129, 80,185,200,177,117,221,
+ 2, 28,187,145, 16,145,173, 35,176,150,167,198,121, 75, 4,221, 20, 92,230,218, 15,154,215,246,234,220, 44, 0,119,154,215,246,
+186,114, 47, 38, 86, 54,112,249,164,116,157,240,124,193,153,201,218,178, 27, 30, 18,174, 14, 34,108, 57,155, 12,185, 84, 0,133,
+ 84, 0,133,196,246, 73,146,196,251,141,106,189,235,249, 81, 28, 59,154,162, 4,163,135, 12, 26,232, 51,116,200, 64, 30, 20,137,
+253, 7,143,247,219,185,115, 71, 38,109,181,108,102, 73,106, 75,121,245,231,181, 7, 74, 2, 42, 39, 49,166,111,142,130,163, 76,
+ 8, 7,185, 16,142,114, 33, 58, 55,246, 0, 69,190,115, 18, 93,198,247, 11,234, 57,190,127,205, 78,161,254,202, 58, 15,227,138,
+158,140,158,127,119,213,165,194, 78,223,172, 91, 89,223, 77, 87,104, 17,252, 50,109,140, 32, 45, 35,163,211,254,227,151, 59,179,
+150, 81, 49,140, 85,255,163,250,209,254, 50, 85,225,180,152, 27, 77,125,195, 63,145, 90,117,244,227,135, 49,105,181, 11,204, 18,
+ 68, 39,105,160,144, 10,160, 44,121,182, 82, 1, 20, 82, 33,148, 82, 1, 50,210, 18,145,175,167,174,165,187,145,157,112,249, 6,
+ 83,149,132,155,172, 44, 30, 36,232, 80, 51,180, 9,188,189,125, 96,233, 57,172,230,173,200,131, 71,111, 95, 62,178,200,144,245,
+236, 71,123,237,236, 58,113, 19, 51,166,140,187, 71, 0,247,139, 59,233,166,191, 44, 94,223,108,238,140, 47, 95,187, 54,109,206,
+154,102,239,174,100, 57,204,236,220,127,226,156,246,221,250, 67,155,159,141,235,231,246,161, 71,239,143, 49,108,212,215,112,118,
+118, 95,186, 98,254,119, 15, 25,179, 38,242,173, 54,215,171,110,187, 70, 13,235,237,244,245,241,241,227, 56,219, 46, 31, 60, 15,
+232,180, 69,248,238,155, 49,224,120, 30, 97, 77, 91,118,150,182,239,198,243,197,187,129,228,230,229,234, 99,158, 61,233,106,202,
+137,185,101,247,179, 52,153,104,181, 90,141, 7, 15, 30, 32, 54, 54, 22,209,209,209,200,203,203,131,147,147,147, 78,175,215, 87,
+ 73,188,111,220,184,241,208,200,200, 72,169,139,203,171, 77, 26, 44, 22, 11, 28, 28, 28, 48,116,232, 80, 97,247,238,221,125,123,
+245,234, 53, 34, 42, 42,106, 23, 0, 77,153,233,201,127,145,225,224, 25,250,123,199, 15, 58, 78, 0, 0,153,163,119,194,218, 63,
+143, 71, 87, 56,160,117,242, 9,104,211,166,109,109,240, 60, 8,240,171, 13,121,177, 89, 21,168, 68,138,155, 55,111, 6, 81, 20,
+ 37,120,213, 7,113,248,109,235,222,186,127, 95,125, 60, 96,241,210,101, 82, 71,133, 4,234, 34, 11,190, 24,214,223,238, 62, 88,
+230, 25,218,179, 77,155, 14, 71,231,206,249, 89,160, 84, 40,112,238, 86, 60, 38,125, 51,221,148,153, 20,181,140,231,132,235, 13,
+234,216,156,247,236, 42,121,252, 11,168, 83, 67, 9,135,190, 61,164,227, 63,235, 43,181,208, 44, 10,245, 52,204, 86, 22, 44,199,
+163, 72, 79,227, 73,138, 22,238,142, 85,223,202,141,231,249, 22, 0, 60, 0,168, 9,130,184, 83,250,188,100, 64, 87,194,141,223,
+ 56,207, 45,238, 31,220, 0, 88, 96,155,169,255,178,250, 20,159,151,119,189,228,254, 39, 0,234, 21,219,100, 1,220, 38, 8,162,
+160, 28,178,245,150,202, 37, 56,113,226, 4,223,187,119,239,151, 45,254,155,231,111, 66, 34, 18,250, 40,156, 60,192,243, 79, 81,
+122, 3, 99,149,151,111,222,178, 21,171, 92,191,154, 56, 46, 89, 83,152, 31, 80,124,249,188, 61,157,133,128,160, 86,116,108, 27,
+222,125,194,196,137, 8, 13,170, 33, 98, 89,150,143,138, 77,160,183,109,217, 58,242,202, 13,241, 42, 77, 90,212,204, 82, 18,100,
+149,166,125,178, 28,155,246,166,130,197,114,236,155,163,219,183,108, 18, 4,224,172, 20,227,247,211,137,224,121,128, 0, 15, 39,
+133, 16,123, 46,165, 33,225,222, 33, 77,239, 48,141,126,232,226,217,157, 59,245,156, 28,249, 36,206,180, 47, 39,199,116, 22, 64,
+ 86, 69, 54,203,110,208, 57,152,173, 44,104,134,193,129,227,199, 17,209,185, 21,218,180,105,133, 14,237,219, 8,238,222,123, 52,
+106,226,132, 49,126,120, 53,187,227,165, 77,169,103,112, 11,165,147,251,190, 1, 19,150, 56, 60, 78, 99, 32,160,128, 64, 47, 25,
+ 92, 29, 68,176, 48, 4,146,212,214,226, 55,199, 25,147,166,205,113,157,241,237,132, 83, 26,181,184, 33,240,212, 90, 81,222, 13,
+ 6,131,120,248,240,225, 66,154,166,173, 67,191,248,186,123, 86,150,186,223,111,171,127,149,168, 84,158, 48,152, 24,220,139,126,
+ 81,111,238,220, 57,129,199,207, 92, 58, 50,123,250,248,163, 17, 17, 17, 78,123,247,238,229, 42,123,158,175,141, 16,179,115,215,
+109,221,121, 96,251,202,101, 11, 17,147, 92,128, 45,127,172, 7,207, 50,191, 87,242,168, 74,219,228,135, 15, 31, 46, 59,114,228,
+ 72,141,180,180, 52,141,193, 96, 80,191,166, 71,144,132, 32, 59,223, 0,119, 7, 49, 68, 2, 18,158, 46, 82,168,156, 36, 16, 82,
+ 0, 73, 16,108, 89, 54,183,236, 59, 57,159, 51, 20,225,216,110,203,144,173,235, 22, 96,212, 87, 63, 33, 42, 87,124,134,148, 59,
+205,255,114,200,128, 25, 30, 50, 54,194,199,153, 84,117,110, 86, 19, 10,169, 8, 63, 76, 30,142,150,247,146, 84,233,133,220, 79,
+106, 35,213,100,206,153,151,155,117,159,127, 93, 28,177, 41, 88, 14,114, 33,206,236, 92,154,163, 47, 82, 23,149,184,228, 44,102,
+ 83,178,157,213,248,124, 25, 35,219, 25, 77, 26, 53, 88, 48, 97,236,104,178,109,235,150, 60, 73, 10,145,171,181, 16, 60, 15,124,
+ 51,105, 60,190, 28, 63,198, 43, 53, 35,231,151,245,235,127,159, 25,249, 55, 63, 79,175,126, 54,187, 34,155, 36, 97, 83,129,148,
+ 82, 1,148, 50, 27,113, 81, 74, 5, 48, 89, 88, 16, 4, 40,103,255,166, 69,132, 77,201,205,200, 79, 46,119, 4,254,154, 77, 87,
+255, 6, 23,254, 78,112,168, 91,176,175,224, 70, 98, 70,244,252,123,143,178,111, 3,200,247,235,224, 60,194,202,240,208,153, 24,
+ 36,102, 27,192, 88,121, 98,212,135, 1,168,245, 9, 17,186,112,235,253,237,167, 31,193,177, 84,163,255,154,205,244,155, 7, 76,
+110, 13,251, 15, 94,185,230,143, 59,203, 22,252, 68,229, 22, 89,192,241, 60,164, 98, 10, 50,177,160,248,160, 96,212, 23, 97,253,
+134, 77, 89, 12,136, 1,184,124,153,169, 74,253, 4,199, 15,235,223,179,195, 30, 2, 16, 19,164, 40,205, 39,160,102, 64,151, 62,
+ 35,165, 93,250, 14, 7,203, 88,102,220,187,202, 95, 52,228,196, 92,176,199,102,195,250,245, 64, 0,247,245, 57,177,227, 1, 64,
+161, 10,249,189,110,104,221,102,111, 94, 11, 14, 14,109,102, 79,185,191, 84, 74,165, 14, 95,185,184,122,252, 20,218,160,137, 42,
+187,192, 76, 56,184,213, 64,226,243, 7,216,189,225,151, 29,156,201, 50,231,194,201,125, 11, 86,109, 57, 60,168, 75, 68,127,108,
+253,237,215, 31,242, 50, 95, 18,173,243,165,212,170, 97,219, 54,111,244, 19,138, 37,160, 25, 14, 52,203,219, 62, 25, 22,249,249,
+ 5,160, 25, 14, 82,185, 3, 24,142, 0,205,114,160, 25, 14,102, 11,163, 24, 63,188,215, 68, 19,112,171,172,116,250,214,237,120,
+ 86, 36,145, 4,240,176,237, 93,203,243, 60, 18,179,140,164,183,183,247, 46, 0,144, 72, 36,144, 72, 36,224, 56, 14,247, 98,212,
+ 95,185,135,134, 76, 64, 49,193, 99,173,150,228,194,164,127,122,148,151,119, 47, 47,175, 62,111,146, 44,147,201, 4,157, 78,135,
+171, 55,238, 56,109,222,126, 32, 34, 49, 57, 45,136,227,157,204, 14,170,160, 30,218,156,248, 62,229, 61, 79,109,118,204, 68,199,
+240, 49,228,212, 47, 71, 4,175,217,118,226,246,139,179,243, 43,140,211,170,213,229,123,203,212,113, 31, 55, 95,188,122,203,243,
+130,127,126,159, 82, 89, 25, 9, 4, 2,161, 90,173,126,249,126,175,221,180,187,249,253,152,244,143, 86,173, 92, 37,189, 23,175,
+197,227,196, 12,140,232,234,111, 27,225,216, 81,238, 10,207, 32,247,192,218,181,119,173, 95,189, 88,240, 60,195,132,117,135,110,
+ 35,242,232,239, 87,179,114,110, 69, 32, 59,211,248, 46,109,200,191, 64,180,202,181,121,241, 81, 46,116, 38, 6,102, 11, 3,154,
+227,161, 49,208,200, 41,180, 64, 99,176, 66,103,100, 48,162,155,127,153,247, 85,194, 71, 60, 8,130, 56,193,243,124,111,158,231,
+187, 2, 16,151,156,219,250,108,226, 68, 49, 33,123,237,124,198,140, 25, 63, 46, 90,180, 40,186,228,183, 37,215, 75,126, 91,209,
+245, 82,247,187,253,240,195, 15, 13, 23, 47, 94,188,176,117,235,214,123,174, 95,191,158, 0,160,192, 94,247,161,160,116,102, 78,
+156, 56, 81,217,131, 14,178,210, 86,137,163, 76,136,192, 90,254,248,252,199,173,238,127, 45, 30,157, 35, 21, 11,168,211,167, 79,
+187,230, 89,148, 32, 73,202,238, 33,138,210,163, 78, 27,145, 72,124,114,249,242,229, 24,210,167,189, 44, 37,151,214, 61, 74, 49,
+102,235, 45, 96, 84, 30, 33,226,249, 11, 23, 43, 23, 47, 89,250,229,137, 99, 92,161, 46,251,201,210,178, 93,124,205,239, 82, 68,
+169, 24, 44,130, 0,207,177,105, 5, 73,119,154, 3,192,251,196, 98,233, 76, 52,168,226,216, 26,130, 0, 12, 38, 6, 20, 69,228,
+ 20,198,236,123, 50,116,222,252,206, 59,246,252,157,193,147,206, 90,189, 62, 81, 14,219,158,131, 85,134,201,194,194, 76,179,136,
+126,120, 15, 29,194,235,163, 77,243,186, 48,152, 88, 24,204, 12,106,213, 14, 5, 0,247, 50, 11,142, 34, 19,120,150, 54,241, 60,
+235,208,187,133, 7, 84,206, 98,120,187, 72, 32, 17, 11, 64, 51,128,209,194,193,100, 97,145,148, 99,132,214, 40, 67,163,142, 3,
+ 3,221,188,239,154,179,146,100, 71,242, 83,238, 14,168,144,156,178, 44,182,237, 58, 16,156,145,145,221,239,212,145,157, 18,181,
+134,198,163, 36, 61,114, 10,205, 0,229,129, 89, 11,215, 73,190,159, 50,246,163,109,187, 15, 38,119,105,223, 42,185,170,121, 54,
+168, 99,118,236,219,127,224,247,222,189, 63,146, 69,223, 58,133,231, 15, 46, 44,208,231, 84, 41, 62,139, 12, 11, 11, 99,198,142,
+ 29,171, 93,184,112,161,223,177, 99,199,106,169,213,234, 7, 0,104,103,103,231,186, 33,193, 1, 15,207,157, 57,237,219,235,163,
+129,194,180, 92, 35,156,228, 34, 4,168,228,184,113,245, 44, 45, 22, 11,203,140, 55, 41,118, 15,126,138, 46,223,225,216,141,132,
+136,232, 60,233,165, 49,163, 71, 36,159,187, 18,147,183,118,251,185, 95,125,149,244, 3, 41,167, 94,123,183,121,109,175, 25,147,
+134, 99,209,154, 29,184,124, 47, 38, 71, 79,122, 47,200, 52, 51,127,151, 47,165, 3, 2,138,128,131, 76, 8,189, 70, 93, 20,119,
+255, 76,200,191, 36, 83,143, 56,119,100, 7,153,175,165,145,154,107, 34, 50,242,181, 96, 57, 30,206,114, 17, 24,142, 71, 97,126,
+ 46,177,115,199,118,220,185,115,131, 4, 69,126, 1, 96,118,133, 15,148,176,185, 10,149, 82,161, 77, 17,146,217, 62,105,150, 67,
+104,112,109,108, 92,187,194,209, 93,229,137,118, 29,236,143,141,118,112, 11, 8,219,243,231, 90, 92,186,126,255,131,203,171,214,
+181, 80,250,120,172, 33, 8,118, 25,120,152,204, 86, 22, 69,133, 5, 16, 91, 82,209,210, 87, 13, 87, 57,139, 36,141, 55,162,178,
+158, 43, 43,107,240,243,162, 14, 63, 32,248,143,102, 30, 56, 30,185,168, 71,183, 15, 16,149,164,129, 76, 44,128, 84, 76, 65, 42,
+166, 32, 36, 88,172,216,240, 59, 93, 80,164,237,157, 23,125, 52,247, 29,234,231,249,226,209,175,141,220,177, 58,143, 29,107,102,
+254, 53,230,187, 37, 61, 34,250,143, 36,162,238, 92,252,209, 0, 92,176,111,160,199,219,117,141,227,236,239,227,164, 14,238,171,
+ 39,127, 63,127,114,247,222, 3, 65, 81, 2,208, 52,141,131,123,119,224,207,117,179,158, 89,116,121, 35, 1,112,150, 28,106,236,
+190, 29, 27, 6,126,247,203, 10,162, 97, 88,203, 86, 23, 51,223,222,222,147,163,136, 63, 62, 27, 61,110,176,167,167,167,195, 43,
+ 69,139, 71, 72,104,125,244,236,251, 49,206, 30, 61,140, 39,209,143,192,241, 54,194,196,113, 60, 10, 11,242,178, 24,218,178,173,
+ 92,143,135, 84, 26,176,245,207,237,117, 72,146,120,185,129,252,148,137,159, 91,198,127,243, 99,187,158,221, 59, 70,139, 41,104,
+146, 82, 50,157,111,220,127,218,136, 19, 42,253, 70, 79, 91, 33, 50,153, 89, 20, 25,104,156,218, 82, 62,215,145,186,248,183,174,
+217,172,231,232,241, 63,111,148, 72, 40,210,218, 32,196, 47,161, 99,120,131, 84,127, 31,119,237,220,197,235, 90, 94,187,117,191,
+231,160,161,163,165, 35,234, 54, 35,124,220,100, 14,159, 15,237,223,152,101,172,159, 25,242, 83,203, 93, 95, 80, 40,119, 41,244,
+175, 21,108,120,165, 24,133, 28, 34,120, 4,190,198, 60, 8, 36, 24,179, 99, 7, 0,128,183,143,191, 73, 40,113,212, 86, 65,129,
+225, 1, 96,205,166,221,205, 31,198,102,140, 89,185,114,149,252, 94,188, 22, 15,226,139, 32, 17,145,176,210, 28, 8, 59, 69,109,
+142,167,198,253,244,195, 12,199, 2, 61,139, 75,143,212,136,190,123,145,183,232, 76, 67,229,140,227, 0,168, 28, 62, 3, 80, 27,
+ 64, 28, 65,240,127,232,179,189,142, 2,151,153,170,214,123,142,179,141,151, 29, 61,130, 2, 89,129,164,167, 80,172,104, 77, 16,
+124, 3,130,135, 11,192,167,231, 23,247,169,246, 50, 53,125,118, 44,150, 44,252, 5,171, 55, 31, 70, 70,158, 9, 78,108, 42,142,
+110,153,143,169,139,118,193,104, 46, 63,170,161, 50, 62, 82, 22, 49,122,147,112,149,124, 47,249,221,162, 69,139,122,191, 81, 54,
+189,203, 41,179,183,126, 87,114,255,226,197,139, 23,150,250,187,193, 94,146,245,146,104,149,100,170, 18,178, 21,226,225, 29,112,
+253,232,145, 67, 46, 5, 58, 43,164, 34, 10,254,181,130, 49,123,237, 81,143, 15,155,187, 35,215,234,132,221, 27,151,229,155, 12,
+218,189,118, 53, 22,170,208, 86, 50,165,226,212,161,131,135, 17,228,175, 18,237,188,154,159,120, 63,193,248, 82,234,213,168,147,
+197,181, 28, 13,130, 1,253,251,203, 47, 68, 94,252, 70, 7,148, 73,180, 40,130,170,177,105,251, 65,149,131, 76, 8,130, 0,180,
+ 70, 6, 99, 62,251,248,253,187, 49,158,163, 70,143, 28, 1,162,152,100,105,242,178,240,227,247, 19, 77, 10,250,249,147,148,164,
+148,244,174,125,166, 94,208,232, 8,211,224,225, 19,239, 60,137, 93, 84, 96, 48,188,219, 38, 63,102, 11, 11,179,149, 67,124,124,
+ 28,166,140,232, 6, 33, 69,130,162, 56, 91,176, 52, 83,126,101,212,101,196,230,195, 75,244,201,142,229, 95,109,242,241, 84,185,
+ 41, 21, 50, 94, 41,151, 16, 13,234,214, 17,133,135,183, 17,215, 10,109, 44,186,250,212,136, 20,181, 17, 9, 25, 69,144,120, 54,
+ 17, 12,233,252, 33,118,172,154,246, 65,126,202, 93, 18,111, 7, 41,190,134,191, 47,221,236,179,121,195, 74, 73,118,161, 21,207,
+ 82,116,200, 42, 48, 33,179,192,140,172,124, 19,148, 50, 33, 58,244, 29, 43, 57,121,244,143, 62, 93,218,183, 90,243, 46,249, 78,
+ 72, 72, 60,153,148,158, 57,176,113,211,150,216,241,215,159,237,157,157,107, 57, 22, 22, 38,106,236, 45,157,249,243,231,139, 23,
+ 47, 94, 44, 88,187,118,173, 38, 60, 60,220,235,135, 31,126,232,145,147,147,115,187,102,205,154,161,103, 15,109,139,108,210,161,
+ 95, 11,112, 86,143,246, 29, 59,137, 36,156, 0,231, 78,156,176,238,219,187, 51,207,104,212,142,175,144,112,200,157,230,103,235,
+ 8,120,248,250, 70, 43,197,108, 55, 1, 89, 24, 91,112,102,242,246, 2,224, 80, 80,196,164,243, 23,239,198,196, 54,191,151,164,
+138,188,247, 34, 39,223, 96, 13,137, 63, 51,181,194,134,151, 34, 8, 8, 41, 18, 14, 50, 1,200,226, 86, 85,233,211,248, 5, 8,
+194,163, 68, 57, 37, 64, 20,127, 2, 4,129,140,130,148, 7,118,196,108, 16, 60,199, 3, 49,105,122,232, 76, 54,105,190,134,187,
+ 28,234,236, 52,252,182,102, 27,238,223,189,131,238, 31,246,197,250, 77, 59, 49,230,179,129,166,202, 70, 63, 36, 89,172,104,149,
+ 82,179,148, 50, 1, 0, 2,133,122, 26, 7,175,165,162,118, 32,105,119,199, 0, 0, 14, 74, 57,138,180, 70,144, 34, 7,196,221,
+ 59, 37, 63,125,241,214, 15, 51,231,173,156, 94,144,249, 40,229,197,227,171, 8,117, 47, 66,160,175, 21,209, 89,142,184,155, 87,
+ 11,161,193, 65, 32, 69,119,236,178,157, 27,221,104,201, 81,242, 96,239,230, 77,234,183, 14, 80, 57,195,104, 97,139, 85, 45, 10,
+127,110,221,142,164,196,180,209,121, 79,142,222,255, 55, 24,173, 62, 39, 65, 45, 81, 5,127,249,248,214,133,132,254, 67,191,132,
+183,175,127, 88, 97,202, 3, 59, 59, 47,251, 72, 21,107, 39,209, 18,201,157,127,152,242,211,175,147,187,247,250, 4, 55,175, 94,
+192,131,232, 56,180,106,213, 2, 31,126, 52, 4, 90, 77,126,221,253,219, 87,117, 99, 12,218,179, 2, 9, 51,185,101,155,206, 4,
+199,178,120,254, 44, 42,174, 44, 91,198,204,152, 7, 55, 50, 99, 28, 95,115, 79,185,215, 13, 83, 58,185, 62, 48, 91, 89,164,167,
+167,225,159,235,151,154, 26, 51, 99,170,180,128,176, 68, 68,225,220,253, 28, 88,139,247, 48,237,208,177,155, 69, 68,154,219, 47,
+ 88,185, 53, 60, 51, 35,147, 84, 56,186,115,174,190,245, 68,222, 18,171,249, 97,124,145,200, 74,115, 8,242, 81, 84,104,211,195,
+ 39,120,225,180,105,171, 35, 12, 6, 0, 0, 32, 0, 73, 68, 65, 84, 83,234, 81, 34, 25,180,122,179, 37, 51, 35,221,107,227,238,
+139,186,167,207, 30,251,214, 80, 57, 57,254,186,234, 15,145,198, 68, 32,167,200,140,124,173,134, 24, 58,238, 59,159,205,235, 22,
+ 13,171,136,104,149, 17, 46, 18,120,242,220,213,186, 46, 14, 34, 66,103, 98,184, 60,141,149, 29,250,209,251, 77,186, 44, 38, 89,
+ 99, 87,174, 88, 37,191, 31,175,197,195,248, 34, 72, 69, 20,196, 34, 18, 22,154,131,157,175, 19,233,165,242, 26,223,166,121, 35,
+156,125,144, 11,138, 34, 97,212, 22, 24, 4,200,139,109,254, 65,119,121,179,150,225,232,244, 65, 71,188,136,141,241, 63,113,236,
+ 96,151, 27,255, 92,206, 98,172, 33, 95,233,213,177,135,171, 36, 44, 24, 12, 20, 45,246,250,220,219,183,102,219, 1, 67, 62,119,
+ 10,240,247, 37, 84,238,110, 96,120, 1,198,126,246,177,221,111,190,141,152, 3,139,231,253, 0,179,217, 2, 15,103, 49,120, 30,
+216,186,102, 54, 44, 22, 11,124,220, 36, 40,210,151,191,155, 92,101,124,164, 60, 21,170, 74,177, 39,165,200, 88, 69,215, 9,130,
+ 56, 49, 99,198,140, 31, 1,240, 51,102,204,248,177,228,124,209,162, 69, 70, 0, 25,149,184, 14, 55,190, 70,180, 74, 50, 87,254,
+219, 45, 10,117,119,243,190,113,238,236, 25,167, 35, 15, 57,220, 60,124, 23,189, 90,121, 67, 36, 32, 33,119,242,193,195,196, 34,
+156, 60,180,161,240,232,158, 63,210,205,102,243,210,202,125,205,193,205,149,114,197,217,191,118,236,229,220,221,220,200,223,206,
+169,227,243,180,204, 75,151, 86,236,173, 99,220,221,179, 27,189,121, 16,103,164, 82,105,176,197, 98,113,169,172, 96,183,158, 75,
+ 46, 14,226, 37,254,141,182, 21, 4, 69,177, 59,118,238,128,187,163, 24,102,154,195,140,233, 95, 27, 71,116, 87, 22, 14, 29, 52,
+164,115,167,158,147, 35,133,138, 58, 23,218, 52,173,195, 55,105,210,164,144,162, 40,187, 66, 41, 84, 42,213,108,146, 36, 63, 21,
+139,197, 14, 22,139, 69,107,225, 76,114,189,201, 2,147, 21, 48, 24, 76, 16,138,108,100, 81, 72, 17, 48,154, 44, 48, 24, 45, 21,
+191, 24, 89, 81,215, 0,132,104, 74,105, 74, 23,158, 6,137,119,237, 63,250,245, 39,131, 6,207,244, 13,251, 72,153,152, 89, 4,
+ 17, 97, 69,139,122,222,184,120,230, 48,159,150, 20, 59,165, 50,146, 5, 0, 57,234,124, 63, 15, 15, 79,220, 79,208, 33, 61,207,
+136,172, 98,146,149, 89, 96,134,214,168, 69,227, 0, 31, 20, 22, 21,249,189,243,243, 5, 14,159, 61,123,118, 96,207,126,131, 49,
+121,250,156,118, 91, 54, 44,123,164, 16, 11, 71,233,179,159, 95,178,135,104, 69, 69, 69,229,127,255,253,247,181, 55,109,218, 68,
+ 14, 27, 54,204,216,168, 81, 35,233,240,225,195,219,109,223,190, 93, 42,151, 75,141, 15,175, 30,155,249,197,164, 25,253, 54,174,
+158, 31, 86, 80, 80, 64, 48, 52,125,218, 90, 80, 48, 67, 87, 9,153, 75, 61,246,227,179, 89,241,214,145,221,218,123, 28,115,149,
+147, 13, 36,188,101, 8,234,205,222,139,167,179,173,241,103,214,106,101, 3,151, 79,202, 40,228,126, 50,145,170, 5,149,145, 44,
+ 0, 32, 41, 2, 22,134,133,131, 76, 8,146, 36, 75, 72,188,247,159,123, 79,203, 61,156,196, 16, 82, 36, 4, 20, 1,141,129, 70,
+174,198,138, 47, 63,183,119,133, 16,158, 99, 88, 30, 70, 11, 3, 67,241,232, 80,171,201,197, 15,211,191,197,135,125,250,227,139,
+241,223,162,192, 8,220, 77,208,194, 74,211,149,190, 20, 36, 65,194, 96,102, 48,170,123, 0,242,117, 86,232,141, 12, 44, 12, 7,
+185, 88, 0,161,128,132, 66, 42,128,163, 92, 8,240,188,168,164, 49, 17, 10,133, 38,154,166,119, 84, 48,162, 71, 45, 63, 79, 24,
+105, 18, 45, 7, 47, 67,215,214, 33,136,190,118, 80,112,249,230,227,192,111,166,255,132,175,199,244,193,129,103,181,225,170, 10,
+128, 82, 33, 3,205,147, 0,120, 59, 3,246,102,115,164,181,255,167,191,111,218, 26, 51,247,151, 25,210, 66, 61, 1,137,136, 66,
+228,133,243,184,113,235,238,234,220, 39, 71,119,224, 95,132,144, 39, 61, 29, 29, 29, 33, 21, 83,176, 88,205, 22,251, 67, 23,120,
+240, 64, 83,133, 42,228,247,226, 17,127, 83,150, 67, 25,215, 42, 39, 90, 2,169,227,140,175,166,207, 93,216,189,215, 39, 56,119,
+226, 0,246, 31,216,203,182,142, 24, 77,237,252,115, 3,218,117,237,139,118,221, 7,227,244,225,237,223,234, 57,162,254,216,201,
+ 51,231,117,232,220, 19,231, 78, 30, 64,118, 86,218,114,123,211, 75, 9,137,201,157,187,245,129,201,194,162,125,151,222, 56,115,
+252,240, 36, 20, 79,178,176,191, 19,123,163,125, 6,201,124, 59,101,178, 48,167,208, 34, 84,107, 44, 72, 83, 27,144,152,109,192,
+209, 61, 91,120,251,219, 11, 75,139, 14,141,107, 8,199, 46,137, 76,245,171,225,109, 22,154,141,178,216,184,248,186, 95,124, 62,
+ 66, 24, 24, 92,151,204, 41, 50, 67, 93,100, 70,110,145, 25, 58, 19,131,224, 26,117, 72,154, 33, 90, 87,181,156,221,157,196,194,
+245,199, 19,224,168, 16,162, 77,221,119,159,104,203,113,220, 43,146,181,210, 70,178, 30, 37, 20, 65, 34,162, 32, 17,145,144,136,
+ 40, 48, 44,111,215,192, 69,166, 10,233,249,229, 87, 19,125, 44, 12,144, 87,100,129,128, 34,160,114,119, 81,180, 8,251, 20, 91,
+151, 77, 2, 0,140,249,254, 55,124, 49,106, 56,234, 53,104,132,194,130, 2,175, 79, 63,233,185, 18,192, 97,123,211,122,234,220,
+ 37,255,115, 87,238,127,255,229,180, 89,202, 65,125, 58, 81, 15,226,139,144,153,111, 70, 92,172,182, 74,202, 27, 0, 48, 44, 7,
+ 30, 60,182,237, 61, 1,153, 88, 0,117,145, 21, 60,207, 99,254,218,125,112,144, 9,145, 89, 96,115,247, 87,132, 10,249, 72, 5,
+138, 84, 21,212,198,222,176,197,114,121,216,171,104, 45, 90,180, 40,122,209,162, 69,101, 42,100,165, 72,214,187,109, 42, 45, 18,
+ 41,234, 58,186,185,223, 60,119,230,148,195,225,135, 44, 46, 62,204,195, 39,237,107, 64,151,159,130,165,211, 7,229, 19,224, 45,
+ 36, 69, 21,154,141,134, 67, 70,163,126, 1, 0,107,133,149,198, 43,164,169, 66,170, 60,191,126,227, 95,140,187, 74,133, 29, 87,
+243,211, 10,244, 12,253,202,109, 69, 19,119,207,110, 12,100, 56, 58,194,148,253,226, 78,101, 35,113,142,135,104,209,134,163, 0,
+120,112, 28, 7,158,227, 32,148, 42, 21,238, 65,225,217,197, 13,157, 84, 64, 18,166,210, 45, 0,207, 49,105,185, 9, 21,203,160,
+ 4, 0, 39,185, 16,123, 47,167, 3, 64, 54,165,189,247,116,232, 32,155,187,208,100,145,106, 26,212,174,205,183,104,209,162, 80,
+ 38,179,107,249, 43,202,211,211,243,246,204,153, 51,235,126,241,197, 23, 18,177, 88, 12,134, 97, 92,255,216,184,145,219,184, 96,
+ 12, 6, 76, 90, 15,145, 88, 2,163,201, 10,161, 80,128,130, 34, 29, 10, 53, 6,104, 13,116,213,107, 80,124,188, 69, 13, 44, 57,
+114, 88,220,191,135,178,113, 75, 49, 41, 66,179, 80,111, 92, 60,123,132,191,121,102,235, 24, 99, 78,236, 95,118, 86, 68,232, 76,
+ 52, 50,242, 76, 72,207, 51, 33,171,192,132,172,124, 51,178, 10, 76, 32, 8, 2, 38, 11,243, 94, 29,151, 62, 39,102,255,142,191,
+ 54,247, 53, 91, 49,164, 67,247,254,248,118,214,250,128, 29,191, 47, 62,159,192,147,109,237, 12,180,101,163,163,163,147, 62,255,
+252,243,176,221,187,119, 83, 13, 27, 54, 52, 62,125,250, 84, 94, 76, 34,173, 74,165, 92,182,101,221,162,179, 45, 91,182,220,155,
+ 30,251,236, 66,177, 63,189,210,134, 61,160,227, 72,137,204,122,127,172,191,162, 77,143, 32, 47, 57,252, 21,218, 30,117,149, 15,
+151,230,117,254,122,161, 58,114,117, 78,166,153,249, 91,109,164,154,164,235,132,118,197,224,209,102, 83,242,128, 79,134,128, 34,
+ 72, 88, 77,134,228,146,202,165,114, 18, 99,246,206,103, 80, 74,133,112,144, 9,160,148, 9,209,174,190, 43,170,208,158,241, 52,
+203,193, 96,102, 97, 52, 51, 48, 89, 24,184,251,185, 96,211,142,253, 72,201, 49,226,232,157, 92,196, 36,107, 81,167,134, 2, 60,
+ 95,121, 51,201,177,180,190,207,199,195, 28, 40,146, 0, 69, 18,100,253,186, 33,200,215, 89, 33, 18,144, 16, 73,101, 80, 72, 4,
+112,148, 9, 33, 18, 9,145,147,147, 3,179,217, 12,127,127,127,105,197, 84,144,135,131, 82,134, 58,129, 62,176,210, 12, 78, 93,
+121,130, 5, 83, 6,160, 91,135,230, 32,132, 74, 60, 51, 55,133,131,171, 3, 56,146,132,149,225, 96,177,178, 0, 72, 83,121,246,
+252,252,252, 58, 43, 20, 10,133,193, 96,208,166,164,164, 92,202,138, 57,156,194, 82,253,198,158, 57, 23,185,163,247,135,221,112,
+255, 81, 52, 14, 28, 62,118, 53,215,173,104, 90,201, 61, 13, 26, 52, 8,119,119,119, 87,230,229,229,105,162,162,162,110,191,235,
+184,128, 39,201,111, 90,183,251, 0,186,194, 28,100,167, 38,218, 61,138,174, 23,224,128,159, 23,173,111, 22, 26, 18,218,140,229,
+109,196,171,190,191, 3,166,206, 90,211,172,118,157,144,102, 37, 19, 66,234,249, 87,188, 44,155, 64,238,208,253,179, 47,190, 93,
+212,247,147,145,136, 60,119, 12, 43, 22, 76,223,161,112,242,168,231,234,226,212,164, 97,120,119, 92, 61,127, 12, 82, 7, 47,184,
+184,121,181, 27, 54,234,171,174,159, 12, 27,135, 27, 87,207, 99,245,226, 31,183,179,102,237, 46,123,210,170, 80, 5,122,132, 53,
+109, 57,212,193,213, 19,133, 69, 90, 56,184,168, 80,175,113,139,161, 79, 30,154,191,215,231, 36,168,223,153,116,240, 60,204, 86,
+ 30, 5, 58, 43, 82,213, 70, 36,101,217,136, 22,199, 85, 33, 38,136,229, 8,165, 84, 32,112,165, 95,248, 63, 62, 31,201, 7,248,
+121, 18, 75,230, 77,167,172,144, 66, 93,104, 35, 89,106,141, 5,234, 34, 11,116, 38, 26,174, 10, 1, 56,150,171,242,168,187, 64,
+103,133,131, 92, 8, 39,185,200,110,149,177, 44,108,248,115,111,232,195,216,140,143, 86,172, 88, 37,127,144, 80,138,100, 9,109,
+106,150, 68, 68,129,229, 56,192,142, 55, 94, 40, 16, 78,238,215,179, 43, 82,115,141,182, 89,203, 36,129, 58,141, 90,194, 93,198,
+161,203,224, 25, 0,128, 62, 61,109,161,109, 9,153,122, 28,191,169, 6, 94, 15,236,174,184, 45, 54, 26,169,141, 59, 79,126,179,
+127,223, 30, 39, 19, 43,192, 31,167,147, 96, 48, 51,144,138, 40, 72, 68, 20,100, 34,234,181,120,236,202,137,150, 45,230, 46, 37,
+151,134,193,100,130,198, 72,131, 7,112,251,133, 14, 70, 11,131, 34, 61,141,240,186, 46,239, 39,132, 16,196, 73,158,231,123,189,
+ 73,136,222, 36, 75,165, 20,169,178,108,220, 41,109,163,228,247,229, 17,185,210, 49, 91, 0,170, 52,131, 75,240, 38,115, 44,125,
+ 46, 82,184,212,115,114,112,186,121,230,244, 9,229,225,135, 28, 46, 61,178,145, 44,218,152,139,229,223,127,154,166, 41,204,237,
+ 4, 32,222,222,127, 38,119,175,215, 88, 42,150, 68,254,186,234, 15,171,202,211,151, 59,116,179, 48,167,200,192,190,198, 38, 88,
+179,153,228, 57, 94,100,202,126, 97,151, 15,129, 36, 9,235,172, 73,253,193,241, 60,102,175,218,143,133,211, 6, 67, 41, 27, 38,
+ 39, 8, 66,174, 55, 49,152, 50,103, 51,150,255, 60,218, 65, 46, 17,128, 32,108, 49, 81,159, 13,233,111, 95, 5, 52, 49,136,187,
+181, 91,167, 77, 56,241,180,180,187,176, 85,187, 15,239,182,106,213,170,208,197,197, 5, 50,153,236,149, 82, 81, 14, 60, 61, 61,
+127,158, 53,107, 86,232,248,241,227, 95, 46,246, 41, 16, 8,240,229,196,137, 36,203,242, 56,125,122, 43, 60,106, 54,197,177,191,
+111, 34,162,115, 11,232, 12, 38,228, 23,106,193,129,122,231,138,168, 45,204,141,204, 74,122,220,178,109,167, 62,184,116,246, 8,
+127,243,244,150, 49, 85, 89,163,199,197,213, 37,245,222,227,184,122, 4,225,106, 83,180,138, 73,150,133,230, 16,224, 41, 71,106,
+ 82, 28,156,157,156, 82,237,181, 39,243, 8,237, 71,144,252,120, 2,252, 86,125,246,243,253, 0,120,125,230,211, 79,247,239,218,
+248, 40, 58,234,193,130,222, 67, 39, 11,186,127, 50,145,250,125,209, 87, 63, 2,176,119,225, 61,107, 76, 76,204,147,209,163, 71,
+183,185,113,227, 6, 11,192, 64, 16, 4, 77, 81,148,220, 98,177,136, 58,117,234, 84,244,236,217,179, 75, 40, 59,104,241, 53,180,
+251,124,191, 59, 33,209,126, 40,230,172,159, 6, 56,104,187,117,106,223, 26,173, 27,248, 33,181,125,107, 0,152,156,172, 83,134,
+154,106,111,222, 75, 51,178, 83,191,255,121,124,225,152,193, 93,167,236, 16,204, 94,145,121, 98,118,133,129,168,169, 79, 47,247,
+ 40,139,198, 11, 40, 18, 14, 50, 33,148, 50, 1, 28,100, 66, 56, 72,133,160, 25,190, 42, 35, 71,158,102, 56,155,162,101, 97,160,
+ 51, 50,136,124,144,141,172, 34, 11, 10,181, 86, 24,173, 44,120,240,182,209,168, 29,173,185,250,197, 63,206, 37, 61,169,179,127,
+211,162,141,107,151, 57, 30,188,150,246,114, 70,159,147, 92, 12, 7,185,109, 54,246,149, 43, 87,224,230, 86,249,104,159,227, 56,
+ 28, 56,115, 27, 43,182, 69,226,204,214,239, 32, 21, 81,104,220,111, 14, 70,126,212, 10, 28,207, 33, 46, 38, 58,187, 78,253, 48,
+ 79,146,148,129, 36, 8,152,105, 14, 0, 95,238,243,180, 88, 44,110, 41, 41, 41,154,224,224, 96, 47, 31, 31,159, 79, 40,138,226,
+161,125, 96, 62,178, 39,223,112,225,196, 46,185,222,104,102,229, 76,209,214,224, 76, 99, 47, 4, 7,131, 32, 8,222,209,209, 81,
+ 20, 25, 25,169,107,212,168,145,199, 59,190, 74,164, 76, 21,178,250,139, 9,223,124, 82, 59, 40, 8,251,119,109, 5,207, 19, 7,
+237,189,121,231,241, 27,152,247,195,235, 51, 12,167,206, 90,211,108,249,156,201,175, 93,155,240,195,138, 10,103, 29,202, 36,202,
+105, 3, 62, 29,139,187,183,175, 99,233,156,169,123,204,186,252,145, 52, 67, 15,204,207, 76,216, 19, 88,191, 21,120,171, 22,231,
+246, 45,195,224,225, 99, 36,221,123,127,130, 27, 87,207, 99,225,143, 19,118, 26, 10,115, 62,135,157, 65,206, 28, 47, 28,223,169,
+199, 71, 66,163,217,138, 53, 75,126,193,184,105, 11, 16,222,185,143, 48,234,193,205,241, 0,230,218, 29, 14, 97,101,209,169,145,
+187,141, 60,211, 28,142, 37, 80,130,178,106,160,128, 34,200, 38, 65,206, 48, 90, 24,104, 42, 25, 84, 10, 68,194,172,194, 34, 77,
+205,117, 11,191,161,244, 38, 6,234, 34, 11,114,138,204,200, 45,124, 69,176,114,139,204, 80, 23, 89, 32, 20, 16,136,141, 79, 6,
+ 41, 20, 84, 57, 62,175, 64, 71,163,101,136,139,237, 29,125, 71,239, 8, 45,112,108,117,230,242,195, 1, 43, 86,172,148, 62, 76,
+212,226, 81,130,166, 88,201,162, 32, 17,146, 16, 23,127,103, 57, 91,108,100, 69,112,244, 8, 10, 28,241,217,176, 46,142, 74, 25,
+ 50,158,231, 64, 64,217,150,136,113, 82,249,193, 73, 98,194, 87, 19,198,194,221,205, 25, 41,185,102,172, 62, 28,139, 71, 79, 94,
+128, 51, 86, 45,219,107,254,216, 19,241,197,151, 83,157, 73,161, 24,219,207, 38,218,210, 73,177,120,118,243,184, 41, 35,238,177,
+ 94,167,201,227,193,179,118,198, 32, 19, 60,195,218,170,219,194,217, 51,176,103,219,111, 56,123, 47,231,101, 13,188,118,112, 57,
+190,249, 97, 62,114, 53, 22,148, 85, 47, 43,226, 35, 0,212,165,148,168,183,206, 75,145,163,178,206,137,226,115, 75, 57, 54, 44,
+111,144, 43,203, 27,215, 45,111,216, 43,107,237,191,141,149,186, 14,223, 34, 69,206, 30, 13,229, 82,197,245,211,167,143, 43,142,
+ 60,226, 95,146, 44,171, 33,151, 95, 48,185, 79,154,166, 80,221,189, 74, 36,203,163, 78, 67,137, 92,114,121,230,252,213,102, 79,
+223,154,204,169, 7,154, 60,173,137,101,222,142, 65, 80,176, 10, 39, 15,147, 64, 44, 89, 33, 52, 90,126,201,205,125,170,175, 76,
+121,226,120, 30, 39,110,101,129,231,109, 67,164,125, 87,210, 81, 60, 50, 7,203,217,220, 42,127, 63,200,129,160, 56, 14,197, 94,
+249,123,195, 31,191,105,122, 53, 42,210, 15, 93, 56,251,165,187, 48, 60,204,166,100, 57, 58, 58,194,217,217, 25, 74,165, 18,149,
+185, 14, 9,130,248,236,139, 47,190,120,107,244,159,147,147,131,174, 93, 58, 97,237,111,155, 16,214,101, 4,254,254,231, 44,172,
+ 52,135,198,245,131, 80,211,199, 5,169,217,218,119,122,209, 21,158,161, 95,182,236,244,209,143,237, 58,247, 65,228,153, 67,252,
+205, 51,127,142,173,234, 66,136,189,186,182, 57, 62,111,222,236,192,153, 11,214, 73, 28,164, 2, 60,213, 89, 64, 18, 4, 2, 60,
+229,112, 83,144,184,116,100,187,105,112,159, 54,118, 47,142,231,231,231,187, 99,249,218,141,138,229,139,231,116,186,123,143,136,
+212,101,196,230, 3,128, 33, 59,102,201, 51,224, 73,141,235,231, 78,133,117,236, 15, 79,159,160,110, 9,217,207,236, 38, 27, 0,
+ 12,241,241,241, 9, 51,103,206, 12, 93,188,120, 49, 79, 81, 20, 7, 64,178,106,213, 42,195,243,231,207, 31,192, 54, 53, 23,149,
+117, 54, 93,186, 53,152,162, 20,179,225,174,114,178, 65,144,151, 28,173, 27,216,188,162,131,123,181,131,159,191, 63,226,179, 12,
+ 77,242, 13,156, 80,103,161,130,214,255,241,232, 78, 45,119,106, 12, 99,180, 60, 1,112,180,170,229, 67,224, 85,128,124,137,154,
+229, 32, 19,130,179,213,149, 42, 17, 45,179,149,133,209,204,194,104, 97,160,183,176, 48, 88, 88,112,188,237,157, 32, 8, 2, 86,
+134,131, 93,195,230, 55,234,190,163,171, 59,130,106, 17,112,148,219,210,230, 88,188,220, 3, 1,192,205,205, 13, 42,149,202, 46,
+ 85,212, 98,181,189,226, 22,154,123,233,214,183, 88, 25,240, 60,143,216,216,152,239,146, 18, 18,250, 5,215, 9,238, 80,191,113,
+152,171, 92, 66, 2, 64,185, 68,203, 96, 48,176, 14, 14, 14, 42, 87, 87, 87, 50, 61, 61,253, 37,121, 14,110,210,137, 57,124,232,
+ 32, 6, 12,232,175,123,122,251,225,203, 41,238, 70,163,145,104,219,182,173,163,159,159, 31,105, 54,155, 53, 85, 45, 38,133, 71,
+200, 71, 46,110,174, 11, 62,251,124, 92, 72,167,174, 17,184,120,225, 28,142, 30,218,253,151, 65, 29,123,206, 94, 35,161,161,117,
+223,154,117, 88,187, 78,200, 91,179, 14,107, 6,214,169,144,104,213,111,220,162, 21, 79, 8,112,246,196, 62,222, 68, 90, 39, 0,
+224, 88,147,118,223,222, 13, 63,207,253,116,252, 15,181,123,246,253, 20,159, 13, 31, 9,129,128,194,165,191,143, 99,249,156,111,
+ 79,234,138,114, 70,216, 19, 38, 96,147,222,234,137,124,101,126, 95,251,215,110,136,123, 55,175, 34, 46, 54, 42,250,225,157, 27,
+ 13,130, 27,133,195,195, 39,224,235,100,119,106, 49,158, 62,181, 86,102,198, 98, 50, 37,143, 28, 49, 28,165,103, 29,182,110, 26,
+234, 70,188,249, 2, 0, 48,104,115,172, 91,150, 77,121, 94, 50,235,144,179, 90,146,203,179, 91, 84,160, 62,112,233,159, 91,211,
+250,245,138, 32,115, 53, 22,155,130, 85,100, 41, 62,204,200, 45,249,174, 49,163,142,143, 18, 49,209,247, 56, 83, 81,238,193, 42,
+190,151,166,145, 3,123, 60, 41,169,187, 28,199,131, 0, 76, 85,118, 75, 9, 29,199, 46, 89,186, 66,250, 48, 65,135, 71,137, 26,
+155,171, 80, 72,217, 8,150,144,124, 73,186,108,179,217, 43, 81,135, 8,106,225,168, 17, 67,144,171,177,130,227, 0, 1, 69, 22,
+ 31, 34,164,104, 9,164,106, 13,200, 45, 80, 35, 33, 41, 25,133, 89,113, 32, 73, 18,238, 62, 33,118,175, 36,205,242, 98,111,131,
+133,111,244, 73,175, 14,130, 67,215, 51, 33,151, 8, 96,214,102,227,244,222,101,106,179, 78,179,192,104,208, 29,178,103, 61,199,
+ 87, 33, 8,132, 90,163, 51,121, 74,132, 20,246,111, 91,135,129, 35, 39,188,214,250,126,247,211, 60,128, 36,144, 95,160, 5, 65,
+ 16,234,170,181, 75,196,157,138,206,223, 81, 25,123,111, 27,101,144,173,183, 7, 10,229,143, 70,249,211,231,206, 28, 87, 92, 75,
+146,224,118, 76,102, 49,201, 82,115,243, 39,245, 74,211, 22,229,247, 0, 16, 91,181,113, 33,217, 99,240,168,105,209, 65, 33,245,
+205, 23,163,116,137,133,122,186,220, 56,135,214,159,204,140,190,123,114,109,207, 34, 58,126,162,194,187, 62,203, 49,204, 18,163,
+ 58,118, 78, 57,174, 67,241,156,213,251, 95,186, 13,191, 95,188,221,246,157,101,193,242, 28,120, 14,248,234,231, 13, 96, 56, 22,
+ 28,203,130, 99,121,208, 44, 47,175, 44,185, 42,159,154,135, 10,158,237,171, 59,116,238,219,238, 66,103,103,103,184,185,185,193,
+205,205, 13,142,142,142,149, 18, 45,161, 80,168, 20, 8, 94,127,212,201,201,201, 72, 74, 74,130,163,163, 35,120,142,134,133, 6,
+ 26,134,119,199,227,184, 40,156,191,246, 0, 60,199, 66,161,172,250, 46, 47, 10,207,208,137, 45, 62,232,183,174,115,223,209,248,
+251,208, 31,252,157, 43,199,199, 25,115, 98, 55,219,173,208,179, 44, 65,211, 52,122,117,255, 32,249,126,244,139, 51, 63, 77, 27,
+ 31,209,166,247, 56, 73,235, 80, 95,152, 44, 44,210,146,226,112,233,200,159,166,144, 64,239,179, 93,218,183, 74,166,105, 26, 44,
+203, 86,218,145,155, 44,214, 92, 74, 40, 83, 12, 25, 50, 84,120,231,246,237,131, 10,143, 58,251, 89,130,124, 72,240, 92, 99,130,
+231, 7, 52,110, 92, 15, 86,154,131,193,160, 41,168,106,158,181, 90,109,194,214,173, 91, 3, 71,140, 24, 33,175, 95,191,190, 48,
+ 46, 46, 14,203,151, 47,207,211,106,181, 9,246,218, 56,119, 37,102,149,128, 40,120, 94,162,104,165,180,107,141, 33,189,219, 97,
+207,201,107,184,116,245, 6,146,117,202, 7, 58, 70,112, 36, 53, 57,195,220,192, 85,115,176,111,235,154,212,254,109, 5, 7,163,
+ 63,152, 49,136,231, 37,231,114, 47,207,214,219,255,114, 3, 90, 35, 13, 71,185,109,189,167, 18,101,139, 34, 8,187, 25, 17, 1,
+ 36, 92,189,113,175, 97,243, 58,245,113, 63,161, 8, 57,133,102, 24,205, 12, 56,142, 7, 7, 30,110, 14, 98, 72, 69, 36, 82,146,
+ 18,192,241,214,196, 42,118, 21,234,142, 29, 58, 10, 0, 2, 4,193, 11,132, 2, 1,120,216,214, 87,148,201,100, 58,149, 74,101,
+151,162,101,101, 24, 12,136,104,133,240, 22,141,209,111,156,109,205,204, 11,127,205,128,139, 82,136, 61, 59, 54, 35,245,202,170,
+ 29,129,173,199,159,139,122, 28,253,113,244,253,235, 67, 63,108, 38,107,226, 37,200, 16,149, 39,147,234,245,250,131, 0,196, 34,
+145, 40,162, 67,135, 14,174, 7, 15, 30, 44,116,119,119,231,196, 34,145,186,111,159,222,156, 80, 36,202, 47,249,237, 63,255,252,
+ 35, 28, 55,110,156, 67, 65, 65, 65, 74,118,118,246, 13, 0,116,197, 3,193,208,174, 32,177, 27, 4, 33, 85,202,228,201,181,106,
+ 5,249,180, 8,111,229,244,209,128,129,144,136, 37,248,251,220, 25,172, 89,185,120,159, 46,243,233,168,170, 60,201,127,107,214,
+ 97, 90, 74, 98,130,193,104,110,212,176,249, 7,196,213,115, 71, 38, 91,225,190,146,146, 88,151,117, 29, 48,161,118, 66,134, 14,
+107, 22,125, 7, 23, 39, 5, 18,227,158, 25,159, 63,125,188,129, 54,105,190,179,155,100, 1,144,231,177, 31,183, 30, 30,225, 98,
+182,178,184, 18,121,210,196, 49, 92,196,141,203,167,226,106,132,180,144, 54,108,209,197, 37,247,232,230, 1, 6, 96, 79,101,118,
+210,159,189,173,224,242,150,194,196, 11,145,231,157, 60, 3, 26, 80, 4, 8, 88,205, 38,168,227,239, 48,134,236,103, 26, 77,122,
+148, 93,179,112,243, 82,241,243, 15,179,126,157,216,162,121,115, 5, 15,233,107, 10, 86, 9,193,202,213, 88,224,238, 32,134, 81,
+163,198,243, 59,103, 76, 6, 53, 85,225,122,103,140, 69, 47,207,205,201, 22,191, 10,103,136, 13,175,232,247,185, 57,217, 98,198,
+162,151, 87,222,213, 81,112, 84,136,241, 56, 49,253,101,224,187, 68,104,139,205, 18, 11,169,151,113, 90, 37,109, 65, 37,248, 64,
+ 36,117, 70,122,158, 9, 4,120,112, 44, 3,134,182, 64,171,209, 32, 61, 35, 11,217, 89,217,208,106, 11, 33, 87,186,160, 97,147,
+150,112, 80, 72,241,240,210, 62,240, 60,111,215,186,134, 52, 33, 12,109, 17,222, 94, 18,149,100,139,197,146, 10,121, 28,223,189,
+ 56, 79,167,201,105,175,203,124,254,188,170,109, 49,195,178,231, 31, 61,121,222,160,134,119, 45,226, 65, 92, 17,118,108, 90, 11,
+ 75,177,178, 73,211, 44,162, 82,244,200,204, 55, 32, 37,254, 41,207,177,236,121,252,135, 64, 80,190, 0, 8, 65,227,134,245,208,
+125,216, 71,248,237,183, 13,136, 79, 72,226, 22, 76,238,153,162,211, 22,126, 88, 5,146,213, 21,197,107,109, 24,178, 99,150, 24,
+ 93, 90,164, 29,187,159, 79, 26, 45,124,133, 1, 62, 82,143, 0,180, 31,181,252,172, 81,155, 47,102,205, 6,193,241, 29,163,118,
+151,101,211,198,160, 97, 89, 48,117, 48,148, 50, 1, 8,130, 64,137,187,112,253,188,177,144, 75,108,190,101,163,153,193,176, 41,
+ 43,176, 99,197,183,224, 1,124, 58,240,154,161,188,116,194,182,119,225, 87,222,184, 93, 35, 57, 41, 39,189,107,159,169, 23, 76,
+ 86,137,185,119,255, 17,119,155, 55,111, 94, 40,147,201, 32,147,201,224,232,232, 8, 23, 23, 23, 56, 59, 59, 87,154,119,154,166,
+117, 22,139,197, 77, 44, 22,131,227, 56, 36, 38, 38, 34, 49, 49, 17, 69, 69, 69, 80,171,213,208,235, 52,204,237, 11,251, 5, 13,
+ 91,247,132, 79, 80, 35, 4,212, 9,131,144, 34, 32, 16,144,184,116,108, 83,121,233, 44,155,100,117,236,187,190, 75,191, 47,240,
+247,161,141,252,157, 43,199,199, 27,115, 98, 55,217, 91, 70,197,238,158,135, 3, 6, 12,104, 52,110,220, 56,209,172,105,227,206,
+158, 60,119, 41,118,255,137,141,125, 10, 10, 10,253,120,158,135,179,147, 83,234,224, 62,109,142,119,106,219, 34,249,194,133, 11,
+220,238,221,187,205, 4, 65, 60,174,200,166,173,145,202,249,235,194,249,200,217,237, 59,126,128,205,219,118,119,140,126,242,180,
+ 99, 92,220,115,248, 5, 4,161, 86, 96, 29, 24, 8, 23, 68, 94,190, 10, 93, 97,206, 95,246,164,243, 13, 85,139, 40, 40, 40,184,
+ 62,120,240,224,238,215,174, 93, 35, 7, 15, 30,108,200,205,205,253,167,148,138,197, 87,102,243,198,239,253,213, 0,254, 10,232,
+ 56,114, 95,186,181,240,107, 0,139,253, 3,252,113,233,234, 13,220,184,118,107, 67,174,220,127,206,168, 97,159,143,173,217,151,
+250,162,111,235,154,148,202, 69,142, 93, 27,151, 83,199,110, 36,173, 72,202, 99, 55, 47,190, 60,123,158, 61,101,244,178,227,208,
+ 90,209,182,158, 43,104,150, 7,199,219, 26, 92, 7,169,176,188,134,247, 45,155, 2,139,100,212,248,113,227,226, 26, 54,110,242,
+205,176,207,199,139,154, 4,249,225,246,139, 66,128, 32,224,234,165, 64,102,102, 38,174, 28,216,200, 20,164, 63,219, 64, 81,220,
+220, 42, 60, 79, 20, 36, 63, 8, 46,117, 58, 54, 55, 55, 23,151, 46, 93, 66, 9,193,242,240,240, 40,143,104,189,102, 51, 47, 59,
+227,159,121, 75,255,104, 59,230,179,254,232,253, 65, 3, 92,190, 19, 7, 75,241,122, 77, 37, 83,201, 19,110,252, 46,254,122,112,
+144,101,226,128, 16,141,145, 22, 39,253,156, 88,116, 5,182, 61, 88,185,114,210,105,201,207,207, 63, 22, 19, 19,211, 46, 44, 44,
+172,230,169, 83,167,242,163,111,157,157, 92, 58, 17, 83,167, 78, 85,254,246,219,111,114,158,231,255,177, 88, 44,241,118,229,157,
+196,174,123,119,239,186, 89,105, 14, 87,111, 61,172,215,165,109, 19,112, 60,112,231,206, 29,108,222,178,217,244,248,209,131,101,
+250,108,175,185, 21,144,151, 50,159, 39,251,126,179, 14, 95,218,204, 76, 79, 90,246,247,201, 3, 59, 90,116,236,131,161, 95,205,
+157,123,233,228,238,217,205,218,247, 38,235,181,232,142,123, 55, 34,113,254,212,153, 95,173,186,252,217,168, 60,118,164,204,116,
+ 74,100,242, 73,245,155,117, 68, 74,114, 18, 18,159, 71,253,101,202,127,145,145, 28, 71,253,149,145,150, 60, 62,176, 65, 91, 92,
+ 59,187,103,114, 5, 68,171,194, 58,239,231, 33,219,120,234,196,177, 33,105,105,191,123,233,141, 38, 9,207,243, 38,137, 88,144,
+165, 36,181,123, 53,118,167,243,169, 85,157, 81,115,192,192, 97,227, 79,174, 89,179, 82,232,233, 44, 71, 86,129, 9, 26,163, 21,
+ 90,131, 21, 36, 65, 32,216, 71, 1,131, 54, 31,151, 15, 44,165, 45,186,130,193, 64,156,181, 60,155, 10, 85,232,252,130, 23,145,
+ 95, 77,157,112, 17, 98, 39, 63,159, 90,157,127,168, 80,173,211,166, 63,232, 51,117,194,241, 80,158,231,187, 40, 84,161, 90,125,
+ 78,204,204,242,242, 78, 16,182,247,123,104, 39, 63, 88, 25,219,250, 99, 12, 7,176, 28, 87,172,242, 1,252, 75,127, 62, 81, 73,
+222, 9,110,239,201,127,144,145, 93, 8,163,133,134,217,194,192, 74,179, 32, 41, 10,206, 46,206,168, 83,171, 41,156,156, 29,145,
+157,149,129, 27, 23,142, 33,246,209,229,127, 8, 30,115,140,234,231, 23,236, 41, 35,145,204, 57,212,219,199,139,204,212, 88, 32,
+ 19, 83,120,112,249,148,149,182,152,151,217, 73,178,222,178, 89,152,151,191,226,155,105,211, 63,253,115,235, 54,175, 70,129,142,
+ 72,203, 53, 34, 77,109,130,214, 68, 23, 19, 49, 14,102, 93, 46, 30, 69,110,203, 98, 77,218, 21,248, 15, 65,185, 68,139,177,154,
+180, 7,207,220,118,155, 49,123, 41,245, 34, 46,158,158,255,117,175, 52,163, 78,211,179,202, 74, 86, 41,252,249,101,224,158,255,
+138, 76,188,229, 46,228, 57,112, 60,143,227,183,178, 94,186, 11,185,226,200,203,251,113, 21,111, 35, 88,122,239,194, 15,122, 78,
+254,251, 81,140,118,167,209,152,237,244,236,197,178, 2, 0,160, 40,234,229, 81, 18,155,101, 50,153, 44,149,184, 80,182,111,218,
+180,233,251,241,227,199, 75, 82, 83, 83, 17, 23, 23,135,194,194, 66, 72,165, 82,156, 57,115,134, 6,199, 44,123,116,237,112, 98,
+204,189,115,191,132, 54,239, 94,163, 81,235,158,144,203, 21, 16,240,246, 7, 99,202, 85, 33, 67,154,119,236,187,174,203, 71, 99,
+112,254,240, 38,254,206,229, 99, 19,140,234,216,141, 85,125,150,133,133,133,209, 0,158, 47, 91,182,172,201,230,205,155, 3,167,
+ 77,155, 22,191,125,221,236, 53, 0,144,151,151, 7, 0,184,127,255, 62, 63, 97,194, 4,179,201,100, 74, 40, 40, 40,184,135, 74,
+ 38, 64, 0,128, 81, 45, 95,184,121,253,226,134,169,233,153,253,131, 26,182,132, 71, 96, 75,120, 5,183, 66,129,214,138,219, 47,
+ 50, 16,255,244, 2,158, 94, 61,112,202,160,100,102,163,138,235, 27,135,133,133,249,145, 36, 89, 75,167,211,121,213,175, 95, 63,
+ 76,161, 80,220, 15, 11, 11,107, 42, 16, 8,210,238,222,189,155, 84, 21, 91,201,151,183,153, 3, 58,142, 92,157,172,117,232, 20,
+159,101,104,154,172,117,184,111,144, 56,125,171,142, 92,109,254,147,242, 93,193, 91,115,163,247,111,211, 28,220,181,113, 57, 53,
+108,236, 84, 54,170,200,229,107,129, 76,252,119,213,228,106, 50,115,226,136,126,175,150,119, 40, 86,178,138,191,219, 37,211, 23,
+ 21, 61, 42, 2,240,253,163, 39,194,117, 81, 95,143,155,215,184, 69,219,225, 29, 62, 28, 76, 50, 34, 37,206, 30,254,157, 79,120,
+ 20,185, 95,192,179, 63, 25,237,216, 13,160, 82,119,144,197, 98, 15,201,122, 59,141,169,138, 15,246,239,222, 50,242,224,225, 67,
+139, 62,234,219,207,109,253,207,131,176,244,143, 35, 80,200, 36,224, 57, 14,131, 58,249,125,242,203, 23,117,251,248,121, 74,125,
+ 15, 94, 76,187,242,213,202,168,239, 13, 6,107,172, 29, 74, 12,159,155,155,123, 85,169, 84,170,219,181,107, 23, 46,145, 72,136,
+220,220, 92,129, 74,165, 98,156,156,156, 44,105,105,105, 6,179,217,124, 16, 64,149,150, 29,183,210, 28, 18,179, 77, 56,122,232,
+ 32, 30,222,186,128,167, 79, 99,180, 79,159, 60, 93, 75, 8,248,149,250,236,231,249, 64,149, 7,248,224,202,156,117,200, 87,121,
+214, 33,107,214,238,218,190, 97,126,103,131,201, 60, 50,172, 77, 47,212,172,215,150,180,210, 44, 30,223,185,136,139, 7, 86, 46,
+181,234,242,103,188, 79, 25,251,212, 8,172,195, 83, 98, 92,191,116, 18, 60,199,109,192,255, 99,239,190,227,154,186,250, 63,128,
+127,178,200, 32, 64, 88,178,135,149, 33, 46, 80,180,214,137,179,106, 43,173, 86,173, 90, 87,221,181,250,211, 71, 31,235,168, 86,
+176,142, 86,251, 88, 87,109,107,235,170,163,238, 58,112,219,170,168,197, 21, 20, 21, 21, 16, 4, 68,246, 8, 33, 9, 25, 36, 57,
+191, 63, 24, 69,203,116,180,213,126,223,175, 87, 94, 26, 72, 62,185,247,230,222,240,205,185,231,158, 3,128,153,205,223, 69, 95,
+ 56,250,209, 27,111,143,131,189, 83,195,150,138,212,104, 14,158, 98,244,112, 11, 62, 87,125,108,223,230, 95, 30, 60,120,128,187,
+119,239, 34, 33, 33, 1,249,249,249,216,177,227, 65,189,222, 31, 77, 65,242,169,184, 88,110,239,129,131,135, 29, 30, 52,116,164,
+184,145,127, 32, 55,192,195, 14, 14, 86,124,220, 75, 72, 70,220,181, 24,243,189, 43, 71,181, 6,101,118,255,226,130,228,106, 11,
+ 63, 75,199,166,206,128,105, 78,249,220,133,237,219,119, 12,248,100,201, 23,237, 28, 26, 56, 85,249, 57,158,151,147, 45,156, 53,
+229, 80, 64,212,165,223,235, 52,215,161,217,100,202,155,240,225, 16, 51,175,116,162, 80, 84,180, 83,151,109,189,210, 47, 83,165,
+ 63,103,102, 99,173, 45,248,163,223,235, 12,163,217, 12,117,177, 1, 74,181, 14,133, 69, 90,100,100,231,225, 70, 76, 12,206, 29,
+ 62,132,251,247,110, 36,149,232,245, 39,185, 92,206,222,226,172,184,115,245, 59,211,196,111,228, 96,111,143,164,124, 21,196, 66,
+ 62,146,227,174,233,212,202,194,237, 79,187, 31, 21,231,197,103,100,243, 56,189,134, 12, 25,122,188,123,239,119,101,175,119,232,
+105,233,104, 99, 11, 11, 62, 67,252,131,116,200, 47, 30, 87, 39,222,136, 84,150,232, 85,125,158,199,172, 47,255,112,181, 95,117,
+104,208,169,223,249,160, 95,151,253, 60, 30, 95,104, 54, 27,117, 6,189,110,224,179, 20, 89, 47, 10, 99,166,180, 15, 63,120,239,
+177,239, 6, 70, 51,147,124,240,254,137,226,202,223, 21, 74, 76,204,242,131,247, 47,106, 74, 63, 64,170,239,216,231,234,106,223,
+183,124,238,194,148,148,188,171,249,249,186, 51, 0,210,180, 90,237, 83, 47, 99, 86, 86,214,162, 37, 75,150,132,106, 52,154, 38,
+ 93,187,118, 21,217,216,216, 32, 47, 47, 15, 39, 79,158, 44,137,136,136,136,205,206,206, 94, 0,100, 27,139, 17,252, 83,140,246,
+151, 81,247,174,157, 92,208,164, 77,111,143,192, 14,111,215,253,195, 76, 36, 25,223,253,221,177,156,211, 7,126,100, 87,206, 30,
+248,184, 56, 39,126,253, 51,108, 86,131, 86,171,189,172,213,106,111,205,155, 55,239,117,103,103,103,231, 5, 11, 22,136,149, 74,
+165, 96,221,186,117,218,220,220,220, 76,165, 82, 25,133, 26,250,211,252, 89,116, 73,225, 35, 12, 56,182,239,199,110,108,223,143,
+111,218, 58,186,247,146, 53,240,240, 85,228, 60, 74, 42,204, 73, 63, 9,224,116,217, 64,145,245,210,170, 85, 43, 31, 14,135, 51,
+ 4, 64, 11,169, 84,234,103,101,101, 37, 98,140, 53,225,112, 56,183,205,102,115, 76,179,102,205, 34, 98, 99, 99,235, 53,152,108,
+202,185, 45, 58,207,128,142, 63,231,107,204, 22,122,174,197,207, 41,231,182,232, 0, 32,251,212, 39, 26, 0, 7, 99,187,206, 30,
+112, 40, 42,121,205,237, 2,217,212,156,179, 95, 28,170,239, 50, 23,166,221,240,123, 94,251,191, 54, 35, 54, 13,192,135, 49,215,
+176,226,102,116, 84, 24,135, 65, 96,130,113,113,113,118,194,181,231,145, 47, 16, 8,180,238,238,238, 85, 94, 93, 40, 18,137,180,
+ 58, 93, 77, 13, 40,231,140,170, 12,108, 0,186,108,217,191,123,203,135, 7, 14, 29,252, 34,164, 71,127, 7,177,135, 7, 94,115,
+226, 96,203,156,214, 83,127,141,206,185,242,238, 39,145,223, 38,166,107, 99, 80,207,254, 48, 42,149, 42, 14, 64,129, 74,165,234,
+199, 24,123,200,225,112, 60, 11, 10, 10,174,151,148,148,220,172,119, 65, 96,198,176,246,237,219,238,224,112, 56,124,102, 52, 47,
+143, 18,240,126,214,102,220, 73,195, 51, 78, 75, 18,248,154, 13,166, 47, 88,221,218,215,175,113,235,242,185, 14,155, 55,180,198,
+196,217, 43, 90, 55,108,228,223,250,143,249, 15,107,237, 38,192, 74, 52, 5, 99,246,111, 92, 30, 25,125,233,204,167,142,174, 13,
+ 27,102,166, 37,222,121,152,112,125,145, 73,171,220,255,172,239,243,131,132,219, 43, 55,252,111,246,204,140, 71, 73, 27, 52, 57,
+241,183, 0, 64,147, 19,127,235,142, 28,159,229,102,166,205,204,203, 78,252,223,211,110, 11,181, 90,157,190,125,251,118,219,142,
+ 29, 59,114,157,157,157,145,147,147,131, 51,103,206,152,205,102,243,163,122,103,229, 39,157, 81,231,115,236,127, 90,255,205,114,
+ 11,169,245,219, 70,163,209,141, 49,128,207,231,103,232, 53,202,227, 69, 92,233, 39, 40, 72,214,214,252, 55,195,204, 1,192, 45,
+159,187,208,108, 54,115,150,175,217,146, 44, 16, 91, 87, 57, 24, 98,137,182,200,210,108, 54,215,121,174, 67, 69,170,220,247,121,
+ 29,223, 28,198, 22,182,108,211,238,211,146, 18,131,182,236,248,208, 2,208, 50,134, 60, 46,151,115,142,103, 46, 57,161,124,134,
+ 47, 83, 28, 14,108, 24,135, 15,107, 9, 31, 28,112,160, 42,204,103,243,204,163,222, 0, 0, 32, 0, 73, 68, 65, 84,245,233,147,
+ 85,101, 65,156, 29,119, 91,147,221,197,251,152,126,247,168,223, 78, 29,125,223,100, 50,189, 86,214,102,240, 64, 87,172,222,163,
+202,176,251, 9,184,102,196,171,239, 72,121,177,197,121,193, 47, 84,167,211, 40,255,164,204,128, 70,146,126, 30,238,206,163, 30,
+ 36,103, 95, 73,124,168,249, 9,143, 79,171,243, 44,203,201,115,118,118,254,140,195,225,140, 16, 10,133, 86,122,189, 94,205, 24,
+219,154,149,149,181, 8,127,154,252, 55, 88, 32,113, 42, 30, 37, 20, 91,206, 55,104,213,191,107,178,227,134,213,182,238,150, 13,
+ 26,247, 18, 75,165,179,181,197,234,173,154,172,184, 45,207,121,123,202, 68, 34, 81,176,149,149,149, 32, 55, 55,247, 50,128,194,
+127,210,251,222,178,101, 75, 47, 46,151,251,154,217,108,118, 6, 32, 67,233, 85, 33,185,124, 62,255, 81, 89,139, 22,171,111,102,
+167,209,123, 28,123,188,217,124,250,201,200,123,171,202, 78, 43, 86,112, 31,244,181,120,196,219,221,254,251,211,254,131, 85, 93,
+117,248,210,237,243,127, 93,102, 23,190,149,107,238,135, 92,161,108,113,143, 0,173, 38, 55,253,209,164,243, 55,115, 46, 3, 40,
+122,150,229,180,176,176, 24,110, 48, 24, 36, 22, 22, 22,197, 6,131, 97,251, 63,101,221, 37, 78, 1, 99,185, 96,117,158,153,194,
+ 12,206,181, 39, 46, 90,121, 85,246, 37, 94, 96, 96, 96,103, 11, 11, 11, 47,147,201,100,169,215,235, 53,197,197,197, 15,146,147,
+147,127, 71,245, 19,159,191,208,229,148, 58,249,175,180,176, 16, 77, 3, 0,131, 65,183, 90,157, 29, 63,189,166, 39,214,240,248,
+151,250, 61,114,124,173, 77, 60,159, 39,104,128,178,129,185,205, 70, 99, 78, 86,210, 85,255,191,113, 57,201, 83,190,185,148, 73,
+153,148, 73,153, 79,226,210,246,164,204,191, 51, 83,236,218,212, 83,236,218,180,206,131, 46, 87,243,120,218,158,164,220,132, 42,
+110, 0,234, 48, 96, 41, 33,132,188, 0,102,218, 4,228,239,164,205,184,243,240, 69, 62,158,252,235, 84,219, 39,154, 83, 67, 85,
+ 90,159, 38,193,167,169,108, 79, 83, 38,101, 82, 38,101, 82, 38,101, 82,230,191, 46,179,182,236,151,241,148,228,132, 39,238, 31,
+ 1,240,151,116,248,167,102, 85,202,164, 76,202,164, 76,202,164, 76,202,252,183,169, 40,188,184,180, 45, 8, 33,132, 16, 66, 94,
+ 12,234,163, 69, 8, 33,132, 16,242,108,170, 58,117, 72,133, 22, 33,132, 16, 66,200,115, 80,109,103,120, 58,117, 72, 8, 33,132,
+ 16,242,108,202, 91,180, 92,241,196,240, 14, 84,104, 17, 66, 8, 33,132, 60, 31, 25,168,170,117, 43, 34, 34,130, 85,245,127, 66,
+ 8, 33,132,144,191,194, 75, 94,139, 84,110,201,154, 80,118, 31, 64,165, 22, 45, 42,176, 8, 33,132, 16,242, 79, 41,182, 94, 50,
+229, 45, 89,229,183,140, 63, 21, 90,161,161,161, 28, 42,182, 8, 33,132, 16,242,119,121, 21,107, 17,238,147, 43, 72,111, 51, 33,
+132, 16, 66,254,206, 98,235, 85, 90, 31, 26,222,129, 16, 66, 8, 33,228,217,184, 2,232, 91,233,254, 95, 54, 5, 15, 33,132, 16,
+ 66,200,171,110, 66,117,247,169, 69,139, 16, 66, 8, 33,228,249, 23, 91,132, 16, 66, 8, 33,228,101, 70, 51,155, 83, 38,101, 82,
+ 38,101, 82, 38,101, 82,230,171,174,124, 28, 45,160,186,113,180, 8, 33,132, 16, 66,200, 83,233,139,210,241,179, 38,148,253,219,
+151, 10, 45, 66, 8, 33,132,144,231,235, 79,211,239, 80,161, 69, 8, 33,132, 16,242,124, 11,172, 31,168,208, 34,132, 16, 66, 8,
+121,193,168,208, 34,132, 16, 66, 8,121, 65, 56,168,254,202,129,211,245,200,121,154,171, 15, 78, 83, 38,101, 82, 38,101, 82, 38,
+101, 82,230,191, 46,179,182,236,211,120,249,148,143, 12,127, 4,127,116,132,255,225,175,120, 97,186,244,149, 50, 41,147, 50, 41,
+147, 50, 41,147, 50, 95,117, 19,158,248,183, 2,157, 58, 36,132, 16, 66, 8,121,190,197, 22, 77,193, 67, 8, 33,132, 16,242,156,
+ 84,123,154,144, 90,180, 8, 33,132, 16, 66,158, 77,181,147, 74, 83,161, 69, 8, 33,132, 16,242, 98, 10, 46, 42,180, 8, 33,132,
+ 16, 66,158, 99,145, 53,161,202,223, 70, 68, 68, 48,218, 70,132, 16, 66, 8,249,187,188,178,181, 72,249,138, 81,177, 69, 8, 33,
+132, 16,170, 69,234,205, 21,127, 92,109, 56,161,236, 62, 0,186,234,144, 16, 66, 8, 33,228, 89,245,197,227, 87, 30, 78, 40,191,
+ 79,133, 22, 33,132, 16, 66,200,179,155, 80,227,111,233,180, 33, 33,132, 16, 66,254, 78,175, 98, 45,194,161,183,149, 16, 66, 8,
+ 33,228,153, 84,213,154,245, 3,109, 22, 66, 8, 33,132,144, 23, 91,112, 17, 66, 8, 33,132,144, 23, 81,100,189,232, 1, 75,105,
+102,115,202,164, 76,202,164, 76,202,164, 76,202,252,183, 20, 89,149,135,120, 0, 64, 87, 29, 18, 66, 8, 33,132, 60, 43,154, 84,
+154, 16, 66, 8, 33,228, 5,161, 73,165, 9, 33,132, 16, 66,254,226,130,139, 10, 45, 66, 8, 33,132,144,231, 88,100, 61, 86,108,
+ 81, 31, 45, 66, 8, 33,132,144,103, 83,109, 31, 45, 14,170,191,114,224,116, 61, 94,224,105,174, 62, 56, 77,153,148, 73,153,148,
+ 73,153,148, 73,153,255,186,204,218,178, 79,227,229, 55, 1,127,209,128,165,116,233, 43,101, 82, 38,101, 82, 38,101, 82, 38,101,
+254,219,208,240, 14,132, 16, 66, 8, 33,207,187,176,122, 18, 21, 90,132, 16, 66, 8, 33,207,134,198,209, 34,132, 16, 66, 8,121,
+ 65, 92, 81,218,170, 85,254,111, 48, 21, 90,132, 16, 66, 8, 33,207, 71, 95,148,182,106,149,255, 75,133, 22, 33,132, 16, 66,200,
+115, 84,229, 56, 90, 28, 0,136,136,136, 96,101,247,187,134,134,134,158,163,109, 69, 8, 33,132,144,191,210,171, 90,139, 84,180,
+104,133,134,134,114, 0,156,165,183,154, 16, 66, 8, 33,127,135, 87,177, 22,225, 62, 81, 73,118,165,183,153, 16, 66, 8, 33,127,
+135, 87,177, 22,225, 63, 81, 69, 18, 66, 8, 33,132,252, 45, 94,226, 90,196, 21,165, 29,225,143,148,253, 11,148, 13,249, 64,227,
+104, 17, 66, 8, 33,132, 60,155,242,171, 13,255, 52,245, 14,181, 98, 17, 66, 8, 33,132, 60,155,170, 70,134,255,129, 54, 11, 33,
+132, 16, 66,200, 11, 68, 45, 90,132, 16, 66, 8, 33,207,174,114,171,214, 95,214,154, 69, 51,155, 83, 38,101, 82, 38,101, 82, 38,
+101, 82,230,191,169,200,122,236, 62,141, 12, 79, 8, 33,132, 16,242,130,208, 85,135,132, 16, 66, 8, 33,207,166,252,138,195,202,
+247,169,208, 34,132, 16, 66, 8,121,142,197,214,159,208,169, 67, 66, 8, 33,132,144,103, 51,161,186, 95, 80,161, 69, 8, 33,132,
+ 16,242,130, 10, 46, 14,170,191,114,224,116, 61,130,159,230,234,131,211,148, 73,153,148, 73,153,148, 73,153,148,249,175,203,172,
+ 45,251, 52, 94, 62,127,219,128,165,116,233, 43,101, 82, 38,101, 82, 38,101, 82, 38,101,254,107,209,169, 67, 66, 8, 33,132,144,
+127, 64,161,213,128,207,231,127, 42,145, 72,190,149, 72, 36,235,249,124,254,255, 0,216,213,247, 5,165, 82,233, 84, 23, 23,151,
+187, 46, 46, 46,105, 94, 94, 94, 71,173,173, 45,255,227, 35, 66, 8, 0,193,115, 90,159, 0, 0,255,145, 72, 36,119,196, 98,113,
+ 50,128,109, 0,254, 3,192,241, 89,130, 23,185, 97,224,173,105,253, 14, 44,114,195,192, 39,126,213,215,217,217,249, 60,128, 94,
+207,235, 77, 25,106,137,158,131,164, 72, 29, 36, 69,234, 80,203,167,255,214, 96,109,109, 61,194,213,213, 53,202,193,193,225,145,
+171,171,235, 69,177, 88, 60,168,158, 17, 78,206,206,206, 95,121,122,122,198,185,185,185,173, 66,233,236,228,255, 88,157, 69,232,
+220, 78,132,156,246, 66, 20,117, 20,226,219,246, 66,188,249, 38, 96,249,148,113,157, 0,236,181,177,177,185,206,231,243, 35, 0,
+ 12, 40,219,191, 6,240,249,252, 8, 27, 27,155,235, 0,246,150, 61,238,105,246,211,175, 0, 60, 2,176,180,236,254,255,121,122,
+122, 22, 5, 5, 5, 37, 7, 5, 5,109,246,243,243, 27, 89,215, 48, 75, 75,203, 55, 61, 61, 61,247,121,121,121, 37,183,111,223,
+ 62,223,221,221,253,158,135,135,199, 22,145, 72,212,149, 62,226, 8, 33,228,159,239, 29, 0, 95, 0, 88, 27, 19, 19, 35,103,140,
+201, 25, 99,242,152,152, 24, 57,128,111, 1,124,137,234,155, 16, 31,251,185,131,131,195,194,197,139, 23,107, 51, 50, 50, 88, 78,
+ 78, 14,139,139,139, 99, 43,231,207, 54,247,182,231, 51,159, 6,118, 26, 87, 87,215,251,222, 30, 30, 59,155, 91,113,103, 3,240,
+173, 75,102, 37,118, 18,137,228,242,252,249,243, 85,231,207,159, 87,233,245,122,149,217,108, 86,165,167,167,171, 78,159, 62,173,
+234,216,177,163, 10,192,116, 0,188,122,100, 86,248,220, 13,231,216,198,207,216,231,110, 56, 87,249,231, 77,154, 52,137, 53,155,
+205,108,224,192,129, 58, 0,238,245,201,124,146, 59, 32,110,110, 3,219, 65, 86,200, 50,110, 89,196,216,186,153,108,144, 20,169,
+ 79,147,233,228,228,116,112,234,212,169,202, 71,143, 30, 49,157, 78,199, 82, 83, 83,217,196,137, 19, 11,157,156,156,182,215,113,
+221, 29, 2, 3, 3,179,162,162,162,204, 10,133,130,157, 61,123,214,220,162, 69,139,172, 58, 22, 91, 61,159, 88,150, 31,220,220,
+220,142,214,231,230,228,228,180,161,190,239,209, 27, 34,164, 26,228,103, 24,187,122,146, 29, 26,216,158,173,108,227,193, 6,216,
+ 11, 21,157,132,248,191, 46, 85, 15,101, 82, 93,230,251, 93,186,116, 81,223,188,121,211,148,151,151,199, 98, 99, 99,205,227,199,
+143,215, 2,184, 61,126,252,120,109,108,108,172, 57, 47, 47,143,221,188,121,211,212,165, 75, 23, 53,128,113,245, 88, 78, 46,128,
+ 77,225,225,225,140, 49,198, 22, 47, 94,204,130,130,130, 88,247,238,221,153, 74,165, 98,140,177,100,198,216,102,163,209,248, 97,
+ 93, 50,101, 50,217,136,169, 83,167,170, 52, 26, 13, 43,103, 54,155,153, 66,161, 96,107,215,174, 85,187,184,184, 28,173,230, 75,
+ 6,157,242,160, 76,202,164,204,127, 90,230,203,204, 21,165,253,180,202,111,117,110,152,248, 96,246,236,217,229, 69,213,177, 78,
+157, 58, 93,249,240,195, 15,229, 31,126,248,161,188, 83,167, 78,103, 1,156,184,118,237,154,124,214,172, 89,114, 0, 31,212,242,
+ 70,216,117,232,208, 65,145,153,153,201,252,253,253, 89,195,134, 13, 89,102,102, 38, 99,140,177,171,239,183,102,191, 54, 5,123,
+ 24,121,140,157,252,101, 47, 27,239,202,103,157, 93,101, 37,174, 46, 46,121,142,142,142, 75,240,248,156,140, 85,189,185,239, 53,
+109,218,180,232,246,237,219,170,248,248,120,213,194,133, 11, 85,221,187,119, 87, 5, 6, 6,170, 6, 12, 24,160, 90,179,102,141,
+202, 96, 48,168, 54,108,216,160,178,177,177,185, 93, 69,177,245,212,133, 22,159,207, 95, 29, 19, 19,195,238,223,191,207,202, 90,
+ 41,170,203,148,217,218,218,246,177,179,179,155,110,107,107,219, 7,128, 12, 0,252, 1,171,150, 50,120,253, 95, 75,159, 38, 17,
+ 31,244,244, 93,219,243,245,214,131,172,185,138,146,111,102, 50, 54,208,235,169, 10, 45,153, 76, 54,226, 63,255,249, 79,145, 78,
+167, 99, 26,141,134,169, 84, 42,166,209,104, 88, 81, 81, 17,251,224,131, 15,148, 98,177,248,189,218, 50, 29, 29, 29, 23, 69, 70,
+ 70, 26, 51, 51, 51, 89,100,100, 36, 59,122,244, 40, 91,183,110,157,217,201,201,233,235,250, 30,128, 46, 46, 46,167, 78,158, 60,
+ 41,143,142,142,150, 95,190,124, 89, 94, 82, 82, 34, 55, 24, 12,114,131,193, 32,143,136,136,144,239,223,191, 95,190,107,215, 46,
+185, 94,175,151,235,245,122,185, 78,167,147, 55,106,212,232,120,125,223,163,182, 34, 60,212,159, 63,196,216,215,147, 89,225,178,
+ 73, 76, 49,227,109,150, 61, 49,132,125,251,186, 7, 11,145,224, 48,254, 60,183,103,149,153, 2,129,224, 92,114,114,178,121,238,
+220,185,250,102,205,154, 21,142, 25, 51, 70,171,211,233, 24, 99,140,233,116, 58, 54,102,204, 24,109,179,102,205, 10,231,206,157,
+171,127,240,224,129,153,207,231,159,174,199,114,126, 89, 94,100,157, 59,119,142, 85,166, 82,169, 88,247,238,221,147,131,130,130,
+ 54,191,246,218,107,195,106,203,180,178,178,234, 55,103,206, 28, 21,171, 66, 73, 73, 9, 43, 42, 42, 98, 15, 30, 60, 48, 55,108,
+216, 48, 29,128, 3,125,152, 83, 38,101, 82, 38, 21, 90, 47,204,132, 90,238, 87,189, 17,103,205,154, 37,103,140,201,231,205,155,
+ 39, 47,107,217,178, 0, 96, 85,118,227, 3, 24, 58,103,206, 28, 57, 99, 76, 62,123,246,236,242,199, 84,247, 70,188,179,103,207,
+ 30,195,170, 85,171,152,179,179, 51,115,113,113, 97,171, 87,175,102,102,179,153,101, 70,108,103,191, 54, 5,187,243,233, 40,198,
+ 24, 99,113, 75,166,176, 95,155,130, 37,126,247, 57, 27, 62,124,184,198,210,210,242,131, 26,222, 92,251,214,173, 91, 23, 21, 23,
+ 23,171,182,108,217,162,178,180,180,188, 10,160, 25, 74, 79, 69,114,202,150,117,100,179,102,205,148,183,110,221, 82,253,252,243,
+207, 42, 0, 11,235,184,195,248, 2,232, 38,149, 74, 7,204,113, 23,196,179,141,159,177, 57,206,184, 9,160, 5,128, 6,101,143,
+113,155, 61,123, 54, 99,140, 49, 79, 79,207,200,106, 50,101,129,129,129,179,227,227,227,195, 74, 74, 74,194,162,163,163,195, 26,
+ 55,110, 60,247,221, 70,174,237, 15,124,240,102,112,225,231,147,130,217,138, 25,129,255,123,171,109,207,157, 67,186,126, 48,250,
+ 53,199,243, 99,156,196,154,193, 50, 94,209, 19,167, 14,235,180, 99,187,187,187, 95, 78, 77, 77,173, 40,174,138,138,138,216,163,
+ 71,143, 88, 82, 82, 18, 59,127,254, 60,115,117,117,253,181,182, 76, 23, 23,151,216,212,212, 84,246,221,202,149,108, 96,139, 38,
+ 44,196,214,154,117,177,179,102,109,172,196,234,166, 64,155,250, 22, 90,215,175, 95,151, 3,144, 3,144,231,229,229,201,243,242,
+242,228, 5, 5, 5, 21, 63, 3, 32, 47, 44, 44,148, 23, 22, 22,202,245,122,189,220,199,199,167,222,133, 86, 71, 49, 58,190, 33,
+ 70,126,123, 17,138,223,113,119, 76,159,212,200,209,116,233,131,246,172, 96,114,119,182, 42,216,157,117, 18,226,255,234,152,249,
+142, 80, 40, 60, 11, 96,102, 89, 81, 62,170, 79,159, 62, 26,198, 24,235,211,167,143, 6,192,168,178,159,255,167,172,200,234, 83,
+199,229,228,250,249,249,169,203, 91,178, 0,252,238,231,231,167, 14, 10, 10, 98, 65, 65, 65,204,211,211,179,168, 44,187, 78, 31,
+104,190,190,190,113,197,197,197, 21, 5,160, 66,161, 96,233,233,233, 44, 49, 49,145,221,190,125,155, 93,189,122,149, 37, 39, 39,
+179,221,187,119,155,108,109,109,143,208,135, 57,101, 82, 38,101, 82,161,245, 66, 11,173, 39,111,143,139,136,136, 96, 79,252,104,
+217,181,107,215,228,115,230,204,145,215, 82,153, 77,152, 55,111, 94,121,171,215, 23, 53,252,241,223, 16, 23, 23,199, 70,141, 26,
+197, 2, 2, 2, 88, 64, 64, 0,251,240,195, 15, 89, 97, 97, 33, 83, 37,220, 98,191, 54, 5,187, 58,184, 13, 99,140,177,162, 59,
+209,236,215,166, 96,242,225, 29,216,141, 27, 55,152,135,135,199,201, 26, 94,255,240,197,139, 23,115,182,111,223,158,137,210,254,
+ 88, 2, 0,237, 0,172,150, 72, 36,155, 80,122,186,176, 33, 0, 59,127,127,255,124,141, 70,163, 26, 56,112,160, 10,128, 87, 13,
+153, 93, 2, 2, 2,238,111,216,176,129,101,103,103,179,252,252,124,182,188, 99, 99,198, 54,126,198, 22,183,105,104,254,238,187,
+239,116, 51,103,206, 84,219,219,219, 71, 0,112, 27, 56,112,160,145, 49,198, 66, 66, 66,178,170, 10,179,181,181,237, 19, 31, 31,
+ 31,166,213,106,195, 20, 10, 69, 88,126,126,126,216,161, 3, 7,194,122,183,104, 60,170,240,243, 73,193, 7, 62,120, 51,248, 45,
+119,187, 1, 95,247,122,253,163, 71,115,199, 13,156,215,161,217, 29,237,151,211,206,188,223,200,249,171,167,121,183, 27, 52,104,
+144,161,211,233, 24,128, 63,221,238,223,191,207, 28, 28, 28, 82,107,203,176,183,183,159,247,159,161, 67, 76,239, 53,116,103,247,
+ 87,205,103, 37,167,126,102, 37, 71,183,176,132,101, 51,216,187, 46,142,202,118, 22,220, 57,117, 93, 30, 23, 23,151, 83,151, 47,
+ 95,126,172,208, 42, 40, 40,168,178,208, 82, 42,149,114,189, 94, 47,247,243,243, 59,254,172,123,125, 59, 33,124,186, 72,120, 87,
+163, 71,117,102, 57,147,186,179, 62, 50, 65,242, 51,196, 13, 5,112, 22,192,240,122, 62,143, 11,224,203,242,130,106,217,178,101,
+140, 49,198,252,252,252,212,120,182,139, 81,100, 77,154, 52, 73, 26, 55,110,156,177,105,211,166,217, 29, 59,118, 84, 92,185,114,
+133,157, 59,119,142, 29, 61,122,148,237,221,187,151,221,186,117,139, 61,122,244,136,197,197,197,177,190,125,251, 42, 0,116,161,
+207, 66, 66,200, 63, 89, 21,181,200, 75,143, 91,190, 98,161,161,161,156, 74, 43, 40, 3, 32,110,211,166, 77,206,151, 95,126,185,
+ 2,165, 99, 65,112, 2,121,120,191,187,132,127,163,187,132,127, 35,144,135,247,203, 90,140,126, 88,178,100,201,162,160,160,160,
+ 12, 0, 18, 0, 46, 85,189, 16, 99,172,179,131,131, 3, 82, 83, 83, 33,147,201, 32,147,201,144,154,154, 10,198, 24,140, 12, 40,
+ 97,128,206, 96, 64,113,113, 49,180,102,134, 98, 51,160, 84,169,224,226,226, 2,131,193,224, 83,205,242,183, 28, 60,120,176, 79,
+ 96, 96, 96,206,172, 89,179,210, 81,218, 87,102,211,216,177, 99, 79,253,254,251,239,129, 42,149, 42,255,246,237,219,218, 22, 45,
+ 90,244, 1,224, 18, 31, 31, 63, 98,237,218,181, 24, 53,106, 20,106,248,163,211,162,111,223,190, 71,111,221,186,229, 51,124,248,
+112,156, 61,123, 22,203,151, 47, 71,110,110, 46, 3, 0,157, 78,199, 76, 38,147,161, 67,135, 14,134, 85,171, 86,181, 13, 9, 9,
+185,220,168, 81, 35, 30, 0, 36, 37, 37, 37, 84, 21,200,225,112, 26,123,123,123, 67,167,211, 33, 39, 39, 7,183,110,221,130,181,
+ 76,134,152,244, 92,231,174, 95,127,151,247,233,129, 83,130,161,109, 3,237,167,191,217, 81,183,244,228, 89,255,102,110,206,206,
+122, 67,137, 75, 92, 70, 86,250,211,188,169, 22, 22, 22,169,185,185,185,208,235,245, 40, 46, 46,134, 82,169, 68, 94, 94, 30,114,
+115,115,145,158,158, 14, 11, 11,139,251,181,101,216,228,231, 71, 38, 93, 60,199,217,253,253, 50,248, 24,243,193,223,183, 26,252,
+131,223,194, 87,159,131,245,243, 39, 90,235, 29, 26,132,219, 88, 91, 23,216,218,218,254, 0,192,175,182,188,224,224, 96,228,229,
+229, 33, 47, 47, 15, 14, 14, 14,176,179,179,131,157,157, 29, 20, 10, 5, 10, 11, 11,161, 84, 42,225,239,239,143,150, 45, 91, 98,
+235,214,173,207,101,231,190,164, 71,162, 17,166, 73,167,238,165,195, 66, 42, 69, 35, 59, 43,239,215,173, 96, 95,195, 83,186, 11,
+ 4,130, 61,246,246,246, 39, 1, 76, 6, 32, 5, 48,217,222,222,254,164, 64, 32,232, 15, 96, 49,128,237,245, 92,140,165,225,225,
+225,179,227,227,227, 45,111,220,184,129, 89,179,102, 97,225,194,133, 72, 72, 72,248, 6,128,185,236, 49, 31, 59, 56, 56, 68,112,
+185,220, 31, 1,188, 13,160,143,171,171,107,143, 90,114,251,207,156, 57, 83,219,186,117,235,184, 59,119,238,244,191,120,241, 98,
+155, 25, 51,102, 20,166,164,164, 32, 46, 46, 14,174,174,174,240,244,244,132, 74,165, 66, 65, 65, 1,250,247,239, 47,179,177,177,
+249,128, 62,198, 9, 33,255,228, 34,235,137, 90,228,101,107,209,170,242,126,149,223,168, 45, 45, 45,195,229,114,121,251,160,160,
+ 32, 62,128,221, 0, 16,200,195,160,254, 29, 90,109, 58,240,195,178,160,253,171,230, 7,245, 14,242,223, 20,200, 67,249, 85,108,
+ 17,109,218,180,177,147,203,229, 29, 68, 34,209,255, 85,179, 16, 12, 0,236,236,236, 32,147,201, 96,107,107, 11, 59, 59, 59,152,
+205,102,168, 52, 90,168, 77, 64,145, 86,143,194,194, 66, 20,149,221, 87,233, 12, 80,171,213, 21,207,173, 66,215,113,227,198,229,
+172, 93,187, 54, 59, 35, 35, 99, 25,128, 22,163, 70,141,234,183,102,205, 26,252,246,219,111,218,183, 3,124, 29,150,116,110,181,
+168, 89, 70, 66, 88,128, 0,227, 1, 68, 70, 70, 70,162, 67,135, 14,224,112, 56, 67,170, 10,148, 72, 36,223,238,220,185, 83,114,
+251,246,109,248,250,250,222, 30, 50,100,200,251,203,150, 45,243,145,170,242, 47, 0,128, 49, 47,243,246,148, 41, 83, 62, 91,178,
+100, 73, 78, 78, 78,142, 65,163,209, 56,189,251,238,187, 72, 77, 77,197,163, 71,143,126,175,166,200,140,139,142,142,102,133,133,
+133, 72, 76, 76, 68,116,116,180,228,179,207, 62,107,107,226,114,251,165,193,122,244,168,142,109,218, 14,111,215, 10,219,163,110,
+ 88,156,191,151,100,219,166,161,187,221,245,135, 25,175,149,112,112,255,105,222,237,162,162,162,213,139, 22, 45, 82,169, 84, 42,
+164,165,165,225,230,205,155,184,115,231, 14,146,147,147,177,124,249,114, 85,126,126,254,154,218, 50,220,196,252,255,126, 53, 99,
+ 44,135, 31,251, 59,112,227, 28,160, 41, 2,138, 85,208,221,149, 99,243,221, 76,172,219,247,139, 48, 37, 53,213,118,215,174, 93,
+227,188,188,188,228, 0,252,107,202, 99,172,244, 45,228,114,185, 79, 22,161,224,114,185, 69, 0, 50,165, 82,233, 67,107,107,235,
+135, 92, 46, 55,147, 49,166,126, 46,223, 36,140, 48,128,199, 3,132, 18,112, 5, 53, 78,237,249,254,144, 33, 67,118, 62,124,248,
+176,119, 98, 98, 98,251, 53,107,214, 44, 18,139,197, 49,107,214,172, 89,148,152,152,216,254,225,195,135,189,135, 12, 25,178, 19,
+192,200,250,188,190,159,159,223,148,176,176, 48, 44, 95,190, 28, 45, 91,182,132,191,191,191, 38, 60, 60,124, 53,128,249, 0,254,
+207,207,207,239,194,148, 41, 83,198,100,103,103,187,164,165,165,181,252,230,155,111, 38,174, 94,189,250,245,244,244,116,113, 45,
+209,157,122,245,234,133, 99,199,142, 1, 64, 6,128,196,188,188, 60, 99,122,122, 58,154, 52,105,130,182,109,219, 66,165, 82, 65,
+165, 82, 65,161, 80,192,219,219, 27,102,179,185, 61,125,148, 19, 66,200, 95, 90,112, 85, 93,104,137,197, 98,187,224,224, 96, 52,
+106,212,200, 14,101, 87,107, 57, 8,249,115,167,143, 27,106,105, 37, 63, 14, 78,244,175, 24,210,185,185,165,131,144, 63,183,236,
+ 41,124,111,111,111, 81,112,112, 48,164, 82,169,123, 53, 47,126, 54, 51, 51, 19,193,193,193,176,181,181,133, 76, 38, 67,112,112,
+ 48, 12, 6, 3, 10,139,138,160, 54, 1,154, 18, 51, 10, 11, 11,145,159,147, 5,141, 9, 48, 90, 59, 32, 57, 57, 25, 60, 30, 47,
+169,154, 76, 87, 95, 95,223,156,152,152,152, 28, 0,145, 0, 62, 90,184,112, 33,230,204,153,131, 5, 11, 22,236,180,204,120,208,
+107,231,177,131, 14, 59,194, 63,110,224, 47,228, 12, 5, 96,120,248,240, 33,108,109,109, 33,149, 74,171, 44, 12, 66, 66, 66, 90,
+ 75,165, 82,108,217,178,133,165,165,165,117, 68,233, 37,252, 73, 28, 78,105,177, 39,225,162, 16,192,106,185, 92,254,198,103,159,
+125,118,175,103,207,158,130,118,237,218, 97,241,226,197, 0, 16, 81, 85,166, 66,161,184, 52,114,228, 72,253,153, 51,103,112,247,
+238, 93,233,129, 3, 7, 6, 45, 94,188,184,121, 74, 74,138,232,240,209,227,111,109,123,168, 28,180,236,228,121,241,146, 19,103,
+ 47, 57,218, 72,155,189,230,104,143,232,148, 71, 22, 38, 30,174,212,246,142,190, 33,224,141,235, 42,230, 71,119, 22,113, 51,186,
+138,249,242,215, 5,188,177, 69, 69, 69,187, 14, 29, 58,116, 98,198,140, 25,170,236,236,108, 88, 91, 91, 35, 47, 47, 15, 75,151,
+ 46, 85, 69, 71, 71,239,211,235,245,135,107,203, 53,153, 89,107,207,134, 94,192,253,152,138,159, 25,204, 12, 87,244, 22, 8,253,
+104, 26, 2,154, 52,129, 94,175, 71,139, 22, 45, 56, 11, 23, 46,148,202,100,178, 79,106, 45,122,184,127,218,221,140, 28, 14, 39,
+147, 49,246, 72,165, 82,165, 73, 36,146, 20, 11, 11,139,148,252,252,252, 52,198, 88,214,243,168,179, 24, 23,255,237,208,194, 15,
+ 16, 73,144,146,167, 74,191,170, 66,126, 85, 15,180,182,182, 30,187,110,221, 58,241,198,141, 27, 75,166, 76,153,162,155, 56,113,
+162,160,184,184,216,105,226,196,137,130, 41, 83,166,232, 54,110,220, 88,178,110,221, 58,177,149,149,213,128,167, 89,144,146,146,
+ 18,196,196,196, 44, 75, 72, 72,144,162,116,184,145,105,225,225,225,163,226,227,227,197,107,215,174,197,222,189,123,177,119,239,
+ 94,244,235,215, 15, 83,167, 78, 69, 88, 88, 88, 77,113,150, 65, 65, 65,193, 14, 14, 14, 56,119,238, 92, 58,128, 20, 0,173,173,
+172,172,172,251,245,235,135,222,189,123, 67,171,213,194, 96, 48, 84, 20, 90, 60, 30, 15,182,182,182, 14,244, 25, 72, 8, 33, 47,
+188,200,122,172,216,226, 3, 64,121, 83, 93,104,104, 40,167,166, 63,140,166,130,108, 40,212, 26, 36, 23,106,144, 90, 96,126,236,
+119,102,179,185,198, 87, 79, 79, 79, 63, 28, 21, 21, 53, 54, 56, 56,152,159,158, 94,122, 70, 44, 56, 56, 24, 26,141, 6,233, 55,
+ 46, 67,109, 6,164,190,129, 80,171,213, 40,184,115, 29, 86, 65,237,225,208,119, 56,190, 94,187, 86,151,151,151,247,125, 85,153,
+ 66,161, 80,224,225,225,145,147,148,148,100, 4,144, 47,147,201,122,121,121,121,225,236,217,179, 0,176,157, 1, 95, 33,250, 12,
+112,110, 63, 88,105,147,138,149,183,183, 55,178,179,179,161, 82,169,206, 86,149, 25, 21, 21, 21, 95, 82, 82,210,226,221,119,223,
+229,252,244,211, 79,187,149, 74,229, 2, 0, 55,117,102,240,110, 60,204,130,218, 4, 49,128, 55,237,236,236,254, 19, 22, 22,214,
+ 99,202,148, 41, 56,116,232, 16, 78,158, 60,105, 64,105, 95,176,168, 42, 98, 11, 19, 19, 19,215,207,156, 57,179, 29,151,203,253,
+232,212,169, 83, 70,127,127,127,165,193, 96, 48, 53, 14, 8,224, 46, 88,248,185,197,228,143, 38,216,230,105, 16,219,187,177,107,
+ 7, 14, 7,136,125,148,157,146,160, 66, 94, 77,219, 52, 68,200,139,232,223, 49, 40,100,236,144,119,172,164,190,205,160,190,117,
+217,101,253,158,163, 95, 75,162,227, 67,207,101,103,247, 59,116,232,208,160,179,103,207, 78,214,235,245,141, 68, 34,209,125,133,
+ 66,177, 74,165, 82,213, 90,100,241,120,188,190, 58, 87, 15, 59, 69,126, 62,196,101, 45, 81,202, 18, 51,114,117, 70,220,181,245,
+199, 7, 30,158, 21,167, 65, 51, 51, 51,225,226,226,194, 49,153, 76,239,212,148,121,242,228, 73,132,134,134,150, 23,158,224,112,
+ 56,224,112, 56,185, 1, 1, 1, 89, 34,145, 40,207,194,194, 66,249,213, 87, 95,105,181, 90, 45,248,124,190,216,100, 50,241,158,
+101,111,111,107, 9, 39, 17,227,124, 59,241,221,110, 61, 91, 54,107,194, 34,175,222,224, 20,104,180,155,107,104, 5,252,198,207,
+207,143,159,159,159,127, 24,192,221,146,146,146, 29,187,119,239, 22,143, 24, 49, 66,187,103,207,158, 97, 0,124, 86,172, 88, 49,
+ 72,165, 82,213,107, 74,133,132,132,132,111,150, 44, 89, 50,123,222,188,121,216,186,117,235,148,132,132,132, 57,101, 45, 93,253,
+194,194,194,240,213, 87, 95, 97,235,214,173,230,187,119,239, 30, 53,155,205, 9, 51,102,204, 8,114,118,118,206,205,200,200, 72,
+168, 33,182, 77,159, 62,125,116, 23, 46, 92, 16, 22, 21, 21,157, 7,240,159, 73,147, 38,141,123,227,141, 55,148, 67,134, 12,177,
+202,207,207, 87, 88, 90, 90, 10, 55,108,216, 96,199,231,243,161, 86,171,193,225,112, 80, 84, 84,164,167,207, 65, 66,200, 63, 85,
+117,181,200, 75,162,218,191, 13,252,170, 86, 80,163,209,100,165,166,166, 54,121,244,232,145, 17,128, 17, 0,242,244,198, 47,150,
+108,216,191,113, 64, 59, 63,105, 70, 73, 9, 14, 92,189,173,201,211, 27,203, 59,191, 27, 31, 61,122, 84,148,146,146, 98, 93, 92,
+ 92,172,170,230,181,126,255,246,219,111,139,207,156, 57, 99,157,152,152, 8,147,201,132,214,173, 91, 35, 46, 46, 14, 5,119, 99,
+ 32,109,210, 26,210, 46,161,184, 45,191,138,232,147,167,241, 64,165, 55,222,155,191,164, 80,165, 86,135, 25, 12,134, 3, 85, 5,
+ 10, 4,130,124, 0,140, 49,102, 2, 0,165, 82,121, 83,165, 82,117,118,118,118, 70,108,108,172, 84,109,194,212, 65,115,191, 94,
+195, 24, 51, 89,148, 94,205, 53,125,200,144, 33,184,118,237, 26, 0, 92,171, 42, 83,169, 84, 78, 25, 63,126,252,153, 45, 91,182,
+240, 19, 19, 19,123,111,220,184,177,247,189,123,247, 24, 39, 63,213,116, 65, 35,128,207,168,169,175,127,231, 29,112, 50, 52, 52,
+ 20,174,174,174,216,176, 97, 3, 86,173, 90, 85,242,241,199, 31,199,175, 90,181,234,245,236,236,236, 29,213,172,127,161, 66,161,
+ 56,238,224,224, 48,185,121,243,230, 69,106,181, 26,121,121,121, 72, 79, 79,135,189,131, 3,215, 8,110,135, 6,182,182, 59, 14,
+103, 22, 73,249,199, 47,225,114, 90, 70,141,173, 89,237, 4,188,145, 3, 66, 90,133,252,223,188,185, 86,184,112, 0,156,241, 97,
+ 96, 27, 23, 97,218,135,131,172,181,186, 29, 93,212, 55,146, 71,200,149,202,109, 74,165,114,111, 61,119,150, 62, 29, 58,116,216,
+185,100,201, 18,201,167,203,151, 96, 69, 19,119, 24,243,242,144,163, 51, 33, 87,103,132,178,224, 46, 98, 99,111,195,193,193, 17,
+ 15, 30, 60,128, 86,171,197,157, 59,119, 24,143,199, 59, 92, 91,139, 78,185, 74,167, 11, 21, 34,145, 40, 79, 32, 16,100,241,249,
+252,252,196,196, 68,181, 86,171, 5,151,203,149,154, 76, 38, 73, 29,150,213,195,209,209,113, 6, 74, 7, 19, 61, 84,148,155,187,
+ 58, 88, 0, 91,240,209,213,219,209,225,173,249, 19, 71, 56,122,185, 57, 41, 18,227,239,151,124,127,226, 98,174, 86, 87,253,197,
+ 26, 0, 34,242,243,243, 43, 90, 36,247,236,217, 51,109,207,158, 61,227, 0,108, 66,233,188, 91,167, 21, 10,197,119, 79,113,240,
+205,223,183,111,223,236,121,243,230, 65, 34,145, 84, 12,158, 42,145, 72,196, 0,240,243,207, 63, 35, 54, 54,246, 13,148,245,215,
+ 50,155,205, 59, 51, 50, 50,106,203,244, 9, 12, 12, 76,220,191,127,191, 16,128,219,164, 73,147,218,175, 89,179, 6, 31,126,248,
+ 97,206,237,219,183,219, 1, 72, 2,224,243,209, 71, 31, 93,217,186,117,171,157,217,108, 70, 65, 65, 1,244,122,125, 18,125,148,
+ 19, 66,168,216,122, 33,130, 1, 68,163,116,252,172,190, 0,142,160,180, 91, 71,181, 60,203,170,179, 19, 0,222, 45,255,251, 88,
+ 77,103,120,160,244,138,172,227, 0,126, 4,224, 92, 93,168,131,131,195, 39,163, 70,141, 42, 73, 75, 75, 99,153,153,153,108,239,
+222,189,108,250,216, 81,166, 55,125,221,204,190,110,206,234, 6, 13, 26,196,185, 58,218,111,110,101,137,233, 0, 60,234,176, 98,
+163,238,221,187, 55, 97,212,168, 81, 99,203, 94,119,236,206,157, 59, 85,167, 78,157, 82,241,120,188, 8,148, 14,237, 80, 94, 80,
+142,124,231,157,119, 84, 58,157, 78, 21, 16, 16,144,143,210,142,251,213, 25,212,181,107,215,130, 99,199,142, 49,147,201,244,167,
+ 49,138,114,114,114,216,201,147, 39, 89,199,142, 29, 21, 0, 70,244,232,209,227,236,197,139, 23,207,118,234,212,105, 95,109, 11,
+236,232,232, 56,247,198,141, 27,215,146,147,147,229, 71,142, 28,145,239,216,177, 67,254,209, 71, 31,221, 12, 10, 10, 42,142,143,
+143, 55, 27,141, 70,118,227,250,117, 22,208,184,177, 26,128,119,117, 57,221, 37,252, 43,202, 13,139,152,118,241,135, 76,219,223,
+147, 1, 96, 69, 95,127,194,178,166,244,100,113,147,223, 98,221,196,188,168,167,217, 83,236,237,237, 79, 92,187,118,141, 21, 21,
+ 21,177, 91,183,110,177,145,161,189, 89,212,184,158,236,120,111, 63,182,181,203,107,236,235, 94, 65,172,119,151,206,236,219,111,
+191,101,251,247,239,103,115,231,206, 53, 59, 58, 58, 22,161,134, 62, 90, 46, 46, 46,167,118,239,222, 45, 7, 32,231,241,120,114,
+165, 82, 41, 47, 42, 42, 58,252,240,225,195,117, 1, 1, 1,179,155, 55,111, 62,172, 73,147, 38,221,187,189,230, 61,187,135,181,
+ 40,174,167,141,248,126, 99, 43,203,175,241,231,113,175, 42,200, 0,111, 95, 31,159,162,115,231,206,153,117, 58, 29, 59,127,254,
+188,185,105, 99,127,237,138,193,125,246, 61,216,240,229, 62,237,177,159, 78,104, 14,254,112,113,207,232,208,152,174,150,220,159,
+218, 75, 43,134,227,120, 90, 67, 1, 28,192, 31, 87, 29,142, 2,112, 16, 53, 95,133,200, 5,176,105,241,226,197,149,175, 52, 4,
+ 0,110, 80, 80,144,156, 49, 38, 15, 10, 10,146,215,119, 65, 44, 45, 45,103, 28, 58,116, 40,220,203,203,107,249,144, 33, 67, 54,
+ 40, 20,138, 35,195,134, 13,139, 65,233,197, 32, 28,148,206,142,240,142,135,135, 71, 78,116,116, 52, 59,123,246, 44, 27, 56,112,
+ 96,145,133,133,197,112,250, 24, 39,132,144, 23, 98, 66, 53,255,214,104, 73, 76, 76, 76,249, 24, 90,147,106, 10,159, 51,103,142,
+252,218,181,107,114,148,142, 18, 95, 35, 62,159,255,203,199, 31,127,204,156,157,157, 85, 78, 78, 78,191, 8,120,188,113,158, 18,
+ 4,227,233, 46,117,239,188,109,219,182,126,223,124,243, 77, 95, 0,111, 0, 16,184,187,187,167,103,102,102,170, 46, 94,188,168,
+234,216,177,163,202,209,209, 49, 59, 48, 48, 80,181, 98,197, 10, 85, 73, 73,137,106,198,140, 25, 42,252,121,188,175,170,136, 1,
+ 76, 22, 10,133,191, 52,109,218, 52,102,254,187,221, 75,150, 79, 29,199, 70,249, 53, 80, 1,248, 6,192,199, 0,108, 1, 8, 6,
+ 13, 26,244,235,157, 59,119, 78, 4, 6, 6,174,175, 67,174, 91,243,230,205,127,219,185,115,231,181,253,251,247,203, 63,249,228,
+147,107, 14, 14, 14,105,241,241,241,102,173, 86,203, 10, 10, 10,152, 66,161, 96, 71,142, 28, 49,217,219,219,175,173,118,197, 69,
+188, 12,118,114,123,149, 67, 56, 60,156, 55,156,117, 20,114, 31, 61,205,158, 34,149, 74,243,243,242,242, 88,102,102, 38, 75, 76,
+ 76,100,251,246,237, 99,125, 58,180,101,187, 62, 26,192,182,143,237,199,190,234,211,150,189, 97, 45, 86,187, 88, 91, 93,179,182,
+182,206,174,203, 85,135, 46, 46, 46,167,116, 58, 93,197,240, 13, 30, 30, 30,242,128,128,128,253,129,129,129, 95, 31, 58,116,104,
+218,202,149, 43,251,117,123,205,123,246,210,222, 29,138, 53,167,247,176,162,221,223,176, 57,173,253,181,101,197,124,149,220, 29,
+236,183,157, 59,123,214, 92, 94,252, 26,141, 70,118,224,151, 95,216,224,183,222,140, 41, 60,254,243,143,231,195,166,236,156,209,
+218,255, 64, 71, 49,134,214, 84,176, 85,124, 21,177,130, 67,136, 13,119,221,219, 94,246, 25,157,101,220,111,218, 89, 63, 54,189,
+212, 96,127,127,255, 68,198, 88, 70,147, 38, 77, 18, 1,108,111,210,164, 73,229,251,163,171,137,173, 24,156, 52, 60, 60,156,149,
+ 29, 31, 92, 0, 11,150, 44, 89, 34,103,140,201,253,252,252, 46, 0, 64, 75, 41, 28,187,200,184, 63,190,235,227,156,215, 69,198,
+253,177,165,180,234, 41,163,188, 45,208,184,115, 3,203,243,253,252, 92,139,186,186,203, 34,183,111,222,184,252,237,183,223,222,
+ 0, 96, 45,128, 69, 14, 14, 14,231,135, 14, 29, 26,187,117,235,214,216, 21, 43, 86, 24,226,227,227,217,152, 49, 99,212, 34,145,
+104, 17,125, 14, 18, 66,200, 11, 83, 62, 50,188,107,125, 10,173,119,102,207,158, 45,103,140,149,143,165, 53,162,138,199,188, 59,
+111,222, 60, 57, 99,172,124,116,248, 39, 7, 48,171,106, 64,179,240,117,235,214, 49,145, 72,244,227, 83,174, 76,229, 76,151,254,
+253,251,183, 83, 42,149,175, 59, 59, 59,191, 94,214,114,229,233,232,232,152,184, 99,199, 14, 85,113,113,177,138, 49,166, 50, 26,
+141,170,107,215,174,169,186,118,237,170,170,244,173,191,182,229,124,204,167, 46,184,112,117,254, 88,246,169, 11, 46, 60,241,171,
+225,155, 54,109, 58,150,148,148,116,216,198,198,102, 86, 29, 51, 61, 27, 52,104,176,192,222,222,254,132,163,163,227,167,246,246,
+246, 25, 6,131,129, 21, 20, 20,176,184,184, 56,118,246,236, 89, 22, 21, 21,197,236,237,237,211,170, 91,206, 30, 18,254,165,130,
+229,147,153,121,211, 18,166, 95, 51,151, 1, 96,138,149,115, 88,238,183, 11,217,213,241,189, 89, 87, 49,239,247,167,216,158,176,
+181,181,253,225,151, 95,126, 49, 39, 36, 36,176,136,136, 8,118,228,200, 17, 54,117,234, 84,214,216,205, 85,215, 78,200,205,234,
+ 44,226,159,120,154, 1, 75,117, 58,157, 92,169, 84,202, 85, 42,149,188,105,211,166,242,182,109,219,238,111,215,174,221,215,123,
+246,236,153,182,116,233,210,126, 61,172, 69,113,154,211,123, 24,251,228, 45,198, 38,119, 98,247,199,117,101,221, 37,252, 27,213,
+102, 58, 59,167,149,143,214,174, 86,171, 89,100,100, 36,251,237,183,223,152,139,163,163, 50, 68,194,155,208, 81,132, 46, 29,109,
+ 96, 91,215,229,236, 38,227,110,190,244,237, 23,166,226, 99, 91,217,207,163,222, 50,118,181,229,174,171,244,184, 93,140,177,140,
+129, 3, 7, 62, 96,140,101,236,219,183,239, 33, 99, 44, 99,192,128, 1, 15, 24, 99, 25, 0,118, 86,149,249,196,224,164,155,202,
+138,172,201,225,225,225,114,198,152, 60, 60, 60, 92, 14,148, 14,162,218, 69,198,221,114,121,253, 87,102,221,145, 45, 36, 55,135,
+125, 0, 0, 32, 0, 73, 68, 65, 84,108,207,152,190,166, 46, 50,238,150, 42,151,211,150,127, 56,122,211, 74,166, 63,177,157,253,
+ 50,117,152,169,147,139,205, 57,127,127,255,175,166, 77,155,182, 63, 42, 42,234,166,201,100,138, 77, 76, 76,140, 93,187,118,109,
+108,251,246,237, 47, 56, 56, 56,196, 8,133,194,143,107,123,143,158, 19,202,164, 76,202,164, 76,242,100, 3, 83, 13,191, 59,188,
+108,217, 50, 41, 99,108,198,160, 65,131,240,229,151, 95, 14,110,222,188,249, 80,119,119,247, 6, 0,144,158,158,174,185,117,235,
+150,114,208,160, 65, 88,176, 96, 1,150, 47, 95,254, 53, 74,251,178,252,149, 50, 15, 28, 56,224, 49,101,202,148,236,165, 75,151,
+154,199,140, 25,211, 4,192,173,220,220,220,198,195,134, 13,155,204,231,243, 7,121,123,123, 7,102,100,100,228, 20, 23, 23,111,
+ 7,176, 30,181,156, 51,173,142,136, 11, 83,155,134,174, 56,193,133,169,210,143,223, 90,176, 96,193,144, 1, 3, 6, 24, 86,174,
+ 92,105, 84, 42,149,135,234, 24,247, 48, 39, 39,231,243,242, 59,246,246,246, 46, 55,110,220,248,216,201,201,137,155,152,152, 8,
+157, 78,135,132,132, 4, 51, 74, 79, 77, 85, 73,101,100,171,191,219,119, 42, 96,198,240, 80, 27,205,221,235,176,224,241, 80, 34,
+ 16, 34,243,210, 9,108,138,188,171, 84, 27,176,230,105,214, 83,161, 80,252,111,234,212,169,195,102,205,154, 37,246,246,246,230,
+252,254,251,239,216,189,123,183, 46, 59, 59,187, 15,128,115,127, 12,253, 84, 63,102,179, 25, 66,161, 16, 0, 48,103,206, 28,112,
+185, 92, 65,118,118,182,144,195,225,136, 56, 28,142, 37,135,195,225,149, 36,197,194,172, 44, 64, 86,129, 2, 15,179, 20, 53,230,
+153,204,230,221,151, 47, 95,158,222,170, 85, 43,238,213,171, 87,145,147,147,131,132,132, 4,102, 98,108,103,100,177,169,180, 83,
+162,174,238,203,103,105,239,208,191,165,157,136, 43,220,188, 0, 33,122, 46,239,123, 51, 6,162,116, 44, 45, 0,216,196,225,112,
+ 44, 0,228, 53,109,218,180,219,157, 59,119, 36, 77,155, 54, 45,190,123,247,238, 49, 14,135,227, 14, 96, 75, 85,153, 18,137, 36,
+ 23, 64,238,190,125,251, 0, 96, 60, 74, 55, 94,235,176,176,176,140,200,200, 72,132,135,135,103, 1, 88, 7, 0, 86,118, 14,239,
+ 6,202, 44, 56,194,159,194,209, 94, 7,238, 26, 51,171,178,213,213,202,201,185,123,115, 41, 23,130,141,159,225,117,151, 0,174,
+208,104,104,177,112,225,194, 72,149, 74,165,219,181,107,151,126,244,232,209,188,248,248,248, 43, 0,206, 3,216,135,178, 62,150,
+132, 16, 66, 94,168, 39, 91,176,106,237,163,245,100,213,250, 37,128,239,238,221,187, 87, 49,169,244,189,123,247,228, 0,190, 71,
+233,104,240,239,212,163,226,157, 95,214,162,181,254, 41, 87,230,201, 76,113,112,112,176,228,206,157, 59, 22,168,122, 18, 71,206,
+ 83,100,254, 73, 85,115, 29,250,251,251,175, 42, 41, 41,217,255,253,247,223,239,225,241,120,195,158,161,218,247,246,243,243, 43,
+216,177, 99,135, 57, 34, 34,130,205,159, 63,223,228,234,234, 90,128, 63,247,209,122, 44, 51, 68,200,219, 59,179,137,187,242,218,
+136, 78,236,254,180,119,217,249,225, 93,217, 4,119, 43,101,136,152,183,251, 25,191,149,248,201,100,178, 77, 18,137, 68,105, 99,
+ 99,115, 10, 64,135,103,121,143, 28, 28, 28,182,186,184,184,156,170,124,115,118,118,222,223,160, 65,131,111, 28, 29, 29,231,219,
+218,218, 78,244, 17, 11, 87, 78,107,236,166,141,233,223,148,157,238,216,128, 13,119, 20, 62,121,234,240,201,229,116,245,241,241,
+201,219,182,109,155,249,240,225,195,108,238,220,185,230,134, 13, 27, 42, 81, 67,191,182, 26, 91,180,108,121,187,247, 14,104,103,
+206,234,235,206,190,108, 98,109,238,102,199,171,238, 10,197,225,101, 5,240,168,218, 50,125,125,125,191,103,140,109, 94,188,120,
+241,102,252, 49, 23,232,155, 11, 23, 46, 12, 99,140,133, 45, 92,184, 48, 12, 64,111, 0, 8,145,113,183,109,239,215,198,148,254,
+182, 27,251,162,137,149, 41, 68,198,221, 86,101, 75,166, 61,255,192,193,113,125,205, 25,227, 58,178, 5,126, 82, 83, 59,123,209,
+175, 66,161,112, 26, 74, 91,156,219, 2, 16,210,183,102,202,164, 76,202,164, 22,173,127, 92,225, 85, 39, 46,246,246,246,155, 26,
+ 53,106,180,199,219,219,123,143,149,149,213,215, 40,237, 52, 95,223, 55,194,103,201,146, 37, 74,153, 76,214,242, 57,190,185, 78,
+ 0,220,241,231,137,115,159,219, 14,243,185, 43,166,196,207, 26,124,227,115, 87, 76,169,244,227,182, 77,154, 52,249, 2,165,163,
+121, 63,235, 78,232,109,111,111,191,214,222,222, 62,173,172,111,150,119, 93, 50,219,240,120,195,186,137,121,191,119, 16,114, 51,
+187,137,249, 23, 95,231,241, 62,120, 73, 15,192,154, 46,182,168, 46,211,195,209,209,113,165,189,189,125,186,163,163,227,218,122,
+ 22, 89,143,101,182,148,192,181,187, 45,239, 64, 7,107,142,186,187,140,183,175,141,101,245, 23,117,212, 99,221,131,195,195,195,
+ 63,100,140,125,232,230,230, 54,168, 82,225, 31,184, 96,193,130, 80,198, 88,104,249, 8,240,109, 45,225,212,213,150,183,163,163,
+ 13, 71,209,213,150,183,163,173, 37,156,170, 91,206,110,182,188,221, 29,109, 56,138, 16, 27,238, 14, 47, 17, 26,210,135, 57,101,
+ 82, 38,101, 82,161,245,106, 20, 90,180,195, 80, 38,101, 82, 38,101, 82, 38,101, 82, 38, 21, 90, 85, 23, 86,149,111, 21,103,216,
+248,180,109, 8, 33,132, 16, 66,158, 73,181, 3,150,114,106,168, 74,235,211,177,253,105, 42,219,211,148, 73,153,148, 73,153,148,
+ 73,153,148,249,175,203,172, 45,251,175,190,176,238,165, 70,205,170,148, 73,153,148, 73,153,148, 73,153,148,249,175,197,165, 77,
+ 64, 8, 33,132, 16,242, 76,130,203,254,125,114,224,210,170,251,104,241,219, 46,206, 50, 26,141, 78, 0,192,231,243,179, 75,174,
+204,119,173, 41, 93, 0,244, 48,150, 78,191, 3, 62, 48,222, 8,156,170, 34,243,148,209,104,180, 43,203, 44, 40,185, 50,191,119,
+141,153,109, 23,159,168,252,120,227,149,249,111, 62,249, 24, 6,240, 4,109, 23,167, 63,177,172,110,117,221, 42, 28, 60, 54, 38,
+214, 11, 91,206,151, 37,243,223, 76,240,198,226,172,146,146,210,253, 72, 32,224,103, 27, 46,215,188, 31, 89,188,177, 56,189,242,
+227, 75, 46,207,119,174, 41,211, 82, 34,202,243,117,111,240,117, 77,153,137,233,185, 51,212, 26,173, 67, 77,153,245, 61, 54, 61,
+ 93, 93,123,152,202,142, 77, 30, 48, 62, 45, 35,227,212, 63,108, 95,106, 3, 96, 62, 0,155, 74, 63,139, 1,240, 31,218, 43, 9,
+ 33, 47, 89,161, 21,141,210,121, 14,127, 40, 43,182,126,168,182,208, 50, 26,141, 78,242, 95,194,160,214, 1, 61, 70, 46,118,242,
+233,191,254, 79, 19, 37, 27,181, 5, 66,197,237, 93,129,188, 18,165, 93, 3,190,193, 38, 61, 61,157, 3, 0, 28, 14,231, 71, 0,
+ 94, 85,100,218,201,127, 9,131, 70, 15,132, 12, 93,104,231, 5,216,228, 88, 88,252, 87, 34,149,118, 43, 46, 46,110, 14, 0, 18,
+137,228,118,177, 90,125,166,129,193,176,226,201,199, 87,183,102,149,151,181,251,136,197, 78, 77,250,175,159,106, 50,155,133,143,
+174,126, 31,162,205,141,231, 11,140,186,117,159, 2,199,194,170, 40,170,170,201,251,227,117,223,159,235, 32, 0,186, 11,197,226,
+150,182,118,118,157,205,140, 53, 53,155,205, 28,147,209, 24,171, 44, 44, 60,111, 54, 26,111, 24,245,106, 7,249,161, 47,204, 53,
+ 45,231,147,235,242, 62,192,255, 5, 24, 36,181,178,234,198, 19, 8, 58, 0,128,169,164,228,119,181, 74,117,230, 61, 96,111, 93,
+214,189,174,219,231,105, 31,255,111, 83, 82, 98,116, 74, 58, 17, 6, 93, 9, 16, 60,240, 11,167,160, 97, 63,237, 0, 0,125,246,
+ 13,103, 85,252,161, 55, 0, 64,234, 27,122, 89,228, 18,156, 5, 0,252,148, 12,167,184,136,121,208,149, 0, 77, 67, 23, 58,213,
+150, 57,122,193,110,135, 89, 19, 6,136, 0,224,228,190,111, 26,255,182,255,187,183, 0,160,251,128, 73,199,122, 13,156, 18, 7,
+ 0,203,127,216,239,176,243,139,193, 53,102,214,237,216, 44,180, 40,140,143,240,211, 43, 51,108, 61,165,124,151,248,248,120, 46,
+ 0,184,185,185,213,233,216,244, 0,100, 25,192,100, 46,143,215,217,215,207, 47, 24, 0, 75,188,127, 63,218,100, 52, 94,112, 5,
+214, 61,231,125,105, 42, 99,143, 15,206,202,225,112,104,135, 36,132,188,108,142,148, 21, 87, 71,254,244,101,182,186,103,168,117,
+192,185, 4,160, 75,187, 32, 76, 24,246,182, 85,229,223,237, 93,191,208, 43,254,234,193, 38, 27,127, 90,193, 13, 10, 10, 66, 82,
+ 82, 82,157,150, 66,163, 7,206,198, 3, 80,220,177, 46,144, 74,239,175,252,234, 43,155, 55,223,124,147,239,230,230, 6, 14,135,
+131,204,204,204,118,167, 79,159,110, 51,125,250,244,143,160,184, 83,160,209,163,232,108,124,237,185,229,203,218,188,113, 67,204,
+159, 50, 88, 6, 0,159,142, 92,215,230,234,189, 44,251,251,247,239,247,152, 61,123,118, 30,239,204,153,239, 28,129,205, 89,192,
+195,186, 44,231,214,195,151,197,178,140,159,125,134, 79,153,178,207,207,207,207,202,219,219,155, 99,109,109, 13, 30,143,135,130,
+130, 2,175, 91,183,110,189,117,229,202, 21,245,233,115, 63, 10,175, 93,121, 55, 49, 91,252,134,182, 78,235, 94,156, 46, 62,105,
+109,125,123,196,123,239,121, 12, 30, 60, 88,236,235,235, 11, 0,184,127,255,190,255,222,189,123,135,238,219,183,111, 1,138,211,
+141, 26, 61,180,181,173,123, 69, 38, 0, 49,208,193,214,201,105, 56, 79, 32,104,110, 52, 26,221,203, 90, 27, 30,153, 74, 74,110,
+ 43,178,179,183, 63,249,120,242,103,186, 18,224, 78, 6,208,179,115, 48, 70, 12,232, 41, 5,128,217, 67,150,180, 75,121,144, 96,
+161,215,235,209, 56,160,105,199, 69, 95,124,125, 2, 92, 46,182,237, 63, 93,241,248,186,100,198,220, 73, 66,216,162,149, 72,191,
+185,183,157,169, 48,161, 91,145,178,144, 7, 0, 54, 50,217,128,189,187,126, 62,227, 22, 56,232, 82, 66,174,161, 78,153, 53, 29,
+155,199,119,173,117, 77,187,117,166,217,183, 39, 55, 9,188,188,188,112,243,230,205,250, 29,155,133,247,172,205,174,174,177, 43,
+ 62,249,196, 37, 36, 36, 4, 86, 86, 86,224,243,249, 48, 26,141, 61, 47, 92,184,208, 51, 44, 44,108, 18, 10,239,169,235,122,108,
+214,193, 10, 14,135,211,109,244,132,169,174,111,247, 27,132, 1,125, 58,210,142, 72, 8,121,217,148,183, 94, 85,190,242,240,135,
+ 26, 11, 45, 62,159,159,253,230,168,165, 78,157,223,104,129,171, 55,226, 10,147, 83, 51, 84,229,191,203,191,189,183,113,191,142,
+238,205, 34, 35,207, 65,167,211,225,247,223,127,199,141, 27, 55,240,224,193, 3, 76,156, 56, 81, 87,118,234,176,170,204,130,144,
+161, 11,237, 80, 24,111,229, 47,188,247,218,233,187,119,121, 90,173, 22,145,145,145, 40, 40, 40,128, 80, 40,132,135,135, 7,122,
+245,234,197,191,123,247,174,125,143, 55,251,200, 66,250,124,144, 4,153,191,138,207,231, 23, 84, 55,143, 8,159,207,207,238, 49,
+114,177, 83, 51,255,134,184,159,156, 94, 56,255,139,141, 42,179,153,241, 19, 31,164, 24,206,157, 59,135,224,224, 96,156, 58,117,
+202, 33, 63, 63,255,179,117,235,214,205, 23, 44,251,118,117,137, 62,111, 38,170,207, 43, 8, 25,186,208,206, 33,123,143,247,111,
+199, 15, 88,220,190,125,219,226,251,239,191, 71, 94, 94, 30,132, 66, 33,108,109,109,225,226,226,130,198,141, 27,115, 62,253,244,
+ 83,171,208,208,219,248,191,241,131,188, 13, 62,227,238, 85,183,156, 21,235,174, 74,177,116, 84,158,244,221,127,228, 8,183, 83,
+167, 78,143,125,109,111,212,168, 17,122,247,238, 45, 30, 62,124,184,239,224,161,195,204, 33,125, 71,223,135,149,183,166,214, 76,
+245, 67,137,131, 38,202,173,231,208,161,135, 22, 46, 92,104,235,226,226, 2,169, 84, 10, 0, 40, 44, 44,244, 72, 78, 78,110,183,
+ 96,193,130,129,151, 99,118,241, 67, 66, 31,166, 67,234, 89, 92,211,246,252,183, 18, 8,248,217,229,173, 72,214, 82, 73,193,195,
+180, 44, 53, 0,232,245,122,232,245,122,232,116, 58,124, 60,105, 34,111,252,192,182,126,222,157,167, 94,127,240, 40, 43,191,233,
+233, 75,246,229,207, 45,169, 37,147,175,121,160, 80,164,254, 58, 62,236,147, 79, 92,156,157,255, 56, 35,184,109,235, 86, 94,126,
+126,126,207,176,176,176,102,204,178,171,162,105,232, 66,219,154, 50,107, 58, 54, 21,113, 71, 94, 91, 52,165,119,203,245, 95, 68,
+192,100, 50, 33, 42, 42, 10,145,145,145,248,250,235,175,217,177, 99,199, 10,109,164,210,241,168,241,216,188,103,221,201, 53,211,
+103,217,178,125, 28,145, 72,132,131, 7, 15,226,238,221,187,224,114,185, 8, 10, 10,194,136, 17, 35,208,179,103, 79,151, 9, 19,
+ 38,178,144, 62, 67, 18, 33, 11, 40,122,198,125,137, 11, 96,234,220,176,101,174, 35,199, 77,198,242, 69,159, 82,161, 69, 8,121,
+153, 91,179,170, 29,226, 1, 17, 17, 17,172,236,214, 5, 0, 24,192,109,212,127,253,206, 61,215,204, 71, 26,245, 95,191,147, 1,
+ 92, 6,112,109,128,134,173, 90,181, 42, 81, 40, 20,236,202,149, 43,236,227,143, 63, 86,175, 94,189,250,204,145, 35, 71,246, 26,
+ 13,134, 13,110,174,174,255, 99,213,116,176,103, 0,215, 27,144, 89, 90, 90,230,164,166,166,178,163, 71,143,178,240,240,112,182,
+125,251,118,118,236,216, 49,118,250,244,105,118,236,216, 49,182,115,231, 78, 22, 19, 19,195,226,226,226,152, 84, 42,205,241, 6,
+100, 53,100,242, 24,192,107,220,255,251,153,251,174,150, 44, 12,232,191,126, 58, 3,120,118, 64,147, 86,173, 90,153,246,238,221,
+203,182,109,219,198,126,250,233, 39, 22, 19, 19,195,114,115,115, 25, 95, 36,205, 41,127, 94,117,203,201, 0,174,187,187,123,142,
+ 66,161, 96,158,158,158, 76, 40, 20, 50,103,103,103,214,184,113, 99,214,174, 93, 59,246,214, 91,111,177, 97,195,134,177,207, 62,
+251,140, 41, 20, 10, 38, 22,139,179,202,159, 87, 93,102, 48, 32,145, 74,165,169,114,185,156, 85,167,184,184,152,229,230,230,178,
+ 19, 39, 78, 48,169, 84,154, 26, 12, 72,106,202,148, 0,173, 3, 3, 3,115,114,115,115,153,193, 96, 96,169,169,169,236,214,173,
+ 91,236,238,221,187, 44, 53, 53,149, 21, 23, 23, 87,100,199,197,197, 49, 31, 31,159, 28, 9,208,154,209, 69, 16,213,238, 75, 79,
+222,188,156,157,223,114,113,113, 41,222,183,111, 31,123,244,232, 17,219,178,101, 11,227, 2, 75,158,124, 92, 77,153, 66,160, 87,
+167, 78,157, 76, 81, 81, 81,236,250,245,235,108,206,156, 57,172,119,239,222,172, 79,159, 62, 44, 44, 44,140,165,165,165,177,180,
+180, 52,246,214, 91,111,153,132, 64,175,218,246,207,170,142, 77, 25,224, 21, 26, 26, 90,108, 48, 24, 88, 98, 98, 34,107,222,188,
+121, 26, 15, 24, 46, 5,154,117, 1, 68,181,237,159,238,128,157,171,171,107, 70, 84, 84, 20,219,191,127, 63,243,246,246,206,225,
+ 1,163,109,128, 70, 54, 64, 35, 30, 48,186, 81,163, 70, 57, 81, 81, 81, 44, 47, 47,143,121,121,121,101,184, 3,118,207,176, 47,
+113, 1,108,154, 27,182,140,221, 75, 83,179,185, 97,203, 24,128, 84,198, 24, 67, 21,125, 60, 9, 33,175,190, 39,107,145, 87, 69,
+197,135,100,104,104, 40, 7,192,217,154, 30, 92,204,227, 45, 93,190,124, 57, 95,171,213, 98,227,198,141, 69,239, 15, 28,184,167,
+ 75,231,206,137,175,121,123, 43, 56, 92,110,173,179, 13,231,136, 68,211,150, 47, 95,110,171,215,235,113,237,218, 53,180,105,211,
+ 6, 46, 46, 46,176,178,178,130,149,149, 21,156,156,156, 16, 16, 16,128,236,236,108, 88, 91, 91, 99,214,172, 89,178, 28,145,104,
+ 90,109,185,102, 51,227, 3,128,201,108, 22, 90, 0, 19,124, 94,127,253,218,130, 5, 11,184, 14, 14, 14,176,183,183,135,149,149,
+ 21,238,222,189, 11,189, 94, 15, 75,137,101,157, 6,105,229,114,185, 92, 43, 43, 43,252,246,219,111,152, 58,117, 42, 58,116,232,
+ 0, 91, 91, 91, 88, 91, 91,163,121,243,230,232,213,171, 23,198,143, 31,143,196,196, 68,112,234,208,169, 36,150,207,159, 60,126,
+252,120,167,224,224,224, 42,127,175,213,106,161, 80, 40,144,147,147, 3, 15, 15, 15, 12, 26, 52,200, 41,150,207,159, 92, 93,158,
+ 3,224,226,225,239,127,232,202,149, 43,142, 82,169, 20,219,182,109,195,129, 3, 7,112,252,248,113, 28, 61,122, 20, 17, 17, 17,
+ 56,120,240, 32,114,114,114, 0, 0,254,254,254,216,189,123,183,163,149,147, 83,132, 3,224, 66,135,116,221,164,100,101,157,108,
+158,153,233, 56,124,216,176,243, 42,149, 10,195,135, 15,199,210, 47,191,252, 84, 0, 76,175,203,243, 3, 0,153,189,171,235,230,
+101,203,150,113, 51, 51, 51,241,222,123,239,229,174,248,242,203,177,209, 39, 78,248,202,143, 31,247, 93,186,112,225,216, 46, 93,
+186,228,166,165,165, 97,235,214,173, 92,103, 47,175,205, 1,128,172,190,203, 89, 4, 76, 93,181,106,149, 88,171,213,226,205, 55,
+223, 76, 52,223,190, 29, 96, 4,126, 86, 1,119,207, 2,134,218,158,159, 1, 76,158, 53,107,150,139, 72, 36,194,127,255,251,223,
+ 92, 77, 74, 74, 11, 35,240, 83, 33,144, 92, 8, 36, 27,129,159,138,146,146, 90,140, 28, 57, 50, 87, 36, 18, 97,229,202,149, 46,
+ 25,127, 76,186, 93, 87,109, 0, 28, 2,112, 14, 64,250,232, 9, 83, 71, 7,183,109,143,173, 27,214,225,139,133,179, 55, 3,120,
+159,195,225,108, 7, 48,147,246, 60, 66,254,157,234, 82,139,252, 67, 85, 59,229, 14,191,114, 37, 9,160,107, 77, 41,118, 14, 14,
+109, 90,180,104,129,200,200, 72, 4, 6, 6, 94,177,181,181, 53, 90,136, 68, 16, 8, 4, 96,230, 90,235, 44, 72,164,210, 30, 61,
+123,246,228, 95,186,116, 9, 62, 62, 62,144, 72, 36, 16, 8, 4,143,221, 44, 44, 44,224,234,234, 10,165, 82,137, 30, 61,122, 8,
+214,172, 89,211, 3, 58,221,162, 90,255, 32,198,223,178,202,185,180,108,216,143, 91, 54, 55, 10, 9, 9, 65, 97,161, 18,102,179,
+ 25,150,150,150,208,235,245,224,243,249,165,167,128, 74,152,178, 46, 91,204,100, 50,153,120, 60, 30,124,124,124,176,116,233, 82,
+104,181, 90, 88, 88, 88, 0, 0,148, 74, 37, 20, 10, 5,110,221,186,133,228,228,100,148,125, 11,175,145,181, 76,246,246,224,193,
+131,171,156,240, 87,167,211,161,176,176, 16,133,133,133, 80, 40, 20,208,106,181,104,223,190,189,240, 72, 68,196,219,200,203, 91,
+ 81,229,115,196,226,129, 91,183,110,117, 18, 10,133, 40, 46, 46, 70, 81, 81, 17, 30, 62,124,136,148,148, 20,109,118,118,182,209,
+218,218,154,235,237,237,205, 21,137, 68,162,254,253,251,115,148, 74, 37, 56, 28, 14, 66, 67, 67, 29,118,108,219, 54, 24,122,253,
+215,116, 72,215,205, 73, 64,215, 90,175,127,231,141,182,109,127,187,114,245,106,240,180,105,211, 16, 19, 19,179,204,114,215,174,
+115, 26,224, 70, 77,207, 77, 4, 38,255,175, 82, 1,195, 82, 82, 2, 13, 64, 78,165,135, 36,123, 39, 37, 29, 31, 57,114,228,205,
+152,152, 24,199,149, 43, 87,186,188,255,222,123,147, 1, 44,169,207, 50, 90,203,100,175,187,186,186,226,216,177, 99, 72,125,240,
+ 96,182, 17, 40,174,215, 55, 46, 30,175, 83, 72, 72, 8, 14, 30, 60,136,180,148,148,217,198,199,151,177,244,139, 18,144,195, 79,
+ 76,156,189,121,243,230, 77, 99,198,140, 1,143,207,239, 4, 99,189, 78, 28,254,169,227,251,152,137,211,176,249,135, 53,155, 1,
+140, 3, 96, 6,112,133,246, 56, 66,254,221,173, 90,181,213, 34, 47, 81,177,245, 67,189, 91,180,156,156,156,220,173,172,172,144,
+158,158,142,166, 77,154,100,139, 68, 34, 8, 5, 2,136,133,194, 58, 45,129, 70,163, 9,116,115,115, 67, 97, 97, 33, 28, 29, 29,
+ 97, 97, 97, 81,113, 19, 10,133, 21,255,183,182,182, 6,151,203,133,151,151, 23, 52, 26, 77, 96,173,185, 89,183,156,118,173,153,
+244,113,212,185, 99,141,222,123,111, 0,236,236,236,225,233,233, 1, 39, 39, 39, 72, 36, 18,120,122,122,194,215,215,151,173, 88,
+177, 2,150, 78, 65,117,250, 32,175, 92, 60,241,249,124,152, 76, 38,100,101,101,225,222,189,123,136,137,137, 65, 84, 84, 20,174,
+ 95,191,142,162,162, 34,212,161,206,130,166,184,184, 37,159,207,175,178,200, 82, 40, 20, 80, 40, 20, 21,133, 86, 78, 78, 14,146,
+147,147,161, 82,171, 91,213, 80,244, 14,104,209,162, 5, 15, 0, 36, 18, 9, 90,181,106,133,245,235,215, 27, 15, 31, 56, 48,164,
+ 89, 84,148,189,231,137, 19,182, 63,126,255,253,144, 65,131, 6,153, 46, 93,186, 4,165, 82,137, 59,119,238,160, 65,131, 6,124,
+161, 88, 60,152, 14,231,250,145, 3,106,199,162,162, 62, 29, 58,116, 72, 42, 44, 44,196, 87, 95,125,197, 21, 88, 91,255,176,176,
+154, 83,124, 21,120,188,142, 33, 33, 33, 56,116,232, 16,210, 83, 82,230,164, 84, 81,192,164, 0, 57,169,137,137,115, 54,111,222,
+140, 94,189,122,129,195,231,215,187,163, 82,187,118,237, 90,152,205,102,220,188,121, 19,182,192,229,250, 62,223,215,207, 47,184,
+188,229, 87, 10,156,175,238,113, 82,224,124,116,116, 52, 36, 18, 9,154, 54,107,214,186,158, 47,179,130,195,225,100,140,153, 56,
+ 13,251,143, 95, 4, 0,108,254, 97, 77, 86,165, 34,139, 16, 66, 45, 90, 47,107,139, 86,121, 97, 85,249,134,199, 10,173, 58, 22,
+ 31, 0, 0,129, 64, 0,161, 72, 4,161, 80, 88, 90, 32,137, 68,117,206,224,112, 56, 16,139,197, 21,133, 85,229, 2,171,242,255,
+ 45, 45, 45,235, 84,192, 0, 64, 65,194,241,206,227,198,142, 17,138, 68, 34,232,245, 58, 48,198, 32, 18,137, 97,107,107, 11, 31,
+ 31, 31, 40,149, 74,116,232,216, 69,247, 80, 97, 17,225,208,180,127,204,211,108, 61,163,209, 8,181, 90,141,130,130, 2,228,231,
+231, 67,169, 84,162,184,184,184,206,151,162,155,205,102,222,195,135, 15,241,243,207, 63, 35, 47, 47, 15, 64,105, 71,235,242,226,
+170,252,223,164,164, 36,108,219,182, 13, 15, 30, 60,168,215,251,211,185,115,103, 68, 68, 68,240,186,246,232,177,225,148,183,119,
+250, 41,111,239,244,174, 61,122,108, 56,116,232, 16,207,221,221, 29,201,201,201,184,118,237, 26, 10, 10, 10,192, 24,163,235,231,
+159,194,125,160, 64,147,159, 63,230,211, 79, 63,101, 86, 86, 86,248,234,127,255,107,185, 4,248,160,174, 5,140,172,134, 2, 70,
+246,108, 5, 12, 24, 99, 48,155,205, 48,153, 76, 79,181,110, 28, 14,135, 35, 16, 8,234, 59,180, 66,125, 30, 92,209,241,125,214,
+103, 75,113,244,224,222,242,159,199, 83,145, 69, 8,121, 5, 84,219, 17,158, 95,169,130,172,248,183, 58, 89, 89, 89,143,212,106,
+117, 35,111,111,111,164,165,165, 57,121,121,121,165, 8, 5, 2, 88, 8,133,224,112,107,175, 9, 44, 45, 45,111,166,167,167,119,
+116,119,119,135,209,104,172, 40,170,158, 60,117, 88,222, 74,115,253,250,117, 88, 90, 90,222,132,182,198,145, 19, 96,210, 23, 52,
+108,221,186,117, 69,203,144,173,173, 45,108,109,101, 16,137,196,152, 55,111,158,121,229,138, 21,235,188,186, 47, 44,252,112,250,
+167,236,211, 37, 27,158,235,150,173,235, 31, 38, 75, 75,203,155,158,158,158,237,101, 50, 25,246,239,223,143,228,228,100, 20, 20,
+ 20, 64,163,209, 64,167,211, 65,163,209, 64,175,215, 67, 44, 22,163, 89,179,102,176,177,177,193,233,211,167,111, 66,167,171,186,
+184,204,203,219,127,243,230,205,246,109,219,182,173,104, 81,233,214,173, 27,167, 91,183,110,142, 21,173,104, 26, 13,114,115,115,
+113,229,202, 21,156, 62,125, 26, 28, 14, 7,241,241,241, 38, 93,113,241, 78, 58, 38,158,142, 22,248,157,183,121,243,166,143, 62,
+250,104,108,199,142, 29, 97, 2,222, 2,176,237,111, 44, 96, 0, 0, 81, 81, 81,183, 76, 38, 83,199,198,141, 27, 67, 1,188, 1,
+224, 96,189,138,200,132,132,104,163,209,216,163,101,203,150,216,191,103, 79,103, 0,201, 85, 61, 78, 13,116, 14, 14, 14, 70,113,
+113, 49,238,196,198,202,235, 81,100,109,152, 27,182,108,244,200,113,147,177,117,195, 58,108,254, 97,205,195, 77,235, 87,123,162,
+ 14,253,199, 8, 33,255,170,214,172, 90,107,145,127,168, 9,213, 21, 95,252,250,164, 20, 22, 20,200,163,163,163, 27,181,110,221,
+ 26, 27, 54,108,104,219,161,125,251, 71, 22, 66,161, 81,104, 97, 1,110, 29,254,144, 20,171,213,191,254,250,235,175,111,244,239,
+223,159,127,233,210, 37,184,184,184, 84, 20, 90,229,255,242,249,124, 48,198, 96,105,105,137, 95,126,249,197, 80,172, 86,255, 90,
+107,107,145,201,108,226,150, 21,122,140, 49, 40, 20, 10, 88, 88, 88,224,235,175, 87, 98,237,138, 21,195, 76,192, 94,127,105,131,
+ 79, 0,136,255,182, 63,208, 26,205,111, 71,143, 30,109,179, 96,193, 2,129,135,135, 7, 20, 10, 5, 10, 10, 10,144,151,151, 7,
+165, 82, 9,165, 82,137,130,130, 2, 40, 20, 10,136,197, 98,196,196,196,148,104, 53,154,223,170,203, 19,105,181,251, 70,141, 26,
+ 53, 43, 58, 58,218,149,207,231,163,164,164, 4,102,179, 25,102,179, 25, 6,131, 1, 9, 9, 9,184,125,251, 54,238,222,189,139,
+252,252,124, 8, 4, 2,240,120, 60, 92,191,126,189, 64, 90, 82,178, 71, 79,199,244, 83, 19, 0,251, 47, 92,184, 48,118,196,136,
+ 17,112,243,240,232,130,180,180, 58, 21, 48, 7,106, 40, 96, 10,159,174,128,249,163, 0, 42, 42,186,154,148,148,212,177,107,215,
+174,112,245,240, 88,214, 44, 45,237, 84,108, 61,250,105,153,140,198,243, 23, 46, 92,232, 49,114,228, 72,108,216,176, 97, 89,131,
+164,164,227, 57, 79,156,230,108, 0, 52,120,205,215,119,217,232,209,163,113,242,228, 73,152,140,198,243, 53, 68, 86, 30,241,189,
+225,232, 9, 83, 61,159,232,248,190,158,195,225, 76, 1,240, 21,237, 81,132,144, 87,185, 69,171, 94,167, 14, 37, 38,211,220,153,
+ 51,103,150,112,185, 92, 12, 24, 48,192,250,224,161, 67,131,174,223,184,225,147,157,157,109,107, 50,153,106,205,106,160,211,173,
+158, 57,115,166, 66,175,215, 35, 32, 32, 0,249,249,249, 48,153, 76,224,243,249,224,243,249,224,112, 56,224,114,185,176,178,178,
+ 66,116,116, 52, 54,109,218,164,108,160,211,173,174,245,143,132,201,116,115,219,182,109,224,241,120, 76, 44, 22,131,195,225,128,
+207,231, 99,229,202,149,217,107,129,253, 0,192,227,114,245, 0,192,229,114,234,218,123,183,214,243,150, 66,161, 16,230,210,139,
+ 0,106,125,172,157, 78,183,106,249,242,229, 69,119,238,220,129, 90,173,174,104,125, 83,169, 84, 21,157,235, 21, 10, 5, 56, 28,
+ 14,212,106, 53, 14, 29, 58, 84,100,167,211,173,170, 46, 47, 15,200, 76,139,143,127,183,109,219,182,121, 73, 73, 73, 40, 44, 44,
+196,205,155, 55,113,250,244,105,236,222,189, 27, 39, 79,158, 68, 66, 66, 2,140, 70, 35,220,221,221,193, 24,195,129, 3, 7, 10,
+141, 69, 69,111,229, 1,153,116, 76, 84,175,161,139, 75, 15,103, 39,167,212, 6,142,142,105, 13, 93, 92,122, 60,249,123, 25, 16,
+ 23, 23, 23, 7,163,209, 8, 31, 31, 31,251,154,250,105, 49,163,241,194,133, 11, 23, 48,114,228, 72,120, 54,106,244,165, 55,208,
+224,201,199,120, 3, 13,188,125,125,191, 44, 47, 96,152,209,120,161,190,203,108, 13,172,249,228,147, 79,138, 45, 44, 44,176,107,
+215, 46,159, 18, 63,191,187,124,224, 3, 43,160, 73, 87,192,162,182,231,187, 2,235, 62,251,236,179, 76, 14,135,131,237,219,183,
+ 59,202,124,125,111,241,129, 81, 50,160,161, 12,104,200, 7, 70,201,124,125,111,237,218,181,203,209,104, 52, 98,250,244,233,153,
+174,192,186, 26, 34,167, 50,198,222, 97,140,133, 48,198, 60, 55,173, 95,141,163, 7,247,150, 23, 89,227, 80,218,233,125, 4,128,
+ 91,180,199, 17, 66, 94,101, 85, 54, 67,241,219, 46,206, 2,152, 83,151,118, 65,184,122,227, 94,161,163,157,205,137,242,223,229,
+223,222,219,184,123,160, 77,208,183,223,126, 11,129, 64,128,135, 15, 31, 34, 54, 54, 22, 54, 54, 54, 24, 54,108,152,174,184,168,
+232,221, 74,115, 29,246, 4,112,186, 44,179,116, 62,181,194,120, 43, 95,126, 76,163,227, 71, 35,120, 50,153, 12, 42,149, 10, 92,
+ 46, 23, 98,177, 24,150,150,150,144, 72, 36,184,118,237, 26,250,190,211,207,148, 99, 25,242,199,128,165,127,204,167, 86,145, 89,
+ 62,214,208, 27,128,101, 52,240, 95, 39, 55,183,153,243,231,207,151,244,238,221, 27, 22, 22, 22,240,104,232,159,233,211,231,171,
+ 53, 92, 46,199,152,150,167,156,231,219,208, 77, 22, 27,159, 12,128,147, 93,114,101,190, 91,165,185, 14,255,180,156, 94,250,115,
+ 62,191,252,180,194,166, 85,171,210,254,232, 10,133, 2, 89, 89, 89,200,206,206,134, 66,161,128, 90,173, 6, 0, 68, 68, 68,224,
+104,228, 93,101,177,199,160,196,234,150,243,143,117,191,103,237,102,184,252,218,142,109, 63,241, 26, 52,104,128,172,172, 44,228,
+228,228, 64,161, 80,160,184,184, 24, 38,147, 9,249,249,249,216,184,249, 39, 83,158, 85,200,131,138, 1, 33,107,202, 84, 63,148,
+216,171, 46,186, 7, 55,243,102, 99,199,142,181,182,177,177,129,217,108, 70, 65, 65, 1, 82, 83, 83,145,148,148,132,200,200, 72,
+117,182, 66, 15,181,227,155,105, 21, 3,150, 86,145,249, 28,189,116,153,149,199,173,114,115,117, 77, 79, 73, 73,113, 50,153, 76,
+112,119,119, 55, 42,242,243,191, 20, 2, 39,173,129, 12, 0, 44, 23,152,191,106,205,154, 49,253,250,245,195,235,175,191,254, 48,
+ 51, 43,235,181,170,246, 37, 6,240, 2, 0,153,198,195,227,246,149, 43, 87, 92, 82, 83, 83, 49,114,228,200,220,148,251,247,231,
+148,247,215, 42, 4, 58,123,251,250,126,185,107,215, 46,199, 70,141, 26, 33, 48, 48, 48, 83,156,154,218,252, 30, 80, 88,205,254,
+ 89,237,177,169,136, 59,242,218,164,247, 90,188,254,241,199, 31,195,104, 52, 34, 50, 50, 18,151, 47, 95, 70, 74, 74, 10, 46, 94,
+188,168,176,145, 74,135, 84,154,235,176,202,253,243, 45,127,181,207,246,237,219, 56, 22, 22, 22,216,188,121, 51,162,163,163, 1,
+ 0,193,193,193, 24, 61,122, 52,140, 70, 35,134, 15, 31,193,142,220,147, 36,214,180,127, 2,104, 1,224,127, 40, 45,242, 94,103,
+140,137, 57, 28, 78, 58, 0, 79,212,175, 79, 22,237,159,148, 73,153,255,158,204, 87, 82,173,115, 29, 46,254, 14,178,199,167,249,
+ 24,159,190,119,253, 66,126,167,206, 33, 77, 22,134,135,113,219,182,109, 11, 79, 79, 79, 4, 7, 7, 35, 53, 53, 85,100,107,107,
+ 91,219,124,106,170,144, 62, 31, 36, 5, 5, 5,217,206,153, 51, 71,214,171, 87, 47,129,167,167, 39, 24, 99,136,142,142,198,254,
+253,251, 13, 27, 54,108, 80,106,156,223, 81,200,207,252,172,170,203,124,106,151, 1, 13,128,207, 61,210,211,127,152, 60,105, 82,
+ 88,171,214,173,199,134,135,135,115,173, 44, 37,130,165,243,198,137, 1, 96,241, 55,187,101,253, 6, 13,195, 42, 63,160,203, 7,
+ 85,207, 35, 87,121, 57, 83,211,198,167,188,253, 94, 15,191,255, 78, 25, 99, 26, 60,120,176,212,198,198, 6,158,158,158,176,179,
+179, 67, 98, 98, 34,210,210,210,216,225,195,135, 85, 81,215,227, 4, 7, 78, 94, 77, 17,203, 92,235, 50, 47, 97, 81, 72,239,247,
+ 31,188,253,246,219,118,163, 70,141,178,110,211,166,141, 64, 36, 18, 65, 36, 18, 33, 43, 43, 11, 9, 9, 9,134,195,135, 15,171,
+ 52, 78,111, 21,200,207,236, 42,170,227, 92,135,197, 33, 67, 23, 38,156, 63, 21, 62,253,246,205,155, 35,204, 64, 75,131,193,224,
+110, 50,153, 56, 92, 46, 55,195,108, 54,223, 52, 20, 21,109,210, 5,135,175,164,185, 14,235,198,100, 50, 89,152, 76, 38, 40, 20,
+ 10,156, 58,117,138,127,255,254,253,249, 55,110,220,152,159,158,158,142,146,146, 18, 12, 28, 56, 16,193,193,193, 56,115,230, 12,
+114,178,178, 14,215,148,117, 15, 40, 20,165,165,141, 30, 63,126,252,177,109,219,182,113,111,220,184,225,184,121,243,230,141, 85,
+ 21, 48, 35, 70,140, 48,103,165,166,142,214, 1,133, 53,236,159, 53, 29,155,185,199,119,173,189,209,127,192,160,102,225, 11,230,
+ 11, 58,116,232, 0, 71, 71, 71,116,238,220, 25, 6,131,193,182,105,211,166,181, 29,155, 69, 33,125,134, 36,182,108,217, 82,186,
+114,229, 74,151, 49, 99,198, 96,202,148, 41, 0,128,226,226, 98,156, 60,121, 18,211,167, 79,207, 76,229,191,161,174,109,255, 44,
+107,169, 42, 47,192,206, 1, 8, 1,144, 8,234,248, 78, 8,121, 53,149, 79, 42,237,138,210,137,165,143,160,244,203,121,237,115,
+ 29,158,191,124, 11,149,167,249, 40,229, 26,107,244, 26,117,127,226,204, 47, 3,121, 37, 74, 59, 1, 71,107, 19, 31, 23,199,169,
+109,206,195,138,249,212,100,254, 42,135,164,157,109,151, 46, 94, 60,109,213,170, 85, 61,202,135,112,176,180,180,188, 89,172, 86,
+255,218, 64,167, 91,173,145,249,255, 90,223,185,249,210,128, 44, 0,147,236,228,242, 53,161,253, 6, 46, 23,219,251, 8, 62, 93,
+178, 65,203,227,114,245, 9,233, 57, 88,229, 7, 72,235,112,129,164, 70, 15,220, 86,184, 26,179, 28, 6,221,251,236,147, 79,254,
+187,248,243,207,219, 90, 89, 89,117, 49, 24,141,254,102,179, 25, 48,155,227, 53,106,245, 57,102, 48, 92,209, 5, 47, 88, 33,150,
+185,178, 58,207, 75,104,219,180,200,254,193,222,182, 91, 54,109,154,186,103,207,158, 63,173,187,131, 78,183, 70, 99,219,244,116,
+ 93,214,189,242, 99,180,192,239,200,206,254,189,166,166, 75,154,235,176,142,223, 62,204,230, 9,118,118,118, 91,123,244,232, 33,
+238,217,179, 39,250,246,237,139, 14, 29, 58,192,108, 54,131, 49,134,162,162, 34,236,222,189, 27,203,151, 47,143,127, 13,248,188,
+182, 60, 29,240,171,232,232,209,183, 90,182,108,185,185,166, 2,166,172,200,170,181, 79, 98,205,199,166, 40,222, 40,123, 55,121,
+232,228,165,126,122,101,134,173,131,165,209,229,246,173,155,220,186, 31,155, 1, 69,166,232,221,111, 12,124,239,189,201, 60, 62,
+191,115,217, 21,144,236, 78,108,172,188,124, 82,105, 4,143, 62, 85,207,125,169,124,236, 58,234,248, 78, 8,121,213, 11,173,190,
+ 40,237,175, 85, 49, 37, 79,181,115, 29,150,183,250,240,249,252,236,196, 3, 19,135,213,148, 46, 0,122,148,181,100,161,214,185,
+ 14,203,254,159, 12, 20, 65,167, 91,244,216, 96,164,149,174, 46, 20, 60,241,248,250, 12,139, 88, 0,220,131, 81, 23,138,236, 88,
+224,208,164,210,188,182,139,103, 87, 94,167,106,255,200, 62,246,186, 22,249, 90,224, 60, 84,170,243, 80,169,170,236,180, 43,224,
+ 91,228,215,182,156, 79,174,123, 42,160,124,214,117,127, 50,179,214,226,225, 25,182,231,191,205,163,220,220, 3, 0,172, 60, 34,
+ 34,156,143, 71, 68, 12,254,239,140, 25, 3, 93,221,220,124, 29, 29, 29,237,172,173,173,185,151, 46, 93, 74, 50,106,181,107, 90,
+ 1, 91,202, 90, 83,107,165, 3,126, 13, 72, 77,109,254,254,123,239, 77,230,240,249,157, 42, 23, 48,204,104,188,232, 3,172,171,
+169, 37,235,105,143, 77, 79,145,107,143,178,150, 44,240,128,241,117,217, 55,210, 74,151, 99, 9,140,198, 37,136,137,169, 98,159,
+175,247,190,180,152,195,225, 20,129, 58,190, 19, 66, 94, 93,229,243, 29, 30,249,171, 95,184, 39,101, 82,230, 43,148,201, 67,233,
+ 85,116,180, 61, 41,147, 50, 41,147, 50, 73,157,240,105, 19, 16, 82,103, 38,252,113, 26,140, 16, 66, 8, 41, 87,222, 55,171,178,
+ 31,128,210,174, 59,213, 85,165,245,185,154,224,105, 42,219,211,148, 73,153,148, 73,153,148,249,183,100, 90,226,207,167,189,105,
+123, 82,230, 95,149, 89, 91,246,203,120, 53, 99,121,159,172,138,190, 89,127, 21,106, 86,165, 76,202,164, 76,202,164, 76,202,164,
+204, 87,157,107, 89,145, 85,249, 6,160,158, 3,150, 18, 66,200,171, 42, 60, 28, 92,198,192, 97, 44,156,203,216, 30, 30, 99,131,
+120,140,225,153,166, 2, 25, 52,168,234,193,108,255,111,152,157, 53,109,113, 66, 94, 41, 25,168,102, 82,105,234,163,245,247,242,
+114,113,113, 89, 15,128,147,153,153, 57, 1, 64, 42,109,146,127, 30,123,123,251, 30, 70,163, 17, 74,165,242,215, 87,113,253,154,
+249,226, 61,198, 69,211,255,103,239,187,227,154,186,254,247,159,123,115,179, 19,194, 76,216, 40, 34, 32, 32,184,112,212,189,112,
+129,179,106,181,182,218,186, 91, 91, 71,173,173,181,117,213, 85,107,171,118, 56, 91,181,138,173, 11, 71,113, 15, 20,247,194,193,
+ 6,145,165,140,132,149,132,236,117,127,127, 8,124,208, 50,130, 31,251,249,214,254,242,188, 94,121, 17,146,123,159,156,115,239,
+185,231, 60,231,125,222,231,253,174,249,128, 70, 94, 74, 38,118,215,117,108,176, 63,222, 5,241,159, 88, 92,132, 5, 41,201,143,
+112,184, 9, 63, 71, 14,238,239,253, 51, 0,156, 60,151,255, 33,254,158,184, 90,129, 98,177,248, 52, 69, 81,148,217,108,158, 41,
+149, 74, 99,235, 23, 66,163, 25, 0,192,164,227, 22, 86, 20, 73, 62,159, 51,131, 96,170,117, 59, 42,116, 26,149,156,193,100,100,
+115,152,110, 87,166,191, 79,158, 44,148, 27, 2,109, 0, 0, 32, 0, 73, 68, 65, 84,175,124, 35,185,174,243, 15, 30, 60, 88,111,
+ 22,239,214,254, 24, 76,154, 67,134,182, 15,125,156,181,110, 99,167, 13,189,252, 92,152,143,243,239, 9,191,217, 34,223,202,118,
+104, 54,244,221,177, 68, 44,197, 39,222,217,177,163,180,242,223,250,236,172, 2, 72, 35,147,217,138,176, 88,252, 64, 16,124, 2,
+ 0,109,177, 88, 8,146,124,204, 53,153,210,231, 3,149, 47,193,233,100, 0,194,152, 28,142,183,217,100,114, 37, 0,154, 65, 81,
+197, 70,157, 46,159, 5, 60, 88, 8, 84,252,219, 57, 89, 28,142,151,217,100,114, 5,128,127, 98, 57,109,120, 30,245, 10, 45,161,
+ 80,120,135, 36, 73,175,218,201,112,171,243, 9, 86,127, 86,251, 59,130, 32, 96, 54,155,159,148,151,151,135, 55,225,247, 69, 0,
+198, 2,168,222,162,190, 23,192,126,188,188,195,177,136,197, 98,205, 23, 8, 4,125, 53, 26, 77,107, 0,224,241,120, 73, 42,149,
+234,130,193, 96, 88,247,146,188, 20,128, 49, 66,161,176, 15, 73,146,125,104,154, 38,104,154,142,171,172,172,188, 0,224, 0,128,
+151,137,148,192,147, 72, 36, 43,157,156,156,198, 47, 92,184,176,212,217,217,185,213,220,185,115,111,151,149,149,253, 94, 82, 82,
+178, 8, 77,200, 81,247, 55,163,165,155,155,219, 94, 38,147,201,200,207,207,239, 3, 0,222,222,222,113,122,189,222, 44,149, 74,
+223, 6,240,168,137,124, 2, 0, 93,132, 66, 97,184, 80, 40,236,105, 54,155,131,171,242, 51,166, 84, 86, 86,198, 27, 12,134, 59,
+ 0,110, 0, 80,253,131,158, 17, 59,138,162,246, 84,181,245, 0, 0,202,127, 91, 39, 64,147, 8, 78, 78, 74,109, 85, 35,188, 90,
+ 7,213,127, 48, 1,159, 58,142,181, 90,104,245,237,229, 62,116,216,176, 8, 18, 0,244,198,147, 67, 47, 92, 42, 60,250,138,171,
+ 19, 56,106,212,168,107,123,246,236,113,212,233,116,152, 54,109,218,222,115,231,206,253,172, 80, 40, 22, 54,216,113, 8, 29,231,
+126,187,254, 12,159, 32, 72, 0,144, 88, 44,102,201,211,167,143, 2,146, 19,175, 13, 74, 74,186,190, 74,147,122,225,134,133, 96,
+ 78, 55,160, 71,170, 53,133, 8,246, 67,212,208, 55, 71, 70, 46, 95,190, 20,227,223, 26,223, 60, 41, 73,203,243, 20,101,177,203,
+ 52, 2,127,103,177,100,216,242, 21, 7,137, 43,151,143, 12,219,179,115,217,133,247,223,119,238,251, 47, 20, 91,196, 18, 54,219,
+199,104, 54, 15, 34,129, 66,202,206, 46, 11, 44,150, 26, 0, 72,179,153,161, 87, 40, 90,170, 41,106,194,215,192,173,175, 76,166,
+123,214,114,174,160,168, 46,246,254,254, 61,223, 58,114, 4, 66,111,111,138,226,112, 72, 0, 48,233,116,222,149,249,249,238,251,
+134, 13,235,188, 52, 61,253,226, 82,224,166,141,243,255,132,211,134,166, 8, 45,146, 36,189,158, 62,125, 42, 17, 8, 4,207, 58,
+ 99,154,134,217,108,134,217,108,174, 73, 94, 76,211,116,205, 95,147,201,132,160,160, 32,171,102,180, 0,250, 2,152,212,187,119,
+239,209,235,214,173, 99,134,133,133, 85,167, 12,233,241,197, 23, 95,252,148,144,144,112, 8,192, 46, 60, 11,222,104,237,140,119,
+160, 64, 32,136,254,246,219,111, 69, 17, 17, 17,148,135,135, 7, 8,130, 64, 81, 81, 81,151,115,231,206,133,207,157, 59,119,166,
+ 74,165,154, 0,224,116, 19,174, 79,168,157,157,221,193,145, 35, 71,122,245,234,213,139, 27, 18, 18, 2,179,217,140,123,247,238,
+189,127,231,206,157,113,135, 14, 29, 90,162, 84, 42, 71,195,250,124,109,132, 80, 40,156, 40, 18,137, 86, 46, 94,188,216,105,194,
+132, 9,236,196,196,196,114, 63, 63, 63,226,202,149, 43,226,253,251,247,207, 92,179,102,205, 24,133, 66,177,168,178,178,242, 55,
+ 88,145, 67,209,206,206,238, 14, 73,146, 94,214, 8, 97, 0, 77, 17,195,237,124,125,125,247, 95,190,124,217, 55, 39, 39,199, 60,
+ 98,196,136,221, 0,112,225,194,133, 48,163,209, 72, 12, 24, 48,224,228,147, 39, 79,198, 2,176,182,147,108,227,228,228,116,116,
+252,248,241, 78, 45, 91,182,228,251,250,250, 18, 2,129, 0, 12, 6, 3,114,185,220, 35, 49, 49,177,255,205,155, 55, 53,231,206,
+157, 43,211,233,116,195, 0, 60,104,194,125,234, 42,145, 72,222, 97, 50,153,161, 38,147,201, 19, 0, 40,138,122,106, 52, 26, 19,
+165, 82,233, 30, 0,215, 94,246, 1,113,117,117,253,113,229,202,149, 46, 82,169,148, 94,179,102,205,143, 74,165,114,226,191,181,
+ 51,216,251,251, 1,220,185,125, 19,120,150, 54,135,168,163,253, 17, 0, 88,115,230,204, 67,120,199,206,120,123,252,152, 70, 57,
+135,244,243,250,150,201,102, 57,107,181,218,107,114,181,238,128,128,207, 29, 59,126, 92, 84, 6, 0,156, 60,117,113,108,167, 78,
+142,113,246,124,206, 24, 46,151,219,213,168, 55,148,158, 56,255,228,211,166,136, 42, 79, 79,207,211,142,142,142,252,178,178,178,
+ 34,153, 76,182,121,232,208,161, 43,118,237,218,229,248,248,241, 99,228,231,231, 99,246,236,217,194, 39, 79,158,124,248,224,193,
+131,235,122,189,190, 94,203,150, 82, 89,182,241,139,207,135, 47,182,183,119, 97, 8,248, 34,216,217, 59,193,175,101, 91,116,233,
+ 58, 20,131, 35, 39, 35, 51, 35,161,203,174,157,203, 19,158, 62, 61,183, 90,232,212, 98, 69, 69,133,111,189,253, 82, 72, 32,122,
+ 13, 27,249, 76,100, 45, 94,188, 20,233,169,169,202,156,108,242,163,227, 71, 40,254,224,126, 65, 28,147,190, 40,231,202,229, 35,
+190,221,123,140, 0,128,240, 61, 59,151, 93,248,232,109,199,126, 63,238, 45,255,183,136,120, 98, 57,147, 25, 10,147, 41,208,217,
+221,125,159,214, 98,161,141,114,185,183, 69,173,118, 7, 0, 19,147,169, 23, 8,133, 15, 61,252,253,227,211,239,222,237,249, 53,
+ 69,245,248,170,225, 4,229,213,156, 19, 7,174, 95, 47,105, 63,115, 38,171, 50, 59,219,144,181,101,139,186, 56, 62,222, 76,113,
+ 56,180,247,160, 65,132,184, 79, 31,238,204,148, 20,214,213, 53,107,122, 50,151, 45,243, 91,100, 48, 68,219, 56,255,167,156,255,
+191,163,218, 9,190,246,238,195,109, 13, 10, 45,130, 32, 32, 16, 8,176,111,223, 62, 48,153, 76, 80, 20, 5, 38,147, 89,239,123,
+ 31, 31, 31,107, 10, 50,202,205,205,237,167,159,127,254,217,117,224,192,129,224,114,185, 53, 95, 48, 24, 12, 68, 68, 68,160,127,
+255,254,204,130,130,130,113,251,246,237, 27,183,106,213,170,226,138,138,138, 89,168, 74, 12,221, 0,250,180,106,213, 42,230,204,
+153, 51, 60,173, 86,139,248,248,120,148,151,151,131,205,102,195,203,203, 11, 3, 6, 12,160, 82, 83, 83,157, 34, 34, 34, 98,210,
+211,211,163, 0,196, 89, 81,214,112,137, 68,114,233,192,129, 3,220,182,109,219, 18,153,153,153,104,223,190, 61, 0, 64, 46,151,
+ 99,196,136, 17,220, 9, 19, 38,180, 28, 55,110,220, 13,169, 84,218, 11,192,157, 70,248, 58,184,185,185,253, 54,114,228, 72,143,
+ 85,171, 86,137,236,236,236,144,147,147, 83,232,230,230, 22, 80,125,189,199,141, 27,199, 30, 58,116,168,251,218,181,107, 55, 30,
+ 60,120,240, 83,169, 84, 58, 17,192,221, 6, 85,107,149, 32,230,243,249, 40, 46, 46,198,222,189,123,241,225,135, 31,130,193, 96,
+ 64, 42,149, 98,255,254,253,248,232,163,143,170, 5,141, 85, 98,152,207,231,247,247,247,247,255,245,194,133, 11, 94, 14, 14, 14,
+240,240,240, 32,191,250,234,171, 80, 63, 63, 63, 94,243,230,205, 25,133,133,133,136,137,137,241,123,231,157,119,142,230,229,229,
+189,175,211,233, 26, 93, 82,115,117,117,221,113,252,248,113,159,164,164, 36,108,217,178, 5,101,101,101, 96,179,217,112,112,112,
+128,155,155, 27, 2, 2, 2,136,207, 63,255,156, 63,116,232, 80,254,172, 89,179,118,232,245,250,118, 86,220,163,182, 18,137,100,
+107,159, 62,125,252,150, 45, 91,230,224,230,230,134,234,137,129, 92, 46,247,202,201,201,233,178,120,241,226,209,119,238,220,121,
+ 44,149, 74,167, 3,184,223,196, 7,167, 93, 72, 72, 72,212,136, 17, 35, 24,133,133,133,216,179,103, 79,148, 82,169,108,215, 4,
+113,249, 90,225,206,237,155,152,246,193,236, 74, 15,111,111,214,153,211,191,142, 58,120, 56,240,182, 3,239, 89, 66,234, 10, 13,
+ 12,163, 71,166,119, 28, 48,112, 50,107, 72,228,136,202,109,155, 54, 10,173, 17, 90, 76, 54,203,121,111,244,247,121,151,175,220,
+ 9, 61,123,238,230,160, 81,195,134,209, 44,150,131, 31, 0,124, 58,119, 14, 51,230,216,177,157, 17,253, 59, 23,244,232, 30,158,
+247,246,132,121, 62, 77, 40,110, 96, 96, 96,224,197,132,132, 4, 87, 14,135,131,178,178, 50,231,109,219,182,125,223,189,123,119,
+ 50, 43, 43, 11,169,169,169,200,206,206,134, 92, 46, 71, 68, 68,132,240,238,221,187,155, 1,212, 43,180, 12,100,223,149, 30,205,
+141, 63, 56,243, 4,190, 6,179, 66, 66, 27, 11, 67,206, 30, 63,219,230,143, 61,154,246,174,238, 65, 1,147,222, 91,130,229, 43,
+ 14, 49,127,223,251,205,226,243,231,254, 0, 72,223,250, 51, 2,208,232,250,197,162,133, 80, 40,117,152, 48,126, 42,222, 25, 63,
+213,153,134,222,157, 54,107, 5,122, 77,185,131, 29, 43, 37,246,231, 95,190, 31, 9,192,171,150,216, 58,255,111, 17, 91,203, 89,
+ 44, 95, 88, 44,126, 1, 35, 70, 28,201, 58,117,170, 5,109, 48,184, 48,216,236, 39,118, 78, 78,197, 38,157,142, 54, 26, 12, 44,
+141, 70,227,153,149,148,228,222,253,243,207,207, 95, 89,179,166,215,215, 12, 70,199,175,204,230,219,245,114, 82, 84,231,168,159,
+126, 18,135, 78,153,194,185,191,108,153,170, 36, 62, 94,227, 63,100, 72,121,251, 25, 51,116, 0,160,204,206,102,165, 47, 89,194,
+ 23,247,236,201,123, 99,254,124, 71,179, 94,239,182,124,249,242, 78,139,159, 37, 47,111, 18,167,207,216,177,230,197, 59,119,118,
+140,159, 55,175, 55, 97, 52, 50, 6,189,241,198,189, 53,123,246, 60,253,111, 56, 95,101, 57, 11, 46, 93,210,149,249,249,161,253,
+136, 17,165, 62, 18,137,238, 85,214,253,191, 41,167, 13, 53,168,246,213,154, 86,123,134,138,216,216,216, 94, 0, 46, 2, 88, 22,
+ 21, 21,181, 20, 0,236,237,237,139, 43, 42, 42, 36, 49, 49, 49,141,138, 44, 38,147, 9,119,119,119, 4, 4, 4, 72,165, 82,169,
+107, 3, 5,200,183, 88, 44, 94, 52, 77,215, 88, 95,234,131, 78,167, 67, 70, 70, 6,218,180,105,243, 4,207, 18,209,214,107,212,
+225,243,249, 89,169,169,169, 46,201,201,201,184,115,231, 14,252,252,252,224,232,232, 8, 38,147, 9,163,209, 8,133, 66,129, 86,
+173, 90,129,195,225,160, 67,135, 14, 37, 42,149,202,175,145, 37, 32,142, 64, 32,200,184,116,233,146,119,251,246,237,113,235,214,
+ 45,120,123,123,195,205,205, 13, 0,144,157,157,141, 43, 87,174, 96,200,144, 33, 72, 72, 72,192,155,111,190,153,175, 82,169, 2,
+ 0,232,234, 35,116,114,114, 42,188,112,225,194,147,176,176, 48,173, 74,165, 34,139,139,139,153,241,241,241, 38,165, 82, 41,148,
+203,229,204,138,138, 10,166, 66,161,160, 84, 42, 21,147, 36, 73,150, 70,163, 97,158, 63,127,158, 97, 48, 24, 26, 12,144, 89,125,
+159,142, 29, 59,134,176,176, 48,196,196,196,224,147, 79, 62,193,213,171, 87,225,237,237,141, 3, 7, 14, 96,254,252,249, 72, 75,
+ 75,131,139,139, 11, 66, 66, 66, 26,187, 71,104,217,178,101,230,195,135, 15, 91,178, 88,172,234,188,142,213,249,242, 32,147,201,
+240,232,209, 35, 60,125,250, 20,254,254,254, 24, 63,126,252,163,167, 79,159,250, 55,214,242, 60, 61, 61,101, 73, 73, 73, 46,109,
+218,180, 65,113,113, 49, 28, 28, 28, 96,111,111, 15, 7, 7,135,154,247,126,126,126,152, 55,111, 30,220,220,220,164, 90,173,214,
+181, 49, 17, 20, 22, 22,118,250,252,249,243, 46, 34,145, 8, 69, 69, 69, 80, 40, 20,160, 40, 10,124, 62, 31, 46, 46, 46, 53, 66,
+ 62, 35, 35, 3,145,145,145, 37, 89, 89, 89, 3,155, 32,146, 72, 87, 87,215,212, 7, 15, 30, 4,208, 52,141,188,188, 60,164,165,
+165,225,131, 15, 62,200,208,106,181, 65,248, 23,229,236,171,229,119,197,154,248,222, 52,214,200,225, 93,245, 41, 73,177, 4,199,
+146,134,118,161, 34, 57, 0,220, 75, 84,216,235,200, 86, 8,110, 29, 69, 31, 62,122,141,253,219,174,109, 76, 88,224, 10, 2,105,
+ 41, 25,248,186, 62,238, 1,125,220,167,204,153,243,126,104,239,238,189, 72,165, 74, 37,217,188,121,125,135,172,172, 20, 9, 0,
+248,249, 5, 75,103,206,156,123,215, 78, 32,144, 94,188,114,201,178, 97,195,142,196, 51,113,133,191, 88, 81,100,191,128,128,128,
+235,199,142, 29,115,145, 72, 36,176,183,183,135, 74,165,130,193, 96, 64,114,114,178,118,223,190,125, 70,145, 72,100, 87, 84, 84,
+132,138,138, 10, 16, 4,129, 99,199,142,229, 1,104,246, 34, 81,181,143, 22, 0,124, 48, 56,152, 25,210, 55,192,145,197, 49,241,
+120,204,116,119, 16,102, 14, 65, 11, 93, 79,158,190,215,230,228,217, 91,111,143, 28,245,137,184, 71,175,145, 88,252,229,104, 99,
+ 65, 65, 94,123, 3,122,164,214,229,163, 21,228,143,190, 35,222, 28, 57,102,249,242,165, 88,186,120, 25, 98,143, 29,145, 11, 5,
+164, 78,228,192,180,239,217,165,155,118,222,135,195,243, 43, 43, 11,188,151,175,221, 55, 62,114,248, 60,175,238, 61, 70,224,202,
+229, 35,216,179,115,217, 29,130, 71,191,214,203,136, 75, 0, 22, 73, 81,147, 61,124,125,163,165, 5, 5,158,124,161,144, 57,251,
+220, 57,137,217,108,190, 61,102,254,124,229,225,243,231,107,172,164, 95,145,164, 7,131,193,240, 8,136,140,124,144, 25, 27, 59,
+153, 99, 50,197,124, 6,200, 94,228, 92, 10, 56, 58,248,249, 77,255, 56, 35,131,117,127,233,210, 74, 83, 65, 65,121,248,220,185,
+ 37,117,253,254,147,179,103, 5,108, 15, 15,145,227,176, 97, 78, 27,155, 53,163,141, 82,233,214,186,124,140,234,226, 60, 39, 20,
+ 58,252,113,242,100, 63,154,201,236,181,224,179,207,120, 81, 81, 81, 80, 40, 20, 56,116,232, 16,182,110,217,162,115,119,119,127,
+232,145,152,152, 16,170, 80,124,105, 45,103,248,220,185, 37,102,179,153, 24, 51,127,126, 68, 82,118,118,223, 34,169,180, 57, 0,
+184, 59, 57,229,135,251,249,221,217, 17, 27,155,246,163,175,175,197,218,114,110, 63,117,202,245, 96, 78,206, 20, 39, 39, 39, 94,
+177, 84, 74,113,216,236,210, 46, 33, 33, 7, 54, 45, 90,116,209,244,224, 1,139,235,229, 37,178,143,138,106,114,221,195,231,206,
+ 45, 41, 83, 42,169,143, 87,172,232,150, 91, 92,220,188, 82,167,243,175, 80, 42,221,204, 70, 35, 41,226,243, 75, 91,180,106, 37,
+213,196,199, 23,182, 80,171,103,255, 2, 72,255,174,246, 83,151, 22,121,141,240, 98, 28,173,191,228, 58,188, 24, 21, 21,245,151,
+221, 53, 52, 77, 91,101,205, 98, 50,153,207, 45, 83, 53, 0, 22, 65, 16,184,123,247, 46,156,157,157,225,230,230, 6, 14,231,249,
+228,131, 50,153, 12, 87,175, 94, 69, 74, 74, 10,218,182,109, 91,189,140, 81,191, 34,226,112,230,172, 93,187,214, 65,175,215,227,
+206,157, 59, 8, 15, 15, 7,135,195, 1,139,197,122, 78, 4, 74,165, 82,180,110,221, 26, 11, 22, 44,176, 95,181,106,213, 28,157,
+ 78, 87,239,140,148,162,168, 89, 83,167, 78,149, 84, 91,176,242,243,243,209,161, 67,135,154,239,197, 98, 49,238,221,187,135,240,
+240,112,120,121,121, 97,244,232,209,146, 61,123,246,204, 50,153, 76,235,234,227,100,179,217,100, 88, 88, 88, 71, 0, 16, 8, 4,
+ 32, 73, 50, 93, 36, 18,137, 93, 93, 93, 5, 34,145,232, 47,117,220,185,115,103, 5, 73,146,198, 70,213, 0, 73,162,168,168, 8,
+161,161,161,144,203,159,101,112, 81,169, 84,240,247,247,135, 66,161,168, 17,173, 30, 30, 30,208,104, 26,118,253,106,211,166,205,
+210,160,160,160, 1, 2,129,128,195,100, 50,113,255,254,125,180,111,223, 30,251,246,237,131,143,143, 15,248,124, 62, 50, 50, 50,
+ 16, 22, 22,134, 75,151, 46, 65, 44, 22,163,117,235,214, 28,137, 68,114,185,172,172, 44, 46, 55, 55,119,105, 3,229, 36,133, 66,
+ 33, 46, 93,186,132, 29, 59,118, 32, 59, 59, 27, 5, 5, 5,176,179,179, 67,187,118,237, 16, 18, 18,130,174, 93,187, 34, 35, 35,
+ 3, 68,227,141,201, 45, 32, 32, 32,246,214,173, 91, 46, 52, 77, 99,207,158, 61,168,172,172,132, 94,175, 7, 73,146,224,114,185,
+112,116,116, 68,223,190,125, 33, 22,139, 17, 16, 16,128,253,251,247,187, 12, 30, 60,248,132, 84, 42,109, 7,160,168,177,235,234,
+232,232, 56,123,201,146, 37,222, 18,137, 4, 57, 57, 57,144,203,229,112,117,117, 69,239,222,189, 61,207,157, 59, 55,219,104, 52,
+174,255,183, 8,173, 90,142,239,196,153,211,191,142, 10,104, 81, 30,214,182, 21,223, 59, 38,214,213,123, 95,172,180, 53, 0,132,
+ 6,187, 38,141,138,226,231,223, 79,138,205, 63,115,250,200,157,148,116,196,192,138,165,109,185, 90,119,224,236,185,155,131,218,
+183,237, 96, 89,251,205,252,200, 15, 63,152,194,145,184, 78, 70,113,222, 17,156,187,112,215,103,254, 39, 83,197,235,190,219,126,
+242,236,185,155,164, 92,173,251,210, 58, 83,150,207,143,187, 54,117,117, 81,150, 28, 68,102, 42, 27, 60,187, 80,248,249, 5, 66,
+161, 80,128,203,229,114,199,143, 31,111, 94,184,112,161, 90, 36, 18,241, 9,130, 64, 92, 92,156, 20,192,192,198,120,181, 18, 71,
+218,108, 48,154,104, 54,195, 66, 19,118, 26,194, 92,198, 78, 76,126,140, 1,253,251, 20,119,239, 28,186,106,225,242,239,190, 8,
+ 8,108, 47,126,127,202, 50,230,138,165,111,111, 1,129, 30,117,241,164,102,226, 2,113,224, 48, 15, 64,228,242,175,151, 34, 43,
+ 43,195,113,218,164,138,101, 20,135,231, 17,212,172,155,221,150, 29,113,131,252,253,125,155,207,155, 53,250,248,247, 63,125, 31,
+ 89,219,178,181,107,231,146,163, 0,250, 89,115,109,255,137, 32, 41,170, 21, 73, 16,249, 10,181,154, 65, 27, 12, 46,179,207,157,
+211,156,185,113,227,252,131,105,211,236,218,176, 88,129,109, 88, 44, 48, 12,134,210, 69, 64,201,215, 22, 75,193, 18,138, 18, 61,
+ 62,122,212,131, 98,179, 19,180, 22, 75, 24, 44,150,186,226, 39,181,121, 39, 54, 22,149,121,121,198,178,203,151,181,253,126,250,
+169,196,123,224,192,245,122,131,193,165,186,171, 32, 9, 2, 68,181,235,132,197, 66, 80, 11, 22,144, 52, 69,193,232,232, 56, 9,
+229,229,129,141,113,126, 82, 88, 56,234,237, 41, 83, 34,143,158, 58, 5, 95, 95,223,154,241,204,193,193, 1,243,231,207,199,220,
+185,115, 57,247,238,221,235,116,240,224,193, 78,235,190,253,214, 21,192, 40,107,202,121,230,198, 13,199, 25,203,151, 47,106, 27,
+ 30,238,179,123,239, 94, 78,203,150, 45, 1, 0,143, 30, 61, 10,248,102,205,154,102,161, 97, 97,197,171,230,204,217,149,180,112,
+ 97,107, 0,151, 27,226, 44,138,143,215, 31,204,201,153,114, 33, 46,206, 33, 52, 52, 20, 0,144,150,150, 38,217,184,113,227,212,
+214,163, 71, 79, 88, 62,115,230,151, 81, 90,109,133, 72, 38,227, 68,253,248, 35,245,199,152, 49,141,114, 86,151, 19, 0,122,191,
+255,254,156, 30,125,250,132,140,154, 50,197,201,199,199,135, 16, 10,133, 48, 24, 12, 40, 40, 40,112, 76, 74, 74,106, 25,171, 84,
+ 42, 14,223,184,177, 7,102,115,196,223,216,132,234,212, 34,175,153, 37,235,175,207, 69,213,223,222,177,177,177,116,149,154,172,
+ 25,192,205,102,179, 85, 34,139,162, 40, 16, 4, 97,173,216, 2, 77,211, 40, 41, 41, 65, 98, 98, 34, 30, 61,122, 4,149, 74,133,
+199,143, 31, 99,219,182,109,248,230,155,111,112,251,246,109, 24,141, 70, 24, 12,141,231,160, 21, 8, 4,253,251,247,239, 79,221,
+184,113, 3,126,126,126,224,241,120, 96,179,217, 96,177, 88, 53, 47, 46,151, 11,119,119,119, 40, 20, 10,244,235,215,143, 41, 16,
+ 8,250, 55, 98, 37, 26, 50,118,236, 88,118,245,255,149,149,149, 96, 48, 24, 53,162,165,178,178, 18,101,101,101,168,168,168, 64,
+ 97, 97, 33,222,120,227, 13,182,189,189,253, 16,107,239,134, 90,173,174,148, 74,165, 14, 61,122,244,112, 76, 73, 73,249, 75,182,
+223,139, 23, 47,106,181, 90, 45,147, 36, 73,171, 28,237,163,163,163, 17, 19, 19,131,243,231,207,227,201,147, 39,216,178,101, 11,
+118,239,222,141, 99,199,142, 33, 35, 35, 3, 63,252,240, 3, 54,111,222,140, 93,187,118, 53,120,143,130,130,130, 6,239,217,179,
+167,115,151, 46, 93,248, 12, 6, 3,105,105,105,152, 55,111, 30, 42, 42, 42, 32, 22,139, 1, 0,197,197,197, 88,191,126, 61,116,
+ 58, 29,132, 66, 33, 60, 61, 61,185,203,151, 47,239, 46, 22,139, 7, 52, 84, 70,179,217,108,102, 48, 24,104,214,172, 25, 22, 47,
+ 94,140,205,155, 55,227,244,233,211, 56,112,224, 0,102,206,156,137,144,144, 16, 36, 36, 36,224,246,237,219,160,105,186,193, 65,
+134,203,229,142,222,189,123,183,132,205,102,195, 98,177, 64,169, 84, 34, 47, 47, 15, 55,111,222,212, 30, 57,114,164,242,248,241,
+227,234,203,151, 47,107,175, 93,187, 70, 3,168, 17,156, 81, 81, 81,206,108, 54,251, 45, 43, 46,169,216,205,205,237,139,169, 83,
+167,114,107,183,217,162,162, 34,140, 26, 53,138,207,227,241, 22, 2, 16,255, 11, 77,222,244,193,195,129,183, 57,150, 52,196,196,
+ 62,245,206,125, 98,238, 54,255,211,239,156,230,127,250,157, 83,238, 19,115,183,152,216,167,222, 28, 75, 26, 14, 30, 14,188,109,
+133, 16, 32,251,246,114, 31,238,234,236,176,117,212,176, 97,244,230,205,235, 59,124,248,193, 20, 78,179,192,249,224,218,143,135,
+167,223, 12,244,235,233, 67,180, 9, 33,185,155, 55,175,239, 48,106,216, 48,218,213,217, 97,107,223, 94,238,195,209, 72,216, 25,
+137, 51,215,147,207, 81,161,101, 64, 8,122,247,106, 11, 38,145,137, 67, 7,118,160,176,176, 16, 5, 5, 5, 40, 46, 46, 22, 12,
+ 29, 58, 20, 69, 69, 69,218,184,184, 56,169, 70,163,233, 5, 32,189,177,202, 63,121,146,108,209, 86,154, 13, 22, 51,211,164,148,
+179,212, 51,103, 31,236,127, 59,137,245, 94, 81,133,231, 80, 54,199,145, 61, 56,162,211,222, 29,191, 44, 70,139, 22,161,232,216,
+105,192, 27,142,194,235, 33,245,138,215, 44,196,254,121,232,240,209,241, 99,199,155,178, 31,231, 60, 14,116,229,234,105,154, 54,
+206,254,124,123, 4, 83,224,221,166,101,112, 79,113, 74,166,217,125,241,130,183,126, 63,126,244,251, 39, 87, 46, 31, 65,247, 30,
+ 35,224,233, 17,208,107,210, 36,176, 95,215, 6, 68,208,180, 31, 83, 40,204, 50,202,229,205, 40, 14, 39,207,108, 54,187,220,154,
+ 62,221,193,192, 98,185,155, 13,134, 2,179,193, 80, 96, 96,179, 69, 63, 7, 7,123,209, 52,237,236,224,229,245,148,102,179,125,
+ 76, 6, 67, 38, 65,146, 45,234,156,157,115, 56, 94,194,102,205,168,162, 51,103,244,126, 67,135,150, 3,128,222, 96,112,201,206,
+201,177, 47,150, 74,237,139,138,139,237,115,243,243,237,179, 30, 63,182,207,200,204,180, 79,205,204, 20, 61, 76, 76, 20,222,123,
+248, 80, 72, 48, 24,174,214,112,102, 23, 20,180, 89,176, 96, 1,120, 60, 30, 76, 38, 83, 93,125, 54, 84, 42, 21, 38, 77,154, 4,
+ 53,208,197, 26, 78,179,217, 76,204, 88,190,124,209,103,139, 22,181,140,137,137,225,116,238,220, 25, 78, 78, 78,112,114,114, 66,
+231,206,157,113,240,208, 33,246,204, 89,179,188,190,248,229,151, 73, 36,135,227,221, 24,103,137,191, 63,156,156,156,120,213, 34,
+ 11, 0, 90,181,106,133, 45, 91,182,112, 78,157, 62,109,255,245,175,191,126,183,236,218,181, 48, 93,110,174,202, 57, 48,144,102,
+115, 56, 94,214, 94, 79, 0, 80,106,181,161,235, 55,110,116,118,113,113, 33,138,139,139,145,153,153,137,220,220, 92,152, 76, 38,
+116,236,216,145, 56,112,232,144,189,158,193,232,244, 55, 55,161,191,104,145,215, 8,211, 80, 79, 28, 45,170,106, 0,186, 4,128,
+136,141,141,165,171,151, 19,171, 6,199, 26, 49,101,141,208,122, 25, 84, 84, 84,160,162,162, 2,191,252,242, 75,141, 48,170,134,
+ 94,175,183, 70,180,132,121,120,120, 64, 46,151, 35, 48, 48,240, 57, 75, 22,139,197, 2, 69, 81, 96,177, 88,224,112, 56,208,233,
+116,240,241,241,129, 90,173, 14,107,136, 83,163,209,180,115,114,114,170, 25, 96,117, 58, 93,141,200,170, 46,175, 94,175, 71,121,
+121, 57, 42, 43, 43,161, 84, 42,161, 82,169,218, 91, 83, 95,139,197,130,196,196,196, 71,173, 90,181,106,199, 96, 48, 32, 20, 10,
+ 5, 42,149,170,198,183,168,172,172, 12,191,253,246,155,234,221,119,223,117, 57,118,236, 88,163, 9,139, 9,130,192, 71, 31,125,
+ 4, 14,135, 3,181, 90,141,205,155, 55,227,227,143, 63, 6,139,197,130, 82,169,196,150, 45, 91, 48,111,222, 60, 80, 20, 5,189,
+ 94,143,141, 27, 55,214,203,149,156,156,156,125,227,198,141,246, 29, 58,116,112, 60,124,248,176, 44, 34, 34, 66, 60,112,224, 64,
+240,120, 60,104, 52, 26, 24,141, 70,116,233,210, 5, 65, 65, 65,144, 74,165, 56,121,242,100, 73, 64, 64,128,203,205,155, 55, 45,
+ 69, 69, 69,185,141,136,107,186,150,197, 16,102,179, 25,197,197,197,168,168,168,128, 76, 38, 67, 65, 65, 1,158, 60,121, 2,138,
+162,208,136,206,130,179,179,243,155,161,161,161, 12, 0,224,241,120,104,215,174, 29, 22, 45, 90,100,210,104, 52, 99, 1,156,172,
+ 58,108,240,246,237,219, 15, 95,185,114,133,242,240,240, 64,106,106, 42,196, 98, 49,197,229,114,223,210,235,245, 13, 90,163,220,
+220,220,118,254,249,231,159, 78,213,226,186,250, 58,171,213,207,110,199,168, 81,163,156,118,239,222,189,211,100, 50, 13,193,191,
+ 12, 14, 60,176,218,133,138,228,251, 98,165,173,231,127,250, 29, 21, 20,250,108,242, 58,109, 58,168,117,223,126,210,122,194,112,
+209,113, 7,158,130,213, 24,207,224,254,222, 63, 15, 27, 22, 65,142, 31, 23,149,193, 98, 57,248,109,221,182, 76, 34,113,157, 92,
+ 75,134,137,224,236, 34,130, 95, 51, 54,113,240,120,138,228,243,133, 95,235,162,119,127,159,245,251, 31,177,131,216,204,179, 3,
+ 78,158,203,159, 89, 31,119,250,163,138, 99,106, 29, 55, 88, 81,250,128,112,114,237,134,118,109, 91, 65, 34, 46,199,246,157,251,
+224,219,162, 35,116, 58, 29, 68, 34, 17,223,108, 54, 27, 24, 12, 70,180, 53, 34, 11, 0,206,159,175,176,180,110, 93,161,103, 40,
+ 45,166, 15, 63, 94, 55, 50, 98,240,176,144,190,125,251, 91,206,156, 61, 99,232,214,222, 80, 56,120, 96,187,226, 83,103,127,206,
+ 40, 44,120, 28,208, 58,172, 59,146,147,226, 6,209, 52, 18, 9,162,110,209,153,148,137, 83, 90, 75,114,220,190,125,211, 44, 26,
+ 75, 2,111,197,202,135,131, 35, 35, 39,134,246,236,209,211,114,246,220, 5, 61, 27, 37, 41,162,238, 93,159,126, 56,101,240,225,
+ 95,163, 55, 14, 56,117,114,167,191, 92,145, 27,187,107, 87,253, 46, 8,255,120,165, 78, 16, 98, 59,129, 64, 86,170, 84,182,125,
+115,217, 50,197,152,249,243, 79,183,161,168, 16,179,193,240,120, 25,160,161,105,154,176,152, 76, 11, 31,238,221,203, 88, 74, 16,
+159, 47, 3, 44, 43, 25, 12,230, 19,139, 69,237, 73,146,252, 37, 0,181,236,133,157,220,102,147,201,149,226,112, 72, 89, 92,156,
+ 41,108,242,100, 93,245,243,200,231,243,113,244,232, 81,176,217,236,154, 23,139,197,170,121,239,234,234, 10,162,106, 27,233, 95,
+ 38,126,117,112, 2, 64, 97, 97, 33,138,138,138, 96,111,111, 15,177, 88,140,162,162, 34, 92,187,118, 13,233,233,233, 96, 50,153,
+ 24, 52,104, 16,200,122,124,155, 95,228, 28, 51,127,126, 68,112, 88,152,207,244,233,211,201, 23,199, 71,131,193,128,178,178, 50,
+ 12, 31, 62,156, 60,121,242,164,219,169,188,188, 97, 0,162, 27,226,108, 31, 25, 89, 90,124,240, 96,157,191,221,161, 67, 7,226,
+234,213,171,156, 65, 3, 7,206,253,100,229,202,159,127,220,189, 59,223,108, 50,185, 53,165,238, 36, 73,146, 4, 65,192,219,219,
+ 27,101,101,101,168,172,124,182,130, 45, 20, 10,225,232,232, 8,163,209, 8, 11, 77, 51,255,206,246, 83,159, 22,121, 77,176,173,
+150,224,122,206,178, 69, 85,173,139, 86,119, 20,189,107, 15, 44, 22,139,197, 42,145,197,100, 50, 27,245,185,178,198,202,245, 34,
+172, 17, 90,213,101,229,114,185,207, 89,178,170, 5, 86,117, 57, 73,146, 4,131,193,104,116, 16,175, 18, 67, 12,165, 82,137, 67,
+135, 14,161, 87,175, 94, 53,203, 82,114,185, 28, 21, 21, 21,144,203,229,208,106,181,200,206,206,198,249,243,231,225,239,239, 15,
+ 88, 25,252, 53, 43, 43,235,142,175,175,111,120,245, 32,222,167, 79, 31,175, 93,187,118, 21, 12, 25, 50,196,131,166,105,124,249,
+229,151, 37, 93,186,116,113,169, 61,200, 55, 6, 6,131,129,107,215,174,193,223,223, 31, 52, 77,131,197, 98, 33, 45, 45, 13, 18,
+137, 4, 22,139, 5, 20, 69, 65, 38,147,193,206,174,225, 24,137,137,137,137,239,189,255,254,251, 5,246,246,246,109, 74, 75, 75,
+ 11, 57, 28, 78,143,248,248,120,111,131,193, 0,145, 72, 4,145, 72,132, 19, 39, 78,192,193,193, 1,115,230,204,201,211,104, 52,
+215, 4, 2,129,171, 70,163,121, 80, 84, 84,244,101, 83,238,183,201,100,130, 74,165, 66,121,121, 57,202,202,202,160, 80, 40,160,
+213,106, 27, 45, 99, 93,232,209,163, 7, 98, 99, 99, 25,171, 87,175,254, 53, 43, 43, 11, 0,224,231,231,135, 57,115,230, 48, 60,
+ 61, 61,145,157,157,141, 59,119,238,192, 96, 48,128,166,233, 6, 31, 94,138,162,250,188,251,238,187,221,125,124,124, 8,131,193,
+ 0,139,197, 2,157, 78,135,234,247,121,121,121, 8, 14, 14, 38,155, 53,107,246, 70, 86, 86, 86, 31, 88,183,177,194, 6, 0,197,
+121, 71,224,201,148, 0,164, 8,180,230, 8, 74, 75, 94, 46,138,139, 84, 42, 93,185,224,171,171,147,127, 92,107,112,125, 82, 8,
+180, 10, 29,129,128,144,126,120,239, 29, 19, 86,127,123, 8, 62,205, 90, 33, 55, 55, 23,125,250,244, 97, 21, 20, 20,188, 95, 89,
+ 89, 57,223, 90,238,179,103,111,152,207,156, 56, 57,122,204, 91, 19,195,251,247, 31, 98, 58,125,250, 4, 18, 31,156, 78,122,255,
+173, 55,165,180,165,146,112,114,224, 37,164,165,222, 14,104,211,174, 55,244, 38,115, 15, 96,233, 90, 96, 41, 93,255,243, 14,253,
+241,227,238,228,241, 35, 59,223, 25, 63, 97, 82,219,126,253, 6, 24, 79,159,253, 19,119,174,159,189,255,221,218,169,151, 86,111,
+220,223, 39, 98,208,155,173,197,174,215, 78,132, 6,234,166,120, 59,219, 63,218,190,171,236,117,190,205, 20,139,203, 53, 1, 32,
+ 29,154, 53,243, 58,124,254,124, 78, 59, 38,147, 33, 2,204, 52, 77,183, 2,224, 66, 82,212, 23,199,166, 76,105, 31, 92, 53,144,
+154, 0, 75, 48, 64,202, 1,189, 0, 96,163,158,144, 57, 20,151,107, 65, 85,191, 72, 18, 4,104,154,126, 78,100,189, 40,180, 72,
+146,108,212, 0, 80,155,179,246, 88, 84, 61,161,222,186,117, 43, 56, 28, 14,216,108, 54,152, 76,102,163,238, 23,181, 57,147,178,
+179,251,254, 22, 29,205,169, 75,100,149,150,150,162,180,180, 20,149,149,149, 24, 55,110, 28,107,217,237,219, 29, 80,229,250, 81,
+ 31,167,143,187,187, 78,192,227, 21, 39, 39, 39,123,132,132,132, 60, 87, 94,133, 66, 1, 30,143,135,232,189,123, 89, 81,145,145,
+ 31,244, 59,113,226, 59, 52, 18,255,170,174,186, 19, 4, 1,137, 68, 2, 71, 71, 71, 16, 4, 1,147,201,132,162,162, 34, 36, 37,
+ 37,225,246,237,219, 96, 16,132,233,239,108, 60,117,105,145,215,208,170,245,151,229,195,106,139, 22, 81,159,245,197, 90,161,197,
+ 96, 48, 94,218,170, 85, 31,172, 89, 58,228,243,249, 15, 11, 10, 10,186,121,122,122,194,100, 50,213, 8,173,218,150,184,106, 43,
+ 25,143,199,195,189,123,247,192,231,243, 31,106,181,218, 6, 57,105,154,126,163, 83,167, 78,136,137,137, 65, 92, 92, 28, 30, 63,
+126, 12,181, 90, 13,157, 78, 7,141, 70,131,164,164, 36, 88, 44, 22,132,134,134, 66, 32, 16,128,207,231, 63,172,182,124,213, 7,
+149, 74, 85,200,100, 50, 91,241,120,188,154,207,220,221,221, 81, 90, 90,106, 49, 26,141,248,237,183,223, 20,110,110,110, 2, 30,
+143,103,181,112, 37, 8, 2, 82,169, 20, 94, 94, 94, 53, 62, 90, 74,165, 18, 18,137,164, 90, 88, 64,167,211,193,206,206, 14, 52,
+ 77, 55,118,143,180,153,153,153,159,212,250,191,227,152, 49, 99,126,223,183,111, 95,139,115,231,206,225,230,205,155, 16,139,197,
+ 88,181,106,213,227,156,156,156,241, 0,110, 75,165,175,214, 47,210,154, 54, 84, 90, 90,122,232,225,195,135,111,116,234,212,169,
+166,151,232,211,167, 15,209,167, 79, 31,151,218,166,126,153, 76,134, 91,183,110,225,220,185,115, 32, 8, 2, 25, 25, 25,102,141,
+ 70,243,123, 3,212, 44, 79, 79,207, 93,139, 22, 45, 18,154, 76,166,154,182,205,227,241,192,229,114,193, 98,177,192, 96, 48,144,
+147,147,131,225,195,135,219,255,244,211, 79, 59,117, 58, 93, 75, 0, 6,252, 75, 80,161,129,225, 94,162,194, 62, 52,216, 53,105,
+219,214,213,221,166, 77,127,214, 71,108,219,186,218, 20, 26, 44, 73,186,151, 88,108, 31, 46,105,188,190, 39,207,229,127,168, 55,
+158, 28,122,242,212,197,177,159,206,157,195,244,243, 11,150,158,187,112,215,167,159,233,107,194,217, 69,132,210, 18, 5,114,242,
+138,145,149,171,167,253,252,130,165,119,110, 61,228,124,187,126, 67,128, 74,173,221,127,225, 82,225,159,141,208,107, 47, 95,123,
+ 60,226,187, 31, 56,151, 38,190,223,145,205,227,121,160,172,228, 33,124,124,196, 24, 30,213, 6, 59,118, 95,131,189,189, 19, 92,
+ 93, 93, 65,146,164,192,218,186,151,148,148, 16,135,254,184, 60,249,221, 73, 83,187, 12, 28, 16,105, 58,117,250, 56, 21,119,230,
+216,181,157,219,190, 56, 76, 51, 84,124,130, 86,242,154,251,186, 61,120,148,121,111,124,223,254,227,192, 99,217,249, 3, 65,117,
+ 54,216,154, 13, 6, 52,242, 98,246, 45,229,190, 59,105, 90,215,129, 3,135,153, 78,159, 62,130,211, 39,118,223, 88,178,164,249,
+137,199, 79,247,178,174,223,126,194, 29, 49,122,102,121,236,201, 20,253,155, 67,125,211, 61, 4,237, 52,192,227,215,182,253,144,
+ 4,161, 40,145,201, 68, 76, 38, 83,179,243,237,183, 51, 0,192, 72, 81,165, 74, 6, 67, 76, 16, 68, 26,128,180,149,128, 11,216,
+108,249, 24,147,201, 60,223,199,135, 69, 21, 22, 50,202,205,102, 51, 3, 96,127,250,215,252,139, 96, 80, 84,177, 73,167,243,246,
+ 26, 56,144,161,206,205,101, 10, 93, 93, 77, 0, 96, 52, 26, 27, 21, 90,168,103,211,202,139,156,214,214, 79,173, 86,195, 82,143,
+ 16,124,145,179, 72, 42,109, 94, 53, 9,175,129,209,104,172, 17, 89,165,165,165,168,168,168,128, 64, 32,128, 76,167,115,181,134,
+115, 64,231,206,191, 45, 91,186,116,254,193, 67,135, 88,181, 69, 86,245,139,201,100,226,155,181,107, 89, 31,127,250,233,204, 15,
+ 40,106, 54,234, 88, 6,173,239,122, 86, 79,218, 25, 12, 6, 40,138, 66,110,110, 46,242,242,242,144,155,155,139,220,220, 92,240,
+120, 60,208,127,243, 38,160,215,216, 63, 11,181,150, 10,167,189,104,229,106, 48,188, 67, 83,156,225,173, 21, 6,102,179,249,149,
+ 10, 45,149, 74,117,238,252,249,243,157, 71,140, 24, 65,221,184,113, 3,110,110,110, 53, 66,171,250,111,245,114, 20,159,207,199,
+225,195,135, 13, 42,149,234, 92, 35, 15,211,249, 19, 39, 78,132, 47, 94,188,152,249,222,123,239, 33, 57, 57, 25,211,167, 79, 71,
+ 69, 69, 5, 20, 10, 5, 74, 75, 75,161, 86,171,209,185,115,103,112,185, 92, 60,120,240,192,168, 86,171,207, 55,182,116, 38,149,
+ 74, 43,197, 98,177,251,139,223,141, 30, 61,218,117,211,166, 77,234,212,212, 84, 99,183,110,221, 68,214, 10,142,106,252,241,199,
+ 31, 53,150,186,244,244,116,108,218,180, 9, 52, 77,131,166,105,220,189,123, 23,235,214,173,171,137,125,214, 68,220, 46, 41, 41,
+ 49, 25,141, 70,248,251,251,195,211,211, 19, 90,173, 22, 27, 54,108, 48, 1,184,253,127,213,154,181, 90,237,193,137, 19, 39,126,
+150,144,144,224, 78, 81,212, 51,147,118, 85,253, 12, 6, 3, 50, 51, 51,145,148,148,132,212,212, 84,148,149,149,213, 76, 4,238,
+221,187, 87,110, 52, 26,247,215,199, 43, 22,139,191,220,177, 99,135, 27,159,207,127,174, 61, 87, 91, 67,171,173,164, 50,153, 12,
+ 14, 14, 14,232,215,175,159,228,252,249,243, 95,234,116,186,197,255, 18,157, 69,140, 30,153,222,241,227, 15, 71, 96, 84, 20, 63,
+ 63, 38,246,233,213,117,223,126, 82,229, 12, 47, 73, 26, 21,229,153,127, 63,205, 1,163, 71, 30,233, 8,224, 9, 26,246,211,178,
+ 92,184, 84,120,180, 83, 39,199,184,152, 99,199,118, 46, 92, 48,247,238,252, 79,166,138,213,154, 71, 92,191,102,108, 2, 0,178,
+114,245,244,131,100,139,118,221,119,115,239,174, 94,251, 19, 89, 92, 90, 49,253,214,173,250,195, 27,212, 22, 47, 36, 9,174, 95,
+ 80,175,130,128,192,238,190, 55,174, 69, 67,200,215,160, 85, 80, 71, 12, 28,240, 6,226, 46,222, 67,145, 76,139,194,194, 66,232,
+116,186, 6,195, 37,164, 62, 56,252, 14, 77,208, 62, 4, 77,228, 17, 36,205,125,103,174,143,163,171, 0, 0, 32, 0, 73, 68, 65,
+ 84,226,148, 30,145,145,195,232,216,216, 99,166, 35,135,163,175,236,223,243,195, 65,146,197,164, 52,122,123, 61, 65,104,229, 32,
+ 19,147, 43, 85,207, 38, 52, 76, 14,171,126,243,107, 85, 96,215,144,214, 65,110,239, 76,156,110, 63,100,240,112,250,196,137, 35,
+150,253,251,126,139,219,255, 75, 88,180,133, 84,176, 10,243,213, 28,185,194, 40,167, 9,182, 67,165,194,162, 46,206,106,169,245,
+136, 28,109, 0, 14,190,182, 13,136,182, 88,114,105,189,222, 23, 76,102, 62,109, 50,185,193,104, 44, 91,166,213, 62,253,154,205,
+110,190,132,162, 58,128, 32, 44, 6,130, 80, 65,175,207, 2, 0,167,188, 60,119,189, 72, 84,196,208,106, 91,194,108,174, 51, 0,
+178, 65,167,123, 82,153,159,239,238,212,171, 23, 39,115,233, 82,190,107,231,206, 90,162,202,135,184, 33,161,197, 96, 48, 0,146,
+180, 88,195,105,109,253, 52, 26, 13, 44,128,241,101, 56, 77, 38,211,115, 34,171, 90,104, 85, 63, 47,214,112,110, 91,178,228,134,
+207,192,129,101, 23, 47, 94,116,237,221,187, 55,161, 84, 42,161, 84, 42,159, 19, 91, 30, 30, 30, 68, 72,104, 40,255,143,184, 56,
+ 63,107,175,167, 85, 34,154, 36,255,118,161,245,154,163,222, 68,210, 84, 35, 75,104, 86, 11, 45, 43, 45, 90, 70,163,209, 8,137,
+ 68,130,146,146,146,122, 7,126,146, 36,193,227,241,170,215,136, 27,220,121,167,211,233, 54,204,159, 63,127,214,224,193,131, 93,
+ 90,181,106, 5,153, 76, 6, 87, 87, 87,112,185,220, 26,223,177,106,190,187,119,239, 98,199,142, 29, 10,157, 78,183,161, 17,206,
+245,107,215,174,253,112,212,168, 81, 78,110,110,110,112,116,116,196,131, 7, 15,224,232,232, 8,133, 66,129,180,180, 52,216,217,
+217,213,248,237, 28, 59,118, 76,169,211,233,214, 55, 34,222,232,248,248,120,131,157,157,221, 3,153, 76,198, 40, 43, 43,163,202,
+203,203, 41,133, 66,193,148,203,229,204, 83,167, 78,185,216,219,219,171, 47, 92,184, 32,243,241,241, 97, 60,126,252,152, 97, 52,
+ 26, 27, 85,175, 4, 65, 96,246,236,217, 96,177, 88,208,233,116,216,176, 97, 3,230,207,159, 95,227,147,181,118,237, 90, 44, 90,
+180,168, 70, 56,111,223,190,189,105, 29, 39, 77,195, 96, 48,192,104, 52, 90,189, 65,225,191,154, 17, 91, 39,216,139, 50, 50, 50,
+162, 58,117,234,116,230,192,129, 3,206, 85, 49,201, 80, 92, 92,140,226,226, 98,200,100, 50, 84, 86, 86,194,100, 50,193,211,211,
+ 19,197,197,197, 56,114,228,136, 92,169, 84, 14, 68, 3, 59, 14, 25, 12,198,196, 30, 61,122, 80, 47,150,161,122,150, 87, 45,222,
+ 57, 28, 14, 10, 10, 10,208,167, 79, 31,246,197,139, 23, 39, 2,120,173,133, 86,237,240, 14, 3, 6, 78,102, 5,183,238,170,191,
+159, 20,155, 31,228, 91,156, 63, 97,184,232, 56, 0,220, 75, 44,182,191,159,230,128,224,214, 81,244,128,129,142,225,197, 69,219,
+194, 0, 24, 26, 74,215, 3, 0,246,124,206,152,136,254,157, 11,236, 4, 2,114,221,119,219, 79,110,222,188,190,195,193,227,255,
+ 9,239,176,238,187,103,225, 29, 34,250,119,182,164,166,164,142, 1,240,139,181,226, 37, 42,106,104,194,142, 93, 59,144,154,116,
+193,227,179,217,109,216,101,197, 70,240,132,222, 8,111,231,138,109,187, 30,226,254,253,251, 69,122,189,190, 79,131,237,155,160,
+125,146,146, 19, 3,195, 90,135,184,189, 51,113,154, 40, 42,106, 56, 98, 99,143, 98,207,111,191,196,191, 57,110,212,175, 79,203,
+ 21, 12, 9,147,207,226,211, 22, 54,131,101, 79,177, 56, 60,169, 94,255, 44, 2, 1,147,201, 21, 1, 99, 26, 28,120,102, 76,155,
+ 96,223,183,255,112, 28, 63,113, 20,123,126,219,118,233,171,214,163,127,241,109, 31, 76,116,238,240,237, 76,223, 22,190,205, 84,
+149,197, 10,146, 96, 27,180, 90,139,221,183,191,229,124,159,181,104, 98, 22,128,239,240,154,238, 58,100,155,205,247,117, 6,195,
+ 4,239,240,240,219, 5,183,111,135,173, 50, 26,157,190, 0,202,190,210,235,115, 14, 0,249, 21, 0, 57,189,170, 79,255, 14,224,
+106, 40,202,221,158, 36,239, 41,205,230,193, 96, 48,146, 80,247, 68,252,193,158, 33, 67, 58,125,252,232, 17, 75,220,189, 59,175,
+ 32, 46,142, 95,149,137,164, 65,161, 69, 81, 20,232,250,151,186,158,227, 36,118,239, 38, 1,128,197, 98,213,219,199,177, 88, 44,
+168,213,106, 24,235,183, 96, 63,199,233,126,250,116,254,163, 71,143, 2,156,156,156,158, 19, 89,101,101,101, 53,239,181, 90, 45,
+212,106, 53,120, 60, 94,146,166,238, 21,145,231, 56,139,227,227,181,107,102,207, 94, 60,126,220,184, 31,206,157, 63,207,117,118,
+118,134, 92, 46,127, 78,104,233,245,122,244,237,215,143,181, 54, 33,225, 29, 40, 20, 75,172,185,158,174,125,250, 52,234, 15,204,
+ 96, 48, 96,249,155,151, 14,255, 5,152, 86,151,240, 34, 27, 91,194,177,118,215, 97, 61, 3,228,139,187,251, 22,133,135,135,107,
+211,211,211,225,227,227, 83, 35, 86,106,255,166, 72, 36,130,131,131, 3,238,222,189,139,149, 43, 87,106, 0, 44,106,132, 83,169,
+ 86,171,223,138,136,136,208, 80, 20,133,160,160,160,154,248, 89, 22,139, 5,108, 54, 27, 2,129, 0, 9, 9, 9, 24, 58,116,168,
+ 90,173, 86,191,133,191,198,208,122,145, 83,174, 86,171,223, 30, 48, 96,128, 58, 57, 57, 25, 61,122,244,192,253,251,247, 81, 89,
+ 89,137,202,202, 74,100,103,103, 35, 36, 36, 4,106,181, 26,155, 54,109,210,168,213,234,183, 1,200, 27,226, 84, 42,149, 67,231,
+207,159,207,248,253,247,223,125, 61, 61, 61, 91,119,236,216,177, 85,191,126,253, 90,142, 28, 57,178,217,144, 33, 67,220, 3, 2,
+ 2,180, 3, 7, 14, 20, 15, 30, 60, 88,172, 86,171,153, 87,175, 94, 45, 52, 26,141,131, 27, 41,103,141, 56, 73, 79, 79,175, 89,
+ 42,164, 40, 10, 37, 37, 37, 53,145,251,171, 59,165,122,132,112,255,198,196,118,181,192,170, 22, 92, 86,248,185,213,197,217,232,
+ 73,108, 54,187,218,226, 73, 91,193,121, 47, 37, 37, 37,162, 87,175, 94,247, 38, 79,158,172, 44, 42, 42,130,157,157, 29,252,252,
+252, 16, 24, 24, 8, 23, 23, 23, 24, 12, 6, 28, 62,124, 88,117,228,200,145,135,114,185,188, 15,254, 26, 67,171,255, 11,215, 49,
+187,174, 78,182,218,154, 85, 45,180,184, 92, 46, 60, 61, 61,171,175,109,118, 83,174,231, 75,226,239,229,172, 18, 48,253,250, 14,
+108, 49, 36,114,132,253,225,163,215,216, 63,252,124,228, 97,120,127,108,119,110,174, 56,230,220, 92,113, 44,188, 63,182,255,240,
+243,145,135,135,143, 94, 99, 15,137, 28, 97,223,175,239,192, 22,201, 73,169,173,106,231, 61,172,171,156, 92, 46,183,107,143,238,
+225,229, 23,175, 92,178,172, 94,251, 19,217,183,207,155, 9,191,252,122,248,240, 47,191, 30, 62,220,183,207,155, 9,171,215,254,
+ 68, 94,188,114,201,210,163,123,120, 57,151,203,237,106, 77,221,103, 76,155, 96, 31, 57,100, 56, 98, 99, 15,155, 14,254,177,105,
+237,190, 67, 25,189,166,204,138, 47, 78, 79,191, 79, 75,159,156, 6,147,204, 69, 74, 74,138,188, 74,100,165, 91,195, 57,125,234,
+132,218, 34,235,178,179, 91,143,237, 41, 41, 48,159, 61,251,167,241,252,249, 4,205,229,123, 82,249,157,228,146,178, 2, 89,217,
+ 99,133,162, 84,111,177,152, 97, 54,155, 25,203,150,213, 56,236,214,121,143,186,117,235,141, 11,231,246,226,183, 93, 91,229, 22,
+ 11,180, 99, 14, 30, 52,143, 25,179,148,110,214,188,121,179,232, 63,246, 18, 81,195, 70,216,211,128,101,232,168,225, 14,191,239,
+251,157,104,225,223,162,185,159, 95, 77, 72,155,215,174, 45,125, 6, 84, 18, 64, 74,225,173, 91, 29,133, 61,122, 60, 48, 49,153,
+129,203, 89,172,150, 27, 1,246, 24,192, 60, 29, 48, 46, 1,200, 37,128,167,134,162,218,242, 76,166,251, 74,181,218, 11, 0,190,
+166,233,199,117,113, 46, 5,202, 21,185,185,151,238,254,244,147,206,245,173,183,156,216,174,174, 34,152,205, 68,117,255, 94,223,
+139,162,168, 23, 45, 48,245,114,122,186,184, 60, 61,118,236, 24, 2, 3, 3,225,233,233,137,218, 62,178,213, 1,185,157,157,157,
+113,232,208, 33,208,207, 7,167,174,151,179,189,175,239,221,111,214,172,209, 91, 44, 22,148,151,151,255,197,154, 85, 94, 94, 14,
+139,197,130, 19,199,143,235, 21,207, 50,129, 88, 85,247, 62, 12, 70,229,248,158, 61, 87, 71, 70, 70, 26, 30, 61,122, 84,179,243,
+186,218,178, 37,149, 74, 33, 20, 10,161,213,233,188, 1,240,173,225,148,158, 58, 37, 64, 35,253,122, 29, 22,173,191,163, 45,189,
+238, 34,171,118, 66,233,105, 86, 89,180, 76, 38, 19,188,189,189,159, 75,233, 66,146,228,115,175, 38,238, 56,220,157,156,156,124,
+122,224,192,129,139,187,116,233, 50, 99,241,226,197,140, 86,173, 90, 65, 46,151,195,209,209, 17, 18,137, 4,105,105,105, 56,118,
+236,152,185,164,164,100, 11,128,229,168, 35,128, 93, 29,136,203,200,200,136,106,211,166,205,190,207, 63,255,220,126,192,128, 1,
+ 76,111,111,111,208, 52,141,132,132, 4,196,196,196, 24,126,249,229, 23, 69,149,200,178,214,121,249, 76, 65, 65,193,155,131, 7,
+ 15,142,158, 56,113,162,157,217,108,102,102,103,103, 67,167,211,193,104, 52, 34, 47, 47,207, 16, 27, 27, 91,169, 86,171, 39, 0,
+ 56, 99, 5,223,221,138,138,138,144,179,103,207, 78,188,122,245,234,202,201,147, 39, 59,247,235,215,143,101, 50,153,112,229,202,
+ 21, 89,251,246,237, 37, 82,169,212,112,232,208,161, 82,173, 86,187,200,108, 54, 91,149,130,135, 32, 8, 40, 20, 10,184,184,184,
+ 64,167,211,193, 98,177, 64,175,215, 67, 40, 20,214,164, 77,162,105, 26, 77,113,174,127,161, 13, 48, 12, 6, 3,198,141, 27, 7,
+139,197,130, 13, 27, 54,192,100, 50, 53,153,204,222,222,254,206,189,123,247,162,218,181,107, 87, 35, 94,170,219, 16,135,195,129,
+139,139, 11,156,157,157, 17, 27, 27, 11, 38,147,121,167, 49,127,183, 42,220, 47, 41, 41,105,127,246,236,217,174, 15, 31, 62,124,
+ 23, 64, 59,131,193,224,105, 54,155, 9,146, 36, 11,105,154,126,160, 80, 40,126,133,149, 41,120,164, 82,233,202, 73,147, 38,181,
+223,187,119,175,144,162,254,243,104, 80, 20, 5, 14,135,131,234,224,152, 52, 77, 67,175,215,227,203, 47,191, 84,168, 84,170,149,
+255,150, 94, 34,188, 99,103,108,219,180, 81,120,254,194,105, 89, 74, 6, 98, 28, 29, 83, 94,108,127, 79,138,139,182,133, 21,228,
+231, 11,195, 59,118,182,138,211,168, 55,148,190, 61, 97,158, 79, 85, 10,158, 47,179,179,115,182, 70,239,254, 62, 11, 0,190, 93,
+191, 33,160,184,180, 98,122,106, 74,234,152,173, 91,255,232,106,212, 27, 74,173,225,252,143,120,137,150,131,134, 22,192,205,132,
+135,197,190, 67,223, 58,181,200,191,133,104,152,180, 84,243,180,178, 82,253, 17,128, 44,107,235,222,189, 91, 47, 92, 56,243, 59,
+246,252, 22,173,160, 45, 12,173,139,139, 11, 13, 0, 41, 41, 46,116, 74, 74, 5,253, 31,191, 98, 7, 21,147,190,191,124,222, 71,
+253,230,201, 21,101,235, 55,108,106,120, 41,165, 77,219, 46,104,211,182, 11,102,125,244,133,125, 72,235, 32, 31, 0, 56,120, 16,
+230,214,254,201,127, 46,254,106,233,176,229,203,151, 66,161,212,161, 58, 93, 79, 90, 98,242,241,172, 44,232, 95,231,118,180,216,
+100,186,178,156,166, 71,170,227,227,195,186,126,250,233,173,203,235,214,249,202, 25,140,110,203, 0, 11, 73, 16,102,208, 52,143,
+ 36,201, 66,129,209,152,160,100,179,221, 9,139,165,131,157,217,124,216,104, 54,211, 13,112,222,196,188,121, 1,234,178, 50,113,
+247,207, 62,115,161, 62,253,148,108,200, 25,190,246,243,107, 13,231,237, 7, 15,142, 79,159, 50,229,233,146,197,139, 7,110,217,
+186,149, 23, 22, 22,134,162,162, 34, 4, 5, 5,193,211,211, 19,103,207,158,197,161,253,251, 85, 21, 74,229, 34, 0,155,173,225,
+220,125,226, 68, 90,171,214,173, 75,182,110,221,234, 17, 25, 25, 73,168, 84, 42,200,229,114,200,229,114,232,116, 58, 84, 5,132,
+166,211, 51, 50, 82,140, 70,227, 22,107,235,110,150,201,184,203, 59,119,126,194,178, 88,190,121,115,212,168,249,203,191,254,154,
+211,162, 69, 11, 66,167,211,213, 88,181, 12, 6, 3,132, 66,161, 65,175,215, 59,163, 14,191,183,186, 56, 57,191,252, 98,146,201,
+100, 16,139,197, 53,225,154,106,199, 37, 84, 42,149,160,105,250, 95,155, 0,253,239, 68,189, 10,201,209,209,241, 14, 69, 81, 94,
+181,173, 91,117,229,206,171,253,153,209,104,124, 82, 82, 82, 18,254,130,226,173,207, 31,202, 15,192,170,190,125,251,190,249,201,
+ 39,159, 16, 23, 47, 94,196,145, 35, 71,232,172,172,172,131, 85, 86,172,172, 6,102, 79,245,113,218,113, 56,156, 57, 2,129,160,
+127,117, 8, 7, 62,159,255, 80,165, 82,157,171, 90, 46, 84,190, 4,167,136,195,225,204, 22, 8, 4, 17, 85,233, 87, 96,103,103,
+119, 79,165, 82,157,213,233,116, 27, 81,127,162,234,134, 56,121,246,246,246, 43, 93, 92, 92,222,254,244,211, 79,157,227,227,227,
+ 11, 47, 92,184,192,170,168,168,216,171,215,235, 27, 74, 42,253, 23, 78, 39, 39,167, 59, 12, 6,195,235,111,186, 71,104,211,166,
+ 77,236,208,161, 67, 35, 39, 76,152, 0,163,209,136,205,155, 55,227,236,217,179,199, 51, 51, 51,163, 26,153,225,190,200,233,226,
+229,229,117,113,198,140, 25,205,198,141, 27,199,119,116,116, 4, 69, 81, 80,169, 84,200,204,204, 68, 66, 66, 2,125,244,232,209,
+202,187,119,239, 62, 81,171,213,189, 1,148, 52,225,122,254, 55, 51,241,231, 56, 41,138,234,229,237,237,253,199,146, 37, 75,236,
+ 34, 34, 34,120,206,206,206, 96, 48, 24, 48, 26,141, 40, 44, 44, 68, 98, 98, 34, 78,159, 62,173, 58,120,240,160,170,180,180,116,
+ 28,128, 75,255, 23,229,124,149,156,193, 1,248,234,133, 68,209,245, 70,123,111,228,216, 70,203,217,183,151,251,240, 49,111, 14,
+ 30, 4, 0, 7, 14,157, 60,101, 69, 82,233,122,203,217, 88, 89,173,225, 12,242, 39,151, 36, 37, 39, 62, 23,208,178,117, 72,104,
+122,112,216,168, 21,214, 16,213,138, 12,255, 92,221,107, 45,199,214,182,233, 62,183,204, 26,236,135,168,225, 99, 70, 70,126,177,
+104, 33, 86,173, 92,141,163, 7, 14, 31, 79,201,122, 46, 77,208,107,215,150,106,143, 45,203, 24,140,190, 36, 73,122, 19,108,246,
+ 45,163, 74,149, 97, 7, 48,149, 0, 99, 25,160, 90,206, 98,181,132,217,220, 26, 52, 77, 41, 9, 34,118,157,217,236, 8,160,160,
+ 49,206, 21, 20,213,133,239,238,222,115,131,197,178,240,126, 98,162,176,246,132,173,218,242, 92,123, 82,233,225,225, 33, 45, 44,
+ 44,116,181,134, 51,234,199, 31, 13,106,129,128,179,240,155,111,122, 85,106,181,189,150, 47, 95, 78,221,190,125, 27,155,126,250,
+201,164,125,242, 36, 90, 6,204,174,103, 53,164, 94,206,102,179,103,115, 23,108,218,244,158,159,191,191,228,221,119,223,101, 50,
+153, 76,168, 84, 42,228,231,231,227,204,233,211,250,228,148,148,100,133, 66, 49,172, 41,117,143,250,241, 71,131,131,159, 31,248,
+ 98, 49,125, 62, 46,206,126,250,156, 57, 51,154,251,250,218, 15, 28, 52,136, 41, 18,137, 80, 94, 94,142,236,236,108, 28, 62,124,
+ 88, 90, 89, 89,233, 1,192,108, 13,103,244,213,171,109, 78, 92,186, 52,122,197,138, 21,236,208,208, 80,216,219,219, 67,169, 84,
+ 34, 49, 49, 17,151, 46, 93,210,109,217,178, 69, 46,151,203,103,152,205,230, 99,127, 99, 91,250, 87, 46, 29,254,221, 30,254,214,
+220,136,112, 0, 95, 85,189,255, 26,141,231, 12,124,157, 59,159, 23,225,227,228,228,180, 77,171,213,210, 26,141,102, 58,128,188,
+127, 96, 57,169,240,240,240, 77, 82,169,180, 43, 77,211,176,183,183,191,150,148,148,244, 1,234,217,121,211, 8, 39, 3, 64, 87,
+161, 80,216,217,206,206,174,151, 78,167, 11,174, 90,126, 75, 81,169, 84,151, 12, 6,195,205, 42,235,147,249,255,184,238, 12, 0,
+ 17, 30, 30, 30, 83, 44, 22,139, 63, 65, 16, 14,102,179, 25, 70,163,177,194, 98,177,100,202,229,242, 95, 0,156,253, 7,148,243,
+149,112,134,180,196, 72,154, 68,112,125,130,224, 57,161,245,130,128, 32, 44, 72, 73,126,132,195, 77, 40, 39, 57,184,191,247,207,
+192,179,157,137,104,220,185,246, 63, 66,203, 10,241,210,100,145,217,146, 49,137, 38,232,231, 56, 9,154,200, 11,106, 51,114,207,
+127, 35,180,172, 69, 72, 32,122,129, 70, 87, 11,141,155,169,153,184,240,111,235,235,150, 0,174, 36, 73,118, 34, 72,178, 37, 13,
+168, 8,130, 48,129,166,157, 64,211,143,192, 96, 36, 45, 54, 24, 30,161,238, 4,230,245,114,174, 2,156,126,114,116,188, 70, 82,
+148, 27, 0,178,202,250, 98,177, 16,132,153, 38, 8, 83,237,229,173, 23, 38,150, 13,114, 26,128, 48, 38,135,227,109, 54,153, 92,
+139, 0,225, 9,179,185,131,150,166, 43,189,128,175,238, 1,105, 77,173,123, 53, 39,131,195,241, 57, 65,211,195,101, 2, 65, 27,
+169, 70, 35, 6, 64, 11, 5,130, 20,133, 74,245,155, 86,171,253,185,169,117, 55, 0, 97, 44, 14,199,203,108, 50,185, 2, 0, 73,
+ 81,210,125, 58,157,247, 19,145,232, 93,173, 78,215, 76, 40, 20, 26,245,122,189, 66,171,213, 78, 48,153, 76,231,155, 82,247, 76,
+147, 41,228, 42, 73,246, 48, 8, 4,206, 6,130, 16,232, 77, 38,131,222, 96,200,215,106,181, 15, 1,124, 15,224,209,223,220,150,
+108,120,201, 7,208,198,105,227,180,113,218, 56,109,156,255,159,115,174, 1, 68,171, 0, 39,219,245,252, 91, 57,249, 0,124,170,
+ 38,139,175, 99,221,255,149,214, 45,202,118, 45,108,176,193, 6, 27,108,248,187,241,121,253,110, 22, 54,188, 58,168, 81,135, 79,
+150, 13,255,183, 32, 26, 80,165, 77, 49, 9,190,140,178, 61,103,227,180,113,218, 56,109,156, 54, 78, 27,167,141,243,255, 59,206,
+198,184, 95,199, 37,201,105,117,124,182,237,127,241,195, 54,243,175,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255,111,
+ 65,218, 46, 65,189,112,173,122,189,234, 99,109,248,119,183,133,255, 5, 60,171, 94, 77, 57,222,221,118, 27,109,176,193, 6, 27,
+254,255, 16, 90,214, 14, 90,255,205,224,246,223, 14,140,171, 9, 2, 5, 4,129, 2, 0,171, 95,225,177,141,193,195,197,197,229,
+227,144,144,144,104, 87, 87,215, 89, 0, 36, 77, 60, 63,128,207,231,111, 20, 8, 4, 23, 5, 2,193, 69, 62,159,191, 17, 64,192,
+ 43,186,111, 4,128,233, 28, 14, 39,206,221,221,253, 41,155,205,142, 3, 48, 3, 47,191,115,181, 21,158,197, 73,251, 26, 64,155,
+166,156, 40,105, 61,124,191,184,245,240, 7,226,214,195, 19,157, 67,135, 6,136, 91, 15, 79, 20,183, 30,254, 64,210,122,248,254,
+191,161,189,190,202,251,251,170,202,147, 71, 16,200,179,178, 60,223, 19, 64, 62, 65,224,201, 63,164,252, 54,216, 96,131, 13, 54,
+212,171, 2, 60, 60,222,116,119,119, 63,231,238,238,126,214,195,195,227, 77, 43, 78,233, 95,199, 32, 97, 38, 8,152, 27,233,244,
+ 27, 58,174, 49,115,101,237,115,215, 89, 89,181,218,156,174, 4, 1, 51, 93, 5,130,128, 69, 34,145,252,224,238,238,190,250,197,
+151, 68, 34,249,129, 32, 96,169,117,172,185,150,192,107,170, 89,213,245,157,119,222, 57, 80, 94, 94, 30,171,215,235, 99, 51, 50,
+ 50, 98,123,247,238,189,239, 5, 75, 68,189,156, 92, 46,119,124,167,206, 93,239, 94,186,114, 51, 35, 61, 51,167, 32, 57,237,113,
+206,159,167,206,223, 14, 13,107,115,139,203,229,142,111,194, 61, 34, 0, 76,167, 40, 42, 78, 40, 20, 62,161, 40, 42, 14,192, 76,
+ 6,131,113,108,205,154, 53, 57, 73, 73, 73,197, 87,175, 94,173,184,116,233,210,211,201,147, 39,103, 18, 4,241,103, 29,130,189,
+191, 21, 22,152,197,185,185,185,167, 10, 11, 11, 79,243,120,188,149, 86, 28, 95,195, 41,110, 61,252,129, 84,110,160,165,114, 3,
+ 45,110, 61,156,174,245,254, 65, 19,175,121, 99,247,232, 47,109,129,195,225,248, 52, 34,232,255, 78, 19,253, 95,202, 3,192,173,
+234,187,112, 0, 63, 86,189,170,183,179,187,113, 57,156, 87,213, 62, 95,197,245,180,113,218, 56,109,156, 54,206,127, 43,218, 87,
+253,117,199, 51,127,173,154,177,187,169,187, 14, 63,204,200,200, 16, 2, 64, 96, 96,224, 7, 0, 14, 53, 69, 72, 16, 4, 22, 88,
+ 44, 52, 9, 0, 36, 73,124,214,167, 79,223,246, 60, 30,239,185, 40,200, 26,141,134, 29, 23,119,161,159,197, 66, 19, 85,199, 45,
+160,105,108, 4, 80,108,237,111,232,245, 58,146,201,100,131, 36,137,121,161,161, 97,205, 75, 74, 74,226, 73,146,140,126,250,244,
+105,121,147,205, 56, 4,129,237,219,183, 7,186,187,187,255, 37, 90,115, 97, 97, 33,123,248,240, 97, 77,226,155, 4,112,116, 28,
+ 78,103, 22, 65,184,155, 77, 38, 7, 0,160, 40,170,252, 54,155, 29,190,106,197, 10, 62, 65, 16,150,210,210, 82,104, 52, 26,204,
+157, 59,151,151,156,156, 60,162,164,164,228,231, 70,104, 3,219,180,109, 63,247,244,233, 83,193,138,178,114,237,246,245, 91,239,
+106, 40,150,218, 55, 36,136,181,105,219,111,142,211,222,155,240, 81,106,106,210, 61,212,157,142,164, 54, 72, 0,135,231,204,153,
+211, 58, 42, 42,138,173, 84, 42,185, 26,141,166,121,116,116,244,151,225,225,225,194,118,237,218,177,255,248,227, 15, 66, 46,151,
+131,166,105,126, 80, 80, 16, 61,118,236, 88,237,190,125,251,102, 1,248,161, 1,225,187,224,217,181, 36, 55,180,106,213,106, 9,
+ 0,100,100,100,176,106, 93, 99,102,112,112,176, 0, 0,210,210,210,150,209,180,101, 14, 0,208, 52,214, 2, 88, 88,135,105, 45,
+163,117,247, 49, 0, 1,255,164, 43, 7,184,173,123,140,209,130, 70, 38, 1,100, 84, 77, 8,150, 3,181,226, 66, 61,143,148,130,
+130,130,151,202, 77, 24, 25, 25, 69, 16, 4,113,240,238,221,187,135,164, 82,169,175,197, 98,158,218, 80, 57,235,187, 87, 98,177,
+248,180,217,108,214,149,149,149,213, 4,202, 20,183, 25,217,213,217, 78,208, 79, 86,174,140, 47, 77, 62,122,201,202,182, 73, 56,
+ 59, 59, 79, 42, 41, 41, 89, 13, 96, 74, 74, 74, 74,123, 0, 8, 14, 14,102, 1,184, 35, 18,137,186, 25,244,122,194,214,255,217,
+ 96,131, 13, 54,252, 79,132, 86, 2,128, 72,252, 39, 5,207,182,151, 17, 90,108, 0,136,143,143, 7, 0,206, 75, 20,132,168, 45,
+ 96,102,207,158, 13,119,119,247, 23,197, 11, 46, 94,140,251,111, 42,251,220,111,124,253,245,215,194,138,138,138,254,191,254,250,
+107, 79,154,166,215, 21, 20, 20,220,104,228,252, 98,154,198, 90,146, 36, 62, 35, 8, 2, 28, 14, 55,125,198,140, 25, 9, 85,223,
+ 53,255,243,207, 63,249, 67,135, 14, 85, 3,200, 1, 0, 14,135,235,201, 96,144,129, 52, 77, 87, 15,184,245, 10,194,209,128,159,
+137,205,238, 59,253,199, 31, 77, 29,134, 14,165, 4, 98, 49, 1, 0, 57,169,169,206,107,191,253,182, 91,121, 86, 22, 91,227,236,
+ 92, 90,170, 82,105,210,211,211,193,225,112, 8, 6,131,209,161,177, 10, 11, 4,130,143, 87,172,250, 70,160, 40,171,208,104, 21,
+ 74, 61,195,100,212,217,241,248,230,226, 34,105,169,144, 39, 80,127,246,213, 82,246,135, 83, 39,126,172, 82,169, 62,104,132,106,
+214,188,121,243,130, 59,117,234,228,185,127,255,126, 66, 46,151,131,162, 40, 97,187,118,237, 16, 30, 30,110,190,112,225, 2,225,
+235,235,139,208,208, 80, 92,185,114, 5,215,174, 93, 35,218,183,111,207,143,137,137,121,199,104, 52,254,208,152,184,102, 48,200,
+185, 65, 65, 65,237, 4, 2,129, 62, 48, 48, 16, 83,167, 78, 5, 77,211,232,223,191,127,168, 80, 40, 60,164, 82,169,216,105,105,
+169, 61, 27, 19,217,210,164,163, 99,171, 45, 91, 0,194, 64, 35, 83,150,116,180,246,242, 99,112, 90, 90, 90,151,242,242,114, 60,
+187, 47,116, 77, 2,243,158, 61,123, 54,165, 45, 21,211, 52,214, 14, 29, 26,245, 25, 64, 16,253,251,247,175,152, 53,107, 22,153,
+154,154,250,246,200,145, 35, 66, 51, 50, 50,209,196,201, 64,224,128, 1, 3,174,156, 56,113,194, 57, 48, 48, 80, 86, 86, 86, 86,
+243,133,155,179,195,192, 75, 49, 27, 62, 94,185, 49, 58,104, 55, 77, 84,200, 82,142, 60,108,164,109, 18,147, 38,189, 87, 44, 20,
+ 10, 71, 29, 60,120, 48,173,176,176,144, 98,177,106,180, 43, 67, 34,145,136, 3, 3, 3,103, 58, 57, 57, 73, 25, 36, 41,161, 65,
+211,141,181, 79, 27,108,176,193, 6, 27, 94, 26,199,171,196,213,241, 23,191,160, 0, 32, 54, 54,182, 38, 50,109, 84, 84, 84,189,
+ 51, 96,154,166,139,239,223,191,239,173, 86,171, 65,211,180, 53, 29,118,237, 45,154,197, 4, 65,110, 34, 73,226, 3,130, 32, 16,
+ 26, 26,246,120,195,134, 13,117,229,244,210,135,134,134, 61,102, 48,200, 22, 52, 77,131, 32,200,205, 52,109, 41,174,135,179,206,
+129,136,205,230, 44, 0, 0, 55, 55,247,172,147, 39, 79,234, 71,143, 30,141,111,191,253,150,245,249,231,159,207,167, 40,106, 86,
+ 94, 94, 94, 81, 3,229, 4,128,133, 98,177,132,191,125,251,246,192, 25, 51,102, 36, 20, 22, 22, 46, 4, 0,119,119,247,213, 0,
+ 66, 0,228,212,250, 12, 91,182,236,123, 58,117,234,212,116,169, 84,186,176, 62,206, 81, 64, 75,239,160,160,190,203,227,227,105,
+ 82,167, 35, 74, 46, 95, 86,200,138,139,141,143,100, 50,254,174, 59,119,162,190, 92,189,154,233,237,227,131,139,199,142,185,148,
+168,213, 50,185, 78,167, 45, 46, 46,166, 77, 38,211, 53, 43,234,222, 90, 34,150,240,183,126,191,249,182, 29,147, 97,145,120,121,
+ 18, 76, 39, 39,138,228,139,216, 12,138,212,181,104, 30,192, 6,208,186,177,123,196, 98,177,222, 25, 48, 96, 0,127,223,190,125,
+ 68,104,104, 40, 28, 28, 28,112,249,242,101,220,187,119, 15,229,229,229,164,209,104, 68,199,142, 29,241,205, 55,223,192,199,199,
+ 7, 21, 21, 21,200,203,203,115, 97,179,217, 98,163,209, 88,223,245,124,174, 61, 45, 88,176, 0,238,238,238, 48,153, 76, 40, 43,
+ 43,131,201,100,130, 80, 40, 4, 0, 60,121,242, 4,199,142, 29,181,166, 45, 53, 10,154,166,241,198, 27,111, 40, 9,130, 72,121,
+209,162,213, 20, 78, 79, 79,207, 63,100,178,146,193,125,251,246, 69,121,121,185,113,233,210,165,104,211,166, 13, 2, 3, 3, 27,
+ 45,167,135,135,199,116,147,201,180, 24, 0, 12, 6,195, 46, 46,151,251,254,158, 61,123,156,107,167, 8,169,182,100, 21, 75, 75,
+203,175,221, 78, 74,155, 55,125,116,239,248, 27,137,249, 6,230,240, 60,249,131,163,242, 58,202,185,144,197, 98,255,218,172, 89,
+179,239,103,207,158,237,238,228,228, 4,157, 78,247,101, 81, 81, 17,102,206,156, 9, 0, 24, 50,100, 72, 27, 38,147,121,114,242,
+228,201,240,245,245,125, 90, 86, 86,150,119,247,238,221,169,106,181, 58,241,101,175,167,149,176,113,218, 56,109,156, 54,206,151,
+134,181, 90,228, 31,138, 66, 60, 31,206, 97,219,115, 66, 43, 42, 42,138,136,141,141,165,173,168, 88,169,151,151,151, 55,143,199,
+ 3,128,210,166,150,194, 98,177,204,114,118,118,150, 46, 92,184,176,123, 96, 96,160,126,214,172, 89,137, 57, 57, 57,139,106, 31,
+211,188,121,243,149, 63,253,244, 19,210,211,211,115, 86,175, 94,125,165,180,180,180,169,121,204, 62,167,105,108,168,178,142,149,
+ 28, 59,118,172, 77,124,124,252, 7,235,215,175, 23,127,248,225,135,172,143, 63,254,120, 2,128,111, 27, 35, 97, 48, 24,234,186,
+150, 11,235,130,187,187,187,158,193, 96,212, 27, 36, 46, 10,224,113,217,236, 62,203,227,227,105,125, 78,142,122,199,119,223,217,
+109,189,117,107,137,145,166, 93, 37, 18, 9,122,116,235, 86,201,101, 48, 74,164, 69, 69, 22, 73,203,150,140,236,147, 39, 93, 52,
+108,118,193,190,125,251,228,165,165,165, 71, 26, 53,225, 17,132,194, 66,211,122,161,151,143,113,244,136,136,208,219, 55,239,165,
+218, 73, 92,200,246,237, 66,219,164,166,231,220,133,197, 98, 32, 8,162,209, 96,129,246,246,246,129,165,165,165, 80, 40, 20, 16,
+139,197,216,176, 97, 3,220,220,220,160, 86,171,145,148,148, 68,123,121,121, 17,241,241,241,240,242,242,130, 76, 38,131, 94,175,
+135, 82,169,148,234,116,186,250,114, 51, 22,147, 36, 99, 39, 73, 18,239, 17, 4,129, 22, 45,252,114,127,254,249,103,189,197, 98,
+ 65,112,112, 48, 70,142, 28,137,152,152, 24, 36, 37, 37, 85, 91,158,244,205,154, 53,207, 37, 73,162, 89,149, 86,122,105, 11, 76,
+117,106,159,130,130,130, 81, 47,249,208,144, 30, 30, 30, 19,252,253,253, 63, 24, 63,126,188,145,205,102, 67,165, 82, 85, 95, 11,
+227,224,193, 67, 42,134, 14,141,178, 63,126,252,120,189,229, 52, 24, 12,139,159, 62,125,234,174,209,104, 48,104,208,160,143,215,
+173, 91, 39, 96,179,217, 0, 0,179,217,252,156, 37,107,197,250,221,167,231, 44,254, 57,238,244, 31,223,120,172,248,252,253,222,
+ 19,102,173,140, 3,112,170,174,130,233,245,250, 44,185, 92, 62,101,222,188,121,209, 91,182,108,113, 92,180,104, 17, 44, 22, 11,
+104,154,134,201,100,170, 73, 36,110,177, 88,112,248,240, 97, 60,122,244,104,229, 11, 34,203, 6, 27,108,176,225, 31,135, 38,104,
+145,127, 34,220,241,108,217, 16, 47,138,173,255,121,100,120, 6,131,177,245,204,153, 51,237,122,246,236, 73,245,235,215, 47,244,
+212,169, 83,161, 79,159, 62, 77,172,178, 30,132,246,235,215, 47, 84, 34,145, 96,227,198,141,106, 6,131,177,245, 37,127,166,102,
+208, 43, 42, 42, 74, 0,176, 46, 38, 38,102,237,244,233,211,225,230,230, 22, 82, 88, 88,248, 63,173,179,136,195,105, 63,121,195,
+ 6, 19,211,104, 36,127, 92,183, 78,244, 93, 92,220,218,253, 7, 14, 80,111,188,241, 6, 65,211, 52, 30, 62,120,192,251,230,135,
+ 31,248,227, 70,140,200, 73,203,202, 50, 29, 61,125,218, 88,252,244,105,217, 83,153,108, 49,128,178,198,248,141, 70,227,245,140,
+140, 12,143, 30,189,222,240,188,116, 43,241,222,232, 17, 67,250, 50, 41,146,200,204,121,114,199,221,205,197,254, 98,220, 57,141,
+209,104,188,222, 24,143, 74,165,202, 54,153, 76, 78, 52, 77,139, 47, 94,188, 8,177, 88,140,242,242,114, 24,141, 70,232,245,122,
+189, 90,173,230,150,150,150, 66,171,213, 66,167,211, 65, 36, 18,225,225,195,135,197, 38,147,233, 66,125,156,102,179,121, 50,135,
+195,249,154,201,100,178, 89, 44, 86,193,157, 59,119,160, 80, 40,154, 59, 56, 56,124,107, 50,153, 80, 80, 80,128,248,248,248, 79,
+ 69, 34, 81, 14, 0,112,185, 92,176,217, 28,103,157, 78,103, 2,240,244,101,175, 57, 77,211, 47,125,191,220,220,220,124,120, 60,
+222,242,207, 62, 91, 16,220,182,109, 59,200,100, 50, 88, 44, 22, 8, 4, 2,168,213,106,136, 68, 34,116,237,218, 53,123,249,242,
+229,133, 52,141,105, 13,136, 65, 70,213,253,193,244,233,211, 5, 34,145, 8,249,249,249, 8, 10, 10,170, 17, 90,133,178,210,135,
+ 87,111, 39,166,206,155, 49,166,215,222, 99,113, 41,167, 47,222, 73, 25, 49,168, 91, 91,130,160,155, 55, 84, 70,169, 84, 42,163,
+ 40,106,214,244,233,211,191, 14, 12, 12,108, 65,211, 52, 2, 2, 2, 48, 96,192, 0,156, 60,121, 18,233,233,233, 80,169, 84,230,
+ 27, 55,110,252, 94, 88, 88,248,167,173, 11,183,193, 6, 27,108,248, 91,241, 23,223,172,231, 44, 90,255, 75, 72,165, 82, 89,106,
+106,234,169,187,119,239, 70,141, 29, 59, 22, 23, 47, 94,156, 4, 96, 30, 0,112, 56,156, 73, 99,199,142,197,221,187,119,145,154,
+154,122, 74, 42,149,202, 94,197,111,178,217,108,173, 94,255,204, 56,197,229,114,185, 77, 60,189,121,213,146, 33, 0, 52,111,224,
+179,250, 77, 35, 20,229, 30, 54,104, 16, 85,126,239,158, 98,251,205,155, 95, 71, 71, 71, 83,221,187,119, 39,140, 6, 3,204, 22,
+ 11,252,252,252,136,126,253,251, 11,118, 70, 71, 59,153, 85,170,248, 21,159,125,118,121,219,228,201,149, 25, 85,126, 96,141, 65,
+167,211,253,240,193,204, 41,253,227, 46, 94,246, 12, 9,106,233,116,234, 76, 92,130,179,179, 61, 63,208,223, 95, 80, 90, 94,102,
+ 94,244,249,167,148, 78,167,251,177, 49, 30,141, 70,115,248,220,185,115, 35,188,189,189,197,137,137,137,208,235,245, 48,155,205,
+232,215,175, 31,104,154,230, 0,176, 80, 20,133,212,212, 84, 24, 12, 6,105, 70, 70, 70, 65,102,102, 38, 7,192,154, 70,202,151,
+171,211,233,144,146,242,108,213,206,203,203, 43, 34, 50, 50, 18, 38,147, 9,131, 6, 13,194,209,163, 71, 35, 82, 82, 82,190,171,
+173,249,254,219,123, 94,101, 33, 11,246,240,240,136,169,250,200, 42, 39,120, 79, 79,207, 80, 63, 63,191, 45,107,214,172, 97,121,
+121,121,129,166,105, 56, 58, 58, 64,173, 86,163,164,164, 20, 33, 33, 33,240,246,246,198,154, 53,107, 0,224,247,134, 44,110, 22,
+139, 5,133,133,133,200,206,206, 70, 86, 86, 22,188,189,189, 65, 16, 4,148, 74, 37, 76,166,103, 57,185,249, 74,197,241,159,118,
+254,217,231,192,150,197,173, 59,135, 5,248,220, 76, 72,150,190, 51, 42,130, 31,224,235, 19, 40, 75, 92, 74, 2, 75,235, 77,186,
+ 92, 80, 80,144, 89, 80, 80, 48, 86, 42,149,178, 42, 42, 42,194, 35, 34, 34, 54,246,239,223, 31, 9, 9, 9,184,124,249,242, 56,
+ 14,135, 35, 53, 24, 12, 38, 55, 55,183,105, 4, 65,136, 12, 6,195,222,210,210,210, 66, 91,127,104,131, 13, 54,216,240,202, 81,
+237,163,133, 90,127,155,102,209, 10, 14, 14, 22,228,228,228,188,219,188,121,115, 54, 0,240,120,188, 16, 63, 63,191,249, 89, 89,
+ 89,202,166,150, 70,173, 86,239,143,142,142, 30,240,253,247,223,179,134, 12, 25,210, 50, 38, 38,166, 19, 0, 12, 25, 50,164,165,
+157,157, 29,162,163,163, 13,106,181,250,149,197, 68, 50, 26,141, 61, 59,118,236,136,178,178, 50,228,228,228, 52,105, 9,229,207,
+ 63,255,228,227,153, 95, 86,131,159, 53, 4,147, 94,239,232,224,233, 73, 62,141,139, 51,148, 41, 20,238, 61,123,245, 34,140, 6,
+ 3, 72,146, 68,105,105, 41,242,242,242, 96,239,224, 64,164,102,100, 8,127, 89,176,224,207,230,109,219,178,205,122,189,115, 19,
+138,169, 42,145, 22,191,247,209,172, 15, 15,239,221,251,187,184, 66,161,120,196,227,241,117, 28, 14,203,109,246, 71, 31,153,203,
+202,202, 38, 2,168,180,130,103,205,222,189,123, 7, 13, 26, 52,232,129,143,143,143, 68, 38,147,185, 85, 84, 84,152,203,202,202,
+ 24,120,230,107, 69, 0, 64, 92, 92, 28, 20, 10,133,201,108, 54,199,227, 89, 44, 44,189,181, 5,109,214,172,153,125,120,120,120,
+111,177, 88, 12,185, 92, 14,103,103,103,180,107,215,174, 55,131,193,248, 53, 55, 55, 87,254, 42, 91,253,217,179,103,237,104,154,
+238, 66,211, 52, 6, 13, 26,100,213, 57,102,179,249,253,200,200, 72, 22, 65, 16,208,104,212,224,114,121, 16, 8,132,176,179, 19,
+ 33, 48,176, 21, 10, 10, 10, 48,112,224, 64,253,163, 71,143, 54, 21, 22, 22,238,111,132, 11, 5, 5, 5,144,201,100,200,203,203,
+ 67, 73, 73, 9, 0,160,164,164,164,198, 57,255, 85, 64, 46,151, 15,239,218,181,235, 39, 51,103,206,132,201,100,194,240,225,195,
+145,159,159,255, 93,118,118,246, 62, 15, 15,143, 9,239,191,255,190,216,217,217, 25,159,124,242, 9, 15,192, 50, 91,127,104,131,
+ 13, 54,216,240,202,241,162,143,214, 95, 45, 90, 13,173,137,186,185,185,245, 32, 8,226, 75,141, 70,195,174, 94,146, 33, 8,130,
+ 45, 22,139,143,106, 52,154,213,133,133,133, 77,114,138,171,168,168, 80, 60,126,252,248,232,245,235,215,199,140, 26, 53, 10,103,
+207,158,157, 8, 0,163, 70,141,194,245,235,215,241,248,241,227,163, 21, 21, 21,175, 36, 1,169,167,167,231,224, 94,189,122,141,
+234,216,177, 35, 98, 99, 99, 97, 54,155,175, 53,229,252,218, 59, 12, 81,199,174,195,234,207,172, 34, 99, 48, 64, 16, 68,141, 53,
+163, 68, 38, 67,122, 90, 26,202,202,203,161,211,106,161, 82,171,205,129,190,190, 26,185, 94,207, 36,128,166,174,125,229,222,189,
+125, 35, 79,173, 82, 73,156, 29,157, 52,124, 62, 7, 21, 10, 57,235,206,237, 27,149, 0, 30, 89,201,161,167,105,186,215,201,147,
+ 39, 23, 51, 24,140,177, 66,161, 16, 31,124,240, 1,163,119,239,222, 96,177, 88,208,233,116,168,168,168, 64,116,116,180,204,108,
+ 54,183,168, 58, 71,200,231,243,127, 99, 48, 24, 79,148, 74,229,151,141,254,128, 94, 63, 36, 42, 42,138,210,235,245, 88,177, 98,
+ 5,150, 44, 89,130, 65,131, 6, 81,183,111,223, 30, 2, 96,239,171,106,241, 22,139, 5, 17, 17, 17,181,157,225, 83,172, 57,143,
+201,100,134,250,251,251, 67, 38,147, 65, 38,147, 65, 44, 22,195,195,195, 3,110,110,110,248,238,187,239,232,141, 27, 55,158, 50,
+ 24, 12,155, 74, 74, 74,138,173, 41, 67, 86, 86, 86,141,101, 80,171,213, 66,165, 82, 33, 63, 63,191,102,233, 80, 35, 16, 13,154,
+245,222,208,182, 42,141, 70,125,243, 97, 70,222,151, 31, 79,120, 67,165,209,168, 51,178,243,210,129, 31, 44, 86,180,239,105, 19,
+ 39, 78,156, 54,102,204, 24, 84, 86, 86,226,250,245,235,232,214,173, 27,214,174, 93,235, 30, 31, 31, 63,175, 99,199,142, 96, 50,
+153, 29,185, 64, 0, 0, 0, 32, 0, 73, 68, 65, 84,184,120,241, 34, 76, 38, 83,190,173, 47,180,193, 6, 27,254,201,120, 77,253,
+179, 26, 68,131, 22, 45,111,111,111, 7,179,217,252,105,100,100,100,196,136, 17, 35, 48,112,224,192,231,190,223,187,119,175,221,
+161, 67,135, 86,255,240,195, 15,131, 12, 6,195,154,166, 44,245, 89, 44,150,195,123,247,238, 29,242,198, 27,111,240,251,244,233,
+227, 7, 0, 28, 14, 71,191,119,239, 94,181,197, 98, 57,252, 18,117,169, 14,196, 88, 12, 0, 30, 30, 30,109, 40,138, 26, 53,120,
+240,224, 54,239,189,247, 30,146,146,146, 16, 29, 29,157, 25, 24, 24,120,165,184,184, 73,254,213, 57,141,236, 58, 92,221,152,117,
+139,193,102,151, 86, 20, 21, 57, 8,125,124,152,142,118,118,133,177,177,177,222,253,251,247, 39,242,243,243, 81, 94, 94, 14,173,
+ 86,139,219,183,111, 91, 40, 32,151,114,116, 36,114,175, 95, 39, 24,108,118, 41,158,223,201,215, 40,188,221, 29, 3,190,250,124,
+ 70,115,173, 78,219, 90, 46,151,155, 40, 38,147,233,229,230,144,159,246,168, 73, 43,113, 58, 62,159, 31, 14,128,178, 88, 44,106,
+ 39, 39, 39,254,153, 51,103,192,102,179, 65, 16, 4,194,194,194,192,229,114, 89, 52, 77,231, 1,128,157,157, 29,123,235,214,173,
+246, 19, 38, 76,184,220, 24,113,251,246,237,153, 28, 14,103, 88, 96, 96, 32,174, 95,191,142,196,196,196,220,235,215,175, 55,107,
+223,190, 61,124,124,124,134,185,187,187, 31, 72, 72, 72, 48,190,138,134,253,108,199,106,211,157,225,205,102,179,133, 32, 8,144,
+ 36, 9,139,197, 2,153, 76,134, 22, 45, 90,224,231,159,127,198,134, 13, 27, 86, 20, 22, 22, 30,107, 2,151, 89,161, 80, 64, 32,
+ 16, 32, 49, 49, 81, 23, 25, 25,201, 33, 73, 18,153,153,153, 53, 66, 75,226,226, 20,210,173, 99,104,208,138,245,187, 79, 11, 56,
+ 28,206,192,222,225,193,201, 25,185, 79,104,154,104,116,217, 56, 56, 56,152,213,162, 69,139,137, 99,198,140, 65, 86, 86, 22, 86,
+175, 94, 93, 82, 88, 88, 24,119,250,244,233, 55,103,206,156,201,232,214,173, 27, 74, 75, 75,177,115,231, 78,211,157, 59,119,118,
+ 20, 21, 21,237,182,117,227, 54,216, 96,131, 13,255, 16,161,229,237,237, 61,134,197, 98,125,242,214, 91,111, 49, 90,181,106,133,
+226,226, 98,136, 68, 34, 35, 65, 16, 76, 0,112,112,112, 48,242,120, 60,204,152, 49, 3,109,219,182,237,177, 96,193,130,255,199,
+222,121,135, 71, 81,181, 81,252,204,246,205,166,151, 13, 41, 36, 1, 2, 36,129, 80,165,247, 94,131,116, 65,138,130, 82, 68, 20,
+145, 34,160, 2,130, 10,168, 52,165,131, 74,147, 46, 45, 32,144, 40, 4, 34, 1, 37, 64, 66, 66, 8, 36,144,186,155,222, 55,219,
+166,220,239,143, 20, 19, 72,217, 77,176,192, 55,191,231,153,103,118,103,103,206,220, 41,123,231,204,123, 91,119,145, 72,180, 85,
+165, 82,237, 51,101,199, 25, 25, 25,197, 2,129,224,248,156, 57,115,214,222,185,115,187, 9, 0,252,241,199, 31,143, 85, 42,213,
+146,140,140,140, 98, 51,143,163,172, 83, 76, 74, 38,147,223,108,222,188,249,147, 14, 29, 58,216,140, 26, 53, 10, 74,165, 18,225,
+225,225, 88,183,110,221, 67,131,193,176, 60, 36, 36,132,249,167, 79, 50,163,215,167,221, 58,117,202,186,207,164, 73, 54,243,134,
+ 15,255,230,221, 57,115, 54,124,250,233,167, 34, 95, 95, 95,170,184,184, 24, 55,111,222, 36, 39, 78,156,160,127, 92,189,122, 19,
+ 44, 45,197, 97, 39, 78, 72, 13, 6, 67,162,153,145,187,222, 61,122,245,244,253,102,195,183,208,105,139,112,243,250, 57,228,230,
+102, 98,231,174,159,125,221,221, 73,239,212,212,212, 16, 83,181, 40,138,242, 9, 10, 10,114, 38,132, 64, 42,149, 98,213,170, 85,
+112,115,115,131,141,141, 13, 10, 11, 11,241,225,135, 31,218,126,240,193, 7,182, 0, 16, 21, 21, 85,222, 61, 67,109,168, 84,170,
+110,179,103,207,182,102, 24, 6, 23, 46, 92, 48, 80, 20,245, 73,112,112,240,247,173, 91,183,150,246,236,217,211,122,255,254,253,
+221, 1, 92,121, 94, 70,171,142,219, 61,186,116,233, 82,199,215, 94,123,141,136,197, 98, 42, 47, 47, 15,118,118,118,216,186,117,
+171, 70,173, 86,159, 51, 83,107,213,146, 37, 75,150,151,126,222,251,201, 39,159,188,189,118,237, 90,101, 90, 90, 90,121, 84, 51,
+ 35, 43,231,183,110,195,223, 99,179,243,242, 13, 63,108, 92, 60,206, 66, 46,147,126,178,246,135, 43,180, 16, 55,106,189,175, 24,
+ 70,170, 80, 40,164,132, 16, 28, 63,126, 28,137,137,137,211,179,179,179,211, 88,150,253,121,209,162, 69, 11,125,125,125, 27, 63,
+120,240, 32,177,176,176,240,171,140,140,140, 39,124,118,199,195,195,195,243,183, 81, 86, 9,190,172,245,225, 57,148, 20, 39, 86,
+111,180, 88,150,157,125,241,226, 69, 33,199,113,216,181,107, 23,110,221,186, 69, 20, 10,197, 39, 10,133, 98,139,133,133, 5,171,
+213,106,103,205,152, 49, 99,242,138, 21, 43, 4, 61,123,246, 68, 88, 88,152,160, 73,147, 38,111, 0,168,104,180, 6,160,134,190,
+ 54,242,243,243,255, 76, 79, 79,107, 82,161,131,202, 38, 50,153,252,207, 90, 14,230,105,205,167, 59,197,236,188,106,213, 42,141,
+171,171,171,225,222,189,123,216,177, 99, 7,119,235,214,173,203, 82,169,116,167, 90,173,214,155,168,249, 60, 40,215,148, 50, 76,
+248,129,133, 11, 91,188, 50,114, 36,247,246,130, 5, 69, 18, 11,139,247,191,249,246,219,197,121,133,133,110,160, 40,226,104,107,
+155,184,107,213,170, 53, 67, 94,125,181, 40, 42, 36, 68,126, 39, 40, 72,172,164,233,187,230,164, 51, 53, 53, 53,228,202,149,107,
+216,187,123, 3,140, 70, 61,212,169, 37, 62, 45, 43, 59, 31,181,152,172,103, 52, 25,134,201, 31, 59,118,172, 4,128,197,148, 41,
+ 83,164, 25, 25, 25,104,218,180, 41, 0,160,160,160, 0,231,206,157,131,159,159, 31, 0, 32, 50, 50,178,252,115,109,233,180,180,
+180,124,181,123,247,238, 72, 76, 76, 68, 84, 84,212,175,106,181, 58, 27,192,175,201,201,201,195, 58,118,236,136,147, 39, 79,142,
+168,193,104,153,117,141, 76, 52, 90,207,104, 90, 88, 88, 44,249,249,231,159,167, 95,191,126,253,181,133, 11, 23,138,251,247,239,
+ 15, 0, 40, 44, 44, 44, 6,192,154,163,169,213,106,119, 2, 40,111, 57,155,144,144,112, 96,193,130, 5, 87,231,207,159,175, 44,
+ 75, 95,102,244,153,176, 76, 32,204,191,207,244, 79,187,117,244,247,253, 98,243,193,139, 73,201,233, 7,243,239,159,206, 55,229,
+216, 9, 33,160,105, 26, 28,199,193,193,193, 65,147,157,157,141,140,140,140, 39, 25, 25, 25,115,226,226,226,204, 58,246,231,121,
+207,243,154,188, 38,175,201,107,254,159, 98,122,207,240,132, 16,134,227, 56, 92,185,114, 5, 63,255,252, 51,107, 52, 26,103,170,
+213,234,138,189, 85,127, 27, 30, 30, 30, 52,118,236,216,125, 15, 30, 60, 16, 70, 71, 71,131, 16,194,154,147, 26,157, 78, 71, 83,
+212,179,203,234,123,148,123,247,238, 69, 90, 90,154, 49, 57, 57, 57,152, 97,152,147,245,108,189, 88,239, 86,135,123, 1,253,235,
+ 6, 67,240,138, 30, 61, 6, 46, 15, 10,146,189,189,108,153,254,205,105,211, 22,177, 6, 3, 45,148, 72, 56,169,165,165,128,149,
+201,196, 81, 33, 33,242,205,239,188,227,160,213,235, 47, 28, 52,163,130,121, 89, 68,171, 79,159,158,120,243,237,249,208, 86,136,
+104,133,253, 25, 11,189, 17,102, 69,180,244,122,189,191, 90,173,134, 92, 46, 79, 2,224, 50,117,234, 84,112, 28, 7,173, 86,139,
+194,194, 66,168, 84,170,252,105,211,166,177,165,230, 73, 52,102,204, 24, 27, 83,116,189,189,189,221,196, 98, 49, 46, 92,184, 0,
+177, 88,124, 14, 0,196, 98,241,185,160,160,160, 97, 19, 39, 78,132,187,187,187,119,124,124, 60,133, 90,234,167, 57,251,143, 60,
+ 74,128,230,160,208,172, 36, 4,135,102, 74,255,145, 17, 20,240,176,180,215,248,251,237,219,183, 7, 76,172,151, 85,145,210,198,
+ 29,155,104,154, 62,182,120,241,226, 57,157, 59,119, 30,180, 98,197, 10, 10,165, 93, 53,212,147,216,212,212,212, 94, 75,151, 46,
+189, 72, 8,169,100,250, 51,178,114,126,235, 26, 48,151,228,229,229,223,201,188,127, 38,210,172,136, 41,195,212,171, 59, 11, 30,
+ 30, 30, 30,158,231, 22,213,122,134,106,141, 22, 69, 81,187,122,247,238, 61, 19,128,144,162,168, 29, 42,149,234,153,204, 95,173,
+ 86,199,186,185,185,125,221,184,113,227, 89, 0, 8, 69, 81,187,204, 76, 84, 58, 33, 88, 39, 16, 80,139, 75,204, 93,157, 58,168,
+ 44, 27,150,100, 49, 0, 74, 32, 16,238,187,125,251,246,178,164,164,164, 76, 19, 35, 16, 53,242, 60, 90, 29, 2,192, 33,224,201,
+132,196,196,139, 11, 90,181, 26, 48,228,157,119,208,102,200, 16, 27, 55, 47, 47, 86,107, 52,114,145,161,161,212,245,227,199, 37,
+119,130,130,196, 90,189,254,194, 73, 32,201,220,116,166,166,166,134,252,118, 57,228,210,184, 49,195, 6,121, 55,118, 43, 49, 13,
+ 79, 84,200,202,201,191,100,142,201,122,202,244,142,220,186,117,235, 25,137, 68, 34,170, 56,148,141,209,104,204,209,235,245,254,
+ 0,144,155,155,235,182,107,215,174,195, 2,129, 32,177, 54,189,232,232,232,211,203,151, 47, 31,147,144,144,112, 41, 57, 57, 57,
+ 1, 0,146,146,146, 18,104,154,222,167, 86,171,199, 36, 38, 38,158,128, 9,141, 0, 8,208, 60, 42,244, 88,107, 0,240,239, 49,
+ 30, 81,161,199,228, 0, 90,251,247, 24, 15, 0,168,235, 88,134, 21, 41,237, 6,225,147,176,176,176,159, 6, 13, 26, 52, 3,245,
+232,211,235,105,179,101, 52, 26,189,158, 94, 88, 22,217, 50, 71,200, 96, 48,208, 90,173,150, 97, 89, 86,100, 52, 26,137,193, 96,
+160,249,124,142,167, 22,248,177, 47,121, 94, 88, 8, 33, 29, 1, 40,203,178,205,210,185,242,169,207, 6,148, 14, 23, 88,150, 85,
+150,126,207,164, 40,234,207, 10, 26,229,203, 77,216, 22, 0,178, 0, 68, 80, 20, 85, 93, 16,100, 87,117,223,171, 53, 90, 42,149,
+234, 4, 76, 24, 52,218,212,245,106, 96,105,233, 56,113, 64,221,199, 97, 43,215, 96, 89, 54, 61, 41, 41,169,222, 23, 84, 32, 16,
+ 60, 25, 49, 98,132, 89,235,215,182,206, 17, 32,241, 61,189,126,127,224,119,223,181,187,176, 99,135, 59,203, 48,142, 20, 64,132,
+ 82,105,182,193, 96, 72, 80,210,244, 93,115, 35, 89,149,162, 49,143, 83, 7,199, 63, 78, 69,179,102,205,200,163, 71,143,158, 71,
+166,122, 87,163,209,120,212,118, 11, 20, 23, 23,247, 52,209, 12, 30, 74, 77, 77, 61, 84,133, 97, 63,172, 86,171, 15,155,241,164,
+120, 88,106,170, 4, 28,197,141,243,239, 49,254, 56, 0,174,108, 80,233,231, 73, 90, 90,218, 3,148,246,243,246, 95, 35, 49, 49,
+ 81, 79, 81,212,129,117,235,214, 77,185,115,231,206, 17,149, 74,165,231,179, 98, 30, 30,158,151,217,100, 81, 20, 21, 88,250, 61,
+160, 52, 40, 20,248,244,231,178,117,202,214,171,184, 78,153,198,211,203,107,218, 22, 0,150, 44, 89,178,108,205,154, 53, 10, 0,
+166, 14,198, 92,231, 65,165,255, 46,210,255, 35, 26, 21, 77,193,238,191,227, 64,191, 3, 12, 96,152, 27, 96, 42,212,201,167,159,
+111, 32,226,209,163, 71, 47,245, 91,107,217,160,210, 21,104,245,255,154,249, 36, 36, 36,108,245,244,244,220,169, 82,169, 24,240,
+240,152,240,188,226, 79, 1,207, 11,138,178, 42, 99, 84,141, 41, 11,168,233,247, 74, 47,238, 85,172, 87,213,119,138,162, 2,215,
+172, 89, 19, 96, 70,122,203, 35, 90, 2,254,218,241,240,188,216,252, 27, 45,105,121,120,120,120, 94,138, 55,143,167,162, 88,101,
+230,235,233,239, 75,150, 44, 89,134,154, 75,156, 92, 81, 18,197,114, 45,253, 94, 94, 95,139, 66, 73,203,129,170, 48,167, 53,193,
+128, 58, 28, 95, 48,175,201,107,242,154,188, 38,175,201,107,242,154,255,119,154,181,105, 7, 87, 97,136,134, 87, 87,212, 87, 83,
+ 49,226,211,159,107,219,182,182,117, 41,138,170,174,155,159,178,162,194,167,231,127, 59, 3,120, 77, 94,147,215,228, 53,121, 77,
+ 94,147,215,228, 53,235, 3, 33,164, 35, 33,100, 56, 74,138,191, 9, 33,100, 56, 33,100,200,146, 37, 75,150,150, 45, 91,178,100,
+201, 82, 66, 72,255,178,245, 74,215, 41,223,166,108,217,211,243,167,151,213,180,110, 13, 73,156,249,212,231,242,239,255,149, 58,
+ 90, 60, 60, 60, 60, 60, 60, 60, 60, 85, 82,214, 98,176, 66,180, 41, 19, 64,228,154, 53,107,114, 43,212,157,202, 4,112, 23, 64,
+219,210,245, 50, 75, 77, 90,197,186, 85,134,210,239,134, 42,214, 49,152,178,110, 53,236,170,230, 51,111,180,170,163,173,139, 96,
+181,103, 67,231, 14,165, 23, 0,164,116, 16, 96,174,180,191, 34, 82,214,113, 17,199,129, 16, 2, 85, 70, 94,120,100, 6, 62,173,
+235,254,124,220,224,224, 44,151,111,226, 8,233, 81,186, 40, 36, 63, 91, 63, 63,170, 0,121,166,106,248, 53, 64, 11,185, 0,139,
+ 56,130, 54, 0, 32,160, 16,161,227,240,117, 76,186,249,253, 73, 85,117,159,251, 43, 49, 83,106,161,152, 96,107,103,223, 44, 55,
+ 55,235,161, 81,167, 63, 22,157,137,157,168, 67, 5, 91,111,123,116,225, 8,150, 1, 16,136, 5, 88,255, 48,199,228,150, 28, 60,
+ 60, 60, 60,245,141,142,212,171, 95, 60,138,162,216, 42, 52,169,122,106,242, 13, 21, 76, 48, 91, 85, 44,254,163,138,101,127,254,
+151,210,109,150,209,106,169,196, 59,160,176, 18, 0, 1,193,103,209,153,216,110,214,246,174, 24, 32, 23, 10,247, 0, 16,234,140,
+236, 2,194,225,106,149, 39, 83,128, 94,114,137,112, 61, 0, 78,199,178,111, 69,171, 77,175, 47,230,239,142, 33, 34, 78,112,128,
+ 35, 68,204,114,100, 31, 8, 2,173, 36,248,253, 70, 42,116,230,164,213,179,161,115,135, 83,127,168, 7, 93,222, 62, 15,157,219,
+ 52, 5, 97, 25,128,163,161,232,185, 8,191,110,156,138,206, 45, 60, 65, 56, 26,224, 24, 88, 13,253, 6, 67, 91,217,146,200,140,
+186,141,131,237,227, 6, 7, 47, 39,231,123,187,119,239,113,113,243,110, 73,113,140, 17, 15,254,184, 52,249,131,197,203,251,249,
+ 35,191,149, 41,102,171,141, 43,222,246,108,228,187,104,254,202, 13, 66, 87, 55, 15, 75,142,214, 51,105, 79,238,183,255,246,171,
+229, 39, 36,130,196,245, 17,106,236, 49,245, 94,110,169,196, 44,145, 76, 58,222, 66,110,217,172,184,184,240, 17,107,164,143, 9,
+196,162, 33, 95,127,179,169, 93,159,129,195,172,216,194, 52, 1,205,161,229,209, 35,135,189,190,219,186,109,216, 61, 53,251, 42,
+ 0,206,156, 99,230, 8, 22,199,238,159, 57, 76, 44, 18, 82, 45,166,239, 22, 2, 76,157,140, 86, 11,103,188, 78, 17,212,218,189,
+ 4,161,112,237,126, 6, 14,213,101, 31,126,206,248,158, 34,240, 1,133,227, 20,193,225,232, 76,100,240, 89, 30, 15,207,203,133,
+ 64, 32,184,204,113, 92,223,231,108, 12,186, 16, 66,110,240,103,247,255, 27,243, 34, 90, 20, 62,143,138, 75,182, 7,107,132,191,
+143,247,106,192, 60,163, 37, 23, 10,247,253,249, 48,221, 5,140, 17,187,191,152,115,196, 64, 3, 12,109, 4,203,208, 96, 25, 26,
+ 12, 99, 4, 75,211, 32,180, 30,203,127,184, 12, 24, 10,209,161, 85,243,125, 0,235,106,234, 62,196, 68,112, 32, 60,244,146, 3,
+101,200,199,161,237,107,222, 75,206, 44,122, 47, 56, 66,149,213,210, 89,187, 52, 58, 3, 63,154, 99, 8, 46,239,152,135,131, 39,
+207,165,108,254, 94, 19,195, 17, 2, 7, 27, 11,223,201, 1, 81, 30,251, 79, 95, 78,222,180, 79, 23, 3, 0,182,150, 82,223, 55,
+ 34, 30,122,214,231, 34, 56,203,229,155,118,110,251,206,197,213,209,130, 98,174,175, 5,195,178,240,240, 26, 46, 92, 58,119,178,
+235,231, 27,247,108, 68,129,254,205,154,182,247,117, 70,203, 70,141, 91, 44,216,119,238,186,167,166, 32,195,112,233,167,101,113,
+208,131,118,113,111, 33, 94,189,102,131,240,227,143,230,125,104, 96, 83,110, 62,200, 64,116,109,121, 77, 11,103,156, 94,179,246,
+155, 54,253,134, 6, 88,113, 69,153, 66,157,166,200,103,247, 15,123, 86,250,181,233,164,232,217,170,161, 36,227,216,108, 74, 91,
+152, 3,163, 64, 46,235,231, 63,192, 70, 59,101, 34,189,123,239,193,185,209, 25,248,214,156, 99,102,201, 95,247, 30,199,213,189,
+215,117,138,160,231,157, 27,151,103,177,170, 63, 65, 88, 26, 96,141,229,115,176, 52, 8, 87, 50,239, 60,251, 7, 0,117, 51, 90,
+ 2,130, 65,193,161,127,186,166,167,169, 59,110,252,230,203,165,228,207, 63,127, 1,139, 3,247,115, 16, 98,174,193, 4,224,211,
+196, 81,120,145,102,161, 79,206, 99,125,202, 22,246,243,145,117,115,181,162,250, 39,229, 83, 87,175,197,105, 67,248,172,137,135,
+231, 95,137,152, 48,132, 16,209,115,214, 28, 70, 8, 57, 95, 79,153, 69, 0,222, 46,253,188, 7,192,215,207, 33,105, 13, 1,184,
+148,126, 78, 3,144,194,223, 1,245,226,233,202,239,117,238, 71, 75, 14,194, 1,199, 71, 1,128,133,185,169, 32,128, 28,148, 16,
+160, 53, 24, 57,116, 32,156,156, 93, 0,186, 24, 48, 22, 3,180, 22,160, 53, 0,173, 69,150, 58, 17, 48,106,128,248, 95,192, 16,
+ 34, 51,251,112,245,249, 64,236, 49,244,111,239, 9,165,173, 28,243, 70,182,116,218,117, 33,118,207,158, 75, 15, 6, 68,103, 96,
+130, 73,105, 37, 4,157, 91, 55,195,230, 61,154,152,179,183, 51, 7, 3,192,176,182,142, 23, 58,183,244,242,216,180, 79, 23,115,
+ 62, 50,119, 8, 0, 12,241,183,249,165,147,175,171, 39, 87,143,238,105, 56, 66,122,186, 53,106, 70,177,119,118,130, 43, 72, 65,
+ 65,129, 22, 41, 79,246,195,222,253, 21, 1,203,161,119,109,219, 91, 8,177,228,253,143,215,137,139, 11,210, 13,156, 49,147, 85,
+ 10,115,133, 34, 41, 71, 33, 53, 68, 95,196,229,177,243,103, 78,101, 22,124,250,197, 18, 0,147,107,210,105,233,140,185,235,215,
+111,106,221,189,131,159,115,218,137,121, 84, 81,110, 58, 24,161, 66, 54,178,107,119,216, 53,111,201,165, 95, 89, 79, 73,189, 7,
+192,206,209, 27,169,215,127, 66,194,141,159,169, 30,237,199,200,126, 60, 36,153, 2, 24,171, 52, 90,205,156,208, 99,112,175, 78,
+ 71,188, 61,221, 92, 9,225,192,113, 4,132, 99, 81,164,163,177,244,104, 60, 88,150,197,216,193, 61,250, 91, 74, 41,194,113, 28,
+ 8,225,144,156,150, 93,252,219,205,152,254,241,185,184,105, 74,164,170,109,151,190, 61, 34,194,111,248,209,177,103,209, 97,242,
+154, 24, 10, 8,173,112,207,245,184,125,241, 71, 63,224,135,186,123, 57, 10,108,194,133,181,240,236, 53, 83,184,243,208, 5,101,
+126,102,234, 27, 39,246,111, 27,183,125,231,206,131, 49, 25,152,109,142,201,250,160,151, 52,116,227,111, 5,142, 93,189, 45, 51,
+147, 43,196, 41,155,216, 11, 6,239, 56, 31,253,126,216,170,206,126, 31,159, 35,121, 87,227,116,145,124,190,197,195,243,207, 66,
+ 8,121,238,102, 43, 49, 49, 81, 85, 31,179,229,238,238,222, 43, 53, 53,245,171,178,218, 42, 20, 69,125,213,168, 81,163,229,127,
+189,168, 86,122,215,203,103, 89,118,114,106,106,234,213,154, 52,135, 15, 31,238,118,238,220,185,198, 21, 52, 27, 3,104, 92,213,
+186,118,118,118,108,183,110,221, 18,206,157, 59,167,226,239,144, 58, 25, 46,179,141, 86, 76,210,177,121,237,245,234, 34, 0,136,
+ 49, 97,253, 74, 69,126, 58,154, 93,187,119,229,212,181,254,141, 28, 80,168, 49,224,210,173, 4,176, 44, 13,150, 97, 74, 35, 91,
+ 12, 88,134,198,224,182, 78,232,166,155,141,111, 3, 31,128, 97,185, 53, 53,105, 62,141,145,112,175,183, 27,240,218, 81,142, 35,
+ 82,153, 88,144,239,227,225,232,188, 96,108, 91,193,188,145,254,208, 26,153,215,126,186, 18,247,219,253, 12,236, 54, 73,147,123,
+182,123, 34, 82,213, 50,150,169,245,216,107,136, 70,117, 30,208,167,167, 13,209,231,131,206,138, 71, 97, 49,141,248,108, 26,105,
+186, 60,200, 40,181, 73,154, 28, 65,155,134,238,174,138,223,143,124,244,196, 81, 88, 32,114, 22, 50, 18,169,128, 1,203, 17, 33,
+201,139,214, 59,248, 13, 20,151,213,219,170, 41,157, 22, 10,235,169,189, 6, 13,183, 77,250,105, 38,101,225, 51, 24,206,237, 61,
+240,228,234, 94,100,220, 10, 68,182, 42,129,178,209,229,161,129, 99, 83, 12,157, 60, 1, 95, 79,232,136,194,130, 66, 8,213,113,
+182, 82,177,204, 14, 48, 86,169, 73, 88, 76, 94,191,238, 11, 87,145, 80, 80,114, 62,203, 38,150,134, 86,175, 7, 88, 6,114, 17,
+ 7,138,148,253, 70,131,165,141,138, 54, 99, 62,154, 3,176, 55,107, 59,246,251, 25, 56,212, 82,137,158,224,104, 63, 66,107, 65,
+ 1,161,209,153,127,153,159, 22,206,120,253,149,193,211,122, 18, 10,215,234,114,141, 90, 57, 34,160, 67, 99, 43, 75,203,130, 24,
+164, 28,127, 15,113,144,147, 6,221,223,198,235,211,231, 42,118,237,218, 53, 2, 32,239,160,114, 29,181,114, 77,191, 6,194, 89,
+ 52,139,229, 0,160,165,201, 94,107, 41, 53,125,253,225, 48, 71, 8,255, 26,225,161, 44,146, 21,151,205,229, 26, 47,127,242,160,
+203,130,192, 62,173,239,244, 73,166, 40, 89, 82,200, 35,125,190, 57,247,146,153,240,154,188,230,223,174,105, 99, 99,211,164, 81,
+163, 70,203,105,154,238, 37,145, 72, 26, 24,141, 70,112, 28,151, 38,149, 74,175, 37, 36, 36,172, 42, 40, 40,120,252, 95, 59,246,
+136,136, 8,115,204, 86,173,154, 98,177, 24, 15, 30, 60,120,100,134,217, 10,126,106,251, 3,161,161,161, 56,122,244, 40, 0, 32,
+ 54, 54, 22,205,155, 55,183,172,106,195, 39, 79,158, 88,246,233,211,231, 0, 0,143,154, 52, 35, 35, 35,155,156, 61,123, 22,199,
+143, 31, 7, 0, 60,120,240, 0, 62, 62, 62, 85, 38, 38, 52, 52, 84, 56,105,210,164, 38, 0, 84,255,192, 53,122, 25, 76, 86,197,
+249, 95, 70, 43, 48, 48,144, 4, 4, 4, 80, 79,127,174,130,120, 79,123,105,123,232, 88, 0,136, 55, 55, 5,247,211,177,110,243,
+254,139, 67,126, 61,190,181,151, 92, 34,192,138,221, 11,146, 51,115, 10,187,136,168,146,226, 23,134, 64, 96,111, 37, 13, 91,243,
+ 70, 91,207,220, 34, 29,206,252,145,122, 53, 58,195,188, 16,105,180, 26, 65, 0,103, 87,242,141,133, 78,155,225,243,198,215, 65,
+135, 15, 47, 25,210,102,254,200, 54, 56,125, 61, 97, 62,192,212,218,235, 59,225, 56, 16,142, 41,175,252, 94,250,234, 0,112,149,
+ 7,240,229, 64, 74,150,113,230, 69,180,122, 3,162, 92,103, 12,181, 86, 72,183,204,154, 53,195,134,206,124,136, 28,131, 4,201,
+185, 58,164,105,197, 40, 18, 57, 35, 53, 38,146, 21, 80, 8,170, 53,228, 66,161,128, 48, 58, 59,123,169,149,160,213,192, 57,238,
+ 5, 23,150,229, 74, 41, 70,104, 51,250,115,187,172, 95, 55, 36, 48,154, 76, 13, 69,161,214,238,231,109,109,237,154,235,178, 19,
+132,249,185, 89,176,115,241,199,144,215, 2,240,217,240,150, 40, 44,208, 32, 51, 39,140, 52,115,181,161, 18,175, 29,196,199, 67,
+ 91, 32, 59, 93, 13, 61, 13, 80, 26,125,142,206,160, 43,170,246, 60, 10,176,243,131,133,139, 95,247,114, 85, 90,150, 53, 42, 32,
+ 28,139,182, 45,188, 49,176, 87,103, 4,133,254,142, 63, 35, 99,193,149, 54, 42, 32, 28,135,148,140,220,116,157,145,221,107,214,
+ 9,101, 25, 16, 90, 87,165, 17, 67, 29,138, 12, 91, 57, 67,193, 2,159,118,108, 98,253,214,146, 0, 47,107, 75, 25, 5, 29,205,
+ 66,103,160, 81,248,251, 22, 56, 54,106, 13,133, 92, 78,181,135, 86,116, 27, 85,159, 91, 29,141,229,143,213,121,174, 40, 74,195,
+164,129,254,239,239, 91,243,174, 37, 37, 47,185, 53,105,182,114, 36,235,247,149, 29, 47, 78, 90,125,234,242,209, 99, 19,221,190,
+ 94, 52,181,207,224, 15,247, 94, 6,112,129,207,183,120, 94, 68,198,141, 27, 39, 79, 79, 79,191,226,225,225,209,114,224,192,129,
+138,158, 61,123, 66,163,209,224,210,165, 75,208,104, 52, 94, 30, 30, 30, 94,151, 46, 93, 26,147,148,148, 20,221,176, 97,195, 62,
+199,143, 31, 55,185, 14,109,169, 1, 18,150,103,193, 0, 67, 81, 20, 74,151, 81,165,203,234, 60,206,173, 84, 42, 69, 98, 98,226,
+115,143,108,165,166,166, 62,170, 75,100,171,168,168, 72,226,238,238, 14,165, 82, 9,150,101,161,209,104,112,234,212, 41,228,231,
+231,131,227, 56, 88, 88, 88,224,243,245,187, 17,115,251, 10,110,222,188,137,252,252,124, 73,109,154, 41, 41, 41, 84,219,182,109,
+161,215,235,193, 48, 12,116, 58, 29,130,131,131,203,191,139, 68, 34, 44, 94,189, 17,177,183,174,224,206,157, 59, 72, 73, 73,249,
+ 71, 70, 27, 49,195,139,252, 23,169,182,207,172,127,188,213, 33,203, 50, 75,119,237, 59, 28,182,116,246, 4,204,157, 56,192, 99,
+213,214,159, 7,220,207,194, 62, 0,104,225,132, 55,166,244,109,230,105,167, 16,227,179,159,110, 1,132, 44,173,239,254,162,114,
+ 16,219,178, 1, 55,255,228,205,196, 43,203, 38,180,135,183,171, 77,243, 92,105,142, 52, 62,222,132, 49, 5, 57, 6,246, 86, 50,
+223, 97,109, 29, 47,128,227, 96,103, 45,243, 3,203,192,206, 74,230, 59,196,223,230, 23, 0,176, 81,136,253,170,138,124, 85, 71,
+ 7, 15,241, 76,133, 76, 52,211,210,218,206,243,205, 17, 3, 45,134,141, 24, 99, 97, 37,102,144,125,243, 18, 10,196, 13, 65, 59,
+120, 65, 79,231, 32,229,113, 28,251,235,141,251,169, 89,133,250, 5,181, 38,147,224,106,234,227, 7,202, 38,109, 6,218,103, 5,
+126,156,209,100,218, 79,141, 5,224, 4,133, 7, 71,167, 91, 58,119,178,248, 35,254,113, 17, 71,170,140,232, 84,162, 32, 63, 63,
+129,102,225,170,101, 69,214,113,151,127,196,146,161,173,145,155,147, 1,157,145, 65,190,150, 49,186,216,201,101,250,199,247,160,
+ 55, 50, 48,208, 28,196,118,238,184, 20, 22,153,197,209,244, 47,213,105,198,103,227, 78,252,169, 59, 86, 21,151,121, 59,161,237,
+ 71, 54, 22,119, 64,107,145,152,162,194,190,115, 97,237,227,179,113,167, 62,215,153,112, 76, 73,241,115,133, 72, 22, 69,208,179,
+ 46,149,224,253,156,209, 73, 34,151,124,247,213,252, 73, 45,187,250, 56,200,184,148, 48, 80,156, 17,150,172, 8, 90, 41, 11, 91,
+ 15,111,112,134, 66, 82,172,211,229, 69, 1, 53, 93,124, 33, 0, 16,163, 6, 95, 79,245,183,164,236,189,193,198, 95,128,168,221,
+ 76,208,165,209,254,184,108, 46,210,120,249,147,152,110, 11,207,246, 94, 29,212,247,190,234,220,138,251,238,227,182,180, 5,246,
+ 54,226, 31,215, 60, 47, 34,190,190,190, 46,169,169,169, 81, 11, 23, 46,116, 24, 61,122, 52, 78,158, 60,137,130,130, 2,236,221,
+187, 23,155, 54,109,194,202,149, 43, 65,211, 52,118,237,218,165, 56,113,226, 68,167,109,219,182,165,120,122,122,250, 39, 37, 37,
+165,213, 98,176, 40, 0, 50, 0,226,210,103, 23, 5,128, 59,127,254, 60,134, 13, 27,134,243,231,207,115,165,203, 88,148,188,252,
+212,105,236, 79,169, 84, 10,169, 84,138,252,252,252,231, 98,182,196, 98, 49,172,172,172, 32,149, 74, 81, 88, 88,104,182,217, 98,
+ 24, 70,152,146,146,130,252,252,124, 12, 28, 49, 2, 27,215,172, 65,223,190,125, 49,112,224, 64, 16, 66, 16, 28, 28,140, 1,221,
+ 91, 97,194,171,125,112,255,254,125, 48, 12, 99, 82,122,211,210,210,144,158,158,142, 33, 35, 70, 96,247,182,109,232,220,185, 51,
+124,125,125,193, 48, 12,174, 92,185,130,113,131,187, 67, 62,106, 0, 98, 99, 99,249,155,218,244,104,214,115,169,163, 85,111,162,
+ 50,113,131, 59, 29, 18, 56,113,112,167,128, 17, 61, 90, 98,247,145, 95,191,128,178,224, 48, 0, 56,234,101,159, 79,237,235,141,
+232,164, 92,252,122, 71, 21,120, 63, 11,207,165,181, 6,199,194,201,209, 70, 1, 8,165,208, 26, 57,198, 38,190,246, 10,204, 28,
+ 33, 80,244,250, 8, 83, 70, 68,123,116,110,233,225, 81,214,234,208,106,216, 6,188, 17,249,200,179,163,175,139, 39, 88, 26, 96,
+105,216, 76,248, 9, 88,109, 89,107, 58,186, 55,150, 6,125, 48,111, 94,183,161,163, 94,179,144, 42,108,193, 22, 36,131, 78,139,
+ 68,246,195,171,208, 40,154, 35, 45, 49, 30, 71, 47,222,204,127,152,146, 93, 32, 16,224, 82,122,190,126, 81,124, 46,138,106,211,
+213,209, 88,179,252,227, 5,195,143, 30, 62, 98, 45,243,238, 65,197,109, 25,150, 47, 21, 49, 50,101,227, 87, 4,197,114, 39,242,
+229,222, 35, 54, 26, 3,214,214,166, 83,172, 41,248, 57,248,210,133, 9,205,154,244,176,126,242,231, 57,104,117,122,232,105,192,
+191, 83, 31,176, 44,145, 82, 2,138,179, 17, 10,169,140,236, 92, 80, 52,155,126,237,238, 19,117,232,221,120,161,222, 26,107,107,
+236, 93,228,105,119, 79, 9,223, 31,209,167, 29, 64,107,241,106,175,214,216,120,240,215,247, 0,118, 90,253, 46,114, 73, 68,139,
+ 0, 61, 90, 42,177,131, 16,244,184,117,106,147, 95,135, 81, 31,192,156,136,150,191, 19,134,182,104,226,246,227,198,207, 63,114,
+112,108,216, 92, 72,113, 52,136, 75, 27,160, 32,133, 80, 41, 97,176,117,239, 12,214,173, 59,118,125,251, 77, 17,199,145,195,168,
+161,107, 11,150, 3,184,164, 16,176, 49, 39, 17, 31, 31, 15, 39,175, 91, 0, 37, 0,105,244, 4, 70,166,100, 51,189,145,156,219,
+188,247,108,223, 69,253,214,248,143,240, 19,121,134,221,141,203,120,109,186,155,162,139,167,208, 39, 90,109, 41,200,210,104, 56,
+ 62,255,226,121,145,208,233,116, 63,175, 91,183,206, 33, 32, 32,160, 44, 34,131,176,176, 48,236,217,179, 7,150,150,149,243,201,
+ 97,195,134,129, 16,226,176, 98,197,138,159, 1,116,173, 78,179, 91,183,110, 35,238,220,185,163,106,215,174, 93,124,169,217,146,
+ 0, 16,220,187,119, 79,144,156,156, 76,217,219,219, 19, 55, 55, 55, 90,165, 82,113, 0,216,233,211,167, 11,143, 29, 59,214, 76,
+163,209,132,212,213,104, 73,165,210,231, 82,103, 75, 44, 22,131,162, 40, 72,165, 82, 72, 36, 18, 16, 66,204, 50, 91, 44,203,138,
+206,159, 63,143, 91,183,110, 97,101,187,118,152,239,238, 14, 7, 7, 7, 92,185,114, 5,132, 16, 88, 90, 90, 34, 39, 39, 7,135,
+ 15, 31, 70,191,126,253,192, 48,140,196, 20,221,227,199,143, 35, 60, 60, 28,171, 59,116,192,124, 91, 91, 88, 89, 89, 33, 56,184,
+164, 52, 80, 38,147, 33, 49, 49, 17,193,193,193,232,211,167, 15,127, 83,215, 19,147,111,158,222,128, 40,135,130,139,209,160, 5,
+ 97, 8, 64,193,173, 69, 11, 72,238,223,175, 92, 57,199, 20, 4, 2,124,252,237,190,192,225, 27, 62, 24, 65,205, 28,217,222,109,
+213,143,151,223, 1,128,183,198,250,184, 43,100, 34,108, 62, 29, 77, 4, 2,124,252, 60, 14,176, 69, 11, 72,168,108,188, 51,176,
+179, 47, 84,121, 6,196,169,242,126,187, 15,152, 52,138,243,175, 27,166, 96,255,153, 43,201,155,246,235, 98, 8, 33,176,179,146,
+249,190, 17, 17,231,249,227,249,240,164,245, 71,117, 49,132, 35,176, 83,136,253,166,221,239, 94,107,171,195, 14, 30,226,153, 31,
+ 46, 88,208,125,228,180,133,114, 38,230, 24, 12,113, 23,193, 25,181, 40, 48, 74,144, 39,116, 65, 74, 82, 18,190,220, 21,152, 92,
+160, 49, 76,136,202, 52,207, 96, 62,204, 70,145,136, 42, 24,253,229,103,203,130,214,124,190,194, 74, 27,127,165, 72, 72, 49, 90,
+ 97,163,222,162,207, 87,110,160, 10,245,134,215,226,115, 81, 88,155,142,222, 26,107,215,173,255,118,248,140,201, 99, 98,124,154,
+247,118,100, 85,143, 29,117, 5, 5, 25, 63, 93, 8,119, 41,125, 83,164, 0, 32, 46, 37, 27,153,249, 26,134,101,232, 16,107, 49,
+ 86, 69,155, 18, 29, 44,165,137, 51,148, 1, 61,252, 39, 41,173, 37,208, 22,229,193,217, 90,140,193,157,155, 78,162,255,136,253,
+232,113,134, 57,118,237,105,163, 69,131,208, 90,220, 88,219,207,143,176,180, 31, 88, 26,198,136, 3,230, 71,198, 40,204,159,219,
+203,202,198,222,240, 68, 0,141, 37, 96,225, 4,202,198, 11,176,109, 76,137, 91,188, 6, 85,124, 20,243,222,164,201,217,143, 19,
+ 82,190,119,178,168,185, 88,155,230, 8,184,132, 43, 40, 74,143,195, 61,149, 17,254, 25, 37,165,237, 54,233,183,193,242, 61,230,
+240,188,164, 36, 38, 38, 78, 93,186,116,105,104,231,206,157, 27, 56, 57, 57,161,117,235,214, 56,115,230, 12, 22, 46, 92, 88,190,
+ 78,187,118,237, 64, 8, 65, 78, 78, 14,214,173, 91,151,166, 82,169,166,214,248,130, 30, 21, 21,179,127,255,254, 94, 45, 91,182,
+ 52, 74, 36,146, 60, 0,178,188,188, 60,121, 78, 78, 14,165,211,233,192,113, 28,103,107,107,203,170, 84, 42,122,194,132, 9,250,
+235,215,175, 55,213,104, 52,137,245,137,104,121,120,120,220,203,206,206,206,167, 40,170,222, 93, 63,148,153, 44, 39, 39, 39,101,
+ 81, 81, 17, 7, 32,183, 46, 93, 63, 48, 12,131, 14, 29, 58,224,226,213,219, 56,255,235,117, 20,168, 30,224,157, 25, 83,209,186,
+117,107, 92,188,120,177,206,215,172,109,219,182,184, 16, 28,138,208, 91,119,145, 24, 27,129,247,222,153, 1,127,127,127, 92,184,
+192,215, 94, 48,131,115,168, 92, 55,235,220,211, 70,171, 79, 96, 96, 96, 89,214,255,140,125,245,115, 66, 91,177,157,244,192,138,
+161, 77, 91,136, 7,174, 0, 37,182,192,177,230, 23,186,127,252,229,150, 24,161,115,226,228,123, 25,181,183, 14,171,244,167,201,
+ 64, 20,185, 25,115,232,238,125,191, 73,175,118,246,192,238, 51,138, 79, 1,224,181,158, 77,240,199,195, 76,220,140,205, 56, 20,
+157,137,168,250, 30,117, 43,103, 40,216, 44, 28, 90,247,254,200, 62, 94, 13, 93,176,231,100, 40, 40, 10, 63,155,244,192, 37,132,
+116,110,233,133, 77,251,159,110, 97,232,226,185,254,168, 46,230, 82, 84,225, 80, 0, 24,232,167,248,165, 99, 83,123, 79, 82,177,
+226, 86, 21, 88, 72, 69,179,134,142,153, 34,103, 98,207, 0, 9,193,160, 24, 61,180, 70, 14,234,172, 66, 20,219,122,224, 74,216,
+ 93,109,190,206,240, 65,116,102,221,162,120,247,179, 16, 47,249,243,110, 82,145, 70,235,170, 80, 54,213, 9, 5, 28, 87,164, 39,
+248, 35, 58,161, 32, 58, 13, 15, 76,209,136,143,135,161,139, 59,211,115,199,190,163,203,197, 18,233,107, 66, 10,148,179,157,165,
+114,199,134,213,176,182,182, 2,103, 40, 2, 52,153, 24,253,238,151,153,247, 84,116, 19, 0,104,238, 8,171,158, 77,196,251, 68,
+ 2, 42,229,114,156,241,147,218,246, 65,209,152, 61,121,112, 59, 49,103,208,224,253,117, 71,176,243,163,145,152,210,191,133,248,
+220,239,177,179, 1,172,170,235,181, 38, 44, 3, 66,107,209,117,217,213, 24, 10, 8, 37, 64,143, 91, 71, 63,247, 3,110,155,172,
+209, 30, 16,179, 34,170, 69, 27, 79, 75, 9,151,242, 59,184,148,223,137,208,163, 59, 40,207, 94, 20,229,210,129,124,247,213, 74,
+205,238,221,123, 46,113, 2,124,102, 66, 87, 25, 96, 57, 32, 43, 54, 20, 6,131, 1, 52, 11,232,116, 58,104, 52, 26, 88,198, 93,
+ 40,175,163, 37, 17, 83, 67,230,189, 57,162, 45, 41, 82, 21,159,141, 97,146,246,204,240,235, 74,138, 84,197, 55,146,216,216, 44,
+141,158,143,102,241,188,136,196,171, 84,170, 33,195,134, 13,251,245,226,197,139, 14,173, 90,181, 2, 0,220,186,117,171,228,165,
+179, 67, 7,248,248,248, 32, 61, 61, 29, 19, 39, 78,204, 82,171,213, 67, 80, 75,157,223,194,194,194,199,199,143, 31,111,160,209,
+104,218,125,242,201, 39, 25, 94, 94, 94, 5, 58,157,142,202,203,203,227, 24,134,129,189,189,189,180, 93,187,118,232,214,173, 91,
+ 81, 88, 88, 88,163,228,228,228, 66, 0, 9,117, 73,252,200,145, 35,113,245,106, 73,163,189,231,209,175,150, 68, 34, 65,171, 86,
+173,220,227,227,227, 83, 75,159, 45,102,231,241, 21, 31, 47,119,239,222, 69,200,237, 20,136, 12, 90, 72, 51, 85,184,113,242, 56,
+ 70,204,154, 3,134,169,251,216,242,119,239,222,197,169,224, 27,176,148,137,240,224, 65, 20,142, 31, 63,142,119,222,121,167, 94,
+154,117,164, 70, 47,242, 31, 71,141,106,234,105,137, 0, 32, 32, 32, 32,164, 44, 90, 81, 17,111,111, 72,101, 69, 88, 49,176,189,
+251,226,215,122, 52, 21,210, 5, 42,112, 44, 7,161, 24,112,118,178,193,129, 3,135,154, 28, 58,114, 36,108,219,214,109,223,114,
+ 12,243,241,189, 12, 20,155,145,168, 21, 27,142,132,190,118, 96, 65, 31,209, 59, 67,253, 28, 0, 64, 34, 18, 96,243,153, 40, 6,
+192,138,250, 28,109, 23,119,200,139,104,204,116,118,180,253,116,233,219,195, 29,250,116,240, 65,200,205,123,248,246,120,216, 85,
+105, 6,246,155,124,115,115, 52,158,246, 79, 85,181, 58, 4, 87,123,189, 75,150, 37, 46, 18, 75,123, 24, 19, 46, 3, 70, 29,116,
+122, 35,146,179, 89, 36,231,232, 32, 82, 72,112, 43, 54, 69,235,152,134,192,122, 28, 54,101,169,144,187, 45,255, 98,125, 67,157,
+182,136, 41,200,205, 98, 36,210, 27, 98,133,133, 76,109, 78, 85,133, 27,169,208,245,106, 44,126, 5,224,132, 82, 57, 41, 94,246,
+225,155,150,169,209, 23,209, 76,160, 2, 69, 8, 44, 90, 12,135,181,133, 80,210,163,145, 56, 9, 0, 44, 45, 21,210,117,159, 45,
+180,253,224,163,207,106,173, 3,214, 2,144,248,120,187,124,208,202,203, 30, 87,195, 99,112, 53, 50, 49,234,234,173, 7,254,125,
+ 91,187,193,167,161,221, 60,105,110,222,218,251, 48,160, 45,129, 83, 0, 0, 32, 0, 73, 68, 65, 84, 63, 66, 90,114, 97, 24,128,
+214,149,183, 58,108,225,140,215, 59,190,246, 73,117,173, 13,171,164, 49,192,197,178, 4,148, 80, 8, 80,130,146, 22,144,201,191,
+ 67,100,231, 77, 14, 29, 61, 85,188,103,207,254,213,247,179, 76,111,156, 65,179, 96, 11, 10, 10, 96,105,105,137, 11,177,140,126,
+202, 96,137, 76, 32, 16, 32, 57,246,246, 95,149,225, 29, 4, 45, 37,125, 63,247,251,125,101,199,139,214, 82, 74,230, 54,252,179,
+ 22, 76,228,254,148,186, 62, 36,120,120,254, 11,228,231,231, 71,220,191,127,127,112,155, 54,109,246,190,255,254,251,214,147, 39,
+ 79,118,155, 49, 99,134, 0, 0,210,211,211,185, 77,155, 54,169,190,251,238,187,252,172,172,172,105, 52, 77,155,210,149, 9, 81,
+171,213,215,191,255,254,251,204,107,215,174,249,119,234,212, 73,246,202, 43,175,112,246,246,246, 34,153, 76,198, 26, 12, 6, 93,
+108,108, 44, 27, 31, 31,239,154,151,151,247, 8, 64, 28,234, 48, 98, 69,105,244,106,149, 80, 40, 92, 78, 8,105,245, 60,234,104,
+ 41, 20, 10, 55, 0,143, 40,138,106,102,110,177,225, 51, 15,108,145, 8,185,185,185, 40, 78,139,130, 60,229, 33,218, 88, 10,208,
+210,222, 10, 54, 54, 54,245, 50, 69,249,249,249,128, 38, 21,161,161,119, 1,134,129,173,173, 45,108,109,109,255,113,163, 85,157,
+ 23,121, 65,152, 89,197,178,154,235,104,181, 84,226, 29, 11, 3, 54,205, 26,222, 84,210,216,179, 33,244, 41,183,112, 55,185, 8,
+ 31,119,233, 20, 45,148, 89,235,102, 77, 29,217, 97,204,184, 70,232,211,173, 35,213,216,213,118,222,218, 13,219,223,109,137,172,
+133,209, 25,216,108, 74,138,162, 51,241,152, 67,198,158,203, 17, 41,179, 27, 42,180,224, 56,130,203,145,106, 68, 38,228,238,137,
+201,196, 99,115,142,174,165, 43, 6,136, 32, 56, 66, 8,145,219, 90, 90, 22,182,244,105,232, 52,160,107, 91,193,144,222, 29, 32,
+ 17, 2,161,127,220,197,252, 13, 63,223,224, 56, 50,252,182,137,197,134, 37, 45, 12, 43, 27,168,146, 22,134,116,165, 22,134,132,
+ 16, 82,210,234,176,230,224,131, 80, 72,165, 21, 39,254,233, 34,118,108, 14,109,220,101, 36,228,114, 72,204, 40, 68,129,200, 5,
+250,212, 84,128,112, 73, 33, 53, 87,172,174, 17, 39, 39, 39,231, 38, 45,125,154,110,217,119, 28,198,226,124, 60,190,178, 23, 69,
+185,106,124,190,227, 76, 83,119,119,199,222,169,169,169, 33,102,100, 54, 62,191, 6, 30,114, 6, 1,132, 98, 25,206,109, 59,138,
+ 44, 71, 11, 56, 41, 36,224,180,153,152,245,193,100,219,161, 3, 39,219, 2, 64,226,131, 59,240, 82,104, 77,210, 53, 58, 98,204,
+107,125,125,237, 64,107,177,239,194, 29,157, 0, 24,178,255, 82, 84, 92, 95, 63, 59,249,107, 61,188,236, 87,169,242,198, 34,187,
+110,157,138,150, 69,180,202, 35,124,117,104,109,120, 28, 96,253, 56,196, 29,185,158, 97, 57,110,224, 43, 10,137,136,162, 72, 81,
+ 42,136,133, 19,182,239, 59, 86, 36,165,205, 27,137,157, 3, 86,117, 94,243,120,121,201,125,130,189, 67,215,220,122, 59,232,211,
+ 46,202,180,180, 52, 24, 75,203, 14, 31,231,112,191, 77, 29,216,146, 77,201,231, 12,151,214,142, 30, 71, 89, 40,165,139,190,222,
+127,133, 0,124,111,210, 60, 47, 52, 90,173, 54, 92,171,213,182, 94,180,104,209,235,203,150, 45,235,101,105,105,217, 4, 0, 52,
+ 26,205, 99,154,166,175,150,254, 63,205,105, 29, 72, 0, 60,138,139,139,123, 28, 23, 23,215,224,224,193,131,118, 0,228,165,191,
+233, 0,228, 1, 72, 71, 61, 90, 28,150,153, 42,138,162,150, 63,175,243, 80,102,170, 40,138,106, 86,151,237, 5, 2, 1, 75, 81,
+ 20, 40,138,130, 76, 38,195,181,107,215, 48,126,248, 64,220, 63,151,135, 86,118, 86,232, 52,109, 22,142, 4, 5, 65, 40, 20,130,
+162, 40, 8,133, 66,179,158, 35, 34,145, 8,161,161,161,152, 50,113, 28,100, 34,192,214,214, 22,139, 22, 45,194,233,211,167, 33,
+ 18,241,163,244,153,193,174, 10,134,203,196,126,180, 40,172, 10,218,251,165, 4, 44,141,179,123,191, 65,224,189, 34,195,131, 76,
+124,236,155,137, 77,199, 81,200,101,110,216, 63, 59, 40,244,222,215,211, 39, 4, 40,250,245, 29,136,126,125,250,138,252, 59,246,
+254, 20,168,100,180, 6,160,134,190, 54, 88, 14,171,119, 93,136,153,117,228, 74, 44, 5, 99, 33, 38, 12,234, 72, 88, 14,171,107,
+ 57,152,103, 52,109, 45,172,142,132,134,133,217,195, 88,132,132, 59,191,201, 27, 53,105, 10,176, 70, 60,122,244, 16,223,237, 59,
+201, 93,249,227,193, 1, 3,131,247,227,115,161, 49, 85,179,228, 73,201,192,214, 82,234, 59,196,223,230, 23, 14, 4,118, 10,137,
+ 31,225, 88,216, 41,196,126, 3,253, 20,191, 16, 66,136,181,133,216,143,176,116,173,154, 90, 3,179,115,223, 15,123,214,191,245,
+214, 91,150, 89, 41,105, 80, 21,220, 67,145,212, 29,180,194, 3,113,119,174,106,139,245,140, 41, 15,241,106,207,103, 86, 86, 86,
+ 70,248,205, 28, 28,217,177, 6,180, 65,143,140,148, 18,175,170,202, 42,128,141,147,123, 88,106,106,170,201,154, 70,134,203, 31,
+ 51,121,166,196,194, 26, 22, 83,198, 4, 72,227,178,245,104,239,102, 93,146,105, 20,101,226,126,112, 40,250,148,214, 49,141, 79,
+ 22,192,171,173,155, 73,233,180,150, 75,222, 31,250,138, 59, 30, 39,169,113, 45, 42,117,223,227, 28,168,216, 24,245,190, 56, 85,
+222,236,145, 93, 60,177,241,116,244,123, 0,125,200,156, 99,111,225,140,215, 9, 65,143,146,202,240, 90, 16,160, 71, 11,103,188,
+110, 98, 75,195,103, 52, 69, 18, 76, 90,255, 75,226, 39,199,254,204, 26,185,120, 82, 79,155,110,221,134, 73,193, 24, 80,168,213,
+211,247,243, 80, 96,142,102,129,150,219, 9, 96,103,217, 15,225, 41,220,129,158, 43,194,174, 30,154,225,161, 44,243,234, 87,227,
+244, 97, 0,194,166,119,182,248, 84,210,247,115,223,176, 85,157, 47, 70,170,185,131, 87,227,202,251,208,170,245,127, 84, 71,120,
+ 77, 94,243,159,208,100, 1, 28,160,105,250, 64, 94, 94,222,243,212, 84,225,217,126,157,234,117,236, 21,139, 9, 9, 33,162,210,
+104, 86,109,149,225,107,212,172, 88, 76, 72, 8, 57, 95, 26,205,170, 45,170, 85, 73,147,227, 56, 85,135, 14, 29, 28, 70,140, 24,
+ 1,150,101,241,240,225, 67, 36, 38, 39, 99,192,236,247, 96,103,103,135,171, 17, 17,120,240,224, 1,150, 47, 95, 14,154,166,113,
+234,212,169,148,218, 52, 69, 34,145,177,105,211,166,146, 81,163, 70,129, 97, 24,196,199,199, 35, 53, 53, 21,243,231,207,135,173,
+173, 45,194,195,195,203, 53,179,178,178, 32, 18,137,140, 85, 68,183,254,142,123,233, 69,231, 25,147, 85,179,209, 2, 88,176, 52,
+242,131, 86, 96,243, 53, 24,141, 52,252,162, 51,241, 36,250,175,136,212,118,225,205,136,179, 17,247, 98, 30,135,255,222, 79,138,
+140, 72,152,251, 38,241, 48, 27,106,107,121, 97, 33,140,133, 54,136,255, 5, 79,210, 11,139, 30,102, 67,109,246, 27, 3,199, 82,
+ 48, 22, 3,234, 91,184,126, 53, 4, 87,110,220,197,159,145, 49,236,245,240,216, 35, 2, 14,171,239,103,227, 97, 29,222, 66, 96,
+ 53,124, 35,222,140,124,228,217,209,167,129, 39, 88, 6,132,163, 97, 59,225, 16,166, 69,119,243,236,232,109,231, 89, 18,201,162,
+ 97,255,246,111,192,122,121,141,122,183,146,233, 93,210,211, 23,199, 22,230,101,119,233,223,187,171,165,109,139,161,200,122, 20,
+139,135,119, 67,181,225,247,226,174,223, 74,166,119,213,231,234,186,187,187,247,234,223,219, 23, 19,102, 45,133,177, 56, 31,241,
+ 87,126, 64, 81, 78, 26,174,133, 89, 33,166,160,160, 43, 0,147, 35, 90, 97, 73,140, 63,146,114,209,189,145, 56,201, 26,122,151,
+169, 1, 35, 32,163,116,224,244, 5,160,138,179, 16,151,106,200, 31,187, 35,153, 5, 0,133,140, 18, 89,146,124, 27,147, 34,143,
+ 94,142,205, 21, 66, 26,251,131,162,192,113, 37,195, 55,113, 28,182,239,255, 45,110,246,234, 41,237,209,210,211,190,237,157,212,
+ 12, 10,102,132,252, 41,130,158,127, 30,249,204, 79,247,235,167, 0,103, 68,232, 60, 7,191,158,155,115,122,162,142,195,237,220,
+ 83, 33, 21,192,108,136,138,119,206,219,124,225,211, 14, 65,209, 61, 22,188, 61,210, 6,228,185,180,208,141,141, 78, 99,123,117,
+ 94,155,120,145, 35,149,203,115, 75, 34, 91, 45,136,170,128,220,185, 26,167,231,123,133,231,225,225, 1, 0, 20, 21, 21,205,154,
+ 54,109,218, 78,177, 88,172, 4, 64,113, 28, 7,142,227, 68, 95,127,253,181,152,101, 89,129, 64, 32, 96,133, 66, 33,115,254,252,
+121,154,101,217, 76,157, 78, 55,171, 54, 77,134, 97,226,230,204,153,211,180,182, 22,138,135, 15, 31, 46, 51, 89,113,252,149, 48,
+201,100, 85,156,151, 71,185, 68, 53, 4,105, 63,235, 62,101,197, 10, 0, 20, 8, 86, 70,103,226,201,211,171, 68,230, 64,213, 82,
+104,156,239,223,177,247,138,178,109,204, 77,153,142,101,199,117,108,237,115, 24, 0,244,132,157, 82,151,163, 43,208,107, 95,107,
+215,177,235, 17,142, 16, 17, 67,200, 30, 1,135, 19, 58, 6,247, 77,105,105, 87, 29,170,140,188,240,161,173,108, 9, 80, 82,100,
+ 88, 94, 92, 88,218,141, 3, 33,132,148, 23, 23,126, 35, 71, 86,190,190,214,126,160,126,127, 98, 24,104, 96,254,156,121,233,247,
+ 59,179, 88,150,184, 8,133, 84,154,214,192,236,172,175,201, 2,128,212,212,212,144,224,160,212, 75, 17,109, 27, 12,114, 82,148,
+ 70,185,138,129,172, 98, 92, 74,205, 44, 10,169,139,102,174,134, 30,185,108,211,233, 51, 82,177, 80, 4, 66, 74, 58, 20, 37, 4,
+ 58, 35,155, 19,150,196,248, 3, 64,107, 7,184, 45, 58,197, 28, 22, 10,169,196,218,244,110, 62, 80,111,156,176, 54,120, 97, 84,
+ 66,238,158,132, 60,220, 3,128,132, 60,220, 59, 26,250,228,211,184,180,194,133,247, 18,115,191,129,153,245, 42, 8,133,107, 29,
+ 39,172,120,102, 89,125,207,103,140, 26,119, 1,140, 6, 82, 6, 78, 88,240,221, 2,138,194,243, 26,126, 34, 86,107, 36, 94, 79,
+ 47, 44,139,108,241,121, 21, 15,207,127,131,178,168,150, 64, 32, 88,245, 28, 53,207, 83, 20, 53, 12,192, 35, 51, 54,187, 89, 84,
+ 84,212,250, 57, 31, 94, 54,195, 48,217,166,172,248, 47, 84,136,127, 81,217,245,111,237,120, 0,175,249,207,107, 54,107,214,140,
+152, 97, 88,248,243,201,107,242,154,188,230,255,149, 38, 33, 68, 88,159,169, 26, 77,170, 62, 19,127,141, 94,120,102, 86,247,157,
+175,233,246, 18,242,232,209, 35,138, 63, 11, 60, 60, 60, 60, 85, 67, 81, 20,251, 55,104,242,189,227,241,148, 25,172, 74,209, 45,
+ 1,127, 78,120,120,120,120,120,120,120,120,158,139,201,170, 56, 47, 49,225,168, 62,252,103, 78,107,130,186,132, 16,131,121, 77,
+ 94,147,215,228, 53,121, 77, 94,147,215,252,191,211,172, 77,155,111,205,248, 55, 27, 48, 94,147,215,228, 53,121, 77, 94,147,215,
+228, 53,255,255, 52, 95,100,170,173,163,197, 23, 29,242,240,240,240,240,240,240,240,252, 77,240,149,225,121,120,120,120,120,120,
+120,120,234, 71,173,131, 74,243,240,240,240,240,240,240,240,240,212,141,154, 7,149,230,225,225,225,225,225,225,225,225,169, 51,
+230, 15, 42,205,195,195,195,195,195,195,195,195, 99, 18,187,248, 83,192,195,195,195,195,195,195,195,243,207, 80,185,213, 97, 96,
+ 96, 32,169, 56,231,225,225,225,225,225,225,225,249, 39,121, 89,189, 8, 95,116,200,195,195,195,195,195,195,195, 83, 63,102,242,
+ 70,139,135,135,135,135,135,135,135,231,239,161,218, 58, 90,101, 29,150,246, 41, 13,213,245,225,207, 21, 15, 15, 15, 15, 15, 15,
+207,191,192,203,237, 69,248,250, 89, 60, 60, 60, 60, 60, 60, 60,188, 23,225,225,225,225,225,225,225,225,225,249, 47,193,143,117,
+200,195,195,195,195,195,195,195,243, 15, 27,174,191,221,104,241, 35,155,243,154,188, 38,175,201,107,242,154,188, 38,175,249,255,
+100,178, 42,153, 45,190,213, 33, 15, 15, 15, 15, 15, 15, 15, 79,253,168,181,213, 33, 15, 15, 15, 15, 15, 15, 15, 15, 79,221,152,
+ 9, 32,160,244,115, 0, 42, 68,181,248,136, 22, 15, 15, 15, 15, 15, 15, 15, 79,253,216, 5,192,181,212, 96,157, 3,160,230,141,
+ 22, 15, 15, 15, 15, 15, 15, 15,207,243,161, 98,189,172,225, 21,204, 23,111,180,120,120,120,120,120,120,120,120,234, 73,181,117,
+180, 40, 84,223,114, 32,216,140, 29,212,165,245, 65, 48,175,201,107,242,154,188, 38,175,201,107,242,154,255,119,154,181,105, 7,
+227,197, 99,166, 57,230,235,121,194, 55,125,229, 53,121, 77, 94,147,215,228, 53,121, 77, 94,243,255,150,231,222,234,176, 61, 96,
+193,159,214,151,146, 6,165, 19, 15, 15, 15, 15, 15, 15, 79,205,252, 61,173, 14, 91, 0,111, 79,110,165,220, 65,223,203,180,185,
+ 7, 20,215,180,174, 82,169,220,169, 80, 40, 38, 23, 23, 23,107, 40,138,226,202,150, 19, 66, 0,160,226, 88, 71,241,153,153,153,
+ 61,107,219,183, 84, 42,221,212,160, 65,131,183,139,138,138,138, 41,138, 34, 20, 69,129,162, 40, 0,120,102,206,178,108, 74,118,
+118,118,135, 23,250, 18, 18, 34,116,106,208,224, 15,177, 80,232,110,238,166, 44,199, 61,201, 72, 79,239,106,198, 38,107, 40, 10,
+139, 75,118,139,175, 0, 44,125,217,254, 17, 4, 16,154,178, 94, 43,192, 58, 22,152,192, 10, 4,239,137,129,173,122,142,219, 1,
+ 0, 20,192,214,117,223,250,155,104, 74, 17,180,165, 40,216, 18,130,124, 66,225,174,172, 51,226,254,165, 83, 49, 70, 44, 22,143,
+180,177,177,177,202,206,206, 14, 1,112, 24,192, 68, 71, 71,199,222, 5, 5, 5, 69, 52, 77,159, 6,240,115, 93,132,123,182,197,
+ 71, 82,137,120,186,206, 72,175,251,253, 46,126,232,221, 30,142, 12,135,181,114,137,168,167,222,192,124, 21, 26,129, 61,102, 74,
+ 82,165, 83, 89,158, 97,246, 24,105,199, 76,188,238, 0,112,202,222,222, 71,166,180,249, 85, 44, 21, 62,201, 75, 47,154, 60, 46,
+ 35, 35,121,124, 61,174,251,127, 17, 39, 39,167, 55, 5, 2,193, 23,132, 16,176, 44,251,113, 78, 78,206,222,231, 36,253, 49, 0,
+187,210,207,121, 0,190,168,167, 94, 34, 0,207,210,207, 73, 0,188,248,231,122,157,217,126,242,228,201,217,125,251,246,197,198,
+141, 27,177,125,251,246,132,204,204,204,181, 0,246, 1, 48,252, 11, 58, 60,213,209, 18, 24,246,245,224,206, 44,253,227,106,174,
+194,226, 1,213,252,153,191,159, 58,117,170,145, 16, 66, 30, 60,120, 64, 12, 6, 3,161,105,154, 48, 12, 67, 24,134, 33, 52, 77,
+151, 79,238,238,238,169, 79,109,254,140,166, 64, 32,216, 60,118,236,216, 66, 66, 8,185,117,235, 22,209,106,181, 68,175,215, 19,
+131,193, 64,116, 58, 29,209,106,181,149,166, 6, 13, 26,164,215,164,105, 99, 99,115,203,222,222, 62,221,222,222, 62,221,193,193,
+ 33,221,193,193, 33,221,209,209,177,124,114,114,114, 42,159,148, 74,101,186, 82,169, 76,119,112,112,184, 85, 91, 58, 75, 25, 12,
+ 32,196,132,105,112, 21,219, 14,168,104,180, 92, 93, 93,211, 73, 29,104,216,176, 97,178, 9,233, 44,163, 1, 69,129, 45,219,150,
+162,192,201,100, 50,207,138,191,227,217, 72, 87,173, 33,101, 55, 55,183,177,174,174,174,193,174,174,174, 65,110,110,110, 99, 77,
+184,197, 42,105, 90, 91, 91,223,114,114,114, 74,119,113,113,201, 40,155, 92, 93, 93, 43, 77,110,110,110,229, 83,131, 6, 13,210,
+237,237,237,171,189, 70, 4, 16, 86, 55, 93, 1, 68, 50,160,159, 72, 40, 12,108,208,160, 65, 65,100,100, 36, 75, 8, 33, 2,129,
+ 32,181,108, 29,115,142,253,105,147, 85, 28,138,143,179, 46,203,110, 22, 61, 89,155,159,117, 89,118,179, 56, 20, 31,235,111,162,
+105, 93, 53, 77,164, 42,205, 55,222,120,227,141,187,233,233,233,169,121,121,121,234, 29, 59,118,196,202,229,242,208, 29, 59,118,
+196,230,229,229,169,211,211,211, 83,223,120,227,141,187, 0,230,152,161, 9, 0,232,218, 22, 93,222, 26,227, 90,124,247,212,148,
+226,126, 29, 69,119,186,183, 66,192,192,174,146,212, 45, 75, 90, 20, 95,221,221,163,184,239, 43,130,123,102,106, 82, 34,145,168,
+155,167,167,231,116,165, 82, 57,181,116,154, 82, 54,185,184,184, 76,113,113,113,153, 98,111,111, 63,190, 38,205, 99,128,208,148,
+201, 67, 46,239, 54,190,137,103,113,226,170,149, 36,242,131,247,200,116,111,143,130,113,206,206,141,254,133,107,244,183,106, 58,
+ 59, 59,171,104,154, 38, 70,163,145, 56, 58, 58,170,158, 99, 58,191, 33,132,124, 67, 8,249, 6,192, 55,207, 65,179, 60, 63, 51,
+195, 96,215,164, 41, 23, 9, 4, 11, 20, 82,105,144, 76, 36,202,144,137, 68, 25, 10,169, 52, 72, 36, 16, 44, 4, 32,255, 47, 93,
+163,191, 65,211, 74,169, 84, 62,222,180,105, 19, 41, 46, 46, 38,197,197,197,100,211,166, 77, 68,169, 84, 62, 6, 96,101,134,102,
+ 93,117, 94,166, 8,214,211,211,243,139,104,181, 0, 58,244,107,219,236,196,188, 55, 39,128, 59,190,137,170,229,141,233,251,174,
+ 29, 58, 76,223,183,111, 31, 0, 96,242,200,145, 24,212,169, 19,172,173, 44, 33,149,150, 36,135, 34, 20, 36, 98, 9, 70,205,255,
+208,148,221,127, 53,106,212,168, 73,199,143, 31,183, 2,128,237,219,183, 99,204,152, 49,112,112,112,128, 66,161,128, 68, 34,129,
+ 88, 44,174, 52,175, 13,161, 80,216, 48, 53, 53,213, 89, 46,151,151, 71,217, 56,142,171, 52, 17, 66,202,162,111, 96, 24, 6,205,
+155, 55, 55,245,116, 45,201,207,207,239,165,209,104,202, 53,170,154,154, 52,105, 2, 0, 23, 77, 17,252,226,243,213,224, 24, 13,
+ 68, 34,128, 97, 0,189, 81, 0,142, 84,105,110, 48,103,206,156,242,116,215,133,225,195, 3, 40,138,162,142,135,135,135,159,200,
+200,200,104,204,113,236,140, 58, 70,186,222,125,248,240,161, 21, 0,248,248,248,204, 1,112,194,156,116,136, 68,162,134, 17, 17,
+ 17,206, 50,153,172,218,200,101,133, 8, 38,140, 70, 35,218,183,111,207,152,179,143, 6,128,103,142, 64, 48,163,221, 43,175,204,
+ 92, 49,106,148,252,143, 63,254,144, 11, 4, 2, 48, 12,131,175,191,254,154, 33,132,216,181, 4,108,162,129,130, 26,100,150, 1,
+120,179,244, 97,176, 7,192,215,149,220, 2, 65, 91, 45, 45, 11,136, 47, 26,213,169,115,163,143, 16, 29, 21,217,201,219,234, 20,
+172, 69,250, 56,224,159,141,106,217,216,216,140,220,184,113,163,114,207,158, 61, 5, 15, 30, 60, 48,238,216,177, 67, 57,107,214,
+ 44,107,163,209,136,217,179,103,103,250,250,250, 74, 54,110,220,168,252,249,231,159,251,105, 52,154,109,102, 93, 47, 10,171, 39,
+142, 28, 4, 29, 45, 0, 77, 51, 74, 87,165,245,129,121,111,244, 17, 19, 98,192,254,211,225,160, 25,238, 7, 51, 35, 89, 93,199,
+141, 27,231,125,232,208, 33, 81, 76, 76,140,200,207,207, 15, 28,199,129,101, 89,208, 52, 13, 0,224, 56, 14,205,154, 53,171,247,
+121,153, 14,248, 56, 53,112, 8,234, 58,108,168,133,171, 92, 6,135,220, 76,188, 37, 17, 89,239, 85,232, 15, 2,232,246, 82, 69,
+118, 9,129, 72, 36, 66,114,114, 50,156,157,157, 45, 56,142, 83, 3, 88,153,155,155,187, 11, 47, 47,157,164, 34,209,137,253, 63,
+108,118,233,220,173,155,176,129,171, 51, 98, 31, 38, 65, 68,177, 3, 34,254, 12,239, 51,253,157, 5,243, 12, 12, 51, 22,192, 31,
+ 47,219,129,187,116,155, 51,154, 18, 8,183, 83,132,195,103, 91,206, 20,174,249,106,147, 98,246,140, 55,132,243,231,207,135,135,
+135, 71,227,209,163, 71,127, 5,224,157, 90,117, 58,207, 25, 13,161, 96, 59, 8,193,138,239,206, 20,126,249,213, 38,197, 59,117,
+208,121,193,169,246, 63, 82,111,163,213, 2,240,246,247,112,190,180,102,241, 59, 98,242,203,143,130,226,236,140,106,215, 85, 42,
+149, 59,135, 12, 25, 50,121,239,222,191,162,209, 93, 91,181,194,232,126, 61,224,236,104, 11,133,165,180,228,113,196, 81,184,251,
+224,137, 73,134,192,195,195, 99,246,137, 19, 39,172, 42,154, 9,137, 68, 82, 62, 85, 52, 89,101, 83,217, 3,184, 38,228,114, 57,
+130,131,131, 33, 18,137, 32, 20, 10, 33, 18,137,202,167,138,223,133, 66, 33, 26, 52, 48,171,234,210, 90, 91, 91,219, 54,133,133,
+133, 54,121,121,121,240,244,244, 44, 0, 16, 81,225,247, 54,153,153,153, 54,230, 8,114,140, 6,243,223,106, 1,177,225, 6, 12,
+226, 78,208,138,186,227,250,159,247, 17,120, 49, 4,169,170, 52,244,232,210, 14, 83, 95, 31,135,160,160, 32,176,172,217, 37, 29,
+233,132,224,171, 17, 35, 2, 62, 2, 40,106,192,128, 1,121,115,231,206, 21,196,196,196, 76, 26, 61,122, 84,171,135, 15, 31,149,
+ 70, 21,169,197,132, 96, 51,128,116, 19,117,165, 0,112,245,234, 85, 0,144,213,229,222,147,201,100, 8, 11, 11, 67, 89, 49,177,
+ 64, 32,128, 64, 32,128, 80, 40,196,217, 71, 78,208, 24, 4, 40, 78,191,135,247, 2, 60,209,164, 73, 19, 8, 4,181, 87, 73,236,
+ 3,200,175, 3,163, 41,177,120,190,171,155, 91,227,222,222,222,138,224,224, 96, 33, 0,120,121,121, 17,181, 90,157,119,250,244,
+233, 66, 17,176,221,139,144,125, 53,153, 44, 15, 15,143,238,169,169,169, 95,148,157,115,138,162,190,106,212,168,209,242,242,235,
+198,113, 88,249,131, 70, 60,111,222, 7,146,206,125, 62, 1, 0,116, 30,113, 8, 5,241,107, 90, 80, 57,203,108,255,233, 92,162,
+160,160,224, 72,179,102,205,132,217,217,217,215, 1, 36,210, 52,189,228,192,129, 3,206,111,189,245, 86,198,193,131, 7,215, 2,
+112, 91,183,110, 93, 31,141, 70,115,212, 28,221, 30,109, 48,236,149, 54,173,186,120,122,120, 32,228,250, 31,144, 72,197,118,115,
+222, 12,128,149,149, 8,223,236, 57,199, 37,166,228,204, 13,141,192, 62, 51, 76, 86,167,113,227,198, 53, 62,116,232,144, 20, 0,
+ 34, 34, 34,144,150,150, 6,165, 82, 9, 11, 11, 11,136,197, 98, 8,133, 66,136,197,226,231, 98,178,108, 61, 28,111,158, 58,117,
+218,194,193,193, 14, 91, 62,156,135,169, 25,233,176,179,182, 2, 93,164,105,252,146, 61, 40,124,122,246,236, 41,103, 89, 22, 26,
+141, 6, 87,174, 92,177,181,176,176,176,109,216,176,225, 10,152,209,122, 74, 46,151,167,235,116, 58,231,210,207, 25, 58,157,174,
+ 1,128, 2,153, 76, 86,150, 79, 23,149,206, 77, 45, 78, 76,196,179,197,132, 73, 20, 69, 85, 92, 86, 87, 58,118,234,216, 38,248,
+231,227, 63, 89,229, 23,166,193,206, 62, 3, 2,228, 99,215,174,173,176,176,176,193,138, 21,203, 68, 79, 6,244,115, 31, 60,108,
+108,112,212,253,216, 1, 47,157,217, 34,212,174, 1, 35, 38, 59, 88, 40,172, 75,159, 37, 52,246,238,158, 7,129, 64,128,229,203,
+151,195,223,223,127,102, 84, 84,212, 39, 0,114,106,150,193,174,214,189, 94,115,144,202, 75, 46, 49,199,210,216,113,120, 97,137,
+206,210, 89,152, 56,162,201,204, 69,227, 30, 95,240,247, 70, 97,233,139,185, 86, 44, 64, 18,213, 25,229,134, 33, 48, 48,176,119,
+ 64, 64, 64, 72,117,223, 95, 0, 92,241, 87,255, 89,149,204,151, 40, 48, 48,144, 4, 4, 4, 80, 21, 14,174,210,247,154,104, 11,
+ 56,217,219, 42,130,183,175,156,103, 37,186,113, 78,168, 77,122, 4,149,174,210,131,188, 82, 19, 77,133, 66, 49,121,239,222,189,
+149, 66, 74,158, 13,156, 33,145,136, 33,150, 80,176,235, 89,210,123,125,222,181, 64, 80, 84,181, 38,171,146,166, 70,163,209,221,
+185,115,199,106,207,158, 61,112,118,118, 70,227,198,141,161, 80, 40, 32,151,203, 43,153,171,138,134,171, 10,163, 85, 73,179,236,
+119,145, 72, 4,129, 64,128,160,160, 32, 48, 12,131,113,227,198, 61, 99,178, 68, 34, 81,117,198,173,186,230,169, 23, 1, 68, 16,
+ 66,122,149, 62,128, 35, 0,244,174,240,251, 96,165, 82,185, 4,192, 90, 83, 53,133, 66, 2,161,238, 58,184,134,155, 32, 74,158,
+ 7,131,184, 45, 46,135,134, 99,239,206,141, 0,128,198,126, 29, 49,126,116, 64,121, 52,206,196,116,150,227,238,238,126, 56, 51,
+ 51,107,104,191,126,253,144,155,155, 75,175, 92,185, 18,109,218,180,129,143,143,143, 73,215,168,154, 55,231,244,136,136, 8, 15,
+173, 86, 11, 66,136, 41,230,236, 25, 77,138,162,112,224,192, 1,232,116,186,103, 86,182,239,253, 37, 22,142,241,194,180,247,246,
+225,171, 7, 71,177,109,219,182, 26,143, 93, 1,180,209,217, 54,219, 44, 21, 50,109,214, 46,123, 87, 54,117,234, 84,225,180,105,
+211,144,148,148,132,183,222,122, 75, 23, 20, 20,100, 72, 83,171, 79, 75, 57,110,139,177,178, 49,174, 86, 83, 38,147,237,191,120,
+241, 34,142, 30, 45,241, 37,177,177,177,104,222,188,185,101, 37,147,156,115, 12,133,137, 91,112,243,108, 12, 58,143, 56,132,155,
+103, 95, 7,155,119, 78,220,161, 57,242,205, 57,159,117,160, 42,205,163,217,217,217,229, 38,234,224,193,131, 22, 7, 15, 30, 28,
+ 5,224, 12,128,163, 0,144,147,147,179,193, 76, 77,128,194,180,215,198,140,130, 72, 98,141,152, 71, 41,232,221,181, 61, 26, 56,
+ 59, 35,226,126, 28, 18, 83,115,210, 41, 10,111, 14,238, 38, 93,171,213, 26, 62,185,118, 23,223,215,162, 73, 53,108,216,208,231,
+216,177, 99,146, 10, 17,232,242,255,184, 80, 40, 44,255, 94,102,188,235,114,127,150,153, 44,235,134, 86, 55, 87,111,237,110,121,
+ 51,242, 32,154,123, 13,131,253,176, 0,124,127,233, 18, 30, 70, 69,235, 12,197, 76,255,127,225, 26,253, 93,154, 62, 99,198,140,
+185,254,211, 79, 63,217, 37, 39, 39,227,234,213,171,104,220,184, 49,138,139,139, 77,121,225,173,164,169,211,233,156,203,182,161,
+ 40,202,185, 44,240,110, 48, 24,202, 46, 70,217, 31,209,174,194,122,118, 53,104,122, 86, 88,175,204, 92,121, 61,135, 99,151,202,
+ 37,146, 99,167,126, 62,108, 21, 29,115, 21,237,218,118,129,149,109, 75,112,108, 26,178,115,138,144,251, 72,133,207, 63,255, 10,
+ 43, 86,126,140, 51, 39,143, 91,249,182,104,123,194,192, 48,205, 0,232, 94,154,235, 78,145,153,193,103, 15,110,167, 8, 7,109,
+122,140, 76,172,121,172,152,252,250, 88,225,132, 9, 19,112,230,204, 25, 68, 69, 69,109,175,193,100, 5, 87,136,204,207,188,119,
+245,232,118, 16, 2,109, 70,140, 76,162,125,172,120, 99,210,120,225,212,137,131,112,227,183,205, 24,212,238,241, 61, 55,103,140,
+206, 45,181,216, 34, 33,178,101,114,252, 78,110,226, 70, 5,179,117, 5, 0, 85,193, 96, 93,193, 95,117, 48, 95, 4,134,151, 26,
+171,153, 79,191,152,136,234, 98,176, 0,160, 57, 96, 69, 73, 37, 55,247,174,120,215, 77,145, 20, 37,210,223, 11,131, 74,207,145,
+ 29, 9, 12,215, 30,176,184, 13,104,159,222,166,184,184, 88, 19, 23, 23,103,241,230,232,209,232,214,170, 21, 92, 29, 29,209,172,
+ 97, 67, 88,200,164,144, 74,196,149, 94, 89, 77, 46, 67,160, 40,226,235,235,139, 17, 35, 70, 64, 44, 22, 67,161, 80,192,202,202,
+ 10, 82,169,180,202,104,150,169,111,185,132, 16, 8,133, 66,220,187,119, 15,137,137,137,176,179,179,195,239,191,255,142,254,253,
+251, 63, 19,213,170,104,206,204, 9,209, 87,241,224, 47, 51, 98, 23,205,209, 98, 89, 10, 69,164, 45,228, 9,115, 81, 76,181,135,
+ 94,207, 64,175,215,227,251, 80, 35,254,136,211,192,104, 52, 64,175,215,215,180,207,234, 16,184,185,185, 77,110,214,172,217,156,
+215, 95,127,157,150, 74,165,208,104, 52, 40, 46, 46, 70, 84, 84, 20, 61,116,232,176,188, 17, 35, 2,108,207,157, 59, 71, 74,139,
+ 14,211,205,208,206,118,119,119,247, 40, 45,158,205,174,203, 93, 77, 81, 84,185,137,121,154, 55, 55, 68, 67, 36, 44,185, 38,219,
+183,111, 7,203,178, 32,132, 84,123,145,116, 20,245,235,202, 47,215,219,174,219,244, 3,108, 29, 26, 32, 36, 36,132,189,112,225,
+ 66, 33, 5,196, 62,140,138,218,240, 42,112,254, 24, 96, 52, 39,125,185,185,185, 22,141, 27, 55, 70,195,134, 13,193,113, 28,104,
+154, 46,143,190,100,103,103, 67,171,213,194,193, 50, 15, 77, 29, 27,130, 41,188, 2,245,189,207,224,106, 21,131,125, 23, 13,244,
+ 43, 62,184,251, 31,200, 56,126, 44,157,234,249,214, 12,119,103, 23, 15, 8, 8, 13, 85, 70, 54, 70, 13, 31, 4,161,196, 10, 79,
+146,179,208,182,165,183,235,164, 87,187,187, 10, 41, 6,139,215, 30,154, 3,112,223,215, 38, 87, 84, 84,196,198,196,196, 32, 34,
+162,196,239,218,216,216,192,210,210,178,210,127, 92, 32, 16,212, 43,162, 85,102,178,190,220,222,223, 82, 32,214,160,128, 13,198,
+158, 3,225,104,235, 27,128, 29, 55,255,212,177,233, 57, 3,190,209,233, 98, 15,191,192,193, 12, 23, 23,151, 89, 28,199,173, 32,
+132,228,245,232,209,163,193,161, 67,135,236, 83, 83, 83, 17, 30, 30,142,229,203,151,103,178, 44,203, 16, 66, 40, 66,200,103,207,
+ 97,119, 92, 5,131,245, 60, 17, 43,228,120,207,201,134, 26, 41, 18,216, 52,102, 10,138,158,100, 25,200,233, 98,134,251, 14, 0,
+ 93, 99,230, 38, 16,188,125,252,200,118, 55, 39, 37,135, 62,202,126, 80,167, 27,241,229,135,111, 32, 59,187, 16,223,239, 94, 3,
+ 64, 10, 35, 35, 68,175, 62, 99,225,236,236,142,153, 51,102,186,108,223,185,227, 93,134,227,190,193, 75, 66,218,245,109, 39, 1,
+ 4, 43,149,202,168,119,103,206, 84, 54,110, 60, 5,114,185, 28,135, 15, 31,198,161, 45, 91,216, 77,192,120, 25,112,121, 54,112,
+178, 70,157,155,127,233,204,155, 61, 91,217,162,197,108,200,100, 50,252,118,225, 71,232,210, 14, 20, 14,239, 6, 99,177, 14,195,
+ 27,141, 32, 14, 9,103,169, 28,177, 24,143, 0, 64, 44,135, 26,192,211,197, 96, 47,154,193, 42,227, 28,254,170,151, 53,179, 82,
+ 68,171,206,121,167, 88, 26,185,251,131,137, 94, 13,160,167, 12,161,103,145,170,231,216,117, 15,141,194,219,249,100,225,253, 42,
+ 76, 86,233,141,205,121,122,122,162, 95,135, 14, 24,221,179, 39, 68, 34, 17,228, 82, 9,172,229, 22, 32,108, 73, 36,171,172,232,
+176,134,103, 34,170,138, 62, 57, 58, 58, 66, 34,145,148, 27, 44, 51,162, 89, 85,106,114, 28, 7,145, 72,132,136,136, 8,244,232,
+209, 3, 30, 30, 30, 56,122,244, 40, 6, 15, 30,252, 76, 81,162,185, 38,171,204,104, 61, 85,140, 55, 24, 64, 89, 36,203, 44,163,
+165, 51, 80,200, 50,180, 5, 69,181, 2,195, 0, 44, 1,244, 58, 29, 8, 1, 8, 1,104,163, 1, 58,157,174,124,159,166, 20,201,
+186,184,184,120, 90, 88, 88,172,250,232,163,197, 45,218,182,109,135,204,204, 76,112, 28, 7, 75, 75, 75, 20, 23, 23,195,198,198,
+ 6,221,186,117,123,178,106,213, 42, 53, 33,152,105,166,201,170, 55,101,231,252,210,165, 75,149,138, 13,203, 38,141, 58, 5,211,
+222, 63, 8,169,168,164,104,169,172, 14, 79, 77,249,110,223, 94,221,113,253,118, 44,243,246,226,205,122,113,118,248, 90, 23,142,
+219,155, 82,143,227, 34,132, 32, 43, 43, 11,233,233,233, 24, 57,106, 20, 14,253,244, 19, 18, 18, 18,208,178,101, 75,244,237,219,
+ 23,206,206,206, 72, 72, 72,192, 31,215,244,208,231,230, 32,199, 16, 14,133,117,103,156, 10,137,211, 47,223,110,140,251, 23, 51,
+140,145, 0,222,176,177,177,105, 82, 92, 92,172,102, 24,230, 24,128, 99, 0,198,139, 68,162,241, 10,133,194,181,160,160,224, 49,
+ 74, 90, 19,157,174, 77,204, 66, 46,119,148,201,109,192, 49,122,136, 68, 34,120,120, 52, 6, 97, 13,200, 45,208,226,205, 9, 35,
+112, 59,226, 62, 46, 92,190,193,208, 52,247,173, 41,167, 85, 40, 20, 18, 31, 31, 31,100,100,100, 64, 44, 22,195,194,194, 2, 86,
+ 86, 86, 88,186,116, 41,182,108,217, 82,110,178,234,106,180,166, 3, 62, 54,158, 86, 55,190,216, 90, 98,178,210, 84,106,164,167,
+136,161,116,108,128,111,183,108,210,228, 38,164,117,254, 1,136,125,209, 31,178, 28,199,125,150,154,154,234, 44, 18,137, 92, 24,
+134, 65,114,114, 50,110,221,186,133,185,115,231,166,103,103,103,247, 65, 29,143, 81, 46,151,103,148, 69,178, 74,139, 14,171, 43,
+ 78,204,171, 16,201,202,171, 65,178,186, 98, 66,239,198, 13,173,131,118,111,156,239,217,177,115, 55,129, 66,100,147, 91,244, 40,
+173, 71,232,213,144,110,115, 55,126,255,110, 98,110,209, 32, 0,241,213,137,202,196,226,161, 93,186,119, 23,129,164, 67, 36,237,
+129,175,214, 77, 64,102, 86, 1,114,115, 10, 33,145, 88,194, 64, 11,193,114, 20,186,245,232,137, 31,247, 29,129,255,140,183,132,
+ 82,177,120, 32, 99, 48,188, 52, 70,171,148, 53,223,125,247,157,167,175,175, 47,246,238,221,139,203,251,247, 99,106,126, 62, 66,
+ 4, 2, 33, 45, 22, 59,157,167,233, 93,168,197,104, 85,212,241,247,247,199, 15, 63,252,128, 3, 7, 14, 36, 77,238,159,113, 98,
+254,100, 56, 27,141, 24, 18,254, 0, 14,141, 70, 0,225, 15,224,240,138, 47,154, 49, 34, 60,162,168,202,221, 65, 5, 6, 6,246,
+174, 56,127,193, 80,163,154, 34,118, 17,128, 62,129,129,129,164,226,188,214,140, 83,217,124,246,154, 65, 77,188, 90, 53,245,164,
+232,163,155,145,172, 97, 12,159, 60, 48, 74, 31, 22,145,249,247,129, 77, 53,188, 65, 16,161, 80, 8,107, 11, 11, 40,237,236, 74,
+194,252, 2, 1,192, 1, 28, 13, 80,108,137, 1, 32, 28, 5,194,154,149, 97, 64, 42,149, 86, 89,241,221,220,186, 89, 21, 53, 11,
+ 11, 11,241,228,201, 19,204,156, 57, 19, 10,133,162,196,185,167,165,193,203,203, 11, 34,145, 8,169,169,169,248,237,183,223,208,
+164, 73, 19,200,100, 50,179,220, 86,133,232, 82, 27,148,180, 50,108,163, 86,171,109, 92, 93, 93, 97,118, 68,139, 35, 40,214, 83,
+ 48, 24, 88, 60,124,248, 16, 42,149, 10, 79, 30, 63, 66, 71, 77, 1, 8,132, 32,132,152, 21,209,114,119,119,111,229,237,237,189,
+ 99,237,218,181,146,134, 13, 27,130, 16, 2,123,123, 59, 20, 23, 23, 35, 43, 43, 27, 45, 91,182,132,135,135, 7,214,174, 93, 11,
+ 0,135,254,105,147,245,212, 61, 85,110,180, 42, 26,174,247, 95,245, 68, 78,142, 21,132, 66, 65,185,113,174,165,142,150, 4, 0,
+250, 12, 26, 35, 10,186,112,222,146, 1, 86,165, 9,133,171, 68,181, 95, 71,154,229, 56, 69,117,191, 39, 39, 39, 67, 44, 22,227,
+248,177, 99,200, 73, 79, 71,219,182,109,209,169, 83, 39, 60,122,244, 8,183,111,223,134,163,163, 35,148, 13,187, 34,228,177, 17,
+209, 42, 45,108,109,109, 17,151, 34,248, 55,187, 12,152, 49, 96,192,128,229, 27, 54,108,112,118,113,113, 17,103,102,102,250,110,
+221,186,181,237,214,173, 91,231,189,251,238,187, 13,222,125,247, 93,123,165, 82, 41, 74, 75, 75,243,249,240,195, 15, 95, 9, 14,
+ 14,110, 2, 96,125, 77,130,150,150,214, 14, 66,137, 37, 40, 74, 4, 59, 91,123,136,164,150,224, 24, 17, 88, 14,176,177, 85,226,
+250,237,227,248, 61,178,112, 86, 70, 54,142,153, 20, 31, 43,189,238,142,142,142,207, 68,170,231,206,157,139,221,187,119,151, 23,
+ 35,214,213,100,125,185,181,191, 21, 85,106,178,210,146, 69,160,244, 77,112,246,100, 88, 94,110, 66, 90,143,151,193,100,149,229,
+113,132, 16, 60,126,252, 24,197,197,197,184,118,237, 26, 62,251,236,179,204,167, 77,150,179,179,243, 12, 27, 27,155,149, 69, 69,
+ 69, 95,165,165,165,109,174,245,197,175,196, 68,149,125, 46,155, 87, 89,156,104, 98, 82,189,170,138,100,121,184,202, 47,222,190,
+118,208,203,150,220,165,144, 56, 19,120, 88, 16,101,125,211,185,215,176,142,195, 5,237,183,173,110,212,105,214,210,139,201, 5,
+ 58,223,234, 34, 91, 28,203,182,183,180,178, 6,144,129,240, 91, 87,202, 77, 86,118, 78, 62,244, 70, 33,244, 6, 10, 58,163, 0,
+253, 6, 12,193,150, 29, 7,144,154,145, 3,150,101, 91,191,100, 38,203,161, 85,171, 86,179,199,143, 31,143, 85,171, 86, 33,120,
+195, 6,195, 59, 20, 85, 32, 2,200, 57,150, 5, 71, 8, 37, 48,173, 18,123, 37,157,111,190,249,230, 36,128,137,107,231,162,107,
+110, 17,222,116, 27, 65, 28, 26,141, 40, 89,113,220, 71, 4, 0, 28, 50,131, 43, 63, 50, 3, 2, 2,168,178,146, 53,115, 75,216,
+254,235,136, 2, 2, 2, 66, 2, 3, 3, 81,113, 94,211, 6,214, 13,124,135, 45, 90, 48,103, 93,199,193, 61, 41,245,130,129,200,
+ 41,208, 49,203,162,141,210, 20,109,205, 38,171, 34,139,182,110,197,237,216,146,255,113, 67,103,103, 44,158, 52, 9,132, 1,126,
+143,138,198,145,224, 96, 76, 24, 48, 0,150,114,185,201,145, 13,142,227,170,140, 98, 85,140,102,153, 27,117,202,203,203,195,177,
+ 99,199,208,169, 83, 39, 40, 20, 10,136, 68, 34,180,105,211, 6,247,239,223,135,183,183, 55, 40,138,194,169, 83,167, 48,122,244,
+104,196,199,199,163,107,215,174, 86,137,137,137,102, 27,173,232,232,104, 27, 66, 72,175,178,232, 71, 93,209,235,245,136,137,137,
+193,136, 17, 35, 96,111,111, 15,119,247, 67, 8,190,120, 16,138, 86, 83, 65, 81, 48,203,104,177, 44, 59,125,248,240,225, 18,138,
+162,160,213, 22, 67, 46,183,128,165,165, 21,172,173,109,224,227,227, 11,149, 74,133,193,131, 7, 27,226,226,226,182,169,213,234,
+163,230,166,181, 69,139, 22,150, 9, 9, 9, 83, 27, 53,106, 36, 5, 0, 11, 11,139,150,222,222,222,107,149, 40,240, 0, 0, 32,
+ 0, 73, 68, 65, 84, 11,227,227,227, 11,205,141,106,149, 25, 44,138,162, 32, 20, 10,203,141,150, 72, 32,128,171,139,115,249,247,
+210,250,105, 84, 13, 90, 5,169,217,122, 25, 0,120,122,122, 98,203,206, 51,130,225,195,135, 99,222,188,121,160,105, 26,219,182,
+149, 52,178,123,253,245,215, 97, 52, 26,113,226, 68, 73, 35, 73,145, 72, 84, 99,216,228,214,173, 91, 8, 15, 15, 7, 77,211,200,
+207,207,199, 47,191,252,130,144,171, 87,113,248,212,175, 72,120,252, 8,109,124,189,240,214, 91,211, 33, 22,139,177,111,223, 62,
+244,232,209,227, 95,205, 16,196, 98,241,228,221,187,119,187,238,221,187, 55,239,212,169, 83,154, 46, 93,186,200, 54,109,218,228,
+188,101,203, 22,165,193, 96,192, 7, 31,124,144,113,227,198, 13,253,168, 81,163, 44,119,237,218,229,218,180,105,211,129, 12,195,
+ 84,101,180, 44, 1, 76, 0, 48, 37,183,208, 32,202, 43,212,130, 99, 12,120,156,240, 4,249, 69, 6,112,172, 17, 73, 41, 42, 20,
+233, 88,100,231, 20,162, 77,251, 65,223, 93,185,114,229, 99,163,209,184, 12, 64, 96,109,233,140,138,138,194,141, 27, 55,144,144,
+144,128,199,143, 31, 87,118,138, 51,102,224,192,129, 3,102, 71,180,170, 54, 89, 66, 80,122,111, 4,158,186,153,151,241, 72,253,
+210,152,172,210, 60,104,133,171,171,235, 10, 87, 87, 87,249,165, 75,151,108, 27, 53,106, 4,134, 97, 12, 79, 71,178,250,244,233,
+243,201,238,221,187, 93,189,189,189,231, 2,216,252, 95, 72,187, 64,128, 25, 95,109,159,237,100, 45, 77, 82,225,225,250,210,190,
+ 4,133, 64,113, 1,112,229, 39,136,186,127,250,100,238,168,143,236,151,236, 93, 53,131, 3, 87,109, 11,217,184,248,100,108,223,
+190, 5,243, 63,120, 19, 63,126,255, 21, 56, 78, 4, 61, 45,132,103,227, 46,208, 27, 57, 80, 2, 17,218,182,239,128,203, 87,174,
+ 65, 44, 0,142,237,221,254,146,249, 44,228,220,187,119,111,219,169, 83,167,222,155, 55,111, 30, 56,142,147,174,220,190, 93,155,
+153,153,185, 6,230,245,127,245,180,206,232,237,219,183,199, 46,217,146,121,114,254,100, 8, 19,206, 82, 57,225, 15,224, 48,238,
+ 35,130,227,235, 40,188,226,139, 28, 69,213,143,248,171, 79,205, 95, 14,163, 85,230, 36, 43,206,171,162,125,243, 38,171,109, 29,
+236,167, 11,172,221,157, 22,207,123, 71, 20,159,166,195,137, 70,147,138,126,219,255,173,101, 26, 35,251, 46, 14,186, 77,230,236,
+248,200,111,191,149,127,254,250,208,161, 42,127, 83,143, 27,103,242,155, 89,117, 81, 44,115, 35, 89, 0,160, 80, 40,236, 6, 14,
+ 28,136,254,253,251, 99,236,216,177,229,117,178,218,181,107,135,195,135, 15, 99,204,152, 49,184,115,231, 14, 92, 93, 93,225,231,
+231, 7, 63, 63, 63,156, 63,127,222,220, 76, 14, 44,203,162, 85,171, 86,101,173, 14,219,164,164,164,216,212,245, 66,234,245,122,
+100,103,103,195,193,193, 1, 82,169, 20,157, 59,119,194,123,239,119,134,147,235, 15,104,213,194, 23, 26,141,166,188,249,187, 9,
+ 15,219, 86,205,154, 53, 67,102,102, 38, 50, 51, 51,161, 84, 42,225,230,230, 6, 23, 23, 23,172, 95,191,158,108,222,188,249,130,
+209,104,220,150,149,149,101,118, 36,203,197,197,165, 39, 69, 81,159,104,181, 90,105,133, 55, 92,169, 82,169, 60,173,213,106,215,
+168,213,106,147, 43,130, 82, 20, 5,163,209, 8,138,162,112,238,177, 27, 52, 6, 10, 5, 41,225,152,247,170, 87, 37,227, 37, 22,
+139,107, 45, 46, 37,132,104, 38, 78,156,232,236,225,209, 16,201,113, 81, 56,126,156, 96,195,134, 13,101,173, 34, 17, 91,250, 98,
+ 80,246,189,111,223,190,104,220,184, 49,136, 25,125,101,112, 28,135,136,136, 8, 28, 58, 29, 2, 87,175, 22, 72,122, 24,131,219,
+231,207,162,145,210, 1,254,237, 59,128,166,233,122,117,189,241, 60,160,105,122, 79,243,230,205,137,193, 96, 8, 1,176, 37, 50,
+ 50,242, 77,181, 90,253,193,153, 51,103,220,198,143, 31,175, 58,123,246,236, 38, 0,123, 35, 35, 35,103,127,254,249,231,253, 25,
+134,169,178,181,160, 80, 40,252,241,195, 15, 63,236, 51,126,252,120, 74, 34,160, 13,151, 46,238, 19, 49, 12, 77, 45, 90,182,135,
+189, 18, 26, 34, 96, 24,154, 26, 59,241, 67,238,252,111,145,130, 89,239,127,205,182,235, 50, 28,247,238,221,115, 9, 8, 8,248,
+156,166,233, 26,141, 86, 89,164,170,186, 8,165, 80, 40,196,155,111,190,137,195,135, 77,175, 65,245, 22,224,109,227,101,117,227,
+203,173, 3,172, 40, 81, 81, 5,147,213, 20,129,167,110,230,165, 63, 84,189, 84, 38, 11, 0,178,179,179,119, 2,216,201,113, 92,
+186,165,165, 37, 10, 11, 11,171,186,255,228,145,145,145,114,169, 84,138, 65,131, 6, 57, 4, 7, 7,199, 10, 4,130,205, 42,149,
+170, 90,199, 81, 85, 49, 97, 85,197,137,168, 71,171, 67,123, 37, 2, 58,247,108,111,253,192,118,149,181, 92,164,187,211, 40, 86,
+110, 67, 1,200,215, 55,120,124, 61,113, 66, 1,149, 33,107,215,161,239, 43,176, 17, 89, 6,228, 49,133, 85, 26, 45,129, 80,120,
+ 59, 63, 55,111,104, 65,161, 1,161,191,223,195,196, 9,205,160, 55, 82,224, 56, 1,138, 52,122, 64, 40,134, 0,192,235,147,222,
+ 0,161, 68,200, 73, 87, 65, 40, 20, 70,130, 97,240,146,177,116,246,236,217, 67,151, 45, 91,214,100,241,226,197, 88,188,120,177,
+215,238,221,187,119,126,249,229,151,139, 51, 51, 51, 91,163,150,206,199,107,208,105,116,246,240,167, 11, 78, 95,219,145, 63,188,
+155,246,225, 43,190, 37,145,175, 87,124,241, 63,246,174, 59, 44,138,171,123,191, 51,179, 13,150,165,247, 46,160, 96, 80,236, 45,
+ 17, 99,111,177,107, 84, 44,159,189,198, 94,177,197, 18,107,212,104,108, 81, 49, 38,246, 94, 34, 22,236, 21,187, 32, 40,130, 40,
+125, 89,250, 82,182,239,206,206,252,254,160,252, 64, 41, 11,154,228, 75, 62,222,231,217,103,217,246,114,231,222,153,185,239, 61,
+231,220,115,114,184, 92,196,114, 40,100,179,108,217, 48,163,222,189,123,183, 47,253,252, 15,195,135, 65,240, 37,175, 13,138,209,
+170,231,233,220,163, 89, 83,191, 25, 75, 22, 47, 49,141, 10,189,141,192, 31,118,176,222, 45,186, 22,236,185,247, 66, 35, 51,241,
+232, 41,203,138,125, 96,168,190, 0,128, 30,157, 6,162,113,131, 86, 31,125,232,223,177, 48, 89,251,253, 91,207,144,158, 41, 54,
+120,178, 45, 18, 7,229,198,100, 25,178,165,255, 67, 40,149,202,220,200,200, 72,187,148,148,148, 50,129,239, 30, 30, 30, 32, 8,
+ 2,143, 31, 63,198,163, 71,143, 16, 16, 16, 0, 14,135, 3, 46,151,139, 59,119,238, 84,203, 26, 83,202,186, 84,188,235,176,187,
+139,139, 75, 69,187, 13,171,228, 82, 42,149,200,203,203, 67, 72, 72, 8,234,213,171,135,181,107,215,194,201,209, 30, 75,150,204,
+ 5,195, 48,200,207,207,135, 94,175, 55,212,162,197, 20, 91,139, 24,134, 65,102,102, 38, 60, 61, 61,177,115,231, 78,108,221,186,
+117,181, 68, 34,249,163,186,109,116,117,117,181,208,235,245,243,123,245,234,213,181,127,255,254,232,222,189,108, 62,214, 35, 71,
+142,152,158, 62,125,122,221,182,109,219,122,104,181,218,245, 25, 25, 25,153,134,240,238,223, 95,152,126, 73,216,102, 57, 2, 7,
+215,193,200,169, 7,176,121,243, 25, 8, 4,130, 50, 19,239,170, 85,171, 42, 21, 49, 12,203,122,243,178, 66, 83,231, 46,220,100,
+183,110,221,117, 92,191,158, 1,146, 36,225,232,232, 8,146, 36, 17, 31, 31, 15,146, 36,225,238,238, 14,146, 36, 33, 22,139,139,
+ 99, 2,165, 40,103,215, 99,249,171,112, 18, 42,149, 10,201, 73, 9, 72,121, 23, 3, 81,126, 26,108,205,132,144,190,122,137,198,
+227, 38,148,228,127,250,155,113, 72,163,209, 28, 42,245,122,211,133, 11, 23, 52, 4, 65, 12, 66, 97,156, 70,177, 69, 99, 53, 77,
+211,171, 43, 34,105,211,166, 77,211,197,139, 23,115,139,211,109, 56,185,173,161,181, 90, 45, 3, 0,245, 27,127, 93, 70,237,199,
+198,198, 98,243,230,205,144,203,229,224,241,120, 60, 67,250,129, 97,152,146, 29,134,229,137,176,234,136, 44, 0,176,118,119,217,
+254,248,249, 29,125,248,187,221,202,136,232,203,198,146, 36, 18,164,230,223, 43,178, 62,180,108,185,184,184, 44,103, 24,134,101,
+ 89,118, 89,169,143, 4,110,110,110,247,174, 94,189,106, 77,211, 52,182,109,219,102,145,150,150,102,241,245,215, 95, 7, 2,168,
+ 80,104,149,231, 38, 44,207,157,136, 82,187, 14, 5, 2,129,149, 70, 83,161,241,228,163, 93,135,122, 61,124,204, 76, 45, 32, 69,
+ 10,212, 54,186,166,185,214,116,206, 53,201,132, 48,167,196,102, 13, 76,244, 58, 79, 50, 95, 3,103,161, 5, 24,150,173,112,107,
+180, 90,167,187, 28,246,252, 69, 55, 55,215,122,212, 31,193,119,209,111,192, 96,168,213, 36, 84, 58, 2, 4,197, 5, 65,241,208,
+168,113, 51,124,209,176, 49, 88, 0,207,158,132,210, 26,157,238,218,191,105,236, 29,219, 78, 15, 32, 8,252, 12,150, 97,203,201,
+163,229, 57, 96,192,128,117, 0,102, 84,197, 99,215,102,122, 0, 73, 22,242,148,206,163, 53,103,250,100,188,122,194, 53,191,251,
+124, 3,175,123, 27, 92,204,188, 78, 64,104,244,255,187, 14,185,228, 39,165,230,248,167, 8,174,170,133,150,171,171,171,133,153,
+192,104,255,119,227,198,154, 38,134, 63, 68,218,235,199,120,112, 55, 70,122,252,244,153, 28,121,118,198,184,106,136,172, 18, 55,
+159,181, 67, 29,120,248,126, 44,180,140, 68,182, 0, 0, 15,223, 86,160, 76,170,151, 70,168, 60,107, 86, 77, 68, 86,233, 27,118,
+121, 57,180, 38, 77,154,132,160,160, 32,180,109,219, 22,222,222,222, 37, 55,251,234, 90,205,202,177, 46, 85,123,183, 97,105, 20,
+ 20, 20,192,221,221, 29,123,247,238, 69, 68, 68, 4, 76, 77, 77, 17, 16, 16,128,130,130,130, 18,129,101,104, 48, 60,203,178,177,
+ 87,175, 94,109, 57,100,200, 16,150,203,229, 18,185,185,185,176,176,176,192,206,157, 59,229, 18,137,228, 98, 13, 68,214, 96, 30,
+143, 55,119,232,208,161, 84,253,250,245,145,158,158, 14, 51, 51, 51, 29, 65, 16, 92, 0,176,176,176,208, 25, 27, 27, 99,242,228,
+201,104,210,164, 73,187, 5, 11, 22,180,229,112, 56, 59, 83, 83, 83, 15, 84,118, 46, 17, 4, 81, 50,161,142,251,249, 13, 52,154,
+194, 9,122,215,174, 93, 40,138,117,251,127, 23,193,187,119,128, 1, 59, 89, 68, 34, 17,188,189,189,203, 29,251,118,237,218,225,
+217,179,103,133,174, 73, 14, 7,118,118,118,120,240,224,129, 65, 59,169,138, 19, 65, 70, 70, 70,194,215,195, 6, 17,215,175,194,
+ 70,200, 69, 19, 39, 7,184,180,107,143,152,152,152,191,211,154, 69,160, 48, 14,163, 75,209, 57,184, 15,192,164, 82,175,119, 2,
+216, 94, 29, 66,154,166, 89,146, 36,137,228,228,100,173, 80, 40, 36,172,172,172, 56, 2,129, 0,106,181,186, 68,112,197,198,198,
+ 34, 56, 56, 24, 41, 41, 41,176,178,178, 34,205,205,205,161,213,106,165,134,240,251,248,248,192,193,193,161, 76,224,251,184,113,
+227,106, 36,178, 70, 3,126, 65,107,214,215, 17,144,148,185,175, 77, 15,196,189,137, 87,145, 26, 24,253, 47,136, 44, 0,200,205,
+205,221, 3, 96, 79,241,107, 27, 27,155, 49, 20, 69, 45, 81,171,213,230,119,238,220,177,176,181,181, 37, 14, 28, 56,160, 91,182,
+108, 89, 46, 69, 81, 82,130, 32,182,252,253,226, 16,175,179,242,222,185,115, 45,157,152,112, 21, 27, 58, 43, 57,240, 11, 41,183,
+158, 45,209,208, 15, 3, 50,162,238,143,161,223,125,149, 46, 73, 35, 89, 48,175, 43,185, 7,239, 11, 92,188,106,126,204,155, 23,
+110, 70,102, 70,152, 52,121, 49, 46, 94,185, 5,130,228,226, 94,232, 99,104,180,122,100,229,228, 97,232,176, 17,112,113,180,193,
+235, 71, 33,153, 52,195,236,252,119,137,108,102, 71,183,126, 99, 44, 5,198,194,162, 62,209,227,208,175,115, 65,146, 63,227,251,
+239,191,135,159,159,223,212,200,200,200,149,168, 34,143, 22, 65, 48, 59, 26,181, 31,102,201, 19, 20,242,176,140, 30,123, 79, 6,
+ 22,229,209,154,141,157,123, 78, 55,106,232, 17,183,162,178, 60, 90,255, 34,145, 85,250,185,114,161,229,238,238, 46, 48,225, 98,
+ 34,151,226, 44,248,110,120,127,219,140,119,175,144, 18,245,162,208,189,160, 85,106,211,222, 70, 25,146, 10,189, 11,202,230,239,
+ 96, 43,115, 93,169, 84, 6,173,232,203,112, 22, 79,184, 31, 90,179,170, 41,178, 62,226, 44, 45,182, 74,231,205,114,117,117,197,
+186,117,235, 12,201,163,245,225,177, 23,163, 59, 10, 3,224, 75, 7,195,119, 55, 80,100,149,203,105,107,107,139,236,236,194, 12,
+ 9, 29, 58,116, 64,135, 14,255,191,159, 65,171,213,150, 88,177, 76, 77, 77,203,179,104,125,196,105,108,108, 28,120,230,204,153,
+177,161,161,161, 67,230,205,155,199,237,220,185,115,177,152, 83,192,176,218,110,101, 56,245,122,253,228,144,144, 16,138, 97, 24,
+236,221,187, 23,207,158, 61, 99,133, 66,225, 82,161, 80,184,195,216,216, 88,175, 84, 42, 39, 77,152, 48, 97,196,138, 21, 43,200,
+118,237,218,225,225,195,135,164,167,167,231, 40,160, 76, 18,203,114,143,253,241,227,199, 32, 73, 18,116, 78, 18,166, 6, 30,135,
+137, 49, 7,111,222,188, 65, 78, 78,206, 71, 73, 76, 13,233,207,210,150,146,226, 71,187,118,237, 74,220,144,173, 91,183, 6, 69,
+ 81, 8, 11, 11,171,200, 13, 91,154,147,181,182,182, 46, 57, 63,120, 60, 30,110,221,186,133, 31,126,248, 1,110, 86, 22,144, 70,
+ 69,192,161, 67, 39,116, 29, 59, 1, 1, 1, 1,160, 40, 10, 86, 86, 86, 37,150, 95, 3,206,165, 79, 65,105,206,177,190,190,190,
+163, 94,191,126,237,210,168, 81, 35,199,200,200,200,142,126,126,126,238, 17, 17, 17,197,175, 5, 48, 44, 54,167,132,243,233,211,
+167,167,118,236,216, 49,121,244,232,209, 60,134, 97,244,137,137,137, 58, 0,132,131,131, 3,245,244,233, 83,230,143, 63,254,128,
+ 82,169,132,139,139, 11,233,236,236, 76, 92,187,118,141,137,138,138,122,204,178,236, 98, 67,142, 93,175,215,151, 73,227, 80,252,
+247,145, 35, 71,170,125,189,215,249,194,103,109,231,175,235,187,102,165,134, 65, 34,126, 7,125,158,173, 54,248,220, 5,117, 53,
+ 69,214,159, 61, 70,127, 37,231,170,183,111,223, 58,171,213,106,240,249,124,236,218,181, 75,187,110,221,186,215, 89, 89, 89,254,
+ 40,127, 71,121, 25,206, 26,238, 58,204,169,132,243,163, 93,135,121,217,184,120,238,252,211,150,162, 1,251, 48, 53, 53,179, 36,
+176,145, 37, 8,171, 51,246, 13,252,133,173, 26,137,201, 75,203,201, 2,189,226, 98, 37,199,174, 81,106, 52,131, 7, 12, 28,118,
+227,216,177,163,162,101,203,151,227,193,227, 8,100,231,202,192,176, 20, 24,130,192,146, 37,203,224, 96, 99,133,252,212,183, 10,
+181, 86, 59, 0,101,115,104,253,227,199,157, 32,200,105,215,254, 56,240, 51, 73,128,145,167, 71, 11,168,130,119,194,145, 1, 3,
+ 56,131, 7, 15,198,153, 51,103, 16, 25, 25,185,187, 18,145, 85,194,201,178,228,180,136, 59,199,127, 38, 0, 70,153, 25, 45,224,
+200,226,132,163,134, 15,224, 4, 4, 4,224,108,112, 40,142, 93,136,251,229,216, 5, 92,192,191, 27,213,207, 12,111,202, 65,164,
+127, 3, 47,231,118,205, 26, 26,113,244, 74,164, 68,189, 67,142, 92,133,107,175, 18,115, 73,150,172,113,110,157,194, 27, 36, 15,
+ 73, 73,111,203, 89, 89, 25, 21, 77,232,170,106,113,146, 36, 89,198,154,245, 41,150,172,210,237,180,183,183, 47, 83,206,165,244,
+196, 93, 28, 3, 84,131,212, 14,129, 73, 73, 73,102, 73, 73, 73, 96, 89, 22,143, 31, 63, 54,107,221,186,117,224,167, 88,179,230,
+206,157, 91, 98,181,250,240,185,188,247,170, 66, 81, 80,250, 86,157, 78,119,114,193,130, 5, 83, 91,183,110,221,109,249,242,229,
+ 4,170, 81,128,247, 3,107, 14,205, 48, 12,110,223,190,141, 51,103,206,232,181, 90,237, 68,137, 68, 18, 81,234, 43,219,158, 63,
+127,126,109,224,192,129, 7,162,163,163,169,215,175, 95,131,101,171,222,119,170, 84, 42,225,237,237, 13,154,166,177, 97,170, 43,
+ 10, 10, 26,129,166,105,232,245,122,152,152,152,148, 88,241, 74,139,231,170,206, 35,189, 94,255,145,208,122,252,248, 49, 40,138,
+130,191,191, 63, 94,188,120, 81, 98,209,170,202, 2,165,213,106,147,236,237,237,237, 87,173, 90, 85,210,174,204,204, 76, 92,189,
+122, 21,109,190,252, 10, 13, 38, 78, 66,106,106, 42,182,108,217, 2, 39, 39, 39,172, 93,187, 22, 57, 57, 57,160,105,250,175, 54,
+167,247,124,253,250,181,203,240,225,195, 51, 34, 34, 34, 92,130,131,131, 45,122,247,238,109, 50,108,216,176,140,136,136, 8, 23,
+130, 32,190, 66, 53,131,160, 25,134, 89,180,100,201,146, 43,107,215,174, 13,156, 49, 99, 70,235,209,163, 71,115,185, 92, 46, 35,
+ 22,139,233,163, 71,143, 18,222,222,222, 36,143,199, 35, 66, 66, 66,152, 39, 79,158, 60,162,105,122, 3,128,123,213,177, 56,151,
+ 22, 89, 20, 69, 25, 42,178,202, 96,150,157, 96,148, 41,153,233,191, 99,215, 58,178,190,135,139,246,224,209,171,201,247, 30,190,
+125, 79,169,233, 89,251, 43, 73, 13,240,111, 6, 69, 81, 39,124,125,125,199, 76,155, 54,205,184,123,247,238,130, 21, 43, 86,228,
+ 21, 20, 20, 84, 36,178,202, 89, 48,255, 37,187, 14,127, 93, 52, 47,120,214,156, 70, 99,188,198, 59,212,193,117,121, 6,164, 28,
+138, 52,179, 32,209,204,157, 66, 65, 86,172,237,133, 27,191,199, 3,168, 42, 47,219,211,231, 47, 35,187, 52,108,212,244,244,134,
+181, 27,236,150, 46, 92,192, 61, 29,124, 25, 44,173,197,227, 59,119, 32,226,233,217,168,231,215,211,213, 90, 77,127,252, 11, 75,
+240, 72, 30,108, 63, 6,224,188,149,149, 85,248,216,209,163,189,125,125,135, 65, 40, 20,226,212,169, 83, 56,180,109,155,126, 43,
+ 48, 68, 0,188,152, 92, 69, 62,189,140, 71, 37, 60, 97, 19,198,142,245,105,214,108, 60,132, 66, 33, 78,158, 60,137, 3, 91,183,
+ 26,204,243, 15, 71,113,102,248,139,248,255, 12,241, 85,196,104,145, 68,193,163,183,137,178,199,111, 19,101, 96, 88,150, 97, 89,
+ 53, 73, 34, 89,174,213,174,125, 27, 39,174,145, 40, 40,118, 29,174, 94, 51,237,243,249, 60, 74,137,159,154,110,233, 46, 71,100,
+165,148,174,145, 86,122,146,174,232,111,157, 78,151, 98, 32,253,122, 55, 55,183,143,222,171,185,233,151,173,150,200, 50, 52,143,
+ 22, 0,100,103,103, 75, 0, 44,125,248,240,225,145,110,221,186, 77, 0, 32,174,225, 24,237,109,223,190,253, 68, 0, 20, 65, 16,
+187, 83, 83, 83, 35, 62,186,224, 37,146, 24, 39, 39,167,141, 30, 30, 30,147, 10, 23,166,196,222, 42, 38,242,184, 70,141, 26,105,
+203, 27,139,138, 94, 51, 12, 83,229, 24,229,230,230,162, 85,171, 86, 31,213,180,100, 89, 22,137,137,137,197, 22,167,146,190,175,
+ 76,192,201,100,178, 73,211,167, 79,223,195,229,114,221, 0, 16,197, 34, 87,175,215, 83,219,183,111, 55,210,235,245, 20, 0,130,
+ 36, 73,154,203,229,170,206,156, 57, 67,211, 52,157,164, 86,171, 39,253,197, 55,136,147, 68, 97, 41, 6,249,235,215,175,235, 23,
+ 89,178, 82, 34, 35, 35,195,142, 29, 59,102, 11,224,120, 13,121,239, 41, 20,138,123,235,214,173,107,183,107,215,174, 69,147, 38,
+ 77,106, 21, 16, 16,192,233,208,161, 3, 46, 94,188,168,191,125,251,246, 99,165, 82,185,190, 58, 2,171,104, 44,243, 92, 93, 93,
+ 75, 4, 87, 21,215,114,165,129,188,214,238,130, 29, 35,166, 56, 25,237, 93,127, 85,150,149,170, 9,213,201, 52,139,127, 7, 34,
+241, 63,140,244,244,244,121, 0,150,109,217,178, 37,181, 73,147, 38, 2, 30,143,167, 49, 84,100,253,133,160,153, 92,217, 55, 63,
+117,253,246,124,251, 37,211, 61,186,118,244, 23,186,214,177,115,142,122,151,142,216,135, 23,229,225, 23,214, 36,176,106,105, 63,
+ 0,134, 68,174, 63, 81,107,181,245,230, 46,152, 59,149,207,229,118,211,235,245,141, 59, 95, 59,199, 82, 20, 21,161,209,233,174,
+ 21,185, 11, 85,255,226, 33, 95,189,113,227, 70,111, 95, 95, 95,156, 58,117, 10,215, 14, 31,198,208,172, 44,220,162, 40,138,228,
+241,172, 47,104,181,155, 96,152, 64, 90,189,121,243,102, 31, 63, 63, 63,156, 56,113, 2, 33, 7, 14, 96, 72,205,120, 42,154,235,
+ 90, 2,176, 45,122,153, 5, 32, 26, 64,115, 0,198, 0,212, 40, 44,237,100, 83,122, 10, 43,250,172,248,243,187, 4, 65,252,153,
+129,176, 85,103,134,255, 16,145,177, 9,205, 63,119, 43,148, 74,101,142,183,183,119,181,246, 92,235,116,186, 74,125,184, 52, 77,
+167,120,121,121, 25,108,181, 48, 68, 20,229,228,228,180,248, 19, 7,227,147, 98,177,202, 76, 34, 12,147,224,232,232,200, 20, 79,
+250,229,137,176,242,222, 99,129,248,234,252,159,180,180,180,104, 0,115,106,218,206,212,212,212,211, 48,160,104,180,161,223, 3,
+ 0,169, 84,250,217,139,249, 18, 44, 43, 94,177, 98, 69,181, 4, 54, 88,182, 50,241, 25, 33,147,201, 90, 27,242,191,181, 90, 45,
+254, 70,156, 40,122,144,145,145,145, 19, 8,130,232,142, 66,151,192,110,124,158,108,222,247,242,243,243,239,253,248,227,143,237,
+246,238,221, 59,139,101, 89,228,231,231,111,173,174,192, 42, 89, 61,103,100, 92,252, 92, 7,158,147,174,185,121,116,119, 74, 39,
+101,174,118, 86,144, 76,115, 0,181, 40, 49, 70,177, 44,251,219,200,145, 35,219, 0,248,253, 83,201, 42,216,117,248,169,136,103,
+164,121, 77,110,205,253, 97,236, 45, 11,211, 94,208,115,234, 67, 67, 94,128, 38,251, 34,128,253, 48, 44,204,161,228,120,105,134,
+217, 76,107, 52,155, 75, 77, 46,255, 11,227,108,229,231,231, 55,107,204,152, 49, 88,182,108, 25, 66, 54,109,210, 78, 33,136, 60,
+ 46,192, 94, 41, 92,104,146, 4,176,208, 80,158, 81,163, 70, 97,217,178,101,184,180, 97, 67, 77,121, 42,131, 45, 65, 16,193, 0,
+ 16, 24, 24,184,120,221,186,117,150,139, 22, 45,106,188,126,253,250,181, 69,175, 95, 21,127, 94, 52,215,245, 94,180,104, 81,195,
+ 82,159, 23, 0,120,250, 39,247,103,185,153,225,255,108,116,169,229,172,229,172,229,172,229,172,229,172,229,172,229,172,229,252,
+ 20,176, 44,219,171,240,169,226,231,138,254, 46,245,252,183,128,131, 90,212,162, 22,181,168, 69, 45,106, 81,139,127, 32, 74, 91,
+177,106,242,249,103, 68,113,140, 86,105,236, 5, 10,183,117, 87,164, 74,171,179,235,161, 38,202,246,122, 45,103, 45,103, 45,103,
+ 45,103, 45,103, 45,103, 45,231,255, 28,103, 85,220, 31,253,158,101,217, 94, 4, 65, 4,179, 44,219,187,162,231, 98, 97,245,225,
+223,165,158, 63, 91,216, 65, 57, 40,142,205,250, 40, 70,235,207, 70,173, 89,181,150,179,150,179,150,179,150,179,150,179,150,179,
+150,243,147, 80,236, 2, 4,192, 6, 6, 6, 46,250, 47,116, 29, 58, 22,137,172,210, 15, 0,149,184, 14, 89,246, 36, 37, 22,195,
+140,207, 23,242, 0, 64,163, 81,104,157,157,145, 79, 16,131,255,206,130,183,181,248,103,162,120,187,119,250,103,254,110, 45,106,
+ 81,139, 90,212,226,127, 3,153,197,150, 42, 0,153, 0,136,162,215,154,162,231,204, 34, 65,246,225,223,101, 62,255, 19, 33, 65,
+ 5,150, 44, 78, 69, 34, 43, 43, 75,104,195,225, 72,125,244,122,213, 23, 0,192,225,144,111,178,178, 44, 99, 88,246,100, 86, 77,
+196,150,141,157,221,115, 46, 69, 57, 27,242, 93,157, 94, 47,206, 74, 79, 47,155, 58,158, 32,254, 13, 2,207, 80, 17,241, 41, 98,
+227, 79, 23, 42, 54, 54, 54,246,246,246,246,125,205,204,204,190,204,205,205,125,146,153,153,121,182,146,186,135,235, 8, 2, 11,
+ 10,207, 43,252, 8, 96, 81, 37,212,213,249,238,135,240, 22, 10,133, 83, 9,130,240, 43,186,192, 34, 21, 10,197, 46, 0,111,255,
+ 7,111, 72,198, 0,250,115, 56,156, 81, 54, 54, 54,173,210,210,210, 86, 0,168,105, 54,111, 14,128,185, 22, 22, 22, 67, 45, 44,
+ 44,188,114,114,114,222,231,231,231,159, 0,176, 25, 64,149, 91,165, 87,204,112,252,178, 67,247, 14, 75,111,135,220, 94,189, 98,
+155,228,225, 71,159,207,117,180,238,214,181,237,178,219, 23, 66, 87, 45,222,153,154, 83,205,182,145, 69, 15,160,112,119, 36,139,
+143,147,189,126, 42,184, 0,250, 0,232, 0,224, 54,128, 11,134, 28,119, 5,104, 3, 96,113, 81,155, 55, 3,184,245, 95,126, 30,
+153,216,219,219,111, 0,208,135,195,225,188, 22,139,197, 19, 1,164,252,205,109,226, 0,104, 9,192, 15,133,105, 56,158,194,176,
+ 20, 14, 85,194,218,218,186, 55,135,195,153, 90,148,218,101, 87,118,118,118,240,127,235,192,240,249,252,173, 14, 14, 14,227,149,
+ 74,165,130, 32, 8,182,116,190, 71,154,166, 83,178,178,178, 90,252,219,110,106, 4, 65, 60,253, 47,111,226,196,114,222,171, 56,
+143,150, 88, 12, 51, 14, 71,234,147,145, 22, 49, 52, 85,242,114, 8, 0, 56, 57, 54, 62, 97,231,208,232,184, 88,204,215, 58,212,
+ 31, 32,226, 10, 57,187, 40,138,219, 84,165, 81,219,112, 57,220, 44, 45,173, 11, 35, 53,236,212,180,232,179,229, 38, 91,228, 82,
+148,115, 66,204, 45, 59, 90,155, 3,174,145, 19,184,198,110, 21,182,214,201,201,169, 70, 71,105,105,233,101,170, 21, 24,205,226,
+114,169,174, 12, 75,251,177, 12, 64, 18,220, 72, 90,175,187,193, 83,171,127,146, 74,223, 23,212,180, 7,235, 91,195,129, 5, 2,
+ 64,160, 43, 88, 92, 35,128, 99,209,217, 72,171, 6,133,161, 34,226, 83,196, 70,233,223,110, 1, 48,239,115,159, 73,206,206,206,
+150,189,123,247,222,250,195, 15, 63, 24,139, 68, 34, 34, 41, 41,169,251,194,133, 11,191,126,246,236,217, 28,177, 88,156,250,161,
+232, 35, 8, 44, 96, 24,150, 4, 0,146, 36, 22,218,218,218, 9, 41,138,250, 40,183,145, 94,175, 23,102,102,102, 76, 99, 24,150,
+ 40,250,238, 2,150,197,207,134, 8, 70, 35, 35,163, 97,126,141,154,206,217,176,113,179,200,222,206,206,132,214, 51,218,248,196,
+ 4,225,210,192,121,173,223,197,190,253, 89,165, 82, 29,173,201,117, 77, 81,212, 80,129, 64,208, 27,128,111,209,123, 81,106,181,
+ 58, 88,175,215, 31, 55,116, 66,183,183,183,191, 75, 81, 84,157,234,252, 99,189, 94,159,148,158,158,238, 95,195, 33, 26,236,230,
+230,182,191,125,251,246,194, 86,173, 90,129,207,231, 99,217,178,101,115, 37, 18, 73, 85, 66,139, 3, 96,174, 80, 40, 28,106, 98,
+ 98,226, 37,147,201,222, 41,149,202,211,124, 62,191,203,207, 63,255,236,218,182,109, 91,211,244,244,116,130,162, 40,251, 75,151,
+ 46,253,103,235,214,173,221,105,154,238, 92,213, 36,151,247,142, 93, 42,232,227,219, 46,239,221,173,165, 0,122,126,248, 57,173,
+ 50, 26,197, 82,174,189,149,236,139,228, 34,241, 97,176,200,226,114,185, 63, 59, 56, 56,140, 81, 21,230, 10, 96, 63,156,112, 0,
+ 64,163,209, 72,115,115,115,235,215,228,146, 7, 48,206,194,194, 98,204,252,249,243, 45,123,246,236,137,195,135, 15,127, 23, 20,
+ 20, 36,205,207,207,255, 13,133,137, 48,163,171,201,185, 32, 45, 45,237, 27, 46,151, 75,184,186,186, 82, 74,165,178, 58, 66,203,
+ 7,133, 69,152,159, 2,216,133,194,212, 5, 29,129,194,235, 29,192,143,197,194,141, 36,201, 93,245,235,215,239, 27, 21, 21,245,
+ 11,128,213, 53,189,214, 29, 28, 28,246,236,220,185,115, 72,191,126,253,168,204,204, 76,231, 38, 77,154, 28, 73, 75, 75,107,247,
+ 25,110, 35, 99, 5, 2,193,236,198,141, 27, 55,136,142,142,142,201,207,207,223, 92,212,159,149, 93, 83, 46, 0,186, 88, 88, 88,
+116, 94,178,100,137,168,119,239,222,216,187,119,239, 55, 65, 65, 65,178,130,130,130, 27, 40,140,233,249, 36, 17,200,225,112,166,
+166,164,164,216,176, 44, 11, 71, 71,199,169, 0,254, 43,133, 22, 73,146, 63, 15, 28, 56,112,204,145, 35, 71,132, 9, 9, 9, 66,
+103,103,231,146,228,217, 4, 65,212,120,254,172,197, 39, 99,111, 41,193, 85,117, 30, 45, 62, 95,200,211,235, 85, 95,164, 74, 94,
+ 14,249,186,253,118,115, 0,184,123,103,250, 16, 59,135,134,145,124,190, 48, 70, 96,102,116,102, 96,159, 46, 77,191,237,221,158,
+112,113,180, 67,138, 36,195,254,215, 99, 33, 61,130, 67,110,157, 65, 97, 2,177,114, 65,107,115, 96,172,189,142,232,251,219, 96,
+211, 33, 21, 59, 46,165,224, 97,120, 60, 20,121, 89,168,227, 96,140,141,179,186,193,193, 82, 88,179,165,151,157,119, 71,154, 35,
+ 56, 62,124,216, 72,243,190,253,125,185,238, 14, 14, 96, 89, 1, 98,222,201,190,186,124,245, 86,203,211, 39,143, 78, 53,225,122,
+ 15,149,103,188, 53,248,230,214,204, 17,198,114, 45,250,115, 40,226, 63,109, 91, 52,232, 60,236,155,118,100, 3,223,122,120,253,
+ 42,170,219,249,155,143, 55,146,161,175,110,208,122,246,160, 9, 15,231, 94, 72, 42, 77,232,247,145,224,232,220,185, 75, 59,129,
+ 64, 80, 38,121,146, 90,173,230,221,184,113,189, 77, 77,196, 70,241,255,208,104,212, 36,151,203, 7, 73, 18,115,252,252, 26,249,
+102,101,101,221, 34, 8, 98,127,106,106,245,172, 5,211, 1,190,148,195,105, 78, 10, 4,142,122,141,198, 26, 0, 8, 62, 95, 26,
+ 79,146,141,150, 44, 94, 44,162, 40,138,201,206,206,134, 66,161, 32, 38, 76,152, 96,244,238,221,187,129, 98,177,120, 91, 21, 43,
+ 18, 4, 5, 5,249, 56, 58, 58,126, 84, 61, 86, 34,145,240,251,245,235, 91,147,161,247,105,220,164,217,236,144,144, 43,190,249,
+ 57, 82, 85,208,150, 61,207,117, 70, 66,181,167,111,125,238,174,189, 7,204, 39,142, 25, 49,253,205,155, 87, 97,168, 94,189, 58,
+ 55, 99, 99,227, 51,155, 54,109,242,235,216,177, 35,215,206,206, 14,233,233,233,136,138,138,242,187,121,243,102,255, 3, 7, 14,
+204, 85, 42,149, 3, 1,131, 10,162,122,223, 56,184,223,206,196,202, 26,122,157, 14, 78,141,155,149,228, 55,139,189,121, 21,180,
+ 86, 11, 70,167,131,111,239,254, 69,214,100, 22,190,190,190, 53,205,186,235,212,176, 97,195, 67,107,215,174,229,169,213,106, 60,
+126,252, 24,183,110,221, 98, 36, 18, 73, 85, 9,113, 57, 4, 65, 92, 93,190,124,185,139,191,191,191,105, 86, 86, 22,244,122,189,
+205,185,115,231,166, 54,109,218,212,204,213,213,149,127,240,224, 65,200,100, 50,208, 52,109,229,229,229,101, 53,108,216, 48,205,
+193,131, 7,231, 2,216, 80,145, 37, 43,255, 29,187, 84, 66,120,245,168,223,124, 20,210,136, 43, 61,102,247,192,101,179,186, 68,
+137,101,171,135,151,151,105,190, 88,184, 80,100,214,200, 42, 95,124,125, 97, 15, 47,175,160, 43,239, 13, 90, 12,145, 69,147,205,
+240, 99,199,142, 9,163,162,162,132,190,190,190, 96, 24,166, 36, 3,127,113,194, 89,111,111,239,154,244,227,250,201,147, 39, 47,
+ 28, 50,100, 8, 26, 55,110, 92,146, 20,245,251,239,191,199,194,133, 11, 45,239,222,189, 59,247,232,209,163,115,207,158, 61,187,
+ 1, 64, 96, 53,173, 49,197,168,238, 24,175,140,139,139, 27,124,230,204,153, 17, 11, 22, 44,240, 6, 48, 13,192,178,236,236,236,
+246, 69,214, 24,126,145,208, 26, 59,119,238,220, 41,129,129,129,248,230,155,111,150, 61,126,252,120, 77, 13,173,124, 20, 77,211,
+223,244,235,215,143,210,233,116, 48, 49, 49,129, 78,167,171,251,169, 70, 9, 0, 59, 39, 77,154, 52,101,242,228,201,176,180,180,
+132, 78,167,243, 57,118,236, 88,208,178,101,203,190, 4, 48,174,130,182,142,154, 50,101,202,160,145, 35, 71,162, 69,139, 22,224,
+112, 10,187,113,211,166, 77, 88,181,106,149,232,234,213,171,253, 15, 30, 60,216,255,252,249,243,167, 81,182,108, 87,181,192, 48,
+ 12, 56, 28, 14,146,147,147, 97,103,103, 39, 96, 24, 38,132, 32,136,189, 57, 57, 57,103,255,139, 38,243, 31, 7, 15, 30, 60,252,
+200,145, 35, 34, 0,216,184,113, 35,102,207,158, 13,123,123,123,136, 68,162, 90,169,243,223, 99,209,154, 88,165, 69,171, 42, 40,
+ 20,138,102,139,102,252, 7, 36, 89,184,106,172,231,233,134,117,139, 39, 18,231,131, 67,154, 85,106,131, 55,114, 66,244,253,109,
+ 16,184,206,130, 90, 71,227, 81,120, 28,174,109,236, 94, 56, 91,246, 92, 2,181,182,115,241,100, 99,197, 55, 54,254, 81,163,215,
+ 63,128,131,195, 99, 36, 38,102, 86, 37,178,108, 29,236,131,119,239,222, 96,236, 87,183, 62,180,180, 14,226, 12, 49, 8, 66, 0,
+ 23,103, 83,140, 29,213,147,219,190,189,147,205,202,149,123, 46,166, 49, 24,160,200,122, 91,101,194, 80, 31, 27,252,222,204,207,
+123,200,176, 94,254,130, 70,126, 13,193, 19, 24,151,124,214,188, 69, 11, 52,111,209,130, 12,148, 21,116,125,242,244,121,215, 83,
+ 87, 31,169, 21,186,196, 19, 49, 89, 24, 93,197, 77,166, 68,112,204,156, 57, 19,246,246,246,101,190,144,158,158,142,155, 55,111,
+148,251,155,106,220,200, 74,254,199,154, 53,107, 76,165, 82,105,207,125,251,246,117, 98, 24,102, 77, 90, 90,218,125, 67, 72, 70,
+ 2,117,242, 4,130,206, 99, 54,111,102,154,246,237, 75, 89, 56, 56,144,140, 94, 79,164,190,127,111,189,101,219,182, 14, 57,177,
+177,198,114, 43,171, 28,169, 82,169,136,137,137,129,145,145, 17,193,225,112, 90,150, 67,149,206,178,248,145, 36,137,133, 4, 65,
+ 64, 32, 48,138,153, 60,121,242,139,162,207,234, 92,184,112, 65,216,167, 79, 31, 5,128, 4, 0, 16, 8,140,156, 41,138,244, 41,
+204,196,142, 31, 13, 17,152, 38, 38, 38, 51, 86,175,221, 96,146,159,147,171,212,202,229, 58, 91, 51, 17, 65,136, 76,169,252,188,
+130, 2,177, 36, 83,189,100,197, 42,106,210,216,145, 51,228,114,249, 84, 67, 69, 86,147, 38, 77,158,156, 57,115,198,206,218,218,
+ 26,185,185,185,200,206,206,198,147, 39, 79,192, 48, 12, 6, 14, 28, 40,248,170,117,171,102,139,151, 44,125,152, 44, 22,127,105,
+136,216, 50,177,178,193, 70,255,166,133,147,117, 66,118,201,248,236, 29,220,187,228, 59,171, 82,242,138,173,115,159, 82, 66,234,
+203,206,157, 59,243, 0, 96,220,184,113,249, 5, 5, 5,235, 0, 28, 65,213, 25,253,231, 46, 93,186,212,217,211,211,211,253,200,
+145, 35,144,201,100, 0, 96,231,233,233, 9, 31, 31, 31,253,237,219,183,225,227,227, 3, 83, 83, 83,220,189,123, 23, 15, 31, 62,
+ 68,139, 22, 45, 76,121, 60,222, 16,173, 86, 91,174,208,234,208,189,195, 82, 65, 31,223,118,245,155,143,130,200,204, 17, 65, 71,
+143, 35,250,249,129,118,106,109,212, 82,158,254,206, 72, 37, 43, 24,157,153, 36, 10,172,211,162,189,117,189,134,125,225,222,252,
+133,141, 74,127, 47,110,105, 87,207,245, 28, 35,213,129, 21,155, 37,217, 21,137, 44, 0, 27, 7, 14, 28, 56,248,216,177, 99, 22,
+ 0, 16, 17, 17,129,244,244,116,216,218,218,194,200,200, 8, 92, 46,183,164, 62,105, 13, 49,122,215,174, 93, 37,162,141,166,233,
+146, 42, 0, 66,161, 16, 95,127,253, 53,154, 54,109,138,179,103,207,142,174, 64,104,249,183,110,221,250,176,187,187,187,107,233,
+ 55,229,114, 57, 2, 2, 2, 0, 0,237,219,183,239,108,108,108,204, 22, 11, 66,137, 68, 34,123,250,244,105, 87, 0,143, 43, 80,
+150, 74,177, 88,140,249,243,231, 35, 62, 62,254,187,221,187,119, 39, 2, 48,226,243,249, 37,235, 99, 0, 62, 13, 27, 54,252,121,
+246,236,217,120,247,238, 29, 94,191,126,253, 4, 53,119,165,234, 77, 76, 76, 98,117, 58, 93, 11,154,166,161, 84, 42, 49, 96,192,
+ 0,163,211,167, 79,167, 83, 20,245, 38, 43, 43,107, 4, 10, 99, 82, 12,133, 17,128,205,147, 39, 79,158,178, 96,193, 2,220,184,
+113, 3,231,207,159,199,200,145, 35, 49,107,214, 44,136, 68,162, 49,179,102,205,122,136,194,130,230, 31,162,243,174, 93,187,160,
+215,235, 63,186, 54,140,140,140,224,239,239,143, 6, 13, 26,224,252,249,243,157, 63, 65,104,185,251,251,251,243, 25,134,129, 92,
+ 46,199,237,219,183, 69,198,198,198, 34, 23, 23,151, 9, 0,254,107,132,150,187,187,251,228, 99,199,142,137, 74,123,127, 4, 2,
+ 1, 74,157, 7,181,248,251, 45, 90,149,174,176, 74,160,209, 40,180, 28, 14,249,198,201,177,241,137,187,119,166,151,184, 14, 1,
+242,141, 70,163,208, 2,128,158, 97,145,175,160, 97, 44, 32,145,144, 86,128, 87,239,179,202,163, 42,179, 69,147,107,236, 6, 65,
+171, 4,176, 44, 11,141, 86, 15,117, 94, 26,214, 93, 84, 32, 42, 69, 5,141, 92, 10,141,182, 48, 12,203,198,198,134, 19, 18,114,
+121,246,245,235, 55,167,252,246,219,111, 84,138,185,249,235, 2,160, 89,121,156,150,150, 94,166, 12,159,127,226,151,221,203,140,
+ 89,234, 61, 98,146,228,168,231,210, 10, 54, 22,174, 72,203,146,227,193,235, 75,120,243, 54, 24,158,142,238,152, 53,163,135,209,
+234,181, 71,142,243,104, 15,183,220,220,248,252,138,218, 89,188,138,218,115, 37, 6,116,206,123,232,179,223, 65, 95,144,250,209,
+ 23, 68,182,110,104,222,209, 25,182,174,117, 5,163,103,173, 26, 5,148, 17, 90,165, 57,211, 9,130,252,133, 36,137, 41, 4, 65,
+160,113,227, 38, 41,155, 55,111, 46, 47, 21,184,182,113,227, 38, 41, 20, 69,186, 20,222,216,201, 93, 44,203,164, 87,209,206, 50,
+162,134,207, 23, 44,131,243,102,199, 0, 0, 32, 0, 73, 68, 65, 84, 40, 52,251, 59, 38, 95,188,120, 81, 59,120,240, 96,108,218,
+180,137,191,112,225,194, 37, 20, 69,141, 43,199,189, 87,134,115, 0,224,102, 81,183,110,183, 53, 15, 30,176, 92,157,142,200,121,
+242, 36, 63, 87, 34,161,211, 10, 10,248, 39,223,188,249,102,252,188,121,124, 87, 87, 87,220, 15, 14,182,206,148,203,217, 92,181,
+ 90,153,155,155,203,210, 52,253,164, 2,206, 69,182,182,118,194,160,160, 32,159,201,147, 39,191,144, 72, 36,139, 0,192,209,209,
+113, 29,128, 6, 0, 18, 74,189,135,221,187,143,139, 39, 76,152, 16,147,145,145,177,168,178,118,150, 66, 67, 59, 91, 59,225,209,
+ 61, 7, 95, 90,153, 26,147,182, 46, 78, 36,215,194,130, 67,243,141,121, 12,160,244,116,173,107, 2,160, 97, 5,191,253,144,147,
+ 48, 54, 54, 62,243,199, 31,127,216,113,185, 92,232,245,122,216,218,218, 34, 62, 62, 30,185,185,185, 40, 40, 40, 64,220,155, 40,
+120,184,186, 98,101,224, 66,199,105, 11, 3,207, 40, 20,138, 22, 31, 76,102, 31, 23, 64,214,105, 63,178,236,149, 87,197,224, 67,
+183,151,129,227, 94, 26,241, 73, 73, 73, 16,137, 68,240,243,243, 19, 61,120,240,224, 94, 37, 34,171,116, 17,224, 33,109,219,182,
+ 53, 61,114,228, 8, 90,180,104, 1,115,115,115,220,190,125, 27, 17, 17, 17,208,106,181,164, 76, 38,131, 72, 36,194,250,245,235,
+225,230,230,134,130,130, 2, 36, 36, 36, 88,115,185, 92,155, 15, 50,218,151,112,222, 14,185,189, 58,239,221,173,165,105,196,149,
+ 30, 65, 71,143, 99,194,176,161,112, 96,223,223, 51,175, 75,172,238,214,167,237,247, 44,229,218,219,196,180,177,165,183, 95, 31,
+240,248, 34, 76, 91,176, 10, 49,145, 23, 44, 21, 5, 47,191, 35,244,201,174, 43, 54,159,156, 89,206,177, 19, 0, 72, 87, 87,215,
+241, 39, 79,158, 52, 45, 49,189, 80, 84, 73,205,195,210, 69,224, 43, 41,248, 94,101,127, 18, 4,129,248,248,120,216,217,217, 65,
+ 36, 18,149, 20, 16,143,138,138,194,163, 71,143, 80, 92,141,162, 2,206, 17,215,175, 95,119, 53, 49, 49, 41,243, 5,150,101,145,
+149,149, 5,154,166, 33, 20, 10,161,215,235,161,213,106,161,211,233,160, 82,169, 68, 13, 26, 52,152,170,211,233, 30,151,199,201,
+ 48,204,156, 33, 67,134,180,125,252,248,177,215,182,109,219,160,209,104, 54,166,165,165, 97,208,160, 65, 96, 24, 6,157, 59,119,
+110,195,178,108,244,146, 37, 75, 0, 0,179,103,207,214,201,229,242,201, 53, 57,246, 34, 52,104,222,188,185,215,141, 27, 55,208,
+174, 93, 59,168,213,106,108,218,180,201,108,247,238,221,102, 7, 15, 30,180, 93,176, 96,193,254,204,204,204,238, 85,112, 18, 0,
+ 54, 58, 56, 56, 76,233,208,161,131,113, 81, 13, 83, 28, 56,112, 0, 43, 87,174, 60, 6, 96,201,229,203,151,151,159, 63,127,126,
+212,248,241,227,177,114,229,202, 89,185,185,185,251, 42,226,140,139,139,131,173,173, 45,204,204,204, 10,111,150, 90, 45,194,194,
+194,112,237,218, 53,124,241,197, 23,134, 28, 83, 69,237,116, 31, 56,112,224,254,163, 71,143,154, 38, 39, 39,227,238,221,187,240,
+240,240,128, 66,161, 48,164, 54,236,245, 63, 97,194,174,144, 83,169, 84,170,146,146,146, 68, 27, 54,108,128,163,163, 35,220,221,
+221, 97,100,100, 4,130, 32,160,211,233, 42, 43,175, 86,101, 59,219,183, 7, 39, 75,108,217,207,220,194,242, 59,150,101, 57,121,
+121,210, 61, 90,228,158,122,255, 30,154,191,240,216,255,201,104, 6,224, 5,202,214, 60,148,148, 8,173,224,224, 96,182,119,239,
+222, 68,241,179,179, 51,242,179,178, 44, 99,236, 28, 26, 29,183,115,104, 88, 84,247,139,124, 67, 81,150, 49,246,246,138,124, 0,
+208,210, 44, 66,223,228,226,101,108, 26, 34, 98,211, 96, 34, 48,204,248,162,214,210,133, 17,171, 44, 11,149,236,255, 23,173, 90,
+133, 20,106,109, 97,184,135, 70,173, 64, 94,230,107, 98,240,128,174, 70, 83,166, 76,130,163,163,179,109, 69,124, 90,129,209,172,
+105,179,191,177,176,178,224, 34,248,193, 21,180,249, 98, 0,140, 4, 92,100,231,169, 0, 2,120,251,254, 26,192,152, 34, 50, 38,
+ 9,173, 27, 10,209,189,155,175,232,236,169,232,121, 0,150, 25,210, 94, 58,229, 9,120,222, 61,193,213,235,160,203,138, 6,147,
+155, 8,152, 56, 64, 73,136,144, 45, 73,196,155,123,167, 13, 90, 51, 50, 12,243,157,141,141, 77,238,146, 37, 75, 58,212,171, 87,
+ 79, 59,117,234,212,240,196,196,196, 57, 31,172, 86,126,218,181,107, 23, 98, 99, 99,197,107,214,172,185,157,149,149,181,180,154,
+ 3, 29,200,178,216, 90,228,138,203, 58,119,238, 92,243, 59,119,238,204,218,186,117,171,253,244,233,211,249,211,167, 79, 31, 11,
+224,135,202,220,133,249, 2, 65,151, 53,119,239,178,116, 74,138,250,208,246,237,252,157,161,161, 75,180, 12,227,100, 99,103, 71,
+124,213,186,181, 92, 72,146, 89,217,233,233,180,173,151, 23, 21,127,237,154, 53,107,108,156,122,249,242,229,124,153, 76, 86, 97,
+233, 28,138,162, 20,229,185, 11,203,131,163,163,163,166,188, 24,174, 74, 38,196,124,134,101,181, 22,158,158,108,183,206, 95,214,
+139,141,126,255,222,200,194,130,242,174,231, 81,255,213,155,248, 39,172, 94,175, 34, 8, 34,223, 32, 95, 9, 69, 13,221,186,117,
+107, 35, 51, 51, 51, 48, 12, 3,115,115,115,100,102,102, 66,163,209, 32, 63, 63, 31,154,130, 60,104,242,242, 16,145, 24,143,182,
+ 29, 58, 96,112,143,110,190, 7,207,253, 49, 84,175,215, 31,171,212,159,215,184, 89,137, 37,107, 85, 29,235,255,247, 5, 37,231,
+150,136,174, 13,205,188,193, 19,137,208,117, 78,224,167, 92,232, 47, 46, 94,188,120,105,224,192,129,223,204,155, 55,143,148, 72,
+ 36, 87,226,227,227,219, 2,120, 93,217,143, 68, 34, 81,221,172,172, 44,200,100, 50,152,155,155, 99,235,214,173,176,183,183,135,
+ 66,161,192,211,167, 79, 89, 23, 23, 23,226,246,237,219,112,113,113, 65,118,118, 54,180, 90, 45,148, 74,101,154, 70,163,169,208,
+ 93, 94,228, 30,236, 57,187, 7, 46, 71, 63, 63,208,206,153,136,123, 58,100,110,251,216,232,136, 55, 73, 87,175, 61,248,129, 86,
+ 25, 37,231,166, 92, 95,232,217,242,133,205,119,243, 87, 98,199,198,229,136,126,124, 55,199,222, 45,127,167, 49,161,254,189,178,
+246,202,229,114,213,155, 55,111, 76,195,195,195, 65, 16, 4,204,205,205, 33, 20, 10,203, 21, 91, 53, 0, 89,218, 2, 37,151,203,
+193,227,241, 96,109,109,141,125,251,246,149, 76,188, 30, 30, 30,149,113,236,233,218,181,235, 80, 55, 55, 55,211,210,111,182,108,
+217, 18,147, 38, 77,194, 47,191,252,130,208,208,208, 50,245, 52,211,210,210, 36, 58,157,174,178,227,206, 77, 79, 79,239, 49, 96,
+192,128,231,247,238,221, 51,219,183,111, 31,104,154, 46,247, 17, 20, 20,132, 71,143, 30, 45, 3,240,166,134,231,209, 23,131, 6,
+ 13,186,123,248,240, 97,139,204,204, 76, 20,159, 27,114,185, 28,122,189, 30,245,235,215, 39,104,154,174, 42,238,141,164, 40,234,
+220,246,237,219,251, 76,152, 48, 1, 28, 14, 7, 26,141, 6,219,183,111,199,194,133, 11,211,139, 22,165, 90, 0, 75,126,255,253,
+247, 81,125,251,246, 69,147, 38, 77,124,111,221,170, 56,178, 67, 38,147, 65, 38,147,129,203,229,194,193,193, 1,171, 87,175,134,
+ 70, 83,120, 91,241,241,241, 41,185,140, 1,236,241,241,241,233, 19, 19, 19,179, 9,133,177,107, 31,193,193,193, 97, 0,203,178,
+ 19,245,122,125, 65,187,118,237,172,143, 30, 61,106, 42, 22,139,241,252,249,115, 44, 91,182, 76,202, 48,140,158, 97, 24, 66,169,
+ 84,198,217,217,217, 61, 23, 8, 4,198, 10,133, 34, 39, 59, 59,123, 45,128, 43,127,215, 76, 78, 16, 4,193,229,114, 49,110,220,
+ 56,112, 56, 28, 24, 27, 27, 67,165, 82, 65,167,211,149,136,121, 84,211, 45, 93,175,158,200,154, 3,222, 4, 75,211, 6,179, 6,
+207,236,109,235,232,228, 12, 11, 51, 1,162,162, 94,183,189,121,227,218,118, 62, 39,122, 55,163,209,237,142, 78,200,251,211,139,
+221,127,168, 69,254,161, 66,235,163,154,135,156,242, 7,115,176,158,101, 79,102,137,197,124, 45,159, 47,140, 41,182,114,217,219,
+ 43,242, 9, 98,176,222,182, 97, 63,208, 90, 93,209,141,130, 45,122, 24, 40,180,116,122,196, 70, 71,226,222,213, 63, 96,163, 16,
+ 35, 43,174, 41,192,107, 4,141, 50, 15, 42,141,182, 72,148,232, 17,254,252, 6,242,243,114,224,215,162, 55, 64,146,143, 42,226,
+ 51,183, 38,122,127,213,188, 49, 21,155, 20,137,150, 62,223,194,203,165, 29, 18, 37,249,200,149,169, 33,205, 87,161,169, 95, 32,
+ 50,165, 74,228, 43, 84,120, 29,123, 16,206, 78, 94, 36,193,121,223,217, 80,161,165,126,125, 6,234, 55,231,193,115,111, 11,126,
+253,190,160,220,253,145,244,242, 22,194, 47,111, 65,202,171,251, 96, 25, 61, 28,125, 90, 25,122,145,108,191,114,229, 74,171,182,
+109,219,114,186,116,233,210,228,210,165, 75, 77, 36, 18, 73,120,145,192,104,210,165, 75,151, 38,182,182,182,248,249,231,159,149,
+ 4, 65,108,175,225, 96,151, 88,192, 50, 50, 50,158, 0, 88,115,230,204,153,237,147, 38, 77,130,157,157, 93,163,212,212,212, 10,
+127,152,201,229, 54, 25,189,118, 45,203,165, 40,246,216,142, 29,188,149, 87,174,108,254,237,247,223,121,157, 58,118, 36, 88,150,
+ 69, 88, 88,152,112,195,142, 29,194,225,253,250, 37, 36,102,100,208,119, 66, 67,181,146,148,148,130, 12,185,124,165, 68, 34, 73,
+251, 59,206,108,157, 78,247, 48, 46, 62,206,185, 69,235,166,182, 47,162,226, 94,117,239,244,213, 87, 36, 73,146,209,239, 19, 67,
+109,109,205,132,215,174, 94,211,234,116,186,135,134,112, 9, 4,130,222,157, 58,117,226, 72,165, 82, 56, 57, 57, 33, 51, 51, 19,
+ 98,177,184,208,226,144, 39,133, 54, 47, 15,186,252, 92,232,229, 50,196, 61,125,130,166, 94,158,130,147, 2, 65,111,133, 66, 81,
+169,208, 42, 94,101,150, 87,232,186,248, 61,190,169, 41,248, 34, 17,136,234,187, 13,251, 89, 88, 88, 44,204,205,205,189, 4, 96,
+181, 86,171,157,182,112,225,194,150,219,182,109,179, 89,179,102,141,217,196,137, 19, 79,202,100,178,166, 40, 44,170, 90,209, 4,
+246,142,166,105,107, 0,246, 55,110,220,128,157,157, 29,242,242,242,138, 45, 45, 26,133, 66, 97,148,157,157, 13,181, 90, 13,141,
+ 70, 3, 51, 51, 51, 60,123,246, 44,135,166,233, 11, 85, 53,206,172, 46,177, 90,173,141, 90,106,237,107,146,170,165, 45,219,103,
+228, 48,210, 21,155, 37,171, 0,108,238,225,229, 21,164,101,238,198,189,141,188, 96, 25,255,244,118, 78,234, 91,185,215,190, 75,
+113,149,197,104,177, 0, 24,130, 32, 88, 31, 31, 31,100,102,102,130,162, 40, 8,133, 66,136, 68, 34, 44, 90,180, 8,219,183,111,
+175,137,208, 50, 50, 49, 49, 89, 75,146,228, 80,146, 36,109,245,122, 61, 2, 3, 3,209,167, 79, 31,240,249,124,104,181,218, 18,
+139,102,177,149,170, 10, 75, 71,216,163, 71,143,204, 30, 61, 42,115,219,234,104, 99, 99,115, 83,173, 86,227,253,251,247, 56,119,
+238, 92, 7, 0,119,170, 57,214,239,195,194,194,122,248,251,251, 31,104,222,188,121, 93,150,101,209,168, 81, 35, 4, 4, 4,224,
+224,193,131, 8, 15, 15, 71, 94, 94, 30,115,237,218,181,223, 0,108,170,238, 28, 94,212,191,245, 7, 13, 26,116,255,200,145, 35,
+150,217,217,217, 80, 42,149,144,203,229, 56,121,242, 36,218,182,109, 11, 27, 27, 27, 28, 62,124,152,102, 89,182,178,177, 39, 73,
+146,220,183,123,247,238, 62,227,199,143,199,206,157, 59,113,236,216, 49,244,237,219, 23, 67,135, 14, 69,102,102,166,253,198,141,
+ 27, 71, 21,185, 9,151, 7, 4, 4, 64, 38,147,225,233,211,167, 81, 6, 94,243,200,205,205, 69,110,110, 46,140,141,141, 75, 95,
+ 99, 4,128,131, 91,182,108, 25, 54,107,214, 44,120,121,121, 45,143,139,139,219,130,114,118,137, 50, 12, 51, 89, 44, 22, 91,114,
+ 56, 28,107,154,166,145,156,156,140,103,207,158,225,187,239,190,203,201,201,201,153, 4, 32, 17,192,146,113,227,198,173,158, 51,
+103, 78,201,185, 52,103,206,156,224, 75,151, 46,245,248,171,173, 57, 62, 62, 22, 13,249,148, 96,166,180,128,178,150, 74,165, 37,
+247, 14,141, 70, 3,181, 90, 93,198,146,197,227,113,173, 91, 54,117,187,168, 84, 20, 44,126,253, 54,183,194, 2,233,190,117,205,
+ 27, 11, 77,204,103,181,109,215,105, 68,183, 30,253, 41, 90,167, 67, 72,200, 5,252,250,235, 46,116,244,247,129, 87,189, 70,152,
+ 62, 99,166,185, 90, 67, 7, 94,187,118,101,161,197,163,123, 87, 10,242,115, 23, 85,198,249, 63,142,139, 69,226,234, 98,185,174,
+195,242, 20,100, 81, 10, 7,105,209, 75, 27, 75, 75,203, 29,122,189,190,163,153,153, 25,152,220, 24,188,126,246, 24, 57, 82, 46,
+212, 74, 61, 24,182, 80,108, 25, 36, 92,212, 26,220, 13, 57,143,173, 91, 54, 35, 59, 59, 27,254, 95,119,128,140,227, 10, 55, 87,
+ 55,168,148,138,162,139, 6,208,106,116,176,181,119,199,139, 23,225,186,124,185,188,194, 27, 18,207, 72,235,235,102,239, 3,181,
+246, 75, 24,241,249,200, 43,208, 64, 90, 36,178, 14,159, 26, 2,181, 66, 9, 90,163, 5,173,209,193,214,109, 16,190,176,239, 4,
+ 70,127,161, 97,181,186,143,209, 67, 27,127, 23,218,248,187, 48,254,114, 6,254, 88, 55,236,131,137,212,176,186,187,153,153,153,
+ 25,175, 94,189,186, 16, 22, 22, 54, 96,200,144, 33,184,117,235,214, 68, 0, 83,138,220, 55, 19,135, 12, 25,130,176,176, 48,188,
+122,245,234, 66,102,102,102,198,231, 24,121, 62,159,175, 84,171, 11,231, 88,161, 80,104, 84,197,119,157, 91, 14, 28, 72,230,189,
+120,145,191,229,193,131,229, 65,251,246,241,186,116,238, 76,232,104, 26,140, 94,143,122,222,222, 68,183,110,221, 76, 14,158, 56,
+ 97, 77,233,116,143,230, 79,155,118,227,151,145, 35, 11,158,200,229,134, 6,154,215, 41,114, 25, 2, 64,157, 74,222, 51, 24,106,
+181,122,219,228, 9, 99,186,220,185,123,223,213,205,213,217, 44,228,218,157,112,129, 49,159,244,242,168, 75, 73,243,114, 56,171,
+150, 47, 54, 86,171,213,134,138, 86, 95, 27, 27, 27,164,165,165, 33, 54, 54, 22,106,181, 26, 58,157, 14,140, 66, 14,141, 52, 23,
+154,188, 28, 16, 42, 37, 4,122, 61, 84, 89,233,168,227,229, 9,252,255,142,196, 42, 93, 81,229, 9,173,226,103, 35, 51, 51,240,
+ 76, 68, 32,185, 92,131,139,163, 3,104,222,170, 85,171, 19,167, 79,159,230,141, 29, 59,182,245,245,235,215,119, 0, 72, 20,139,
+197,157,151, 45, 91,246,100,199,142, 29,130, 73,147, 38,213,223,180,105,211, 40, 0,123, 42, 34, 81,169, 84, 39, 46, 94,188, 56,
+220,221,221,221, 62, 34, 34, 2, 42,149, 10, 12,195,160,103,207,158, 64, 97,108, 13, 0, 32, 58, 58, 90,169, 82,169, 50, 34, 35,
+ 35,243, 19, 19, 19,181, 48, 96,151,224,138,109,146,135,249,105,119, 7,218, 59, 56, 63, 50, 50,174,227,193,202, 94, 12,152,253,
+173,243,198, 45,167,196,170, 43,239,223, 23, 44,237,234,185, 94, 94,240,242, 59, 11, 23,217,206, 43,193,113,134, 4,194,151,236,
+ 46,180,182,182, 6,135,195, 1,151,203, 5,143,199, 3, 65, 16,152, 49, 99, 6,246,238,221, 91,149,235,176,140,200, 50, 53, 53,
+125,181,114,229, 74,151, 73,147, 38,241,140,140,140, 32,149, 74,113,248,240, 97,140, 27, 55, 14,191,254,250,107,185,241, 47, 6,
+184,148, 62,180,150,206, 26, 57,114, 36, 52, 26, 13, 2, 2, 2, 16, 20, 20, 52, 75,175,215,223,169,193, 37,253, 40, 60, 60,220,
+ 59, 60, 60,220, 12, 64,223,161, 67,135,254, 62,104,208, 32,220,185,115, 7, 23, 46, 92,232,128,194, 77, 31, 74, 0,235, 0,216,
+ 21, 61, 87,118,125,154,216,219,219,239, 98, 24,166,175,173,173,109,184,143,143,143,223,145, 35, 71, 44, 50, 50, 50,138, 55, 63,
+ 32, 62, 62, 30,251,247,239,151,236,219,183, 47, 95,175,215, 91,147, 36,121, 49, 55, 55,119, 81, 37,130,109,223,150, 45, 91,198,
+ 20,185, 3,113,250,244,105,118,243,230,205,196,178,101,203, 32,149, 74,209,177, 99, 71,236,222,189,123,166, 76, 38,107,178,121,
+243,230, 9,131, 7, 15,198,170, 85,171, 32,151,203,183, 84,181, 88,169, 68,124, 17, 0,190,218,178,101,139,251,172, 89,179,112,
+250,244,105, 52,111,222,220, 56, 46, 46,238, 23, 0,227,203, 27, 63,150,101, 17, 23, 23, 7,133, 66,129,251,247,239, 99,249,242,
+229,210, 82, 34,107,230,148, 41, 83, 86,207,156, 57, 19,107,215,174,101, 35, 34, 34, 50, 6, 13, 26,100,191,119,239, 94,170, 94,
+189,122, 51, 21, 10,197, 95, 38,180,234,215,179, 90,223,178,121,187,133,142,206,245,112,248,200, 81,228,228,228,148,244, 73,113,
+191,176, 44,139,130,130, 2,164,165,165,193,220,204, 20, 27, 55,173,254,102,234,196, 49,174, 40, 76,131,241,177,201,210,203,114,
+211,160,161, 99,231, 6, 12, 31,131,136,240,231, 56,248,251, 30, 68, 70,132,149,240,209, 58, 45, 98,162,158, 33, 38,234, 25,236,
+ 29,220,209,173, 75, 7, 98,216,176, 97, 61, 71, 14, 31,106, 11,224, 79, 75, 29,241, 15,182,102, 1, 31,231,209,218, 91, 70,104,
+ 85, 97,174,179,177,180,180,124,117,252,248,113,107,127,127,127,138,166,105, 92, 9, 9,193,119, 83,254,131, 81, 35, 3,161,133,
+ 37,104, 13, 15, 12,207,200,160,150, 40,149, 10,176, 96, 33,151,203, 17, 26, 26, 10,150,161,113,112,239,102,176, 44, 83, 34,180,
+ 0, 22, 26,173, 22,206,110,245,177, 43,104, 13, 13, 46,247, 9,116,229,167,174,201,207,166,244, 58,154,133, 56, 35, 9, 73,146,
+ 72,152,155,186,129,195,117, 67,118,174, 2, 28,210, 1, 58, 85, 52,244, 69,191, 85,200, 83,160,212,126,218,248,233,203,177,158,
+178,213,184,233, 42,149,202, 67,135, 14, 29,250,230,167,159,126,226,247,234,213,203,231,212,169, 83, 95, 1, 64,175, 94,189,124,
+204,204,204,112,232,208, 33,141, 82,169, 60,244, 25, 45, 62,157, 90,181,106, 5,169, 84,138,248,248,248,240, 74,143, 77,163,177,
+ 22,217,217, 81, 25,183,110,233, 50,165, 82,215, 78,157, 58, 17, 58,154, 6, 73, 16,200,201,203, 67, 98, 66, 2, 44, 44, 44,136,
+ 87,209,209,162,237,211,167,159,245,241,243,227, 20,239, 72, 52, 4, 23, 46, 92, 16,162, 48, 46,171,210,247,170, 9,121, 70,122,
+218,152,105,211,166,157, 61,116,232,176,121,122, 70,122,140,128,207,167, 69, 34, 35,167,145, 35,166,114,114,115,115,135, 3,144,
+ 25, 74, 38,149, 74, 17, 23, 23, 7, 99, 99, 99,240,184, 92, 48, 74, 5,244,114, 25, 84, 57,153,160,180, 26,240,245,122, 88, 9,
+ 5,112,181,183,135,155,173,141, 65,156,177, 55,175,150, 4,190,151,118, 23,110,108,229, 11,190,137, 8,124, 83, 17,166, 6,223,
+ 46, 90,141,242,128,101, 63, 24, 66,107,227,236,236,252,199,145, 35, 71,120,153,153,153, 8, 11, 11, 11, 7,144, 7,192, 20, 0,
+ 19, 21, 21,117, 61, 50, 50,178,119,209,174,187,170,118,139,109, 62,115,230, 76, 87,127,127,127,218,195,195,195, 36, 35, 35,195,
+ 85, 42,149, 50, 18,137,164,140, 73,232,234,213,171,130,130,130, 2, 57,195, 48,103,139, 68, 86,149,249,139,102,127,235,108, 20,
+250, 2, 51,218,119,175,211,200,204,166, 49,114,232, 23,141, 30,133, 75,102,204,254,214,121,219,150, 83, 98,149, 49,161,254,157,
+208, 39,187,114,140, 84,134, 6, 49,179, 64, 97,172, 84,104,104, 40, 18, 19, 19, 17, 23, 23, 87, 70, 80, 77,156, 56, 17, 7, 15,
+ 30, 52,200,162,101, 98, 98,178,118,197,138, 21, 46,179,102,205,226,149, 18, 69,152, 54,109, 26,242,242,242, 16, 20, 20,132,105,
+211,166, 85,123,226,255, 0,158,157, 58,117,234,229,232,232,136,236,236,108, 56, 56, 56,192,223,223,191,207,157, 59,119, 60, 0,
+196,215,240,188,159,218,189,123,247,213, 43, 87,174,132, 78,167,195,184,113,227,240,246,237,219, 19,111,223,190,221,234,230,230,
+ 54, 99,193,130, 5,246,246,246,246, 24, 50,100,136, 9, 77,211, 3, 43, 34,177,178,178, 90,183,103,207,158,225,189,122,245, 34,
+181, 90,237,215, 55,111,222, 68, 66, 66, 2, 52, 26, 13,104,154,198,187,119,239, 48,109,218, 52, 73,209,238,198,119, 6,180,107,
+236,146, 37, 75,198,204,152, 49, 3, 27, 54,108,192,138, 21, 43,126, 51, 55, 55,247,107,218,180,105,179, 21, 43, 86, 96,254,252,
+249,112,119,119,135,181,181,245, 23,203,150, 45,243,157, 51,103, 14,182,109,219,134,229,203,151,255, 6, 96,127, 77, 58,130, 97,
+ 24, 98,253,250,245, 77,182,108,217,226, 88, 44,178, 72,146,196,241,227,199,241,226,197,139, 62,239,223,191, 47,239, 55,187, 29,
+ 28, 28, 38, 58, 58, 58,242,175, 93,187, 38,114,119,119, 7, 77,211,186, 34,145,181,221,205,205,237,187,119,239,222,161, 87,175,
+ 94,120,255,254,253, 33, 0,163,204,205,205,229,115,230,204, 17, 26, 27, 27,155, 43, 20,138,191,106,242, 6, 69, 18,163,215,174,
+154,143,167, 47,162,113,230, 12, 15, 79,159, 62,133,189,189, 61, 4, 2, 1, 88,150,133, 90,173, 70,102,102, 38,116, 90, 53, 26,
+ 53,244,196,129,125,235,145,145,145, 9,144, 68,133, 33, 55, 4, 73,140, 24,243,159, 1,184,119, 63, 4,191,252,178, 7, 50,153,
+188,130,197,183, 17,234,249,248,194,217,201, 14,201, 41,201, 32, 72,216,252,153,199,250, 15,119, 29,150,220,130, 96, 72,122,135,
+210,176,176,176,216,122,236,216, 49,235,142, 29, 59, 82,114,185, 28, 12,195,160,157,191, 63,102,204,154,133, 11, 71,142,192,187,
+117, 0, 8,141, 8,180,208,176, 93, 15, 42,165, 2, 13,154,125,133,193, 67,134, 34, 41, 49, 17,221,123, 15,130, 74,165, 40, 89,
+ 97, 20, 91,180, 52, 26, 45,108,236, 92,113,245,234, 85, 10,227,198,189,198,246,242,141, 18,122, 45,255,101,204, 59, 85,219, 92,
+229, 11,132, 62, 61, 8,173, 90,139, 70,141,150, 65,203, 88,195,206,101, 34,116,186,115,200,207,188, 89,232,198,176,238,136,148,
+164, 36,144, 20,239, 85, 77,123,144,145,103,126,210, 77, 55, 47, 47, 47, 47, 46, 46,238, 84,104,104,232,136,129, 3, 7,226,234,
+213,171, 19, 0, 96,224,192,129, 8, 13, 13, 69, 92, 92,220,169,188,188,188,188,207, 49,218,142,142,142,125, 59,116,232, 16,208,
+178,101, 75, 4, 7, 7,131,101,217,123, 6, 93,216, 92, 46, 75,146, 36, 24,134, 1, 1, 32, 59, 55, 23,111,223,190, 69,118, 86,
+ 22,116, 58, 29,228, 50, 25,227,235,227, 35, 99, 25,198,180, 58,237, 41,189,195, 16,229,236, 58, 44,126,175, 6,135,154,248,228,
+209,131,164, 2,153,204,214,210,194,178,128,207,231,235,165,185,185,121,175, 95, 69,104, 12,156, 28,138, 17, 21, 25, 25,233,151,
+154,154,138,164,164, 36,208,242, 2, 80,106, 13, 72,181, 2,157,191,250, 18,198, 96, 97, 4, 6, 92, 70, 7, 46,197, 69, 65,225,
+238,188, 42,221, 29,250, 82,139,132, 98,145, 69, 16, 68,161,187,208,196, 4,124,145,105, 25, 11,151, 33,231,147, 64, 32, 56,114,
+242,228, 73, 71,103,103,103,172, 90,181, 10, 46, 46, 46, 95, 56, 57, 57, 41,204,205,205,141,237,237,237,209,160, 65, 3,124,245,
+213, 87,184,124,249, 50, 12,232, 3,154,101,217,110,247,238,221,155,251,224,193,131,193, 38, 38, 38,196,244,233,211, 57, 61,123,
+246,132, 64, 32,128, 66,161,128, 84, 42,197,209,163, 71,179, 24,134, 41,222,148, 98, 45, 20, 10,247, 19, 4, 17, 47,151,203,103,
+125, 72,120,224,167, 70, 78, 25, 57,204, 56, 86, 38, 28,208,190,123,157, 70,157,186,119,129,167,119, 39,116,234,158, 4, 0,235,
+173, 56, 9, 1, 63, 46,177, 56,107, 97, 74,236,191,122,229,218,114,255,246,157,150, 44,148,221, 90,189, 97,111,110,149,241,116,
+ 4, 65,128, 97,152, 50,185,131, 62,252,124,212,168, 81, 56,126,252,120,149,253, 72,146,228,208, 73,147, 38,241, 62,176, 60, 67,
+ 44, 22,163,119,239,222, 24, 56,112, 96, 25,161,101, 99, 99, 3, 7, 7, 7, 36, 36, 36, 0, 64,182,129,231,213,140,177, 99,199,
+ 18, 74,165, 18,227,199,143, 71, 80, 80, 16, 2, 2, 2,136, 59,119,238,204, 0, 48,171,186, 39, 59, 73,146, 27, 23, 44, 88, 48,
+119,218,180,105,200,201,201,193,165, 75,151,208,179,103, 79, 28, 63,126,220,246,210,165, 75,107, 59,118,236, 8,138,162, 16, 28,
+ 28, 12,154,166, 43,205,245,197,227,241,250,246,234,213,139, 76, 78, 78, 6,143,199, 67,139, 22, 45,144,146,146, 2,133, 66, 1,
+177, 88,140,153, 51,103,166,101,103,103,119, 48,244, 58,226,241,120,179,102,204,152,129, 99,199,142, 33, 48, 48,240,119, 0,227,
+243,242,242, 6, 63,120,240,224, 88,191,126,253, 32, 22,139,113,246,236, 89, 44, 95,190,156, 24, 53,106, 20,118,238,220,137,153,
+ 51,103,254, 86,100,117,170,232,196, 47,200,200,200, 48,175, 91,183, 46,210,211,211, 33,147,201,112,246,236, 89,187,203,151, 47,
+123, 56, 59, 59,155,197,197,197,233,127,248,225, 7,254,172, 89,179,176,117,235, 86,132,133,133,225,224,193,131,232,212,169, 19,
+253,254,253,251,114,173,100, 69, 41, 27,206,178, 44,123,205,196,196, 4, 5, 5, 5,197,215,221,188,192,192,192,105,235,214, 21,
+ 26,217, 83, 83, 83, 49,122,244,232,145, 55,110,220, 96, 58,118,236, 40,228,241,120, 80,169, 84,242,191,114,214,102,244, 12, 0,
+ 6, 30,174, 34,132, 92,216,135,231,225,239,241, 60, 60, 18,124, 65, 97, 16,188, 82,169, 64,179, 70,245,208,186, 69, 43,164, 74,
+196, 56,116,112, 31,172,108,156, 43,189,143,176, 44, 11, 30, 71, 15, 95, 31, 7, 28, 57,184, 7,193,151,110,224,224,161,163, 37,
+ 49,111, 28, 14, 23, 77,155,181, 70,139, 22,254,120, 31,247, 14,251,246,253, 2, 91, 59,215, 90,231, 96, 13, 81,226, 58, 44,253,
+252,129,242,239,228,239,239, 79,201,100, 50,168, 84, 42,164,165,165, 33, 33, 33, 1, 22,150, 22,120,159, 26,143, 14, 66, 45,210,
+152,124, 68,133,191,210, 19, 20, 55,172,170,127,216,171,125, 83,160,125, 83,124, 55, 54,160,146, 37, 43, 11, 19, 51,155, 66,215,
+ 13, 77,199, 98,219, 54,186, 34,161, 69,235,117,215, 67,174,221,108, 53,118, 84, 95,238,213,155, 65,208,105, 24, 40,117,230,144,
+171, 52,144,107,185, 32,205,123, 2, 89,119, 64,113, 4,104,211,164, 30,206,158,185,172,101,105,221, 13,131, 59,200,222, 15,116,
+122,100, 41,161,149,241,129,223,193,202, 96,215, 97,201,196,171,215, 31, 63,124,248,112,255, 47,191,252, 82,216,177, 99,199,186,
+ 69, 19,167,246,240,225,195,138,162,100,152,213, 69,153,108,240, 14, 14, 14,205,120, 60, 94, 64,207,158, 61,155,141, 25, 51, 6,
+175, 95,191,198,161, 67,135, 98,234,213,171,119, 75, 34,169,120, 71, 54,197,231,103,203, 50, 50, 44, 68, 30, 30, 28, 75, 83,211,
+212,203,151, 46,185,119,233,218,149, 72, 74, 74, 66,118,118, 54, 84, 42, 21,194,194,195, 89, 46, 69,165, 16,102,102,100,244,139,
+ 23, 36,197,231,103, 87,100,109, 44, 7, 9, 85,236, 58, 92, 87, 83,235,150,171,163,101,221,229,129,147, 61, 85,106,149, 95,126,
+126, 62,205,225,114,185, 46, 14, 22,137,209,239, 12,191, 39,170,213,234,224,235,215,175,247,239,210,165,139, 32,230,101, 24,232,
+188, 60,104,242,164,224, 49,122, 88, 53,107, 2, 74,171, 6, 52, 58, 56,251,178, 80,229, 10,113,231,113,180, 78,173, 86, 87,153,
+212,176, 88,104,145, 31, 8, 3,190, 72, 4,129,169, 25, 4, 34,209,135,130,161,170,149,156,176, 91,183,110,157,219,180,105, 3,
+150,101,177,119,239, 94,104,181, 90,190, 86,171,133, 70,163,129, 86,171, 69,126,126, 62, 14, 30, 60,136, 93,187,118, 61, 0,240,
+155, 1,135, 79, 27, 27, 27,247, 35, 8,194,142,195,225, 40,108,109,109, 77,142, 31, 63, 94,146,110,162,105,211,166, 48, 53, 53,
+229,161, 40, 41,164,157,157, 29,247,215, 95,127,181,232,211,167,207,221,114,221, 29,141,190,152,239, 73, 91,182, 55, 50,174,227,
+ 97,102,211, 24,158,222,157, 0, 0, 93,123,143,133,103, 61, 55,228,103,189,244, 80, 41, 19, 6,240, 56, 82,203, 87,219,196,175,
+141,123,249,141,145,103,220,126,139,242,183,247,151, 59, 81,144, 36, 89,161, 59,214, 16,145, 85,168, 89, 72,219,226, 56, 31, 0,
+200,206,206,134, 68, 34, 65, 84, 84, 20,234,215,175,143,156,156, 28, 56, 59, 59, 67,163,209,160,101,203,150, 80, 42,149,216,178,
+101, 11,238,223,191,255, 0,192, 76, 3,254,135,177,183,183,247,232,102,205,154,225,210,165, 75,120,250,244,169, 56, 36, 36,196,
+217,223,223, 31, 30, 30, 30, 99,226,227,227, 23, 23,185,250, 12,133,137,191,191,255,244,105,211,166, 33, 50, 50, 18,147, 39, 79,
+206, 78, 78, 78, 62,123,226,196,137,241,203,151, 47, 39,187,119,239, 14,137, 68,130,141, 27, 55,234,239,223,191,191, 9,192,170,
+ 42,250,241, 77,114,114,178,139, 74,165, 66, 78, 78, 14,104,154,134, 66,161,192,229,203,151,113,240,224,193,244, 34,145, 21,107,
+104,227,154, 52,105,210,128, 36, 73, 28, 59,118, 12, 0,150,162, 48, 99,255,217, 1, 3, 6,136,127,248,225, 7,231, 69,139, 22,
+ 97,194,132, 9,208,106,181,216,176, 97, 3, 22, 45, 90,116,177, 72,100, 85,118, 19,253,201,193,193, 97,226,228,201,147,191,152,
+ 51,103, 14, 66, 67, 67,237,158, 61,123,214, 34, 44, 44, 12,174,174,174,200,206,206,230, 88, 91, 91, 99,235,214,173,152, 61,123,
+246,105, 0, 89, 15, 31, 62, 28, 26, 23, 23,183, 14,192,198, 42, 68,251,110,103,103,231,137, 44,203,178, 10,133, 34, 33, 48, 48,
+112,227,154, 53,107, 48,123,246,108,188,122,245, 10,121,121,121, 48, 53, 53, 37, 22, 44, 88, 48,122,233,210,165, 24, 55,110, 28,
+ 43,151,203,119,253,213, 19, 53,203,234,161,144, 70, 66,175,182, 68,211, 70,245,209,212,175, 14, 66,110, 62, 7, 0,116, 30,228,
+ 15,133,188, 0,191,255,190, 23,177,177,111,193,225,114, 97, 97,229, 96,136, 37, 16,154,252, 55,200,213, 74,208,165, 99, 11,244,
+236,222, 1,191, 29, 56, 14, 90,167,197,248,177,195, 33,205,205,197,129, 3,251,240, 62,238, 29, 56, 92, 46,172,109,254,252, 68,
+168,149,105,145,127,188,208, 50,192,253, 4,134, 97, 32, 22,139,241,236,217, 51,196,199,199, 67, 40, 20, 66, 73,235,153, 95,174,
+223,103, 8,130,151,194,176,236, 3,150, 46,201, 82,252, 49,135, 94, 47, 46,149,177,214,220,210,210,146,175, 86, 43, 65,211,186,
+ 82,179, 10, 1, 16, 0,143, 3, 56, 58,121, 34, 57, 41,153, 85,169, 84,183, 43, 93, 65,169, 85, 91,207,159, 61, 57,237,171,182,
+254, 54, 61, 59,175,196,217,115,203, 32,205,207,135, 74,203,133, 92,165,133, 66, 5, 88, 88,249,160,101,163,198, 72, 77,205,198,
+203,167,119,100, 28,181,194,144, 64,209,183,219,151,140,245, 30,251,221,124, 24,187,183,133, 58,234, 44, 24, 89,122,137, 69,203,
+ 72,100, 9, 43, 55, 95,228,202,213, 56,121,227, 57, 80,141, 82, 47, 25, 25, 25, 10,138,162, 14, 79,155, 54,109,195,243,231,207,
+ 92, 0,224,249,243,231, 41, 18,137,100, 97, 70, 70, 70,117,109,210,197,217,224, 9, 35, 35,227,231,245,234,213, 75,109,209,162,
+133,249,128, 1, 3, 96, 99, 99,131,176,176, 48,172, 91,183,238,141, 86,171,157,127,231,206,157, 74, 93, 61, 26,141, 70,252,252,
+220, 57,179, 14,255,249,143,197,252, 62,125, 54, 78,155, 54,109,235,170, 85,171,184,222,222,222,132, 78,171, 69, 68, 68, 4,123,
+228,240, 97,221,174, 69,139,182,240, 77, 76, 56, 79,206,159,231,210,106,181,248,239, 62,137,157,157,157,219,251,127,221,206,119,
+211, 79,219,160, 82,202,240, 56,244, 34,164,210, 76,236,217,123,198,215,217,153,109, 47, 22,139,239, 24, 42,128,247,239,223, 63,
+183,117,179,102,205,188, 92, 93, 17,145, 24, 15, 62,163, 7,143,166, 65,105,213, 32,105, 21, 92,253, 88, 16,164, 41, 36,105,249,
+ 88,115,236, 84,164, 33,194,248,139,111,250, 98, 85, 74, 30, 8,130,192,230, 47,253,192, 55, 21,129,103, 34,194,212, 63,110,150,
+ 8,131,224, 85,139,192, 23,137, 80,183,181, 65, 9,225, 21,183,110,221,122, 22, 17, 17,209,210,207,207, 15,115,231,206, 69, 66,
+ 66, 2, 24,134, 65,122,122,186, 74, 34,145,136, 51, 51, 51, 19, 80,152,255, 39,168,138, 73,172,180,234,112,190,115,231, 78,137,
+187,225,198,141, 27,112,114,114,130,185,185, 57,242,243,243, 49,105,210, 36,139,239,191,255, 30, 0,240,236,217, 51,148, 22, 40,
+ 31, 34,226,121,212,166,220, 2, 86,202,202, 94, 12,200,161, 95, 52,234,212, 61, 25, 93,123,143,193,181,224,223,112, 51,228, 58,
+172, 56, 9,241, 48, 41,184,156, 21,159,149,159, 34,247,222,237,219,124, 60, 37,145,135,236,158,222, 55,134,114,116,100, 78, 46,
+250, 37, 63,183,178,182,122,123,123,195,222,222,190, 36, 70,139,195,225, 96,220,184,113, 96, 89,214, 80,145, 85, 52,215, 48,153,
+ 42,149,202,222,200,200, 8,105,105,105,120,247,238, 29,222,191,127, 95,146, 58,128, 97, 24,221,188,121,243,184,211,167, 79,199,
+ 47,191,252,130,219,183,111, 63, 0,176, 18,128,161,139,181,225, 67,134, 12, 49,213,104, 52, 56,122,244, 40, 13,160,247,201,147,
+ 39,159,181,108,217,146,211,163, 71, 15,211,157, 59,119, 14, 47, 26, 35,131,133,150,153,153, 25, 79,171,213, 98,231,206,157, 72,
+ 78, 78,110, 15, 32,234,201,147, 39,187,135, 12, 25,178,203,207,207,175, 94,100,100,228, 91,153, 76, 54, 21,192,203,170,200,210,
+211,211,199,182,104,209,226, 36,195, 48,238, 93,186,116, 49,249,233,167,159,204,162,163,163,225,226,226, 2,134, 97, 34, 80,205,
+ 18, 86,111,223,190,141,146, 72, 36,190, 29, 58,116,192,229,203,151,215,235,245,250,181, 0, 54, 76,153, 50,197, 57, 49, 49, 17,
+205,154, 53,131,149,149, 21,162,163,163, 11, 36, 18,201, 46, 20,150, 36,170,202,132, 27, 7, 96,225,238,221,187, 27,239,222,189,
+ 59,192,202,202,170, 77, 88, 88, 24,238,221,187,135, 77,155, 54,225,251,239,191, 71,187,118,237, 48,119,238,220, 44, 0, 1, 0,
+232,184,184, 56,131,242,230, 21, 91,182, 0,160,121,243,230,169,235,214,173,195,248,241,227,217, 95,127,253,245,231,195,135, 15,
+207, 26, 62,124,120,201, 28, 56,122,244,104,246,208,161, 67,163, 81, 88,134,233,175,132, 78,171,213,192,204,202, 19,178,220, 36,
+100, 38,135, 66,104,234,128,238,157,154, 64,161,212,224,194,249,211,120, 25, 17, 14,146, 36, 97,239,224, 10, 11, 75, 27,196,196,
+188, 5, 42,223,109,172,211,106,181, 48,181,172, 3, 89, 94, 50, 52, 25,207, 97, 44,178,195,152,255, 12,128, 66,169,197,153,179,
+167, 17, 25,249, 18, 20, 69,193,193,209, 21,230, 22,133,156, 4, 91,249, 14,230, 90, 0, 40, 39,159, 86,149, 66,139,162,168, 91,
+ 87,174, 92,249,182,117,235,214,156,216,216, 88,196,198, 22, 46,110,164, 82, 41, 77, 64,127, 42, 35,226,252,176, 74,126,222, 5,
+ 69,187, 51, 74,215, 46, 20,153,154,138,163,223, 68,217, 75,115,210, 17,254,226, 62, 98, 99, 34, 16,255, 62, 10, 90,173, 10, 20,
+ 73,130,164, 72,212,241,108,136,251, 15, 66, 53, 42,154, 14,173,136,179,176, 29,239, 11, 76,236,188,135,174, 94,181, 56,120,246,
+252, 21,198,131,191,253, 5, 47,163, 95, 67, 70, 59,128,101, 1, 7,107, 19, 52,245, 90, 0,113,106, 38,142,253,182, 83,193,104,
+181, 35, 62,200,161,245, 17, 39, 0,216,103,161,193,174,189,191,141, 11, 58,120,100,197,252,233,147,236,251, 13, 28, 1,126,206,
+107,232, 82,159,195,179,101, 79, 16, 2, 11, 92,186,122, 19,119,158,189, 78,103,244,236, 10,251,108,252, 26, 83, 5,103,105,228,
+230,230, 62, 76, 75,147,184,148,202, 2,239, 34, 16, 24, 85,181, 59,238, 67,206, 50, 25,231, 41,138,108,190,122,245,106,157,189,
+189,189, 54, 50, 50, 18,191,252,242, 11,243,252,249,243,171, 36, 73,110,151, 72, 36,170,170, 56,109,117,186,240, 35,129,129, 13,
+ 90, 13, 28,200, 14,155, 62, 93, 1,129, 96,198,198,205,155, 3, 51,165, 82, 39,150, 97, 96,107,101,149,178,113,209,162,117,223,
+ 14, 25, 34,125,117,255,190,113,232,185,115,198,124,154,126,110, 64, 59, 63, 7, 42,228, 20,139,197,119,110,223,190,135,223,131,
+126,130, 86,171,134, 68,156, 8, 0,200,202,206, 67, 21, 34,235, 67, 78, 86,161, 80, 12, 92,250,253,247,143,150,206,158,229,240,
+117,231, 46, 72, 10, 15,131, 54, 39, 19,132,142, 6,151,224, 64,158, 33, 68, 70,186, 12, 11, 15,157,200,144, 41, 20, 3,203,153,
+ 36,202,109,103,177,197, 74, 96,102, 10,158,137, 8,124,145,105, 25, 43,150,145,153, 25,248, 38, 34,112,248,252,242, 2,184, 63,
+226,148,201,100,131,190,253,246,219,151, 79,158, 60,177, 28, 63,126, 60,190,250,234,171, 23, 74,165,178, 35,128,130,154,246, 39,
+195, 48,226,175,191,254,154, 36, 8, 66, 52, 98,196, 8, 65,102,102,102, 73,102,117,153, 76,134,203,151, 47,163,126,253,194, 93,
+253,175, 94,189, 66,195,134, 13, 43,228,156,176, 48, 82, 12, 96,213,236,111,157, 55, 62, 10,151,204, 0,176,222,179,158, 43,110,
+134, 92,199,189,155,161,129,109,252,152,109,223,140,104,249,131,176, 17, 92,145, 19, 0, 0, 32, 0, 73, 68, 65, 84,227,144,249,
+190,205,199, 83, 34, 51, 71, 28, 56,115,154,138,122,190,111,141, 66, 17, 81, 23,191,156,157, 87, 81, 59, 9,130, 0,203,178, 31,
+165,114,160, 40, 10,135, 15, 31,174,238,177,159, 8, 10, 10,154, 50,121,242,100,158, 68, 34,193,155, 55,111, 32,151,203, 97,100,
+100,132,144,144, 16, 26,192,206,195,135, 15,135, 28, 62,124,184, 7, 10,119, 19,221,168,206,249,105, 98, 98, 50,173,123,247,238,
+120,243,230, 13,158, 62,125,122, 26,192,203, 23, 47, 94,156,142,141,141, 29,218,174, 93, 59,252,246,219,111,211,148, 74,101, 80,
+117, 56, 25,134, 41,157, 51,169,184,226, 67,184, 76, 38,107, 19, 26, 26, 90,221,113,151,100,103,103,183, 45, 18,214,201,246,246,
+246,102,225,225,225,112,115,115,131, 86,171,109, 93,221,115, 41, 47, 47,239,167,237,219,183,255, 58,118,236, 88,252,240,195, 15,
+ 35, 78,156, 56, 49,226,155,111,190, 65,175, 94,189,176,127,255,126,188,124,249,114, 61, 12, 43, 43, 86,222,177,191, 4,240,210,
+222,222,254, 59, 87, 87, 87,108,218,180, 9, 17, 17, 17,235, 86,173, 90,181,232,229,203,151,168, 95,191,190, 32, 42, 42,138,174,
+201, 61, 4, 0,204,204,204,204,116, 58, 29,206,157, 59,247, 24,192,236, 17, 35, 70,216,109,221,186, 53, 64, 36, 18, 33, 39, 39,
+ 71, 25, 25, 25, 57, 28,192,249,191,250, 94,199, 18,196,146,241, 19,102,236,158, 48,126,184, 81,139,230, 77,161,200, 79,129, 82,
+150, 14, 69, 65, 26,182, 7, 93, 5, 65,144,176,181,117,132,157,131, 11, 18, 19,147,240,224,226, 37,141, 92,161,220,202,215, 49,
+235, 43,231,156, 94,200,217,172,144, 83, 33,207,128, 82,150, 81,194,105,103,231, 84,196,153,136,251,161,151, 84, 74,185,252, 39,
+ 13, 75,252,248, 39, 31,251, 63, 25,213,171,117, 88, 26, 82,169,116,230,164, 73,147, 58, 46, 92,184,208,154,166,105,202,202,202,
+ 10,137,137,137,244,169, 83,167,114,100, 50,217,204,154,180,134,195,229,190,244,246,169,223,177, 95,191,126,116,223,190,125,120,
+ 35,199,246,224,216,218,217, 33, 47, 55, 27, 49,111,194, 16,253,250, 57,188,235, 55,193,242, 85, 91, 0, 11,139, 42, 11, 73, 22,
+149,213,233,189,114,233,188,227,109,219,119, 51,171,223,176, 9,175,105, 93,115,104,117, 52, 82, 82, 82,112,254, 92,184, 54,242,
+217,189,124,134,214, 12, 85,100, 25, 86,130,231, 14, 64, 35, 27,123,252,236,180,135,215,110,220, 62,119,231,158,223,231, 47,156,
+ 49,222,164,157,127, 87, 68, 92,255, 13,167,131,143,203, 85,106,205, 70, 30,133,205,145,217, 80,196, 84,179, 15, 84, 42,149,246,
+195,249, 84,165, 82,105, 63,117,164,247,239,223,143,244,244,116, 77, 66, 66,194, 21,154,166, 79, 84, 82,236,249, 35,108, 7, 52,
+ 3,212,234,235, 75,253,253,123, 44, 13, 9, 49, 26,189, 96,129,102,196,200,145,243,160, 86,107,193,231,179, 28, 19, 19, 18, 2,
+ 1,247,213,253,251,198, 63, 79,153, 98, 69,104, 52,215,126,175, 36,109, 64, 57,248,236,187, 14,139, 45, 90, 29, 58,180,195,232,
+241,179,161, 44,101,209,122,248, 52, 6,106, 45, 12,182,104, 21, 33, 41, 33, 57,185,205,140, 37, 75,207, 12,237,222,217,215,207,
+189,142,192,214,163, 14, 68, 14, 14,200,206,204,196,253,167,209,186, 85,199,207, 68, 22,137, 44,131,242,202, 48, 12, 83, 24,228,
+ 14,160,243,204,133, 32, 40, 10, 40, 74,227, 80,188,115,200,163,229, 87, 32, 56, 28,232, 89, 6,106,181,218,144,160,191,148,119,
+239,222, 13, 26, 49, 98,196,141,224,224, 96,178,123,247,238, 77,207,158, 61,203,124,202,185,163, 84, 42,219, 0,128,145,145, 81,
+188,133,133,133,243,216,177, 99,161,211,233,160, 80, 40,144,151,151,135,148,148,148,220,177, 99,199,106, 1,192,216,216,152,255,
+237,183,223,154, 85,197,185,229,148, 88, 53,251, 91,231,109, 86,156,132,128,252,172,151, 30, 86,156,132,248, 54,126,204,182, 45,
+167,196, 42, 51, 39,249,234,172,132, 59, 49, 18,121,200,238, 3,103, 78, 83,163, 6, 12,210,187,136,222, 6, 26,217,177,167,170,
+226, 37, 8,226,163,228,164, 6,138,172, 50, 40, 40, 40, 88,180,108,217,178, 94, 82,169,212,165, 71,143, 30, 60, 95, 95, 95, 60,
+122,244, 8,193,193,193,244,195,135, 15,147,229,114,249, 98, 0, 42, 0, 87,107,210,167, 62, 62, 62, 30, 28, 14,167,216,149,182,
+163,232,237, 29,103,207,158, 29, 58,126,252,120,212,169, 83,167, 65, 84, 84,148, 0,213,184,142, 88,150, 45,241, 50,124, 78, 16,
+ 4,241,254,231,159,127,118,118,112,112, 32, 46, 95,190, 76, 83, 20, 85, 19,203,205,254,125,251,246,181,214,233,116, 19, 38, 78,
+156,136,246,237,219,131,166,105, 28, 58,116, 8,251,246,237, 51, 84,100, 85,138,152,152,152,231,201,201,201, 95,207,155, 55, 15,
+155, 54,109, 90, 52,111,222, 60, 36, 39, 39, 35, 38, 38, 38,236, 83,120,243,243,243,149, 73, 73, 73,194, 47,191,252,178, 69,100,
+100,100,100,199,142, 29, 27,142, 31, 63, 30,235,215,175,103,111,223,190,253, 45,128,203,127,199,236, 29, 29,155,115,144,171,231,
+132,172, 90,253,211,247,117,189, 60, 38,143, 27, 51,132,242,241,110, 8,121, 94, 10,172,109,236,225,226,234,137,204,140, 44, 92,
+185,114, 89,159,149,149,187, 95, 79, 18, 43, 99, 99,115, 82, 63,133,211,217,197, 19, 25, 25, 25,184,116,233,146, 62, 87,154,191,
+ 23, 58,114, 85, 84, 98,110, 58,106, 97,136, 37,107, 34, 42,201, 18, 95, 25,108, 44, 45, 45,143,154,153,153,165,155,153,153,165,
+ 91, 90, 90, 30, 5, 12,218,125,208,165,212,221,129, 42,243,248,246, 91, 35, 24, 25,181, 1,135, 51,199,194,210,242,178,185,185,
+121,118,135, 14, 29, 52,187,119,239, 86, 69, 69,189, 98,196,226,100,214,220,220, 60,175,228,251,229,113,126, 0, 75, 75, 47, 83,
+ 19,199,134,223,155,187, 52,189, 47,114,108, 80, 32,114,108, 80, 96,238,210,228,129,137, 99,131, 21,150,150, 94,166, 6,181,179,
+ 2,120,218,193,214,219, 6, 59,235,219, 18, 74,111, 27,236,244,180,131,173,193,199, 94,185,219, 79, 79, 16,208,163,112, 27, 54,
+106,192, 89,204,193, 80, 20,245,187,139,139,139, 35,170,151,176,238, 35,206,145, 64,157,145, 2,193,132,147,129,129,163,227,111,
+223, 30,145, 31, 23, 55, 44,239,253,251, 33, 97,199,143, 15,221, 49,116,232,200, 97, 2,193,196,111, 1, 47, 67, 57, 29, 29, 29,
+215, 61,127,254, 60,216,208, 71, 41,225,101,112,127,122,121, 58,135,116,239,210,154,157, 54,105, 32, 59,109,210, 64,182,123,151,
+214,172,151,167,115,200, 39,140, 17, 65, 81, 84,128, 80, 40, 60,106, 34, 20, 70,152, 8,133, 17, 66,161,240, 40, 69, 81, 1,168,
+ 60,134,170, 12,167,181,181,245, 51,123,123,251,244,234, 60,108,108,108, 94, 84,163,157,195, 60, 60, 60,146, 73,146,220, 82,205,
+107,186, 50, 78,111, 99, 99,227,247, 38, 38, 38, 41,165, 31,198,198,198,165, 19, 67, 89, 11,133,194, 11, 38, 38, 38, 91, 13,225,
+252,113, 73,195,239, 31, 92,253,238,229,143, 75, 26,126,255,225,103,211,251, 91,142,125,116, 99,101,246,244,254,150, 99, 13,105,
+167,157,157,221,109, 59, 59, 59,137,157,157,157,196,222,222,190,210,135,141,141,205, 51, 3, 56,141, 76, 77, 77,183,154,154,154,
+166,155,152,152,232, 69, 34, 81,186,137,137,201, 22,148, 74,109, 81,211,254, 36, 73,114,125,131, 6, 13, 84, 20, 69,253,250,193,
+ 71,155,234,214,173,171,226,112, 56, 27,171,201,105,214,174, 93, 59,125,120,120, 56,219,190,125,123, 22,128,229,103, 28,119, 7,
+ 75, 75,203,203,102,102,102, 73,166,166,166,219, 1,152,212,144,147, 0, 16,224,236,236, 28,214,169, 83, 39,133,179,179,115, 40,
+128,126,159,177,157,189,250,247,239,207, 36, 37, 37,177, 44,203,178, 73, 73, 73,108,255,254,253, 25, 20, 38,138,252,148,123,242,
+146, 41, 83,166,176, 15, 31, 62,100, 31, 62,124,200,134,134,134,178,189,122,245, 98, 0,252,231, 19,239,243,248, 92,199,238,235,
+105,227,245, 69, 61,203, 19,195, 7,249, 51, 87,207,111, 97,151, 47,158,204,118,109,223,144,173, 95,215,242,140,183,183,181,247,
+231,224,252,126,241, 36,182,203,215, 13, 24, 95, 47,203,227,190,158, 54, 94,127,241,177,255, 27,173, 90,248,179, 3,206,254,223,
+180, 88, 86, 44,149, 15, 39, 39, 39,100,103,183, 54,226,112,252, 5, 2, 65, 71,146,162,110,229,100,102,206, 42, 90,110,233,255,
+ 42, 83,109,165, 19,186, 23,248,149,148, 36,168, 9,103,153, 64,246, 26,114, 86,135,195, 32,206,138,138, 74, 51,106,117,170, 53,
+ 77, 63,219,142, 74,251,160, 12,167,179,179,243, 4,134, 97, 60, 12,109, 16, 73,146,241, 98,177, 56,168, 38,253, 89,175, 94, 61,
+182,200,189, 77,124,206,113,255, 51,206,165,255, 37,206, 3, 63, 53,114,170,223,232,139,249, 17,207,163, 54, 21,185, 21, 75,176,
+ 98,186,165,169,127,167, 14,203,238,223,188,253,195,138,237,210,130,191,249,216, 73, 24, 24,211,246, 25, 56,139,147,132, 86,139,
+147,203,229,238,110,213,170,213,132, 71,143, 30,253,170,215,235, 39,254,143,158,159,189, 40,138,154,231,227,227,211, 52, 38, 38,
+ 38, 76,175,215,111, 66, 57,137, 34,107,208,206,197, 30, 30, 30, 83,121, 60,158, 64, 38,147, 73, 83, 83, 83,151, 1, 56,241,223,
+214,159,190,245,172, 90,176,108, 73,210,237, 53,111,222,229, 60,249,108,156, 44,163,103, 88,106,117, 76, 92,246,139,191, 97,220,
+255,109, 34,107,239, 95,241,143,187,212,114,214,114,214,114,214,114,214,114,126,118, 78,227,218,254,172,229,252, 23,114,254, 43,
+193,169,237,130, 90,212,162, 22,181,248,199, 65, 89,219, 5,181,168,197,127, 29, 74, 91,181, 74,172, 89, 68, 37,170,180, 58, 38,
+193,154, 40,219,235,181,156,181,156,181,156,181,156,181,156,181,156,181,156,255,115,156,255, 86,145,181,183,146,215,127, 26,106,
+205,170,181,156,181,156,181,156,181,156,181,156,181,156,181,156,255, 11, 66,171,220,215,181,174,195, 90,252,233,216, 54, 0,206,
+ 0, 48,227, 44,196,127,198,247,107, 81,139, 90,212,162, 22,181,248,155,177, 23, 21,184, 14,255, 27,132,150, 19,128, 54, 40, 44,
+124, 27, 13,224,255,216,187,238,176, 42,142,245,253,238,238,233,231,128,136, 52,193,130, 21,165, 40, 40,138, 93,196, 18, 27, 38,
+150, 24, 75, 84,140,137, 94,187,177, 36,168,215, 88, 18,133,104, 98,139, 26, 53,106, 44,215,110,212,136, 93, 52,104, 44,160,162,
+ 20, 69,108, 8, 8, 7,164,215, 83,119,119,126,127, 80, 68,164, 28,208,252,238,189,185,251, 62,207, 62,231,236,217,221,239,204,
+206,204,206,188,251,206, 55,223, 92, 3,144,245, 14,246,172, 1,124, 66, 81,212, 72, 0, 32,132, 28, 65,209,172,145,116, 83, 46,
+150,203,229,169, 90,173,214,182,248,251, 43,173, 86, 91,118, 45, 3, 10,111,207,102, 35,101,182, 10,209,180,105,211, 84,157, 78,
+103,107,194,223,231, 16, 66, 34,104,154,142, 52, 51, 51,187, 28, 27, 27, 27, 84,147, 27,247,241,241,241, 99, 24,102, 37, 0,112,
+ 28,183,248,202,149, 43,187,255,194,114,235,212,200,161,254,175, 6,163,129, 77, 77,203, 92,130,183, 3,249, 1, 0, 54,251, 34,
+128, 98,177,160,248,251,154,233, 65, 85,199,209,169,233,249, 85,160,131, 88, 44,158, 97,103,103, 55,240,229,203,151,119, 0,124,
+ 5, 84, 31,213,184, 81,163, 70,227, 69, 34,209,167, 28,199, 53,103, 24,230, 25,203,178,255, 74, 76, 76,220, 43,180, 33, 2, 4,
+ 8, 16, 32,192, 4,178,245, 22,106, 68,180, 90, 91,161, 62, 1, 70,131, 66, 63, 16, 92,164,128,131,143, 50,144, 98,234,245,131,
+ 90,195,104,100,139,254, 83, 66,131, 59,251,148,222, 62,112,224,192,134, 51,103,206, 68,215,174, 93,113,235,214,173, 46,187,118,
+237,250,236,240,225,195, 17, 60,207, 95, 1,112, 11, 48, 41,148,130, 10, 69,113, 90,198, 14, 28, 56,176,239,202,149, 43, 25, 55,
+ 55, 55,104, 52, 26,252,241,199, 31,221,215,172, 89,179,254,250,245,235,151, 0,236, 47, 38, 4,149, 46,128,167,213,106,109, 75,
+ 22,227,164, 40,202,246,227,143, 63, 14, 43, 75,174,138,215, 87,163, 8, 33, 55, 41,138,186,193,113,220,173,163, 71,143, 38,182,
+ 6, 58, 77,105, 42, 57, 58, 39,206,208,176,188, 77,157, 78,103,123, 98,245, 42,136,100, 50,232,242,114,209,101,226,107,210,123,
+241,155, 5,160,120, 22, 12, 72,150,207,119,235, 35, 0, 68, 38, 39, 39, 71,120,123,123,199,213,180,132, 25,134, 89,121,238,220,
+ 57,123, 66, 8,250,247,239,191, 18,192, 95, 69,180,100,157, 59,120, 92, 57,117,236,128, 60, 63, 51, 21, 3, 62, 26,245,175,199,
+137,175,252, 0, 28,123,131, 52, 13,132, 29, 69, 97,193,212, 85,251, 25, 0,216,178,104,236, 87,235, 62,192,198, 47, 47, 32, 5,
+128, 79, 49,249, 1,128,213, 0,174,108, 30, 8, 59, 0, 95, 79, 93,181,159, 2,128,159, 23,141, 93,176,121, 32, 54, 76, 63, 91,
+227,176, 21,211,252,252,252, 54,174, 92,185,146,177,183,183, 71, 82, 82,210, 0, 87, 87,215, 86,185,185,185,174,168,194,137,184,
+ 73,147, 38,135,122,244, 30,210,108,248,200,209, 74, 27,107, 75, 36,171,211,235, 28, 58,176,115, 10,115,243,143,129, 47, 94,188,
+ 24, 37,180, 33, 2, 4, 8, 16, 32,160, 18,212, 62, 50,124,123,123, 40, 10, 12, 24, 42, 98,168,241,221, 58,184,246, 25, 51,168,
+ 7,237,234,210, 18, 15,162, 31,126,112,242,114,232, 26,250, 70,116, 48,203,145,189, 42, 9, 78,132,171,171,158, 9, 99,100, 33,
+186,112, 98,127, 81, 79,248,217, 88, 38, 44, 44,172,165,167,167,103,233,210, 48,125,250,244, 65,159, 62,125,168, 45, 91,182,120,
+ 92,184,112,193, 99,199,142, 29,134,224,224,224, 95, 81,117,124,148, 25, 45, 90,180, 88,179,113,227, 70,153,183,183, 55,100, 50,
+ 89,233, 1, 51, 51, 51, 12, 25, 50, 4, 67,134, 12, 97,146,147,147,251,159, 58,117,170,255,234,213,171,245,241,241,241,243,241,
+ 58, 74,115,149, 88,178,100, 73,135, 10,126, 62, 71, 81,212, 83,150,101,239,121,120,120, 36,182, 2, 90, 78, 25,212,245,226,180,
+110, 78,170, 57, 11,119, 85,104, 71, 36,149, 98,143, 95, 81, 95, 93,150,104,197, 93, 62, 11,179, 58,230, 25, 74,115,243, 8, 0,
+145, 0, 34, 8, 33,145,207,158, 61,123,232, 12,120,116,182,164,127,221,153,197,187,215,128,108, 33, 49, 49, 17, 22, 22, 22, 10,
+111,111,111, 53, 69, 81,203,254,248,227,143,247,237,144,215,105,217,130,105,146,172, 23, 17, 72,137,185,137,185, 35,187, 43,231,
+252,244,251,183, 90,189,241, 88, 85, 23, 81, 20, 77,175,190,193,251,163,104, 49,222, 37, 25, 25, 25,222, 0, 96,101,101, 37, 5,
+112,101, 93, 40, 6,125,217,141,122,151,216,110, 18,134, 97, 54,239,218,181,235,243,241,227,199, 23, 45, 29,241,231,159, 48, 51,
+ 51,195,138, 21, 43,154,204,155, 55, 47,128,101,217,217,149, 41, 89, 61,122, 15,105,182,225,135,111, 93,243, 50,115,116,219, 54,
+ 31,190,237,208,166, 53, 61,117,198, 60,243, 13, 6, 93,125,142,227,198, 11,202,150, 0, 1, 2, 4, 8,168,137,154, 85, 45,209,
+106,101,141,221,237,219, 56,125, 50,102,112,119, 89,219, 54,110,144,200, 94,135,110,241,236,208, 1,158, 29, 58,208,254,249,121,
+253,194,110,223,237,119,244,194, 45, 93,161, 49,254,112,108, 58,252, 76, 77, 85,201,162,180, 43, 63,178,235, 93,144,253, 74, 14,
+ 0,170,186,182,218, 69, 39, 82, 46,119,235,214, 13, 13, 27, 54,148, 4, 7, 7, 79,170,134,104, 45,122,244,232,145,140, 97,170,
+142,135,234,224,224,128,143, 63,254, 24,173, 91,183,150,246,234,213,107, 81,101, 68, 75, 46,151,191,162, 40,202, 22, 0,234,213,
+171,199, 45, 91,182,236, 30, 41, 2, 0, 16, 66,200, 77,154,166,111,241, 60, 31,250,251,239,191,191,116, 5,108, 7,120,182,190,
+ 54,109,220,199, 74,114,116,125,165, 36, 65,155,155, 91,225,239, 74, 51, 85,154, 66,165,138,144, 41,229,145, 40, 90,203, 43,178,
+ 97,195,134, 15, 93,129,134, 94,173,155, 94,216,242,229, 88,243,157,147,191,173, 54, 47,219,183,111,223,202,221,221, 93,206,113,
+ 28, 10, 10, 10,240,243,207, 63, 91, 40, 20, 10,139,129, 3, 7, 46, 45, 91, 1, 92,128,182, 35, 28,152,201,203,147,185,233,181,
+168, 72,117,123,116,233,240,226,227, 33, 3,235,116,232,220, 3,143,175,236, 67,102,102, 30,114,178,243,193,243,252, 91,113,125,
+166,159, 69,234,102, 95,172,217,178,112,236,215, 20, 77, 83, 30,195,190,194,135,245,115,102,109,221,186, 53, 26,128, 88, 42,149,
+150,173,135, 14,138, 6,109,214,180,252,160, 7,126, 94, 60, 14,132,231, 9,128, 53, 53, 80,179,108,205,205,205, 79, 94,184,112,
+161, 83,199,142, 29,113,235,214, 45, 60,127,254, 28,211,166, 77,211, 79,159, 62, 93, 50, 97,194, 4,106,238,220,185, 51, 87,175,
+ 94,125, 20,192,245,183, 30, 4,145,232,211,143,134,143,146,230,103,231,106,245, 58,131,190,158,117, 93, 94, 87,160, 45, 76,207,
+202,213,142, 26,251,133, 62, 58, 60,244, 83, 0,111, 17,173,119,204, 79, 1, 2, 4, 8, 16, 96, 2, 8, 33, 29, 1,216, 0, 72,
+163, 40,234,118,217,253,226, 83, 74, 86,107, 41,191,159,142,162, 81, 41,171, 50,230,210, 81,228,238, 99, 3,128, 3, 16, 70, 81,
+ 84,214, 59, 38,177,234, 89,134, 65, 65, 65,164,236,103, 25,162, 69, 8, 33,196,152,241,148,232, 98,207,146,194,219,191,188,181,
+105,162,143, 17,117,216, 97, 18,186,255, 27,210,202,186,234, 85,216, 7,181,134,113,172, 59,200,212,142, 32,179,123,213,213,134,
+133,133, 5,243, 60, 31,228,223, 3,132, 60,216, 79,200,131,253,228,203, 46, 32, 71,143, 30, 61, 23, 16, 16, 16,180,119,239,222,
+ 32, 0,213,249, 41,165,230,221,190, 65, 66,109, 65, 42,195,163, 71,143,200,214,173, 91,201,194,133, 11,201,206,157, 59, 9,170,
+137,160,222,191,127,255, 63,162,162,162,200,132, 9, 19,238,161,138,192,128, 46,128,234,211, 38,245, 99,116,135,214, 27,244,227,
+219,146,172,158,242, 10,239,223,222,222,254,141,244, 4, 58,213, 39,155,188,156,200,238,126,158, 41,132,144,115,132,144, 64, 66,
+200, 40, 66, 72,107, 0,104, 15,212,249,200,222,234,137,246,240, 6,141,126,114,231,106,215,189,107,223,190,125,171,249,243,231,
+103,234,245,122, 18, 23, 23, 71,182,109,219, 70, 46, 94,188, 72, 78,156, 56, 65,186,119,239,158, 92, 38,189,118,159,181,118, 76,
+213,239, 88,174,171, 77, 45, 18, 51,204,166,219, 23,143,146, 39,215,142,144,176,131, 1,228, 95,255, 28, 67,102,126,212,201, 80,
+ 71, 33,211, 2,232, 93,217,117,211,187,161,101,235, 38, 54,177,241,241,241,196, 96, 48,144,137, 19, 39,146,254,253,251,147, 15,
+ 62,248,128,244,237,219,151,244,233,211,135,244,238,221,155, 92,190,124,153, 36, 39, 39,147,190, 61, 60, 11,124, 93,208,161, 6,
+ 73,107,227,232,232,152, 18, 23, 23, 71, 12, 6, 3, 9, 14, 14, 38,251,246,237, 35,193,193,193,196,223,223,159, 0,216, 61,117,
+234, 84, 77, 86, 86, 22,233,223,191,255, 75, 84, 16, 53,222,209,209,241, 97, 84,108, 98,226,186, 85,191, 92,222,179,233,192,229,
+223,142, 94,188,124,242,124,216,233, 19,231,111, 31, 14,189,255,236,132,163,163,227,195, 10,202,255,157,242, 83,128, 0, 1, 2,
+ 4, 84,207, 69,138,137,214,224, 98,177, 99, 48, 33,164,111,185,253,193,197,196,233,173,125,127,127,255,133,101,247, 75,206,241,
+247,247, 95, 8,128,116,233,210,229, 0, 33,164,229,123, 72,254,228, 10,182,234, 21,173, 18,176, 47,195, 32,113, 26, 8, 49,103,
+132, 49,253, 17,248,236,120, 64, 85, 31, 26,202, 12, 25,234,120,196, 92, 59, 86,245, 66, 18,197, 56,243, 8, 98, 0,193, 15, 31,
+ 62, 68, 76, 76, 12, 18, 19, 19,161, 84, 42,223, 58,239,207, 63,255,132, 66,161,128,189,189,189,105, 76, 87,255,102, 63, 23,225,
+233, 8,179, 46,222, 72, 31,243, 15, 4, 7, 7,227,213,171, 87,144, 72, 36,144, 74,165, 96, 89,182, 90,123, 52, 93,180,226,111,
+137,138, 85,209, 57,222,128, 72, 86,207,236,212,150,165,179,155,210, 55,131,196,154,132, 39, 72,214,114,166, 41,121,102, 42, 40,
+ 85, 74,181, 66,161, 44, 29, 46, 4, 16, 73, 81,212,227,246,128, 88,101, 38, 63,245,235,119,115,235, 51,225,193,114,205,147,136,
+ 10,109,244,237,219,119, 10,128,165,132,144,108,119,119,119,187,149, 43, 87, 90, 38, 37, 37,225,193,131, 7, 56,124,248,112, 26,
+ 91,116,163, 20, 33,100, 57, 0,116, 6,228,117,109,234,158,223,244,205,108,115, 92, 57, 36,173, 77, 45,178,112, 25,114,122,196,
+132,169,211, 55,206, 30,130,130, 60, 13,246, 95, 12,199,185,187, 79, 63, 4,240, 39,170,240,123,219,124, 29, 79,128,180, 62,195,
+135, 15,191,119,245,234, 85,235, 29, 59,118,128,101,217, 10,183, 29, 59,118,224,210,181,187,179, 0,220, 49, 49, 89, 14, 77,155,
+ 54,189, 20, 26, 26,106,163, 84, 42,113,241,226, 69,100,103,103,151, 42, 89,126,126,126, 84,118,118,246,232,159,127,254,121,196,
+139, 23, 47,126,184,118,237, 90, 6,138,214,130,124,163, 34, 48, 12,243,148,101, 13,206,246, 46, 45, 69, 35,135,244,232,145,159,
+ 17, 1, 51, 43,119,220,188,255,244, 84,118, 86,134,134, 97,152,167,101,207,127, 31,249, 41, 64,128, 0, 1, 2,106, 6,138,162,
+130, 8, 33,190, 20, 69, 5,149,255,173,252,247,146,243, 2, 2, 2, 74,247, 75,174, 9, 12, 12, 92, 85,102,191,240, 61, 37,175,
+ 74,103,248, 94,197, 12,178, 87, 69, 39,233, 30,252, 6, 93,204, 73, 72, 28,187, 65,218,250, 67, 48,142,221,145, 16,113, 5,247,
+207,174,195,203,232, 63, 65,120, 14,246,173,188, 76, 77,136,214,217,217, 25, 90,109,145,107,150, 78,167,131, 68,101,169,157, 59,
+121,172, 28, 0,120,145, 92, 87,134,193,154,100,208,188,155, 15,188, 82, 9,194,236,138,132, 10,175,212,162,235,190,155, 56, 17,
+ 18,137, 4, 18,137, 4, 84,177,235,143, 41, 68,139, 42, 62,153, 47, 26,190,170, 40, 17, 84,161, 76,188,255,224,210, 25, 94,178,
+ 23,145, 82, 93,212, 77, 36,235,120,114, 42,149, 59,109, 74,122,149, 42,101,146, 66,169,140, 84,152,169, 74,137, 22, 69, 81, 79,
+ 1,128,136,197,123,247, 45,159,225,174, 74,125,166,210,222, 14,134, 90,203, 27, 42, 49,179,252,236,217,179,182, 34,145,168, 62,
+199,113, 72, 72, 72, 64,116,116, 52, 54,108,216,144,154,151,151,215, 43, 60, 60, 60,182, 44,119,228, 20,210,195,123, 87,204,110,
+ 38,138, 8,145,235,158, 70,213,184,246, 88,183, 25,218,255,195, 94, 30,167,167,140, 91,140,161,131, 62,192,132, 94,174, 36, 46,
+ 57, 83, 11,224, 98,177,244, 90, 29,146,194,195,195,251,245,236,217,243, 95,237,218,181,115, 33,132,160,109,219,182, 24, 61,122,
+ 52,246,238,221,139,251,247,239, 35, 55, 55,215,112,225,194,133,245, 0,118,153,152, 44,165,165,165,229,185,203,151, 47,219, 40,
+149, 74, 92,184,112, 1, 26,141, 6,246,246,246,152, 62,125,186, 52, 48, 48,112, 79,110,110,238,200,128,128, 0,121, 92, 92,220,
+166,243,231,207, 55, 65,209,186,115,111, 85, 2,189, 94,191,125,255,222,221, 27,167,207,152,217,224,242,173, 7,193,186,252, 60,
+ 11, 71,199,196, 92, 27, 75, 51,243,245,223, 47,111,172,215,235,167, 84,156,159,127,212, 42, 63, 5, 8, 16, 32, 64,192, 91,168,
+146,139,148, 37, 79,229,201, 86, 77, 72, 26, 0,141,191,191,255, 34,138,162,130,252,253,253, 23, 5, 4, 4,104, 0, 36,255, 21,
+ 36,171,148,104,249,250,250,134, 4, 5, 5,193,215,215, 55,164, 82, 19, 60, 7, 67,220, 85, 24,226,174, 66,209,101, 22,126, 15,
+ 24, 83,238,230,249, 90,167,110,200,138,139,151,117, 58,157,104,247,238,221,165,126, 91, 0,192,113,220,123, 47,197,154, 16,173,
+ 98,162,247, 86, 34,154,202,204, 66,182,127, 57,178,179, 21, 87, 40,214,255,121, 10, 73, 58,158,253,225,137,161,240,118, 54, 89,
+ 93,153,205, 19,115,166, 32,241,218, 37, 40,205,204, 18, 63,191, 26, 89,170, 98, 21,147,172,231, 0,208, 68,102, 30,188,117,246,
+208,238,245, 37,144,232, 79, 31, 65,178,142,215,109,125, 97,220, 85, 73,101, 3, 33, 4,207,159, 63, 71, 97, 97, 33,110,220,184,
+129, 99,199,142,165, 85, 64,178,208, 84,102,246,199,206,175, 62,237, 84, 39, 47, 69,162,191,125, 9,201, 58,222,164,161, 46,235,
+182, 67,187, 73,104,234, 2, 69, 51,138, 62,157, 91, 97,206, 23,195,176,110,231,239,172,222,182,135,239,198,147,103, 62,201,215,
+ 25, 22,153, 72,178, 74,197,198,240,240,112,215,240,240,112, 25, 0,159,209,163, 71,159, 25, 49, 98, 4, 66, 66, 66,112,234,212,
+ 41, 39, 0,234,226,243, 86,160,104,161,236,213, 0,158, 85, 38, 60, 74, 36,146,131,151, 46, 93,114,115,112,112,192,165, 75,151,
+160,209,104, 48,117,234, 84,253,140, 25, 51, 36,126,126,126, 84, 78, 78, 78,169,146,117,227,198,141,140,202, 72, 22, 0, 36, 37,
+ 37,157, 61,118,120, 95,215,158, 61,123, 14,107,230,212,186,206,179,188,220, 87, 74,165, 92,113, 45,228,138,228,118,232,245, 77,
+ 73, 73, 73, 97, 21,231,103,176,201,249, 41, 64,128, 0, 1, 2, 42,135, 73, 92,164,156, 50, 85, 19,148,185, 78, 28, 16, 16, 16,
+ 29, 16, 16,240,134,226,245,142, 40, 63,235,240,116, 73,159, 86,171, 56, 90, 92, 78,194,219, 55,192,243, 53,185,217,183,126,179,
+180,180,100, 21, 10,197, 27, 68,139, 55,209,102,230,241, 3,120, 54,109,108,169,146, 85,162,108, 97,128,223, 59, 17, 45,158,231,
+111, 0,120, 35, 17, 74,219, 86, 99,214, 15,113,233,230,218,172, 1,109, 60,188, 1, 47, 11, 89,237,210, 71, 6,109, 76, 30,249,
+240, 97, 5, 78,214,165, 54, 89, 35,228, 42, 69,188,194, 76, 85,158,100,189, 0, 0,149,157,211,136, 31, 6,182,238,229,209,186,
+ 5,205, 30, 90,139,164, 66, 99,190,255, 67,131,225, 89, 1,249,173,146, 60, 92,250,193, 7, 31, 44,181,178,178,146,111,220,184,
+209,194,209,209, 17, 44,203,234,203,147, 44,165,109,171, 49, 27,134,182,233,214,170,190, 37,109, 60,250, 19, 18, 53, 92,225,134,
+103,198, 61,166,144, 44,107, 11,179,243, 91, 87, 77, 83, 40,101, 98,104,181, 90, 4,110, 57,138, 11,215,163,124,211,163, 78,156,
+ 7,112,254, 29, 42,228,231,190,190,190,235, 86,172, 88, 1,163,209,136, 73,147, 38,225,233,211,167, 23, 30, 61,122,180,161,113,
+227,198,243,191,250,234, 43,135,250,245,235,227,147, 79, 62,145, 24,141, 70,191, 74,108,124,191,127,255,126, 95, 15, 15, 15,132,
+132,132, 32, 59, 59, 27,246,246,246,152, 49, 99,134, 52, 32, 32, 96, 79,110,110,238,200, 85,171, 86,201,159, 63,127, 94,165,146,
+245, 70,189,230,184,239,182,173,155, 54,191, 99,231,238,244,147, 39,177,108,130,151, 55,125,229,210,169,171, 86, 86, 86,123, 18,
+ 18, 18, 94,231,231,176,182, 53,206, 79, 1, 2, 4, 8, 16,240,126, 64, 81,212,233, 98,191,171, 55, 84,174,242, 36,172, 68,177,
+ 42,187, 95,254,252,226,227,239,227,101,121,123, 5,196,235,205,240, 14,190,190,190, 38, 79,171,231, 11,210, 76, 34, 79,229, 49,
+168, 53,140, 13,204, 32, 90,228, 77, 67,162,178,212, 14, 89,113,241,114,101,231,170, 84, 42,147, 21, 45, 94,167,173,174, 80,106,
+ 68,180,138,125,180,206, 17, 66,222, 32, 90, 22,118,173,188,191,254,106,246,250,238, 35, 6,208,169, 95,116, 65,118,190, 78,247,
+213, 3,150,127, 89, 88, 53,201, 42,234,197,141,113, 74,149, 89,164, 92,165, 44, 75,178, 18, 0, 64,110,219,194,107,193,156,233,
+ 91,122,143, 25, 66,165, 77,237,142,172,108,141,110,126, 52, 75, 37,105,200,200,135,192,149,138,204, 93,190,124,121, 27,128,109,
+222,222,222,169, 42,149, 10,249,249,249,111,149, 65, 73,122,187,141, 24, 64,167,126,222, 9,153, 5, 6,221, 87,209, 44,146, 53,
+252,193,234, 72,150, 77, 93,243,243, 91, 87, 78, 83, 38,191,124, 1,137, 68, 2, 51, 51, 51, 92,252, 51, 18,233,209, 39,223,133,
+ 96,129,166,233,101,254,254,254, 75,167, 79,159,142,140,140, 12,156, 58,117, 10,131, 6, 13,194,129, 3, 7, 28,207,156, 57,179,
+206,199,199, 7, 12,195, 32, 40, 40, 8, 70,163,241,113, 37,102,134, 77,158, 60,121,254,136, 17, 35, 16, 22, 22, 6,181, 90,253,
+134,146,149,157,157, 61,122,203,150, 45, 35,226,226,226,170, 85,178,202,193,171,105,139,246,146,133, 75,126,132,174,240,149, 40,
+ 45,233, 86, 72,240, 69,250,102,102,102,166, 18, 64, 78,109,243, 83,128, 0, 1, 2, 4,152,172,106, 85,198, 69,210,138, 73, 84,
+ 90, 69,251,101, 8, 86, 69,251, 84, 57, 21, 76, 95,238,248,253,191,242,158, 76, 82,180, 68,118,109,192,166, 70,149, 33, 90,175,
+222, 56, 46, 55,175,103,210,208,161,145,133,104,235,174,210, 56, 90,242,140,140, 12,185,181,181,181,182, 44, 65, 80, 42,149,112,
+112,112, 64, 86, 86, 22,182,111,223, 14, 84,239, 20,205,214, 25, 49, 14, 94, 99, 38,225,118, 67, 41,136,209, 80,170,108,109,157,
+ 56,241, 13,178, 37,145, 72, 74,124,195,170,235,116, 67,139,149,166,155, 0, 72,123,167,102,223,202, 85,170,137,114,235, 70,214,
+115,166,125, 46,142,123,165,195,229,238, 11,179,143,126,255,181, 89, 34, 49,155,158,128,156,235,213,216,123,246,209,207,251,202,
+ 43, 89, 47,219, 57, 53, 91, 44, 87,202,191,144,214,107, 82,223,127,238, 52,113, 92,170,142,186,236,245, 85,238,177,213, 95, 41,
+159,195,124,254, 75,100, 95, 49,161,120,150, 14, 26, 52,104, 41, 33,132,240, 60,191, 4, 0,202,166,119,238,140, 47,196,207, 82,
+180, 8,238,190, 56,235,216,247, 95,155, 39,162,234,244, 90,183, 29,218,205,206,178,206,249,173,171,166, 43,213, 73,241,144,201,
+100, 48, 55, 55, 71, 98,106, 14,196, 34, 70,243,142,245, 77,214,163, 71,143,175,167, 77,155,134,200,200, 72, 76,157, 58, 85,157,
+144,144,240,219,161, 67,135,166,126,243,205, 55,162,254,253,251, 67,173, 86, 99,205,154, 53,198, 63,255,252,115, 21,128, 53, 21,
+214, 71,145,232,243,111,191,253,150, 36, 39, 39, 83,207,159, 63,135,189,189, 61,102,206,156, 41, 93,181,106, 85,169, 79, 86, 77,
+148,172, 18, 36, 37, 37,133, 92,184,116, 19, 31,158, 93, 15,214,168, 11,201,206, 72,184, 26,243, 44, 43,164,158, 84, 58,175, 65,
+251,182,181,202, 79, 1, 2, 4, 8, 16,240, 94, 84,172,219, 85,237,255, 7,160,162,161, 67,147,136,214,227,159, 22,127,230,244,
+217,244, 5, 80, 56,118,131,238,225,113,240,249,169,165,138,150,220,204, 18,245, 26,187, 32,187, 64,135, 35,193,119, 1,224,113,
+ 77, 82,149,151,151, 7, 79, 79, 79,108,246,107,213, 91,155,151, 33, 87, 0,208,201,234,104, 79, 72,123, 92, 62,115,230, 76, 33,
+207,243, 7, 1,156,169,198,204, 50, 55, 55,183, 77, 63,254,248,163,212,101,204,103,200,191,117,173,188,130, 2,133, 66, 1,153,
+ 76,134,136,136, 8, 92,190,124, 89, 15, 96, 89, 53, 5, 26,202,178,236,253, 67,135, 14,189,108,217,172,193, 0,207,118,238,179,
+ 22, 45,244, 55,127,112,237, 2,150,172,218,196,183,236,208, 63, 39,240,192,137,188, 28,179,198,125, 52,234, 71,247, 76,184,213,
+251,229, 72, 86,178,115,211, 70,189,219,181,113, 91,176,100,201,226, 58,209,215, 46,226,155,213, 91,137,147, 71,223,156,213,199,
+ 78,230,166, 43,155,124,160,125, 21, 19,102, 74, 30,134,132,132,108, 3,176,173,100,191,124,122,253, 87,108,224, 91,117, 28,144,
+ 21,120,224, 88, 65,174,121,227,190, 85,165,215,198,101, 88,215,134, 54,150,231,127,250,238, 31,202,148,164, 4,200,100, 50,152,
+153,153, 33, 65,157,141,165,235, 15, 23, 24,120,126,192,187, 18, 45,115,115,115,153,193, 96,192,230,205,155,145,144,144,208, 5,
+ 64,194,157, 59,119,182,142, 26, 53,106, 99,219,182,109,157,163,163,163, 31,231,231,231, 79, 7, 16, 83,153,145,186,117,235,118,
+177,177,177,161,110,222,188,137,127,252,227, 31,250,153, 51,103, 74, 38, 76,152, 64,101,101,101,213, 86,201, 2, 0, 52,104,208,
+192,187, 95,159,206,232,214,111,106,136, 94,155,125, 53, 46,102, 79, 8, 77,174,203,107,155,159, 2, 4, 8, 16, 32,224,127, 6,
+181, 11, 12,238, 13,136, 90, 89, 97,138, 91, 3, 73,202,222,239,103,146,188,103, 55,136, 38,108, 27,201, 61,254, 5, 57,189,102,
+ 2, 57,243,211, 28, 50,117,176, 27,113,182,165, 82, 90, 89, 97,138,247,219,196,237,141,213,189, 7,181,134,177, 95, 11,144,126,
+ 45, 64, 6,183,130, 17,192,162,246,237,219,159,152,225,245, 58,142,214, 12, 47, 16, 0,255, 0, 96, 86, 73,178, 42, 90, 49,220,
+ 30,192,118, 79, 79, 79,246,202,149, 43,228,209,200,190, 36,220,217,154, 76,159, 62,157,124,243,205, 55,100,236,216,177,196,198,
+198,134, 45,206, 8,251,234,108,126,248,225,135, 13, 1,160, 81,163, 70,117, 59,184,180, 76,137, 8, 62, 69,174,238,221, 72,118,
+206, 24, 78, 58,181,117, 73,175,239,220,243,190,194,190,117,187,106,178,175,212,102,253,250,245, 23, 18, 66, 6, 16, 66,236, 1,
+192,201,201,202,172,189,115,203,228,251,151, 78,145,107,251, 54,145,157, 51,134,147,206,238,174, 25, 13, 93,124, 98,228,182,206,
+ 94,166,216,172, 8, 21,166,183,141,115,186, 93,203,174,247,170, 72,111,169,205,102, 94,159,156,124,153,156, 74, 66, 67, 67,201,
+153, 51,103,200,181,107,215,200,222, 67, 39, 73,227,142, 35,243,173,219, 14,237, 86,131,170, 83, 89, 58, 45, 6, 15, 30, 76, 30,
+ 63,126, 76, 6, 14, 28, 72, 0, 88,212,210,230,137,184,184, 56, 18, 21, 21, 69, 22, 45, 90, 68, 0,236,158, 54,109,154, 38, 39,
+ 39,135,244,237,219, 55,161,152, 96,137,106,147,206,230, 77, 27, 4, 14, 27,210, 99,217,140,127,140,240,126,215,252,124,143, 16,
+108, 10, 54, 5,155,130,205,255, 5,155,255,205,176, 47, 86,181, 74, 62,219,155,164,104,133, 0, 44, 50,176,173,141,173,225, 95,
+171,214,252, 52,111,243,182,221, 11,190,158,245,185,170, 71,247,126,136,188,244, 43,142, 5, 29, 42,208,234,244,107, 36, 12,126,
+140,202, 64, 97,108, 53,169, 40,142,163,245, 6,194,195,195,149,245, 90,188,142,193,244,164, 40, 54,235,214, 26,222,160, 26,192,
+228,187,119,239,254,232,227,227,179,242,139,110, 94,195,103,116,237, 13,163,209,136,189,123,247, 34, 62, 62,254, 55, 0,139, 77,
+ 85,220, 34, 35, 35,211, 93, 91, 56,206, 22, 51,162, 5,211,199, 14,179, 73,123,250, 0, 47, 31,134, 3, 0,116, 58,141, 49,229,
+241, 85,143,154, 36, 78,161, 80,132,218,216,216, 60,178,177,177,201,106,213,172,209,100, 25,196, 75,166,142,254,200, 54, 35, 46,
+ 6,137,209, 69, 35,163, 58,109,161,225,229,227, 43,206,181, 41, 93, 71, 71, 71,153, 74,140, 41, 21,166, 87,175, 53,166, 62,137,
+105,103,138,157, 66,157,126,213,242,117,123, 63,248,110,193, 68, 89,157, 58,117,112, 55,234, 9,150,172, 61, 80,160,209, 27, 7,
+164, 71,158,120, 47,195, 99,132, 16, 24,141, 70,147, 39, 58, 84,130,175, 61, 60, 60, 90,175, 92,185,210,201,207,207, 15,239,170,
+100,149,197,179,184, 36,255, 6,141,154,187, 62,121,116,215,167,158, 66,242,175,119,201, 79, 1, 2, 4, 8, 16,240, 63,131,193,
+197, 98,206,228, 50,159,225,213, 18,173, 18, 68,189, 66, 33,128, 21,205,152,252,173, 11, 87,174, 91, 74, 83,235, 39,242,132,252,
+202,210, 88,254, 60, 3,105,239,152,184, 66,177, 8,236, 7, 67,199,138, 0, 64, 44,170, 93, 7, 89,140,199, 0, 70,252,114, 61,
+172,227, 47,215,195,254, 89,252,219,119, 0,106, 52,150,107, 46, 66, 84,119,215,230, 13,122,180,119,147, 51,156, 6, 47, 31, 62,
+ 69,102,129, 22, 23,163,227,179,105, 66,255, 90,211, 68, 61,127,254,252, 15, 0,176,179, 80, 62,236,225,218,162,113, 79, 79, 55,
+165,152,210,227,229,131,187,200,209,232,113, 33, 58, 62, 7, 20, 85,107,135,234,247,149,222,212,200,147,183,127, 7,213,151,162,
+168, 75,139,102,140,145, 45, 93,123,240,189,146, 44, 0,133, 73, 73, 73, 25,133,133,133, 86,201,201,201,122,212, 62, 72,220,147,
+220,220,220,182,115,230,204, 89, 49,127,254,252, 5,223,127,255,189,164, 54, 62, 89,149, 33, 43, 41,254,120, 79,183,247, 87,254,
+ 2, 4, 8, 16, 32,224,127, 2,147,203,125,194,100,162, 85, 74, 24, 94, 33, 13,192,244,230,205,201,220,103,207,160,127, 95, 41,
+171, 72,233,122, 71,220, 6, 48,164,214, 87,211, 84,222,173,199,241,249,161,143,227,243,193, 19,194, 19,162,163,105, 36, 22, 24,
+ 12,171, 30, 63, 79,170,253,172, 59,138,226,110, 63, 73,208,220,121,154,168, 37, 60, 79,120, 66,244, 20,133, 20,163,145, 95, 21,
+253, 60,254,228,127, 66,122,211, 35, 79, 92, 15, 98,169, 30,215, 67,163,230, 22, 20, 24, 54,165, 63, 60,113,227, 61,150,139, 49,
+ 50, 50,242,211, 46, 93,186,124,198,113,220, 86, 0,198,119,176,165,103, 89,246,235,192,192,192,223, 34, 35, 35, 15,223,184,113,
+ 67,253, 62, 72,214, 95, 90,254, 2, 4, 8, 16, 32,224,239,138,218, 45, 42, 93, 25,222, 39,201,250, 79, 68,212,147,212, 61,181,
+102, 0, 0, 32, 0, 73, 68, 65, 84, 23,158,127,133,221,232, 39, 47,218,252, 55,164, 55,245,225,241, 59,169,192,232,191, 40,123,
+ 47,112, 28,119,225,125,146,234,115,231,206, 53, 69, 5,203,234,252,167,149,191, 0, 1, 2, 4, 8,248,219, 98,114,101,228, 75,
+ 36,228,141,128,191, 1,200,251, 34, 89, 2, 4, 8, 16, 32, 64, 64, 45, 80,169,162, 69,161,242,153, 3,151,106,240, 7,181,153,
+125,112, 73,176, 41,216, 20,108, 10, 54, 5,155,130, 77,193,230,255,156,205,191, 35,236, 81,228, 16,127,186,248,179, 74,242,245,
+ 62, 33, 76,125, 21,108, 10, 54, 5,155,130, 77,193,166, 96, 83,176,249,119, 71,133,142,240, 64,145,243,176, 0, 1, 2, 4, 8,
+ 16,240,223, 4, 89,241, 86,219,227, 2, 4,252,213,100,171,148,112,213,198, 71,171,101,241,231,147,191, 48,177, 51,236,237,237,
+ 39,187,187,187,187, 72, 36, 18, 58, 47, 47,111,249,149, 43, 87,150,149, 63,169,135,171,232, 14, 67,163,225,235, 95, 40,128, 98,
+ 0,154, 6, 71,240,242, 90,132,166,131, 80,238,255,209,112, 84,212,177,249,157,162, 25, 41,199, 26,192, 25, 13, 40,114,183, 42,
+ 2,207,179,241,156, 65,215,191,178,139,235,123, 12,107,204,114,252,247, 0,217, 12,208,211, 0,126, 11, 5,209, 84, 2,246,103,
+ 10,204, 63,192,144,213,224,168,175, 68, 98,102,161, 58,252,104,226,223, 33,195,142, 28, 57,194,188,203,245, 35, 71,142,172,112,
+ 1, 81, 7, 7,135, 32,165, 82,217,162,178,235, 10, 10, 10,212,106,181,218,231,111, 94, 31,123, 2,248, 9,128, 91,185,223, 99,
+ 0,204, 6, 16,252,174,127,224, 13,136,236,128, 41, 18,224, 43, 0, 48, 0,171, 83,129,109, 33,255, 65, 62,134, 54, 54, 54, 87,
+ 69, 34,145, 83, 65, 65, 65, 65, 94, 94, 94,115,115,115,243,103, 42,149, 74,197,178,236,227,180,180,180,158, 85, 93, 75,138, 38,
+165, 84,139, 54,128,121, 44, 48,138,163,233,153, 98, 96,179,142,231,183, 22,183,224,166, 44,112, 59, 13,175,151,231, 90, 0, 96,
+ 75, 13,143, 11, 16,240, 87,224,157,102, 29,182, 42,106, 31,224, 13,160,103,199,142, 29,237, 10, 10, 10, 16, 19, 19,147, 10,224,
+ 42,128,144,226, 45,246,125,164,148,166,233, 31,214,173, 91, 55,111,230,204,153,165,139, 65, 71, 68, 68,192,195,227,237, 24,161,
+ 12,141,134, 87, 78, 93,178,189, 29, 25,139,142,125, 63, 46, 38, 90, 52, 80,160,134, 79, 63,175,218, 38,193,220,210,210,114, 57,
+ 69, 81, 35,105,154,174,182,209,224,121,158, 35,132, 28,201,202,202, 90, 10, 32,175, 38,127,164, 82,202,140, 44,199, 85,248, 31,
+ 34,134,225, 10, 10,117,149,134,189,168, 87,175,222, 13,154,166,155,149, 93, 48, 27,120,115, 1,237,202,142,177, 44,251, 50, 61,
+ 61,221, 20, 18, 42,167, 69,146,217, 20, 37,233, 7,154,111, 5, 80,160, 64,199,242,156,254, 34,207, 26, 54, 0,208,190, 11,201,
+178,111,212,252,218,151,139, 3, 27, 70, 61,140,193,162, 25, 99,241,253, 79,187,177,112,246,103,216,176,253, 0,102, 79, 30, 3,
+ 87, 87,183, 42, 91, 93, 30,146, 85,139,103,141,236, 27,176,249,112,247,133,211, 71,202, 2, 54, 31,233,177,104,198, 40,233,170,
+ 77,135,123, 44,154,241,137, 44, 96,211,225,238, 11,103,141, 84,172,218,114,148, 7, 48,174, 54,137, 28,227,228, 80, 64,177,108,
+133,111,198, 68, 36,210, 29,120,156,172,250,119, 60,209,126,126,126,238, 26,141,230,238,216,126,237, 3,219,181,106,144, 84,209,
+ 57, 25, 41, 73, 13,158, 61, 10,247, 23, 75, 20,158, 31,249,239,142,168, 82, 30,144,201,154,197,196,196, 56,241, 60, 15,142,227,
+192,178,108,233,167, 94,175, 71,207,158, 61,223,215,196,153, 33, 0,150, 23, 61,172, 8, 0,112,248, 29,108,153,137, 68,162, 47,
+165, 82,169, 55,203,178, 46, 0, 32, 22,139, 31,234,116,186, 16,150,101,215, 1,200,175,161,189,245, 73, 73, 73,174,102,102,102,
+ 48, 24, 12,165, 11,208, 51, 12,227,220,184,113,227,205, 90,173,214,233, 93,111,222, 14,152,210,181,123,247, 13, 19,230,205, 99,
+ 52, 87,175, 98,195,174, 93,235,145,155, 11, 0,155,171,187, 86, 42,149,158,167,105,218,177, 38,255,199,243,124,188, 94,175,239,
+ 95,147,107, 68, 34,145, 83,114,114,178,173,131,131, 3,242,242,242,160, 82,169, 84, 37,251,239,130, 16,128, 26, 0,244,100, 25,
+102,142,149,181,117,143,187, 23, 46,168,218,180,105, 67, 51, 12,179, 16,166, 7,169,150, 1, 88, 67, 8, 81, 20,247, 23, 27, 58,
+119,238,220,133,162, 40, 22, 0,225,121,158, 14, 13, 13, 29,195,243,188,168,184,205, 91, 3, 96, 23, 0,157,192, 3, 4,252, 63,
+168, 89,219,107, 74,180,206, 0,240,238,216,177,163, 98,244,232,209,240,246,246,134,147,147, 19,228,114,121, 81, 35,158,145, 97,
+119,239,222,189, 79,174, 94,189,250,201,169, 83,167,240,224,193, 3, 13,128, 63, 1, 84,248, 80,247,241,237, 62, 83,110, 38,219,
+ 8, 0,105, 47, 51,212, 47,159,191,218,168, 86,171,215, 0, 40, 27, 34,188,249,184,113,227,230,206,154, 53, 11, 65, 65, 65, 56,
+112,224, 0,116, 58, 29,242,242,170,224, 47,133,175,144,117, 57, 16, 80,197, 1, 9, 33,128,210, 22, 80,217,213, 58,167, 44, 45,
+ 45,151,207,158, 61,123,142,171,171,107,105, 20,115,163,209, 8,150,101, 97, 52, 26,145,149,149,133,185,115,231, 22,117,180,132,
+128,231,121,156, 61,123,118,230,228,201,147,145,149,149,245,101, 69, 54, 59,123, 54,186, 67, 83,116,195, 18,173,134,112,220,203,
+ 91,247, 94,118, 96, 57,142,209,106, 13, 21,174, 84, 46,151, 75,170, 36,121, 98,177,184,225,131,223,127,183,165,165, 82, 16,142,
+ 3,120, 30,132,231,139,179,179,120, 35, 69,191, 17,142, 7, 49,114,224, 89, 30,172, 70, 7,175,105,211, 76,201,138,174, 98,169,
+226,192,167, 95,204,171,223,169,115,103,113,147, 70, 14, 96, 57, 30, 79,227, 94,214,191,123,231, 86,183, 35,123, 54, 79,213,107,
+242,198, 0,168, 85,156, 45,169,178,206,133, 77, 63,255,210,240,246,189, 40, 4, 95,185,138, 75,151, 67, 0, 0,231,175,220, 40,
+ 33,220,213, 22, 21,216,252,182,179, 39, 13,149, 5,110, 58, 40,158, 61,105, 24,243,253,166, 67,226, 89,159,125,196, 4,110, 60,
+ 32,153,245,217, 71, 76,224, 79, 7, 36,179, 38, 13,101, 2, 54,236,116, 7, 96, 9, 32,171, 50, 99,149,149, 17,197,178,178,127,
+ 61, 75,101, 0, 32,109,235, 86, 24, 95,189,130,195,210,165, 0,128, 79,155,219,153, 60, 52, 97,109,109,125, 71, 44, 22, 55,172,
+238, 60,163,209, 88, 45, 9,246,243,243,243,208,104, 52,119, 88,150, 37, 34,145,200,127,236,176, 15, 78, 12,232,225,145, 81,246,
+156,136,136,251, 86,171, 86,253, 62,244,240,221, 60,242,137,167,249,221,160, 31,252, 58,248,206,223,125,191,138, 14,153,214,233,
+116,120,252,248, 49,202, 46,242, 94, 6, 92, 45, 31, 41, 26,192, 6, 43, 43,171, 78, 25, 25, 25,159, 2, 88,148,155,155,235,206,
+ 48, 12,234,213,171,183, 72,175,215, 63,181,176,176,216,145,147,147,115,163, 88, 53, 50,117,201,128,158,117,234,212,217,123,252,
+248,113,203,246,237,219,211,233,233,233,104,218,180, 41, 50, 51, 51,189,174, 94,189,234, 57,105,210,164, 73,121,121,121,227,139,
+ 95, 6, 77, 69,107,165, 82, 73, 38, 76,152, 64,113,220,235,219,221,185,115, 39,250,183, 97, 91,216,212, 85, 22,106,245, 36, 39,
+248,177,197, 63, 36, 18,201,159,241,241,241, 57, 53,205, 12, 9,240,213,132,121,243, 24,179, 23, 47, 96,118,255, 62, 62,205,205,
+ 21,125, 95,164,110, 85, 75,180,104,154,118,220,123,224, 87, 39,169, 84, 10,150,101, 75,201, 96, 73, 27,101, 52, 26, 97, 48, 24,
+ 96, 52, 26,193,113, 28,140, 6, 35, 2,190, 91, 93,235,182, 80,169, 84, 42,237,237,237, 83,149, 74,165,242, 29,201,101,227, 76,
+154,254,162,157,167,231,228,165, 67,135,202,195,194,194,228, 52, 77,131,101, 89,172, 89,179,134, 37,132,212,117, 5,234, 60, 0,
+114,107,106, 91, 38,147,137,246,236,217, 51, 70, 42,149, 2, 0,244,122, 61,218,180,105, 67, 9,125,190,128,127, 35,217,122, 75,
+229,170,138,104, 13,204,205,205, 5,199,113, 48, 55, 55, 7,195,188,217,239, 91, 89, 89,161, 95,191,126,232,217,179, 39, 70,143,
+ 30,141, 7, 15, 30, 40, 70,143, 30,221,175, 50, 99, 99,231,249,162,145,147, 93,113,103,194,219, 95, 63,125, 47,112,231,183, 71,
+109, 82, 82, 82,230,149, 57,109,210,148, 41, 83,168,140,140, 12,140, 28, 57,242,170, 78,167,251, 16, 85, 60,124, 28,143,151, 62,
+163, 63, 5, 79, 40,197,186,208, 95, 40,189, 86, 67,104,154,214,148, 12, 29,214, 38,151, 40,138, 26,233,224,224,128,131, 7, 15,
+ 66,175,127, 59, 92, 88,157, 58,117, 16, 29, 29,253, 90, 85, 99, 24,116,238,220,153,161, 40,106, 36,128, 47, 43,182, 73, 55,188,
+126,251,133,109,201,190,111, 63, 55, 73,103, 79, 58, 53, 57,181,128, 0,160, 22, 47, 94, 92, 74,220, 0, 96,249,242,229,166,164,
+ 19,180, 88,140,180,144,144,215, 13,177,136, 6, 45,161, 64,137, 1, 90, 84, 52,138, 10, 2, 16, 14,224, 89,128, 55, 2,114,251,
+ 70,166,100,131, 87,131,198, 78, 65,171,214,110,169,171, 51, 18, 28, 60, 25,140,184,184,231, 96,104, 26,205, 91, 56,225,131, 94,
+ 61,196,158, 29,187, 52, 90,189,108,222,169,228,132, 39, 3, 1,132,213, 56,163,121, 34,111,209,216, 26, 59,118,222,133,141,165,
+ 25, 70, 14, 29, 4,133, 92,134,239,127,250, 21,223, 45,156, 1,167,230,142,216,182,126,101,165,151, 91, 88, 88,172,112,113,106,
+225,184,101,207,105,184, 56, 59, 51, 91,246,158,134,139,107,241,167,155, 11,179,101,239,105,184,186,185, 50, 91,246,158,134,187,
+ 91,235, 38,119,212,161, 43, 50, 51, 51,103, 84,158,159,229,202,232,131,162, 50, 18,231,243,165,141,246,139,169, 83, 1,160,148,
+104,213, 4, 98,177,184, 97,114,114,178,109,117,231, 85,167, 26, 20, 43, 89,119, 88,150,197,171, 87,175,168,236,236,108, 82,183,
+110,221,161,231,182, 45, 58,222,191,187, 71, 38, 0,220,191,127,191, 94, 64,192,170,161,135,238,228, 66,115,107, 19,245,175,223,
+ 67,248, 79, 63,244,190,115, 50,208,207, 19,197, 75, 66,148,135, 78,167,139,107,215,174, 29, 41,254,222, 64, 38,147, 73,202,213,
+ 55,135,150, 45, 91,190,165, 90,155, 48,164,184,225,230,205,155, 51, 92, 93, 93,225,236,236,124,163, 83,167, 78,117, 84, 42, 21,
+206,157, 59, 7, 23, 23, 23,183, 58,117,234,132, 30, 57,114, 68,252,245,215, 95,123,236,218,181, 11, 0,102,154,144,157,125,125,
+124,124, 14, 6, 5, 5,201, 37, 18, 9, 52, 26, 13,162,163,163, 97, 97, 97, 1,169, 84,138,143, 62,250,136,233,214,173,155, 85,
+175, 94,189,142,197,198,198,142, 65, 13,102, 64,105,181, 90,178,104,209, 34, 40,149, 74, 40,149, 74,168, 84, 42,168, 84, 42,152,
+201, 65,109,157,221, 88, 49,107,123,182,226,203,165, 91, 3,247,110, 89,118,165, 81, 35,254,155,196,196,196,236,154,214, 5,205,
+213,171, 48,187,127, 31, 40,243,236,154, 10, 11, 85, 61,248,251,251, 87,167, 72, 65, 34,145,160,107,215,174,213,218,171, 87,175,
+222,111, 34,145,232,141, 55, 83,150,101,229,254,254,254, 92,108,108,172,138,166,105, 21,207,243,240,247,247,231, 88,150,149,219,
+218,218,222,224,121, 62, 53, 61, 61,125,120, 85,118,123, 1,242, 27,192, 48, 74, 44,254,210,222,193,161,169,119,243,230,202, 75,
+151, 46, 49, 0,224,232,232, 72,212,106,117,246,201,147, 39,243, 68,192,207,142,132,236,169, 1,201,210, 1, 88, 64,211,244, 6,
+153, 76, 38,106,210,164, 73,252,146, 37, 75,110, 22, 43,164, 32,132,208, 77,154, 52,241, 82, 40, 20,142, 58,157,142, 69,209,208,
+161,160,102,253, 13, 64, 8,241, 44,226,237,165,208, 3,144,150, 8,248, 69,189, 29,172,203,253, 14, 0,233,197, 47,138,118,149,
+236,103, 0,120, 0,160, 53, 0,219,226, 99,183, 41,138,202,172, 69, 50, 43, 87,180,130,130,130, 74, 95, 97,125,125,125, 75, 59,
+ 22,115,115,115,220,190,125, 27, 20, 69,193,220,220, 28,117,234,212,129,133,133, 5,114,115,115,241,224,193, 3,196,196,196,224,
+197,139, 23,160, 40, 10,205,155, 55, 71, 73,101, 47,131,210, 6,110,255,143, 65,144,155,201, 64, 81, 64,251,222,238,112,239,217,
+ 6, 29,195,158,205,190,115,137,218,174, 86,171, 31, 3, 16,181,105,211,102, 82,231,206,157,177,118,237, 90,232,116,186,181,149,
+144,172, 82,155,215, 30,176, 29, 0,192,222,222,126,254,190,115, 79,149,227, 6,180, 40, 84,171,213, 63,212, 34,115,222,104,136,
+211,211,211, 77, 94,139,143,231,121,100,101,101, 85,105,179,188, 66,176,110,195,166,186,121, 57,169,248,246,251,125, 48, 26,141,
+152, 55,111, 30,120,158, 47,221,178,179,179, 77, 74, 39,225,184,183,181, 3,186,104,244,148, 18, 1,141, 71, 21,241,138,132,131,
+155, 64, 17,128,226, 0,188,125, 95,229, 59, 33, 57, 35, 81, 28, 90,246,253,198,186,225, 49, 47,113, 50, 56, 28,134,220, 36,168,
+239, 31, 47,146, 28,187,142,193, 97, 29,131, 78,238, 45, 48,103,241,106,203,127,206, 25,127, 72,175,201,115,198,155,195,136,151,
+170,127,104, 56,124,187, 98, 5,182,111, 92,139,213,107, 55, 34, 55, 39, 27, 98,177,117,113, 67,207,129,227,184,170,239,157,144,
+ 1,254,179, 39, 82,223,255,252, 27,188, 92,237,113,236, 92, 24,186,183,115,196,241, 11,119,208,211,179, 41, 78, 94, 10, 71,239,
+ 78, 45,112, 38, 36, 10,115,166,140,161,198,156,223, 53,160, 38,101,180,126,253,166,186,121,185,169, 8, 90,185, 7,175, 54,111,
+ 70,252,140, 25,240, 42, 62, 39,140,162, 32,105,216, 16,144, 84, 95, 70,229,241,240,225, 67,232,116,186,138,222,204,225,226,226,
+ 82,109,185,107, 52,154,187, 44,203,146,212,212, 84, 42, 53, 53, 21, 42,149,138,138,142,142,226,220,220,218, 12, 35, 49, 71,127,
+ 1,128,128,128, 85,195, 14,223,205, 69,225,141,141,208,220,252, 9,146,166, 17,244,246,229, 83, 12,147,151,110,187, 91,230, 25,
+125, 35,157, 41, 41, 41, 3, 83, 82, 82, 0, 0,205,154, 53,139,137,141,141,109, 93, 50,212, 92, 60,132, 40, 97, 89,214,169,100,
+ 56,145,101, 89,232,116, 58,244,237,219,151,169,234,222, 45, 45, 45, 59,187,184,184, 32, 60, 60, 28, 27, 55,110,172,231,227,227,
+131, 39, 79,158,128,162, 40,172, 90,181,138,114,117,117, 21,167,167,167,163,127,255,254,248,237,183,223,186,230,230,230, 86,151,
+159,230, 42,149,106,215,169, 83,167,228, 52, 77, 35, 47, 47, 15, 60,207,163, 91,183,110,160,105, 26, 81, 81, 81, 88,188,120, 49,
+126,251,237, 55,156, 56,113, 66,225,233,233,185,171,176,176,208, 5,111, 14,235, 87, 86, 70, 68,171,213, 18,153, 76, 6,153, 76,
+ 6,185, 92, 14,185, 92, 14,169, 84,138,124, 45, 48,121, 93,188,142,145, 91,243,110,237,186,183,152, 56,107, 21,253,195,146,207,
+ 46, 3, 56,105,106,157, 7,138,124,178, 54,252,250,235,198, 79,115,114,104, 0,216, 65, 81,188,129,144,213,166, 60,239, 0,144,
+175,205,129, 99,243,134, 56,118,232, 4, 70,140, 26, 90, 33,201, 18,139, 37,144,136,197,168, 83, 79, 85,173, 77,137, 68, 98, 23,
+ 19, 19, 99, 37, 22,139, 65, 8, 1,199,113, 48, 24, 12,169,255,252,231, 63,109, 6, 15, 30,108,126,246,236, 89,122,240,224,193,
+188,165,165,101, 65, 88, 88,216, 43,150,101,173,122,244,232, 81,169, 77, 37,224,174,181,104,185, 65,202,176,238,129,139,166,203,
+198,143, 31,207, 76,156, 56, 17, 9, 9, 9,152, 52,105,146,246,226,197,139,250, 20,181,250,164,148,231, 55, 25,128, 8, 83,219,
+228,114,216,226,238,238,222,254,248,241,227,159,249,251,251,223,153, 63,127,254,183,101, 15,174, 89,179,102,197,153, 51,103, 28,
+135, 13, 27,182,247,254,253,251, 91,106,210, 46,189,107,223, 33,216,124, 55, 84,198, 69, 74,196, 81,138,162,130,202,180,217,190,
+ 37,251,254,254,254,139, 2, 2, 2,162, 41,138, 10, 42,251,123,201,121,197, 47,139, 65, 21,237, 23, 95, 91,111,225,194,133,109,
+ 2, 3, 3, 87,117,233,210,229,224,141, 27, 55,158, 3,168, 41,209,170,218, 71,171,228,134,202,222,100,185, 78, 13,185,185,185,
+200,205,205, 69, 98, 98, 34,182,110,221, 90,252, 64,139, 33, 18,137, 32, 18,137, 74,253, 25, 42, 67,112,208,159, 63, 1,248,169,
+125,251,246,226,200,155, 71,206,126,181,125, 86,159, 14,125,219, 51,119,131, 35, 63, 70,209,122,132, 3, 39, 76,152, 96, 13, 0,
+123,246,236, 73, 7,112,246,223,196,154,143, 60,126,252,120,142,189,189,125,169,143, 74,217,225, 67,150,101, 33,151,203, 81,226,
+203,162,213,106,177,117,235, 86,150, 16,114,164, 10,155,136,141,190,140,199,209, 87,138,174,227,121,240,220,235,235,151, 45, 91,
+ 6, 66, 72,105,103, 63,181, 88, 57,169,150,228, 85,148,231,164,220,103,185,223, 9,199, 85, 51, 60, 33,153,245,241,248, 25,246,
+ 60, 37,194,239,151,239, 65, 44, 22,131, 47,163,102,138,153,162,183,229,232, 39,201,112,176,115,195,135, 99,166,212, 63,190,119,
+211, 44,214,160,253,190,166,121,237,236,222, 5,179,231,204,193, 47,219,183, 99,241,210, 21,165, 12,128,229, 56,176,213,166,147,
+166,251,118,107, 3, 54, 63, 25, 12,195,160,183, 87, 11, 48, 12,131,126, 93, 90,129, 97, 24,244,239,230, 12,145, 72,132, 1,221,
+ 93,209,178,101, 75,136, 68, 34,186,154,114, 71,108,116, 48, 30, 71,255, 81,134,244, 18, 16, 0, 6,181,250,173,243,141,106, 53,
+ 72, 99,171,154,214, 45, 76,154, 52, 41, 59, 49, 49,209, 80,254, 88,163, 70,141, 36, 87,175, 94,173, 91,201,176, 93, 41, 20, 10,
+133,167, 72, 36,186,155,153,153,201, 43,149, 74,154,231, 57,222,205,173, 13,115,110,219,162,227, 37,231, 44, 92,184,232,248, 39,
+158,117,134,237, 59, 18, 68, 36, 77,186, 83,148, 88,198,126,177,116,155, 68, 44, 81,120, 2, 26, 83, 94, 30,104,157, 78,135, 71,
+143, 30,161,186,244, 16, 66,170, 28,166,201,202,202,154,224,226,226,114,245,167,159,126,170, 71, 81, 20,174, 93,187, 6,134, 97,
+ 74,183,103,207,158,129,166,105,124,245,213, 87,134,220,220,220,207,171, 75,155, 72, 36,154,115,236,216, 49, 11,169, 84,138,188,
+188,188,210,231,134, 97, 24,196,196,196,224,135, 31,126,192,132, 9, 19,144,144,144, 0, 7, 7, 7,204,155, 55,207, 44, 48, 48,
+112,142,193, 96, 88, 97, 66, 17, 69,232,245,250, 14, 74,165, 18,114,185, 28, 37,132, 11, 0, 46, 68,139,163, 52, 26, 77, 91, 43,
+171,194,250, 54, 33, 65,191,119,245,249,208,195,202,198,190,139, 90,173,174,209,210, 89, 79,129,237,113, 28,247,207,129,199,143,
+219, 94, 63,126,156,191,117,234,212, 75, 89, 94,222, 54,147,235,144,145, 70,252,179,151,240,244,244,196,221,187,119,225,233,233,
+ 89,150, 52, 65, 42,149, 66, 34,145, 64, 34,145,192,218,210, 36, 23, 10, 66,211, 52,174, 95,191, 14,142,227,160,215,235,161,215,
+235,225,234,234,154,121,229,202, 21, 51, 0,120,246,236, 25, 25, 55,110, 92,118,104,104, 40,218,181,171,122, 61,117, 45, 69, 5,
+ 47, 91,245,163,197,247,235,119,193,162,158, 29, 66, 66, 66,184,115,231,206,229, 81, 64,236,227,232,232,181, 31, 2,103,142, 0,
+134,154,228,153,157,157,221, 85,134, 97,154,148,253, 45, 35, 35,195,114,248,240,225,200,202,202, 26, 52,124,248,240,238,197,109,
+ 66,210,209,163, 71,199, 1,128, 84, 42, 5, 77,211, 28, 4,252, 87,161, 58, 46, 82,150, 40,149, 39, 92, 1, 1, 1,190,229,127,
+ 43, 75,170, 42,250, 94,246,218,192,192,192, 85,101,108,107,106,145,252,234,125,180,130,130,130, 72, 5, 12,210,100, 84, 71,180,
+ 74, 16, 30, 30,110,116,112,112,248,229,241,189, 23,125, 90,184, 55,135, 66, 37,251, 0,192, 79, 50,153,108,238,248,241,227,113,
+235,214, 45, 68, 69, 69,237,196, 59,206,194,105,211,166,205,121,153, 76,230, 88,201, 48, 73,124, 84, 84, 84,255, 74, 58,134,165,
+167, 78,157, 66, 85,206,240,151, 47, 95, 46,219, 41,149,117,134,175,184, 98,240, 4, 70,131, 17, 5,133,154,215,157,120, 49,209,
+ 42, 40, 40,192,168, 81,163,222, 80,180, 94,189,122, 85,237,253, 81, 20,133, 31, 78,158,196,197, 35, 71, 48,200,195, 3,191,133,
+133, 33,112,252, 88, 56, 59, 54, 0,225, 40, 16, 10, 72, 56,176, 9, 25,185,249,216, 31,124, 29,153,121,133,248,180, 71, 15, 56,
+213,177,174,218,174, 88,210,207,171,115, 23,201,165, 27, 15, 32, 22,139, 64,131, 7, 49, 22,194,193,165, 23, 24,154,134,133, 93,
+ 83, 72,196, 98,136,197, 34, 60, 75, 76,135, 75,155,142,210, 32,169,188, 95,109,136, 86, 35,199,166,224, 56, 14, 19, 38, 76,192,
+193,131, 7, 97, 85,223, 17, 22,141,218,224,187,181,219, 49,168,111,143,106,239,191,228, 13, 94, 36, 18,129, 97,152,183, 62, 75,
+190,155,162, 78, 18,158,192, 80,190,140,120, 2, 16,130,134, 43, 87,162,225,202,149, 8, 43,254, 79,215,130, 2,104, 52, 26,160,
+147, 91,141, 72,150, 94,175, 71, 98, 98,162, 33, 37, 37,197,174,130,227,169,122,189,190, 90, 98,179,123,247,238, 8, 63, 63,191,
+ 14,245,234,213,187, 19,113,255,190,209,221,195, 67,124,118,235,162, 19, 37,195,134, 0,224,225,225,145,185,104,209,162, 19,227,
+ 70,250, 14,221,226, 63,154,155,182, 98,175, 72,166, 80,116,240,157,191, 59,226,192,200,145,213,143,205,232,116,113,238,238,238,
+196,148,251, 42, 44, 44, 76,169,226,240, 16, 0,203,219,183,111, 95,199,199,199, 7, 87,175, 94,197,136, 17, 35,116, 6,131,225,
+ 49, 0, 12, 30, 60,184,213,254,253,251,165, 15, 30, 60,128,141,141,141, 56, 62, 62,126, 23,170,113,144,151, 74,165,189, 58,118,
+236, 72,235,116,186,183, 72, 86, 96, 96, 32,198,140, 25,131, 86,173, 90,129,231,121,228,231,231,195,199,199, 71,188,113,227,198,
+ 94, 38, 18,173,217,206,206,206, 63,160,104,214, 97,217,182,240, 97,241, 16, 20, 50, 50, 50, 82,238,133, 6, 71,247,232, 59,188,
+ 67,147,150,109,236,163, 34,238, 86,105,208,214,214,118, 33, 77,211,159,240, 60,207,228,230,230, 38,222,211,235, 91,186, 58, 58,
+218,117, 27, 58, 20, 57, 98, 49,179, 33, 56,152, 78,205,203, 51, 3, 96,210, 16,164,214, 88, 0,199,230, 69,174,126, 35, 70, 13,
+197,221,187,119,241,241,232, 97,144, 72, 36, 16,137,196, 69,207,166,164, 72,209,170,107, 93,199,164,186,105, 52, 26, 75,219,240,
+ 18, 63, 47,131,193,128, 18,215, 44,165, 82, 89,122, 76,167,211,129,162,168,170,234, 6,237,211,179, 27,110,132,199,178,159,127,
+181, 65, 39,206,184, 27, 88,159,231,119,191, 4, 82,223,161, 57,119, 58,188, 98,137,173,162,142, 5, 56,163, 17,110, 67, 63, 46,
+125, 78, 66,119,108, 81,128,231, 21,217,241,113,152,121,228,212,251, 94, 51, 87,192,191, 1,213,113,145,178, 68,233, 93, 65, 81,
+ 84,144,191,191,255, 34, 0,196,223,223,127, 81,201,126, 64, 64,128, 6, 64, 82, 45,201,214, 91, 42,151,232,125,144,172,146,225,
+133,170,224,227,227, 51,211,220,220,124, 99,201,126,226,173, 36, 36,222, 74,130, 75,107,183,110,237, 61, 58,228,140, 25, 51, 6,
+ 86, 86, 86,152, 63,127, 62, 1,176,179,166,255,255, 44, 54,218, 12, 0,177,183,183,159, 95,220, 32,123,132,133,133,217,220,190,
+125, 27, 29, 59,118,124, 45,221, 27, 12,232,222,189,123, 85,166,242,138,157,218,191,124,127, 42, 25, 15,131,193,128,194, 66, 13,
+244,122, 3, 88, 35, 15,150,101,225,233,102,142,189,219,253,139,126, 99, 75,212,179, 34,213,172, 97,125,115,152,155,137,141, 52,
+ 77,105,238, 68,164, 84,216, 98,234,245,122, 68,196,199,227,254,139, 23, 0,128, 15, 3,170,118,124,221, 27,124, 21,174,174,174,
+213,165,182, 69, 67,135,250, 72,190, 24, 81,212,120,107, 18,113,251,207,195, 48, 55, 55, 3, 0,184,121,127, 10,137,164,136,104,
+ 21,104, 12,176,110,221, 8, 20, 33,149,134, 5, 80, 90,214, 63, 47,146,200, 29, 9,199,131, 16, 30,132,231, 64, 8, 15, 70, 44,
+ 81,206,156,250, 25,120,158,131,151,151, 23, 40,134, 1,103,212, 97,228,144,126,200,202,201,131, 85, 93,211, 58, 9,137, 68, 2,
+111,111,111, 69,101,199,159, 60,121,162, 41, 75,204,170, 46, 35, 35, 10, 10, 52,208,233,116, 48,232, 89, 24,140, 44,184,102, 18,
+124,251,207,177, 96, 13, 44, 10, 71,119,129,193,200,130,159, 51, 12, 6,189, 17, 9, 74,154,118,119,177, 54,210,160, 52,247, 30,
+166,213,169,142,104,149,144,131,202, 80,145, 79, 96, 37,100,235,190,159,159,159,167,187,135,199,221, 79,250,122,252, 24, 25, 21,
+157, 28, 25, 21,253,214,121,142,173, 60,226,166, 5, 30,156, 39,150, 40, 60,125,231, 87, 61,235,176, 44,202, 14, 35,190, 35, 22,
+229,229,229,185,155,153,153, 33, 54, 54, 22, 12,195,128,162,168, 39, 0,220, 1,192,222,222,254,169, 72, 36,106,206, 48, 12, 54,
+111,222, 76,137, 68,162,182, 93,186,116, 89,164,213,106, 15, 87,241, 66,231, 98,110,110,254,134,154, 37,145, 72,224,239,239,143,
+113,227,198,149,146, 44,137, 68,130,221,187,119,163, 67,135, 14,208,235,245, 46, 38,166,247, 54,128, 30, 38, 40,126, 84, 49, 57,
+175,150,140,178, 44,235,151,241,201, 39, 45, 17, 18,130,110,205,155,187,122,122,122,194, 96,120, 45,232, 52,111,222,188, 81, 94,
+ 94, 94,138, 70,163,249, 23,138,194, 16,220,171,146, 20,105,121,196, 63, 43,114, 63,189,123,247, 46,188,188,188, 74, 21,172,178,
+106,150, 68, 34,129, 66,106, 86, 35,162,197,243, 69,237, 82, 94, 94, 30, 29, 18, 18, 98,237,236,236, 76, 1,128,179,179, 51,117,
+239,222,189,122, 74,165, 50,189, 69,139, 22,213,189, 0, 75, 0,160,215, 7,195, 69, 23,207,157, 81,177,192,138, 20,134, 89, 33,
+170,182,141, 36, 70,142,231, 43,117,186, 87,212,177,192,110,191, 81, 0,128,111,250, 14, 40,125,217, 58,183,124, 17,196, 98, 49,
+250,204, 95,244,214,179,196,243, 60, 3, 1,127, 43,146, 85,145,162,245,110,125,243,107, 69, 43, 32, 32, 32, 58, 32, 32,224, 45,
+117,172,134,168, 94,209, 42, 43,221,213, 20, 37, 15,107,101, 88,187,118, 45,218,182,109, 91,101, 71,180,113,227, 70,236,219,183,
+111, 45,128,103, 53,150, 28,251,180,119,195,186,227,209,205, 91,185, 81, 0,176, 98,206, 16,186,160,160, 0,215,175, 95,135,133,
+133, 5,158, 60, 49, 57,236,151,185,133,133,197,114,154,166, 71, 50,229,103, 0, 84, 76, 48, 57,158,231,143,228,228,228, 84, 26,
+222,129, 16,192, 96,100, 81, 80,168,133, 94,175,199,156,175, 54, 85,155,136, 0,128, 50,232,243, 68,222, 61,187, 40, 42, 83,116,
+188,218,246,194,244,241,102,111,117,222, 12, 13,208, 52,208,206,171, 72,113,185, 23, 22, 13,158, 7, 56, 30,176,182,181,196,206,
+ 3, 63, 86, 73,242, 89,142, 47,126, 59,230,144,175,227,224,210,217, 23, 47, 31,134,148, 42, 72, 82, 73,209,144,177, 68, 44, 6,
+ 79,168,162,168, 15,149,181,186, 82,133, 99,150,250,153,211,246,160, 72, 76,246,109,139,163,151, 34,240,113, 95,119, 92, 9,125,
+ 0,159, 78,174,136,126,252, 2,110, 78, 77,176,121,215, 17, 16,130,188,159,215,125,151,242,186, 67, 99,227, 77, 81,180,110,221,
+186,165, 41,175, 98,149,253, 36,213,247,135, 32,228,181,162,165,209,234, 48,127,161, 73,161,119,138,202,168, 71,103,133, 41, 39,
+ 87,165, 88,153, 66,196,202, 43, 91,168, 38, 60, 75, 51, 0, 29,128,175,255,157, 13, 39,199,113, 56,125,250,116,105,121, 84, 84,
+142,101,203,206, 4,146,131,248,248,120, 68, 71, 71,163,115,231,206,200,201,201,129,152,166, 49, 47, 50, 18,174,227,199, 67, 47,
+145,128,231,121, 72,165, 82, 76,153, 50,197,228,252,172, 97,235, 92,236,120,205, 85,103,252,199, 46, 93,186,180,140, 45, 40, 64,
+116, 76, 12,250, 46, 91, 6, 0, 56,115,230,204, 27,117, 98,238,220,185,210, 7, 15, 30, 76,186,115,231,206,164,228,228,228,181,
+ 0,230, 85,218,206, 18, 93,169,143,214, 39, 99, 71,160,165,115, 51,236,251,245, 64,233,241,185, 11,102, 67, 44,150, 64, 44, 17,
+163,174, 69, 93,147,238,198,104, 52,150,146,214,194,194, 66,250,204,153, 51, 13,251,245,235, 39,153, 61,123, 54, 5, 0,251,246,
+237,163,127,250,233, 39,213,197,139, 23, 37, 13, 26, 52, 80, 87,163, 16,228, 38,101,232,100, 0,208,184,113, 99,108,218,246, 59,
+ 61,120,240, 96,204,158, 61, 27, 70,163, 17, 91,182, 20, 61, 87, 99,198,140,129,193, 96,192,177, 99,199, 74,158,227, 42,213, 40,
+214, 96,120,171,222, 80, 20, 5,177, 88, 12,137, 84, 2,240, 60, 40,138, 82,173, 89,179,102, 69,116,116,116, 71,103,103,103,232,
+116,186,241, 40,154,252, 33,196,209,250, 47, 35, 91, 85,113,145,138,124,173,138, 85,169,202,144, 86,214,111,171, 50,162, 86,214,
+103, 11,181,155, 64, 97,154,143, 86, 69, 96, 24,166, 90,181,170,100,170,110, 85,152, 59,119, 46,204,205,205, 43,235,128, 72,100,
+100,228, 3,181, 90,189, 29,192,166, 90, 21, 78,112,120,244,242, 47,135,229,161,120,108,181,110,221,186,233,189,123,247,206, 7,
+ 96, 56,124,248,205, 23,100,157, 78, 87,105, 7,110, 97, 97,177,124,199,142, 29,179,134, 14, 29, 74,151, 15, 49, 80,118,120,175,
+100, 51, 26,141, 56,124,248,240,172,175,191,254, 26, 57, 57, 57, 95, 86,213,137, 23, 22,104,160, 41,118,132,126, 26,117,212,212,
+ 70,189,210, 67,102,117,237,209,176,153,123,165,157, 9, 45, 41,242, 33,178,107,252,186, 3, 51, 55,151,131,171,194, 38, 69,209,
+207, 94, 36, 36, 55,104, 84,191, 30,158, 38,166,193,174, 73, 91,100, 37,189,206, 7,145,136,129,184,120,232,176,110, 29, 21,210,
+ 94,189, 2, 77, 51, 85, 18,227,239,246,135, 35, 52,234, 5,142, 93,186, 7,131,182, 0,235,246,156,131, 65,151, 15,131,182, 0,
+ 6,109,209,231,170,175,191, 0, 69, 33,197,168, 43,104, 85,147,114, 23,137, 68,232,212,169, 83,165, 68, 39, 41, 41,201, 68, 69,
+139,148, 42, 90, 26,109, 13,203,200,180, 55,167, 42, 21,171,146,227,181, 37, 6, 37, 33, 31, 20, 10, 69,135,221,187, 43, 15,227,
+ 80, 17,234,215,175,127,214,204,204,172,169,169,231,215, 32,120,233,170,186,117,235, 46,119,118,118,118, 89,183,110,157,152, 97,
+ 24,244,233,211,167, 85,253,250,245,227, 1,192,205,205,205,161,164,141,153, 54,109, 26,185,117,235, 86, 84,209, 59, 70,229,144,
+ 74,165, 49, 22, 22, 22, 29,124,124,124,144,147,147,131,196,196, 68,168, 84, 42,184,254,248, 35, 34,167, 77,131,199,214,173,160,
+123,247, 6, 69, 81,144, 74,165,136,140,140,132, 66,161,136,209,106, 43, 13,249,214, 9,192,106, 0,221,240,122,184,144, 0,184,
+142,162,176, 11,161, 21,180,119, 52, 0,112, 60, 95, 93, 97,141,157, 63,127, 62,178,197, 98, 96,240, 96, 72,158, 61,131,193, 96,
+ 64,231,206,157, 75, 85,246,206,157, 59, 67, 36, 18,193,221,221, 29, 14, 14, 14,216,188,121,243,216,170,136,150, 54,223,128,248,
+103, 47,209,165, 75,151, 82,229,106,240,224,193,165,138,150, 88, 44, 46, 85,182, 40,174,122,226, 74, 81, 20, 41,251,146,204,113,
+ 28, 37, 18,137, 68, 95,126,249, 37, 53, 98,196, 8,162,215,235,121,169, 84, 74, 31, 59,118,140,186,114,229,138,168,160,160,160,
+ 58,181,161, 96,244,232,209,182,141, 26, 53, 68,226,211,104, 28, 61, 74,176,118,237, 90, 92,189, 90, 20,101, 35, 54,182,104,226,
+106,201,190,143,143, 15,154, 54,109, 10, 82, 77,197,111, 51,108, 36,190,233, 55,176,168, 61,105,106, 3,177, 68, 12,169, 68,130,
+249, 49, 47, 75,203,186,206,238,131,210,192,192,192,143,157,157,157,139,134,246, 1,145, 16, 71,235,191, 11,213, 8, 61,105,229,
+ 72,146,190,204,126, 26, 0,170,120, 63,173, 12,161, 74,163, 40,234, 54, 33,164, 99,185,115, 75,142,235,203,125,150, 28,191, 95,
+139,228,151,172,117,248, 22,249,170,234,141,248,241,205,155, 55,157, 60, 61, 61,145,144,144,240,214, 76,184,146,142, 75,165, 82,
+ 65,161, 80,224,198,141, 27, 0,240,184, 50, 99, 87,174, 92,249, 9, 69, 81,151, 81, 60,108,208,197,231,147, 94, 55,188, 6,116,
+196,254,128, 3, 57,106,181,218, 29,175, 99,232, 80, 14, 14, 14,227,196, 82,209,168,230,109, 26,123,131,231, 87, 7,159,186,190,
+172,170, 59,108,222,202, 45, 31,128,166,100,214, 97, 45,103, 31,130,166,233,145, 67,135, 14,165, 31, 60,120,128, 81,163, 70, 97,
+223,190,125,149,158, 59,110,220, 56, 28, 60,120, 16, 67,135, 14,165, 23, 46, 92, 88,105,120,135, 55,213, 18,253,123,171,148,177,
+ 79,238, 99,239,193, 29,149,250, 32,217,218, 22,249, 99,189,122,149, 94,250, 91, 71,207,170, 71, 70,120, 86,127, 49,252, 78, 88,
+151,174, 61,251, 72, 18, 83,179,193,179, 58,104,243, 94, 95, 95,152,157, 10,194,106, 33, 81,214, 67,125,107, 11,220,189,121, 65,
+111,208,107, 47, 86,101,115,214, 80, 55, 76, 27,226, 2, 16, 30,195,230,237, 68,208,166,153,165,111,208,221, 71,204, 70,240,225,
+ 13, 38,251,248,149,135, 88, 44, 70,100,100,164,166, 50, 53,139, 97, 24, 83, 98,114, 21,171,142, 70, 20, 22,106, 80,168,209,190,
+207,182,195,198,206,206,238,103, 75, 75, 75,121, 37, 68,202,198,198,198,230,103, 43, 43, 43,185,169, 67,135,149,145,172,226,184,
+ 90,119,252,252,252,106, 68,182,100, 50, 89,211,199,143, 31,151, 6, 43,173,234, 83,175,215,195,199,199,199,212,224,165,167, 0,
+ 60,183,183,183,191,238,234,234,106,241,244,233, 83, 28, 56,112, 64, 34, 22,139, 27,151,180, 31,121,121,121, 96, 24, 6,175, 94,
+189, 50, 2,248, 12,213, 12,157,233,116,186,144,144,144,144,118, 67,134, 12, 97, 98, 98, 98,192, 48, 76, 81,186,186,116,129,199,
+214,173,136,250,242, 75,120,191,120, 1,173,193, 0,185, 92,142,243,231,207, 27, 10, 11, 11, 67, 42,179,167, 80, 40,182,199,197,
+197,185,201,229,114, 24, 12, 6,240, 60, 15,154,166, 41,145, 72,212,189,110,221,186, 27, 1,116, 44, 87, 88,182, 30, 29,125, 90,
+115, 44,203,169, 19,158,166, 85,151, 1, 25, 25, 25, 56,117,234, 20, 58,119,238, 12,111,111,111, 36, 37, 37,225,217,179,103, 24,
+ 52,104, 80,233, 57,247,239,223, 71,120,120, 56, 90,180,104, 81,189,162, 71, 27,209,162,117, 83, 72, 36,146, 34, 53, 71, 44, 41,
+126,241, 17,151, 42, 89, 18,177, 4, 98,145, 24,114,133,220,100, 69,139,162, 40,208, 52, 13,138,162,160, 80, 40, 74, 94,178,249,
+134, 13, 27,170, 51, 51, 51,237, 1, 48, 10,133, 2, 28,199, 85,249,210,194, 19,226, 36, 73,191,145, 60,239,235, 31,108, 3, 2,
+ 46,225,210,165, 87,160,105, 26,246,246,246,160,105, 26,113,113,113,160,105, 26,142,142,142,160,105, 26, 73, 73, 73, 37, 36, 49,
+ 11,149,147,225,210,231,134,162,168, 82,146, 37,145, 74, 74,149, 45, 0,200,206,206,214, 14, 29, 58,244, 95, 58,157,110, 34,106,
+183,234,137,128,255, 96, 80, 20,117,251,223,113,109, 13, 48,184,152, 88,189,229, 20, 95, 85,101, 28,212,181,107,215,173, 99,198,
+140,233,179,126,253,122,152,153,153, 65,173, 86,151,118,136, 82,169, 20,141, 26, 53, 66,102,102, 38,182,109,219,134,151, 47, 95,
+ 94, 6, 48,197,212, 20,169,213,234, 91, 79,238, 61,206,240,249,184,171,149, 91,215,214,117, 19, 31,191,236,172, 86,171,111, 20,
+147,172,157, 99,230, 14,154,232, 51,220, 11, 18,169, 24,137, 79, 82, 16,124,234,250,255, 75, 97, 50, 12,195, 80, 20,133, 81,163,
+ 70,153,116,254,232,209,163, 17, 18, 18,130,170,134, 25,249, 18, 69,171, 80,139, 2,205,251,123,177,154, 62,115, 28,166,207, 28,
+ 87, 74, 38, 76, 25,122, 1, 0, 7,135, 67, 85, 16, 45,195,250,160, 67,219, 38,183,247,234,226,216,193,173, 41, 66,239,220,195,
+254,173,175, 69,134, 93, 63,173,192,247,187, 46,163,145,157, 37, 12,186, 2,156, 61,250, 75,138, 65, 87,184,190,150,162, 92, 17,
+185,165, 40, 16,194,215,232,222, 75,200,147, 88, 44, 70,155, 54,109, 42, 85,180, 50, 51, 51, 53,213,169, 89,165,101,164, 55, 34,
+191, 64, 3, 77,225,123, 35, 90, 30,221,187,119,191,120,228,200, 17, 43, 91, 91, 91, 36, 39, 39,151, 39, 90, 30,221,186,117,187,
+120,228,200, 17, 43, 59, 59, 59, 36, 38, 38,154, 28, 86,164, 2,146,133,180,180, 52, 42, 43, 43,139,183,180,180,172, 17,217,162,
+105, 26, 58,157, 14, 15, 31, 62, 52,245,111, 77,158,205,101, 97, 97,177,251,224,193,131, 22,233,233,233, 96, 24, 6, 15, 31, 62,
+124, 99,214, 97,201,182,115,231, 78,201,176, 97,195,118,100,103,103, 87, 57,173,141,101,217,181,227,198,141,155,148,148,148,100,
+105,107,107, 11,181, 90, 13,169, 84, 10, 66, 8, 40, 31, 31,244,120,254, 28, 6,142,131, 66,161, 64,108,108, 44,182,111,223, 94,
+ 80, 28, 42,166, 66,129,140,162, 40, 39,137, 68,130, 79, 63,253,244,141, 3,123,246,236,193,135, 29,152, 14, 54, 22,162,124, 22,
+114, 93,170, 98,224, 89,134, 97, 40,143, 78,189, 91,117,234, 57,184,205,163,168,208,167,105,169, 47,171,107,148,140,122,189, 30,
+206,206,206,184,125,251, 54, 46, 93,192,180, 73,124, 0, 0, 32, 0, 73, 68, 65, 84,186,132,222,189,123,195,219,219, 27, 17, 17,
+ 17,184,112,225, 2,194,195,195, 65, 81, 20,172,172,172, 74,220, 47,170,244,193,208, 23,178,120,149,156,241,150,122, 85,126, 95,
+ 34,145, 64,167, 49,109,114, 95, 76, 76, 12,110,223,190, 93, 26, 90,134, 97, 24,118,252,248,241, 32,132,144,184,184, 56,152,155,
+155, 19, 63, 63, 63, 78, 36, 18,177, 73, 73,166,249, 7,155,153,153,193,201,201,233,141, 23,159,146,173, 71,143, 30,184,115,231,
+ 14,104,154,134, 72, 36,130,173,173, 45,174, 95,191, 94,109,197, 47, 33, 85, 37, 36, 75, 36, 17,191, 65,250,120,158,207,139,136,
+136,152, 12, 32,162, 88,201, 2,132, 56, 90, 2,254,255,112, 26,111, 47, 44, 93,173,162,245, 28, 64,223, 3, 7, 14,140, 61,113,
+226,196,218,141, 27, 55,218,248,250,250, 34, 43, 43, 11,142,142,142,176,183,183, 71, 80, 80, 16,206,156, 57,147,206,113,220, 60,
+ 0, 21, 73, 63,125, 81, 69,204,154,164,167,234, 35,186,252,252,105,158,222, 46,184,124,248, 90, 64,253,250,245,167, 48, 12, 51,
+199,111,209, 71, 19,123, 13,237,136,216,240, 56,220,186, 16,137,212,132,244,106,109,150,119,134,175, 91,183,238, 36,165, 82, 41,
+ 69, 5, 83,137, 43,152,117, 88,106,147,227, 56, 78,175,215,227,208,161, 67, 38,145,173, 3, 7, 14, 64,171,213,130,123,123,124,
+181,212, 38,225, 9, 37, 18,203,224,208,200, 25, 6, 67, 1,120,190,214, 19, 42, 75,109,150,188,129, 62,149, 74, 97,155,158,142,
+208,208, 80,211, 40,247,224,193,213,149,145, 86,175,205,251,116,195,202,249, 65, 51,252, 87,215,237,221,181, 29,190,249,113, 15,
+ 12,134, 93,160, 25, 26, 10,153, 4,158, 94,221,192, 64,135,159, 3, 23,100, 23,230,102,125,138,183,151,226,121,195, 38,169,106,
+132,133, 0, 28,207,227,210,213, 48,147,239,189,204, 48, 7, 68, 34, 17,158, 60,121,162,169,104,182, 33,195, 20, 13,115,150,188,
+169, 87,101,147,240, 60, 37,150,200,209,200,209, 21,122, 93,254,123, 41, 35, 91, 91,219, 5,199,143, 31,183, 42, 9,149, 16, 17,
+ 17, 1,138,162, 30,190, 86, 28,139,142,107, 52, 26, 68, 69, 69, 33, 34, 34, 2, 40,154,225,102,242,115, 84,162,100,165,165,165,
+ 81,106,181, 26, 74,165,146,142,136,136,208,185,187,187,223,169,230,249, 46,181,169,213,106, 95, 84,230, 63,169,213,106, 27,200,
+229,114,113,185, 14,207,161,101,203,150,177, 21, 12, 33,190,149,206,156,156,156,208,175,191,254,218,115,192,128, 1, 88,176, 96,
+ 65,166,165,165,165,249,207, 63,255, 44, 98, 24,134,154, 49, 99, 6,247,234,213,171,252, 95,126,249,197,226,196,137, 19,200,206,
+206,190, 97,194,189,231,105,181,218,201, 93,187,118,221,115,238,220, 57,165,147,147, 19,114,115,115, 65, 8,193,238,221,187, 49,
+ 99,198, 12,200,229,114,196,198,198,226,195, 15, 63, 44, 44, 44, 44,156,140,183,125, 39, 75,108, 82, 20, 69, 17,158,231,177,100,
+201,146,210,224,164, 37,193, 74,205, 21, 20,182,207,109,166,154,253, 75,142,106,236, 55,191,140, 7, 0,142,101,185, 71, 81,161,
+ 79,119,111,250,230,138, 68, 34,185, 90, 77, 25, 45,158, 61,123,246,207,131, 7, 15, 86,152,153,153, 33, 51, 51, 19,215,175, 95,
+199,205,155, 55,113,235,214, 45,232,245,122, 88, 89, 89,193,210,210, 18,106,181, 26, 49, 49, 49, 26, 0,139,171,178, 41, 85,138,
+209,188, 85,201,204,223, 34, 5, 75, 92,102,182, 97, 89,117, 75, 34, 22,155,244, 28,245,236,217, 19,157, 58,117, 42, 33, 43, 92,
+124,124,188, 90,167,211, 81,101, 72,127, 82, 9, 33,111,220,184, 49,187,111,223, 62, 82,157, 77,158,231,223, 34,211, 61,122,244,
+ 40,125, 41,236,212,169, 19, 24,134,193,189,123,247, 42,115, 77,121,195,230,173,237,155,113,238,219,197,144, 74, 36,152,247, 48,
+177,148,116,237,233,221, 30, 98,169, 4, 46, 67, 70,148,189,118, 11,138,134, 11, 81,142,100, 85,213, 31,189,243,243, 46,216,252,
+159,135, 26,181, 88,130,167, 4,251,181, 90,237,217, 47,190,248, 34,208,195,195,227,139,117,235,214, 81, 18,137, 4,203,150, 45,
+ 35,201,201,201,191, 22,191, 49,100,213, 38, 85,132,144, 95,255,248,237,198,212, 9,254, 67,169,185,235,253,186,223, 9,142,138,
+105,219,213, 9,109,187, 58,225,206,229, 7,216,180,232,192, 62,206,200, 45, 73, 73, 73, 73,168,198,148,174,111,183,214,229,157,
+225,173, 66,174, 4, 91,213,116,214, 33,207,243, 71, 14, 28, 56, 48,107,248,240,225,116, 88, 88,216, 91, 62, 89, 37,203,238,240,
+ 60,143,139, 23, 47,194, 96, 48,224,215, 95,127,229,121,158,175, 60,142, 22,200,201, 13,235, 3, 39,252,186,247,164, 84, 42,161,
+112,243,234, 49,228,100, 85, 61,171, 75, 34, 17, 99,231,238,223, 12, 18,137,248, 81, 69,199, 13, 6, 67, 98,112,112,176, 93,127,
+142, 19,211, 52, 93, 17,129,170, 16, 71,142, 28, 49,242, 60, 31, 95,205,105, 55, 82, 95, 38, 12,249,110,193,103, 7, 6,127,242,
+133, 93,215,174,221,197,214,182,118,160, 40, 10,175, 82, 95, 33, 54, 42,204,120,246,216,142,212,130, 66,211,150,224,249,236,135,
+ 63, 74,125,178, 0,192,119,198,198, 82,255, 44, 0, 24,226,247, 53,124, 58,187,129, 50, 69,122,122, 77,178,120,150,101,161, 82,
+169,192,178,108,133, 33, 30, 44, 44, 44, 20, 90,173, 86, 83, 28,136,177,202, 55,102, 2,188,247, 50,226, 56,206, 37, 43, 43, 11,
+ 5, 5, 5,184,121,243, 38, 89,185,114,101, 90, 90, 90, 90,169,211,166,209,104,116,201,204,204, 68,126,126, 62,110,220,184, 65,
+ 2, 3, 3,211, 50, 50, 50, 22,213,228, 25, 82, 40, 20, 29, 68, 34,209,157,172,172, 44, 94,169, 84,210, 70,163,209,232,238,238,
+ 46, 83, 40, 20, 38, 47,168,174, 86,171, 7, 84,118,172,121,243,230,143, 31, 63,126,220,146,227,184,178,107, 32, 74,180, 90,173,
+ 83,215,174, 93, 77,105, 63,102,239,218,181, 11,191,253,246,155, 87,110,110,238,184,248,248,248, 61, 0,188, 68, 34, 17,238,221,
+187,247, 80,171,213,142, 25, 62,124,248,238,172,172,172, 80, 20, 45,193, 99, 10,206,197,198,198,126,234,226,226,178,107,249,242,
+229,102,222,222,222, 34, 7, 7, 7,116,236,216, 17,177,177,177, 56,125,250,180,113,203,150, 45, 5,133,133,133,159, 1,184, 88,
+117,177,131, 98, 89, 22, 82,169,180,116,147,201,100,144, 72, 36,200,211, 16,124,254,227, 51, 13, 11,133,102,237,178,201,167, 9,
+ 64,165, 36, 62, 75,127,149,146, 24, 74, 81,212, 85,181, 90,157, 83, 73,158, 73,181, 90,109, 59, 66, 8, 67, 81,212,122,131,193,
+224, 55,115,230, 76,251, 85,171, 86,161,117,235,214, 72, 79, 79,135, 74,165,130,147,147, 19,210,210,210, 16, 22, 22,198, 21, 22,
+ 22,110, 5,176, 2,197,254, 35,149, 33, 59, 61, 23, 13,235, 55,126, 67,249, 36,132,128,112,128, 81,199,129, 51, 16,232, 41, 35,
+196, 98, 35, 36, 18,137, 41, 67, 42,132,231,121,100,217,219,131,143,138,194,173, 91,183, 64, 8,169, 84, 85,115,118,118, 54, 73,
+ 33,229, 56,238, 45,162, 21, 26, 26, 10,134, 97,208,189,123,119,132,135,135,151, 42, 90, 38,249, 37, 18, 30, 82,153,244,141,225,
+ 66,138,162, 32,145, 74, 33,150, 74, 42,154,141, 35,168, 88, 2,254, 99, 96,234, 56,118, 54,128, 41,247,239,223,223,211,171, 87,
+175, 32, 66,136, 24, 69,227,145,215,222,229,207, 83, 82, 82,238,222, 56,125,119,161, 93, 67,203,192,129,227,186,163,117, 59, 71,
+112, 44,135,235,103,238,225,215, 85, 39, 14, 38, 37, 38,249,193,132,181,207,120,158,191,210,173, 67,107, 26,101, 98,117, 59, 56,
+ 56,240,181,153,117,152,147,147,179,116,222,188,121, 88,176, 96, 65,109,102, 29, 86,136,200,152,180, 41, 20, 72,195, 33, 3,123,
+244, 7, 69, 19,189, 94, 87, 69,195,135,210,200,165, 18,137,248,209,237, 8,181,123, 69,231,165,165,165,245,159, 56,113,226, 69,
+145, 72,212,180, 38,121,206,243,124,124,106,106,106,159,234,207,100,175,235, 52,185, 78,167, 14,110,251,242,220,111,187,250,243,
+ 60,215,130, 2,192,136, 36, 79,141, 6,195,121,157, 38,119, 29, 76, 92, 84,122,205,148, 46,152,189,225, 2, 54, 47, 24,130,153,
+129,135,177, 99,201,231, 88,248,227, 1,172, 94, 48, 27, 43, 55,254, 11,223,204,254, 20, 31,143,157,200, 19,138,254,211,212,251,
+ 96, 24,230,220,182,109,219, 38,124,254,249,231,165,147, 22, 8, 33,111, 52,194, 70,163, 81,195,243, 60,182,110,221,202, 3, 56,
+ 87,149,189, 55,203,136, 34, 85,249, 75,153, 90, 70,185,185,185,159,117,233,210,101, 55, 0, 25, 33,228, 73, 86, 86,214, 63,128,
+215, 75, 67,229,231,231,127,214,181,107,215,221,132, 16, 25, 69, 81,111, 29, 55, 5,197,161, 30, 58, 88, 90, 90,222, 41, 86,178,
+100,181,113,136,175, 42,171,171, 24, 86, 52,101, 8,145, 7, 48,179, 76,196,247, 85, 94, 94, 94,101, 23,149,126,152,149,149,213,
+161, 22,233,186,168,209,104,220,150, 44, 89,242,165, 92, 46,247, 41, 44, 44,108, 5, 0, 42,149, 42, 86,167,211, 93,209,104, 52,
+235, 80,125,108, 42, 61,207,243,177, 44,203,182,177,177,177, 41,154, 81, 91, 76,182, 0,224,247, 59,220, 29,128,235, 88, 36,138,
+239, 55, 57, 97,103,206,156,105, 98,105,105,249, 1, 69, 81, 31, 19, 66,156,243,242,242,116, 75,150, 44,185,113,228,200,145,156,
+166, 77,155, 14, 28, 60,120, 48, 85,175, 94, 61,220,190,125,155,100,100,100, 28, 3,176, 8, 38,204,180,230,121, 62,126,205,154,
+ 53,168,233,243, 94,213,113,131,193,144,114,230,204, 25,235, 1,175, 94,137,120,158,199,144, 33, 67,222, 32,112,229,241,232,209,
+ 35,232,116,186,106,131, 57,102,103,103,195,203,203,235,141, 23,212,146, 45, 62, 62, 30,245,234,213,123,227,127,170,123,199,210,
+229,100,161,247,151, 95, 3,197, 51, 74, 75, 80,164,100, 17, 16,189,192,171, 4,252,231,226,175, 94,124,211, 36,105,209,222,222,
+126,148, 92, 37,155,238,216,202,222, 61,249,217,171, 7,121, 57,133,251,212,106,245,182, 74, 26,114,147,108,214, 48, 96,169, 32,
+255,254, 69, 54, 95,199,209,226, 64, 8, 7,194, 19, 16,194,131,231,185,162, 5,175, 9, 15,194,113, 20, 69,225, 79,189,166,202,
+200,224,229,211,105,105,109,109,189,130, 16, 50,128, 97, 24,186,108, 67, 93,246,123,177,146,117, 46, 45, 45,237,155, 10,148,215,
+255,186,252, 60,114,228, 72,133,228,223,212, 89,135, 35, 71,142,228,106,248,108, 94, 81,169, 84,246, 21, 29, 43, 40, 40, 72, 80,
+171,213, 31,252,135,228,103,217, 25,131, 53,177, 89,227, 89,135,213,217,116,116,116,148, 25, 12,134,246, 0,156, 40,138,170, 11,
+ 32,211, 96, 48,156, 79, 79, 79, 79, 5,208, 1,192,146,226,107,190, 5,112,231,223,252,188, 43,172,173,173,119,209, 52,221,208,
+148,139, 89,150,213,103,102,102, 78, 40,247, 66,240,122, 8, 30, 96,228, 18, 73, 24,104,186, 65, 69,207, 99,101,223, 65, 72, 82,
+129, 70,227, 69,189,110,243, 75,109, 90, 89, 89,221, 17,137, 68, 13, 77, 72,219,203,140,140,140, 14, 66,155,252, 95,109,243,191,
+ 25,229,157,224, 43,141, 20,255, 87, 16, 45,193,166, 96, 83,176, 41,216, 20,108, 10, 54, 5,155,130,205,191, 59,209,170,112, 95,
+152, 2, 43, 64,128, 0, 1, 2, 4, 8, 16,240,110, 56, 93,142,108,157, 46,249, 66, 85,193, 74,107, 34, 9,214,134,217, 94, 18,
+108, 10, 54, 5,155,130, 77,193,166, 96, 83,176,249, 63,103, 83,192,123,132, 32,171, 10, 54, 5,155,130, 77,193,166, 96, 83,176,
+ 41,216,252,187,163,210,161, 67, 90,200, 27, 1, 2, 4, 8, 16, 32, 64,128,128,191, 6, 38, 19, 45,149,157,179,139,181,163,251,
+110,203,134,109, 35, 44, 27,182,141,176,118,116,223,173,178,115,118,249, 31,205, 55, 5,128,177, 34,145,232, 98,253,250,245,115,
+ 81,201,210, 59,127, 3,212, 1,240, 49,138,226,251, 12, 3,160,124,159,198,189, 1,209, 40, 96,250,120, 32, 97, 60,144, 48, 10,
+152,238,253, 55,244, 27, 92, 54,203,190,203,213,179, 99,207, 46,155,101,223,165,194,227,243,236,173,110, 93, 24,185, 97,213,116,
+135,122,239,233, 47,205,109,109,109,183,219,217,217,189,176,181,181,141,183,181,181,221, 5,192, 66,104,238, 4, 8, 16, 32,224,
+ 47, 67,137,143, 86,201, 86,234,163, 37, 2,128,160,160, 32,111, 0,127, 0,232,229,235,235, 27, 82,254,106,203,198,109, 62,111,
+209,172,197,130,239,150, 45,162,234,219, 90, 43, 89,142, 55,196,189, 72,116, 93,250, 93,224,209,100,169,104,109, 86, 66,212,142,
+ 90, 36,138, 98, 24,102,148, 76, 38,243, 5, 80, 66,216, 30,234,116,186, 32,142,227, 14,193,180,105,218,176,179,179,187,202, 48,
+ 76,147,154,252, 49,199,113, 9,169,169,169,221,107,153,153, 35, 27, 55,110,188,203,219,219, 91,233,229,229, 5,169, 84,138, 37,
+ 75,150,204, 83,171,213,235, 76, 53, 96,105,217,220,220, 32,147,207, 17, 73,165,253,136, 81,223,134,128, 0,180, 44,138,103,117,
+193, 18,157,110,109, 86,214,179, 60, 19, 77, 45, 2,224, 87,156, 87, 59, 0,172,121,151, 90, 50,161, 29,140, 70,174,168, 78, 72,
+ 68,224, 78, 62,183,248, 99,241,226,197, 34, 95, 95, 95,236,216,177,163,251,246,237,219, 39,231,229,229, 5, 3,248, 29,192,211,
+119,173,149,118,192,148,174,221,187,111,152, 48,111, 30,163,185,122, 21, 27,118,237, 90,143,162,120, 75,155,107, 90,151, 36, 18,
+124,108,109, 45,246, 37, 4,237, 41,128,162,128,123,105, 25,252, 25,131,129, 59, 4, 19, 98,177, 85,129,177,120,115, 58,254,254,
+154, 26,200,121, 74,254, 41, 27,226,210, 35,231,233,149,127, 2, 24, 88,254, 56,171,149, 79, 32, 76, 35, 95, 13, 9, 79, 4,240,
+227, 59,102,171,210,198,198, 38,226,228,201,147, 13,189,188,188, 68, 0,112,231,206,157,241,190,190,190,189,211,210,210,218, 0,
+200,253, 55, 53, 66,114, 17, 77, 79,151,138,197,253, 56,142,107, 11, 0, 12,195, 68,234,141,198,139, 44,207,111,134,137, 49,217,
+ 4, 8, 16,240,247, 69,117, 92,228, 63, 28,149, 70,134, 47,185, 57, 82,246,179, 44, 84,182,173, 93, 59,247, 25,241, 40, 39,175,
+ 80,251,226, 69, 82,214,220,233, 43, 47, 78,158,253,195,137, 31,127, 9, 58, 19, 18,250,240,150,139,215, 7, 15, 84,182,173, 93,
+ 43, 49, 93,217, 24,110, 99,133, 66,113,119,203,150, 45,134,216,216, 88,146,157,157, 77, 30, 61,122, 68,142, 29, 59, 70,166, 78,
+157,170, 85, 40, 20,119, 1, 52, 54,197,166,157,157, 93,234,163,203, 23,200,203,136,112, 18,127, 39,148, 24,141, 70, 98, 48, 24,
+136,193, 96, 32, 15,206, 5,145,136,223,127, 35,247,142, 29, 34,122,189,158,232,245,122,162,211,233, 72,179,102,205,146, 77, 76,
+103,121, 56,184,185,185,233,131,130,130,200,209,163, 71,201,188,121,243,136,135,135, 7, 7, 96,134,169,247,174,178,117,242, 49,
+111,224,158,246,185,255,102,195,233, 27,231, 73,244,243,123, 36,250,249, 99,114,228,210, 67,226, 55,127,163,193,188,129, 71,154,
+202,214,201,167,186,123,183,180,180,236, 76, 81, 20, 41, 1, 0,210,164, 73,147,252,178, 91,227,198,141,223,216, 26, 53,106,148,
+223,180,105,211,167, 86, 86, 86,237, 43,178, 57,166, 45, 8,121,176,159,144, 7,251,201,226,158, 32,209,209,209,183, 8, 33,127,
+148,108, 26,141,230,143,227,199,143,255,241,209, 71, 31,253, 1,224,195, 42,242,201,164,252, 28, 15, 36,228,157, 60, 73,200,186,
+117,132,120,123,147,135, 0, 25, 15, 36,212,208,102,179,255, 99,239,186,227,162,184,214,246, 51,179,125,217,101, 97,233, 44,160,
+ 2,138,130,162, 64, 68,197,222, 34,177, 87, 52,198, 30,141,230,198, 18, 77, 17,141,198, 94, 98,212, 24, 75,162, 38,246,216,197,
+168,216, 21,123, 87, 20, 17, 80,144,222, 89,150,178,176,125,119,102,190, 63, 40, 65,164, 44,122,239,253,114,239,229,249,253, 96,
+119,118,103,158, 61,231,204,153, 57,207,188,231, 61,239,235,228,196,121,186,254,199,207,244,167, 78,237, 97,206,159, 63,203,156,
+ 59, 23,206,252,121,114, 55,179,233,167, 47, 12,142,142,156,104, 0, 45, 26,192,201, 6,176, 10,192, 70,148, 89, 46, 95,201,229,
+114, 38, 39, 39,135, 1,240,170,252,179,141,246,246,246, 27, 80,179,245,173,111, 85, 75,214,220,143,156,206,143,238,223,149, 41,
+ 41,206, 98, 70,247,239,202,204,253,200,233, 13,203,214, 71,158,158,150,179, 6,183,149,191,120,124,128,154, 53,184,173,252, 35,
+ 79, 79,203,119,108, 79, 2,101,121, 66,127,137,136,136, 48, 49, 85, 96, 52, 26,153,125,251,246, 81, 82,169,116, 79, 3, 56, 91,
+218,219,219,167,218,216,216,188,170,250,161,125,187,225,157,189,187, 77, 88, 98,219,122,104,143, 6,148,179,131,128,203,205,184,
+124,244, 87, 74,145,246,156,209,107,114,153,226,132, 72, 38, 35,246, 62,179,111,199, 70, 35,143,205,206, 0,208,225,125,250, 82,
+ 3,209,200,217,200,217,200,249, 55,228,172, 75,139,252, 39,131, 93,189,130,213,193,231,243, 66,151,124, 55,159, 40, 82, 20,105,
+180,202, 18,189, 81,171,213,146, 92, 70,251, 60, 38, 41,143,100,179,138,230,206,153,109, 25,186,224,187, 80, 21, 48,206,204,223,
+108,226,231,231,247, 48, 44, 44,204,193,198,198, 6,197,197,197, 80, 40, 20,120,248,240, 33, 24,134,193,136, 17, 35,248, 29, 3,
+ 3, 3, 22, 45, 94,124, 47, 35, 51, 51, 8,181, 15,188,127,137, 23, 27, 59,252,216,181, 44, 23,237,247, 41,138,178, 81,135, 32,
+176, 51,100, 80,229, 62,203, 51,202,178,101, 8, 4,130,202,132,196,239,128,160, 62,125,250,112, 1,224,211, 79, 63, 85,150,148,
+148,172, 41,183,112,152,149,105, 85,228,224,213,203,206, 89, 22,254,235,246, 31,133,109,155,123,193, 96, 52, 33, 53, 39, 11,108,
+142, 53, 92, 93,185,152, 60,238, 67, 78,247,206, 54,118,171, 86,236, 60,155, 67, 99,184, 58, 63,254, 98,109, 92,214,214,214,251,
+142, 28, 57,130,163, 71,143, 2, 0, 94,189,122, 5, 47, 47, 47, 81,125,101,136,142,142,246, 28, 50,100,200, 97,133, 66,209,162,
+190,125,171, 7,198,231,243,249,232,218,181, 43, 90,183,110,141, 83,167, 78,245, 44,183,108,189, 23, 52, 55,111, 66,252,236, 25,
+112,227,157, 30, 94, 60, 62,248,160,233,253,115,103, 15,216,157, 61, 23,139, 13, 27,118,227,245,235, 50, 67,155,167,167, 39, 62,
+ 25, 27,194,121,254,252,110,155, 81,163, 62,185,123,235,214,235,174,229, 66,169, 62, 44,251,237,183,223, 22,186,187,187, 99,212,
+168, 81, 33,109,218,180,113,146, 72, 36,216,177, 99, 7,156,157,157, 61,245,122,125,194,169, 83,167,100, 57, 57, 57,152, 61,123,
+ 54,114,115,115,191,170,141,168,103,112,207, 69,252,193, 62,221, 90,125, 48, 17, 98,137, 51,126, 59,116, 4, 47,159,236,235,166,
+ 51,196, 46,226, 82, 55,198,107, 24,254, 36,121,154, 56,180, 89,251, 30,182, 45,218, 12, 65,211, 15, 34,237,180,212,173,164, 69,
+ 31,122,172,101, 11,180,251,150,110,200, 86,188, 69, 58,234, 24,203, 87, 25,103, 19,125, 25, 10, 96, 41, 93, 33,176, 42,173,181,
+ 12,134,116,239,222,189,242,196,165,164,164, 64,167,211,193,199,199,135,212,235,245,189,204,108,215,150,253,250,245,187,125,238,
+220, 57,219,150, 45, 91,202, 11, 10, 10, 42,191,112,178,181, 14,190, 17,182,105,246,170,159,255,240,222,207, 16, 69,242,216, 63,
+159,215,195,213,161, 75,167, 15,174,156, 15, 59, 32, 38, 74,211,193,179,206, 7,104, 5, 18, 15,239, 2, 97, 97,131, 49,159,207,
+ 99,247,234,211,219,229,195,254, 35,175,188,140,127,221, 7,192,163,198,231,250, 70, 52,226,127,218,170,197,252,183,213,169, 82,
+104, 13, 26, 52,136,168,169,130, 52, 67,183,115,116,176, 21,110, 90,191,247, 17,203,160,215,139,172,173,244, 28, 43, 9, 77, 88,
+ 90,177, 12,122, 99,105, 83,207,166, 60,154,161,219,213,194, 95,125,137, 39, 33, 20, 10,195, 78,159, 62,237,192,225,112, 64,211,
+ 52,236,237,237,145,156,156,140,162,162, 34,148,148,148,224,117,108, 44,220,155,184, 97,105,232,124,231,217,243, 67,195,212,106,
+117,123,188, 57,141,248,214,178, 81,202,248,102,222,232,138, 20, 44,111, 61,242,151,127, 86,195,119,230, 46, 69, 77, 78, 75, 75,
+131, 88, 44,134,175,175,175,248,206,157, 59,183,234, 16, 89,111,112, 74,165,158,150, 52,159,119,244,151, 95, 23, 11, 13,198,104,
+196, 36, 22,160,149,123, 55, 56,218, 54, 65, 86,129, 30,247, 31,158, 70,116,212, 65, 52,119,105,130,153,159,247, 22,172,253,241,
+248, 17,174,201,189, 73, 81, 81,178,178, 38, 78,165, 82, 41,246,240,240, 64,147, 38,101,121,207, 40,138, 66, 76, 76, 12, 40,138,
+170,220,174,250,186,247, 68, 4, 76,202, 84, 76,156, 48, 1, 10,133, 66, 92, 19, 39,135, 5,211,188,207, 62, 97, 11, 57, 0, 79,
+100,163, 47, 45, 45,173, 76,195, 97, 48, 24,240,244,233, 83, 4, 5, 5,245, 56,118,236, 88,125,170,200,172,246, 52, 0,235,126,
+222,179,103,243,184,226, 98, 18, 0,126, 39, 8,218,192, 48,235,204,237, 75, 14, 14,156, 19, 23,206,239,183, 99,145,113,176,177,
+250, 1, 15, 31,166,194, 96, 40, 43,175, 66,145,135, 89, 95, 40,193,229, 88,226,212,169, 63,108,125,124,186,158,200,201, 49,248,
+226,205,105,196,154,202, 41, 56,127,254, 60,102,205,154,133,152,152, 24, 89, 69,142, 54,161, 80,136,245,235,215,179,124,124,124,
+100, 34,145, 8, 23, 46, 92, 64,110,110, 46, 81, 87, 57,175, 95,188,190,178,248,245,181, 69, 57,196,133,143,126, 59,116, 4,211,
+198,142,129, 19,147,120,203,170, 57,177,178,223,224, 46,223, 51, 44,183, 65, 34,203,118, 82, 47,223,193,224,242,196,152,249,237,
+114,188,138, 62, 35, 85,151, 68,125, 65, 80,233,110, 75, 55, 28,155,243, 86, 57,143,135, 80,159, 30,188,243,193,229, 38,143,154,
+ 62,123,250,217,131,236,200,157, 81,127, 9, 45, 79, 54, 65, 82, 86, 64, 89, 90,147,132,132, 4,188,126,253, 26,108, 54, 27, 26,
+141, 6, 38,147,169,198,114,202,100,178,233, 38,147,233,251,242,243,188, 87, 32, 16, 76, 57,112,224,128,109, 85,161,109,223,110,
+120,103, 91, 75, 81,159,220, 60, 69,225,221, 71, 47, 94,206,155, 62,170,231,205,251,209,233, 6,206,208,180,226,168, 83,197,181,
+180,167, 64,200,227,157,184,112,242, 15,177, 49, 41, 2, 34,159,158,224,136,189, 64, 25, 51,161, 46, 84,161,228,117, 54,116,191,
+110,133,255, 23,115,113,230,207,227,226, 54,109,219, 31,211, 25,141, 94, 0,244,239,112,109, 54, 4,141,156,141,156,141,156,127,
+ 79,206, 90,181, 8,195, 48, 31, 0,112, 44,223, 84,148,235, 2, 59, 0,249, 40,203, 40,224, 88,126,239,224, 85, 57,172,250,118,
+213,125,171,111, 87,125,175, 40,127,239, 80,254,250,136, 32,136,130,122,138,238,140,178,212,132,103,203, 95,129,242,169,196,122,
+ 29,143, 9,130, 84, 82, 20,205,231,218, 59,104, 63, 29,221,167,237,165, 43,143,159, 90,216, 73,216,193, 61, 3,122, 60,124,158,
+116,143, 32, 9, 35, 65,144,102,249,125,176, 88,172, 49,155, 54,109,106, 43,145, 72, 64,211, 52,172,172,172, 32,151,203,161,215,
+235, 81, 92, 92, 12, 93,137, 18,134, 18, 37,158,165,167,160, 75,143,158, 24,249, 81, 63,159, 63,254, 60, 61,134,162,168,195,117,
+241,202,218, 5, 84, 90,178,150, 55,179,253,203, 52,145, 94, 84, 41,186,126, 8,240, 2, 87, 44,198,135,243, 66,223,167, 15, 68,
+158, 61,123,246,252,136, 17, 35,250,127,253,245,215,100,118,118,246,133,228,228,228, 46, 0, 98,234, 21, 21,124,193,151,255,248,
+114,144, 84, 42,102,112,236,242,105,116, 15, 24, 11, 11, 30, 11, 10,165, 1, 4, 1,196,190, 8, 3, 65,216, 32,234, 85, 54,186,
+249, 75,208, 47,216, 71,252,231,241,216,175,241,151,127,208, 91,167,166,176,176, 16,121,121,121, 48, 26,141, 48, 26,141, 24, 21,
+ 18,130,253,251,246, 65,165, 82, 65,163,209, 64,175,215,131,162, 40,144, 36,137,203,225,199,144,158, 20,139,206, 65, 65, 64, 45,
+169,151,246, 61, 5, 7,192,253,151, 47, 95, 34, 54, 54, 22, 25, 25, 25, 16, 8, 4,112,114,114,194,242,229,203,161,211,149,229,
+ 19, 11, 9, 9,233, 1,224,249,251, 94, 80,175,129,157,201, 20,181,168,255,201,147, 14,119, 78,158,164,239,159, 57,147,193, 47,
+ 41,217, 97,206,177, 92, 46, 70,253,184,238,243, 86, 34,145, 8, 25,105,155,224,237,205,197, 87,115,109,177,230,135,124, 0,192,
+236, 89,174, 8,108,111, 7,101,209,113,216, 57, 44,196,230,205,115,154, 79,154,180,113,130, 90, 77,237,173,135,122,209,233,211,
+167, 71,122,121,121,185, 68, 70, 70, 18, 60, 30, 15, 66,161, 16, 66,161, 16, 2,129, 0,121,121,121, 72, 78, 78,102,126,252,241,
+199, 76, 0,139,234, 34, 90,186, 57,251, 30,128,254,115, 63,194,249,151, 79,246,117,115, 97, 37, 61, 27, 57,179,107, 74,212,253,
+200,146, 75,151,239,172, 48,105, 5,233, 69, 25, 87,230,123, 4, 70,218,125,241,205, 50,108,253,113, 9, 94, 62,184, 89,224,216,
+ 68,185, 77, 72,232,106, 44,103,143, 30, 75,217,206,142, 54,166,233,147, 70, 90,159,113,188, 59,253, 28,155,144,231,228, 63, 89,
+143,228, 72, 13,191, 69,192,248,150,158,164, 62, 34, 34, 66,216,189,123,119,104,181,218, 74,203,228,129, 3, 7,104,147,201,116,
+173,198,190,105, 48,124,159,153,153,233,172,209,104,240,209, 71, 31,205, 94,191,126,189,168, 34,159, 28, 69, 81,111, 88,178, 86,
+254,180,255,226,151,223,111,187,118,241,240, 15,178,149,161, 83,122,142,155,185,234, 26,106,201, 35,201, 38,201, 47,206,156,220,
+237, 36,144, 26, 33,180,233, 7,109,174, 6, 47,119, 78,131, 90,169, 69,224,202,101, 0,120,208, 27, 73,236, 24, 60, 10, 28, 91,
+ 25,150, 76,157, 34,251,110,199,111,159,211, 52,189,169,241,185,190, 17,141,104, 68, 53, 56, 18, 4, 17, 14, 0,161,161,161, 11,
+215,172, 89,243,130, 32,136,112,134, 97, 6,149, 27, 80,194, 25,134, 25, 84,177, 79,185, 56,123,107,187, 98,223,234,219,213,223,
+ 47, 88,176,160,205,218,181,107, 87, 7, 5, 5, 29,190,123,247,110, 18,128,250,132,214,192,114, 97,245, 86,234, 29,178, 66, 65,
+ 86,125,125,195,162, 69,211, 55, 19,146, 82,212,253,250,118,116, 13,191,241,252,209,228,201, 3,251,140, 25,220, 61, 56, 57, 77,
+ 17,219,188,169,147,221,139, 23,207, 37, 52, 77,223, 52,167,149,248,124,254,160,222,189,123,179, 11, 11, 11, 97, 97, 97, 1,185,
+ 92,142,204,204, 76, 24, 12, 6,104,139,139,160, 43, 46,130,182,168, 16,134,226, 66,188,126,252, 16,237,154,123,242,203,157,229,
+235, 68,133,213,165,186,165,170,170,101,139,103,105, 9,190,165, 37,136,134, 79, 27, 14,181,182,182,190, 95, 49,168, 26, 12,134,
+ 47,230,207,159,159, 79,211, 52, 86,173, 90, 37, 17,139,197,199, 0,240,235, 35,177,180,103, 13, 10,242,247, 37,227,146,163,208,
+213,111, 34, 90,122, 12, 64,114,174, 6,249, 37, 6,228, 21, 25, 16,216,125, 11,154,249, 45,131,155,255, 26,196,166, 22, 64,230,
+226, 69,130,205,175, 51,249,115,122,122,250, 27,219,135, 15, 29,130, 90,173, 70,243,230,205, 49,118,236, 88,204,159, 63, 31, 99,
+199,142,133, 76, 38,195,184,209, 67,176,100,201, 18,228,228,228,212, 87, 84, 93,203,150, 45,117, 77,155, 54,213, 53,109,218, 84,
+103, 48, 24, 80, 90, 90,138,162,162,162,234,237, 61,167,161, 13,233,224,224,176,192,201,201, 41,202,193,193,225, 5,159,207, 63,
+247,148, 32,226,180, 77,155, 58,118, 25, 54,140,104, 61,122, 52, 43, 85, 40, 36,110, 0, 98,115,184,236,108, 56, 3,123,245,238,
+207, 43, 42,220, 93,105,164,154, 50,217, 30,183,111,180,193,157, 91,237, 49,235,139,230, 32, 72, 1, 8,146, 7,181, 42, 2, 29,
+ 59, 4,113,173,173,137,250,250,210, 39, 0,158,118,233,210, 69, 54,115,230, 76,130,207,231, 99,246,236,217,134,169, 83,167,198,
+143, 29, 59, 54,254,234,213,171, 84,211,166, 77,225,230,230, 70,184,185,185, 57, 3,120, 90,126, 76,157,144, 52, 39, 86,234, 12,
+177,183,172,189, 68, 73, 20,236, 58,151, 26,249,163,150,110,200, 86,172,252, 37,105, 67,242, 75,181,231,203, 7, 55, 21,241,209,
+103,232,228, 71,215,243,179,226, 75, 60, 87,254,146,180, 97,225,182,172, 26, 47,234, 27, 55, 64,135,133,223, 48,168, 85,106,246,
+176,193,189,212,211, 63, 29,211,210, 70,220,230, 0, 92,250,249, 53,107,226, 58,110,201,234,205,134,169,159,127,105,248,125,215,
+110,166,164,164, 4, 74,165, 18,155, 55,111, 54,157, 57,115, 38,147,162,168, 47,107,123, 6, 2, 0,163,209,136,233,211,167,139,
+ 36, 18, 9,210,211,211, 43, 45,162, 0,144, 45, 87, 60,191,243, 40, 58,110,222,140,144, 30, 42,157, 78,119,241,250,227,216,214,
+ 94, 77, 93, 9,130,169,117, 33, 10,143,195,249,176,125,199,142, 44,134, 41, 2,193,110,130,215,251,126,132, 50,167, 0,202,188,
+ 2,176, 56, 34,152,192,135,145,230,193,186, 93, 7,188,122, 20, 9, 23,123, 71, 54,159,195, 9,110, 28, 79, 26,209,136,255, 77,
+212,165, 69,170,138,165,181,107,215,174,174,235,251, 42,175,250,106,219,149, 66,170,186, 8,171,250, 30, 0,214,174, 93,187,154,
+ 97,152, 65,119,239,222, 61, 4, 64, 99,102, 21, 62,171,242,106,126, 28, 45,150, 86,191,230,235,249,139, 32,181, 18, 90,117, 8,
+240,114, 58,117,225,198,227,155,119, 31,199, 54,115,179,179,103,140,122,233,186,141, 91, 93, 9,181,102,173,153,133,240,177,179,
+179,131,193, 96, 64, 66, 66, 2, 50, 50, 50, 96, 48, 24, 96, 82,169,160, 43, 42,130,182,176, 16,148,170, 4, 92,138,130, 70,158,
+ 7, 91, 11, 1,240,215,138,196,122, 44,111, 68,141, 66,171,226, 85, 32,145,128,111, 41, 1,201,225,212,155, 41,190, 10, 62,232,
+208,161,195,209,232,232,232,142,125,251,246, 93,129,178, 37,242,169,153,153,153,125, 22, 47, 94,172,115,116,116,196,244,233,211,
+ 91, 1,152, 88,175,200,228,233,125,154, 58,181, 66, 75,207,137,104,230,214, 27, 69, 42, 35,228, 74, 35,242,138, 12,216,177, 37,
+ 8, 39,126,239,128,219, 39,186, 33,250,226,135, 40, 50, 58, 65, 44, 27, 10,134,210,183,169,139,243,242,229,203, 88,190,124, 57,
+ 86,172, 88,129, 85,171, 86, 97,197,138, 21,200,204,204,132,175,175, 47,210,210,210,112,254,252,121,100,103,103,195,206,206, 14,
+ 15, 31, 62,196, 79, 63,253,132,219,183,111,215, 91,233, 10,225,106,198, 62, 13,154, 75, 55,153, 76,147,178,135, 13,107,155,107,
+ 99,211, 58, 32, 32,160,255,236,217,179, 61,187,116,233, 82,249,189,167,167,103, 19,161, 80,152,131,178, 21,148,254,117,113,209,
+ 64,128,189,189, 47,244,186,184,242,115,204, 1, 65, 8,208,251,195, 88,116,233,246, 24, 6, 35, 23, 36,193, 7, 73, 10, 96, 50,
+ 41, 32,149,202,192, 48,132,111, 61, 69, 92, 44,151,203,189,174, 92,185, 66, 38, 39, 39, 67, 32, 16, 0, 64,202,210,165, 75,183,
+110,216,176, 33,198,214,214,150, 10, 15, 15,199,159,127,254,137, 65,131, 6,177,166, 78,157,234,229,230,230,182,189,190,122, 47,
+221,156,125,239,224,198,243, 31,115,140, 82,127,129,176,153, 59, 84,226,161,255,232, 97, 39, 2,128, 11,137,137, 37, 14, 77,148,
+107, 85, 37, 81,105,214,174,165, 63, 92, 72,172,111,197,233, 82,250, 73,124,220,253,131, 39, 47, 20,231,229, 22,114, 2,218,182,
+209,172, 89,254, 13,183,153,123,139,117, 75,230,207,112,202, 84, 10,138, 62,156,125, 62, 46,236,194,195,210,241,147,167,153, 62,
+253,108,166,246,252,133,203, 39,105,154,110,139, 90, 86, 28,210, 52,141,236,236,108,188,120,241, 2,137,137,137,144,203,229,200,
+207,207, 71, 73, 73, 73,229,116,163, 69,137,242,236,214, 61,103,158,137,132, 66,139,142,109,189,154, 60,136,140,201, 19, 9,133,
+ 22, 94,238, 77, 90, 2, 75,107,188,143, 80, 20,213, 86, 96, 33, 4, 64,160, 40,250, 38, 74, 11, 75, 81, 90, 84,138,146,130, 82,
+232, 12, 44,104,117, 36, 52,122, 18, 77,123,244, 67,169, 74,139, 82, 69, 49,104,138,242,107, 28,110, 26,209,136, 70,212, 49,214,
+135,135,134,134, 46, 52,115, 95,179,167, 55,171, 11,175,208,208,208,133, 4, 65,132, 47, 88,176,160, 13,106, 95, 80, 85, 21, 59,
+107,248, 3, 96, 70,120, 7,133, 34,190,212,146,240, 25, 49,247,219,239,207, 31,218,181,197, 65,167, 83,167,217, 74,197,148,216,
+130,103,247,233,244, 85, 40, 41, 45, 28,174, 50, 63, 28, 1, 10, 11, 11,145,148,148, 4,161, 80, 8, 46,135, 3, 74,163, 1,165,
+ 81, 65, 83,168, 0,105,208,129, 75, 81,176,177, 16,162,169,204, 9,205, 28,157,204,226, 76,136,184, 84,233,248, 94,117,186,240,
+199, 14, 62,224,137,196,224, 89,138,241,143,240,235, 0, 0, 46,151, 11, 44, 94, 97,150,209,196,197,197,229,244,193,131, 7,185,
+114,185, 28, 79,159, 62,125, 6,160, 24,128, 37, 0, 58, 54, 54,246, 74,116,116,244, 32, 47, 47, 47, 0,104, 94, 31,153, 50,159,
+164,140, 38, 6,233, 57, 41, 72,206,136,132,141,149, 7, 56, 22, 45,145, 87,100, 0, 95,232, 1,163,238,175,217, 71,173, 50, 21,
+ 26, 3,203,172,186,235,245,122,152, 76, 38,152, 76, 38,232,245,122,124,246,217,103,184,115,247, 46, 14,255,121, 21, 73,175, 95,
+161,149,187, 19, 38, 76, 24,143, 14, 29, 58,224,238,221,187,117,114, 77,244,135,209, 69, 12,246,198,254, 36,120, 98, 91, 93,167,
+249, 23, 31,212, 39,182, 8,130, 96, 80,203, 84,100, 53,108, 8, 10, 10,106,241, 74,165,194,139,184, 56,244, 93,186, 20, 0,112,
+238,220,185, 55,234, 50,111,222, 60, 94, 76, 76,204,167,143, 31, 63,254, 52, 43, 43,107, 35,128,154,157,205, 25,224,236,217,123,
+152, 49, 35, 6,114,185, 28, 0,112,228,208, 95,186, 52, 57,201,128,143, 6,150,205,104, 89, 91, 91, 99,227, 70, 95,179,218,147,
+162, 40,236,220,185,179,114,186, 16, 0,216,108,118,151,121,243,230,141,168,105,255, 22, 45, 90,112,235,227,156, 59,202, 69,112,
+251, 25,243,133, 85,139,102,109, 36,118,237,160, 48, 70,250, 70,102,102,207,154, 59,202,101,211, 79,199, 51,181, 66, 66,183,151,
+160,210,221,216, 2,237, 62,115,202,152,120, 97,139, 94,209,116,210,190, 28,185,242,187,153,211, 62,177,149, 88, 59,168,126,223,
+186, 70, 74,178, 72,230,244, 99, 67, 81, 27, 79, 91,235,161,157,126, 46,157, 49,119,113,164,222,148, 62, 19,233,167, 95,161,142,
+ 16, 23, 20, 69, 33, 43, 43, 11,114,185, 28,105,105,105,200,207, 47,155,126,205,207,207, 7, 77,211,239,115, 67,132, 38, 45, 13,
+169, 39,127, 71,179,241,227, 17,184, 98, 57, 40,154, 13,141,154,194,198,206,125, 80, 88,172,129,142, 38, 32,251,160, 51,166,157,
+187, 5,146,161,128, 29,219, 26, 71,146, 70, 52,226,127, 20,230,132,119,168, 16, 68,107,214,172, 25,244,207,254,253,170, 98,107,
+205,154, 53, 47,214,172, 89,211,144,223,170, 62,101, 88,185, 93,225,163,117,189,138, 3,218, 91,131,102, 73,126,108, 98, 76, 12,
+ 59, 75,165, 81, 89, 56, 58,216,235, 44, 4,124,186, 88, 89,194,138,124,254,204,160,202,121,253,178, 1,245,136,141,142,142,246,
+205,202,202, 66, 90,106, 42, 76, 26, 21, 72,157, 30,140, 86,141,190, 93, 59, 67, 0, 64, 64, 18,224,210, 6,176, 89, 60,148,148,
+ 42, 1, 32,182,222,193,209,104,124,203,178, 69, 16, 4,120,150,150,224,137, 68,224,137, 45,223,176,112,153, 99,177,225,243,249,
+ 7,143, 29, 59,230,236,226,226,130,229,203,151,195,213,213,213, 91, 38,147,169,173,172,172,132,142,142,142,104,221,186, 53, 58,
+119,238,140,243,231,207, 3,102,196,148, 50,154, 4, 81, 47, 83,208, 37,191,224, 46,110, 93,255, 21,122,141, 14, 1, 61,126,133,
+129,221, 12,246,109,150,129, 78, 56, 0,117,206,169, 50,235,129,211, 96,100,164,165,128, 96,241, 94,152,107,121,170,120,255,236,
+217, 51, 28, 58,117, 3,206, 77,125,144, 22, 31,135,184,107, 87,112,199,222, 22, 77,125, 90, 87, 78, 3,213, 90, 70, 10,236,149,
+219,202,194, 68, 45,250,226, 19,126, 65, 65, 1,223,198,198, 70, 87,209,118,206,206,206,239, 35,182, 62,249,250,235,175, 81,196,
+225, 0, 3, 7,130,155,152, 8,131,193,128, 78,157, 58, 33, 48, 48, 16, 0,208,169, 83, 39,176,217,108,180,107,215, 14, 50,153,
+ 12,219,182,109,251,164, 54,161, 69, 18,120,106, 50, 41,188, 61, 61, 61, 43,133,214,190,253,114, 68, 62,254, 16, 4,120,216,188,
+ 53,161,114,223, 38, 77,154, 32, 39, 59, 17, 4,193, 68,215, 83,198, 21, 78, 78, 78,139,157,157,157, 61, 55,108,216,192, 18, 8,
+ 4,248,252,243,207, 61, 74, 75, 75,155,149,155,146,177, 96,193, 2, 0,192,146, 37, 75,176,116,233, 82,232,116, 58,117,109,100,
+251, 54,182,149,229, 21,208,159, 50,165, 22,195,123,217, 53,107,219, 59,184, 47, 60,188,122,163,119,112, 26, 0,172,182, 97,167,
+140, 94,247,157,245, 73,107, 75, 98,247,165, 11,151,151,116,237,209,251,187,249,165,215, 86,254,176,179,168, 94,159,199,226,212,
+189, 37, 47,121, 99,126,218,178,125,255, 79,223, 47,152, 35, 72,147,235, 11, 51, 11,207,198,236,221, 0, 0, 32, 0, 73, 68, 65,
+ 84,153, 82, 49,159, 45,110,238, 72,136,103,125,187, 34, 41, 43, 43,241, 43,164, 95,168,119,165, 37, 77,211, 72, 76, 76,172,244,
+233,211,106,181, 80,169, 84, 72, 79, 79,175,236, 51, 26,145,228,163,153,147, 7,251,169, 52, 26,245,131,231,241,105,139,102,143,
+ 11, 82,105, 52,234,248,228,180, 87,192,230, 26,213, 24, 73,146,207,213, 37,234,190,234, 34, 45,228, 79, 95,194,181, 79, 83, 24,
+ 77, 4,244, 38, 10,114, 69, 9,116, 38,128, 34, 57,104, 51,122, 2, 40,130,141,252,172, 76,144, 44,214, 51,188,233,180,223,136,
+ 70, 52,226,127, 7,117,106,145, 10,139, 86, 80, 80,208,225,170, 86,167,138,247, 0,116,168,219,149, 71, 94, 85, 76, 85, 76, 39,
+214,246, 59,213,120,205,197, 91, 62, 90,245,134,119,168,248, 77, 55, 43,165,236,199, 37,227, 92,105,147,169, 85, 94,126,174,137,
+205,230,115,220,172, 52,217, 5,105,230,255,186, 78,167, 11,191,114,229,202,176, 15, 63,252,144, 31,255,252, 25,244,197,197,208,
+ 23, 23,129, 67,155, 96, 35,108, 15,210,160, 3,161,215,195,197,155,134,182, 68,136, 27,119,162,141, 58,157, 46,220, 92,161, 69,
+178, 88,111,250,101,137,197,224, 91, 74,192, 23,139,171, 79, 45,214, 39, 10, 44,250,245,235,215,167, 83,167, 78, 96, 24, 6, 59,
+119,238,132,193, 96,224, 25, 12, 6,232,245,122, 24, 12, 6, 40,149, 74,236,223,191, 31,191,252,242,203, 29, 0,123,234, 29,204,
+ 76,250, 43, 23, 47, 71,116,152, 50,110, 16,231, 92,248, 70,152,244, 20, 52,132, 43, 84, 42, 35, 74,245, 22,160,108,199, 3,185,
+103,193, 98, 11, 16,212,206, 3,167,142,135, 25, 96,210, 93, 53, 83,133,191, 97, 21, 74, 79, 75, 65,198,235, 87, 16, 43,115, 96,
+ 47,177,128, 58,241, 21, 2, 38, 76,124, 39,235,132,155,155, 27,104,154, 70,175, 94,189, 42,157,171,223, 85,108, 41, 20, 10,156,
+ 57,115, 6,157, 58,117, 66,143, 30, 61,144,153,153,137,196,196, 68, 12, 24, 48,160,114,159,103,207,158, 33, 50, 50, 18,205,155,
+215,109, 36,204, 47, 48,158,203, 72,127, 26, 50,116,232, 80,238,253,251,247,193, 48, 12,188,188, 36,144, 88,138, 64,144,124,248,
+248, 56, 0, 40,123, 6,232,217,179, 39,148,202, 68, 83, 97, 33,115,174,158,234, 30, 4,240,167, 94,175, 79,232,222,189,187,236,
+245,235,215,152, 59,119, 46,251,200,145, 35, 21,166,100,132,134,190,185,152, 66,163,169,125,234,190, 85, 91,239,111, 60, 76,210,
+ 30, 2, 97, 51,119,137, 93, 59,120,120,245, 6, 0,124, 56,104, 10, 60, 90, 52,129, 50, 63,202, 93,171, 73, 25,206,101, 23, 74,
+163, 54,103,198, 8, 7,250, 78,214,230, 93,143, 71,217,212,105,189,167, 93, 19,127, 36, 55,141, 51,254,232,159,167,207, 79, 31,
+ 48,104, 8,199, 72,153, 76,190, 77, 57,214,199, 78,158,205,203, 76, 77,251, 25,105, 23,162,255,178,255,213,105,197,163,148, 74,
+ 37, 68, 34, 17,162,163,163,117, 3, 7, 14,228,147, 36,137,132,132,132, 74,161,229, 96,103,211,186, 75,160,175,247,202,159,246,
+ 95, 20,241,249,252,224,158,237,125, 98,226, 83, 51, 24,134, 72,169,213,218,106, 52, 94,126,254,244, 89, 47,123, 89, 11, 86,226,
+245,251,176,237, 54, 0, 58, 29, 9,141,158,134,206, 4,152, 88, 92, 56,251,119,132,117,115, 31, 48, 0, 30,221,191, 99,212, 25,
+141, 23, 27,199,154, 70, 52,226,127,218,170,197,212, 37,146,202,223, 23, 0, 72, 89,179,102, 77,126, 21,107,147, 28,192, 51, 0,
+126,229,251,201,171, 29, 39, 39, 8,226, 17,195, 48,129, 85,120,228, 85, 4, 87,213,247,250,106,251, 60,107,128,200,170,250,250,
+166,208,170,109, 73, 37, 0,216,217,217, 57, 4, 4,180,111,254,219,174,163, 96, 24, 6, 47, 35,215,163, 48, 47, 14,139, 87,223,
+107,238,226,226,210, 35, 51, 51,243,134, 57, 37,160, 40,234,200,238,221,187,191,234,248, 65, 64,128,187,171, 43,158,165, 36,131,
+203, 80,224, 82, 20, 72,131, 14,108, 74, 15, 87, 95, 10, 36, 33, 70, 86, 86, 49,214, 30, 60, 26, 93, 30, 37,190, 78,120, 15, 24,
+130,229, 25,197, 32, 8, 2, 27,130,124,193,179, 20,131, 43, 18,227, 31,167, 35, 42,197, 85,248,242, 5,224,137,197,104,222,209,
+172,128,240,234,107,215,174, 61,126,254,252,121,160,175,175, 47,190,250,234, 43,164,164,164,128,166,105,228,230,230,106,179,179,
+179, 51,229,114,121, 10,128,147, 0,126,131, 25,145,199,185, 58,237,166,240, 19,251,102, 6,117,237, 97, 55,116,248, 47,248,243,
+248, 60, 20, 21, 43,161, 54, 9,161,210,154,160,210,177, 96, 99,219, 22, 29,219,181, 67, 86,102, 30, 94,220,191, 88,202,214,169,
+215, 55,164,131, 18, 4,129,200,200, 72,120,202, 44,241,234,214, 13,216, 89,112,224, 39,115,130,172, 75,215,202,248, 82,117,129,
+195,130,233,147, 79, 62,169,140, 12,223,175, 95,191,228,241,227,199, 59,207,155, 55, 15,187,118,237,194,157, 59,119,222,114,208,
+238,209,163, 7,110,222,188,185, 12,192,146,250,140,122,122,189, 30,222,222,222,120,244,232, 17,174, 92,185,130,222,189,123,163,
+ 71,143, 30,136,138,138,194,165, 75,151, 16, 25, 25, 9,130, 32, 96,107,107, 11, 99,153,120, 54,214, 70,102, 48,224,216, 15,235,
+118, 47,252,233,167, 95,218,140, 27, 55, 14, 39, 78, 28,198,148,201,173, 64,144,124, 16, 4, 31, 67, 6,183,194,242, 21,143,208,
+177, 99, 79,216,217,113,240,211,198, 83, 73, 26, 13,181,223,140,102, 92,121,233,210, 37,153, 86,171, 69, 81, 81, 17, 35, 22,139,
+ 9,133,162,108, 69,107, 77, 22, 45,181, 90, 45,168,141,232,249,147,216,245, 69, 37, 76, 33, 83, 26, 57,188,192, 20,217,182,119,
+112, 58, 62, 28, 52, 25,151,195,247, 32,226,226, 21,216,176, 83,146, 33, 42, 57,159,159,156,175,204, 86,121,109,247,249, 96, 42,
+ 43, 67,117,113,251,172, 33,175, 88,206,206,244,177, 5,191, 42,139,234, 18, 90, 0,136,130,152, 3,167, 79, 50, 24,210, 57,168,
+ 99, 11,223, 38,206,188,194,252, 60,230,248,169,243,209,134,228, 19,103,170, 8, 44,166, 30,161,190, 60, 52, 52,244,251,242,247,
+123, 23, 45, 90, 52,117,237,218,181,246, 57, 57, 57,149, 62, 90,121,249, 5, 17,157, 7,206,162, 20, 69,197,250,221, 63,125, 59,
+ 74, 40,224,243, 22,173,221,125,221,200,194,253,218,120, 77, 52,189,109,244,220,197,115,226, 95, 70,186, 52, 19,242,112,234,219,
+ 37,120,118,233, 26,140, 36, 23, 51,174, 60,128,206, 64,161, 40, 95,129,171,159,126, 1,177,163, 20,191, 92, 63,145, 75,211,244,
+175,141, 67, 77, 35, 26,241,191,139,218,180, 8, 65, 16, 53,197,216,203,173,225,179, 71,117, 29, 87, 11,207, 63, 3,181, 70,133,
+ 55,107, 9, 94,126,126,126,222,205,155, 15,112, 61,124, 37,110,132,175,196,139,200,103,200,202,212, 35, 51, 87, 11,137, 68,114,
+175,142, 67,171, 71,142,101,212,106,245,136, 69,139,191,207, 17, 8, 45,208,189, 79, 31, 56,217, 59,192,130,203, 1,203, 68,131,
+ 69,112, 80, 42,183,198,171, 40, 53,230,239, 62,144, 87,170, 86,143,168, 97,144,232, 91,155,200, 32, 8, 2,124,137, 37,120, 98,
+ 75,240, 45, 37,111, 76, 35, 10, 36, 18, 8, 44, 37, 96,243,120, 53, 57,195,191,197, 89, 90, 90, 58,114,212,168, 81,133,197,197,
+197,152, 58,117, 42,110,220,184, 17,121,241,226, 69, 73, 84, 84,148, 80, 46,151,183, 0,208, 15,192,142, 58, 68,214, 27,156,133,
+133,137, 37,140, 73, 55,102,205,247, 95,106,180, 38, 91,132, 76, 60, 2, 17,153, 14, 19, 69,131, 1, 32,179,225,161, 75,223, 21,
+200,211,119,198,145,237,171,212,180, 65, 59,174, 90, 12,173, 55, 56, 25,134, 97, 28, 29, 29,223,106,131, 43, 87,174, 32,100,212,
+ 72, 4, 15, 31, 6,123,119, 79, 56,244, 29,128,224,169, 51,176,125,251,118,144, 36, 9, 59, 59,187,234, 3,111, 37,231,190,167,
+224, 28,122, 14,226,208,115, 16,123, 35,193, 6, 48,225,192,129, 3, 63,248,249,249, 93,187,115,231,206,122, 0, 99,170,254, 86,
+ 21, 44,173,102,205,170,233, 28,125, 55,103,206, 28, 77,124,124, 60, 68, 34, 17, 76, 38, 19,238,220,185,131, 95,126,249, 5, 27,
+ 54,108, 64,100,100, 36,108,109,109,209,188,121,115,232,116, 58, 60,122,244, 72, 3,224,187, 58, 56,105,185,220, 52,114,243,230,
+181,138, 65,131,186, 97,247,238,173,112,114,234, 12, 14,219, 9,108,142, 61, 68, 98,111,252,254,219, 15,232,223, 63, 0,167, 79,
+ 29, 45,200, 87,152, 70, 2, 48,153,209,151,180, 15, 30, 60,192,246,237,219, 49,106,212,168,204,144,144, 16,170,184,184,184,210,
+162,197, 48, 12, 24,134,193,210,114, 31, 51,157, 78,199,175,141,115,218,252,232,204,111, 87,189, 88,158,155,147,217,233,198,181,
+123,159, 68, 92,188,130,164,248, 8, 68, 92,188,130, 91, 17,119, 67,115,115, 50, 59, 5,116,104,201, 29, 49,117,230, 55,251,194,
+ 78,176,196, 18,103,236, 11, 59,193, 26, 59,235,203, 85,237,131,123,127, 87, 95,159, 47, 63,143, 76,105, 94,238,130,213,235,183,
+148,154, 12, 90,242,199,159,183,101,105,228,217,223, 85,233,151, 76,125,253, 83,163,209,236,208,106,181, 50,173, 86, 43,211,233,
+116,223,165,164,164,116,255,234,171,175,228, 20, 69, 85, 90, 75,229, 49,167,239,197,221,222,187,218,193, 78, 42,236, 28,216,166,
+213,198, 29,199,175,167,165,231,254, 81, 37,134, 86, 77,229,212,150,106,180, 35,135,141, 24,175, 42, 42,212, 33,232,203, 80,208,
+ 2, 49,116, 20, 96,100, 88, 48, 17,108, 60, 95,185, 17, 66, 27, 75, 28, 76,126,162, 46, 54, 26, 70,226,205, 24, 90,117,213,253,
+125,208,200,217,200,217,200,249,247,228,252, 79,134, 51,222,204,117,232,252,134, 69,171,190, 37,149, 46, 46, 46,221,135, 14,233,
+139,158,131, 22,129, 97, 24,196, 61, 89,135, 66,249, 75,184, 56,241,145,152,166, 12, 2,112,163, 1,133, 73, 75, 73, 79,239, 52,
+231,187, 69, 97, 33,253,250,248,248,186,187,243,155, 53,107, 10,145,131, 3,242,243,229,184,125, 63,198,184,234,208,177,232,114,
+145,101,214,196, 36, 77,211,101, 78,238, 0,250,204,153, 15,130,197, 2,202,195, 56, 84, 12,140,238,129,157, 65,176,217,160, 24,
+ 26, 58,157,206,156,213,114, 25,175, 95,191, 30, 57,110,220,184,171,225,225,225,100,112,112,176,255,201,147, 39,223, 39,103, 30,
+ 84,121,241,215, 0, 12, 90,181, 96,250,145, 78,189,135, 73,188,218,180,231,182,111,198,130,193, 72, 32, 43, 51, 21,225, 97, 15,
+ 13, 49, 15, 46, 42, 25,147,118,140, 58, 63,254, 90, 93, 92, 6,131, 33,173, 69,139, 22,142,219,183,111,175,116,134,167, 40, 10,
+249,249,249,184,119,239, 30,218, 6,118,132,207,228, 79, 33,151,203,177,121,243,102, 52,105,210, 4,131, 7, 15, 70, 65, 65, 1,
+ 76, 38,147,185, 19,190, 20,128,139,229,127,168, 38,178,136,242, 20, 64,117, 78, 27,122,122,122,242,180, 90,173, 63,195, 48, 44,
+130, 32, 54,233,245,250, 73, 11, 22, 44,112, 94,189,122, 53, 90,181,106,133,252,252,124,136, 68, 34,120,121,121, 65, 46,151,227,
+225,195,135,148, 90,173,222,142,178, 68,214,242,122,202,151,240,240, 97,114,167,217,179,255, 17,246,195,218,233, 94, 90, 93, 79,
+158,141, 77, 87, 48,140, 9,114,121, 10, 74,148,119, 12, 43,150,239,121,157,155,103, 28, 1, 32,222,204, 58, 47,153, 57,115, 38,
+ 0, 8, 0, 44, 74, 76, 76,124,234,227,227,227, 85,155, 69,203, 28,252,116, 60, 83, 11,224,208,200, 96,217, 92,101,126,148,151,
+ 13, 59, 37,185,147, 47,189,249,167,227,153, 90,137, 76,181, 50, 63,229,198,171,108,213,197,237,251,194, 78,176, 38, 14, 31, 73,
+185,138,227, 67, 5, 14,204,113, 51,168, 25, 63, 63, 63, 55,130, 40,240,200, 83,188,124, 60,101,234,244,209, 86, 92,205, 57, 63,
+ 87, 69,115,178, 73,128, 32, 50, 50, 50, 25, 13, 92, 25, 90,142, 87,153,153,153,221, 23, 44, 88,112,145, 97,152, 55,124, 19,242,
+242, 11, 34,130, 6,205,100,138,138,138,159,202, 99, 79,155, 19, 75,237,225,195, 39,145,125,124,219, 6,156,248, 97,245, 90,199,
+158,115,190, 98,191,186,118, 29,160,140, 72,189,113, 29, 20, 95, 79,111,188,123, 57,183,216, 96, 24,142,198,168,240,141,104,196,
+255,188, 53,171, 46, 45,242, 55,199, 64,212,226, 12,111,118,101, 60, 61, 92, 46,182,242,106,214,175,137,171, 61, 0, 32, 49, 57,
+ 11,137,201,153,151, 18,147, 50,131,235, 81,188,181, 45,175,172, 76, 42, 77,148,135,112, 96,204, 75, 42,253, 6,167,173,173,237,
+ 99, 54,155,237,218,144,214,160, 40, 42, 43, 63, 63, 63,192,204,114,142,117,119,119, 95,155,154,154, 26, 70,211,244,220, 6,170,
+253, 26, 57, 43,146, 74,147,108, 94, 95,198,164,111, 11, 0, 4,155,103, 78, 82,233,170,156,109,197, 98,241, 14, 14,135,211,164,
+226, 60, 86,248, 96, 81, 20,197, 50, 24, 12, 2,138,162, 88, 0, 8,146, 36, 77, 28, 14, 71, 75, 16,132,201,100, 50,165,233,116,
+186,233,248, 43,224,104, 93,117,175,119,160, 47, 23, 90,168,193,162,117, 5, 0,226,227,227, 91, 74,165,210, 49, 4, 65,140, 98,
+ 24,198,187,164,164, 68,183,120,241,226,200, 99,199,142, 41,221,221,221, 63, 26, 56,112, 32, 17, 21, 21,133,232,232,104, 70,161,
+ 80, 28, 47,183, 98, 37, 54,176, 47,145,124, 62,235, 99, 27, 27,114, 32,195,192, 15, 12, 8,130,196,243,226, 98,250,156, 90, 77,
+253, 81, 46, 24, 27,218, 63, 43,240, 73,179,102,205,246, 36, 39, 39,115,106,179,164,214, 86,247,234, 88,247, 93,155, 69, 65,221,
+186,141,188,119,235,214,201,111, 87,189, 88, 94,245,187, 89,195,164, 83,198,126, 49,103,221,161,109, 63,127,187,229,207,194,221,
+230,148,211,223,223,223,147, 32,136, 49, 0,124, 25,134,105,193, 48,132,128, 32,152, 66,130, 32, 94, 0,136,210,235,245,225, 49,
+ 49, 49, 25,239, 81,247,119,121,194,173,141,179, 50,169, 52, 40,170, 29, 5, 48,102, 38,149,254,119,151,179,145,179,145,179,145,
+243,255,143,243, 63, 25,159,213,240,153,121,145,225, 43,144,152,148, 25,156,152,148,137, 22, 45, 90, 48, 9, 9, 9, 13, 18,105,
+181, 13,210, 20, 69, 29, 86,171,213,135,223,135, 68,161, 80,180,255, 23, 55,222,161,228,228,228, 67,255, 76,194,114, 33,181,188,
+252,239, 93,241,188,180,180,180,163,185, 59, 27, 12,134,127, 69,219, 16,229,214,172,101,181,237,208,175, 95,191, 84,131,193,112,
+ 5, 64, 58, 65, 16,214, 0, 10, 12, 6,195, 69,147,201,148,155,144,144,208,126,227,198,141, 21,145,239, 87, 0,120,252,142,229,
+160,117, 58,234, 96, 86, 22,117,240, 95, 80,199,131,122,189,126,158,173,173,109,115,173, 86,203,211,106,181,220,170,139, 15,132,
+ 66,161,188, 46,135,248,170,176,182, 36,246,114,217,133,182,214,150, 68,117, 33, 5, 27, 23,156,208,168,162, 91,217,184,224,132,
+185, 5,123,250,244,105,162,159,159,223, 1,146, 36,221, 25,134,113, 4, 24, 43,134,129,156, 97,152,124, 54,155,157, 25, 19, 19,
+147,249, 55,186, 9,105, 77, 52,189,222,164,215,255,229,119,216,184,186,176, 17,141,104,196,127, 15,106,245,209, 98, 55,148, 41,
+ 33, 33,129,104,108,207, 70, 84, 21, 91,117,125,153,154,154,170, 3,112,183,252,175, 58, 30, 3, 24,252,119,175, 96,118,118,118,
+ 64,109,223,153, 43,178,128, 50,159, 45, 32,186,198,232,236, 75,183, 20,150, 96, 75,216, 55, 13, 45,219,179,103,207,210, 96,230,
+ 20,123, 35, 26,209,136, 70, 52,226, 95,134,247,183,104, 53,162, 17,141,104, 68, 35, 26,209,136, 70, 52,162, 70,236,172, 34,184,
+222,176,110, 17,168,125,229, 64, 67,230, 94,223,101,245,193,149, 70,206, 70,206, 70,206, 70,206, 70,206, 70,206, 70,206,255, 57,
+206,255, 86,188, 37,178,254, 29,104, 92,250,218,200,217,200,217,200,217,200,217,200,217,200,217,200,249,191, 32,178,170,255, 1,
+104,156, 58,108, 68, 35, 26,241, 63,140, 99,199,142,153,149, 84,244,227,111,127, 31, 36, 22, 75, 23,151, 42,139,215, 30, 94, 63,
+229,100,197,231, 33, 33, 33, 84, 99, 43, 54,162, 17,141,192,187, 56,195,123,120,184,182, 38, 41,186, 11,195,144, 44,134,100,140,
+132, 82,115, 36,177,176,240,141,176, 3,110,110,110,214, 28, 18,131, 9,134, 17, 17, 4, 77,209, 44,242, 78, 82, 82, 70, 76, 3,
+ 10,198,147, 74,165, 51,185, 92,110, 95,189, 94,239, 74,146,100,134, 78,167,187,162, 86,171,183,226,237,192,133,255,111,104,217,
+178,229,216,235,215,175, 91,119,237,218, 85, 39, 20, 10, 77, 26,141,134,125,225,194, 5,126,255,254,253,139, 94,191,126,253, 78,
+ 43, 18,101, 50, 89,239,223,127,255,221, 35, 56, 56, 24, 45, 90,180, 80,141, 25, 51,134, 27, 20, 20,196,157, 58,117,106, 82, 86,
+ 86, 86, 68, 3,233, 90, 19, 4,177,159, 32, 8, 22, 77,211, 19,240, 87,232,134,127, 54, 72,146, 36,167, 19, 4, 49,156, 97, 24,
+ 79,130, 32, 18, 25,134, 57, 73,211,116, 93,129, 91,235,194, 72, 0, 3, 72,146, 12, 0, 0,154,166, 35, 1,156, 3,204, 95,121,
+247,239,228,180,176,176,240, 7, 0,181, 90,253,244,159,197, 73, 16,132, 63, 0, 48, 12,243,174,156,147,133, 66,225, 52, 0,208,
+104, 52,191,193,140,116, 80,213,193,108,247,102, 2,150,197, 1, 0, 34,151,120, 3, 0, 26,178, 77,204,136, 35, 26,242, 91, 53,
+241, 53,132,163, 6, 12, 24, 55,110,220,234, 63,254,248, 99, 9,128, 83,255,138,142,239,228,228,182,117,195,207, 59,101, 95,206,
+252,116, 45,202, 50, 66,212,125, 65, 2, 31,242, 88,172, 33,122,138,186, 21, 3, 28, 3,192,182,177,177, 25,203,227,241,186,235,
+245,122,103, 54,155,157,173,215,235,111, 22, 23, 23, 31, 66, 29, 25, 16,204,110,215, 88, 72, 13,106, 56, 17,244, 95,121,222, 24,
+ 18, 58,174, 5,114, 8, 31, 20,254, 13,110,163, 36,128, 57,229,117,221,133,218,195,121,212,117,243,249, 82, 38,147, 13, 87, 42,
+149,106, 22,139,197,160,108,213,115,217,191,178,239, 9,154,166,243, 10, 10, 10, 38,212,199, 37,106,130, 86, 60, 17,177,159, 50,
+ 66, 99,210, 49,159,171,210, 17, 39,118, 67,103, 6,152,192, 0,238, 36,139,180,167,105, 58, 27, 64, 4,105,194,153,210, 44, 36,
+252, 77, 7,247,166,229,237,218,172,124,155, 3,192, 17, 64, 20,128, 47, 1,148, 54,234,159,127, 27,170, 59,195,159, 5,144, 93,
+ 41,180,170,132,187,239, 57,104,208,160, 27, 30, 30,174,173, 71, 13, 27,177,122,198,244,207, 9, 22,139, 68,244,139, 23,236, 79,
+ 38, 76,238, 39,149, 74, 93,196, 58,157, 15, 8,130, 86, 11, 4,209, 74,101,113,230,177, 67,127, 88,122,183,106, 69, 81, 20,141,
+237, 59,126,237,127,252,207,176,133,102,138,173,150, 78, 78, 78,251, 67, 67, 67,157,134, 12, 25,194,114,114,114, 66, 74, 74,138,
+245,225,195,135, 91,109,217,178,101,116, 97, 97,225, 4, 0,175,222,161,178,221,156,108,200,126,150, 66,162, 15, 74, 40,148, 24,
+113, 53, 71,131, 75, 0,110,189,107,235,169,213,234, 89,106,181,186, 99, 96, 96, 32,179,107,215, 46, 98,210,164, 73, 12, 65, 16,
+132, 70,163,217, 11,224,157,132,150, 72, 36,218, 22, 28, 28,236,229,229,229,149,248,250,245,235, 1, 71,143, 30, 61, 55,113,226,
+ 68, 79,145, 72, 20, 15,160,101, 3,233,246, 40, 20, 10, 63,141, 70, 3, 87, 87,215, 93, 0, 62,248, 23,116, 34,130,197, 98,157,
+116,113,113, 97,214,173, 91,119,202,207,207,207,177,160,160,192,244,205, 55,223,244,189,127,255,126,127,138,162,134, 52, 64,108,
+ 73, 9,130,216,225,232,232,104,183,118,237,218,132,246,237,219, 71,241,249,124, 94,124,124,188,197,188,121,243,230,190,122,245,
+106, 52,195, 48,211,129, 6, 13, 16, 82,130, 32,118,200,100, 50,187,213,171, 87,167, 4, 4, 4, 68,115,185, 92,110,124,124,188,
+104,254,252,249, 95,198,197,197,189, 19, 39, 73,146,219, 59,118,236, 40, 93,178,100, 73,108,171, 86,173,238,178, 88, 44, 94, 70,
+ 70, 6,185,116,233,210,153,151, 47, 95, 14,161,105,122,198,187,148,211,193,193, 65,186,116,233,210,216,160,160,160,251, 92, 46,
+151,251,242,229, 75, 50, 52, 52,116,102, 66, 66,130,217,229,180,177,177,233, 69, 16,196,206,156,156, 28, 54, 0, 56, 59, 59,119,
+144, 72, 36, 91,170,230,180,172, 8, 69, 97, 52, 26, 75,180, 90,237,184,130,130,130, 26, 3,225, 78, 90,176,121, 48, 0,108, 49,
+ 84,108,151,189,214,183, 13,108, 63, 99, 78,165,253,157,202,226,226,109, 80, 77, 25, 6, 0, 99,203, 83,133,111, 80, 1,108, 54,
+155,246,119,250,146,121,154,211,160,144, 49, 67,123,247,238,189, 52, 34, 34,226,215,158, 61,123,206, 63,112,224,128, 67,122,122,
+250, 15,183,110,221,114,251,248,227,143, 39, 93,189,122,117, 77,126,126,254,241,127, 86,231,231,113,249,124,130, 36, 32, 20, 88,
+ 72,204,217,159, 67,146,131,238, 14, 29, 58,237,183,151, 47, 3,182,196,197,121,168,156,157, 59,206,158, 61,219,113,196,136, 17,
+164,155,155, 27, 18, 18, 18,108, 15, 28, 56,224,243,219,111,191, 13, 47, 42, 42,154, 3, 32,245,125, 68,150,170, 8,109,117,122,
+ 4, 48, 12,172, 43, 47, 88, 2, 69,124, 3, 34,153, 88, 60,255, 27,136,173,239,247,236,217,179, 36, 33, 33, 1,107,214,172, 1,
+128,173, 13, 60,126,222,208,161, 67, 7,134,133,133, 9,143, 29, 59, 38, 12, 12, 12,132,147,147, 19,202, 31,166, 42, 3, 83,123,
+120,120,152,215,102, 52, 54,108, 58, 55,229,131,232,130,243,216, 54, 34,103,141,208, 21,166,206, 67,189,134, 15,154, 20, 0, 43,
+123, 11, 8,196,108, 20, 41,148,190, 47, 35,211,131,175, 29, 77,248, 33,225,137,124,173, 42, 13,223,163,246,152,124,255, 47,176,
+181,181,221,149,148,148,212, 75, 36, 18,189,241,121, 98, 98,162,191,151,151, 87, 49,128,175, 26, 42,220,236,237,237, 15,210, 52,
+173, 83, 40, 20,159, 2,128,165,165,229, 31, 34,145, 72,154,157,157,189,240, 95,245, 32, 83,129,234, 90,228, 63,220,162, 85,233,
+175, 85, 83,174, 67,130,164,232, 46, 51,166,127, 78,140, 25,251,113, 78, 66, 98, 18,205,230,240,198, 94,184,120,209,162,117,235,
+214,164,110,235, 86,152,228,114, 24,231,206,237,124,229,202, 21, 99,200,216,241, 26, 14,139,216,227,233,225,110,113,228,208, 97,
+167,176, 19,199,187, 0,168, 79,104,241,156,156,156,246, 95,191,126,221,197,195,195, 3, 69, 69, 69, 72, 73, 73,129, 74,165,194,
+232,209,163, 57, 93,186,116,113, 25, 53,106,212,254,226,226,226,174, 13,176,108, 57,182,112,101,135, 79,159, 60,162,101,255,126,
+ 93, 68, 46,110,205,193,228,104,145,254, 58, 46, 48,252,250,253,217,123, 78,156,123,149, 80,204, 12, 66,205,185,145,234, 68,126,
+126,254,183,195,135, 15, 63,209,171, 87, 47,123, 62,159, 15,153, 76, 70, 12, 25, 50, 36, 47, 43, 43,107,217, 59,171,150,242, 20,
+ 54, 36, 73, 82, 85, 95,107, 72, 15,100, 14, 92,165, 82, 41,164, 82, 41, 0,184,188,239,147,167,181,181,245, 86, 75, 75,203, 81,
+ 74,165, 82, 67,146, 36, 67, 16, 4,163,215,235,133, 82,169,244, 89,108,220, 43,153, 78,167,107,177,126,211,111, 63,247,238,230,
+ 39,185,124,249, 50, 70,140, 24,193, 92,186,116,105,186,185,121,234, 8,130,216, 49,124,248,112,245,226,197,139,181, 9,137, 41,
+ 46,177,175, 18, 9,145,128, 71,219,217,217,113, 30, 62,124,200,254,233,167,159, 4, 75,151, 46,221,193, 48,204,168, 6,180,231,
+142,143, 63,254,216,240,245,215, 95,103,191, 76, 72,114,120, 30,155,192,136, 5, 28,147,157,157, 45,235,254,253,251,244,187,112,
+146, 36,185,253,219,111,191, 85, 78,159, 62,189, 80, 81, 80,236, 84,168, 44,101,248, 28,150,209,201,201,137,125,234,212, 41,221,
+193,131, 7,201,105,211,166,109,167,105, 58,164, 1,237,187,125,200,144, 33, 37,161,161,161, 69,241,137,201, 78,207, 99, 94,193,
+130,207, 49, 58, 58, 58,176, 30, 61,122,100, 88,191,126, 61,185,114,229, 74,179,202, 41, 18,137,246, 29, 61,122,148,125,234, 84,
+217,189,239,222,189,123,164,167,167,167, 69,213,125, 52, 90, 29, 72, 2,200,207,207,183, 8, 10, 10,218, 7,224,173,224,190, 1,
+203,226, 48,105, 1, 48,107,214,172,236,134,118,150, 0,231,217,245,238, 67,253,234,205,252,164,158, 50,140,205,102,211,211,166,
+ 77,203,169,254,189, 86,171, 37, 0, 12,193, 15,230,139,173, 1, 3, 6,124,119,246,236,217,230, 7, 14, 28,216,120,240,224, 65,
+ 61, 0, 8, 4, 2,187,195,135, 15,175, 25, 61,122, 52, 70,143, 30,189,248,248,241,227,255, 52,161, 69, 49,148, 1, 0,248, 2,
+ 62, 63, 46, 46,142,240,246,246,174, 51,226,190,129,166, 31,255,246,242,101,251,127,120,123, 7, 22,208,116, 11,110,255,254,165,
+243,230,205,203, 87, 42,149, 72, 73, 73,129,193, 96,192,164, 73,147, 88, 61,123,246,148,141, 30, 61,122,115, 73, 73,201, 72, 0,
+ 6, 51,250,228,122, 23, 23,151,207,138,139,139, 75, 43,172, 58, 93, 39, 80,236,238,254, 38,126,187, 22, 70, 30,151,101,226, 14,
+158, 75, 19,151,182, 18, 42,111, 15,220, 6, 0,174, 26,242, 6, 62, 12,212, 8,137, 43, 60, 40, 14, 86,218,187, 10,123,203, 83,
+ 53,203, 85,105,117,138,165,145, 34,145,104,152, 74,165, 58, 94, 62, 56,183, 28, 52,104, 16,238,223,191, 15, 0, 93,202,133, 86,
+111,146, 36, 63,161,105,250,119, 0,117,165,114,155, 61,116,232,208, 15,195,194,194, 44, 1,224,248,241,227, 48, 26,141,240,244,
+244, 4,151,203, 5,143,199, 3,135,195,169,204, 14, 98, 38,156,237,237,237, 96,103,197,129,212, 70,212,127,254, 47, 67,217, 77,
+ 90, 75,144, 71,189, 64, 1, 83, 4, 19,163, 3,215, 86,132, 86,193,214, 8,232,215,155, 60,179, 61,122,225,153,109,177,237,213,
+ 36, 6, 35, 21,186,191,203,200, 78,146, 36, 63, 42, 42, 10, 50,153,236,141,207, 89, 44, 22, 0,116,127, 7,202,197,137,137,137,
+ 65, 79,158, 60, 65,175, 94,189, 22,183,109,219,246,163, 27, 55,110, 56, 41, 20, 10,244,234,213,107,115, 70, 70,198,169,127,117,
+157,170,106,145,255, 22, 83, 23, 89, 77, 73,246, 44,123, 10, 38, 89, 44, 22,137,164,196, 20, 99,175, 94,125, 38,166,165,165,137,
+ 59,118,236, 72,114, 56, 28,168, 34, 34,160,125,244, 8, 98,177, 24,195,135, 15,231,220,188,121, 83, 34, 17, 75,166, 38, 39, 37,
+151,176, 88, 36, 24,134,172,215,231, 65, 42,149,206, 92,184,112,161,147,151,151, 23, 76, 38, 83,101, 68,115,147,201,132,244,244,
+116,136,197, 98, 76,152, 48,193,193,194,194, 98,166,153,245,104,214,210,211, 33,242,250,185, 29, 31,204,155, 49, 64,212,210,226,
+ 50, 68,233,115, 32, 62,254, 15,248,100, 93, 64,232,176,142,162, 75,219, 22, 7, 52,151,217, 68, 86, 49,177,154, 13,157, 78,119,
+ 59, 58, 58,122,234,141, 27, 55,104, 0,184,118,237, 26, 19, 27, 27, 59,253,125,158, 66,105,154, 70, 81, 81, 17,104,154,102,149,
+111, 87,188,254,191,246, 7,137, 68,178,253,163,143, 62,250, 56, 53, 53, 85,120,254,252,121,219,180,180, 52,187,228,228,100,251,
+150, 45, 91,178,215,172, 89,115, 86,171, 51,176,140, 20,163, 55, 81,198,146,236, 23, 47, 18, 11,115,115, 35,119,239,222,173, 33,
+ 8, 98,184,153,191, 49,210,217,217,217,118,193,130, 5, 32, 56, 22, 29, 90,249,180,245, 98,113,132, 86, 36,135,103,165,209,104,
+169,164,164,164,244, 5, 11, 22,184,251,249,249,201, 80, 54,189,102, 22,167, 76, 38,179,251,250,235,175,193,230, 91,250,183,243,
+ 11,104,206,227,139, 44, 89, 28,161,101,199,142, 29,123, 38, 38, 38,102,133,134,134, 58, 7, 6, 6, 54,136, 51, 48, 48, 80, 58,
+109,218, 52,147, 64,104, 25,228,225,225,233,211,174,141,207,192,150, 45, 91, 14, 99,179,217, 38,185, 92,158, 58, 97,194, 4,231,
+193,131, 7, 59, 54,132,211,193,193, 65, 26, 26, 26,106,114,107,234, 25, 28,252, 97,191, 78, 92,161,165, 21,155, 39,178, 86,171,
+181,212,203,151, 47, 83, 23, 45, 90,228,236,239,239,239, 96, 14,167, 90,173,230,216,217,217,193,215,215, 23,173, 61, 61, 81, 92,
+ 92,140,176,176, 48,236,217,179, 7,191,255,254, 59, 14, 29, 58,132,246, 93,251,193,210,210, 18, 89, 89, 89, 80, 42,149,156,127,
+119,135,162,126,245,102,182,232, 63, 27,242,249,231,159,103, 77,155, 54, 45, 71, 40, 20,210,213,255,108,108,108,168,113,227,198,
+229, 78,152,191,105, 72,197,212, 98, 61,150,172,168,115,231,206,189, 62,112,224, 0, 90,183,110,141,224,224, 96, 30, 0,204,156,
+ 57,147, 55,122,244,104, 28, 61,122, 20,199,143, 31,143,241,242,242,186, 3, 96,168, 57,229,156, 48, 97, 66,215,144,144,144, 91,
+ 33, 33, 33, 79,199,140, 25,179,115,250,244,233,111,140, 92,217, 89, 25,143,245,122, 61,252, 2, 2, 45, 86,236,122, 48,174, 62,
+190, 88,224,192,206,184,184, 61,107, 95,188, 72, 93,220,186,181,117,211,228,100,155,189,235,215,219, 85, 36,233, 54, 26,141, 72,
+ 79, 79,135, 84, 42,197,184,113,227,236,248,124,254, 4, 51,138,249,211,208,161, 67, 39,167,165,165,137,127,251,237, 55,231,167,
+ 79,159,202,178,179,179,157,175, 94,185,104,255,205, 87, 51, 45,173,196, 60, 94,150,156, 33, 0, 32, 57, 11,162,184, 36,116,101,
+ 24, 88, 87,157, 78,124, 39, 56, 67, 40,116,197,150,230, 93,173, 95,125,125,212,127, 76,104,120,128,157,212,153,191,160,142, 35,
+218,173, 91,183,238,216,153, 51,103,198,118,237,218,245, 4, 0, 97, 13,251, 8,218,183,111, 31,118,244,232,209,201,221,186,117,
+187, 13,192,183,214,167, 72, 87,215,225,127,254,249,167,109,197,182,157,157, 29, 4, 2,193, 91, 34,139,203,229,130, 36,201, 6,
+ 87,111,213,225,177,108, 27, 31, 29,162, 11,207,225,232,186, 40,172,235,255,146, 94,221, 57, 89,183,117, 66, 28, 46, 29,141, 66,
+ 30,162, 48,224, 31,205, 49,118,145, 95, 95, 11, 10, 43,255, 78, 3,184, 92, 46,255,164,123,247,238,199, 6, 12, 24,160,123,242,
+228, 9,228,114, 57, 92, 92, 42,159,181,115,222,129,210,198,194,194, 2,110,110,110,240,242,242, 26,123,243,230, 77, 39,163,209,
+136,228,228,100,228,229,229, 69,254, 59,234, 84, 85,139,252,135,161,186, 35,252,217,183,132, 86,121,110,161,235, 0,192, 16,132,
+ 42, 42, 58,154,195,226,241,198,255,113,240, 32,159,203,229, 34, 53, 53, 21, 49, 49, 49, 80, 95,189, 10,205,221,187,200,205,205,
+ 69,105,105, 41, 28, 29, 29,177, 99,215, 46,145,158, 98,166,188,124,245,138,197,144, 76, 85,127,131, 26,151,120,242,249,252,190,
+ 35, 70,140,168, 85,144,101,101,101, 97,192,128, 1, 28, 22,139, 85,211,170,134,234,156,132,204,158, 56,115,245,196, 10,103,103,
+ 94, 12,144, 48, 15, 40,137, 4, 24, 29, 96,210, 3,153,207,129,179,203,208,180, 52,142,184,184, 98,162,147,139, 5,251, 76, 13,
+ 74,185,190,165,168,158,222,222,222,191,143, 31, 63,158, 4,128,222,189,123, 19,222,222,222, 59, 1,120,214,113,204,149,122, 6,
+201,251,133,133,133, 24, 61,122,180,109,243,230,205,175,140, 30, 61,218,182,226,243,119,229,172,176, 38,183,110,221, 90, 33, 16,
+ 8, 14, 1,102,221, 96, 43, 57,173,173,173,183, 14, 24, 48, 96,212,193,131, 7,185, 0,112,253,250,117,156, 57,115, 6, 47, 94,
+188, 64,124,124, 60, 29, 16, 16, 96,191,233,247, 99,219,183,254,186,239,167, 97, 93,252,100, 61, 59, 4,248,136, 75, 11, 75, 29,
+ 29, 29,187, 48, 12,227,105,102, 57, 7, 44, 91,182, 44, 38,246,117,170, 21,201,230,176,185, 28, 54, 95, 34, 17, 57, 74, 45, 69,
+174, 54, 22, 2, 23, 62, 73,136,213,106,117,206,161, 67,135,104, 0, 3,204,229, 92,177, 98, 69, 82,108, 66,170, 53, 65,178,217,
+ 28, 54,135, 43, 22, 91, 88,247, 15,238, 21, 8, 0, 92, 48, 92,165, 82,153,187,103,207, 30, 67, 67, 56,151, 44, 89, 18, 93, 80,
+ 84, 42,101,115, 56, 28, 54,155, 85,217,150, 34,161,208,222,130,207,231,233,116,186,204,159,127,254, 89,211, 16,206,101,203,150,
+197,188,124,157,102, 67, 18, 4,139, 32, 72,182,196, 82,100,107,107,101, 97,111, 47, 22,218, 89,176, 89, 60,165, 82,153,185,127,
+255,126,179, 56, 13, 6, 3, 55, 55, 55, 23,177,177,177,112, 11, 12,196,229,203,151,209,164, 73, 19,140, 30, 61, 26, 31,127,252,
+ 49,132, 66, 33,122, 7,181,197,130, 5, 11,240,250,245,107, 24, 12, 6,126, 77,156, 21,126, 82,213, 33,147,201,158,212,215,121,
+170, 29,251, 70, 57,253,157,192,108,209,127, 54,164,170,192,170,141,223,198,198,134,170,201,218, 85,157,115,192,128, 1,223, 93,
+189,122,181,249,254,253,251,135, 76,152, 48,225,246,254,253,251,209,169, 83, 39,196,198,198,194,221,221, 29,123,247,238,197,199,
+ 31,127,124,123,243,230,205, 67,158, 60,121,226,231,225,225,177,176, 62,206, 49, 99,198,124,225,239,239, 31,145,147,147, 19, 84,
+ 80, 80,224, 27, 22, 22, 54,101,248,240,225, 73, 99,199,142,237, 83, 41, 24,141,198,131,103, 79,159,192,192, 33, 35,208,170,141,
+239,246, 73, 11, 15,180,173,231,218,100, 94, 0, 59,247,100,103,203, 15,106,181,234,209, 28,142,133,197,131, 7, 54,199,127,253,
+213,174,106,102,129,204,204, 76, 12, 30, 60,152,195,229,114,187,213, 83,206,117,195,134, 13, 27, 29, 22, 22, 38,173,176,234,220,
+189,123, 23,207,159, 63, 71, 74, 74, 10,138,138,138,208,103,122, 41, 62, 95, 83,198,253,249, 26, 6,253,102, 50,162,119,188,135,
+ 84, 66,216, 4, 78,182, 18,246,157, 41, 63,183,154,249,217,246,214,108,177, 13, 7,127,204,143, 71,126,178,238,120, 45,156, 68,
+ 80, 80,208,129,144,144, 16, 66,175,215, 67,175,215,235, 1,212, 24,213,215,197,197, 69,208,174, 93, 59, 76,159, 62,157,148, 72,
+ 36,155,107, 43,167, 74,165,210,157, 59,119, 14, 19, 38, 76,192,156, 57,115,208,162, 69, 11, 72,165, 82,112, 56, 28,236, 59,112,
+196,238,227, 41, 51, 90,126,208,181,187, 95,235, 15, 58,181, 43,209,177, 2, 57, 66,233,180, 90,172, 33, 53,214,189,212,225, 9,
+162,147,239, 97,203,144, 12,250,225, 94,117,233, 55,159,252, 24,247,242, 70,238,139,133, 33, 59,163,153,123,157,243, 15,124,153,
+134, 92, 99, 44,186,141,110, 10, 15,127,233, 92,145, 27,188,223,181, 61,205, 68,131, 56,219,182,109,219,245,225,195,135,252,238,
+221,187, 35, 53, 53, 21, 28, 78,229,243, 20,245, 62,229, 92,182,108, 25, 95,171,213,226,217,179,103,152, 56,113, 98,166,193, 96,
+152,251, 62,229,108,136, 69,171, 66,139,252,135, 97,103,181,191,236,218, 44, 90,203, 0,192, 72,227,204,248,137, 83,212,225,225,
+225, 22, 60, 30, 15,169,169,169,200,206,206,198,190, 61,123,168,222, 14, 14, 37,193, 46, 46,202,125,123,246, 48,122,189, 30, 12,
+195,192,219,219, 27,163, 70,141, 18,142, 28, 61, 54,143, 80,106,142,152, 49,205,227, 92, 49,191, 62,101,202,148,183,190,255,230,
+155,111, 32,145, 72, 64, 16,132,147, 25,149, 11,153,189,108,152,171,212,195, 58,151,201,217, 87, 0,150, 0, 96, 91, 2,108, 9,
+ 32,176, 2,248,150, 0,207, 2,186, 39, 17, 5, 36, 19,156, 50,162,219,167, 46, 0, 26, 50,213, 3,153, 76,182, 56, 34, 34,194,
+254,201,147, 39,140, 82,169, 68,118,118, 54,179,122,245,106,123,153, 76,182,248, 93,207, 72, 86, 86,214,138,129, 3, 7,230, 78,
+156, 56,209,234,194,133, 11,110, 19, 39, 78,180, 26, 56,112, 96,110, 86, 86,214,138,247, 57,211, 92, 46,151,245,226,197, 11,155,
+149, 43, 87,126, 12,224,113,155, 54,109, 20, 46, 46, 46,143, 81,230, 52, 89, 39, 44, 45, 45, 43, 69, 86,133,117,141,205,102,131,
+195,225, 64, 38,147,233, 11, 10, 10,168,110, 31,120, 10,189,173, 72,163,140,207, 21,218, 8, 5,174,150, 18,171,142, 10,133, 34,
+138, 32,136, 68, 51,167,248,252, 59,116,232,192,161, 24, 14,253,249,248,222,178,153,147,123, 57,252,178,114, 90,147,159, 87,124,
+230,178,110,233, 84,239, 21,223,142,235, 69,210,180,214,221,221,221,169,194,161,221, 12,243,121, 64,251,246,237,217, 52, 56,136,
+125,149,146,155,154,145, 89,242, 97,207,160, 74,203,101,107,255,128, 96,123,123,251,238,222,222,222,237, 9,130, 48,107, 73,178,
+ 80, 40,244,111,213,170, 21,155,100,113, 8, 91,169,165,155,165, 88,232, 88, 57,133, 98,109,221,217,198,222, 62,132,100,152, 98,
+103,103,103, 7,161, 80,232,223,128,186,179,105,112,225,232, 96, 99,101,111,103, 45, 14,238,213,165, 69, 80,231,160,150,109, 59,
+118, 10,106,243, 65,251,145,132,201,164,244,244,244,116,168,112,146,175,199,210, 42, 56,120,240, 32, 86,174, 92,137,118, 77,155,
+194,197,197, 5, 14, 14, 14,184,123,247, 46, 30, 62,124, 8,169, 84,138,188,188, 60,172, 95,191, 30, 39, 79,158,132,193, 96,176,
+108,104,127, 50, 71,108,213, 5,147,201, 68, 86, 23, 88,181,241, 11,133, 66,186,194, 73,190, 54,156, 59,119,238, 64,133, 37,235,
+203, 47,191,236,186,105,211,166,219,113,113,113, 16,139,197,120,248,240, 33,166, 76,153,114,123,243,230,205, 93,103,204,152,129,
+ 61,123,246, 32, 41, 41,105, 87, 93,124, 99,198,140, 89, 58,117,234,212,159,111,220,184, 65, 58, 58, 58, 66, 42,149, 98,216,176,
+ 97,173,135,220, 38, 0, 0, 32, 0, 73, 68, 65, 84,216,181,107, 23,219,100, 50,237, 14, 9, 9,121, 26, 18, 18,242,148, 74,191,
+244,221,177,223, 87,223,141,142,122,138, 47,102,127,205,211,155,140,161,102, 84,159,209,136,197, 37,166,238,221, 11,142, 26,141,
+234, 49, 92,174,133,213,211,167, 54,103,118,239,174, 20, 91, 11, 22, 44,128,149,149, 21, 80,230,192,140, 58,172, 58,159,157, 60,
+121,178,242,126,104,107,107, 11, 30,143, 7, 46,151, 11, 14,135, 3, 22,139,133, 43,219, 69,248,117, 65,153,190,248,117, 1,129,
+ 75, 91, 9,213,251,156, 59, 11, 23,248, 74, 29,121, 79,255,177,183,141,159,111, 31, 91,220, 61,156,131,213, 3,159,100, 60, 60,
+ 42,159,167,205,195,134, 90, 14,251,224,155,111,190,105,157,151,151,135, 71,143, 30,225,209,163, 71,181, 89,128,180,167, 79,159,
+254,161,180,180, 20, 30, 30, 30, 24, 58,116,104,119, 0,129,181, 92, 55,104,223,190, 61, 6, 15, 30,140, 94,189,122,161, 93,187,
+118,208, 27, 76,156,144,241,159,181,122,145, 36,119, 89,189,126,181, 69,196,181, 48,242,246,237, 27,172, 3, 39, 46, 89, 5,245,
+234,247, 51,215,210,249, 62,132,182,206,230,212, 83, 77, 41,224,239,220, 31, 59,175,206, 38,183, 92,159, 40,222,119,102,139,167,
+165,165, 37, 17,249,232,169,113,223,182,163,105,190,162,161,121,247, 15, 43,160, 38,114,208,103,178, 7, 73, 3,163,254, 46, 35,
+187, 64, 32,216,116,227,198, 13, 39,131,193,128,232,232,104,204,153, 51, 71,251,158,148,149, 6, 16, 55, 55, 55, 92,191,126, 29,
+227,198,141,211,230,230,230,222,251,119,213,169,170, 22,249,111, 1,187,138,130,172, 68,122,122,122,145, 84, 42,117,105,213,170,
+ 21,169,215,235,203,166, 36,142, 31,167,126,223,189,251,172, 86,171,157, 13,128,187,245,151, 95,182,187,184,186,246, 26, 63, 97,
+ 2, 97, 52, 26, 49,112,224, 64, 94,120,120,184,109, 98, 94, 94,137, 25, 3,206, 27,191, 55,105,210, 36,108,218,180, 9, 0, 48,
+107,214,172, 74,211, 58, 97,134,195,146,216, 10, 3,130, 7,181,151,164,139,182, 72, 12,157,141,165,205, 94, 91,222, 23,149, 10,
+219,131,228,177, 33, 96,129, 54, 24, 77,241,121,195, 31,191,142,247,105, 45, 44, 80,184,247,109,211, 3,191, 95,222, 63, 64, 77,
+105,143,154,125,195,177,176,232, 32, 22,139,241,248,241,227,130,246,237,219, 23, 49, 12, 99,181, 98,197, 10, 59, 11, 11,139, 14,
+239,209,246,201,175, 94,189,234,222,165, 75,151,153, 36, 73,246,165,105,250, 74,110,110,238, 86, 0,201,102, 30,255, 57,128, 37,
+ 0, 42,159, 44,245,122, 61, 72,146, 4,195, 48, 24, 51,102, 12, 22, 44, 88,208,250,249,243,231,136,136,136,176,233,219,183,239,
+125, 0, 69, 0, 62, 5, 80,163,213, 76,169, 84,106, 30, 62,124, 40,140,136,136, 0, 77,211,176,177,177,129, 68, 34, 1,159,207,
+199,176, 97,195,196,161,161,161,125, 46, 94,188,152,167,108,214,132, 37,200,206, 84,241,197, 98, 75, 56,185,116,155, 49,246,147,
+ 56,134, 97, 78, 54,224,230,192, 19,178, 77, 90,130,210,145,235,190,223, 76, 90,112,185,132,128,203, 6,159, 86,227,187, 31, 86,
+ 17, 92,134, 98,163,129,243,243, 92, 46,151,107,201,135,158,197, 99, 25, 45, 8, 48,255,140,139,131,197, 98,241, 4,220,218,253,
+ 49, 56, 36, 73,146, 36,201, 5, 96,118,210, 62, 62,159,207,181,228, 51,181,114, 10, 89, 4,139, 32, 8, 30,106, 89,137,230,239,
+ 4,166,194,138,196,155,157,168,171, 42,138,187,117,235,134,179, 17,143,113,252,204, 21,228,167, 70, 97,209,252, 47, 17, 24, 24,
+136,240,240,240, 58,203, 84,225,163, 85,155,117, 89, 38,147, 61,201,202,202,250,160,182, 99,235,154, 50,172,197, 74,245, 54,255,
+247, 86, 8, 88, 22,135,122,124,180,134,118,235,214,237,139,131, 7, 15,234, 63,250,232, 35,222,152, 49, 99,224,235,235,219,117,
+242,228,201, 0,128,190,125,251, 98,211,166, 77, 93, 39, 79,158,140, 35, 71,142, 32, 44, 44, 76,215,179,103,207,249,215,175, 95,
+207, 68,217,138,206,183, 64,211,244,224, 29, 59,118, 84,183, 20,194,100, 50,193,104, 52, 58,155, 76, 38,231,242,123, 17,126,254,
+121,115,254,165,139,225,152,191,112, 25, 28,236,157,252,205,236, 67,196,164,175,191,206,223,187,126, 61,214, 31, 57,130,175,221,
+221, 45,246,199,196,224,146, 86,139,163, 17, 17,249,229,191, 83,175,111,166, 74,165,210,156, 59,119, 78,114,244,232, 81, 88, 91,
+ 91,163, 69,139, 22,176,177,177, 1,135,195, 1,201, 18,130,197,149,162, 85,155, 14, 0, 30, 2, 0,220,101, 80,121,123,224, 54,
+ 65,160,136, 33, 27,238, 83,196,111,130,102,118,174,130, 27, 95,236,241,181,150, 56,112,113, 97,107, 26, 46,110, 73, 63,169,205,
+199, 70,152,240, 18,181,251,124,181,247,240,240, 64, 94, 94, 30,206,157, 59,167, 2,106, 21,100,160,105,250,135, 95,126,249,229,
+155,133, 11, 23,242,189,189,189, 1,192, 31,192,163,154,246, 21,137, 68,112,113,113,169, 20,150, 99, 38,206,240,156, 62,111,134,
+112,120,191, 94, 96,179,237, 80,164, 50, 66, 81, 98,132,212, 78,140,249,243, 66, 4, 87,218,187, 4,238,216,252,199,105,141, 6,
+129,192,219,247, 3,130,192,163, 7, 81,183,219, 10,188, 1,130, 4,210,201,107, 32, 64,160,148, 48,130, 96,177, 24,138,162,144,
+150,150, 6,134, 97, 48,110,248,148,244,207, 86,135, 57,116, 29,167,132, 91, 43, 25, 8, 6, 61,254, 46, 66,192,214,214,214, 95,
+161, 80, 32, 57, 57, 25, 19, 39, 78,204,204,207,207,191,172, 82,169,166,100,101,101, 1, 64,193, 59, 80, 86,138,121,127,127,127,
+116,232,208, 1,163, 71,143, 22,168,213,234, 16, 79, 79, 79, 23,185, 92,222,249, 95, 89,159,234, 90,228,191, 74,104,213,120,161,
+ 25,141,173,116,219,183, 67,117,229, 10,120,151, 46,225,168, 76, 86,170,213,106,191, 2,144, 94,126,225,127,185,103,239,222, 59,
+ 67,238,221,147,232,227,226,224,249,252, 57, 56,214,214,254, 13, 45,192,238,221,187,161, 84, 42, 81, 92, 92, 12, 0,216,178,101,
+ 11,148, 74, 37, 76,102, 38,156,101,115,209,213,201,193, 29, 57,136, 7,205, 38,197, 41,173,212,157,196, 90,203, 44,151, 52, 71,
+ 85, 49,233,130,184,212,142, 34,141, 66,223,137, 96,233,161,205, 87,195,165, 75, 11,176,193,238,218,144, 50, 86,204,251,179,217,
+236,130, 87,175, 94, 13,110,217,178,229, 25, 0,118,239,226, 15, 80, 13, 9,185,185,185,179,223,229, 64, 22,139,181, 36, 41, 41,
+201, 97,215,174, 93, 51, 87,172, 88,193, 84, 21, 90, 21,239,217,108, 54, 24,134,129,149,149, 21, 56, 28,142,227,221,187,119, 29,
+ 59,118,236,184,141,166,105,255, 90,234,201,248,250,250, 34, 41, 41, 9,108, 54, 27, 86, 86, 86,160, 77, 6, 44,155, 55, 3, 20,
+139,207,254,246,219,111,253, 71,140, 24, 17,189,107,215, 46,163, 36,168, 75,103,133, 66,241,226,139,113,227,163, 79,157, 58,165,
+ 47, 15,241, 80,255, 35, 62,195, 60,141,143,143,103,185,202, 28, 89,140, 73, 77,139,184,128, 32,234,103,134, 39,118,130,128,205,
+ 98,184, 4, 9,190, 64,104,149,156,145,161,160,105, 58,214, 28, 78,154,166, 35,147,146,146,132,142, 14,182,108,181, 70, 95, 42,
+228, 48,188,148,200,199,137,205, 2,218,123, 2,128, 54,242,225,117,126, 43, 31, 97, 74,174, 92,228,238,238,110, 22,167, 70,163,
+121,154,153,153,201,114,116,116,100,167,166,103,156,182, 22,139,236, 37,214,214,157, 0,192, 80, 82,252,144,212,233,228, 44, 14,
+219, 81,174, 80, 20,104, 52,154, 36,115,235,254,250,245,107,182,179,179, 3,235,194,165,171,103, 28, 45,248, 14,150, 60,182,132,
+ 79, 16,132, 5,139, 80,114, 77,116,190,192,194,194, 33, 57, 35,163,128, 97,152, 90, 45,132,107,139,198, 15, 47, 59, 95,203,142,
+ 84,225, 70, 84, 84, 20,206,223,142,133,136,209,131,208, 22,227,210,158,223, 48,238,219,133,239,237,247, 87,159,216,122, 39,107,
+214, 14,159, 39,213,248,145, 93,143, 35,252,184,113,227,150, 29, 56,112,160,210, 1, 37, 54, 54, 22,189,123,247,174,152,230, 64,
+112,112, 48, 58,118,236,136,216,216, 88,120,121,121, 33, 34, 34,130,207, 98,177,248,227,199,143, 95,253,199, 31,127,156,171,215,
+238,191,115, 39,166, 76,153, 82,147, 99,245,107, 0, 90, 66,234, 93,186, 96,237, 62,187, 2, 69, 62,242,228, 57, 79,205,109, 7,
+130, 32, 48,233,235,175,243,119,232,245, 56,248,224, 1, 38,136, 68, 22,123, 19, 18, 48,176, 99, 71,180,237,221, 59,223,156,123,
+ 93,133, 85, 71,171,213,130,195,225, 64, 34,145,192,214,214, 22, 92, 46, 23, 44,142, 12,108,158, 31, 72, 46, 23, 1,221,252,176,
+254, 43,145,122, 98,127,108, 38, 8, 20,241,121,136,228, 90,212,234,171, 67,136,154, 96, 24,195, 64,169, 78,199,181, 10, 65, 98,
+213, 20, 86, 28, 75,206,165,169,219,188,173, 37, 14, 92,156,223,156,138, 75,219, 50, 78,104,115,176,168,188, 45,232, 58, 30, 36,
+218, 90, 91, 91, 35, 61, 61, 29,105,105,105, 49,168,219,193, 95, 29, 27, 27,155,200,231,243, 91,219,219,219, 3,128, 71,109, 15,
+230, 52, 77, 87,250, 97,237, 63,120,204,206,191,187,167,224,195,174,173,177,239,204, 42,252, 35,100, 51, 56, 44, 2, 20,101,192,
+198, 77,131, 64,233, 74, 17, 50,228, 51,162, 71, 95, 47,191, 43,103,244, 83,141,154,194,223,222,122, 16, 96, 99,229,143, 31,223,
+181,230,139,201,182,160, 9,107, 59, 59, 7, 17,151,203,133,173,196, 89,191,112,250,220,108,134, 97, 42,175, 27, 14,139,107, 36,
+ 75,108, 52,138,156, 82,161, 53, 71, 3, 48,100,179,119,139,102,243,207, 71, 70, 70,198,236,238,221,187,175, 46, 41, 41, 41, 84,
+169, 84,227, 0,192,195,195,163, 41, 73,146,124, 0,117,205,142, 52, 69,205, 97, 33,184,207,159, 63,135,165,165, 37, 50, 51, 51,
+171, 26, 95, 64,211,244,223,102, 17,192,223, 20, 1, 0, 34, 1, 56, 3, 24,136, 42,225, 29,200,114, 83, 93,143,240,240,112, 38,
+ 60, 60,188, 71,229,224,197, 48,180,169,160, 0,140,174,172,109, 57, 28, 14, 3,160,234,138, 38, 11,107,107,107,130,227,234, 10,
+130, 95,230,250,193,252, 19,151,190, 26,141,230,133,150,161, 41,176, 64, 24,192, 84,121,104, 81, 9, 8,172,178,235,131,217,188,
+197,200,225, 89, 87, 29,233, 0, 19, 3, 10, 52,171,129,197, 97, 84, 42, 21, 76, 38,147,180,121,243,230,103, 77, 38,147,180,124,
+112, 99,254,191,206, 40, 69, 81,137, 44, 22, 11, 51,103,206, 68,133,245, 71,175,215, 35, 39, 39, 7, 58,157, 14,122,189, 30, 73,
+ 73, 73, 40, 46, 46,134, 94,175,199,139, 23, 47,224,225,225, 1, 22,139,229, 92,199,205,156, 97, 24, 6,110,110,110,104,214,172,
+ 25, 88, 4,131,223,215, 45,197,119,115,102,224, 99, 15, 26,187,183,110, 68,207,158, 61,125,220,221,221,131,216,108, 54,229,228,
+228,196, 13, 11, 11, 59, 77, 81,212, 48,152,127,231, 57,183, 96,193,130,102,109,218,180,113,176,150, 88, 26,249, 60, 22,120, 70,
+ 21,195,215, 41, 24,182, 58, 31,110,110, 77, 77, 16, 90,120, 77,152, 48,129,170,205, 10, 81, 19,231, 87, 95,125,229,236,237,237,
+109, 37,181,182, 84,241, 56,172, 60, 46,152,252,226,168, 71,247, 1,128,103,239,160,133,192,162,245,196,137, 19, 77, 13,225, 92,
+188,120,177,135,189,189,189, 53, 9,166,132, 50, 24,254,154,111,215,233, 21, 4,135,163, 1,151,215,126,214,172, 89, 68, 67, 56,
+191,249,230, 27,247,214,173, 91, 91, 91, 75, 68,165,108, 14, 43,155, 75,211,217, 2,208, 57, 28,189,161, 80, 96,111,167,134,133,
+ 56, 96,194,132, 9,181,114, 86, 88,179, 66, 67, 67,211,171, 9,111, 20, 20, 20, 64,155, 19, 13,110,102, 28,252,196, 28, 4,218,
+ 75,193,231,243, 43,151,190,215,214, 93,107,243,209,170, 73,108,153,123,108,251,229,117, 76, 1,238,240,121, 82, 61,110, 86, 86,
+ 86, 22,156,157,157,235,188,158,254,248,227,143,133,189,122,245,202, 11, 14, 14,214,159, 61,123, 22, 4, 65, 32, 34, 34, 2,153,
+153,153, 8, 14, 14, 6,195, 48, 21,171,218,240,244,233, 83,244,237,219, 87,223,189,123,247,204,242,248, 90,245, 98,202,148, 41,
+ 48, 26,141, 40, 45, 45, 69, 65, 65, 1,194,195,195,225,231,231,199, 88, 88, 88,140, 96,185,245, 91, 21, 50,117, 97,103,223,118,
+254,216,182,121,189,158,199,230,172,109,200,245, 74, 16, 4, 38,126,245, 85,126,113, 64, 64,193,126,149, 74, 61, 73, 34,177,104,
+158,158,110,243,248,226, 69, 59,131,193, 96, 22, 71,133, 85,199,213,213,181, 82,100,113,185, 92,176,121,246, 96,137,218,130,103,
+ 27, 12, 11,167, 17,184, 22,201,215, 89,137,112,210, 82,140, 11, 34,235,218, 67, 59, 88,184, 97, 85,231, 49,206, 97, 93, 62,118,
+190,106,209, 4,187,202,199, 3,146, 97, 19, 97,147, 55,182,108,110,223, 76,136,123,199,114,112,105, 91,198,159,218, 28, 44, 5,
+144, 80,223,117,110, 48, 24,180, 20, 69,129, 36, 73,176,217,236,170, 62,129,119,254,252,243, 79, 60,126,252, 24,168, 18,182,167,
+164,164,132, 98,177, 88, 16, 8, 4, 0, 32,174,227,126, 7, 14,135, 3, 14,135,131,235,247,111,218,126, 60,114, 16,113,247,217,
+101,116,241, 27, 11, 69,169, 1,185,197, 6, 20,169,129, 54,129,139,224,219,247, 36,162,146, 74,224,223,206,151,197,226,137, 38,
+214,196,167, 77, 70,186, 42, 13,163, 20, 49,116, 11,125,134,240,252,189, 83,177, 49, 55,143, 71,189, 56,252,203,153,132,206,129,
+221, 85,229,198, 4,148,150,150, 50, 4, 65, 48,115,167, 45, 76,220, 63,165,144,218, 60, 46,138,102,235, 4,175,255,141,183,250,
+166,246,246,246,119,109,109,109, 35,202,197, 81, 83, 75, 75,203, 59,206,206,206,113, 40, 91,232,113, 42, 59, 59,219, 91,165, 82,
+117, 65,217,226,172, 84,133, 66,209,187,220,242,148, 90,135, 37,108,151, 82,169,252,146,162,168, 33,229,127,253, 41,138,242,143,
+143,143,111,237,239,239, 31,227,233,233,249,212,211,211,243,188,167,167,231,105, 79, 79,207,211,189,122,245,218, 84, 17,238,225,
+ 95, 60,109,248,150, 22,249, 15, 19, 90, 40, 23, 89, 59,203, 95, 81, 41,180, 0, 92,175,238,128,102,226,243, 95,152,190,248, 2,
+214,167, 79,131, 19, 31,143,201, 19, 39, 74, 44, 44, 44, 54,163, 44, 70, 83, 23,177, 88,188,109,233,210,165,150,118,107,214, 64,
+118,243, 38, 82,194,195, 97,228,112, 30,189, 75,233, 52, 26, 13,216,108,118,165, 37, 70, 36, 18,129,162, 40,212,100,242,125,235,
+ 2, 52,225, 94,102,110, 28,120,104, 6, 26, 76,233, 5,101,247, 7, 99, 19, 23, 57,132, 43, 61,188, 18, 84, 92,175,229,246,157,
+ 28, 54, 55,237,250, 64, 69,176, 75,121,214, 2,164,165,165,131, 2,221,160,249,102,173, 86, 91,172, 82,169,224,239,239,111,251,
+248,241,227,230,126,126,126, 54,229,159, 63,124,207, 19, 19, 36,147,201,142,185,184,184, 36,203,100,178, 99, 0,130, 26,112,236,
+174, 91,183,110,129,197, 98, 97,233,210,165, 40, 41, 41,129,193, 96,128, 66,161, 64, 90, 90, 26,244,122, 61, 50, 50, 50,240,242,
+229, 75,232,245,122,164,164,164, 64,167,171,255,129,132,166,105, 72, 36, 18,104, 53,165,248,117,213,119, 88, 28, 58, 15,197,175,
+159, 32, 35, 43, 23,214, 86, 34,204,158, 61,155, 37,149, 74,105,154,166,155, 81, 20,213,151,166,233,237,230,156,167, 42,253,237,
+182,155,155,155,239,186,117,235, 90,127,183,106, 59, 87,194, 46,101,248,150, 2,154,103,201,103,120, 62,157, 48,101,209,102,238,
+207, 63,109,120,117,239,222,189, 76,152, 23,188,147, 4,112, 59, 32, 32,160,101,102,102,166,159,183,183,119, 43,187,166,238,124,
+190,179, 75, 17,215,185,137,146,209,105, 31, 16, 46, 77,186,109,223,190, 61,250,206,157, 59, 89, 13,225, 20,137, 68, 62,251,246,
+237,243,117,116,116,244,229, 8,133, 2,117,113,241, 81,147, 90,117,140,101, 45, 21,144, 18,235,254, 39, 79,158,124,114,226,196,
+137,156,134,112,122,121,121,121,175, 90,181,170, 77,219,182,109,219, 56,121, 52,231, 11, 93,220, 20, 2,215,166, 10, 97, 91, 63,
+ 62, 92,155,125,180,109,219,182,167,247,238,221, 51,139,147,197, 98,153, 72,146, 4,135,195,129,133,133, 5, 46, 92,184,128, 47,
+166,142,133,155,139, 45, 90,121,123,163,207, 63,190,196,137, 19, 39, 42,125,120, 88, 44, 86,173, 35,250,222, 53,179,207, 4, 56,
+ 19, 79,176,195,231, 9,118,248, 60, 9,112, 38,158,212, 42,182,202,191,175,105, 31,179,238, 70,181, 76, 55,154, 33,182,206, 93,
+191,126,253,135, 73,147, 38,241, 6, 12, 24,128, 7, 15, 30, 96,202,148, 41,183,195,194,194, 0, 0, 15, 30, 60,192,220,185,115,
+111, 95,189,122, 21, 51,102,204, 64,239,222,189,121,183,110,221,218, 6, 51, 98,255,152, 76, 38,236,222,189, 27, 38,147, 9, 98,
+177, 24, 54, 54, 54, 24, 52,104, 16,162,163,163,103,236,217,179, 39,142,197,225,124, 50,112,200, 72,156, 61, 29,134,151, 47,162,
+103,236, 93, 61,190,193, 65,129, 73,146,196,128,137, 19,243,243,219,180, 41,216,171, 84,170, 63,149, 74, 45,188,115,114,108,174,
+ 29, 59,102,103,134, 80, 35, 40,138,170, 20, 87, 21,162,163,226,143,205,179, 7, 91,228, 11,182,101, 32,162, 18,184, 70,110, 71,
+ 68,242, 2, 17, 91, 87,252, 44, 14,143,156, 50,226, 59, 15,140,248,206, 3, 67,191,117,159,108,209, 4,191,139,154,224,243, 1,
+115,154,245,242, 12,180,130, 50,207,128,240,141, 41,169, 90, 5,214, 0,120,105,206,117, 78,211,116, 76,102,102, 38,120, 60, 30,
+154, 52,105,210, 18, 64,133, 95,224,174,105,211,166,205, 90,190,124,249, 60, 0,203,203, 63, 19,247,234,213,171, 77,105,105, 41,
+226,227,227, 1,224,113, 29,214,224,202, 85,134, 5,202, 20,190,187,172, 45,252,124,166, 67, 42,109,135,204, 2, 61,178, 10,244,
+248,253,215, 97,120,114,107, 37, 30, 95,154,128,212,156, 28, 8,157,134,131, 50,233,124,205,120,168,151, 61,123,246,140,184,117,
+235, 22, 65,211, 52,140, 70, 35, 83,162, 84, 50,145,183,111, 67,115,227, 6, 33,145, 72,136,174, 29,186,151,238, 93,121,246,225,
+201,173,183, 31, 27,212, 13,126, 80,127, 31, 44, 78, 76, 76, 12, 58,118,236, 88, 47, 0,139,255,143,189,235,142,111,170,122,223,
+207,189,217, 77,154,180, 77,103, 58,104,161,208, 82, 90,160,204,178,135,160, 32, 5,145,253, 69, 16, 16, 40, 2,130, 56, 64, 20,
+ 84,246, 18, 69, 17, 25, 21, 20, 80, 65,150,178, 4,100, 72, 41, 32,123,149, 82, 90, 70, 75,247,204,104,147,102,223,123,127,127,
+180,137,105,233, 72, 10,168,248,203,243,249,220, 79,114,111,110,158,156,123,115,207, 57,207,121,207,123,222,183, 85,171, 86,127,
+102,102,102,118, 57,115,230, 76,243,192,192,192,181, 13, 37,181,132,133,200,200,200,168,178, 85,134,133, 48, 84,138,134, 1,149,
+ 98,110, 48,128,119,240, 4,171,236, 29,192,233,231,216, 25,254, 48,170,173, 54,172, 46,180,108, 3,133, 33,212,195, 67,108, 50,
+ 25,179,143, 31, 63,110, 36, 73, 18, 66,161, 16,227,223,120,131,220,176,126,125,247,209,157, 59,159,138,123,241,197, 35,167, 78,
+158,108, 27, 19, 19, 3,134, 97, 64,146, 36,126,254,249,103,173, 78,167, 45, 9, 10, 10,114,183,167,209,176,173, 64,165,165,165,
+ 86,161,165, 82,169,224,235,235,107,247,212,161,166, 20, 39, 78, 30,189,170, 96,168,105,153, 3,238,173, 49,174,200,127, 53, 70,
+ 73, 83,108, 21,101,130, 74,203,160, 76, 7,246, 69, 82, 26, 51, 62,108,136,241, 97,223,152,187, 9, 41,231, 75,116,148,206,161,
+213, 18,133,133,133,243, 70,140, 24, 81, 34,147,201, 8,137, 68,130,128,128, 0,114,240,224,193,197, 89, 89, 89,139, 26,250,143,
+120,122,122,254,175,119,239,222, 7,115,114,114,134, 39, 36, 36,132,156, 57,115,102,120,239,222,189, 15,122,122,122,254,207, 78,
+138, 93, 31,125,244,145,134,199,227,161, 83,167, 78, 40, 43, 43, 67,229, 42,159, 58, 55,123,166, 72,185, 92, 46, 54,173,250, 20,
+ 31,207,125, 23,242,148,139,184,121,246, 56, 78,231, 19,152,191,244,115,112,185,220, 6,197,250,106,230, 45,108,213,202, 95,124,
+231,157, 55, 70,229,126, 56,119,174,248,250,245,235,156, 25,111,191,195,100,228,201,193, 27,176,154,133,158,243,200, 27, 26,111,
+196,190,220, 7, 11, 62,126,191, 85,101,208,206, 58,209,194, 91,216,170,165,191, 56,249,253,184,209, 15,222,126,251,109,151, 21,
+ 43, 86,232, 58,119,238,172, 45, 40, 40,112, 17,121, 72, 35,216,110,238, 45, 51,242,242, 93, 59,119,238,252,112,218,180,105, 74,
+ 71, 57,231,207,159, 47, 60,118,236, 24,123,196,136, 17,102,133, 66,225,202,113,113,105, 67,240, 5, 29,139, 20, 10,183,225, 35,
+ 70,220, 27, 62,124,120,121,101,192, 82,187, 57, 63,249,228, 19,225,221,187,119,217,157, 59,119, 54,229,231,231,139, 69,158, 94,
+209, 44,119,105,135,244,188, 2, 73,199,152,152,251, 51,102,204,208,212, 85, 78, 91,145, 34, 22,139,115,186,118,237,138, 47,190,
+248, 2, 95,125,245, 21,250,247,239,143,164,219, 73,136,157,241, 46, 34,167,190,131, 3,231, 47, 32, 39, 39, 7,139, 23, 47, 70,
+116,116, 52,184, 92,238,221, 26,235,227,155, 41,196,245,124, 16,215,243, 65, 16,111,166, 16,150,253, 90, 45, 91,139, 84,176, 61,
+191,166,243,174,124, 82,179,165,171,173,140,184, 90,151, 31, 86,125, 98,107,248,240,225,211, 45, 33, 28, 38, 78,156,120,118,237,
+218,181,221, 38, 78,172, 24,104,119,234,212, 9, 75,150, 44,233, 54,127,254,252,179, 75,151, 46, 69,159, 62,125, 16, 26, 26, 90,
+239,194, 23,138,162, 96, 54,155, 49,122,244,104,152,205,102, 20, 21, 21, 33, 53, 53, 21,241,241,241, 96, 24, 70, 0, 0, 50,255,
+192,246, 60, 30, 15, 55,174, 93, 46,255,120, 98,204,143, 14, 88,178, 8,219, 65,140, 90,173,198,240,169, 83,139,179,155, 53,147,
+111, 44, 46, 46,159,228,225, 33,108,252,232,145, 84,108, 48, 4,160, 14,191, 68,130, 32, 64,211,180, 85, 88, 89, 4, 87,245,173,
+178,163,180, 11,198,114,250,183, 51, 63,228, 2, 0,122,140,245,199,224, 57,141, 39,200,194,132, 95,119, 31, 83, 97,244,222,187,
+228, 1, 83,150, 75,173,128, 9,201, 14, 88,172, 47, 94,188,120, 17,238,238,238, 24, 49, 98, 4,159, 36,201,229,150,241, 42, 42,
+ 98,103,173,177,112,241,249,252,213,175,191,254, 58,169, 84, 42,113,243,230, 77, 0, 56, 89, 91,187,196, 48,140,245,218,213,114,
+ 2, 20,205,195,185,107, 71,241,251,153, 61, 72,207, 41,194,163, 66, 29,192,118,131, 78,147, 13,163, 54, 7, 6,229, 53,148,234,
+133,118, 21,152,203,229, 22,181,106,213,138,233,208,161, 3,195, 48, 12,238,223,191,111,206,120,244,200,124,249,203, 47,153, 91,
+ 83,166, 16,226,212, 84,174,139,139, 11,209,164, 73, 19, 8, 4, 2, 90, 32, 16,148,252,141,157,247, 51, 9,183,240, 12,194, 66,
+ 60, 77,171, 22,131,231, 19,121,168,186,218,208, 26,192,180,166,128,165, 96, 36, 46,163,246,124,179,193,109,196,232,177,154,232,
+232,104,143,128,128, 0, 16, 4,129, 87,135, 12, 33,122, 39, 36,136, 57,254,254,240,108,215,206, 58, 29,113,226,248,113, 28, 61,
+122, 84,115,248,215, 95, 2,222,152, 52,105, 16,128,109,117, 20,134,205,231,243,173,191,155,151,151, 7, 62,159,111,245,137, 40,
+ 45, 45,133,183,183, 55,242,242,242, 96,231,204,220,246, 15,231, 94,152, 91, 24, 51,175, 73,140,152, 67, 28,209,228,131, 98, 24,
+112, 8, 10,208, 50, 48, 81,128,222,196,160,125, 99,150,244,119,173,217,227,208,197,125, 15, 1,108,119,228,238,233,245,250, 63,
+174, 95,191, 62,133,166,233, 61, 0,200,132,132, 4, 58, 57, 57,121, 58,236,119, 92,127,220,108, 47, 20,206, 57,117,234,148,116,
+206,156, 57,138, 67,135, 14,169, 6, 14, 28,232, 22, 31, 31, 47,125,225,133, 23,230,148,148,148,236,180,199, 16,152,153,153,185,
+ 45, 43, 43,107,122,135, 14, 29, 32,151,203, 97, 52, 26,113,245,234, 85,132,133,133,225,202,149, 43, 8, 15, 15,199,229,203,151,
+209,188,121,115, 80, 20, 5,157, 78, 7,154,166,169,250, 26,115,121,113, 17, 80,146,137,220,139, 71,144,122,235, 42, 78,229, 18,
+ 88,183,243, 32, 26,133, 52,105, 80,156,154,112, 31, 97,148,204,219,243,247, 21, 11, 63,241,201,248,227,103,236,251,110, 29,125,
+250,200,145, 72,158, 24, 83,122,142,158, 53,204, 96, 66, 48, 0, 94,151,152, 14, 24,224,113,151, 18,134, 32,255, 84,114,221, 1,
+ 22,195,125,132, 81,190, 94,158,199, 62, 91,190, 72,124,255,232, 86,236,218,244, 5,179,247,135, 29,209, 58, 32, 38, 42, 42,106,
+ 0, 73,146,238, 0,116,149,126, 94,118,165,182,169,137,243,196,193,131,109,117, 64,204,254,253,251, 7, 8,133, 66, 63, 0,166,
+242,242,242, 7, 79,194,121,242,208,161,182,150,114, 18, 4,225, 3,192,200, 48,204,125, 56,152,130,103,228,200,145, 75,222,121,
+231,157,185, 20, 69,121,219,140,206, 89,171, 87,175,102,211, 52,205, 98, 24,198, 72,146,164,241,216,177, 99,148,217,108,206,213,
+233,116, 83,159,164, 21, 25, 54,108, 24, 46, 92,184,176, 16, 21,139, 48,236,181, 86, 87,241,211,170, 76,217,211, 96,254,132,132,
+132,197,175,189,246,218,135, 59,119,238, 76, 93,187,118,237, 43,111,190,249, 38,126,254,249,103, 52,107,214, 12, 55,110,220,192,
+188,121,243, 0,160,219,252,249,243, 15,108,217,178, 37, 52, 35, 35, 99,181, 29, 22, 13,152,205,102,236,216,177, 3,175,190,250,
+ 42,188,189,189,225,239,239, 15,130, 32,254,152, 52,105,210,122, 0, 96, 17, 44, 46, 0,232,117,122,125, 68, 68, 7,187, 45,184,
+ 92, 46,215,218,214,229,231,231, 91, 87, 10,190,244,218,107,197,155, 87,172,192,143, 90, 45, 38,121,120, 8,179, 3, 3,101, 7,
+238,223,143,187, 93,209, 56, 51,117, 89,117,234, 19, 89,246,186, 52,104,243,240,209,175,203,210,253, 0,244,239, 49,214, 31, 61,
+198,250,163,195, 96, 31,130,100, 17,184,245,123, 9,146, 78,200,247,154, 74,241, 7, 28, 75,151,147,188,124,249,242, 3, 61,123,
+246,124,165, 69,139, 22,152, 60,121,242,180,239,190,251,142,107, 50,153,222,198, 95, 97, 30,220, 72,146, 92,180,105,211,166, 56,
+169, 84,138,196,196, 68,156, 57,115,230, 15, 0,153,181,181, 75, 0,172, 49,179, 26, 5,133,235,238,102,168,133,133, 57,231,112,
+ 54,241, 87, 52,139,158, 5, 23,191, 65,144, 70, 44,133, 49,229, 43, 24, 74,126,135, 52,104, 32,178, 51,238,131,197,230, 39,213,
+231,132,194, 48,204,237,236,236,236,208,208,208, 80, 34, 61, 61,221, 12,128,161, 40,138, 49,118,239,110,138, 92,177,130,147, 52,
+109, 26,209,229,238, 93, 22, 67, 16,244,213,171, 87, 1,224,206, 63,209,139, 91,194, 45, 36, 37, 37,213, 22,110,193, 33,180,106,
+213,170,219,153, 51,103,248, 58,157, 14,167, 79,159, 70,199,142,214,181, 93,255,104,244,123, 91, 45,242,156, 33,174,134, 99,241,
+ 85, 44, 90, 85, 30,108,154,224, 52, 15, 15,167,184, 36,190,127,117,208,160,242,235,215,175, 91, 71,125,186, 75,151,160, 57,122,
+ 20, 20, 69,129, 97, 24,156, 73, 72,192,235, 99,199,170, 57, 44, 98,115,227,198, 33, 12,193, 84,137,221,210,183,134,209,195,136,
+ 17, 35, 70, 88, 27,159,172,172, 44,136, 68, 34,240,120, 60,208, 52, 13,179,217, 12, 22,139, 5, 55, 55, 55,152,205,230,154, 76,
+ 48,213, 57, 77,148, 92, 51,124, 75,236,152, 60,127,181,145,153,226,222, 24,193, 92, 23,107,229,244,147, 16,120, 37,154, 3, 47,
+118, 33,115,114,245,139,185,180,190,100, 56, 30, 95,209, 85,223,146,255,240,214,173, 91,175,127,253,245,215, 73, 0,232,219,183,
+ 47,217,186,117,235,175, 81,119,170,156, 58, 57, 5, 2, 1, 31, 0, 14, 30, 60, 40, 79, 77, 77,237,127,240,224, 65,185,237,113,
+ 59, 57,227, 87,173, 90, 5,161, 80, 8,179,217, 12,131,193, 96,245,207,178,125, 53, 26,141,240,242,242,194,225,195,135, 65, 81,
+212,225,250,202, 25, 20, 28, 2,194,187, 41,182, 29, 60,133, 51,197,220,134,136, 44, 43,103, 83, 63, 81,115, 63, 47,207,227,159,
+ 45, 91,236,173,184,119, 21,217,217,217,204,177,163,135,255,212, 1, 57,170, 50,124,172,212,160,185,214, 0, 65,199, 80,100, 30,
+223,244, 1, 51,191, 7, 76,168,121,213,160,149, 51,210, 79,212, 60,192,219,243,216,231,159, 45, 19, 43,239, 93, 69, 94,126, 62,
+126, 59,124,240,186, 14,176, 76, 55, 78,160,105,186, 37, 77,211, 45, 1, 76,168, 67,188, 56,196, 89, 94, 94,222,170,188,188,188,
+213,211,228,100, 24,166, 21,195, 48,118,115,218,250, 68,173, 89,179, 38, 37, 47, 47,239,245,194,194,194,126,150, 77,161, 80,244,
+ 85,171,213,189,202,203,203,187,107,215,132,184,149,151,151,251,168,213,106,153, 78,167,107, 15,224,170, 3,207,188, 21,182, 81,
+167,243,242,242, 22,228,229,229, 17,245,149,147, 53, 53,133,248,233,243,247,127,221,180,105,147,236, 9,249,171,148,179,184,184,
+120,207,206,157, 59,219, 52,105,210, 36,116,194,132, 9,216,184,113, 35,214,174, 93,171, 7,128, 45, 91,182,232,109, 44, 89, 65,
+ 25, 25, 25, 29,106,153, 54,236,107, 99, 45,217,254,210, 75, 47, 49,103,206,156,193,171,175,190,106, 13, 36,250,237,183,223,194,
+108, 54,151,246,233,211,135, 6, 0,173,174,188,148,161, 25, 24,140,181,206,191, 63,118, 63,121, 60,222,203,182,241, 2, 45,193,
+152,121, 60, 30, 24,134, 65,243,110,221,138,149,209,209,242,239, 84,170,242, 5,173, 90, 73,226, 34, 34, 38,180, 0,198,214,196,
+ 73, 16, 68, 21,171, 78,245,205, 1, 75,150,109, 57, 11,181,185,152,252,235,178,244,163, 22,203,150,192,149, 13, 93,153, 25,191,
+172, 72, 47,210, 21,225,219,218,196, 79, 93,215, 46,151,203,103,172, 88,177, 66,239,225,225,129, 97,195,134, 97,233,210,165,147,
+186,117,235,166,242,241,241,185,208,172, 89,179, 91,163, 70,141,202,187,122,245,234,140,222,189,123, 35, 45, 45, 13,159,127,254,
+185, 82,161, 80,140,169,139,147, 32, 8,171, 37,111,112,108, 95,249,134,175,191,160,251,244,156, 14,161,139, 4, 38, 78, 16,228,
+106, 19, 20, 26, 6, 6,126, 12,120, 92, 62,250,117,142,194,133, 99, 91,203, 41,131,102, 91,125,207,188, 90,173,222, 59,126,252,
+248, 82, 46,151, 11,131,193,192,112, 56, 28,240, 43,252,142,105, 78,255,254,198, 46,201,201,102,138, 97,104,130, 32,240,222,123,
+239,105, 20, 10,197,206,134,212, 35, 7, 96,203,249,180,194, 45,244,173,214,255, 60,141,176, 16,207,226,218,159,103,196,215,176,
+253,101,209,178, 44,169,180,188, 18, 4, 77, 81, 20,141,198, 77, 26,139, 51,210, 51,215,141, 28, 57, 98,226,128, 1,177,194,216,
+216, 88, 65, 84, 74,197,104,244,224,193,131,216,183,111, 95,249,239,191,255, 94,202,231,176,182, 4, 53, 10,242,165, 40, 26, 4,
+ 65,215,169,134,197, 98,241,219, 31,125,244,145,139, 74,165,194,218,181,107,233, 54,109,218,144, 34,145, 8, 70,163, 17, 91,182,
+108, 49, 69, 69, 69,113, 72,146,132, 74,165, 2, 73,146,119,237,188,192,155,170,204,156,126,235,123, 15,221,215,225,173, 55, 60,
+ 35,123,119,241,232, 21, 20, 0, 83, 59, 6,185, 89,233, 72, 61,249,187,226,246,177, 47, 75,160, 43, 24,138,250,211, 3,213,212,
+ 17,124,250,251,239,191,251,204,152, 49,131,209,233,116, 68,102,102, 38,179,108,217, 50,159,201,147, 39,127,154,155,155,251,191,
+ 6,254, 41,132, 82,169, 4, 65, 16,116,101, 67, 98, 25,245, 59, 50, 47,151,180,109,219,182,253, 67,134, 12, 25,220,167, 79, 31,
+164,164,164, 88,167, 8,109,133,150,101,245,225,242,229,203,149, 0, 62,172,143,148,195,225, 96,237,182, 61, 80, 42,138,225,235,
+235, 15,129,139, 11, 26,186,194,146, 71,146, 11, 86, 46,254,196,167,248,206, 5, 34,233,207, 83,244,238,155, 5,133,102,138,169,
+ 57,226,127, 89, 46, 83,169,254,235, 30,205,144,172, 5, 43,151, 45,114,179, 76,107,238,188,150, 87, 74, 80,204,140, 39,170, 34,
+207, 11,231,223, 12,127,127,127,228,229,229, 17,254,254,254, 76,165,143, 22, 83,135,208,170,250,128, 87, 76,151, 17,117, 77, 27,
+ 54,148,255,225,195,135,203,218,181,107,247,126, 90, 90,218,238,200,200,200, 55, 1, 52,210,235,245,202,249,243,231,127,182,101,
+203,150,137,246, 88,178, 0,224,231,159,127,254,242,141, 55,222, 56, 58,104,208,160, 15,104,154,110,109,211,177, 63,244,241,241,
+177, 78,225, 22, 21,228,207,157, 50,113,244, 92,181, 90, 97,119,156, 59, 87, 87,215,184,249,243,231, 11, 52, 26, 13,190,249,230,
+ 27, 58, 42, 42,138,180, 12,138,126,248,225, 7,115,120,120, 56,123,196,244,233,197,107,242,243,177, 36, 49, 81, 51,183,101,203,
+ 54,223,165,166,182, 7, 77,111,175,205,170, 83,147, 37,203,226,118,209, 64,228, 86,138,173,111, 1,244,239, 50,210, 15,251, 87,
+165, 67,145, 97,248, 12,102,220,135, 29,105,129,106, 64,246,222,189,123,251, 21, 20, 20,236,255,228,147, 79,220,218,183,111,143,
+150, 45, 91,114, 92, 93, 93, 99, 44,225, 98, 84, 42, 21, 78,156, 56,129,141, 27, 55, 26,110,223,190, 61,164,174,233, 42,138,162,
+ 10,195,195,195, 45,247,129, 33, 8,162,164, 84, 79,184,237,106, 17,227, 58, 97,202,110,226,236,229,243,200, 53,210,208,155,104,
+ 52,110,210, 22,189,250,175,193,129, 35,183,168,220,140,228,100,147, 86,177,217,142,242,222,191,119,239,222, 47,139, 23, 47, 30,
+249,193, 7, 31,184, 20, 23, 23, 83,122,189,158,222,179,103, 15,107,194,132, 9, 20,195,102,211, 92, 54, 27,111,191,253,182, 86,
+169, 84,254, 10,252,173, 9,166,159, 73,184,133,103, 16, 22,226,169, 89,179,108, 95,255, 43,168,177,134,210, 44,242,220,198, 77,
+ 27, 94,254,121,199, 78, 63, 22,139,244,187,255,224,193,229, 87,134, 14,207, 57,126,252,184,148,235,230,214, 17, 0,109,120,243,
+205, 63,141,122,173,252,208,254,253,193,141, 27,135, 68, 87, 38,149,102,104, 22,121,174,174, 31, 84,171,213,154,196,196,196,242,
+ 15, 63,252,144,200,202,202,250,201,215,215,119,212,145, 35, 71, 92,135, 14, 29,170, 77, 73, 73,217,235,231,231, 55,184,119,239,
+222,226,247,223,127, 95,175, 86,171, 29, 73, 60,154,204, 20, 41, 90, 92,250,100,245,107,151, 86,109,120, 17,108, 86, 87,232, 57,
+ 0,109, 58, 7, 99,217,113, 0, 63,193,129,120, 71,182, 16,137, 68,209, 66,161, 16,215,175, 95, 87,196,196,196, 24,116, 58, 29,
+119,233,210,165,158, 34,145, 40,186,161, 55,158, 97, 24, 70,161, 80,128,166,105, 54, 0,162,242, 21,180,227,107,241,255,247,202,
+ 43,175,236,223,181,107,215, 75,177,177,177, 8, 13, 13,133,201,100, 66,120,120, 56, 12, 6, 3,194,194,194,160,215,235,177,112,
+225, 66,168, 84,170,119, 81, 71,206, 51,130, 32, 96, 54,155,173,206,182, 1,129,193, 21,113,122,158, 32,140,133,136, 67,134,222,
+ 61,244, 29, 10, 75,138,233, 93, 55, 10, 10,202,141, 84,191,123, 69,229,183,171,159, 87, 78, 65,211,123,194,204, 28, 0,208,211,
+117,103,156, 23,241, 16,154,122,248, 91, 20, 20, 22,227,231,107,121, 74,141,145,238,159, 90, 3,167, 67,229,124, 78, 56,219, 46,
+ 76,193,240,153,246,159,251, 36,176, 87, 80,213,134,235,249, 32,174, 8,191, 99,176,233,187, 26, 99,100, 61, 33,255,254,180,180,
+180,253, 0,144,156,156,156, 53,122,244,232,185,233,233,233,139, 1,252,150,145,145,177,201, 17,162,239,190,251, 46, 13,192, 27,
+117,157,179,115,245, 27,191, 0,248,197, 17,222,178,178, 50,221,213,171, 87,117,239,191,255, 62,145,149,149,117,196,207,207,239,
+165,163, 71,143, 10,135, 14, 29,170, 79, 74, 74, 58,233,239,239,223,163,111,223,190,174,191, 93,188,152, 83,126,255,254,161, 67,
+233,233,129, 38,154, 62, 84, 87,253,124,202, 34,171,138,216,250,101, 73,250,202,253, 43,211,251,210,122,236, 53, 40,240, 39,128,
+236, 39,224, 60,115,238,220,185,200,177, 99,199,238, 26, 56,112, 96,151,200,200, 72, 52,106,212, 8,169,169,169, 40, 42, 42,194,
+205,155, 55,113,240,224,193,131, 58,157,174,222,132,218,114,185,252,241,244, 68, 2,169,255,214,111, 22, 28,188,124,182, 99,120,
+247,216,241, 46, 45,253,105, 24,140, 12,178, 30,221,199,194,143, 55,151,231, 61, 74, 75, 54,154,141, 67, 96,231, 66, 29,173, 86,
+ 27,255,213, 87, 95,113, 14, 29, 58, 20,187,110,221, 58,113,112,112, 48,139,203,229,146, 0,152, 43, 87,174, 48, 51,103,206,212,
+ 20, 23, 23, 31, 46, 45, 45,141,255,155,251,232, 51, 15, 30, 60,104,203, 98,177,158,106,184,133, 39, 8, 11,225,196,211, 68,147,
+ 38,129,145, 77,131,253,223, 12,109, 20, 56,189, 73,112,208,184,154,156,220, 67, 61, 60,196, 77, 66, 2,226, 66, 27, 5, 78,111,
+ 26,236,255,102,147, 38,129,145,118,152, 22, 67, 37, 18,201, 17,153, 76,214, 6, 0,220,220,220, 6,187,187,187,223,118,115,115,
+ 27, 92, 57, 10, 28,236,234,234,122, 39, 42, 42,106,242,223,104,174,172,147, 51, 60, 60,124,180, 90,173,158, 22, 30, 30, 62,218,
+178,127,255,254,125,235,126, 67, 56,131,130,130,250,109,249,127,163, 0, 0, 32, 0, 73, 68, 65, 84, 92,185,114,229,127,171, 87,
+175, 30,214,172, 89,179,193,203,150, 45, 27,246,235,175,191,254, 47, 48, 48,176,125, 3, 56,249, 0,126,228,112, 56, 5, 60, 30,
+175,144,195,225, 20, 88, 54, 54,155, 93,192, 98,177, 10, 0,108,170,197, 90,214,215,102,148,115,214,215,215, 55,195,215,215, 55,
+195,207,207, 47,195,207,207, 47, 67, 38,147, 61,182,121,121,121,157,181,247,126, 70,248,185,118,139,105, 36, 62,215, 74,230,122,
+182,133,175, 40,226,105,252, 71, 17,126,174,221, 58, 54,114, 59,215, 74, 38, 78,252,255,198,217,198, 15, 12,179, 49,130, 97, 54,
+ 70, 48,109,252,192,212,183,255, 52,205,254, 50,153,140,145,201,100, 11,158,213, 84, 66, 45,252,127,123,125,127,138,156,161, 98,
+177,120,103,163, 70,141, 44,109,221, 32,137, 68,242,135,171,171,235,160,202,182,110,144, 72, 36, 74,136,138,138, 26, 95, 31,167,
+ 84, 42,189,226,227,227,147, 95,185,229,249,250,250,230,249,250,250,230,249,248,248,228,250,248,248,228,122,123,123,231, 88, 54,
+119,119,247, 11, 13,188,118, 31, 0,157, 0,180, 7, 32,121,138,247,179, 9,128, 41,149,109,208, 10, 0,147, 1,180,126, 10,255,
+ 17,193,113,145, 78,229,187, 7,157,227,184,122,151,113, 92,189,203,248,110,129,231,234, 72,193, 99, 15,103,115,169, 84,186, 84,
+ 34,145,252, 42, 22,139, 19,197, 98,241,126, 47, 47,175,101, 0,154,255, 67,207,146, 43,128, 45,168,136,207,244, 27, 42,166,194,
+247,163, 98, 81, 65,240,191,240,153,255,255,140,184,127,234,135,251, 58, 57,157,156, 78, 78, 39,167,147,211,201,249, 28,114,146,
+206,251,233, 20, 90, 14, 10,173,234, 27,128, 58, 34,195, 59,225,132, 19, 78, 56,225,196,255, 99,208,206, 91,224,132,131,168,113,
+106,153,168, 67,149, 58, 18,107,170, 33,202,246,132,147,211,201,233,228,116,114, 58, 57,157,156, 78,206,255,119,156, 78, 60, 69,
+ 56,205,170, 78, 78, 39,167,147,211,201,233,228,116,114, 58, 57,255,235,112, 78, 29, 58,225,132, 19, 78, 56,225,132, 19, 78, 60,
+ 35,196,219, 8,174, 42, 83,136, 78,161,229, 56, 72, 0,211, 0, 12, 7,208, 20, 21,217,236,247, 0, 88,143,134,205,233, 75, 0,
+204, 5,208, 21, 21,171,115, 30, 2, 72, 68,197,234, 28,181,243,118,215, 12, 47, 47,175,143, 56, 28,142, 59, 80,145,218,196,242,
+106,251,158,162, 40,101,105,105,233,178,103, 84, 4, 22,236,140,160,108, 41,171,109,217,108, 95, 77, 38,211,179, 44,167, 19,255,
+ 78,132, 75,165,210, 31,229,114,249, 24,216, 36, 89,118,194,137,255, 2,188,189,189,223, 52, 26,141,243,185, 92,238,210,162,162,
+162, 13,255,143, 46,253, 49,145, 85, 69,104, 29, 58,116, 40, 1, 0, 6, 14, 28,216, 19, 0,220,221,221,207,147, 36,217,196,145,
+ 95,160,105,250,161, 82,169,172, 53,128,154,187,187,251,121, 22,139,245, 24,167,201,100, 18,179,217,236,178,154,190, 99, 54,155,
+179, 75, 75, 75,219,255, 75,110, 34, 1,224,144,135,135,135,110,241,226,197,235,123,245,234, 21,148,155,155,107,158, 51,103, 78,
+143, 27, 55,110,196, 2,120,217, 65,177,213,153, 32,136,173,109,218,180,249,101,220,184,113,187, 98, 98, 98,120, 37, 37, 37,226,
+ 61,123,246, 4,108,219,182,237, 42, 77,211, 99, 80, 71,162,213,255,207,224,112, 56,238,217,217,217, 98,160, 34, 53, 73,165,176,
+130,201,100,130,201,100,130, 70,163, 65,116,116,244, 83,255, 93, 63, 63,191,182, 4, 65,172,115,117,117,109,175, 86,171, 47, 3,
+152,158,151,151,119,195,145,178,154,205,102, 48, 12, 99, 45,103,100,100,164,243, 15,117, 12,147,120, 60, 94,255,176,176,176,142,
+122,189, 94,241,240,225,195, 75, 20, 69,125,130,167,151,163,205, 13,192, 39,124, 62, 63,166,105,211,166, 65,105,105,105, 89, 70,
+163,241, 34, 42,146, 33,171,158,134,200,234,217,179,231,217,111,190,249,198,115,234,212,169,103, 19, 19, 19,187, 57,197,150, 19,
+255, 20,130,130,130,220, 53, 26,205,102, 0,109, 57, 28,142,159, 64, 32,128,139,139, 75, 62,159,207,191,238,226,226, 50,241,220,
+185,115, 74, 71, 57, 41,138,250, 36, 35, 35,195,175, 83,167, 78,171,124,124,124, 22, 22, 23, 23,235,140, 70,227, 73,133, 66,241,
+ 46,128,210,186,190, 91, 93,139, 60,103, 34,203,246, 21, 22,209,197,174,188, 48, 6, 64,175, 42, 10,140,205, 14,124,244,232,145,
+143, 64, 32, 0, 77,211,214,206,172,250,102, 57,110, 48, 24,208,178,101, 75, 99, 61, 29, 78, 80, 86, 86,150, 15,143,199,179, 30,
+ 51, 24, 12, 8, 8, 8,160,179,179,179,125, 42,211, 30, 88,161,215,235, 17, 24, 24,248,111,202,121, 52, 77, 42,149,170, 50, 51,
+179,162,117,122,227,162,201, 51, 62,252,104,204,240, 23, 61,206,159, 63, 79,191,252,242,203,250,132,132,132,105,168, 72,156,106,
+ 87, 99, 78, 16,196,182, 57,115,230, 44, 20, 8, 37,158,167,206, 39,235,183,237, 57,156,211, 38,188, 49,241,238,187,239,178,102,
+206,156,121,166,109,219,182, 63,210, 52,221, 14, 14, 88,182, 60, 60, 60,142,242,249,252,144,202,251,151,169, 80, 40, 94,250, 23,
+ 62,144,108, 60, 30, 60,182,166, 99,245,162,164,164, 4, 90,173,246,177, 45, 50, 50,210,222, 92,153, 14,149,155,195,225,236, 95,
+190,124,121, 64,126, 94, 30,190, 88,179,166, 19, 42, 44,153,157,236,249,114, 97, 97,225, 99,229,140,136,136,128, 19, 14, 97,238,
+194,133, 11,151,191,246,218,107,160, 40, 10, 90,173,214,255,222,189,123, 81,243,231,207, 31,114,255,254,253,142, 0, 30, 60,233,
+ 96, 60, 44, 44, 44,101,214,172, 89,210,142, 29, 59,162, 50, 75,133,127, 98, 98, 98,167, 45, 91,182,188,158,153,153, 25, 1,160,
+232, 73,126, 64, 42,149,254,248,237,183,223,122, 10,133, 66, 28, 56,112,192,179, 79,159, 62,137,215,174, 93,235,254, 4, 98,139,
+244,244,244,156, 9,224, 5,154,166,121, 0, 46, 42, 20,138, 37,112, 60,170,187,204,213,213,117, 47, 73,146,141,129,191,162,209,
+147, 36,233, 69, 16, 68,177,229, 24, 65, 16, 62, 52, 77,255, 41,151,203,187, 56, 31,199,231, 27,158,158,158,147, 10, 10, 10,190,
+225,243,249, 92, 15, 15, 15, 8,133, 66,176,217,108,176,217,236, 70,124, 62,191, 17,159,207, 31,208,187,119,239,233,127,252,241,
+ 71,157, 17,246, 59,183,241,157, 0,146, 88,196, 34, 72, 22, 0,144, 28,145,196,205,205, 13,139, 22, 45, 18, 13, 30, 60, 88, 4,
+ 0,103,207,158, 29, 55,126,252,248, 62,217,217,217, 45,107, 19, 91, 53,105,145,231, 8,241,117,117,120,168, 84,143, 9, 85,106,
+ 46, 73,130,199,227,225,194,133, 11,176, 39, 88,185, 37, 69, 66,157,173, 65,101,132,241, 27, 55,254, 50, 0, 88, 58, 26, 30,143,
+135,115,231,170, 6,149,239,220,185,179,181,178,255, 93, 24, 30, 89, 17,228,113,247, 91, 21,229, 26,177,174, 34,186,246,238,183,
+ 34,208,227,243, 71, 24, 62,115,193,168,114,157,177, 3, 0,141, 82,161, 80, 92,222,183, 47,183, 77,120, 56,247,199, 31,127,236,
+ 24, 16, 16, 48,220, 1,161, 53,183, 93,187,118,123, 89, 46,110, 94,227,198, 79, 24, 55,145, 77, 26, 95,159,242,254,210,172,188,
+ 98, 77, 92, 92,220,190, 3, 7, 14,140, 91,185,114,229,157,217,179,103,207, 5, 48,207,222,242, 11, 4,130,144,187,119,239,134,
+ 81, 20,133,200,200,200,127, 99, 26,131, 54,168, 8,190,247, 26,128, 29,149,199, 70,163, 34,114,127, 91, 0,215, 29, 33,179, 88,
+176,106,218,158, 54, 2, 2, 2, 34,198,142, 29,235, 37, 47, 46,198, 23,107,214, 88, 14,183, 71, 61,211,136,150,250, 99, 48, 24,
+ 48,108,216,176,177, 20, 69,177, 45, 34, 80,175,215, 27, 84, 42,149, 14,127, 57,150, 22, 1,120,209,142,226, 52, 17,137, 68,159,
+ 1,104,171,213,106, 3, 0, 64, 36, 18,229,208, 52,253,139, 70,163,153,135,191, 18,248, 58, 60,192, 5, 16,133,218, 83, 65, 49,
+203,151, 47, 79,251,240,195, 15, 31,252, 3,156, 33,190,190,190,203, 70,140, 24,129,195,135, 15,227,183,223,126, 51,185,184,184,
+176,199,143, 31, 79, 76,159, 62,221, 99,214,172, 89, 3, 0,124,245,132,127,243,128,133, 11, 23, 74, 91,180,104,129, 61,123,246,
+224,230,205,155,218,176,176, 48,151, 94,189,122,129,205,102, 75, 63,250,232,163,151, 1,108,125,146, 31,144,203,229, 75,222,127,
+255,253,109, 59,118,236, 16, 63,124,248, 16,235,214,173,243, 26, 53,106, 84, 66,102,102,102, 79, 7,196, 22, 31,192, 76, 0,189,
+ 89, 44, 86,247,241,227,199,155,103,204,152,193, 33, 73,210,180,102,205, 26,239, 45, 91,182,140,226,112, 56,109, 75, 74, 74,236,
+ 25,164,145, 0, 22, 77,156, 56,241,141, 63,254,248,195,227,210,165, 75, 60, 79, 79, 79, 80, 20,101,181, 20,211, 52,237, 99,121,
+102,205,102, 51, 34, 34, 34, 2,109,190,239,242,188, 10, 13,146, 36,141, 52, 77,115, 0, 8, 0,232,235,219,255, 47,137, 44,169,
+ 84, 58, 85, 46,151,175,247,243,243,131,175,175,239, 99,125,173, 94,175,135, 64, 32,224,250,249,249,125, 59,120,240, 96,206,254,
+253,251,107,157, 2, 36, 88,196, 39, 7,118, 46, 14,144,122,136, 1, 0, 95,110, 60, 86, 14, 0,191,254,250, 43,114,115,115,225,
+225,225,129,150, 45, 91,178, 22, 47, 94, 44,123,247,221,119,191, 80, 40, 20, 19,107,227,170,174, 69,158, 51,139, 86,124, 77,251,
+117,250,104, 49, 12, 99,205,147,103,231, 67, 91,253,208,137,106,124,132,193, 96, 64,117,139,150,165,242,114, 56,156,234,230, 71,
+ 16, 4,193,212,197, 89, 3,198,139, 68,162,104,141, 70,243,181, 3,163, 91, 43,231,238,183, 34,176,141, 63,103,180, 37, 19,233,
+128,247, 43, 94,183, 1, 56,159, 62,113,221, 55, 61,123, 6,204,252,120,237, 2,109, 73,110,241, 71, 99, 7,133,132,249,121,186,
+136,148,133, 42,105,243,230,253,170, 89,100,234, 43,103,143,113,227,198,109,255,253, 66, 6, 33, 16,112,185,108, 22,139,211,173,
+ 85,184,103,144, 27,203, 77, 12,184,101, 61, 72, 59, 63, 97,194,132, 86,179,103,207,238,238, 0, 39, 42, 59, 92,252,240,195, 15,
+ 32, 8,130,116,228,218,159, 34, 78,212, 37,178, 24,134, 1, 65, 16, 63,217,116, 42, 63, 85, 30,187,102, 35,182,216,117,221, 79,
+139, 53,213, 34,170,198,143, 31, 63,214,108, 54,179,109, 26,137,234, 2,166, 38, 17, 99,215,181,203,100,178,223, 1,188, 72, 16,
+ 4, 12, 58,157,225,179,207, 63,183,253,248, 74, 53,145,117,162,182,186,100, 50,153, 64, 81, 20,251,218,181,107, 28,155,103,157,
+ 3, 64, 4,192,139, 97, 24,144, 36,121,203,142,251, 25, 33, 20, 10,207, 31, 60,120, 80,210,190,125,123,130,199,227,193,108, 54,
+ 35, 41, 41, 41,104,229,202,149, 83, 78,156, 56,241,178, 70,163,137,196,227,201,211,237,249,143,162, 18, 19, 19, 53,161,161,161,
+ 53, 10,199,210,210, 82,118,120,120,120,207, 90, 68,209,179,230,204, 46, 40, 40,120,245,197, 23, 95,124, 51, 63, 63, 63,197,108,
+ 54,127, 0,160,165,151,151,215,181,161, 67,135,194,197,197,165,183, 86,171,253,234, 73,158,121, 31, 31,159,193, 93,186,116,193,
+186,117,235,176,114,229,202,190, 0, 78, 2,232, 83, 90, 90,122,226,149, 87, 94,129,187,187,251,171, 74,165,114,235, 19,212,163,
+240, 30, 61,122,124,187,104,209, 34,241,225,195,135, 17, 22, 22,134,178,178, 50,188,247,222,123, 62,159,126,250,233,105,165, 82,
+217,203,166, 94,212,198, 25,201,231,243,183,238,216,177,195, 53, 52, 52, 52,148,203,229,146,161,161,161,144,203,229,208,233,116,
+252,165, 75,151,182,114,113,113,185,241,213, 87, 95,109, 5, 48,180,158,114,146, 0,150,108,218,180,233,205,184,184, 56,247,177,
+ 99,199, 82, 6,131, 1,187,118,237, 2,139,197, 2,135,195,129, 80, 40,180, 38,175,230,114,185,104,222,252,177, 32,233, 7,234,
+184, 94, 21, 42,252, 80,221,225,216,180,235,137, 58,248,172, 83, 31, 28, 14, 7, 2,129, 0, 2,129, 0,124, 62, 31,119,239,222,
+253, 88, 32, 16,172, 33, 8,194,108, 15, 39,241,151,186,136, 6,112,169,190,125, 60,238, 26,242,119,182,159, 22, 4, 18, 4,241,
+ 37,128,222, 21,221, 46,153,224,229,229,245,118, 65, 65,193, 35,123, 57,101, 50,153,103, 73, 73,201, 87, 50,153, 12,190,190,190,
+214,254, 59, 32, 32, 0, 38,147, 9, 5, 5, 5, 96, 24, 6, 74,165, 18, 66,161, 16,254,254,254, 95,197,197,197,237,137,143,143,
+ 47,169,145,147,198,202, 87, 70,205,255,132,197, 98,145, 0,192, 98,187,186,206,250, 16, 8, 9, 9, 65,183,110,221,160,211,233,
+160, 82,169, 16, 21, 21,197, 38, 8, 98, 28, 65, 16, 18,134, 97, 54, 0, 56,245, 31, 52, 20,214,234, 12,191,176,250,188,168, 37,
+ 91, 60,151,203,181, 75,104, 85,158, 95,159, 5,133, 52,153, 76,224,114,185, 85, 44, 18, 4, 65,128,162,168, 42,199, 45, 66,171,
+ 33, 66,125,250,244,233,244,183,223,126,251,166, 66,161,216,136, 6, 78, 37,140, 27, 55,238, 49,127,143,119,223,125, 55,187,176,
+176,144, 25,214, 47, 90,148,114, 36, 55,175,169,135,171,139,183, 88,220, 88,224, 33,117, 47, 41, 41,249,179,178, 49,177, 23,205,
+218,181,107,231,178,109, 95, 98,246,228,119,150, 47,110, 31,234, 41,105, 29,232,229,225,231,230,194,115, 37, 9,141,192,108,202,
+150, 74,165, 97,142,150,219,210, 46, 8,133, 66,144, 36,249,111,178,104,177, 45, 34, 75, 46,151,227,240,225,195,136,141,141,189,
+102, 17, 33,165,165,165,200,203,203,131, 76, 38,187, 86,105,249,168,119, 26,145,166,105, 24,141, 70, 24,141, 70,171,128,177,121,
+134,172, 2,198,114, 46,139,197,186,213,192,178, 47,246,240,240,232,209,187,119,111,222,206, 93,187,120, 12,195,104, 80,145, 67,
+ 77,205, 48,181, 36,200,174, 6,179,217,108,181,178,113, 56, 28,100,102,102, 90, 59, 46, 75,110, 73,129, 64, 96,159, 41,131,207,
+127,255,231,159,127,150,116,236,216,145, 40, 41, 41, 1, 77,211,214, 70,114,253,250,245,130,225,195,135, 7, 92,189,122,245, 35,
+189, 94,191,176, 1,215, 74,212, 38,136, 0, 64, 34,145,152, 97, 95,196,236,122, 57,205,102, 51,209,181,107,215,217,197,197,197,
+173,180, 90,237, 82,123,110, 35,128, 3,217,217,217,182, 29,251,141,148,148, 20,237,200,145, 35, 93, 26, 55,110, 28,147,156,156,
+252, 68, 15,105,120,120,120,103, 14,135,131,139, 23, 47,234, 1, 88, 70,214, 9, 55,111,222,212, 15, 29, 58,148, 31, 20, 20,212,
+ 89,169,180,219,101, 37, 60, 34, 34,226,184,143,143,143,139,165, 13,245,246,246,230,196,199,199,139,115,114,114, 96, 52, 26, 49,
+119,238, 92, 12, 28, 56, 16, 94, 94, 94,120,247,221,119,125, 87,173, 90,245,163, 90,173,110, 87,151,209,154,199,227,109,191,119,
+239, 94,152, 76, 38,115,185,112,225, 2, 90,183,110,141,226,226, 98,228,231,231, 67,173, 86, 35, 63, 63, 31, 19, 39, 78,244,249,
+226,139, 47,252,237,176,100, 89, 69, 86,124,124,188,114,239,222,189,172,205,155, 55,139, 57, 28,142, 85,104,177,217,108,171,208,
+178,228, 86,108,192, 76,131,178, 82,180,185,171, 84,170, 39,241,115,227, 3,224,217,138, 44, 62,159, 15, 62,159, 15,129, 64,240,
+ 68,121, 89,159, 19, 4, 16, 4,145,204,229,114,249, 66,161,144, 75,146, 36,248,124,126, 63,169, 84,122,187,101,203,150, 45,143,
+ 31, 63,158, 97, 15,137, 78,167,219,206,231,243, 57, 62, 62, 62, 0,128,176,176, 48,180,110,221, 26, 26,141,134, 86,169, 84,112,
+119,119, 39, 31, 61,122, 4,173, 86,139,188,188, 60, 4, 7, 7,115, 72,146,220,142, 10, 63,228,199,112,254, 90,254, 70, 0, 27,
+ 45,251, 94, 94, 94, 5,182,150, 78,129, 64,128,128,128, 0,228,228,228, 64, 44, 22,179, 62,253,244,211,161,187,118,237, 26,114,
+254,252,249,113, 0,126,176,161, 90,248, 28,251,104, 89, 68,150,237,235, 95, 66,107,224,192,129, 11, 14, 29, 58,212,179,166, 81,
+ 56,135,195,121,106,190, 46, 22, 65, 37,145, 72,170, 91,173, 64,211,116,109, 22, 45,135,127, 71, 32, 16,184, 76,157, 58,181,108,
+195,134, 13, 14,139,173, 17,235, 82,172, 86,172,199,134,145,145,145,231, 63,250,232,163,193,127,252,241, 71, 78,251,208,198,108,
+ 81,238, 35,181, 64,226,238,142,192, 70,177,227, 95, 29,122, 19, 21,171, 15,237,197,189,178,178, 50,151,166,129, 66, 3, 73,234,
+136, 70,124,182, 88, 38,226,242,253, 60, 60, 2,184, 6,125,161,196,195,131,167,215,235,149,168, 35, 9, 52, 0,248,250,250, 30,
+115,113,113, 9,182,236,123,120,120,184, 49, 12, 3,161, 80, 8,153, 76,230,202, 98,177, 82,109, 42,215,163,130,130,130,126,245,
+ 21,204,221,221,253, 24,159,207, 15, 38, 73, 18, 4, 65,128,197, 98,129, 36, 73,144, 36,105,125,207, 98,177, 64, 16, 4,202,203,
+203, 31,101,100,100,244,179,227,122,205, 0,218, 18, 4,113,237,240,225,195,136,137,137,193,145, 35, 71,208,191,127,127,168, 84,
+ 42, 36, 37, 37,161, 71,143, 30, 64,197,148,162, 93,176,117,126,183, 12, 10,238,222,189,107, 21, 46,182,155, 88, 44,126, 18, 19,
+251,217, 17, 35, 70,224,219,111,191,101, 42, 7, 19, 34,130, 32, 90,187,185,185,221,189,115,231,142, 93,126, 48, 12,195,192,104,
+252,235, 84, 75,231, 85,233, 15,225, 80,114, 96, 22,139,213,175, 93,187,118,132, 74,165,178, 8, 72,176,217,108,176, 88, 44,176,
+ 88, 44,124,243,205, 55, 46, 29, 59,118,156,207,231,243,103,115,185,220, 82,147,201,180, 83,167,211, 45, 5,160,252, 55,181, 72,
+221,187,119,127, 39, 43, 43,107, 96,112,112,240,193, 39,160, 97, 76, 38,147, 1,128, 11,139,197,226, 60,133, 54,138, 85,249,108,
+233,108,196,190,185,114,159,143,138,105, 98,187,224,229,229,245,227,111,191,253, 22, 24, 28, 28, 12,147,201, 4,179,217, 12,181,
+ 90,141,132,132, 4,232,245,122,152,205,102,132,133,133,225,147, 79, 62,209,189,253,246,219,130, 77,155, 54, 21,170,213,234, 49,
+245,208,190,189,103,207, 30,145, 76, 38,115,209,106,181,120,240,224, 1,218,181,107,135,178,178, 50,104, 52, 26,148,151,151,195,
+104, 52,162,180,180,212,157,162, 40, 67, 61, 92, 31,219,138,172, 41, 83,166,220,226,241,120,237,102,204,152,129,236,236,108,107,
+157,159, 60,121, 50,124,125,125,173,117,169,178, 77,118,168, 97,102,179,217,224,243,249,224,114,185,202, 70,141, 26,129, 32, 8,
+193,163, 71,143, 26, 50, 21, 39, 1, 80,202,225,112,120,182, 2,139,207,231,227,226,197,139, 31,241,120,188,218,172, 89,181,213,
+ 75,198,145,253,127, 26, 4, 65,124,201,229,114,249, 82,169,148,107, 51,224,228,186,186,186,194,199,199,103, 29,128, 1,118, 94,
+119, 27,169, 84,106,109,223,163,163,163,145,149,149,245,139, 74,165,122,189,176,176, 16, 36, 73,110, 39, 73,114,136,101,144,170,
+ 80, 40, 16, 20, 20,212,166, 54,190, 46,109,253,222, 4,193, 84,177,104, 85, 27,160, 65, 34,145, 32, 61, 61, 29, 26,141,134, 73,
+ 75, 75, 35,166, 78,157, 74, 24, 12,134,239,175, 94,189,250, 39, 42, 86,219,215,170, 69,158, 19, 56,238,163,101,177,104,217,219,
+ 1, 16, 4, 81,239,104,194,100, 50,185, 70, 69, 69,213,228,240, 69,212, 36,180, 42,167,147, 26,244,160,115, 56, 28,113, 67,197,
+ 86,117, 28,220,187,195,119,229, 39,115, 63,145,250, 55,110, 58,123,246,199,236, 65,131, 6, 93,216,182,109, 27, 37,109, 49,160,
+207,169, 99, 63,248,126,245,222,156, 35,191,253,246, 27, 80,225, 24,109, 47,206, 30, 58,116,200,239,221,153,211,241,201,251,111,
+ 31,149,132,121,241, 92, 9,169, 72,160,215, 20,185,130,209,242,155, 69, 12,220,119,240, 96, 30,128,171,117,145, 8,133,194,224,
+228,228,228, 48,219,133, 4, 6,131, 1, 66,161, 16,167, 78,157,242,118,113,113,241, 6, 0,173, 86,139,150, 45, 91,218,107, 49,
+ 9, 78, 77, 77, 13, 19,139,197, 40, 47, 47,135, 94,175,135,201,100, 2, 77,211, 32, 8, 2, 28, 14, 7, 60, 30, 15, 34,145,200,
+209,149,125,215, 1,188, 22, 27, 27,251,211,145, 35, 71, 16, 21, 21, 5,133, 66,129,148,148, 20,139,200,114,200, 71,203, 98, 37,
+178,245,199, 98,179,217,248, 49, 52, 20,147,115,115,173, 2,230, 75, 55, 55,124, 66, 55, 44,155, 70,203,150, 45,153,179,103,207,
+226,232,209,163,120,229,149, 87,136,253,251,247, 27, 41,138,226,230,230,230,222,202,205,205,181,139,131,166,105,107, 89, 45,237,
+182,173,192,114, 84,104,153,205,102, 49,143,199,131, 78,167,131,197,242, 96,187, 53,105,210, 4,114,185,156, 93, 90, 90,202,206,
+205,205, 21, 46, 89,178,100,198,233,211,167,101,101,101,101,163,255,201, 86,104,195,134, 13,193,147, 39, 79,206,100,179,217, 76,
+255,254,253,199, 62,122,244,232, 85,153, 76,118,242,143, 63,254,248, 28, 64,184,163,124, 94, 94, 94, 87,216,108,118, 96,105,105,
+ 41,119,247,238,221,166,178,178, 50,174,183,183,119,129,165,237,176,220,107,147,201,100,215,202,101, 47, 47,175, 43,197,197,197,
+220,175,191,254,218, 84, 82, 82,194,245,245,245, 45,176,240, 40,149, 74,238,238,221,187, 77,165,165,165, 92, 55, 55,183, 43, 42,
+149,170, 94,190,226,226,226, 49,227,198,141, 75, 60,121,242,164, 23,139,197,194,163, 71,143, 80, 82, 82, 2,119,119,119,108,223,
+190, 29,193,193,193,216,179,103,143, 92, 46,151, 79,250,236,179,207,230, 87,138,172,250,124,180,122,196,196,196, 4, 43,149, 74,
+184,187,187, 67,163,209,224,202,149, 43,136,140,140, 68,110,110, 46, 72,146,132,187,187, 59,214,175, 95, 95, 78, 16,132,188, 46,
+ 34, 23, 23,151, 87,227,226,226,220, 1, 32, 46, 46,206, 61, 46, 46,174,198, 14,174,115,231,206, 88,183,110, 93,117,161,229,200,
+192,192,106,117,178, 17, 71,186, 78,157, 58,225,244,233,211,115, 28, 20, 71, 6,139,104,171,110,205,226,243,249, 14, 47,166,161,
+105,154,139, 10,151, 6,194,158,253,127, 1,122,186,184,184,112,171, 31, 44, 47, 47,231,202,100,178,238, 14, 8, 95, 79, 23,151,
+ 10,131, 83,112,112, 48, 84, 42, 21,101, 48, 24, 70,253,240,195, 15, 38, 0,104,219,182,237, 40,138,162,116,102,179,153,197,227,
+241,160,209,104,224,227,227,227, 89,135,109,244,131, 3, 59,151,248, 85,247,209,146,201,100,104,219,182, 45,244,122, 61,242,242,
+242,144,144,144, 96,162, 40,234,167, 13, 27, 54,208,222,222,222,111, 12, 27, 54,140,117,245,234,213,183, 0,188, 83,155, 22,121,
+206,172, 89,241,181, 10,173, 74, 5,121, 26, 64,175,234, 23, 89, 93,252,212, 37,180,234,155, 58,228,241,120,202,204,204, 76,145,
+109,167, 98, 54,155,225,239,239, 79, 51, 12, 67,212, 36,180,158,196, 20,204,225,112,196, 31,126,248,161,114,195,134, 13, 99,210,
+211,211, 23,216,243,157,221,111, 69, 96, 91, 53,145,181,113,229,162,117, 95,175, 92, 34,189,127,244,123,108, 94,187,154,162, 40,
+ 92,109,213,170, 85,119,181, 90,205,118, 19,153, 80,172,196,145, 74,145,101,175, 40, 36, 1,124,119,233,210,165,171, 3, 6, 12,
+ 56,247,221,207,251,164,185, 15, 30,252,201, 47, 45,206,147, 52, 11, 99,115, 3,130,135,148,233,116,220, 81,163, 70,121, 3, 24,
+ 86, 95, 35,166, 84, 42,145,159,159, 95, 93,128,225,238,221,187,143,157,107, 87,225, 72, 18, 20, 69, 97,239,222,189, 16, 10,133,
+ 16,137, 68, 85, 54,139,200,106,224, 66,133, 84, 0,232,223,191, 63,228,114, 57, 92, 93, 93,237, 46, 87,117,241,194, 48, 12, 12,
+ 6, 3, 12, 6, 3,140, 70, 35, 5,128,195,102,179, 49, 49, 59,219,106,229,113, 68,192, 84, 71,171, 86,173,152,243,231,207,227,
+220,185,115,208,104, 52,248,250,235,175, 33,147,201, 94, 0,240,177,163, 92, 54, 78,250, 84,105,105, 41,167,180,180,212,106, 29,
+228,112, 56, 86,235,129,157,150, 60, 46,155,205,182,142, 70, 45,155,173, 85,139,197, 98,193,215,215, 23,126,126,126,216,184,113,
+ 35,183,113,227,198, 3,255,201, 22,104,213,170, 85,205,190,252,242,203, 45,219,182,109, 59, 50,102,204,152, 93, 73, 73, 73, 19,
+220,220,220,110,157, 58,117,106, 9,159,207,167, 27, 88,191, 3,115,115,115,125,108, 15,209, 52, 45, 52,155,205, 86, 97, 91, 94,
+ 94,110,247, 0,131,195,225, 4, 38, 39, 39, 11, 1, 96,201,146, 37, 28, 0, 66,139, 51,184,133,179,188,188,156, 19, 25, 25, 25,
+104,239,179,158,152,152,216,189,111,223,190,231,143, 31, 63,238, 17, 28, 28,140,156,156, 28,228,228,228,160, 89,179,102, 88,182,
+108,153,166,180,180,180, 43,128, 84,181, 90,189,223, 78, 78,127, 15, 15, 15, 78,102,102, 38,204,102, 51,218,180,105,131,245,235,
+215, 99,212,168, 81,104,217,178, 37, 74, 75, 75,145,156,156,140,173, 91,183,122,112,185,220, 58,219, 14,173, 86,187, 63, 62, 62,
+ 62,168,186, 69,107,236,216,177,162,130,130, 2,235, 51,185,104,209,162, 42, 83,136,142,180,201,149, 83, 91,181,110, 13,129,217,
+108,150, 8, 4,130, 82, 62,159,207,179,248,103, 37, 36, 36, 56,108,205,170, 54, 0,116,100,255, 31,131, 69,180,214,208,183,194,
+207,207,207,110, 30, 62,159, 79, 88,218, 70,179,217, 12,149, 74, 69,201,100, 50,235,244,254,181,107,215,168,144,144, 16,138,197,
+ 98,177,120, 60, 30, 8,130,128, 80, 40,172,181,193,103, 40,102,209,160, 81, 31, 87, 89,117, 56,235, 67,192,104, 52,226,218,181,
+107, 48, 26,141, 72, 72, 72, 48,125,246,217,103,185, 74,165,114, 22, 0,246,177, 99,199,198,205,153, 51,135,229,227,227,211,183,
+176,176, 16,245,105,145,231, 72,108, 61,102,229,178,244, 66,167, 7, 14, 28, 72, 84, 46,173, 36, 44,194,201, 17,161, 85, 89,249,
+234,237,121, 9,130, 64, 94, 94,158,117,223,199,199,199,225,223,178, 23,158,158,158,154,206,157, 59,139,139,139,139,247,175, 90,
+181,170, 65,150,172,141, 43, 23,173, 91,190,248, 83,169,252,206, 5,100,231,230, 65, 94,104,186,122,246, 86,250, 47, 0,126, 1,
+ 0,108,106,113,154,120, 51,229, 27,123, 57, 35,188, 92,162, 57, 92,246, 47, 47, 14, 24, 24, 52, 50,238, 29,114,218,180,105,221,
+198,141, 27,167, 26, 51,102,204, 76, 87, 87,215,112,163,209,168,216,119,248,112,198,200,145, 35, 27, 83, 20, 53, 14,245,196, 28,
+209,106,181,143,122,245,234,101,123, 63, 37, 39, 78,156,240,205,200,200,192,244,233,211,139,114,114,114,148,182,231,218, 83, 70,
+163,209,248, 40, 58, 58,186,214,233, 66,203,148, 34, 0,148,149,149, 61,114,224,150,142, 70,165,227,123, 73, 73, 9,238,222,189,
+ 11, 54,155,141, 78,157, 58,225,236,217,179,232,214,173,219, 53, 71,172, 90, 58,157, 14,193,193,193,208,233,116,208,104, 52,229,
+ 0,248,219, 27, 55, 6, 0,188, 85, 82,130, 43,159,125,134, 11,203,151,195,246,121,182, 23,173, 91,183,102, 46, 92,184,128, 91,
+183,110, 65,175,215, 99,210,164, 73, 0, 64, 84, 62,187,142,132,204, 8,101,177, 88,253, 7, 12, 24,224, 15, 0, 26,141,134,184,
+116,233, 18, 4, 2,129,181, 46, 28, 60,120, 16, 57, 57, 57, 32, 8, 2, 30, 30, 30,129, 10,133,162, 49,128,244, 58,204,254, 68,
+122,122, 58, 86,172, 88, 1,154,166, 49,103,206, 28,132,133,133, 89, 5,214,163, 71,143,176,100,201, 18, 80, 20,133, 79, 63,253,
+ 20,205,154, 53,131,201,100, 18,160,129, 33, 52,158, 6,222,125,247,221,251,191,252,242,203,145,172,172,172,151, 87,174, 92,217,
+147, 32, 8,122,246,236,217, 43, 36, 18, 9,245, 36,188, 10, 85, 25,238,222,123,100, 21, 66,213, 55,111, 47,169,195,124,105, 15,
+178,172,223,167, 40, 91, 62, 10,158, 82, 15, 71,139, 88,110, 50,153, 52, 67,134, 12,113,223,187,119, 47,209,172, 89, 51, 60,124,
+248,208, 98, 25, 42,135,227, 33, 29,114,228,114,121, 24,139,197,226,222,187,119, 15, 33, 33, 33,136,137,137,193,210,165, 75, 81,
+ 92, 92, 12,179,217, 12, 31, 31, 31,218,100, 50, 93, 51, 26,141,103,234,225, 90, 52,101,202, 20, 46,128, 55, 43, 45, 91,173,102,
+205,154, 69,175, 94,189, 26,215,174, 93,179, 90,176,108,157,225, 29,157, 58,180,181, 58,217,110, 9, 9, 9,115,120, 60, 30, 3,
+224, 34, 28, 15,244,108,168,110,209,106,136, 53,235, 89,225, 89,174,100,148,201,100, 9, 98,177,120,160, 66,161,168, 98,213,234,
+218,181,171,209,215,215, 55,209, 94, 30, 87, 87, 87, 5,139,197,242, 4,128,156,156, 28,136, 68, 34,238,131, 7, 15,150,163, 34,
+120, 54, 26, 55,110,188, 92, 46,151,115, 27, 87,182,167,126,126,126, 48, 24, 12,181,186,177,252,121,189,224,123, 0,223, 91,246,
+165, 82,105,158, 74,165,114, 89,189,122,181,122,249,242,229, 90,138,162,244, 0, 78, 41,149, 74,107, 28,173,252,252,124, 21,135,
+195,145,186,187,187, 7, 88,132, 86, 77, 90,228, 57, 67,237, 22,173, 74, 37,201, 84, 23, 68, 4, 65, 60,230,160, 94,143,208,170,
+ 87,100, 81, 20, 85,197,202, 96,113,120,175,233,183, 42, 59,245, 6, 77, 29, 86,138, 44,193,190,125,251,182,175, 90,181,234,162,
+189,223,179,245,209,218,244,249,226,149, 22,145,117,243,220,113,236, 79, 81, 21,207, 89,190,230,203,134,254, 3, 45,188,132,173,
+125,125, 61, 79,127,182,108,145,228,254,209,173,216,181,233, 11,230,230,229,203, 29, 47, 95,190,252,250,244,233,211, 27, 85, 62,
+ 88,114, 0, 55, 0,140,132, 29,171,116,114,114,114,250, 85,235,132, 83,185, 92,174,175, 80, 40, 68, 78, 78,142, 58, 45, 45,205,
+225, 41,153,226,226,226,126,207,224, 1,100, 91, 68, 86,113,113, 49,146,147,147,209,187,119,111, 0,192,217,179,103,209,181,107,
+ 87, 92,189,122, 21,237,218,181,187, 6,160, 3,234, 9,212,106, 50,153,148, 45, 90,180,176, 90,183, 84, 42, 21, 13, 0,113,121,
+121,136,151,201,192,102,179,113, 97,249,114,204, 51,153,176,212, 65, 1, 31, 29, 29,205, 92,186,116, 9, 25, 25, 25, 48,155,205,
+ 24, 60,120, 48, 26, 88,233, 91, 70, 68, 68,156, 56,117,234,148,183,171,171, 43, 52, 26, 13,212,106, 53,198,143, 31,143, 81,163,
+ 70, 65,175,215, 99,247,238,221, 56,112,224, 0,196, 98, 49, 52, 26, 13, 52, 26,141, 71,108,108,236,249,212,212,212, 30, 0,238,
+213, 34,180,152,126,253,250, 33, 49, 49, 17, 44, 22, 11, 29, 59,118, 68, 73,201, 95,139,129,124,125,125,107,250,140,245, 79, 10,
+ 45, 54,155,205, 36, 36, 36,172,236,217,179, 39,178,178,178, 94,110,215,174,221,215, 19, 38, 76,200,121, 82, 94, 15, 55, 49,162,
+ 35, 67,161,215,235,161,215,235,225,239,239,143,178,178, 50,220,191,127, 31,122,189, 30,190, 62,238, 14,243,181,109,217,204,202,
+231,227,227, 3,141, 70,131,244,244,116, 24, 12, 6,120,121, 57, 36,180,130,250,245,235,247,199, 79, 63,253,228,185,117,235, 86,
+ 67,175, 94,189,120, 95,127,253, 53, 33,145, 72, 96,211,177, 56,138,132,179,103,207, 6,247,237,219,183,249,157, 59,119,144,144,
+144, 0,131,193,128,182,109,219, 34, 45, 45, 13,157, 59,119,134, 90,173,190,120,249,242,229, 3,246, 24,134, 1,204,159, 50,101,
+ 10, 44, 98, 43, 49, 49, 17,121,121,121, 16,139,197,143, 9, 45,139,239, 99,229,170,113,127,123, 10,107, 17, 68, 54,150,167,121,
+238,238,238, 70, 0, 95, 54,208,250, 4, 0,200,202,202,226,183,106,213, 74, 47, 16, 8,120,149,162,109,205,147,240, 61, 77, 60,
+133,149,140,181,194,207,207,111,150,151,151, 87,223, 38, 77,154,160,160,160,128,203,227,241,208,181,107, 87, 99,135, 14, 29,140,
+126,126,126,111,217,203,195,231,243,239,112,185,220, 30, 21,131, 9, 10,153,153,153, 96, 24,102, 78,203,150, 45,223, 46, 43, 43,
+ 67, 73, 73, 9, 79, 34,145, 88, 7,213,205,155, 55,135, 94,175,191,227,128,229,109, 81, 72, 72,200,124, 46,151,187,180,184,184,
+184,166,176, 16, 60,119,119,119, 9,151,203,133,209,104,172, 34, 54,171,107,145,231, 93,100, 85, 17, 90, 54, 42,178,138,208,113,
+196,162,101,143,213,192,226, 96,111,187,111, 17,117,213,127,171,161, 49,180,220,220,220,244, 22,145,181,116,233,210,139, 13,225,
+216,243,211, 15, 50, 55,186, 60, 40,247,226,111, 72,189,117, 21,191, 36, 43,139,231, 44, 95, 51,115,208,176,209, 5,213,133,153,
+ 61, 8,243, 22,182,244,245,241, 60,253,249,170,229, 18,249,157, 11,200,203,207,199,111, 23, 47, 95, 53, 2,201, 0,230, 60, 77,
+211, 50, 80, 49,117,200, 98,177,254, 77, 15,172,213, 25, 62, 47, 47,207, 34,178,218, 2, 64,183,110,221,174, 85,138, 44,216,107,
+209, 82, 42,149,213, 83,214,244, 5,224,101,185,126, 54,155,141,174,243,231, 59, 44,178, 0, 48, 87,175, 94,133, 92, 46,183,140,
+ 20, 27, 42,178,224,231,231,247,254,169, 83,167,188,191,251,238,187,210,109,219,182,149,208, 52,205,137,142,142, 14,108,223,190,
+ 61,177,125,251,118, 0,192,200,145, 35, 49,103,206, 28,220,190,125, 27, 34,145, 8,221,186,117,163, 22, 44, 88,224, 51,107,214,
+172,183, 10, 10, 10,102,214,216, 59,210, 52, 87, 32, 16,156, 4,240,194,157, 59,119, 0,224, 60, 42, 82, 56, 89,172, 8,181,126,
+102, 79,231, 91, 86, 86,198, 17,139,197, 53,134,134,224, 86,140,134, 28,181, 64, 88, 57,207,157, 59,183,226,243,207, 63,255,229,
+189,247,222,187,247,132,156, 53, 90,180, 6, 14, 28, 8,173,222,136,236, 2, 21, 40,202, 12,173,177,208, 97, 62, 91,139,214,192,
+129, 3, 81,174, 51, 32, 51, 79, 14,179,153, 66,153,214,238,190, 92,248,226,139, 47, 30,219,185,115,167,223,159,127,254, 9,138,
+162,232,180,180,180,244, 33, 67,134, 72,102,207,158,237,249, 4,139,140,214,142, 30, 61,122,248,185,115,231,228,205,155, 55,151,
+ 94,188,120, 17,133,133,133, 48,155,205,120,225,133, 23,192,227,241, 50,151, 47, 95,206, 5,176,214,222,255,166, 82,108, 25, 47,
+ 95,190, 60,249,194,133, 11, 82,169, 84,202,163, 35, 34,144,119,252, 56,246,238,221,251,216, 23, 54,109,218, 4,216, 25,133,223,
+ 98,113,186,116,233,210, 83, 17, 88, 85,122,106, 30,175,193,211,143,207, 43, 46, 93,186,148, 51,109,218,180, 72,137, 68,242,101,
+247,238,221,123,123,122,122,146, 30, 30, 30, 9, 1, 1, 1,111, 71, 71, 71,219, 61,187,192,225,112, 38,136, 68,162,251,102,179,
+153,165, 86,171,161,209,104, 42, 26,105,179,153, 71,146, 36, 26, 55,110,108,237, 75, 58,118,236, 8, 63, 63, 63, 42, 37, 37,101,
+130,189,252, 69, 69, 69, 85, 86, 33,214,128, 41, 93,187,118,101,235,245,122,100,100,100,156,181,253,160, 38, 45,242,156, 32,174,
+ 78,241,101,185, 40,219,139, 11, 8, 8,200, 50,153, 76, 76, 50,192,220,184,113,131,137,139,139,171,115,211,233,116,140,143,143,
+ 79, 94, 13,157, 31,108, 57,245,122,125,149,239,233,245,122,198,215,215,151,210,106,181,143,113,106,181, 90, 38, 48, 48, 48,167,
+ 46,206, 26, 48,254,250,245,235, 27,230,205,155, 23,227,192, 13,178,114, 50, 27, 35,152,173, 91,183,254,143, 97,152,158,221, 35,
+131,111,141,136,246,101,186,134,249,228, 30,216,243,211, 40,134, 97,122, 86,223, 44, 1, 78,235,226,140,240, 21,181,232, 19,213,
+ 72,113,243,232, 14,230,212,234, 25,204,231,131,195,152,118,129, 98,101,132,151,139,163, 57, 98,234,205,150, 30, 21, 21,149, 74,
+211, 52, 99, 48, 24,152,168,168,168,180,167,193,217, 0,212,197,217, 6, 21,190,108,163,107, 56,214,230, 9,202,121,147, 97, 24,
+ 70, 46,151, 51,106,181,154,209,235,245, 12, 69, 81,140, 45, 0,220,180,131,147, 49, 26,141,140, 66,161, 96, 96,191,207, 93,141,
+156, 50,153, 44,253,193,131, 7, 76,211,166, 77,179, 42,205,241,179, 52, 26, 13, 83, 29, 26,141,134,233,221,187, 55,147,150,150,
+198,132,132,132,232,210,210,210, 24,153, 76,118,183,158,114, 54, 9, 10, 10, 58,233,229,229,149, 0, 32,204,129,207,234,188,159,
+187,119,239, 14,101, 24,102, 18,195, 48,113,181,108,147, 24,134,137,248,167, 57, 43,239,111, 1,195, 48, 76,121,121, 57, 35,151,
+203,153,220,220, 92,166,188,188,156, 81,171,213,204,245,235,215,153, 63,255,252,147,185,117,235, 22, 35,149, 74, 11,236,225,180,
+240, 25, 12, 6,166,180,180,148, 41, 44, 44,100,180, 90, 45,163,209,104,152,164,164, 36,230,202,149, 43,204,157, 59,119,106,226,
+123,140,211,211,211,115, 83,126,126,190,250,252,249,243,229, 27, 55,110, 44,247,243,243,187, 3, 32, 24, 64,184,135,135, 71,254,
+140, 25, 51, 24, 87, 87,215, 71, 13,172, 71,145, 28, 14,231,250,202,149, 43, 47, 29, 58,116,168,224,192,129, 3,134, 45, 91,182,
+100, 79,159, 62,253, 12,155,205,190, 14, 32,178,129,245,200,199,221,221,253,252,197,139, 23,205, 10,133,130, 81, 42,149, 76,105,
+105, 41,163,209,104, 24,173, 86,203, 24, 12, 6,198,100, 50, 49,103,206,156, 97,124,125,125,109,167, 37, 63,168, 99, 96,253, 14,
+195, 48,239, 51, 12,195,126,218,109,157, 13,119,247,167,197,249, 52,218, 58,146, 36,141,149,109, 71,167,138,221,186,247,255,169,
+114,246,233,211,231,211, 81,163, 70, 49,253,251,247,103,218,182,109,251,216,214,174, 93, 59,102,234,212,169,204,161, 67,135,152,
+207, 62,251,236,211,167, 80, 78, 54, 42, 22,189, 44,235,211,167,143, 41, 49, 49,145, 25, 57,114, 36,242,123,114, 48, 0, 0, 32,
+ 0, 73, 68, 65, 84, 3,160, 95, 93, 90,228,191, 32,184, 44,225, 29, 8,219, 87, 0, 48, 26,141, 89,169,169,169,178,230,102, 51,
+ 11, 0,190,249,230,155,199, 44, 83,182, 72, 76, 76, 52, 19, 4,113,191,174, 95, 55, 26,141, 89,167, 78,157,242, 93,183,110, 29,
+199,198, 4, 12,179,217, 76,231,230,230,146, 95,127,253,117,149,243, 79,159, 62,109, 54,155,205,153, 14, 94,228,214, 54,109,218,
+108,125, 26,119,235,204,237,140,183,143,253,246,171, 87,167,152,238, 74,137, 84, 90,227, 40,108,247, 91, 17, 32,222,172,219,170,
+ 69,176,201,165, 43,151, 45,114,183, 76, 65,254,124, 45, 95,169,211, 83,189, 83,138,181, 55,159,246, 63,172, 86,171, 51, 44, 43,
+ 1, 53, 26, 77,230,191,240, 33,188,142,138, 24, 87,230,106,199, 58,224, 9,157, 78,105,154,134,155,155,155,213, 26,218, 0,139,
+ 40, 99,177,176, 90,254,186, 39, 41, 15,195, 48,231,146,146,146, 66,198,143, 31, 47,222,182,109,219, 3,138,162, 56, 19, 39, 78,
+ 52,250,249,249,113,207,158, 61,107, 2, 64,244,236,217,147,157,159,159,207,228,228,228,200, 95,121,229,149,178,201,147, 39,123,
+222,184,113,131, 71,211,116,125, 65, 11, 31,102,101,101,245,105,192,103,117, 98,196,136, 17, 15,240,228,105,108,158, 57,167, 5,
+114,101, 41, 30,100,228, 84, 70, 48,167, 65, 61, 42,176,250, 85,153, 76,102,200, 75, 75, 28,182,104,221, 79,207,169, 76, 49, 70,
+129,162,114, 43,249, 42, 28,226, 25, 69,121,253,189, 9,155,221,109,193,130, 5, 3, 72,146, 36, 47, 92,184,160, 95,181,106, 85,
+ 86, 81, 81,209, 96, 0,153, 0,160, 80, 40,122,109,221,186,245, 71, 59, 66, 57,212,134,100,147,201,212,249,131, 15, 62,152, 9,
+160, 27,128, 70,149,220,103, 43, 45, 89, 13,141, 96, 94,168, 84, 42, 95, 26, 48, 96,192,113, 22,139,213,216,166, 30,121, 1, 40,
+182,212, 11,134, 97,124, 10, 10, 10, 94,182,135,144, 32,136, 53,207,170, 33,121,150,220, 79,216, 14, 61, 23, 43, 25, 79,158, 60,
+185,112,240,224,193,236,224,224,224,143,130,131,131, 73,133, 66, 1,181, 90, 13,146, 36,225,231,231,135,168,168, 40,248,249,249,
+209,119,238,220, 89, 54,119,238,220,122, 99,242,181,104,209, 34,212,100, 50, 53, 37, 73, 50, 20, 64, 40,195, 48,161, 4, 65,132,
+ 2,144, 2,128, 68, 34,145,132,132,132,176, 59,117,234,132,152,152, 24,156, 62,125, 26,123,246,236,249, 30,192, 49, 91,107, 86,
+117, 45,242,111, 64,114, 27, 48,145,215, 65,220,110,135,158, 4,141,211, 12,137, 94, 81, 87,173,113,246,170,139,172,218,147, 74,
+215, 96,250,235,247,194, 11, 47, 88, 43,156, 29,157, 74, 70,125,149,175,168,168,168,223,132, 9, 19,170,112, 82, 20,165, 47, 41,
+ 41,153,214,165, 75,151,245, 44, 22,139, 95,237,129,125, 84, 88, 88,248,183,230,234,171, 30, 71,171,223,128, 87,139,159,148,211,
+149, 75, 54, 77, 61,252, 45, 10, 10,139,241,243,181,124, 69,153,129,234,149, 86, 92,158,244, 44,202,255,232,209,163,254,207,129,
+226,175, 73,180, 62,105,242,236, 34, 59, 2,146,214,151,163,142,168, 12, 39,242, 84, 42,121,126,126,254,234,249,243,231,191,180,
+108,217, 50,239, 35, 71,142, 72, 44, 3,148,161, 67,135, 22, 38, 37, 37,117, 7,192,215,233,116, 39,150, 45, 91,230,189,104,209,
+ 34, 79, 0,158, 0, 16, 27, 27, 91, 80, 80, 80,176, 14, 78,212, 9,147,201,148, 29,213,162,185,117,224,103, 27,210,193,246,189,
+217,108,206,118,132,175, 38, 30,219,125,138,162,234,228, 99,177, 88,239,197,196,196,176,222,123,239,189,130, 35, 71,142, 88, 18,
+233,218, 42,180,212,122,130,146,218, 3, 61,128, 85,149,219,211,132, 70, 46,151,119,118,240, 59,148,243,105,172,113, 64,233,200,
+254, 63,130,253,251,247,127, 60,114,228,200,173, 82,169,244,135,208,208,208,230,190,190,190, 18, 23, 23, 23,232,245,250, 50,131,
+193,112, 55, 53, 53,117,204,199, 31,127,252,208, 46, 11,199,214,173, 44, 0, 92,154,166, 5, 36, 73,138, 0, 72, 8,130,240,176,
+ 8, 45,130, 32, 96, 52, 26,145,145,145,129,121,243,230, 81, 39, 79,158,252, 12,192,167, 14, 12, 92, 59, 0,240,182,105,199,189,
+ 1, 24, 80, 17,192,182,136, 32,136,203,207,250,126, 17, 52, 78, 71, 94, 7,145,220, 6, 53,245, 19,117, 39,149,174,173,194, 21,
+ 21, 21,117,126,218,149,184, 54,206,162,162,162,224,127, 75, 13, 25,167, 95,181, 3,155, 86, 85,201,115,104, 17, 97, 53,237,215,
+ 7,149,214, 60,125,237,177,219,171,245,102,134, 54,154,233, 55,210,138,202,147,157,237,208, 83,199,139, 79,171, 46, 61,197, 50,
+ 37,165,164,164,116,153, 62,125,250,199, 66,161,176, 35, 0,148,151,151, 95,200,205,205, 93,140,202, 85,133,245,125,238, 68,237,
+ 40, 46, 46,110,255,111,228, 51, 24, 12,111,119,233,210,229, 43,138,162, 62, 55,155,205,103,255, 31,252, 21, 58,231,211,248,252,
+ 98,215,174, 93, 15, 1,116, 6,128,225,195,135,179, 0, 96,207,158, 61, 14,139,231,241,227,199, 83, 12,195, 24, 43,159, 7, 13,
+ 42, 86, 23, 42, 44,109,170, 70,163, 81,228,230,230,222,161, 40,234, 14,128, 31,225,248,138, 91,111,130, 32, 14, 49, 12, 51,176,
+ 82,184, 29, 98, 24,102,160,237,177,103,109,213,170,231,148,250,157,225,157,168,192,158,100, 16,213,167, 2,235,219,175, 15,169,
+ 5,154, 4, 0,237,156,119,247,255, 37, 30,228,230,230,142,123,130,207,157,120,254,144,105, 48, 24, 6,255, 63,186, 94,149,243,
+ 47,255,143,244,127, 13, 16, 88, 22,220,185,115,231,153,185, 8,252,211,136,188, 94,117, 0, 94,125,223, 6,113, 53, 9, 47,167,
+208,114,194, 9, 39,156,112,226, 73,160,116,222, 2, 39,254,203,176,248,102, 89,246,107,241,209,170,238,159,101,221, 39, 80,251,
+202, 1, 71,178,146, 55,100,149,196, 9, 39,167,147,211,201,233,228,116,114,254,227,156,238, 0, 66, 0,172,172,231,188,234,171,
+ 11, 11, 0, 20, 3, 48, 57,239,167,147,243, 9,244,131, 93, 96, 24, 38,182,174,169, 67,130, 32, 14, 63, 43,161,101,117,134,111,
+131, 5, 81,215,177,192,178,111,175,208,122,214,232,235,228,116,114, 58, 57,157,156, 78, 78, 39,167,147,211,201,249,132, 66,171,
+247,220,185,115, 63, 68, 69,104, 12,102,238,220,185, 31, 50, 12, 19, 91,241, 17, 19,251, 44,127,251,118, 59,244, 76,110, 3,198,
+178,221,110,135,158,181,156, 26,103,179, 89,225,156, 58,116,194, 9, 39,156,112,194, 9, 39,254,237, 56,191,124,249,242,242,229,
+203,151, 91, 28,223,139, 0, 16,149, 22,174,162,103,249,195,149,211,132,246, 44,148,170, 59, 5,207, 63, 0,127,146,205, 29,203,
+225,242,123,131,161,163, 0, 0, 36,235, 54,101,208,253, 97, 54, 27,127, 0,144,219, 80,226, 8,160, 69, 51,119,151, 3,122,138,
+226,102,149, 25,134,167, 84,164, 57,112, 24,195,129,174,124, 30,239,119,190,187,187, 75, 77,159,235,149, 74,173,222, 96,120,105,
+ 15,112,206, 89, 7,156,112,194, 9, 39,156,120, 78, 32,242,240,240, 56, 73,146,100,176,229,128,109,220,193,234, 49, 8, 41,138,
+202,147,203,229, 47,161, 98,170,248,239,228,180,253,190, 1, 13,236,203,159, 54, 28,157, 58,100, 3, 85,162,176,254, 45, 25,179,
+ 89, 28,254,100,177,155,251,210,255, 77,120,219, 51, 44,188, 57, 17, 20, 20, 0, 48, 64,102, 86,182,239,253,123,105,125,118,109,
+ 91,251,110,169, 74, 62,207,164,215,127,235, 40,119, 11, 64,212,200,149,127,246,219,185,175,185,179, 97,198,232, 37, 63, 29, 37,
+212,198,160, 59, 21,203, 77, 29, 18, 89,238,158,158,199,150,159, 56,225,226,209,186,117,149,207, 24,134,169,200,175,119,243,166,
+203, 71, 47,189,116,108,184, 92,222,207, 41,182,254,147,240,147, 72, 36,179, 56, 28, 78, 47,163,209, 24,204,227,241,178, 40,138,
+ 74, 80, 40, 20, 95, 2,200,113,222,158,255, 54,154,251,137,186, 55, 15, 13,254, 41, 55,191,224, 90,169,206, 48, 49, 53, 87, 45,
+119,222, 21,135, 81, 87,126,205,127, 44,247, 38, 0,184,186,186, 94, 33, 73, 50,208, 86, 4, 88,114,246, 90,246,171,191,210, 52,
+253, 80, 46,151,119,169,131, 54, 84, 42,149,174, 7,208,161,190,128,201,149,177,217, 46,203,229,242,105,168,125,181,158,216,195,
+195, 99, 33, 65, 16, 35, 72,146,100,213,119, 77, 52, 77, 83, 12,195,236, 86, 40, 20,159, 2, 40,171,237, 60, 15, 15,143, 19, 41,
+ 41, 41, 29,124,124,124,234,181,210,152,205,102,100,102,102,122,119,236,216,241,140, 92, 46,143,120,150,156,127,183, 22,105, 40,
+234, 88,117, 88,235,131, 14,160, 74,126,161,103, 26,145,149, 43,112, 61,208,185, 71,191,222, 83,103,190, 39,186,158,116, 23,191,
+159,254, 19,165, 26, 61, 88, 36, 9,119,177, 16,225,225, 77,137, 53,241,123,189,190,223,184,230,243, 11,137,199, 99,117, 26,213,
+ 43, 14,201,116, 33,123,222,156, 33, 29, 69,158, 82, 10,160, 41,188, 63, 32, 90,244,209,161,107,243, 80,110,254,208, 97,145,117,
+242,164,176,176,160, 0,139,252,253,193, 54,155, 33, 32, 73, 8, 8, 2, 2,146,132, 72, 32, 64,255, 45, 91,176,248,200, 17,225,
+199, 47,191,236, 20, 91,255, 49,184,186,186, 78,240,247,247, 95,181,121,243,102,207, 38, 77,154, 64, 36, 18, 65, 46,151,123,165,
+166,166,182,121,231,157,119,198,229,229,229,205, 47, 45, 45,221,228,188, 83,255, 93,208, 52,198,126,183,116, 90, 64,222,163,123,
+ 1, 83,150,237, 8, 39, 60,169, 94,119, 75,180,249,206, 59, 99, 55,218, 0,184,134,154,243,151,214,245, 89,173, 16, 8, 4, 5,
+ 58,157,206,167,174,115,120, 60, 94,161,193, 96,240,173,143,139, 36,201,192,156,156, 28, 31,161, 80, 8,138,162, 42,179, 1,208,
+214,129,180,109,246,147,202, 64,181,136,136,136, 48,214,197, 41, 22,139,191, 41, 44, 44,236,107,201, 19,104, 35,168,106, 68, 78,
+ 78, 78,223,200,200,200,111,202,202,202, 94,170, 69,188, 44,156, 57,115,230,172,150, 45, 91, 90,172, 64,149, 89, 16, 42, 94,139,
+139,139, 49,125,250,116,235,111,208, 52,141,227,199,143,207,156, 48, 97, 2, 20, 10,197, 59,117, 92,123,176,143,143, 15, 81,153,
+ 80,188, 86, 44, 88,176, 0, 11, 22, 44,192,218,181,107, 9, 14,135,227, 94,207,253,124, 42,156,127,151, 22,105,136, 5,171,158,
+200,240,135, 81,213, 55,235,240, 99, 66,235,239, 0,139,195,127,163, 67,151,190,189,166,207,154, 35,218,241,235, 41,164,222,185,
+137,148,179, 59,171,156,211,254,165, 9,200, 47, 46,195,132,169,239,187, 18, 44,118,175,196, 19,251,223, 48,233,181,223,217,105,
+205,242, 13,230,243,102,116,234, 24,197,201,113, 73,133,159,135, 11,186,181,107,198, 9, 58,118,107,134, 6,230,175,238, 84,172,
+146,113, 72,100,109,126,237, 53,116, 55,153,224,195, 98,129, 69, 16, 96, 1, 32, 9, 2, 58,189, 30,151,199,142, 69,199,237,219,
+241,233,193,131,194,133,131, 6, 57, 36,182, 68, 34,209,117,130, 32, 60,212,106,117, 44, 42, 18, 75, 63, 15,136,116,117,117, 61,
+204, 48,140, 66,163,209,180,249, 23,149, 75,134,138, 57,250,234,163, 99, 46, 42, 86, 84, 57,148, 89,152,207,231, 79, 30, 62,124,
+248,154,117,235,214, 9, 11, 10, 10,144,155,155, 11,138,162, 32, 16, 8, 16, 22, 22, 70,156, 56,113,194,115,206,156, 57,171, 15,
+ 31, 62,204, 47, 43, 43,251,202,145,129, 13,135,195,137,151, 74,165, 47,251,250,250,138, 10, 11, 11,203,149, 74,229,113,189, 94,
+ 63, 25, 13, 79,155, 66,114, 56,156, 49, 33, 33, 33,175,250,251,251,251,230,228,228, 20,103,103,103, 31,208,235,245,223,163,129,
+137,154,109,238,105,107, 84, 70,171, 7,144, 23, 18, 18,114, 59, 35, 35,163,240, 41,114,230,134,132,132, 36, 55,128, 83, 4, 96,
+ 23, 0,255,122,206,203, 5, 48, 18, 14, 90,179,173, 55,150,161,127, 91,242,229,230,137,139,198,119, 35,190,123,167,111,216,155,
+107, 79,252, 73,114,153, 30,119,242,116, 89, 78, 13,101,159,200,170, 76,105, 85, 93, 80,213,245, 89,157,208,235,245,222, 70,163,
+ 17,156, 90,146,197,107, 52, 26,136,197, 98,111,123, 11,233,226,226,130,157, 59,119,130,195,225,128,195,225, 64,161, 80, 32, 48,
+ 48,208,186,207,229,114,173,239, 27, 53,106, 84, 47, 31, 69, 81, 29, 89, 44, 22,212,106, 53, 40,138,178,110, 74,165, 18, 12,195,
+128,207,231,131,162, 42,210, 57,217,124,222,177, 54, 62,130, 32, 70,248,251,251, 99,199,142, 29, 48, 24, 12,143,125, 46,145, 72,
+144,148,244, 87,146, 17, 22,139,133,152,152, 24,146, 32,136, 17, 0,222,169,131,151, 1,128,184,184, 56,176, 88, 44,176, 88, 44,
+144, 36,105,125,111,217, 40,138,194,130, 5, 11, 80, 45, 53,217,223,198,249,111, 67, 61,145,225,243, 80,139,143, 22,249,140,203,
+101,187,196,211, 95, 40,146,172,152,246,246,251,174,135,207,220, 66,102, 86,230, 99, 34, 11, 0,174,252,254, 61,242,114,115,112,
+ 45, 37, 27, 99,222,120,203, 85, 34,113, 95, 81,173, 65,173,117,217,168,155,152,251,217,220,145,221, 4,106, 83, 46,202, 60, 0,
+ 86, 40, 15, 28,161, 6,115, 6,182,230, 75,196,220, 85,246,148,147,207,227,253,190,252,196, 9,171,200,234,170,215,131, 79, 81,
+ 48, 83,148, 85,100, 25,204,102,104, 13, 6,200,212,106,220,159, 48, 1,140,201,132,249,191,252, 34,228,243,120,191,219, 83, 78,
+ 0,224,114,185,178, 3, 7, 14, 52,106,213,170,213,105,216, 31,204,244,196, 51,254,143,234, 66,187,232,232,232,132,237,219,183,
+ 55,226,114,185,178,167,193, 41, 16, 8,134,137, 68,162, 34,129, 64, 48,172,129,229, 36, 1, 44,153, 56,113,226,213,166, 77,155,
+158,170, 20, 86, 86, 81,211,180,105,211, 19, 19, 39, 78,188, 14, 96, 65, 45,207,122, 77,156, 1,254,254,254, 75,215,173, 91, 39,
+ 76, 75, 75, 67, 78, 78, 14, 76, 38, 19, 70,143, 30, 13,138,162,160,213,106, 97, 48, 24,176,114,229, 74,145,167,167,231, 60, 84,
+ 36, 10,182,231,218,185,110,110,110,105,219,182,109, 27,158,158,158,238,122,234,212, 41, 34, 41, 41, 73,180,122,245,234,193,158,
+158,158,169, 0,248, 13,184,159,164, 76, 38,251,110,255,254,253,211,146,146,146, 2,247,237,219,199,185,112,225,130,108,227,198,
+141,147,100, 50,217,118, 0,172, 6,254, 71,109,132, 66, 97,159,217,179,103,211,231,207,159,207, 57,127,254,124,206,154, 53,107,
+208,189,123,247,174,139, 22, 45,106,219, 64,206,118, 98,177,248,133,217,179,103,211,137,137,137,185, 23, 47, 94,204, 94,189,122,
+ 53,249,194, 11, 47,116, 91,186,116,105,107, 7, 57,119,157, 63,127,190,103, 86, 86, 86,147,236,236,236,198,217,217,217, 33,217,
+217,217, 33, 57, 57, 57,193,121,121,121,141,242,243,243,131, 10, 11, 11,131, 18, 18, 18,186, 1,248,201, 30,206,230,190,162,105,
+239,140,238, 91, 62,239,141, 1,204,135,175,191,200,204, 25,221,147,121,185, 71,171, 95, 89,108, 54,113, 49, 57, 19,129,110,192,
+247,211, 59, 4, 7,121,137,146,162,164,174,225,255,178,186,249,111,227,100, 91,132,148, 92, 46,199,225,195,135, 81,105,189,106,
+ 99, 43,178, 74, 75, 75,145,151,151,103,249,140,109, 79, 57, 37, 18,201,201,205,155, 55, 51, 58,157, 14, 42,149, 10,133,133,133,
+200,202,202,194,253,251,247, 81, 82, 82,130,187,119,239, 66, 40, 20,158,180,167,156, 4, 65,128,162, 40,171,144, 58,126,252, 56,
+ 38, 78,156, 8,185, 92,110, 61,198,102,179,173,239, 45,223,169,143,211, 98,121,162, 40, 10, 23, 47, 94,196,148, 41, 83,176,102,
+205, 26,252,244,211, 79, 56,116,232, 16,228,114,185, 85,108,153,205,230,122, 57,139,139,139, 65,211,246,141,153, 24,134,129, 74,
+165,178,251,127,183, 21, 64,108, 54,251, 49, 81,100,217, 28,121,150,158,144,243, 95, 11, 59, 34,195,215, 62,194,182,188,169, 52,
+213,245,122, 86,133, 36,217,220, 49, 35,198,207,244,204, 46, 44, 69, 78,129, 10, 44,242,175,126,175,109,223,241, 96,179, 72, 92,
+ 58, 86, 97,184, 34, 89, 44,168, 52,122, 40,213, 70, 12, 31, 63, 75,250,237,154, 79,198,152,141,186, 58, 99,188,180, 4,194,162,
+ 92, 93,135, 68, 70, 54, 34,239,240, 83,208,246,229,179,160,104,128, 73, 28,132, 54, 10, 31, 86,196,239,188, 33,154, 50,227,210,
+ 36, 32,173, 78,107,134,187,187,139, 71,235,214, 88,228,239,143, 30, 38, 19,184, 12,131, 23, 11, 10,112,115,214, 44,232,247,238,
+ 5, 9,128, 59,108, 24,122,127,249, 37,206,248,251,195, 79,171,133,242,221,119,225,125,244, 40,184, 18,137, 11,138,236, 91,252,
+ 64, 16, 4,122,245,234,133, 19, 39, 78,120,246,239,223,255,216,173, 91,183,134,154,205,230, 51, 13,185,183,110,110,110, 87,216,
+108,118, 96,125,231,153,205,230,108,149, 74,229,112,154, 17, 54,155,221, 35, 38, 38,230,151,125,251,246,121, 24,141,198,167, 50,
+ 10,225,241,120,253, 7, 15, 30,188,121,195,134, 13,146, 73,147, 38,109, 62,116,232, 80,185,193, 96, 56,234,200, 35, 5, 96,201,
+166, 77,155,222,140,139,139,115,159, 52,105, 18,115,255,254,125, 91,235,149,119,247,238,221,155,110,222,188,217,175, 67,135, 14,
+ 51,167, 76,153,194, 5, 48,191, 62, 43,143,171,171,235,212,205,155, 55,123, 21, 23, 23, 67,173, 86, 91, 27,217,236,236,108,184,
+184,184,128, 36, 73,144, 36, 9, 14,135,131, 21, 43, 86,120, 78,157, 58,117,150, 92, 46,159,101,135,149, 44,126,253,250,245,222,
+ 47,189,244, 18,153,158,158, 14,146, 36, 33, 16, 8,240,218,107,175,145, 90,173,214, 99,209,162, 69, 91, 53, 26,205, 40, 71,238,
+ 33,135,195, 25, 19, 31, 31, 31,222,181,107, 87,118, 74, 74, 10, 58,119,238,140, 75,151, 46, 97,216,176, 97,156,178,178,178,198,
+115,230,204,153,168,215,235, 29,141,227, 34, 19, 10,133, 45,255,248,227,143,172,160,160, 32,107,195,210,184,113, 99, 42, 54, 54,
+ 86,158,146,146,210,252,252,249,243, 37, 93,186,116,113, 36, 97,121,128, 80, 40,140,248,237,183,223,242, 22, 45, 90,212,103,211,
+166, 77,131, 1,160, 99,199,142, 7, 22, 47, 94,124, 74, 46,151, 71,157, 57,115, 70,222,163, 71,143,108, 59,249,252,101, 50, 25,
+ 53,125,250,116,215,186, 78,218,178,101,139, 18, 21, 9,151,155, 0,168, 51, 95, 91,243, 16,191,121,171,102,141,112, 1,101, 4,
+ 99,210, 2,198,114,192,168, 6,109, 40, 7,193,117, 1, 76, 90,120,243,229,216, 53,181,185,228,131, 29, 15,238, 80,119,137,216,
+148,226,178,163,112,162,198,166, 6, 64, 91,130, 32,174, 29, 62,124, 24, 49, 49, 49, 56,124,248, 48, 98, 99, 99,175,217,138,129,
+164,164, 36,244,232,209, 3,149, 22, 45,187,124,181, 84, 42,213,220, 5, 11, 22, 36,142, 25, 51, 70, 88,165, 49, 32, 73,184,187,
+187, 99,192,128, 1, 58,141, 70, 51,215,222,130, 82, 20, 5, 54,155,141,236,236,108,108,217,178, 5,203,150, 45, 67, 88, 88, 24,
+ 76, 38,211, 99, 98,171,178,221,179,171,241, 51,155,205,184,124,249, 50,126,216,190, 29,243,231,205,131, 88, 44, 6, 0, 24,141,
+ 70,200, 21, 10, 8, 4, 2,171, 24,171, 71, 56,237,190,119,239,222,172,192,192,192, 42, 83,134,150,215,202, 54, 11, 52, 77,195,
+108, 54, 67,167,211, 97,205,154, 53,102,134, 97,118,215,215,255, 88, 68,209,172, 89,179,160,215,255,101, 80,111, 93,233,147, 28,
+ 18, 18,130,232,232,104,235, 62, 73,146,140,189,156,223,118,105, 9,173,205,217,205, 23,172, 6, 0, 4, 6, 6,162,121,243,230,
+144,201,100,181,114, 62,107, 45,210, 16, 56, 16, 25,190,118,161,245,119,100,202,230,112, 5,189, 67,155,133, 19,153,121,114,176,
+217,108,136,220,188,208,229,213,119,192, 98,145,112,117,247, 2, 65,105,255, 82,196, 36, 11,108, 22, 27,242, 50, 45, 66,154, 52,
+ 35,249, 2,151,222,154,122,132,150,196,141,179,126,246,168, 46,130, 18,115, 54, 92, 26, 9, 64, 89,186, 83,127, 30, 72,207, 50,
+188,215, 63,204, 37,238,192,173,245, 80,153, 94,176,167,188, 44,179, 25, 62, 44, 22,140, 12,131,155,179,102,161,109,124, 60,174,
+ 89,132, 97,124, 60,174,197,197, 65,202,225,128, 79,146, 96, 76,166,199,230,244,237, 17, 90, 0,144,149,149,133,189,123,247, 74,
+ 71,140, 24,241, 75, 82, 82,210, 24, 7,197,134,133,203,235,226,197,139, 62, 77,154, 52,169,245,156,135, 15, 31,162,125,251,246,
+ 14, 79, 79,241,120,188,254, 47,188,240,194,142,189,123,247,186, 37, 39, 39,195,199,199,231,137,133, 22,159,207,239,209,183,111,
+223, 29,219,182,109,147, 20, 21, 21, 33, 62, 62, 94, 50,104,208,160,159,174, 94,189,250,170, 94,175,183, 71,108, 86, 17, 89,241,
+241,241,202, 45, 91,182,124,139,170, 83,132,121, 91,182,108,249,174, 67,135, 14,211,226,226,226,220, 1,188, 89,233, 59, 80,167,
+216,226,243,249,189, 66, 67, 67,171,140,106,249,252, 10, 99,147, 72, 36,130,155,155, 27,184, 92, 46,244,122, 61,218,182,109, 75,
+240,120,188,110,246, 92,179, 88, 44,238, 59,100,200, 16,242,236,217,179,200,207,207,135,187,187, 59, 92, 93, 93, 65, 81, 20, 38,
+ 77,154,196, 90,179,102, 77, 47,141,198,177, 25,174,160,160,160,193,125,250,244, 97,223,190,125, 27,233,233,233,208,235,245, 72,
+ 77, 77,133, 68, 34,193,235,175,191,206, 93,181,106,213,160,156,156, 28, 71,133, 86,203,184,184,184, 2, 91,145,101,129, 72, 36,
+ 34,194,195,195,229,158,158,158,237, 0, 56, 34,180, 90,190,245,214, 91,133,203,151, 47,239,113,226,196, 9,107,208,203, 19, 39,
+ 78,204, 1,128,175,190,250, 42,209,219,219,187, 29, 0,123,133, 22, 24,134,161,255,247,191,255, 61,226,241,120,224,112, 56,224,
+241,120, 85, 54, 46,151, 11,146, 36,197,150,234, 92, 31,223,157,244,252,149,147,230,172, 94, 45, 18,176, 56,111,191,218, 10,141,
+220,185,128,139, 20,220, 30, 31,128,112,175, 48, 90, 50,242,135,192,239, 31,224,243, 33,114, 50,238, 71,221,175, 70,202,195,251,
+129, 66, 81,246, 15,247, 1, 29, 0,124,129,138,228,186,243, 0, 92,252,151,244, 77,215, 1,180,141,141,141,181,138,173, 35, 71,
+142,160,127,255,254, 80, 42,149,184,125,251,182,173,200,114, 36,193,242,117,147,201,116, 99,231,206,157, 93, 70,140, 24, 65,216,
+212, 47, 36, 39, 39,227,238,221,187,215,236,229, 35, 73, 18, 52, 77,131,195,225, 96,245,234,213, 48, 26,141,248,241,199, 31,177,
+103,207, 30,144, 36, 9,130, 32, 64, 16, 4, 36, 18, 9,214,174, 93,235, 80,187, 71, 81, 20,182,110,221,138, 15,230,204,177,138,
+172,202,153, 12,248,249,250,194,211,203, 11, 15, 30, 60,168, 87,104, 41, 20,138, 79, 15, 30, 60,136,186,156,225, 15, 30, 60,104,
+125, 95,205, 25,190,254,126,142,197,130, 94,175,199,139, 47,254,149, 42,246,173,183,222,178,190,151,203,229, 96,177, 88,150,123,
+ 65,216,203,169,101,128, 87, 5,127, 29, 27,240,222,123, 85, 44,116,181,113,254, 29, 90,228,105, 89,183,106, 16, 91,109, 43,173,
+179, 50, 0,177,168,240,209,202, 3,254, 70, 31, 45,134,161, 35, 2, 3,252,113,227,126, 18,216, 44, 22,120,110, 94,112,147,250,
+130, 54, 27,160, 42, 76,199,233,125,223, 0, 0, 54,109,221, 13,146, 36,193,102,179,160, 55, 80, 8,107,228, 15,154,166, 35,234,
+226,110, 1,116,233,229,235, 21, 19, 20,236, 78,220,246, 72, 71,184,143,103,181,137, 16, 62,194,114, 93,137,206,174, 46, 29, 21,
+170,210, 46,119,128,243,245,138, 1,146, 4, 73, 16, 16,114,185,208,239,221, 91,225,181, 25, 95,209,103, 93,139,139, 3,249,235,
+175, 16,243,249, 96, 17, 4,216,149, 38,232,134,160,180,180, 20, 4, 65,224,135, 31,126,240,120,253,245,215,127,186,125,251,118,
+156, 78,167,219,235, 8,135, 82,169,140,237,218,181,235,169,173, 91,183,122,251,249,249, 61,246,121,126,126, 62,198,143, 31, 95,
+164, 84, 42, 29, 10,234, 38, 16, 8,134, 13, 30, 60,120,243,247,223,127, 47,185,119,239, 30,212,106, 53,188,189,189,159,244, 81,
+104,215,169, 83,167, 95,246,238,221,235,150,159,159, 15,149, 74, 5,189, 94,143, 31,126,248,193,125,192,128, 1,123, 83, 82, 82,
+250, 3,184, 90, 15,199,199,182, 34,107,202,148, 41,183, 0,248, 0, 88, 95, 93,131, 86,126,214,202, 70,108,169, 0,172,170, 99,
+ 36, 26, 44, 18,137, 80, 88, 88,136,241,227,199, 35, 45,237, 47, 3,168,191,191,191,117,164,247,224,193, 3,120,123,123,131, 32,
+ 8, 31,123, 46,218,219,219,219,213, 96, 48, 96,226,196,137,200,202,202,170,194,153,157,157, 13,130, 32,132,142,222, 72, 95, 95,
+ 95, 95,173, 86,139,238,221,187, 67,167,171,200,235, 59,114,228, 72,112, 56, 28, 20, 22, 22,130,195,225,120, 53,224,255,241,138,
+141,141,173, 53,180,138, 68, 34, 49,122,120,120,180,112,144,211,115,208,160, 65, 57,241,241,241,143, 45,108,185,116,233,210, 43,
+ 82,169,244,132, 84, 42, 13,119,144,147,182, 21, 85, 92, 46,183,138,208,226,112, 56, 32, 73,210,110, 31,181,180, 66,205, 58, 54,
+145, 23,189,124,250, 75,227, 27,249,184,129, 81, 23,128,251,194,167,184, 81,228,130,213,107,126, 3, 0,188,255, 90,123,180,238,
+187, 4,134,239, 95,194,172,206, 44,222,216,108,253,108, 0, 31,255,195,109,254,103, 0, 44,171,224, 54, 0,136,254, 23,245, 71,
+ 86,177,117,228,200, 17, 68, 69, 69, 65,161, 80, 32, 37, 37,165,161, 34,203,210,222,125,176,112,225,194,223,135, 14, 29, 42,178,
+ 12, 90, 93, 92, 92,240,127,237, 93,123, 84, 83, 87,186,255,157, 71, 66, 30, 4,194, 43, 32,136,200,104,173, 76,175,214, 22,209,
+139, 35,171,234,200, 88,167,237,189,122, 45,213, 86, 17,103,164,168,181,171,183,216,233,114,185,250, 82,116,218,233,172, 58,234,
+213, 90,229,138,181, 58, 90,107,213, 90,171,213,118,236,128, 58,245, 78, 21,107, 91, 40, 90, 81, 65, 20, 8,121, 72, 18,194, 33,
+207,115,238, 31,228,196, 24,147,144,132, 19,197, 14,223, 90,123, 17,146,240,227,219,175,179,127,251,219,223,247,237, 37, 75,150,
+ 48, 29, 29, 29, 75, 67, 26, 68, 44, 11,154,166,221,155,100,169, 84,138,236,236,108, 55,201, 34, 8, 2,157,157,157,160,105,154,
+143, 72, 36,130,212, 17,169, 3, 6, 32, 38, 38, 6,195,238,191, 31, 23, 93,207, 17,254,181, 68, 34, 1, 65, 16,112, 56,122, 52,
+228,153, 92, 78,237,165, 66, 47,201, 60, 41, 10,104, 58, 78, 75, 3,203,178, 60,201,228,132,192, 76, 74, 74, 66, 71, 71, 71,176,
+152,125, 82,252, 88,180,120,162,245, 56,186,125,181,110, 75,239, 48, 1, 64, 37, 34, 24, 82, 73,128, 35, 88,142, 3, 77,145,174,
+179, 91, 10, 20, 69, 66,175,105,193,218, 55, 22,186, 72,214,199, 56,116,162, 14,233, 67, 71,220, 60,199, 37, 8,128, 11, 60,184,
+ 85, 74,113,249,162, 25,185, 50, 53,209,130,184, 52, 57,164, 82, 47,254, 24, 47, 6,145, 73, 98,241,196,116,249,233,131, 93,229,
+ 63, 26,108, 61, 46, 20, 82,146,236,118,126, 39, 8,159,206, 61,164,235, 51,138, 32,192,113, 28, 56, 54, 52,191, 99,158,200,203,
+100, 50,216,108, 54, 80, 20,133,245,235,215,199,229,231,231,111, 12,149,104, 1,168, 85,171,213,143, 21, 23, 23,127,190,103,207,
+158,164,164,164,164, 91,118, 15,197,197,197, 90,181, 90,253, 24, 66,116,186, 23,137, 68, 27,223,123,239,189,216,134,134, 6,116,
+118,118, 66, 38,147,185, 31, 62,225,142,207,177, 99,199, 30, 61,114,228, 72,188,193, 96,128,205,102,131, 76, 38, 3,199,113,160,
+ 40, 10,187,119,239, 78,124,226,137, 39, 14, 95,189,122,245,215,129,116,149,201,100,211, 93,196, 9, 37, 37, 37,113, 37, 37, 37,
+ 19, 0,191,153,122,221, 82, 82, 82, 18, 87, 90, 90,250, 31, 12,195,252, 57, 64,157,155,244,122,253, 0,153, 76,134,125,251,246,
+ 65,161, 80, 64, 46,151, 35, 45, 45, 13,122,189, 30,114,185, 28, 28,199,193,110,183,243, 15, 11, 93, 48, 21,215,104, 52, 29, 14,
+135, 67,249,249,231,159, 67,167,187,249, 39, 25, 25, 25,104,111,111, 7,203,178,157,161, 54,102,115,115,179,154, 32,136, 65,231,
+206,157, 67, 67, 67, 3,166, 78,157,138, 79, 62,249, 4, 57, 57,221,167,195, 86,171, 53,156, 36,126, 78,138,162,184, 0,227,150,
+ 0, 16, 47, 36,166,107,241, 10, 9,147,101, 89,150, 39, 89,158, 63, 61,201, 87, 15,255,243,150,233,252, 64,138,162,226,173, 69,
+147,231, 77, 25,145, 4, 70,115, 5,210,152, 36, 16,113,153,120,103,205, 97,212, 92,238,238,175,119,118,158,193,174,178,199, 0,
+ 89, 2,178,148, 90, 12,136,161,255,235,124,219, 93, 39, 90, 74,207,125, 66, 95, 93,152,166, 78,157, 10,189, 94, 15,133, 66, 33,
+132,127,206, 41,134, 97, 46, 28, 56,112, 96,244,227,143, 63,142,168,168, 40, 92,184,112, 1,213,213,213,117, 0, 78,133, 74,180,
+ 68, 34, 17, 86,172, 88,129,133, 11, 23, 34, 37, 37, 5, 75,151, 46, 5, 77,211,238, 66, 16,132,219,194, 21,138, 36,167, 4, 14,
+124,228, 29,226,123, 50,134, 43,149,202, 21, 36, 73, 62, 69, 5,209,112, 78,167,211,201,178,236, 30,131,193, 16, 48,189, 3,239,
+184, 30, 76, 95,120,182, 65, 15,107, 90,175, 49,239, 4, 23, 9, 71,188,163, 13,253, 88,180,248,168,195,219,174, 2,226,107, 89,
+233, 50,217, 85, 70, 74, 81,130,164,206, 95,187,222,140,196,120,133,139,100,185, 10, 73, 98,212,136,238,205,236,161, 19,117, 72,
+ 31, 50, 2, 52, 69,129,166, 40, 40,100, 18,168, 91, 91, 64,211,228,121,127,184, 35, 41,204,152, 49,124, 80,102,124,162, 8, 90,
+149, 21,169, 41,126, 12, 3,163, 99,144,158, 26,133, 71, 19,165,131, 71, 82,152, 17,216,250,198,185,137,150,205,225,128,248,201,
+ 39,221,199,133,103, 75, 74,144, 93, 94, 14,231,180,105, 48,219,108,183,152,138,195, 37, 90, 50,153, 12, 38,147, 9,115,230,204,
+209,219,237,246,231,194,108,226,106,157, 78, 87, 80, 88, 88,168,227, 9,140,205,102, 67, 97, 97,161, 78,167,211, 21, 4, 97, 37,
+186, 77,236,118,251,115, 57, 57, 57,122,173, 86,235,214, 51,156, 7, 14, 47, 9, 9, 9,135, 42, 42, 42, 18, 44, 22, 11, 28, 14,
+135, 27, 83, 38,147,129,162, 40,168, 84, 42,236,218,181, 75,149,144,144, 16,240,206, 42,134, 97, 14,148,151,151,183, 3, 64,121,
+121,121, 59, 65, 16, 85, 4, 65,108, 34, 8,226, 61,175,178,137, 32,136, 42,207,239, 50, 12,179, 63, 16,182,213,106,173,170,171,
+171,227,228,114, 57, 40,138,130,205,102,131, 84, 42,117,155,196,141, 70, 35, 24,166,251,152,187,186,186, 26,118,187,253,100, 48,
+117, 55,153, 76,199,182,109,219,198,102,100,100, 96,196,136, 17,200,206,206, 70,110,110, 46, 6, 15, 30,140,149, 43, 87, 58,205,
+102,115,200,115,175,185,185,249,208, 71, 31,125,100, 31, 52,104, 16, 70,143, 30, 13,137, 68,130, 81,163, 70, 33, 45, 45, 13,111,
+190,249,166,213, 96, 48,124, 30, 70, 55, 93,253,225,135, 31,168, 0, 36, 55, 22, 65, 68,239,122, 73,211,233,211,167,169,220,220,
+220, 79,189, 63, 24, 59,118,236,167, 10,133, 66,201,155,216, 67,217,145,123,146, 43,137, 68,226, 46,252,251, 52, 77, 7,179,251,
+ 33, 31, 72, 81, 84,252,105,225,164,121, 83, 70,196,227,211, 99,255,132,216,214, 14, 88, 3,156, 8, 58,237, 32,196,209, 72, 81,
+138,210,251,192, 26,240, 34,128,239,209,157,135,105, 41,250,150,184, 29,223,117, 58, 29,234,234,234, 80, 93, 93,141,220,220, 92,
+156, 60,121, 18,184,233, 32, 31,178, 24, 12,134,165,101,101,101,102, 62,146,239,149, 87, 94, 97, 76, 38,211,210, 80,159,193, 28,
+199, 65, 36, 18, 33, 43, 43, 11,165,165,165, 56,124,248, 48, 46, 92,184, 0,187,221,238, 38, 66,188, 79,102, 40, 22, 45,177, 88,
+140,148,148, 20,216,237,118,183, 53, 11, 0, 46,254,244, 19,104,154, 6,203,178,176, 90,173, 61, 90,180,148, 74,229,138, 45, 91,
+182,188,160,213,106, 83, 53, 26, 77,178,103, 81,171,213,201, 45, 45, 45,201,215,175, 95, 79,110,106,106, 74,110,108,108, 76,190,
+114,229, 74,234,219,111,191,253,130, 82,169, 92, 17,140,158, 20, 69, 97,212,168, 81,120,254,249,231,221,101,195,134, 13,238, 82,
+ 89, 89, 25,178,243, 58, 69, 81,200, 90,254, 14, 30,211,112,238,114, 88, 69,184, 75,205, 31, 22, 4,194,140, 56, 23, 9,139,191,
+184,162, 13, 61, 47,150,246, 33,124,212, 33,255, 44,115,187,109,120, 59,195, 71, 76, 28,214,174,175, 46,215,255, 52, 41,107,228,
+ 24,178, 85,219,113, 75,248,103,246,196, 2, 16, 4,129,129, 67, 70,128,162,105, 80, 20, 9,154,162, 16, 23, 43, 69,221,185,115,
+172,133, 97,190,242,133, 57, 1,160,163,100, 81, 27,102, 63, 58, 74,218, 28,213, 6, 85,106, 52,196,162,110,238,200, 93, 46,240,
+ 90, 33,104, 96,100, 12,126,119, 61, 81,246,149,186,107, 67,188,217,246,105,149,159, 29, 32,203,178, 80, 72, 36,232,178, 88,192,
+ 56, 28,152,184,118,173,251,184,144, 36, 8,124, 11,224,193,181,107,241,245,222,189,136,141,138, 2, 36,146,160,163, 66,124, 17,
+ 45,173, 86,139,162,162, 34, 93, 75, 75,203,220,112,124,180,120,177, 88, 44,199, 91, 91, 91,231, 22, 20, 20,236,216,183,111, 95,
+ 66, 65, 65,129,190,181,181,117,110,144,126, 79,183, 73, 87, 87,215,222,166,166,166,206,162,162,162,237, 59,119,238, 76, 76, 74,
+ 74,114,239, 68,194, 26,172, 4,161,157, 60,121,178, 36,152,239,245,240,149, 50,151,115,251, 66,151,101,235,193, 5, 11, 22,124,
+141,110,255, 43, 79, 89,190,121,243,230,153, 30, 71,140,155, 0,172, 13, 4,108, 52, 26,223, 43, 45, 45,253,253,241,227,199,147,
+164, 82, 41, 8,130,128, 88, 44,198,176, 97,195,220, 81, 52, 34,145, 8, 28,199,225,165,151, 94,210,182,181,181,173, 11,178,111,
+ 22,148,149,149, 61,210,213,213, 21, 95, 84, 84, 68, 73,165, 82,168,213,106,172, 89,179,198,249,254,251,239,183,155,205,230,121,
+ 97, 16,225,109,175,191,254,250,196,142,142,142, 33,197,197,197, 98,131,193, 0,134, 97,240,242,203, 47, 91,183,110,221,122,141,
+ 97,152,144, 19,254,142, 27, 55,174,190,177,177, 49,175,179,179,243,134, 92, 46,247,182,246, 17,209,209,209, 99, 0,108, 15, 5,
+ 51, 59, 59,251,210,213,171, 87,115, 87,173, 90, 85,101,183,219, 69,223,124,243,141,219, 25,126,253,250,245,149, 82,169,116, 50,
+ 66,188,124,149, 32, 8, 86, 34,145,220, 98,193,242,126, 77,211,116,143,207,180, 95, 14,144,175,250,211,179,143,204,251,205, 3,
+ 74, 28, 56,118, 6,101,251, 47,159,191,127,158, 42,235,190,120, 13, 88, 77, 29,254, 48, 59, 7,239,236, 60, 3,160,251,232,144,
+109,171, 1,119,227, 18,184,152, 65,184,162,215, 54,247,129, 53,160, 18,221, 41, 51,250,154,220, 66,178,106,106,106, 48,105,210,
+ 36, 0,192,201,147, 39, 49,126,252,120,156, 60,121, 18,121,121,121, 33,231,210,114,201,223,141, 70, 99, 99,101,101,229,191, 13,
+ 26, 52, 8,167, 78,157,186, 2,224,239,161, 42,201, 19, 45,154,166,241,204, 51,207, 32, 63, 63, 31, 25, 25, 25,183, 68, 27,242,
+175, 67, 33, 27, 14,135, 3, 35, 71,142,132,197,106,133, 88, 44,118, 31, 77,210, 52, 13, 85,114, 50,234,235,235,131,178,104,145,
+ 36,249,212,244,233,211,201,218,218, 90,204,154, 53, 11, 59,118,236,240,251,221,194,194, 66,124,248,225,135,152, 62,125, 58,185,
+108,217,178,128,233, 29,120, 39,244, 96,234,196,175,211, 61, 61,247,133,194,140, 52, 23,233,141,120,164,118,240,121,104,226,227,
+189,242, 91,136,150, 71,146,176,200, 16, 45,135,109,199, 39,127,125,183, 52,119, 99,158, 42, 53, 89, 9,189,129,113,147,173,179,
+149, 31, 3, 0,102, 44,248, 35,104,170,251, 72, 49, 86, 33,133, 76, 76, 97,239, 7,235,180, 54, 91,151,207,209,101, 18,145, 11,
+151,253,106,152, 50, 42,218, 14,227, 0, 14, 35, 84, 55,111,202, 33,134,124,124, 59,225,122, 56, 30, 73, 53, 55, 48,251, 62, 69,
+236,186,218,246,133,176,179, 27,110, 91, 16,219,219,153,246,115,231,100, 83,183,108,193, 55,115,231, 98,160,211,137,170,180, 52,
+ 36,136, 68, 80, 74, 36, 32, 9, 2,204,103,159,225,235,125,251,144, 34,145, 0, 49, 49,112,172, 92, 9, 75, 93, 29,236, 38, 19,
+ 19,198,206, 12, 51,103,206,212,106,181,218, 2,171,213,122,188,183,237,204, 48,204,145,166,166,166,133,227,198,141,219,104,183,
+219,159, 99, 24,166, 87,145, 81, 86,171,245, 72,107,107,235,147, 51,103,206,252,120,255,254,253, 73,113,113,113, 97, 99,233,116,
+186, 28,129,134, 19, 11,224, 85,151,115,251,194,146,146,146,184,211,167, 79,255,190,162,162, 98,163,199,110, 34,121,254,252,249,
+207,122,145,172, 30,163, 14, 1, 92,109,107,107, 91,185,100,201,146, 63,174, 94,189, 90,193, 59,190,127,247,221,119,112, 56, 28,
+ 16,137, 68,112, 58,157,152, 63,127,126,135, 78,167,123, 7,254, 51, 58,223, 54,180,140, 70,227,176, 85,171, 86, 85,172, 93,187,
+ 54,159,162,168,104,167,211,105,238,236,236,172,234,234,234,154,135,240,242,104,177, 26,141,166,232,181,215, 94, 43, 90,179,102,
+205,116,146, 36,147, 29, 14,135,214,100, 50, 29,100, 24,102, 43,194, 56, 74, 58,117,234,148,102,246,236,217,151, 53, 26,205, 47,
+211,211,211, 13, 10,156,255,133, 45, 0, 0, 8, 95, 73, 68, 65, 84,133,194,106,181, 90, 41,153, 76, 22, 27, 29, 29,157, 13,224,
+ 20, 65, 16, 63,134,130,121,246,236,217,214,226,226,226, 6,139,197,146,181,105,211,166, 19,177,177,177,199, 8,130, 32,196, 98,
+113,188, 76, 38,155, 4,160,138, 32,136,139,161, 96,146, 36,201,122, 90,175,188,253,179,162,162,162,130,242,209, 26,162,146,255,
+ 46,127, 24,141, 3, 95,157, 65,217,129,171,219,156, 28,183,111,223,217, 27,159, 45, 29, 15,216,246,204,198,168,130,237,221,199,
+133, 0,216,182, 26,216,246, 20,130,144, 39,225,196,117, 17, 12,140,237, 16,250,197,151,184,211, 59,104,181, 90,212,214,214,242,
+ 36, 43, 27, 0,242,242,242,206,242,100,171,186,186, 26,163, 71,143, 62, 11, 64, 20,234,120, 53, 26,141, 75,230,204,153,115,196,
+181, 57, 94, 18,198,198,207, 77,180,120, 66,149,145,145,225,254,221,179,120,248,104, 5, 37, 78,167, 19, 98,177, 24, 52, 77, 35,
+ 53, 45,205,253,191, 56,142, 67,125,125, 61,244,122,125, 80, 68,139,162, 40,138, 32, 8,204,154, 21, 92, 64,242,211, 79, 63,141,
+170,170, 42, 80, 65,178, 66,138,162,144,153,153,217,227,119,120, 94, 26, 44,102,122,122,122,216,152,145,230, 34,225, 18, 44, 95,
+175,125,145, 42,127, 19,226, 78, 73,115, 71,135,225,213, 15,182,172, 95, 61,127,209, 75,138,154, 75,106, 24, 58, 44,160, 40,210,
+243,225, 9,154,166, 16, 27, 45,197,160, 1, 74,236,252,223,191,152, 76,198,246,215,224,231,222,195,140, 24,241,130,201, 99,238,
+147,136, 83,205,200,122,112, 38, 40,233, 77, 18,192,181,250, 57, 29, 28,255, 5,126,123,213, 44,253,228,170,121,193,183, 55,172,
+183, 19, 45,171,117,202, 43,143, 62,122,180,236,240, 97,249,216,109,219,112,105,254,124,164, 49, 12, 36,174,163, 68,146, 32,160,
+ 16,139,161, 16,139,187, 73,214,154, 53, 96, 28, 14,172,157, 59,183,211, 98,181, 62, 26,202, 36,215,233,116,152, 54,109,154,166,
+185,185,249, 49,132,113,180,231, 79,204,102,243, 94, 0,123,133,194,179, 88, 44,199,175, 93,187,246,219,105,211,166, 29, 62,114,
+228,136,170,143, 36,153,227,201,150,237,244,233,211,207,158, 56,113,226, 18,110,189, 88,180,253,196,137, 19,151,138,139,139,137,
+138,138,138,173, 0, 94, 71,144, 9, 60,205,102,243,250, 47,191,252, 18,143, 60,242,200,235,111,189,245, 86, 98, 78, 78, 14,146,
+147,147, 97, 50,153, 80, 93, 93,141, 23, 95,124, 81,111, 52, 26,223,106,111,111, 95, 29,162,206, 54,139,197, 82,232, 25, 74, 45,
+ 68, 59, 88, 44,150,247, 91, 90, 90,222, 23, 10,112,241,226,197,223,213,215,215,235, 84, 42,213,191,139,197,226, 7,209,237, 7,
+212, 10, 96,107,168,132,136,151, 69,139, 22,157,171,175,175,215, 14, 28, 56, 48,215,133, 25,135,238,107,140,182,132,129,217,124,
+230,204,153,244, 49, 99,198,144, 34,145,136,163, 40, 10, 34,145,136,163,105,154,115,249,213,112, 0,112,240,224, 65, 9,128,128,
+215,230, 92,106, 99, 86, 21,254,229, 31,203,126,108,237,218, 87,167,238, 44, 5,192,237,169,145,127, 49, 74, 69, 77,153, 50,252,
+ 26, 44,229,121, 32, 98,187, 19, 85,114, 29, 45, 32,162, 83,112,141, 29,136,229,159,158,111,117,128,248,115, 63,167,242,189,175,
+134, 43,189, 67, 75, 75,139, 39,201,226,173, 86,217,121,121,121,103, 93, 36,139,255, 44, 28,255,178,191,177, 44,219,171, 53,140,
+227, 56,148,149,149, 97,243,230,205,232, 41,163,185, 43,186,143,232, 9,143,183,104, 57,157, 78,216,108, 54,212,212,212,184,115,
+118,241,199,133,124,106, 7,135,195, 17, 48, 90,221,233,116, 58,173, 86, 43,118,239,222, 29, 20,217,218,181,107, 23,186,186,186,
+224,236,129,193,121,166, 98,120,232,161,135,160,215,235,221,193, 62,217,217, 55, 83,229,217,108,182,144,136, 43,143,153,149,149,
+ 5,173, 86, 11,222, 95,120,208,220,155,198, 30,135,217,252,115, 29,247,126, 45, 90,119,124,197,148,200, 99,143,228,252, 42,127,
+252,220,103, 95,140,238,176, 56,209,208,208, 8, 77, 91, 11, 72,130, 68,234,192,116, 12, 30,156, 9, 89, 20,137, 29,229,171,205,
+103,191, 62,246,143, 14,211,141,169,254,176, 30, 87,138,191, 94,243,228,248,220,161, 67, 99, 8, 56,236,128,211, 14, 56,236, 0,
+235,250,201,191,199,222, 58,230,106,107,219,185,101,223,234,255,239,144,193,230,243,206,170, 2, 96,124, 92, 66,194,209,229, 7,
+ 15,202, 89,155, 13,186, 37, 75, 32,119, 56, 32,117,237, 74,186, 43, 34,129, 99,229,202,110,146, 85, 88,216,105,104,111, 15,233,
+ 10,158,164,164,164, 51, 4, 65, 36,105, 52,154,123, 42, 51,188, 74,165, 58,196,113,156, 86,171,213,230,244, 33,189,146, 1,180,
+ 3,176,249,216, 72,168, 16,186,255, 15, 47,153, 42,149,106, 25, 73,146,227, 56,142, 75, 36, 73,242, 6,203,178,167,218,218,218,
+222, 6, 80,223,191,158,222, 53,225, 51,195,255,162,135,239,181, 1,248,111,116, 59, 5, 55, 4, 11, 62, 74,169, 84, 90,162,236,
+251,255,115,132,100,226, 83,217, 74, 12, 25, 16, 3,145, 88,138,102,163, 3,127,251,209,136, 45,149,173, 77,140,221,249,196, 79,
+154,206, 31,250,187, 34,160, 8,126, 5,143,144,146,144,144,240,207,163, 71,143,230, 12, 25, 50,132,244,116,120,231,115,229,241,
+199, 91, 52,221,205,229,142, 31, 63,238,152, 53,107,214, 41,181, 90,253,136, 63,204,152,152,152, 47,190,255,254,251,223, 24, 12,
+134,219, 8,149,103,166,120,254,119,179,217,140, 69,139, 22,125,233,239, 10, 30,165, 82,185,102,245,234,213, 47,204,152, 49,131,
+228,211, 81,120, 22,254,186, 32,190,216,108, 54,108,223,190,157, 93,183,110,221,255, 24, 12, 6,191, 71,135,169,169,169, 77,205,
+205,205,233,124,170,133, 96,146,138,102,102,102,182, 52, 54, 54,166,221, 73,204,123,152,112,221, 98,221,186, 43,166, 9,145, 76,
+182, 56, 70, 17,255,198,140, 57,207, 39,102, 14,189,159, 72, 73, 29, 8, 2, 36,212,173,215,209,120,249, 39,110,255, 95,223,213,
+153,141,250, 21, 12, 99,126, 55, 16,206, 3,192,208, 95,196,138,247, 68, 57, 49, 28, 60, 1,242,186,159,234,182, 29, 7, 0,155,
+136, 60,223, 96,178,207,252, 49,192,177, 15, 79,182, 94,221,191, 95, 30, 53,124,248,109,137,226, 88,150,133,165,174, 14,107,231,
+206, 13,153,100,245, 75,191,244,139, 32, 50, 4, 61,231,200,178,163, 59, 63, 87,168, 22, 19, 34, 43, 57,122, 38, 7, 60, 69,130,
+ 29, 73, 18, 68,148,131,195, 5,112,248, 66, 78,119,110, 60,219, 2,166,191,249,131,146, 62,123,169, 52,128,232,132,132,132, 99,
+ 20, 69, 13,230, 45, 50,158,214,122, 31, 23, 74, 55,168,213,234,201, 0, 2, 69, 8, 15,141,137,137,121,215,233,116,142, 13,230,
+ 82,105,138,162,190, 49,153, 76,139, 17,224, 82,233, 72, 68, 29, 38, 38, 38,214, 55, 54, 54, 14,229,163,168, 61,215, 74, 95,145,
+229, 23, 47, 94,196,132, 9, 19, 26, 91, 91, 91, 51,239, 36,102, 95, 21, 63, 81,135,125,199,162,229, 33,105, 98,137,162, 40, 74,
+ 38,253, 53,107,119,100,129, 0,104,145,232,188,181,139,249,202,194,116,124, 0, 63,199,133,119, 82, 10,128,241,146,168,168, 47,
+196,177,177, 50, 95,164,205,110, 50, 49, 22,171,117, 74, 63,201,234,151,126,233,151,126,233,151,123, 72,134, 39, 36, 36, 28, 21,
+137, 68, 18, 79, 50,233,253,154, 23,135,195,209,165,209,104,166, 2,184,112,135, 49,255, 53, 37, 68, 39,181,252, 96, 49, 93,101,
+ 66, 95,199,140, 96,221, 57, 1, 49, 39,184, 48,151,223, 35,122, 78,232,171,152,124,125, 67,192,205, 15,101, 28, 9,213,158, 30,
+122,114, 66,235, 25, 41, 76,161,230,145, 15, 61,185, 8,244,251,242,123, 68,207, 9,125, 13,211,123,252, 4,137, 27, 18,102,144,
+ 99, 42, 84, 61, 57,161,245,140, 20,102,111,231, 81, 0, 61,185,222,142, 37, 63,125,191, 28,247,160,212, 62, 12,174,246, 97,112,
+ 53,163,125,230,109, 44,241,247,119, 33, 57, 18, 70, 42, 18,128, 79,187,239,194, 39,250, 42,166,103, 59, 8,121, 85, 64, 4,174,
+ 29,168, 20, 26,211,171, 61,133,146,229,174, 8,147, 42, 4,145,112, 52,148,186, 11,209,239, 94,117, 21, 4, 55, 12,146, 21, 18,
+166, 80,227, 62,210,152, 66,205, 37,111, 76, 33,198,189,175,126,143, 96, 31, 9,165,167, 32,115, 41, 18, 99,222,199,248,233, 53,
+174, 55,166, 16,115,201, 27, 83,136,113,127, 39, 48,133,152, 75,190, 48,133, 24,247,254,250,254, 94, 53, 52,241,199,133,174, 20,
+ 15, 68, 16,100,171, 28, 0,200,112, 26, 45,130,150,178,137, 66, 99, 10,173,115, 36,200,102, 8, 22,152,187,142, 41,112, 31, 45,
+119, 97, 10,185,187,153, 40, 84, 31, 69, 98,188,123, 98, 10,133,239,141, 35, 68, 63,249,194,236,173,190,126,244, 20,188,238,189,
+ 29,247,119, 10, 83,224, 62, 18,100, 46,121, 97, 78, 20,120, 51, 48,209,227,247,229, 66, 98, 10, 53,151,124,232,217,235,126,242,
+133,217, 91,125,253,232, 41,120,221,133, 88, 67, 34,133,123, 55, 45, 90, 28,233,119, 76,148,123,149, 59, 66, 52,238,218,145, 92,
+136,216, 63, 43,204, 16,143,103,242, 35,208,247,119, 85, 79, 33, 49,189,117, 20,242,184, 39,146,122, 10,137, 25,130,174, 63, 59,
+204,123,173,223,251, 98,123,250,195,235,205,177,148, 63,235,104, 36,244, 20, 18, 51, 72,236,159, 5,102, 47,250,254,103, 39,116,
+ 95, 81,132,111,120,129,119, 38, 16,216, 2, 19,177,122, 11,172,231,196, 72, 88, 8, 35, 32,130,235,233,218, 41,191, 17,129,186,
+223, 43,109,218, 63,151,250,231, 82,159,155, 75, 94, 99,114,162,128,150, 34, 65, 45,207,222,152, 66,252, 15, 79, 12,161,198,104,
+164,235, 46,228, 92,138, 68,223,223,107,242,255, 25,235, 55,155, 32,101,223,129, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/datafiles/splash.png.c b/source/blender/editors/datafiles/splash.png.c
index 043507caf56..91e57d26f78 100644
--- a/source/blender/editors/datafiles/splash.png.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,4817 +1,6113 @@
/* DataToC output of file <splash_png> */
-int datatoc_splash_png_size= 153933;
+int datatoc_splash_png_size= 195415;
char datatoc_splash_png[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
- 72, 68, 82, 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,
-111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244,
- 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69,
- 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,
-107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,
-131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190,
- 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20,
- 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,
-211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0,
- 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,
-136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178,
- 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25,
- 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,
-255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,
-104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,
-216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71,
- 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42,
- 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,
-106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,
-225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,
-129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,
-114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112,
- 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193,
- 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,
-145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,
-154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48,
- 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129,
- 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194,
- 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36,
- 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,
-107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40,
- 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,
-175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149,
- 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119,
- 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149,
- 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169,
- 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,
-195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,
-118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78,
- 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,
-171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217,
- 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,
-167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,
-111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,
-198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,
-205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,
-178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185,
- 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,
-197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,
-206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,
-185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,
-179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63,
- 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23,
- 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,
-255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,
-217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133,
- 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220,
- 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,
-102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152,
- 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,
-242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188,
- 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,
-146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,
-179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,
-237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,
-113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129,
- 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62,
- 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,
-102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,
-219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,
-248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,
-247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61,
- 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,
-223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,
-186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,
-140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,
-188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,
-154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,
-243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,
-221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,
-153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23,
- 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,
-201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,
-251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,
-147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,219,
- 10, 22, 15, 51, 58,178,212,173, 17, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,156, 37, 87,113,231,251,141,147,121,239,
-173,170,222,212,173,181, 27,180, 34, 9,196, 14, 18,200, 24, 44,132, 45,192, 24, 12,198, 70,178,135,231,225,217,248, 33, 25,175,
-216,243,108,225,231,121,243,120,111, 60, 6,236, 97,140,205, 48, 6,153,241, 54, 99,123, 64, 48,131, 23, 48, 12, 98,192,128,109,
-176,145, 49,139, 88,165, 86, 75,141,164,222,171,107,187, 91,230, 57,241,254,200,147,153, 39,243,230,189, 85,213,221,146,104,145,
-241,249, 84,247,173, 91,185,231, 57, 39, 34,126,241,139, 8,104,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,
-149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86,
- 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149,141,139, 60,
- 28, 39,213,247,191,250,229, 36,250,115, 24,186, 24,125, 7, 63,240,135,255, 85, 4,109, 95, 71, 43,173,180,210, 74, 43,173,156,
- 70, 74, 93,255,252, 85,207, 99,121,237,127,113,124, 77,217,182, 3,206,218, 37,164,227, 63,101,188,124,147,220,112,235,106,251,
- 74, 90,105,165,149, 86, 90,105,229,196,196, 60,228,103,188,127,239, 22, 30,216, 7,135,239, 27,112,207,215,250,236,219,219, 71,
-163, 87, 50,183,243, 11,250,129,215, 92,222,190,146, 86, 90,105,165,149, 86, 90, 57, 93,148,250, 79,126,234, 3,204,155, 95, 97,
-107,119, 1, 33,230,240,253,142,189, 95,233, 51, 76, 46,194,117,190,162, 31,120,205, 15,181,175,165,149, 86, 90,105,165,149, 86,
- 54, 47,242,112,157, 88,223,246, 29, 47, 98,152,190,151,145,246,176,233,128,238,156,225,130, 75, 99,118,157,217,197,142,222,138,
-233,190, 94,190,239,109,163,246, 21,181,210, 74, 43,173,180,210,202,183,184, 82, 7,208,119, 94,249, 24,214,162, 15, 50,180,151,
-147,216, 62, 81, 4,123, 46, 54,156,183,103, 14,151,124,158, 72,127, 64, 94,244,142,125,167,203,195, 84,213, 43,129,157,254,215,
-189, 34,178,247,145, 60,120,190,221,238,183,149, 86, 90,105,165, 85,234,235, 41,134,223,124,242, 22, 58,157,255, 74, 95, 95, 74,
-162, 67,112,112,238,249,194,238, 11,230,137,100, 76, 39,125,137,188,240,157, 31, 57,197,202,232, 18,224,146, 13,110,190, 40, 34,
-183,111,240,184, 31, 1,174,243,191,190, 94, 68,222,252, 8, 87,234,223, 86,247,123,138,158,153,136, 72,155,233,209, 74, 43,173,
- 60, 40, 18,159,244, 34,245,177,107, 99,246,119,123,141,127, 92, 25, 11,219,186, 10,231,194,185,192,210,176, 52, 34,122,219,132,
-206, 72, 96, 23,232,209,215,113,239,189, 61, 86,221, 11,112,140, 89, 60, 2, 11, 91,135,156,113,118, 7,219,253,159,250,161,159,
-249, 55,244,190,244, 70,121,222,199,211, 83,116,223,215, 3,111,218,196, 66, 12,112, 43,112,155,136,220,210, 14,155, 71,132,114,
- 53, 34,226,106,223, 69,192,213,192,119, 3,207, 0,158, 64, 54,114,123,192,113,224, 30,224,211,192,159,138,200,223,159,144, 21,
-189, 1,133,174,170,207, 4,110, 0,158, 7, 60, 10, 56, 19,232,251,243,127, 1,248, 36,240, 65, 17,217,191,206,113,186,192, 43,
-128, 87,250,123,217,237,239, 99, 31,240,126,224, 15, 69,228, 64, 59, 26, 90,105,165,245,212,209, 55,188,193,176,253,163, 55, 98,
-229, 87, 17, 57,139, 40,114,136,128, 49,217,143, 8, 68,145, 96, 12, 68,254,119, 99,192,248,239, 68, 64,242,109,141, 37,138, 70,
-168,108, 65,130,109,163, 8, 28,134,185,110, 7,177,127,195, 60,215,203, 53,111, 59,124, 10, 22,244,155, 55,163,212,107,114, 27,
-112,131,136, 44,182,158,250, 35,231,126, 85,245,119,129, 31, 4,206,217,224, 46, 31, 7, 94, 45, 34,119,159,194,107,120, 20,240,
-118,224,101, 27,216,252,163, 34,114,221,140, 99, 61, 22,248, 51,224,105, 51,142,113, 28,184, 73, 68,222,211, 46,133,173,180,242,
-237,238,169,159,241,209,159,199,153,255, 64,170, 99, 34, 81, 32, 66, 4,148,236, 39,251, 44, 24, 5,167, 96, 36,251,131,113, 16,
- 73,182,129, 81, 48, 10,162, 17,206,118,136, 34,245,238,140, 63,142,130, 49,142,196,142,136,204,115,233,235, 87,245,163, 63,253,
-124,249,158,183,255,211, 41,126, 14,183,205,248,219,117, 13,191,127, 68, 85,159,223,164,216, 91, 57,109,229, 39, 27,190, 59,234,
-189,227,227,222, 91,126, 34, 16,249,191, 93, 11,124, 86, 85,159, 43, 34, 95, 58, 5, 10,253, 9,222, 80, 56, 43,248,122, 9,216,
- 11, 44, 2,219,128,203,129, 29, 27, 56,214, 5,192,223,120,148, 33,151,251,128,187,252,125, 60,222, 27,244,103, 0,239,246, 33,
-129,119,183, 67,160,149, 86,190, 77,149,186,190, 1,131,211,215,210, 79, 20,155, 36, 88, 7, 34,146,249,253,146, 45, 23, 94,111,
-131,208, 79,236, 2,145,193,156,121, 14,196, 49, 88, 69, 50, 15, 61, 83,242, 98,192,154, 76,193, 27, 87,122,234,226,189,124, 99,
-144,212,208,137,162, 93, 66,231,118,253,232,207,189,150,239,254,237,119,158,170,216,164,136, 60,127,157, 69, 50,135,235,243, 56,
-252,149,192,141, 64, 27, 67,126,228,201, 87,129, 63, 0,254, 74, 68,190, 92, 27, 7,187,128,127, 5,220,236,149,251, 46,224, 47,
- 85,245, 10, 17, 25,158,132, 66,191, 24,248,104,160,208, 63, 7,252,138,247,198,211,218,182, 79, 4, 94, 14, 92, 60,229, 88, 2,
-188, 47, 80,232,139,192,171,129, 63,207,231,139,170, 62, 14,248, 35,224,153,126,155, 63, 80,213,207,137,200,215,219,215,223, 74,
- 43,167,183,156, 80,158,186,188, 1, 71,172,111, 65, 70, 2,201, 22, 98,183,133,200, 46,100, 63,233, 66,241,217,164, 11,184,225,
- 28, 54, 65,122, 11,153,178,118, 14,156,203,227,212, 94,198,224,134,224, 6,160, 67, 96,148,253,174, 99,191,189,162,234, 72,172,
-131, 84, 83,180,243,187,124,244, 23,223,163,127,241,134,133,135,226, 33,137,200,173,192,243,253, 2,153,203,245,237,240, 57,125,
-197,199,155, 67,249, 12,240,125, 34,114,133,136,252, 70, 93,161,251,113,112, 76, 68,126, 21,120, 85,240,245, 69, 83,188,252,205,
-200,239, 5, 74,248,221,192, 51, 68,228,195,117,133,238,175,225, 75, 34,242,111, 69,228,213, 83,142,245,195,192, 85,254,179, 5,
- 94, 36, 34,239, 15, 13, 96, 17,249, 42, 25,111,224, 78,255,213, 60,240,255,182,163,162,149, 86, 78,127, 57, 41,246,187,254,135,
-167, 95, 74,196,165, 56, 35,136, 11, 72, 71,198,127,182, 35,186,243,207, 90, 28,206,189,105,161, 51,143,131, 44, 78,110, 76,118,
-234,180,143, 68,130, 57,255, 41,152,179, 47, 69,182,159,135,204,109,135,116,132, 91, 59,140,174, 60,128, 59,252,117, 72,135, 16,
-205,131, 8,189, 94,119,132, 26,161, 23,119,137,220,237, 36,230,185,242,194,127,191,182,201, 5,189, 18, 83, 23, 17,217,224,126,
-239,244, 30,122,227,126, 39, 18, 99, 86,213,157,222,243,207,229,246, 83, 1,235,215, 24,254, 39,148,110,182,222, 49,190, 85,238,
-183,118,157,183, 63, 20, 97, 17, 85,253, 16,240, 66,255,235, 39, 69,228,154, 19, 60,206,191, 0,254,212,255,122, 7,240, 52, 17,
- 73, 78,226,186,254,137, 50,142,254, 14, 17,121,237,140,109, 95, 2,252,165,255,213, 1,151,136,200, 61,237,178,216, 74, 43,167,
-175,156, 20,251, 93,126,241,159,238, 12,172,253,201, 69,227,143, 94,250,100,134,233,143,110,141,148, 52,143,171, 15,135,232,104,
- 13,236, 26,209,229,223, 69,124,213, 43,137, 46,254,142,169, 16,130, 30,219, 71,122,215, 71,177,247,252, 45, 18,117, 25,141,211,
- 30, 18, 33,214,209, 93,232, 94,249,137, 59,246,175,234,103,111,236,202, 85,183, 36, 15,193,243, 58, 37,121,216, 94,177,221,232,
-189,253, 43, 27,254,190, 23,184, 5,184,101,154,130, 82,213, 55, 5,251,222, 42, 34,183, 4,199,189,145, 90,202,158, 63,230,155,
- 55,194,222, 87,213, 27,201, 32,230, 75, 54,123, 93, 15,198,253,206,184,215,155,253,113,119, 6,155,223,230, 81,149, 7, 91,254,
- 34, 80,234, 87,156,196,113,126, 46,248,124,243, 73, 42,244, 11,169, 18,227,222,177,206, 46, 31, 4,238, 5, 46,240, 83,238,101,
-192,239,180,203, 98, 43,173,156,190,242,160,149,137,213,223,127,254, 77,172, 14, 63,207,208, 94,145, 90,139, 14,215,112,199, 14,
-225, 22, 15,160,227,101,186, 47,252,101,122,215,255, 78,163, 66,175, 24, 14,187, 46,162,243,140,159,160,115,245,107, 51,226,156,
- 88, 64, 65, 96,220, 79,184,230,105, 23,193,226,194,255,243, 16, 61,175, 80,121,156,144, 55,168,170,215,145, 17,150,222,212,164,
-224,188, 92,226,255,254, 89, 95,224,165, 73,174,244, 94,242,117,192, 78,191,221, 71,168,198,254,235,199,124,167, 71, 27,166, 42,
- 95, 85,125, 15,240,206, 25,199,120, 19, 25, 81,112,231, 67,120,191, 77,247,122,151, 87,234, 59, 31,166,185,115, 52,248,188,253,
- 4,199,194,227,129,124, 2, 28, 2, 62,116,146,215,244,125,193,231, 7, 68,228,243, 51,231, 86,150,210,247,225, 41,251,183,210,
- 74, 43,223,110,158,122,227, 66,245,206,151, 44,224, 6,111, 99, 77, 95,141,149, 17,154, 88, 93, 93, 93, 32, 77, 64, 20,233, 64,
-239,229,111, 36,122,226,139,139,125,150, 7, 35, 62,252,207,251,248,240,231,247,113,108,117, 64, 39, 18,174,216,179,139,151, 94,
-117, 41, 79,127,204,110, 0,162,243,159,129,116,183,145,124,234, 45,208,141, 51,197,110,132,116,117, 68, 60, 23,255,170,126,236,
- 23,254, 80,158,247, 91,119, 62,104, 70, 74,166,196,174,175,121,132,155, 61,198,245, 64, 61,125,232,118,127,172,220, 72, 8,189,
-217, 75, 40,153,246,183,175, 99,108,188, 39, 80,196,183,250,227,230, 10, 49,188,238, 27, 85,117,239, 20,168,252, 77, 76,114, 5,
-194, 99,229,215,118,101,195,125, 60, 84,247,187,211, 27, 47, 59, 3,227,234,246, 96,255,135, 74, 46, 10, 62,159,104,154,101,136,
- 40,124, 66, 68,236, 73, 94,211, 83,130,207,159,222,224, 62,127, 7,188,166, 97,255, 86, 90,105,229,219, 93,169,235, 59,174,185,
-140,209,234, 7, 73,205,165, 40, 3,108, 95, 73, 70, 25,217, 45,142,144,116,141,206,179,255,143,138, 66,255,244, 55, 30,224,151,
-254,228,147,236, 61,178,194, 92,175, 67, 39, 54, 24,133,207,239, 63,198,123,255,254,171,124,255, 85,143,225,255,190,254,187, 88,
-232,117, 48,231, 62,142,248,137, 55,144,126,238, 15, 96,219,185,128,102,113,122, 21, 72,163,223, 6, 94,252, 32, 42,244,186,247,
-122,203, 38,143,113,137, 63, 70, 46,123,201,114,132,235,198,193,155,189,119,251, 30,175,184,242,115, 95, 53,227,240, 55, 7, 10,
-248,166, 58,132,237,207,253,158, 64,121,222,172,170, 21,168,219, 67,238, 55,214,148,239, 13,181, 56,122,120,109,215, 61, 76,247,
-123,115,112,188,215,123, 18, 99,253, 93, 61, 20,242,138,224,243,103, 78,240, 24,207, 8, 62,127,193, 95,255,153,192, 79,248,227,
- 63, 6, 88,240, 70,195, 63,145, 65,254,255,101, 6, 68,255,184,224,243, 93, 27,188,134,112,187,243, 84,117,187,136, 44,183, 75,
- 99, 43,173,124,155, 43,117,125,251,115,190,151,129,190,159,148, 24, 99,251,164, 99,176,105, 22, 71,143, 4,212, 34,103,157, 79,
-252,204,146, 56,252,141, 3,139,188,234,237, 31,230,208, 32,101, 97,203, 60, 73, 20,209,233, 68,116, 35, 33,210, 46, 98, 83,222,
-247,153, 59,137,140,225,215, 94,121,109,230,177, 95,250, 60,236,215, 62, 4,118, 21,226,249,140,234,103,109, 74, 36,215,233, 39,
- 94,183, 91,174,121,235, 3, 39,160,180,111,158,241,231,235, 26, 20, 88,147,114, 90, 79,222, 89,243, 46,175,154, 22,151, 22,145,
-219, 84,245,249,129, 71,122,165,170,222,184, 78, 60,252, 54, 17,185, 97,202,241,246,170,234,235,253,241,114,111,247, 58,111, 4,
-212,149,101,174, 48, 27,243,240,131,107,251,236,195,120,191,123,167, 29,239, 33, 34,201, 61,191,102,116,252,217, 9, 30,234,201,
-193,231, 7, 84,245, 5,100,169,102,231,213,182, 59,223,255,188, 12,248, 85, 85,253, 97, 17,105,122,254, 23, 6,159,239,221,224,
- 53,220,219,128, 64,124,161, 93, 26, 91,105,229,244,148,147,142,169,235, 59,175,236,232,111, 63,231,205,140,244,175, 73, 0,147,
-142,176,195, 44,246,221, 49, 16, 11,196,130, 50, 38,186,252, 26,100,107, 89, 91,227,245,127,242,183,124,227,155, 75, 44,165,194,
- 3,171, 41,251,151,198,220,121,100,192,222, 35, 3, 22,135, 22,141, 99,118,236,216,202,251,255,225, 27,220,246,121, 95,184, 43,
-138,137, 46,185, 6, 93, 62,236, 43,213, 41, 24,113,116,162, 46,137,188,236, 4,111,227, 77, 51,126,174,171,121,231,207,223,108,
-169, 88, 31, 3, 14,143,243,250,245,148,143,135,159,111,169, 25, 23,179,228,166,117,142,119, 27, 37, 76, 77,136, 58,120,152, 60,
- 68, 33,222, 60,235,250, 26,174,237,161,190,223, 55, 63, 92,133,127, 84,117, 71, 13,129,248, 28, 89, 94,248,137,200,153,193,231,
-167,120, 79, 60, 87,232,135,200,202,193,254, 61,176, 92,123,111,127,163,170,223,217,112,188,109,193,231,165, 13, 94,195,210,140,
- 99,180,210, 74, 43,223, 78, 74, 93,127,231,234, 71,179,210,249, 91,134,246,151, 73,180,143, 88,139, 77,178,178, 28,177, 64, 36,
- 66, 44, 34,145, 65, 98,193,236,121, 98,177,239,221, 7,143,243,215,255,124, 47, 44,204,151,105,110, 81,132,197,176, 50,178,220,
-125,184,207,222, 67,125, 18, 21, 92, 20,241,209, 47,150,153, 54,114,214,165,232, 96, 25, 72,125,145, 27,133,212,129, 43,138,105,
- 60, 88,114,189,247, 34, 55, 11,241,134, 10,106,113, 19, 70,193,109,181,115, 79,147,219, 55,152,178,118,251,148,107,186,174,166,
- 96, 55,114,125,183, 62, 76,247,187,247,225,170,191,175,170,198,123,210,121,225,151, 49,240, 19, 39, 81, 4, 41,172, 14,247, 51,
-100, 53,230, 15,146, 21,151, 57, 79, 68,174, 17,145,239, 4,206, 6,126, 26,200, 11,220, 44, 0,255, 77, 85,235, 4,189, 45,193,
-231,141, 22,195, 25,204, 56, 70, 43,173,180,114,154,201, 9,195,239,250,182,239,120, 54,125,251, 81, 18,211, 33,150, 62,145, 3,
-117, 89,105,216, 84,132, 88,148, 72,124,117, 56,139,196, 93,204,206, 11,138,253,247, 29, 94,102,208, 79, 96,123,143,162, 4, 93,
-190, 52, 26, 3,170, 28, 95, 77, 72,198, 41,143,222, 17,179, 50, 44,195,136,178,237, 92, 32,130, 81, 31,153,223,150,153, 38, 73,
- 10, 49, 79, 81,125,131, 17,121,131,219,228,237,188,126,198,223, 46,241, 74,234, 18, 50,104,248, 77,192,245,155, 44, 19,123,221,
- 20,197,202,122,222,117, 88,164, 71, 85,175,156, 66, 32,219,104, 40, 96,239,140,123,220,212,177,234,215,246, 16,222,239,237, 15,
-227,124,121, 11,213,186,236,191, 36, 34,159, 59,137,227,205,213,126, 95, 3,158, 39, 34, 95,169, 61,151, 49,240,159, 84,245, 30,
-224,175,252,215,231, 3,175,165, 90,213,176, 19,124,222,104,243,163,250,118,221,118, 89,108,165,149,111, 35,165,174,239,185, 62,
-226,158,187,127,145,149,244, 55,176, 50,166,199, 16,227, 4,171, 74,226,132, 72,186,116, 88,196,234, 22,226, 40,243,218,157,175,
-114,163,229,250,113,206,142, 5,162,110, 7,235,200,136,110,170, 94,169,251,255, 85, 32, 50,172,245, 19,238, 25, 14,233, 61, 37,
-184, 84,181,160, 73, 86,148,198,108, 7,113, 2, 86,177,186,135,191, 62,218, 1, 70,155,185,167, 13, 22, 77,185,153, 50,133, 42,
- 79, 31,187,106,131,167, 8,211,180, 46,241, 69, 91, 78, 68,166, 33, 4, 39, 11, 69,159,144, 18,246,219, 94,249, 16,223,239,195,
-162,212, 85,245,223, 0,175, 11,190,122,187,136,156,108, 78,119,159, 42,220,253,230,186, 66,175,141,211, 15,168,234,173, 1,138,
-241,227, 53,165, 30, 30,111,238, 36, 12,139, 86, 90,105,229,219, 65,169,235, 59,175,220,193,190,187,222,203, 88,174, 67,100,192,
-124, 4, 6, 33,113,202,200,198,116, 77,151,158,188, 6,244, 18, 44,175, 71, 25, 98, 50,248,157, 36,193, 29,185, 19,115,126, 70,
-248,189,226, 81,103,114,245,101,231,240,119, 95, 57,156,213,131, 87,201,106,191,107,102, 4, 0,224, 50, 79,127,120,108,141,203,
-206, 43,215,119, 93,190, 31, 70,203,232,232, 12, 36,239, 32,227, 80, 12, 48,191,242,160,244,136, 23,145, 55,123, 47, 50,175, 68,
-183, 17,242, 90,147,114,218, 76, 47,247,135, 67, 22, 79,193,182,167,211,253,110, 68,161,255,159, 84,203,168,254, 9,240,179,167,
-224,208,171, 53,165,254,199, 27,216,231,143, 2,165,254, 88, 85, 61, 71, 68, 14, 53, 28,111,126,131,215,176,208,112, 77,173,180,
-210,202, 35, 93,169,235, 91,158,249, 20,142,218,191, 36,149,243,233, 68,125,230, 76,166, 60,199, 78, 25,219, 57,230,100,200,188,
-188, 84,126,246, 31, 62,172,111,185,234,215,112, 34, 8,146, 49,223, 5, 98,131, 30, 44,155, 89, 25, 35,252,235,151, 95,197,247,
-125,249,175, 96,152, 64,175,155,109,135, 87,234,142, 12,206, 95,237,243,180,199, 63,138,127,249,220, 39, 20,251,186, 67, 95, 65,
- 53, 65,236, 56,219, 80, 1,156, 1,121,128,107, 47, 26, 63, 88, 15,203, 43,246,176,101,235,245,108, 50,181,141, 12, 2, 63,209,
-202,116,167, 99, 87,184,211,250,126, 85,245,103,128,223, 12,190,250, 31,192,143,157,162,102, 66, 71,200,122,156, 3, 28,221, 96,
-137,214, 58, 82,113, 9, 25,169, 14,178,130, 56,249,241,118,111,240, 26,234,219, 29,109,151,197, 86, 90,121, 4, 43,117, 5,225,
- 55,159,246,106,134,246,247,112,146, 50, 31,245,233, 25, 65, 85, 25, 88,197,233, 22,182, 70, 95, 99, 94,190, 95,126,242, 51,223,
-240,234,239, 78, 68, 65, 81,140, 8, 70, 96,110, 1,187,239, 83,196,139,251,144,157, 23, 1,240,162,167, 93,196, 45,175,125, 30,
-175,251,207,159,164,127,124, 4,115,189,140,209,174, 10,227, 4,250, 3,158,254,184,115,121,239, 47,189,152, 45,115, 62, 92,152,
- 12,176, 95,126, 31,210,237,101, 12,251, 44,142,159,121,233,177,126,238, 4,226,233,155,149,219, 40,225,234,235, 78, 96,255, 91,
- 30,233,125,214, 31, 41,247,235,115,247, 67,136,253,127, 2, 63,210,212,104,229, 4,229,171,192,147, 54,169, 76,143,206, 64, 69,
-190, 78,214, 30, 22,178,210,175, 27,145,243,131,207, 35, 96, 95,187, 44,182,210,202,233, 43,235,179,223,223,114,213,141, 36,230,
- 93, 96,134,108,235, 36,204, 71,130,162,172, 89, 48,178,133,133,232,191,115,182, 60,179, 84,232,192, 28,119, 96,178, 48, 55,144,
- 41,234, 56,134,116,149,228, 83,191, 85, 57,252,107,190,231, 9,252,253, 27, 95,193,235, 94,242, 36, 46,222,213, 99, 78, 19,182,
- 26,203,119, 94,118, 22,255,241,167,190,155, 79,252,187,235,185,248,220,146, 36,156,254,227,187,208,227,251,160,211, 67,197,247,
-104, 79,125, 62,188,232,237,223,162,207,121, 26,235,252,116,191,190,235, 78,211,251,221,136, 66,255,113,178,218,233,121, 56,231,
- 19,192, 15,120,210,218,169,146, 59,130,207,189, 13,238, 83,143,129,135, 44,247, 48, 30,255,212, 13, 30, 47,172, 21,255, 13, 95,
- 58,182,149, 86, 90,121, 36,122,234,250,206, 43, 23, 56,100,127, 29, 39, 99,182, 71,208, 17, 33, 81,165,159, 68,116, 77,143,142,
-249, 13,230,146,127, 45, 63,122,123,181,194, 85,236,238, 64,204,126,172, 59, 15, 85,139,248, 30,235,243, 11,184,123, 63, 65,250,
-183,111, 37,126,118,201, 57,122,242,133,103,241, 91,175,190,134, 55,254,203,148, 3,199,214,232,118, 98,246,236,154,204,172,177,
- 95,254,115,210, 47,252, 23,152,203,194,128, 98, 34,212, 58,176, 78,208, 36,193,232, 95, 61, 4,207,236, 68,226,195, 33,161,236,
- 58, 85,221,249,112,229, 89, 79,145,189,193,245, 93,185, 65,165,119,229,105,124,191,235,221,219, 43,129,119, 5, 10,253, 51,192,
- 75, 68,100,112,138, 79,245,137,224,243, 30, 85,157,219, 64, 95,246,122, 31,245,131,193,231, 79,134, 74, 93, 85,183,138,200,122,
- 49,242,107,166,236,223, 74, 43,173, 60,226, 60,245, 1,103,161,236, 4, 73,113,170,244,173,210, 79,187,116, 69,216,198, 13,242,
-243,159,190, 89,110,186,125,162,100,165,220,116,123,159,158,188, 13,209, 14, 67,171,160,136, 1,137, 12,178,176, 13,251,133, 63,
- 38,185,237, 95,163,253, 35, 85, 23,164, 19,115,209,185, 59, 38, 21,122, 50,192,126,230, 63,145,126,242,223, 33,189, 46, 18, 69,
-136, 0,157, 94,150,202,230, 92, 7,236, 7,229,249,183,220,251, 96, 62,172, 90,139,207,186, 71, 58, 75,234,105, 98, 55,126,139,
-141,131,240,250,118,250,178,173, 39,234,165,159, 14,247, 59,235, 29,255, 16, 25, 97, 45,159, 27,159, 3,190, 87, 68, 86, 30,132,
-211,125,130, 18, 78,239, 0,215,110, 96,159, 23, 6,159,143,147, 65,248,185,124, 12, 88, 9,142,119,253, 58,247,186,135,172,175,
-122, 46,127,209, 46,137,173,180,242, 72, 86,234,123, 6, 7,152,143,246,209,145, 5,214,146, 5,156, 91, 96, 65, 86,216, 22, 93,
- 35, 55,253,195,173,179, 49,128,238,187,136, 88, 98,148,198, 36,206,231,171,147,149,140,221,178, 13,119,215, 95, 51,126,223,171,
-176,119,188, 15, 93,190,175,121,209, 89, 59,140,187,235, 54,198,255,227,213,164,159,251, 61,152,155,131, 40,206,138,205,136, 32,
-166,131, 12, 19,136, 20,148, 95,121,144, 23,251,188,105, 74, 40,183,110,100, 95, 95,159, 60, 36,139,221,188,142,167,251, 80,203,
-173, 84, 73,105, 55,111,224, 89,220,124, 26,223,239,180,251,250,126,178,146,175,145,255,234, 14,224, 5, 34,114,252,193, 56,159,
-111,224, 18, 50,222,127, 69, 85,101,198,245,109,163,202,186,255, 96, 8,151,251,208,192,187,131,191,255,178,170,206,130,245, 95,
- 31,220,235, 55,129,255,213, 46,137,173,180,242, 8, 86,234,114,195,151,199,108,159,187,150, 45,209,111,179, 45,126, 47, 91,163,
-155,217,222,123,172,220,244,233,117, 27, 88,200, 79,125,106,145,185,248, 53,196,166,163,171, 41,154, 56,192, 23,163, 17,129,133,
-237,144, 46,145,124,234,215, 25,191,239,149,140,255,226, 38,210, 79,253, 6,233,167,127,135,244,239,222,194,248,131, 63,207,248,
-189,255,130,228,182,215,163,171,251, 96,203,142,172, 40, 77,190,228, 57,131,142,132,206,156, 1, 77,223, 40, 47,121,215, 87, 30,
- 44,239,220, 19,166, 62, 75, 21,154, 94,100,115,204,247,176,140,235, 78,178,110,100,215,109,240,252, 55,175, 83,159,254,100,149,
-203, 34,213,124,231,235,166,181,104,245, 10, 61,236,146,118,218,221,239,148,243,190,192, 27, 55,121, 1,151,175, 3,215,137,200,
-145,147, 60,110, 40, 63,208,176,201, 27, 3,239,250, 26,224,183,124,229,186,250,113, 22,128,255, 70, 73,108,115,181,119,150,203,
-175,145, 85,186,131,172,193,203, 59, 84, 53,106, 56,222, 15,147, 85,169, 43,246, 59,197,124,129, 86, 90,105,229, 97,144,117,217,
-239,114,211,167,238,165, 90,116, 99,227,242, 83,127,255, 94,254,227,213,111,157, 23,121, 29,131,116, 64,108, 12,115, 38, 35,181,
- 1,116,123,176,208,203, 24,236, 75, 95,132,197,207,105, 81, 86, 78, 98,161,219,133,185, 90, 37, 76, 5,134, 41,200,156,210,235,
-206, 65,250, 49, 6,131, 55,156,236,194,123, 2,187,221,180,153, 56,177,175,150,118, 19,101,221,240, 92,209,221, 70, 6, 87,215,
-235,178,231,149,236,174, 12,188,170, 7, 83,110,161,218, 6,245, 70,175,132,111, 9,174,237, 58, 50, 40,125,167,247,196, 23,153,
- 18,131, 63, 13,238,183, 46,239,167, 74, 86,235, 3,127,184,209,161, 33, 34,223,123,130, 6,213, 97,159, 54,247, 71,254,171,159,
- 7,174, 81,213,119,145, 17,223, 98,224,233,100,213,227,194,134, 45,255,159,136,124,161,225,120,247,168,234,175, 82,166,225,253,
- 24,240, 36, 85,125, 7,112, 39,112, 22,240,131,192,143, 80,154,200, 31, 7,254,115,187, 28,182,210,202,183,129, 82, 63, 41, 15,
- 16, 84, 59,233, 47, 99, 58,231, 48,214, 87,178, 60, 30,162, 29,152,139,178,252,245,124, 73, 17, 3,189, 57,130, 69,166, 65,243,
- 2, 78, 97,104, 97,101,236, 56,235,236,121, 34,123, 59,105,252,131,114,195,173, 15,165,135,113,187, 87,232,155,102,218,139,200,
- 45, 65, 1,155,157,129,162,124,216, 25,226, 34,178,168,170, 55,120, 47,252,146, 64,217,190,169, 97,243, 69,224,134, 41,127, 59,
- 45,238,183, 65,234,197, 90,158,250, 16, 62,251, 63, 86,213,221,192,175,123,244,236,105,192,219,103,236,242, 86,224,223,206, 56,
-222,191, 87,213, 11,201,234,201,227, 13,165,223,155,178,249,231,129, 87,156,194, 52,189, 86, 90,105,229, 97, 20,243, 96,159, 64,
-110,186, 61,225,208,220,255, 78, 71,126, 3, 97,142,197,113,135,165,196, 49,112, 89,213,233,172, 36,108,128,203, 7, 63,234,127,
- 44, 48,114,176,156, 42,199,134,194,214,237,243, 44,204,253,119, 88,126,158,188,252, 15,143, 63, 4,207,233, 54,239,177,222, 32,
- 34, 87,157,136, 66, 15, 21, 29, 89,121,217, 91,216, 88,113,149, 91,201,160,236, 7,189,137,137,111, 10,115,213, 58,231,186,141,
-172,237,233,237,167,251,253,126, 43,137,207,229,191, 22,248,135, 25,155,125, 1,120,169,136,252,194,122,169,103, 34,242,179,222,
-240,186,115,202, 38, 75,222,155,191, 90, 68,218,130, 51,173,180,242, 72, 89, 75, 30,202,147,233,239,126,231,119,147,218,223, 71,
-185,144,132,148,158, 73,153,139, 32, 50,153,231, 30, 5,151,227, 20, 44, 96,157, 50,180, 48,178, 17,134, 14,157,104,153,115,207,
-249, 73,190,244,212,119,203, 27,222,112,218,231,212,122,136,187, 14, 97,239, 37,235,110,118,219,195,120, 93, 57, 28, 30,246, 68,
-191,109,131,221,224, 78,187,251,253, 22, 27, 19,151, 1,207, 0,246,248, 57,122, 0,248,180,136,124,227, 4,143,247, 76,224, 9,
-192,185, 94,153,239, 3, 62,182,129,244,185, 86, 90,105,165, 85,234,235, 44, 48,191,115,245,118,230,228,135, 25,232,255,133,211,
-139,178,210,176,170, 24,227, 48,148, 74,218, 97,112,206, 0,130, 0,145, 57, 76,204, 91,153,159,251,125,249,241,143, 31,104, 95,
- 93, 43,173,180,210, 74, 43,173, 60,204, 74,189, 80,238, 31,124, 81,143,253,199, 47, 39,113,175, 0,121, 54, 86,119,227,220, 25,
- 40, 93,144,132, 88,150,136,228, 32, 78,255,153,174,252, 25,233,220, 29,242,211, 31,111,155, 77,180,210, 74, 43,173,180,210,202,
-183,154, 82,159, 80,242, 31,187, 54,102, 31, 49,209,177,136,185, 45,142,197,113,218, 84,216,166,149, 86, 90,105,165,149, 86, 90,
-105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,
-149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86,
- 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165,149, 86, 90,105,165, 21, 47,242,218, 23,191, 84, 59, 81,
-140, 83, 3,168, 47,180,238,155,167,161,136,128, 65,125, 89,118,135,250, 62, 43,217,111, 14, 69,137,128, 8, 72, 85, 25,185,108,
- 95,131, 67, 85,177,217,105,252, 17, 93,246, 89,179, 79,121,175,199,172, 61,167,128, 40,162,217,121, 67,201,142, 99,252,247, 22,
- 95, 45, 62,107,228,230,143,237,200,142, 33, 40,170, 82,222,129,102,119,165,254,174,212,239, 81, 92,147,130, 72, 7,157,139,232,
- 68,150, 56, 77, 73, 19,197, 58,176,121,107,247, 98,111,223,237, 93, 4,241,125,182,133,252,248,254, 30, 8,246, 17,201,111, 32,
-251,168, 90, 92,101,113,111,254,170, 28, 96, 68,136, 81,156, 19, 18,212,183,208,203,158, 11, 24,196,108,135,238, 28, 38, 86, 34,
-237, 99,135, 43,216,164, 60, 79,254,212, 76,113, 37,130, 74,249,189, 0,146,191, 19, 17,140, 40,234, 52,216, 79,242,215, 83, 60,
- 87, 65, 17, 21, 28,138,243,239, 45, 27, 19,153, 56,255,126, 36, 60,135,127, 98,170,249,243,207,126,242,199, 97, 80, 34,255,110,
- 82, 63,158,152,232, 91, 46,254,121,133,223,215,126,155, 50, 86, 36,120,182,193, 63,197,243,167,254,119,209,252,197,162,106, 33,
-154, 35,234,117,208,193, 10,214, 6,175,177,248,199, 21, 95,184,240, 98,154,206, 57,249,107, 57,110,130,235,111,220, 47,191,172,
-224,217,136,248,239,253,223,194,177,217,244,111,243,177,181,248,111,242, 25, 52, 60, 32, 13,198,152, 6,239, 65,169, 30,175,246,
-110,168,204,239,233, 18, 30, 70,167, 28,111, 61,153,124,198, 58,125, 35,153,117, 10, 13,174, 95,214,189, 22,245,219,202,140,123,
-173,223,159, 84,111,182,216, 89, 39,127,169,140,221,236,114,154,175, 73, 39,190,205,159,164,108,224,121,234,204,103,167,141, 55,
- 36,144,244, 33, 29,130,233,250,198,154,154, 45, 12,166, 3,210, 65,195,130,165, 58,253,189,134, 43,167, 82,206,197,202,246, 58,
-243,205,110,108,220,108,112,188, 54, 15,155,141,142,225,234,221, 76, 31,163, 58,243,126, 54, 62,232,153, 88, 19,227,109, 11, 11,
- 56,171, 89,255, 20,175,212, 35, 63, 24, 28, 10, 98, 17,213,108,193, 87,131,120, 5,100,139,133,219,161, 56, 68,133,142,128, 81,
-176,234,188,170, 87, 98, 85,172, 42, 42,177, 63,105, 2,154, 41,176, 92, 77,135, 55, 43,193, 50, 29,170, 96, 83, 44,114, 17,198,
-239,229, 2, 51, 68,252,245, 43, 90,172, 79, 90, 95,188,106,170, 87,131,137,232,210, 20, 35,176, 16, 69, 36, 10, 35, 91, 94,131,
- 76,236, 35,136, 63,137,171, 13, 63,241,191,105,160, 88, 17,136,130, 69, 63,127,239, 38,123,114, 53,133,156, 77,140, 14,165, 22,
-204,143, 40,198, 18,117, 35,186, 93, 37,114,130, 18, 51, 36, 83,140, 34,245,247, 45,217, 60, 11, 38,124,185,152,100,215, 23,137,
-160,166,124,222,185, 97, 97, 10, 85, 1,162,153, 33,151, 27, 10, 38, 88, 42, 32,107,172,151, 43,239,252, 90,157,127, 14,134, 82,
-169,231,183, 35, 56,156,250,119,149,175, 1,249,126,154, 25, 47,136,241,239,209,102,215,170,211,151, 41, 13, 22, 82,153,152, 92,
-249, 19,117,197, 67,119,225,228,148, 96, 33,214,252,184, 6,196,178, 45,178,140, 59, 49, 3,223, 8,184, 58, 35,163,226, 56,198,
- 15,174,217,202, 92, 27, 39,181,214, 54,212,218, 10,173, 53, 5, 95,153,190, 34, 96, 12,106,109,101,193,209,202,194, 56,253,220,
-225,129,117,198,194, 91,156, 87, 75, 75, 68, 69,202,175, 26, 12,171, 70, 69,173,179,151, 47, 13,198, 14, 21,221,123,178, 10, 94,
-107, 55, 35,211,214,220,138,233, 40,200,250, 70, 66,205, 30, 42,230,152,234,116,197, 88, 92,156,169,140,219, 73,123, 86,154,181,
-158, 1,188, 3,214,244,252, 52,152,255, 4,235,231,186,143,177, 50,198,101,234,251, 20, 17,156, 83, 70, 75, 71,177,243,231, 98,
-246,188, 0,209, 14, 38, 29, 17,167, 35,204,232, 40,216,251, 64,151, 81, 19,129,116,139, 67,230,227,166,126, 49,149,179,105,254,
-126,154,175,163,190,125,117, 77, 56,137,170,231, 83,109, 31,173,122, 36,179,140,146,117,182,171,158, 66, 78, 70,157, 87, 14, 81,
-209, 63, 2,113,111,110,142, 97,127, 80,120,158, 42, 89,215, 83, 17, 45,189, 46,201,188, 52, 10, 37,172,184,220,235, 20, 65,144,
-204,139, 83, 45, 60,185,220, 35, 84,175,188,173, 42,214,116, 16, 3,170, 41,106,189,209,233,189, 71, 42, 8, 1,133,210, 14, 61,
-111, 83, 76, 55, 9,124,127,175,160,112, 68,193,126,149,161,227,175,199,251,187,197, 57, 10, 63,208,123,222,201, 24, 86, 4,127,
-156,170, 37,158, 43,242, 2,201,168, 40,177,220, 55,149,137,161,152, 45,176,210,232, 4, 57, 4,156, 67,197, 32,146, 45,104, 73,
- 48, 41,141,134,222, 45, 96,135, 48,182, 56, 17, 68, 19,212, 86,231, 65,184, 40,102,243, 71,203,225, 94, 32, 27, 90,120,137, 54,
-112, 49,242,235,179,128,241,223,139,191, 65,167,117, 31, 79,138,145, 96, 84, 42,223,187, 10,218,227,183,203, 65, 17,213, 0, 53,
-153,156,182, 6,147,141, 23, 3, 98, 12,206, 42,214,166,197, 66,156, 79, 92, 23, 44,134, 18,186,175, 53,227, 75, 1, 35,185,231,
-149,161, 22, 34, 82, 83,144,254,122,139, 9,146,221,236,160,159, 25, 92,249,254,245,165,168, 88, 68, 66,131,162,230, 73,213,191,
-147, 18,128,168, 46, 78,226,175, 34,244, 36, 67,243, 69,193,248,109, 52,240,158, 35,181,217, 28,171,153,194,213,243, 72,128, 28,
- 53,120, 37,126,236, 79,115, 76, 69,252,252, 51,222,248,145,218,242, 89,220,223,228, 83,202,255,100, 8,208,159, 13,122,108,229,
-166,178,105,127, 38, 71,201, 38,189,109,153,226,153,214,247,151,242, 25,205, 90,236,243,145, 46, 90, 26,244,154, 95,114,245, 94,
- 37, 88,243,115,133,157,235,184, 9, 59, 83,107, 8,140, 72,128, 44, 78,191,176,198,241,153,255, 43, 51, 92, 92,169,155,254,205,
- 15,199,136, 48, 76, 28,107,139, 71,216,253,148, 39,179,235,218, 31, 35,141,118,144, 44, 31, 96,109,109,141,254, 50,164, 7,135,
-196,139, 7, 49, 43,119, 35,201, 94,144, 85,212,116, 81,141,217,192, 67,173, 14, 39,157,173, 68, 55,173, 32,103,108, 38, 51, 17,
-128,233,232,200,102,174, 96,114,142,201,134,177,148,141,202,182,109,219,136, 5, 7,234, 10,248, 85,138, 5, 84,252, 0,204, 87,
- 32,131, 10, 88,181, 37, 84,137,226,242,125,141, 18,249, 17,154,250, 99,229,222,181,195, 32, 98, 49,206,226,140, 65, 76,166,132,
- 93, 0,113, 43,206, 43,164, 82, 97,215,173, 47,205,225,245,224,187, 92, 73,187,194,163, 86, 76,176,159, 6, 6, 96,221,209, 41,
-124, 1,143, 28,168, 87,106,105,128, 26,148,131,204, 67,228, 76, 90,215,217,231, 24,193, 21, 11, 74,238,121, 74,197, 64, 41,220,
-223,236, 62,204,153, 72,199, 97,147, 69, 68,165,152,228, 34,153, 66,159,244,188, 21,155, 12, 81, 11, 78, 4,231,164, 12, 97,212,
- 6,151,170, 86, 86,146,252,254, 11, 99, 57,192,148,195, 53, 89, 84, 60,242, 82,134, 45,154, 6, 92,190, 14,184, 9,251,184,106,
-216, 20,250, 54,208, 52, 82,131, 44, 67, 35, 61,215,175,162,142, 72, 74, 4,105, 82,137, 79, 0,150,213,235,204,149, 85,126, 62,
- 41,183,146,202,162,155,135, 55,202,177, 0, 66,154,135,139, 50, 43,180,152, 19,133, 65,145,223,152, 72,213,227, 42, 22,237, 25,
-223, 73, 14,245, 51,185, 93,174,141,165,162,142,203,115, 4,251, 90, 87,251,174,242, 50, 53,140,254, 76,190, 59, 66,111, 48, 8,
- 89, 4,207, 54, 87, 91, 18,104, 90,149, 66,135, 85,238, 71,105,152,104,165, 13, 48, 97,192, 76,131, 66, 39, 84,240, 9, 41,119,
- 41, 12,146,250,125,110,120, 5, 21,173, 28, 71,181, 65,157,135,115,172,182, 90,105, 62,174, 26,158,113,240,176,203,115,105,179,
-162,144, 58,170, 51,195,219,173, 7, 95,234,107,224,132,138,113, 22, 36, 10,103,235, 84, 21, 21, 9,172,140,148,225,210, 17, 94,
-250,226,103,242,157,215,255, 43,250,171, 75,172,126,243, 14,198, 91,215, 56,182,144,112,247,246,152,253, 59, 34,150,142,238,196,
- 30, 62,131,248,232, 30,100,229, 43,144,238, 71, 76, 10,210, 91, 95, 17, 11,205,240,187,132,104,238,244,241,178, 49,229,216,188,
-101,224, 27,204, 80,223,147, 71,217,180,111,126, 42, 21,123,131,183, 30, 23,202, 75, 75,143,211, 4, 3, 77, 36, 83,183,234, 87,
- 92, 35,129,135, 27, 92,142,245,144,147,136, 16,171,224,252,254, 42,234, 61,180,220,219,180, 56, 7, 78,148,142, 87, 94,227, 26,
-196, 93, 25,247, 90,198,202, 93,160,216,109, 48,212,197,171,218,220,171,215,138, 55,172, 65,140,185, 14,155,121, 8,181,116,136,
-178,109,133, 0, 30,150, 34,230, 45,141, 47, 51, 51,133,212, 8, 78, 98, 34, 44, 56,139,211,236, 89,137,127,139,174,178, 48,248,
-120,177,142,145, 45, 93,182,170, 33, 89,114,140, 3,175, 87,164, 58,153, 67, 56, 63,181,153, 50, 87, 9, 96,238,138,173,237, 67,
- 39, 90, 26, 33,185,242,202,227,177,153,210,208,226, 24,197,255,185, 33, 18,196,207,155,161,175, 64, 9,138, 76, 93, 96, 68, 38,
- 39,167,168,135,241, 38, 96,243,130,201,129,186, 18, 93,200,102,155,171, 94,131, 84, 61,229,198, 25, 41, 50,213,187,150, 10,252,
- 30,238,146,155,141,145, 31, 57,105,205, 91,241, 94,191,191, 55, 45, 70,100, 9, 95,138, 76,122,165,141,138,188,126, 15,193, 59,
-206, 81,170, 16, 87, 11, 99,123,197,190, 57,103, 35,120, 46,174,166, 92,203,115,107,205, 31,173, 43,242,208,163,175, 41, 15, 13,
-149, 76,134,222,133,219, 84,244, 84, 77, 1,107,147,202,149,192,156,209, 16,251,153,162,162, 55,169,220, 3,223,217,135,202,178,
- 57, 58, 43,230,217,184, 90,106,243,146,171,129,103, 94,197, 23,155, 80, 24, 38,148,123,197,158, 68,130,215, 53,137, 12, 77,132,
-255,154,222, 79,101, 30, 9, 82, 83, 23,197,126, 34,104,154,160,131, 62,166, 51, 15, 29,155,169,129, 25,143,194, 8,172,166, 6,
- 93, 58,196, 79,255,208,229, 60,251, 85,191,192,189,123,251, 44,221,245, 85, 70,131, 85,226,116,204,217, 29,216, 33, 41,231,111,
- 25,115, 87, 55,230,222,173, 17,253,173,103, 17, 29,122, 38,241,226,217,232,232,203, 96, 6, 32,189,169,240,190, 84,230,162, 78,
-199,221, 39,148,187, 78,219,100,243,138,189,110, 88,233,236,227,213,182,136,107, 84, 0, 0, 32, 0, 73, 68, 65, 84,223,139, 4,
- 58,107,147, 96,193, 41, 11, 29,196,153, 23, 39, 62,246,233,176,222,184, 20,205, 38,174,104, 73,229, 42,227,201, 20,196,175,208,
-226, 80, 13,151,229, 18,172, 55,193,183, 70,178,223,156, 10,163, 96,161,118, 19,175, 41,183,146, 51,194,157, 43, 60,231, 18, 94,
-175, 83,216,124,164,170, 32,242, 85,195, 88, 53,136, 48,195, 98, 17,205, 66, 11,129, 58, 45,148,187, 74,174,228,164, 22,219, 11,
- 17, 3, 69,196,100,158,190,201,226,212, 70,132,113,170,222,145, 11,148, 72, 8, 13,139, 65,221, 50,233,138, 48, 55,103, 88,136,
- 13,135,146,236,126, 11, 72, 62,192, 11, 50,238, 66, 16,103, 20, 41,144,132, 92,177,219,156, 24,167,213, 88, 58, 26,198,180, 75,
-114, 91,197,157, 14,148, 90, 25,207,173,123, 16, 90,134, 33, 84, 74,156, 68,171,207,165,234, 37,105,105,146,169, 20,225, 28,241,
-232,136,171,199,100, 93,105, 50, 90, 41,162,220, 5,156, 26,226, 52,133, 7, 30,120,207,197, 54, 1,100,169, 65,156,211, 16,161,
-145, 1,155,150,254,140, 63,134,134, 44,180,168, 67,103,174,139, 14, 86, 73,109, 77, 17, 20,247,207, 36,228, 29, 40, 41,102, 42,
-242,112,191,170, 81, 80, 89,236,235, 20,170, 32,124, 32,129,241,226, 66,163, 98,194, 35, 14,208, 5,170,168, 65,179,210,172, 94,
-171,134, 6, 70, 61, 14,220,116, 63,117,163, 74,154, 33,239,124, 91,151, 35,131, 26,174, 29,211,149, 59, 27,128,242,165, 54,247,
-115,199,165, 92, 10,102,239, 95,133,165,167, 28, 59,208,206, 50, 73,217,156,250,124,117,166, 50,146,102, 34,149,150, 97, 77, 2,
-180, 77,107, 70, 81, 51,110,151,131,173,194,112, 48,102, 52, 94, 99,254,177,215, 33,122, 9,230,190, 15,161,238, 16,200, 92,227,
-190, 2,140,156, 48, 90, 92,225, 39,159,183,157,239,253,223,126,138,207,222,109,121,224,238, 59, 24, 14, 71,184, 84,137, 36,130,
-196,209,193,114, 86, 39, 98,123, 87, 56,251, 12,229,206,158,229,208,150, 14,201,194, 99,137, 15,111,131,213, 47, 32, 28, 67, 11,
-197, 94, 51,116,188, 19,169,204,138, 23, 84,236,173, 19, 34,150,109, 74,197, 78,132,235,102,235,213,210,112,214, 77, 40,226, 83,
-163,234,165, 12,147,104,182, 0,155,146,114,224, 20, 44,185,135,173, 56,175,197,165, 32,161,101, 64,115, 9,177,151,241,117,227,
- 23, 14,171,138, 13,233,105, 90,242,223, 43,166,150,132,118,101,121,236, 18,126, 52,133, 79,225, 2, 69,229, 42,170, 70, 11, 11,
- 73,107, 30,181,241, 42, 47,159, 8,110,194,203,172, 18,114,114,210, 87, 65, 96,243,208,181, 9, 24,223,185,122,144, 98,177,178,
- 25, 92,140,203,136,101, 64, 44,133,142,170,188,179,138,245, 45, 17,154, 10,199, 86, 96, 41,133, 72, 28, 98,118, 32,157, 51, 80,
-231, 13, 44, 12, 42, 17, 18, 69, 85, 24, 48, 88,244, 93, 77,209,229,191, 72,115,180,177, 10,193,122, 15,206,212,166, 89,211,242,
-224,113,241,224, 6, 38,169, 41, 98, 12,152,168,224,238,103,207,212,213, 25, 96, 19, 80,112, 93, 65,185,194,120, 41,125, 74,145,
-201,235,147,250,157,250,177,170,193, 24,146, 66,161,101, 75, 95, 39,130, 56,154, 78,104, 21, 12,104,194,156,235, 19,139, 22,164,
-195,236, 52,166,132,164,115,222,137, 72,229, 74,196, 24, 68,162,234, 61,214,183,105,248, 46,124,121, 82,185, 29,153,132,207,165,
-106, 84,152,202,117, 76, 63, 79, 37, 68, 27,190,207,134,107, 40,231, 80, 78,116,242,243,161, 48, 39,167,236, 39, 77, 31,101,170,
-247, 98,130,221, 69,100, 67,132, 39,169,132,208,100,157,237,170, 40,128,212, 17,137, 6,234, 85, 62,183,101, 29,248,181, 48, 94,
-105,226, 21,204, 32,132, 53,125, 35, 84, 66, 29,245,195,105, 96, 87,137,102, 10, 94, 10, 70,133, 84,130, 81, 74,149,174, 27, 9,
-172, 14, 44, 81,178,196,247,254,208,247,243,132,235,127, 20,123,217,101,216,133, 39, 64,234,106,110, 80,121, 13, 78,132, 99,203,
-150, 23, 95,210,231,123, 94,121, 3,255,124,244, 98,142,222,251, 85,210,113,130,224,136, 34,111,152,171, 67, 35, 97, 36, 6, 81,
-229,162,200,112,213,150,152,199,156,171,116, 47, 16,146, 61,123, 96,235,211,128, 93,136, 38, 83,194, 37,235, 67,222,205,184, 8,
-235,143, 24,221,164,102, 12,119,148,205, 24, 13,178,238,213,200,244,215,127,226, 84,191, 96,190,153,212,179,211,157, 58, 15,250,
-105,113,120,159,196, 6,154,169,184, 72, 12,198,100,158,140, 83, 37,197,101,236,120, 41,227,217,234, 9, 21,198, 16, 40, 90,131,
- 11, 56,235,154,211,196,188, 45,145,165,196, 73,113, 12, 41, 60,194,124,226, 24,162,156,144,231, 19,236, 64,124,114, 91,104,161,
- 24,194,187,112,148, 10, 2, 4, 99, 66,226,147, 79,133,211, 80,249, 75, 17,127,206,177,137, 60, 28, 97, 66,184, 50, 24, 86,153,
-103, 14, 78, 45,206, 90,156, 83,156, 11,225,205, 28, 6, 39, 80, 86,229, 21, 68, 2,206,192,168,240,106, 13,230,140, 5,230,207,
-136,136,115, 50,157,100,207, 62, 54, 18, 36,154, 85,199, 69, 90,129,223,181, 50, 65,234, 48,149, 86,124, 63, 41,188,243,240,154,
-164, 97,196, 21,207, 64,165, 72, 21,108,162,238,154, 72,136, 99,227, 73,148, 65,124, 79,202,108,133,144,150, 83, 85, 90,130,136,
-241, 40, 74,128,105, 21, 80,234,180,213,181, 84, 88,166,160,253, 87, 99,241, 57,115, 95,211,196,123, 62, 82, 49, 1, 37, 48, 10,
- 68,149,254,192, 50,118,217,184, 9, 21, 73,227,194, 27, 40, 95, 65,179,121, 50, 85,145, 23,230,148, 87, 10, 82,187, 63,169,159,
- 40, 59,246,132, 17, 32, 53, 37,156,161, 14,210,160,152,165,234,230, 22, 28,142,252, 89, 79, 92,231, 4, 83, 66,138,247, 41,210,
-172,252, 67, 37, 89,127, 87,211, 12,140, 70,210,145,108,156,199, 92,181, 99,100, 38,249, 77,234,198, 77,195,189,212, 61,229, 13,
-169, 13,169,190,219,208,160,173,171, 32,169, 57, 8,212,222,235,228,234, 94,159, 99, 97,218,105,104, 99,151,103, 45,169,196,229,
- 29,173,165, 66,188,182,200,171,127,232, 74, 94,241,242, 87,113,165, 30,100,199,182, 3, 36, 11, 91, 64, 59,158, 77,164, 19,207,
-246,248, 72,120,108,116,156, 31,252,193,167,115,223,142, 23,113,120,223, 61, 36,227, 21,140,142,137, 80,156, 38,136, 81, 58,113,
- 23,136, 49,206,162,198, 50, 54,194,174, 72,120,202,124,196,101,103, 66,111,143, 33,221,189, 7, 22, 30, 15,218, 5, 77,167, 42,
-198, 42, 10,182,158, 65,199,212, 16,143, 76, 83,214, 50,219,212,170,255, 93, 54, 96, 54, 76,215,231,114,162,214,196, 9,139, 17,
-201,178,205,179, 52, 53,197,145, 98, 53,205,148, 84,238, 15, 43,153,178,210, 12,118, 52,162, 68,100, 9,233,206, 43,102,209, 50,
-214,232, 60,188, 45,146, 43, 8, 45,198,173,122, 4, 32,124, 92, 21,175,204,239, 19, 21,228, 48, 41,246,143, 69,136,243, 73, 33,
- 97,122, 85, 45, 78, 37, 84, 60,207, 48, 6, 30,139, 16, 73,233,121,132,192,135,171, 83,211, 60, 20, 91,164,108,229,139, 90,192,
-128,215, 90,198, 76, 70,254, 83, 18, 40, 22, 65,231,167, 76, 8,180,184, 64,177, 22,102,138, 68,104,186,136, 93, 57,196,118, 17,
-118,198,153, 17,100, 36, 55,177, 50,133,149, 47, 12, 82, 49, 68, 60,162,144, 31, 75, 39, 67, 20,121,188,188, 36, 86,149,100,192,
-156, 67,145, 67,213, 21, 15,177,158, 71, 43,161,231, 91, 37,185, 97,202,119, 99,252,201,196, 43,104,241,208,125,227, 4,148,146,
-164,137,104,246, 44,136,203,124,108,153,140, 5, 79,122,235, 82, 67, 66,106, 11,185, 63, 71,234,164, 72, 3, 20,164,178,112, 74,
-176, 64, 59,145,202,177,138,115,228,134, 96,254, 28,188,193, 83, 9, 95, 56,109, 80,228, 33,249,205,160,234,205, 69, 35, 19,215,
- 82, 26,180, 85, 52, 35, 84,140,197,191, 21, 8, 67,107, 30,190,212, 64, 12,169,226,199, 26,144,225, 68,166,160, 11, 50,225,181,
- 20,215,214,168,216,203,176, 81,163, 55, 34,205, 70,138, 76,106,201, 13, 45,118, 66, 72,232,155, 98,245,201,116,231,173,106, 4,
-203,166, 92, 61,173, 17,123,171, 80,172,100,161, 14,165,102,138, 83, 69,145, 26, 12,162,153,236, 48,173,122,228,213,171,209,192,
-233, 40,157,179,149,165, 33, 47,191,106,129,107,126,248, 85,236, 61,118, 54,115,199,143,176,115, 52,196, 14, 14,128,164, 25, 97,
-174,118,235, 99,133,104,117,204,245,207,234,210,123,246,203,185,231,200,153, 36,107,139,144,164, 89, 26,116, 58,166, 35, 74, 20,
-119,177, 38,198,210, 37,210,152, 72, 98, 98, 81,172, 17, 22,162,136, 43, 22, 58, 92,114, 78,151,232,156, 8,187,245, 44, 48,103,
-101,233,170, 33,162,161, 77,228,201,147, 87,116,178, 97, 24,158, 41,227, 56, 55,150,117,131, 32,128, 86,208,175, 13,193,240,167,
- 74,189,251, 29, 99, 35, 16, 73, 78,148,195, 67,237,100, 42, 94, 33, 85,201,188, 81, 20,171, 25, 65, 43, 31,136,145,130,197, 96,
-125,188, 93, 17,108,185,100, 85, 99,225,234,138,201,154,199,231,108, 1,183,234,100,190, 93, 30,215,206, 11,224,168,120,246,185,
-143,177,139,208,241,208,186, 21,201,152,156, 57,104,238,175,215,105, 22,103, 70, 92,150, 46, 69, 22, 18, 48,158, 6,229, 2,126,
-149, 86,108, 50, 13,206,174, 5,129, 80, 85, 10,143,222, 85,152,241,117,242, 92,192, 26, 15, 97,248,154,145, 81, 29, 10, 30,230,
- 53, 6,134,142, 99, 35,143, 44,160,168, 75, 43,172,227,202, 50,235, 61, 61, 19, 28, 3,159, 58, 86, 22,243, 41,207,232,234, 11,
- 79, 81,128,167, 92,248,172,191, 63, 19, 42,187,138,119,109,202,184,178,152,130,229,160,120,171,198,248,252, 3, 45, 23,241, 60,
-157, 13,157, 49,120, 11, 7,219, 65, 52, 71,103,190,131, 14, 87,176,169, 67,101,202, 98, 71,105,108,169,148,228,199,137,120,166,
- 82, 33,141,133,139,165,228,113,230,154,119, 95, 33,223,105,144,250,150, 27, 68, 26,166, 53,213, 24, 63,245,116,183,208,115, 50,
- 6, 99, 98,207,172,183,160, 14,231, 2, 76, 41, 79,129, 43, 72,121, 13,132,168, 90,170,156, 22, 36, 86,102,198,240, 75, 50, 32,
- 19,249,212,101,204, 94, 27,158,157, 4,161,241, 58, 43,185,129,237, 79, 72, 2,211,233, 68,103,201,227,204,155, 97, 35,207,246,
-220,167,198,219,117, 50, 94, 28, 42,230, 2,170,215, 10,147,111,230,194, 44,225, 17,180,150, 29, 46,165,114, 47,211,212,180, 74,
- 18,156, 17,163,175,103, 77, 76,155, 57,149,154, 24,193,108,207,205,246,227, 35,225, 9, 11,107,252,200,203,174,230,216,217, 79,
-228,248,215, 15,211, 79, 97,109,217, 34,253, 99, 96, 44,101,226, 97,121,190,229, 33,124,215, 25,107, 92,251,130,199,243,141, 45,
- 79,102,180,244, 0, 73, 58, 68, 85, 73,173, 37, 54, 66,188,237,209,136,217, 70,162, 96,199, 41,184, 21, 48, 35, 76,236,136, 76,
- 7,193,177,205, 56, 46, 84,225,208,252,152, 99, 11,138, 70,219, 17,251, 64,131,209, 85, 37,126,234,122, 74,116, 26, 83,254,100,
-224,247, 19,136,110, 87,235, 99, 8,179, 82, 54, 31, 10,137,213,199,155,139,201, 27,172,126, 70, 50, 88,222,106, 25,231,110,138,
- 19,217,144,166,161, 25,241, 37,103,126,171,175, 66, 7, 16, 5,202,220,248, 5,212,105, 9, 73,229,112,184, 6,185,176,102, 98,
-193,247,191,122, 88, 95, 37, 70,140,160,145,128, 75,192,150,198, 68,158,159,238,114,117,166, 50,193, 18,215,134, 74, 91, 38, 32,
-240, 24,255,155,243,121,227,249,132, 53, 34,149, 88,150, 41,130, 10,249,189,226, 13, 28,169,248,144, 58, 1, 7,151, 74,194,230,
- 87,101, 60,187, 93, 41, 56, 11,214,105, 1,127, 75,101, 33,202, 22,225,140, 88, 39, 21, 67, 66, 2, 72,182, 36, 50,106,101, 17,
- 83, 76,185,184,231, 6,142, 8,198,243, 41, 36, 32,165, 84, 88,234, 74, 81,128, 71,131, 92,103,167,138, 77,109,134,180,104,238,
-245,103, 47,184,185,178,152,103,229,135,107, 46, 6,213,132, 57, 82,212, 8,171, 98, 42, 17,195,146,169,223, 68,164,146, 96,124,
- 84,139, 50,212, 21,187,230,213,225, 42,225,213,140,121, 95, 81,114, 40,248,226, 73, 57,108, 40,245, 1,217, 52,161,131,244,163,
-144,195, 96, 76, 68, 28, 65, 20, 25,156, 66,154, 56, 48,146,101, 24, 21,138, 52, 72,203, 82, 38,217,239, 30, 93,169,165,182, 55,
-146,228,154,178, 5,178,148, 74,169, 13,253, 42,225,176, 26, 95, 14,158,101, 77, 9,139,212,210,198,234,222,142, 54,179,187,235,
-176,189, 78, 16,190,170,168, 18,186,177,165,177, 86, 41,160,170,249, 26, 22,221, 74, 22, 64, 33, 46, 48,126,214, 81, 26, 13,117,
- 40,154, 72,114,197, 51,170,145,169,180,198,171, 8,207, 89, 49, 82, 38,140, 35,169, 20,213,106, 14,184, 41,201,208,241,156, 39,
- 25,206,189,252,153,236, 59, 24, 97,214,238, 99, 57, 29,179, 52, 74,136, 37,134,137,114, 78,217,218, 21,143, 29,223,245, 68,232,
- 93,252, 52,150, 30, 48,184,254,253, 24,181,140,198, 99,182,119,198,156,117,222, 46,164,115,152, 84,247,178, 98,182,145,232, 5,
- 72,114, 49,157,113, 31, 39,199, 50, 39, 44, 53,140, 93,159,158, 77, 57, 83, 70, 28,239,165,104, 20,251,117, 81,131,160,109, 83,
-162,218,122,228, 52,173,189,154,117, 24,237, 51,169,241,181,241,171,212,158,172, 76,164, 54,110, 86,107,203,172, 83,215, 46,240,
-100,168,115,177, 83, 87, 16,129, 34, 63,128,172,230, 16,185, 41, 96,223,156, 45,158,191,114, 13, 86,121,241, 30,190, 20,123, 40,
-182, 96,126,103,199,118,190,212,104, 62, 8,173, 95,168,162,250,163, 43,242,159, 3, 67,160, 70, 5,201, 13,130,212, 51,221,141,
- 8, 81,100,192,100,249,240, 54,133,196,151, 55,205,185, 64,121, 74,154,147,146, 80,167,249,177,166,240, 33,194, 34, 78, 69,102,
-149, 74,165, 60,167, 4,201,223, 81,141,204,103,114, 78, 66, 14, 13,234, 36, 4,111, 42,219, 75,165,212,107,104,123,219,156, 16,
- 23, 84, 92,202,179, 22, 10, 56, 86,130,231,229,145,145, 28,213,146,138,107, 84,122, 46, 18,111, 1, 99,209,100,224,105,200, 82,
-181,148,155,242,115, 11, 56,191,100,167,107,144,144,174,190, 86,129,132, 94, 97,113,175,213, 34, 67, 97,186, 85, 72,150, 19,181,
- 12,251, 89,158,120,100,202, 56,126,184, 4,170,204,152, 73, 19,110,158, 52,198, 12,209,192,147, 84,154,149,154, 10,166,147, 97,
- 61,227,113, 45,222, 38,165,103, 44, 51,149,105,110, 12,105,134,140,121, 47,221,248,218, 6, 82, 79,181, 42,210,156,167, 51,229,
- 43, 6, 75,165, 60,242,172,156,121, 41,138,200,148, 99, 87, 39, 82,209,164,182,111,197,168, 11, 80,147,234,189, 87,180, 82, 69,
-127, 77, 62,139,134,136,117,192,157,208,105,136, 11, 83,146,239,155, 98,237,132, 40,192,100, 78,248,204,181, 85, 3, 69,107,252,
-179,213, 89, 30,216,236,194, 45, 82,243,196,203,202,187, 58, 1, 55, 87, 13,157, 32,253, 82,103,251,236,218,160,208, 7, 14,206,
- 51, 35,158,250,196, 51,121, 96,251,227, 57,126,192, 96, 83,131, 77,149,184,155, 50,220,182, 7,142,222, 3, 58, 4,153, 47,180,
-217, 32,133, 11, 59, 9,143,185,124, 27,247,216, 11, 25, 30, 91,198,165,171,244, 71, 35,182,184, 49,115,157, 57, 14,126,241, 94,
-226, 3, 31, 97,207,142, 49,231, 93,208, 99,249, 81,231,177,124,230,119, 99,236,181,208,223, 74, 95, 31, 64,211, 57, 70,171, 74,
- 58, 58,202,188,166,152, 24,172, 49,229, 10,167, 65,206, 76,237,221,200,148,154,130, 82,223, 66,116, 93,131,111, 51,168,207,100,
-114,132,176, 33,246,123,200,215,218, 52,196,116,138, 92,121,129, 88,243, 50,174, 62,190,151, 33,228,182, 40,157,153, 1,233, 37,
-201, 41,175,202, 37,206, 85,194, 7, 18,212, 47, 51, 62, 47,187,188, 86, 45,148,171, 6,185,163, 78, 93,205, 58,150,138,237,234,
- 10,147,194,255,235,189,190,236, 90,243,162, 57, 14,235, 1,241,184,136, 59,151,112,189,171, 67,220,149,250,235,101,169,210,240,
-161,186,138,253,152, 21, 64,169, 70,108,171, 75, 82,238,209,230,112,179,106,158,166,227, 21,187, 15,194,154, 32,182,110, 2, 3,
- 32,143,207,150, 16,125,153,246, 21, 22, 59, 45, 35,102,134, 74,194, 86,238, 53,211,160,148,107, 11,138, 41,210,159,114, 5, 60,
-102,174,147, 85,134,235, 39,190, 78, 65, 81, 65,144, 32, 63,191, 92,140,203,144, 67, 45, 55, 87,104, 72,223,211,114,144, 7,206,
-173, 72,157, 28, 85,214,211,207,223,143,149,140, 25, 81,169,120, 86, 73, 62, 44,175, 75, 27,106, 63, 77,228,156,214,188,221,210,
-128,104,240,117,164,138,214,170, 77,125,169, 94,227, 61,121,109,220,182,217, 43,174,122,163,214,102, 1, 14, 71, 86, 64,198,186,
-201, 80, 64,129,178,232,236,227,133,139,153,169, 40,252, 89,240,123,181,218, 92,221,179, 46,114,249,131,162, 54, 50,197,213,145,
-122, 26, 95,237, 94,195,106,142, 19,151, 29,188,187, 9,131, 90,154,189,243, 9,175,122, 61,239, 93, 38, 67, 48,235, 42,223,208,
- 72, 9, 98,189, 19,227, 71,235, 70,128,110, 76, 89, 84,198,127,137, 44, 77, 84,233, 33, 76, 67,164,154,169,163, 52,122,182,117,
- 69, 56, 74,132,167,108,179, 92,116,209,118, 70,115,219,145, 45, 91, 72,227,121,230,172,227,188,173, 41, 95, 63,239, 76, 92,255,
-137,152,193, 63, 65,212, 7, 51, 7, 8, 73, 10, 23,109, 75,152, 63,119, 55, 15, 12,206, 98,188,178, 72,178,182, 12,201,144,180,
- 11, 31,252,166, 97,239,199,246,210, 27,142, 56,103,126, 27,207,253,170,229,187,174,220,199,206,171,255,130, 35, 59,231,232,240,
- 44,204,240, 40,199,117, 76,146, 26,116, 60,194,104,138, 68, 26,120, 82,211,136,101,186, 49, 98,218,116,171,169,113,227,141,234,
-205, 18,145,154, 28,153, 27, 50, 14,116, 35, 53,238, 31, 60, 13, 31,103, 85,225, 44,206,229,113, 21, 65,140, 34,146,213,115,207,
- 27,126, 56, 95,202, 84,140,167,207, 69, 16,185,108, 1,114,121, 13,115,111, 21,231,196,178, 92, 89, 85,154,131, 4,183, 21,249,
- 7,100,189,197,106,252, 36, 42,139,224,232, 4, 24,163, 26, 0, 78, 2, 70, 83,172, 85,172,100, 12,122, 19, 24, 35,121,129, 21,
-215, 16, 90,211, 0, 22,200,139,117, 72,165,120,108, 73,128, 49, 65, 5,248, 50,141,173,220, 87, 3,100, 65, 43,206,112,181,174,
-118,184,141,171,133, 22, 66, 67, 95,131,120,116,105, 52,228, 46,183,169,170, 52, 41, 27,131,152, 16,150,205, 17, 5,201,239,205,
-213, 96, 62,111,160,185, 4, 59,208,236,253,154,144, 48, 40, 69, 94,172, 11,226,198,211,189, 18, 9,140,143,201, 1, 42,193, 56,
-160,161,172,181, 76, 12,102, 45,203,166,206,152,204,210, 20, 56,159, 49, 3, 43,144,122,161,155, 13,136,155,178, 63,133,241,151,
-230, 6,169, 17, 63,166,252,187, 80, 55,177,224,215,115,202,139, 67,250, 48, 68,146,186,192,124,149, 70, 35, 65,107, 53, 14, 84,
- 26, 10,213,212,225,218,137,240, 68, 83,153,208, 42,194, 64,195,113,235,231,154, 96, 12,171,174, 11,119, 79,187,238,122, 28, 89,
-106,232,151, 78,225, 14, 76,219,127,102,206,121, 25,175, 43,144, 67,149, 13, 36, 57,123,164, 49,223,182,177,188,146, 80,169,112,
-185,225,218, 96,147,211,160, 68,100, 84, 43,165,103, 39,102,134, 76,134, 63,194,113,164, 21, 72, 59,115, 40,118,116, 12, 91,165,
- 79,175,187, 74, 87,198,216,225, 49, 34, 99,185,180, 23,179,186,123,192,253, 92, 68,116, 79,135,120,229, 14, 68,142,227, 68,137,
- 70,202,163,246,244, 73,207,190,152,227,171, 11,172, 29,255, 6,201, 96,133, 5, 73,184, 79,122,236, 61, 60, 34,150, 69,116,123,
-143,187,212,112,239, 17,131,254,227,118,174,235, 29,101,249,105, 31, 96, 28,159, 75,151, 93,140,221, 33,146,212, 32,214,120,114,
-181,248, 26, 17,174, 22,128,156, 94,187,125, 50, 56,176, 73,245,183, 9, 29,169, 19,207,116,131,209,112,213,117, 79,180,217,130,
-199,155, 47,144,156,195,239, 33,134,175,214, 43,228, 44,158,110,124,115, 23,139,226,156, 45,216,226, 5, 27, 91,179,148,152,176,
- 8, 74, 88, 30,209, 41, 88, 21,140,143, 22, 59,241, 94,107, 81, 94,180,106, 85,186,138,159, 92, 54, 71,112, 18,194,162, 90,177,
- 84,243,146,162,106,133,212,147,231, 42,101, 82, 3,136,219,213,150,208, 18, 74,212,138,199, 96, 60,236,229,168, 50,116, 43, 41,
- 88,249,109,170, 6,199,159,156,252, 97,238,188, 78, 12,154, 90,184, 79, 39,171, 64, 22,199, 14, 60,103,227,159,131, 83, 41, 82,
-152,148,178, 90, 92,165,132,143,116,178,164,236,116, 80,196,191, 77, 16, 30, 80,129, 84, 77, 17,138,144, 74,230, 43, 65,106, 89,
-149, 82, 84,185,151,226, 25,202, 44,213, 91, 40,181,188, 14,188, 76,113,101,164, 24, 12,149, 32,248,164,130,204, 14,152,153, 86,
-110, 74, 44,109, 86, 19, 9,159,119, 45, 30, 98,175,119, 92,107,130, 65, 11,131,203, 24,140, 55,176,156,205,200,125, 18, 42,153,
-176,127,223, 68, 61,120,129,122,193,227,226,217, 57,255, 14, 75, 58,190,214, 13,133,224, 26,181,102, 64, 84,223,125, 9,161,203,
-196,115, 44, 43,173,229,161,156,137,210,187,121,197,188, 92,233, 6, 77, 86, 38,182, 15, 74,207,230, 80,106, 37, 13,190, 9, 37,
-169,123,211, 13,202,106, 90, 33,157,137,145, 53, 13,154,159, 44,237, 86, 45, 27,220,216,189,174,161,176,196,132,183,221,228, 81,
- 86,139, 82, 77, 93,172,117, 86,149, 61, 41,185, 40, 53, 55, 51, 44,158, 19, 22, 90,170, 24, 80,181,107,145, 8, 22, 71, 17,195,
-227,107, 36,199, 14,178,114,223, 14,162,225, 65, 52,114,204,137,112,101, 71, 89,120,212, 42,251,183, 94,192,240,224,110, 56,114,
- 15,131,254, 65,182,196, 35, 46,122,252, 25, 28,237, 62,153, 99,251,239, 97,184,124, 24, 73, 82, 58,177, 99, 49,157, 71, 22, 15,
-209,227, 56,152, 46,187,128,229,121,120,247, 81,225,172,207,205,115,209, 89,247,115,244,210, 59,160,247, 66, 36,157,195,197,138,
- 72,134,163,170, 85,208,113,165, 12,239,164, 1,198,186, 33,146, 10,209,183,176,146,116,118,233,183,117,170, 4, 87, 93,185, 25,
-224,203,196,247,245,220, 7, 78,140, 44,119,138, 10,210,196, 42, 37, 83, 58,143,203,169, 10, 86, 41,226,162, 57, 8,173,170,144,
-134,233, 65,121,105,214,114,180,134, 48, 93, 44,121,110,118,182,248, 25,173, 54, 97,113, 69, 49, 18,241,197, 92,202,135,227,180,
-100,209, 87,154, 36, 4, 36,180, 60,143,190,100,167,251, 88,174,201, 80, 4,171, 76,132, 0, 74,207,176,196,206,138,238, 97, 53,
- 69, 85,152, 24, 30, 5,200,152,203,165,215,161,146,101, 0,184,210,156,169, 64,234,160, 24,161,214,101,172, 26,203,151, 16, 90,
-203,243,135, 27, 34,117, 5,116, 47,121,101, 62, 41,140,136,105,121,148,217,162,238,136, 5,226,200, 48,116, 77,195, 69, 2,162,
- 98, 96, 40,229,177, 86,149,192,251, 47, 59, 88, 25,255, 62, 92,222,225, 76, 66,207,171,172,118, 47, 53, 3, 64, 43,181,103, 39,
-109,225,220,144,203, 82,228, 76,165,139,216,180, 82,171, 70,197,135, 53,116, 34, 25, 70,130,188,222,137, 24,187, 78,201,231,111,
-242,176, 9, 75,194,106, 97,220,162,158,216,104,243,237, 76,145,215,174,154,135,140,130, 96,133, 43,211, 59, 43,229,101,243,126,
- 0,210,241,144,111, 66,201,145, 11, 70,132, 54, 41,165, 42, 25,111,146,171, 23, 6,100,181,228, 18,132,139,221,148, 74,109,149,
- 86, 69,194, 36, 51,158,102,229, 94,182,206,173, 1,170,181, 16, 65,213, 91,109, 34,175,110, 76,185, 79, 64,243,245,142, 99,149,
-182,171, 82, 9, 21,104, 65,210,243,229,136,101, 50, 83,163,113,110,133,140,119, 89,191,197,108,197,136,209,245, 74,226,214, 56,
- 36, 90,237, 3, 89, 9,115, 52,114, 16,178,223, 59, 6,142, 36, 29,190,121, 95,159,228,254,127,102,105,245,124,116,220, 33, 30,
- 15, 89,113, 41,177, 53, 92, 21, 9, 23,237, 94,229,155,103,110, 97,185,255, 88, 18,123, 5, 79,154,143,233, 94,216,227,238,125,
-171,172, 45,222,143,179,150, 24, 97, 28,195,225, 99, 99,228,248,126, 48, 41,208, 67, 81,182, 11, 28,238,192,167, 14,199, 92,122,
-255,144,249,139,247, 97, 59, 3,122,221, 57,132,101,208, 49,137, 83, 52, 77,125, 58, 27, 13,253,117, 26,200,167,141,230, 74,125,
- 29,211,245,189,242, 13,108, 50,113, 78,213,102, 18, 93, 83, 56,199,103, 3,205,138,194,108, 8,126, 63,217,216,186, 66,156,193,
-213,174, 88,188, 93,169,106,203, 82,165, 26,244, 72,243,139,187,213, 26,171, 91, 43,115,166, 2,183, 71,133, 50,202,190, 75,115,
- 15, 60,168, 76,165, 62,101, 46, 91,164, 51,104, 62, 45, 60, 84,169, 88,163,174, 98, 81, 41, 70,173, 39, 49,151,144,120,158, 74,
-229, 92,146, 41, 93,137, 38,122,159,135,245,226,167,121,207, 81,173, 42, 89,169,240, 92,230,201,155,236,122,173, 86,201,109, 69,
-137, 26,109, 2,169, 43, 45,170,131, 70, 46, 97,173,251, 42,128,175,149, 42,123,117,240,170,250, 25,202, 84, 55,112,216,177, 45,
- 60,122, 87,225,156, 6, 77, 59, 26, 8, 55, 90, 75, 77, 34, 32, 25, 78,212,252, 14,114,113,179,205,187, 89,111,242, 90,158,109,
- 54, 78, 92, 86, 32, 70,171,185,194, 4,236,253, 80, 9,212,153,236,149,142,101,206, 85, 22,217,106,124,188,108, 70, 34, 1,156,
-173,161,219, 57,101,138, 73,197, 16, 40,145,153, 2,141,113,206,231,224,107, 80,235,185, 44, 59,155, 79,112,173,196,219, 5, 34,
- 79, 13,117, 41, 97,135, 56,167,130, 58, 71,167, 23,101, 6,216, 32,161,222,145, 37,132,197,195,204,134, 80, 1,229,132,157, 58,
-252, 94,214, 23, 47,210, 92,106,241,233, 26, 58,161, 50,197, 11,108, 74,253, 11,234,225, 55,196,189,155, 17,150,233,176,121, 83,
- 77,252, 77, 43,247,130, 4, 89, 83, 18,202,140,237, 33,175, 56,160,193, 51,154,205,108, 15, 88,251,178,126,233,217,106, 67,156,
-141,196,223,195,188, 15, 87,225,245, 20,221, 42,165,172,128, 89, 47,235, 60, 31,193,253,137,225,246, 47,119,121,250,163, 63,142,
-156,189,133, 97,239,105,164,107, 9,145, 89,100,220,137, 48, 86, 56,123,108, 57,167, 59, 32,218,214,165,211,235, 16, 27, 97,239,
-209, 69,134,107, 43,217, 88, 53, 49, 93, 3,135,220, 86,142,220,183, 72,119,237, 94,232,245, 8, 25, 85,243, 49,220,147, 8,135,
- 14, 24,206,232, 47,178,122,198, 42,105, 50,143, 14,215,176,118, 76,234,124, 75,110,135,119, 81, 58,205, 15,104, 3, 16,188,204,
-210,130,178,121,156,126, 2, 60,223,180, 98,149, 0,133,217, 64,233,226, 7,131, 67,231,111, 34,118,158,233,110,157,207,233,206,
-109,115,205,146,172,202,162, 32, 90,120,161, 38,239,155, 94,153,136, 90, 88,140,170, 82,203,131, 41,211, 4, 68,115,239,150, 2,
-226, 86, 9, 84,123,208,102, 53, 10,212, 68,222,204,197, 96, 50,159, 58, 44,124,161,121, 33,152, 42, 93, 74, 85,209,232, 44, 84,
- 28,105,178,132, 67,232, 24, 42,125,202, 3,245, 91,201, 49, 23,169,251,153,213,251,145,194,103,211, 32,167,126, 50, 15,189,137,
-242, 17, 18,141,181,142,250, 81, 77,242,168, 23,171, 49, 4, 49,110,202,120,175, 86, 10,135, 84,139,229, 56, 96,164,165,199, 95,
-164,162, 53,176,237, 93, 96,109, 24,255,110, 66,213,111,124, 8,101,226,190,242,142,101,254, 24, 38, 22,186, 8, 73,226,124,171,
-216,176,150,127,200,141,160,226, 17, 78, 6,112, 27,188,171,192,104,155,232,130, 37,101,233,219,137,194, 81,174, 6,239,201,250,
-149,171, 92,193,217,215,162,141,176, 22, 93,210,210, 66,121,134,138, 40, 43, 60, 83,163,235,169,130, 49,196,113,148, 25,182, 54,
-194,165,105, 25, 34, 18,176, 38,130,116, 12,174,234,145,105,144, 87,216,212, 90, 68,106, 61,194,101,138,114,156,100,144, 51, 49,
-238,107,214, 65,165,163, 69,165, 27, 92, 93,213, 7,222,127, 97,216,105, 25,226,209,105, 13, 72,234, 33,130, 74,104,104, 58,100,
- 95,141,183,135,171, 90,230,164,100, 63,254, 61,168, 43, 58, 67, 96, 34,104,104,241, 84,180,107,173, 2,117,155, 32, 49, 75,153,
- 98, 53,205,224,144, 13,194,176, 19,187,228, 79,213, 4,134, 86, 72,172, 43, 27,109,149, 72, 86, 54,122, 99,148,113, 79,120,239,
-254, 30,242,161, 53, 30,243,172,247,227,118, 31,101,112,238,149, 68,107, 59, 49, 75,135,177, 28,103, 32,150,142, 42, 50, 84,146,
-100,204,162, 75, 88,235, 39,152,113, 74,212,241,245, 57,230, 59,220,189,216,101,176,255,171,108,141, 6,168,108,173,204,224,174,
- 40, 75, 10,135, 87,132,115,198, 41, 67, 77, 25, 15, 45,118, 60, 0,117, 68,113,148, 57,143,182,223,200,171,153, 68,159,166,171,
-182,147, 34,138, 55, 32, 37, 19,222,255, 6,120, 23,211, 27,178,110, 44, 87,125, 99, 41,110,186, 57,238, 0, 16, 39, 98, 72,139,
- 69,195, 21,222,115, 94, 21,204,169, 6,177, 11,157,168,171,238, 38,188,211,178, 14,123, 65, 9,215,210,227, 22,202,114,169,228,
- 29,220, 84, 42,209,218,106,173, 33,157,136,161, 20,208,182,223,200, 18,249, 56,119, 90,182, 28, 14, 61,180, 45,115,108,233,244,
-137, 87, 18,214,198,226,243,207, 39, 31,115,198, 90,247, 10, 76,243, 94,220, 66,248, 4, 34,127, 5, 69,234, 90, 80,206,188, 82,
- 16,114,162, 16, 84,181,154,154,214, 96,221, 18,242,245, 36,194,210,239,171,118, 0, 10,122, 54, 75,224, 57,133,144,191, 6,233,
-135, 57,218, 80, 69, 12,202,116, 48, 83, 49,108,124, 5,170,137,116,155,170,145, 33,141, 29,209,168, 54, 86, 73,199, 89, 30,180,
-148, 35, 35,239,112, 38,235,180, 50, 44, 85,140, 9,218,137,234,244, 73, 52,225,245, 51, 73,175,215,218, 74, 45,211,114,127, 67,
-146, 99, 68,220,155, 7, 59, 36, 77,198, 80, 96, 79, 57, 20,109, 2, 6, 72,121, 94,167, 90,201,186,200, 73,116, 70,202,109, 35,
- 1, 53,166, 2,155, 70, 2,169, 19, 18, 87,133,210, 37, 88,137,138, 38, 65,100, 25, 43, 90, 15, 17,212,114, 17,115, 70,188,170,
- 82,237, 1,222, 28,202,168,164,228,133,175,185,168, 51,160,133,162,158,128,235,131, 70, 52, 21,156, 41,232,110,219,168,220, 3,
- 69,168,141,100,185,102, 13,155,237,230,192,165,184,116,140, 29, 39, 88,171,164,218,193, 73, 23, 53, 49, 72,140,154,204, 35, 52,
- 46,161,163, 67, 58,178,134,137, 4,226, 14,152, 14,149,106,132, 65, 1, 35, 37, 44, 57,169,141,220,168, 34,148,162,132,253,250,
-102, 42,119, 61, 17, 45, 84,235,132,167, 72,101, 1, 42, 12, 46, 9,194, 43,126, 93, 93, 48,202, 82,172,252,233, 55, 23,184,246,
- 35, 67,158,254,132,143, 16, 61,110, 47, 7,182, 62,149,149,238,163, 97,180, 7, 77, 20, 59,234, 51,116,107, 72,154, 48, 74,134,
-184,100, 68, 44, 22,193,176, 99, 46,226, 1,118,112,247,151,190, 68,111,237,110,116,126,126,226, 78, 12,194, 88,149,126,170,224,
- 98, 70,137, 97, 60,232, 99,236,128, 78,164,140,173, 33,237, 15,232,166,203, 25,207,167, 18, 38, 12, 35,218,155, 37,156,109, 18,
-179,214,117,188,255,141,198,181,155, 90,186, 53,212, 90,152, 8, 47,110,138,220,183,121, 60, 62,238, 68,144, 70,222, 27,116,100,
-113, 15, 74, 22,183,201, 33,203, 0, 78, 22,170,208,100,198,144,246,189,167, 3,200,205,230, 74,197, 47, 88, 46, 87,126,226, 48,
-222, 91,207,191,119,185,186,150,188,149,107,211,205,151,208,122,228,149,100,102,116, 88, 84,133,200, 8, 61, 15,239,143, 52,139,
- 59,139, 46,194, 42,152,249,136, 61,177,225, 72, 10,135, 11,168, 60, 55, 50,116,130, 36,149, 45,206, 82,148, 57,205, 83,252,108,
- 37,214,157, 77, 99, 87,196,155,115,104,188,170,184,114,245, 36, 53,184, 60,247,247,141, 9,210,224, 36, 6,227,178, 20, 42,109,
-110,105, 26, 26,180, 97, 33, 27, 45,122,126,123, 2, 95, 94, 59, 64, 75, 67, 74,138, 20, 56,106, 0,191, 39,222, 4, 4,192, 66,
-173,135,208,234,180,252,239,186,209, 0,140,109, 78, 42,212,194,216,170,134, 80,166,160, 24, 65, 23,250,176,255,213,196, 68,209,
-178,146, 87,227,132, 9,242, 87,195, 22,177, 69, 30,186, 84,147,189,195,252,104, 85,144, 40, 98, 97, 46,194, 14, 32,205, 27,248,
-132, 6, 35, 33,201,114, 82,137,135, 69, 70, 10,146,167,203,208, 47, 87,132, 13,130,184,186,122,195,167,184,150, 6,219, 62,172,
-119, 80,233, 3,223,220,175, 93, 67, 67,139, 58,193, 67, 27,171,223, 85,148,111,157,225, 45, 52,247,129,175, 35, 41, 18, 34, 65,
-235, 85,195,155,192,229, 27,218,209,134,241,120, 7,118, 76, 58,236, 51, 26,195, 56,222,142,110,185,128,185,179,207, 99,126,215,
-185,156,181, 99, 7, 11, 91,183,210,153,155, 35,142, 12,221, 78, 68,234,160,223, 31,114,236,200, 49,142,223,191,159,228,200, 55,
-233,244, 15,210,209,101,226, 24,232,244, 16,137,203,180,221, 10,193,176,201, 24,209, 74,207, 2,157,200,177,174, 17,248,180, 94,
-106,102, 3,205, 99,235,149,164,116,242,216,142,144,120,170,149,150,205, 33, 79, 98,123, 44,244,141,227, 3,199,231,249,250,103,
- 58, 60,249,238,189,156,119,225,126, 30,117,238,217,112,198,121,244,183, 62,138,193,182,221, 12,146,115, 24, 44,143, 72, 70,199,
- 81, 19,227,196,177, 99,107,204,176, 59,199,237,255,248, 53,236,125,159,163, 55,223, 13,220,142,154,221,172, 96, 58, 74,210, 57,
-131,254,168, 71, 58, 60,140,216, 49, 86, 19,150,135, 93, 88, 57,142, 48,240,125,220,235,145,106, 45,179,146,214,239,188, 58, 91,
-221,109, 18,235,110, 86,232,155, 69, 11,166,123,214, 77, 12,254, 7,171,194, 92,172,214, 34, 46, 83,178, 8,196,134, 34,111,214,
-105, 30,187,205, 75, 68,186, 32, 78,108,112, 18,103,150,174, 8,208,199,165, 41,234, 11,152,196, 1,124, 88,196, 33,235, 21,176,
- 52,168,251, 30,228,195, 26, 41, 23, 59, 27,198, 40,130, 58,224, 22, 45,200, 45,198, 43, 91,235, 12,105,193,192,207,123, 94, 71,
- 68,192,104, 85,217,235,109,134,184,226, 33,103, 6, 66, 89,133,174,156,128, 26, 20,221,238,228, 5,116,124, 51, 27,168,246,128,
-150,192, 91, 53, 53,208,190,132, 32,171, 96, 93,225,161,249,255, 19,178, 12,132,216,123, 88,137, 78, 66,250, 83, 43, 83, 7,107,
-161,241,222, 98,174,184,210, 6, 31,180,228,128, 68,133,130, 44,153, 89, 65,120, 43, 39,215,153,142,103,120,219,106,121, 77,153,
-236, 71,158,253,111,178,206, 77, 74, 73, 32, 9, 16, 28,209,233, 69, 99, 66, 18,227, 76,252,115, 70,210,104, 37,148, 42,145,223,
-214, 78,120,135,245, 24,154, 20,233,110,130,104,130, 27, 90,146,212, 21,245,202, 53,128,150, 9, 42,234, 77, 77,157,115,249,123,
-112,136, 24,156,207,113,119,141,165, 85,203, 57, 80, 32, 49, 82,173,196, 23,246, 76, 47, 73,149, 82, 33,107,104, 16,158,168,247,
- 92, 47,171,230, 49, 25, 87,175, 40,235, 28,205, 40,247, 55,249,245, 77,205,125, 15,224,177,106,164,113, 99, 36,187,218,187,157,
- 48,106,236, 8, 59, 88, 99, 48, 86, 70,221,179, 88,216,243, 36,206,187,240, 50, 30,117,254,163,217,179,231, 28,118,159,189,141,
- 93, 91,187, 44, 68,142,142, 36,136,179,184, 52, 1, 59,194, 89,203,208,157,193,225,181,179,185,255,248,197,124,243, 72,159,251,
- 31, 56,198,225,123,239, 97,112,112, 31,241,234, 1,122,172, 98, 58,160,190, 57,201,100, 30,191,214,114,221,167,117,140,159, 30,
-179, 87, 26,226,252, 83, 49,226,166, 73, 95, 85, 23, 38, 64, 5, 84,181,172,229, 31, 24,235,249, 30, 11,198, 96,231,148, 59,109,
-196,190,251,183,178,235, 1,203,121,189, 3, 60,250,140,251,120,244,238,207,179,107,207,153, 12,182, 63,154,165,206,217, 44,156,
-177, 21,149, 30,157, 36, 97,176,114,148,191,251,199,123, 57,122,247, 93,108,153,143, 80,211,109,188,126, 11,204,169,178, 99, 59,
- 12, 22, 30,205, 96,185, 67,210, 95,132,100,192, 90,100, 89, 25, 24,204, 96, 57, 67, 84,125, 60,125,178,170,242, 44,232, 90,102,
-116,205,219,120, 42,225,204,175, 54, 17, 88,159,204,182,212, 13, 49,247, 79, 40, 94,176,137, 4,187, 88,157,248,206,123,234, 21,
-104,192,170,246, 44,100, 23, 86,179,210,188,134,184, 67, 53,205,218,142, 70,208,137,132,110, 39, 34, 26,103,213,136,134, 66,208,
-225, 44,128,228,131,212,172, 10,140, 29, 92,176,211,210, 43, 52,129,231,167,149, 46, 99, 33, 62,105, 10,246,251, 72, 34,178,198,
-159, 6, 34,161, 67, 2, 22,108, 36,158,140, 23,164,109, 73,206,174,151, 74, 79,114,241,125,228, 85, 50,111, 55, 14, 98,230, 97,
-107,217,176,149, 76,213,136,175,193,175,148,125,204,165,242,157, 20,217, 3, 57,162,145,226,208, 84, 3,213, 73,193,118,151,160,
-207,185,194, 84,114, 91,198, 71,112, 88,162, 70,171,178,140,209, 26,156,233,100, 29,213, 92,130, 77,210,198, 12, 31, 84,209, 40,
-166, 23, 43,118,152,102,113,102, 79, 22,156, 24,199, 94, 33,197,254,122, 18,143, 30,228, 75,164, 13,226,253,170, 13,141, 27, 10,
- 76, 83,203,102, 37, 65, 47,249, 9, 38,169,132,233,102,181, 75, 23, 65,137,136,226,204,203,118,169,102,133, 95, 2,151, 91, 38,
- 42,170,121,252,196,100,227,117,109,100, 61, 90, 83, 53,198,234,105,149,141, 74, 72, 21,137,123, 68,113, 15,151,142,209,116, 88,
-242, 38,100, 74, 95,243, 58,242, 33,101, 41,224,122, 4, 55,183, 92, 66, 38,137,136, 41, 80, 1,167,174,214, 87,188, 90, 16,142,
- 93, 0, 0, 32, 0, 73, 68, 65, 84,134, 86,212,227,234, 33, 47,160, 94,146, 88,170, 76, 47,209, 6,155, 43, 8, 17,105, 83,122,
-210,148, 60,251,176,132, 49, 76, 26,136,110,184,194,218,202, 42,131,238,217, 44, 60,250,106, 46,188,252,241, 92,126,249,165, 92,
-113,201,110,118,159,209,101, 27,125,186,118,128,142,143, 51, 30, 38,140,173, 35,113,144,106, 68,146,164,140,211,172, 1, 73, 36,
-176,211,166,236,236, 37, 60,241, 66, 88, 60,255,108,246, 95,182,139,123, 15, 95,206,125,247, 29, 97,241,224, 65,198,135,246, 19,
- 13, 14,210,113,171, 68,198,143, 21, 49, 30,101,241, 46,136,203,178, 96, 76, 20, 33,241, 28, 42,241,134,150,235,137,188,244,141,
- 4,237,165,238,181,207,128,242,139,186, 27,226, 13, 62, 87, 25, 27,144,245,241,216, 30, 65, 26, 41,139, 54,226,224,120,158, 47,
- 62, 0,103, 30,112,236,254,234, 81,206,222,126,144,237, 59,186,116,183, 46,176,234,230, 56,116, 60,229,174, 3, 43, 44,175, 38,
-108, 89,152,203, 56, 9,218,172,188,198, 14,246, 68, 41,103, 61,106, 27,199,185,128,149,163, 71, 24,245, 23,217,226, 18,250,157,
- 14,131, 85,135, 25, 47, 85, 82,109, 36,156, 43, 50,101,220,212,145, 74,216, 64, 0,111,243, 50, 57, 76,101, 51,145,240, 83, 47,
- 39,120,170,184,104,198, 33,165, 23,234,194, 52,167, 32, 70,160,154,117, 3,147,162, 1,140, 5,155,177,118, 45, 2,166,131, 49,
-194, 92,199, 50,114, 89,209, 23, 67,233,245, 19,116,101,115, 65, 21,242,240,186,195,222,224,166,136,179,120, 79, 94,194, 34, 54,
-148,101, 82, 3, 82, 23,234,112, 2,145, 88,140,102,139,243, 66,164, 12,173, 48,172,240, 0,108,165, 69, 97,234, 99,190, 18, 64,
- 87,234, 20,103,240,117,217,243,133,188,217,171, 8, 39,104, 93,121,171,204, 78, 61,203, 39, 98,238,181,215,105, 86,121,219,200,
-142, 41, 23,120,155,183,204,165,108,210, 85,178,143, 13, 78, 58, 56, 77,138,214,182,117, 35,195,160, 88, 19, 17,197, 66,108, 20,
- 99,226,172,174,115, 26,230, 22,104, 17,134,209,100,136,233,108, 33,234,118, 24, 14,211, 34,109,203,214,249, 96,254,255,212, 23,
-100, 49, 84,179,218, 77,144, 42, 89, 81, 44, 66, 37,230, 91,100, 80,248,166, 49, 96,139,252,194, 9, 98,107, 16,143,144, 90,193,
- 31, 19, 67,236,227, 27, 18,137,183, 67,116,194, 3,106,170, 95, 35,229,131,173,196,210,209,166,212,155,154,247,239, 28, 42, 17,
-221,249, 5, 58,157, 46,214,118, 25,173, 58,156, 29, 5,104, 70,179, 82,116, 33,139,127,162,154, 89, 13,176,172,145, 5, 99,129,
-174,129,196,101,228,200,106, 72,160, 90, 7, 93,194, 81, 83,203,225,150, 0,141,144, 32, 60, 51,121,205,147, 72,128, 76,241,100,
-167, 22,228,169,199,248, 37,171, 61, 97,251,199, 89, 90, 29,146,156,113, 17, 23,124,215,203,184,234,234,171,121,220, 37,123,184,
-232,204, 46,219,236, 18,118,237, 56, 75,199, 6, 44,142, 82, 82, 21,146, 36,201,208, 36, 49,196,221, 57, 36, 18,198,158, 32, 18,
-117, 99, 82, 7,227,241,152, 81,226,208,161, 67,199,125, 46, 36,225,252,243, 12,107,187,207,226,168,189,128,253,199,158,206,193,
-131,199, 88, 60,116,152,254,177,131, 48,238,163, 54,205, 74, 80,199, 61, 76,220, 65,122, 91,112,214,162, 75, 71,232,174,237, 39,
- 54,125, 36,238, 53, 66,210, 77, 20,170,112, 21,112,235, 49,230,153,221,241,107,146,135, 82,206,159,201,146,188,165,194,140, 84,
-136, 34,152,139,178, 53,119,201, 26,142,142,230,136, 14, 42,243, 7, 29,177,244, 25,217, 85,134,106,232,116, 98, 22,182,116, 74,
-164,109,138,164,137,112,201,142, 33,178,231, 18,238, 91, 60,147,193,226,189,136, 38,196,221,136, 21,221, 66,186,124,140, 57,187,
- 4,157,120, 50,148, 86, 60, 7, 97, 86, 9, 56,153,169,224,245,132, 20,101,253, 43,221,108,161,154, 41, 88,251, 9,144,240, 79,
-137,134,247,189, 45,157,135,227,178,201, 31,161, 65,231,178, 42,211, 85,181,244,228, 77,158,246,164,194, 24, 33,113,214, 39,111,
- 67,215, 40, 29, 95,164, 43,205, 27,137,168,155,232, 18, 22, 22,134,149,134, 65,159,195, 58,101, 92,212, 5,134, 98,153,125,110,
-138,138,109,153,193, 97,243,255, 93,214,171, 60, 47, 73,155,183,208,139,124, 5, 60,151,223,179,144, 21,216, 9,248,125,121,131,
-153,212, 79,215,162, 39,122, 45,109, 68, 53, 63,110,201, 80,174, 15,182,138, 66,151, 32, 39, 54,216,218,229,185,178,126, 33,205,
-127, 55, 94, 57, 26,106,157,235,240,105,127, 69, 8,217,215, 19, 32,194,108,217,194,188, 46, 51, 90, 75,177, 98,202,229, 38,108,
-141,233, 44, 70,163,204, 19,113,169, 39, 61, 72,197, 8, 41,156, 59,167,140,146, 17, 11,145, 43,140, 61,131,100,213, 0, 85,171,
- 60,221, 74,107,215,236,187, 84,167,133, 16,100,162, 85, 97,216,241,168,140,230, 70, 36, 10, 70, 92, 64,238,107,112, 4, 41,181,
-179,162, 89, 57, 99,239,113,137, 13, 50,163, 3,165,172,225,108,174, 43,251, 41,137,167, 77, 57,243,212,200, 93,198,136,207, 96,
- 83, 34,147,101,179,169,157, 52, 72, 42,202,186, 82, 69,179,169, 74, 93,149, 84, 86,111,119,106, 85, 25, 91, 45,198,117,213, 27,
-247,239,200, 80,233, 27, 92,241,210, 67,146, 94,232,185,107,208,100, 52, 48,166,133, 58,169, 76, 39,250, 66,212,189, 82,169,196,
-153,171, 10, 95, 68, 73,251, 75, 44, 46, 13,208,179, 47,231, 9,215, 62,151,107,174,121, 22, 87, 94,113, 17,187,220, 49, 6, 71,
- 14,176,244,192,128,253,131,132,113,154,146, 36,137,103,126, 27, 6,227, 20, 35, 48,215,237, 17, 69, 17,169,117, 5, 31,192,168,
- 5,107,179, 98, 88,198,144, 90,199,208,101, 69, 81,210,145, 37,182,125, 46, 93, 24,243,184, 11,230, 25, 94,186,155, 69,251, 24,
-150,135, 17, 73,154,113, 91,122,189, 30,157,110,135, 45,243, 29,226,110,151,197,165,101,238,222,127,144,111,124,241,107,244,247,
-126,137,238, 96, 31,166, 27,163,116,169, 55,113,158, 64,102, 43,122, 43,103,221,215,148,187,174, 31, 68,214,153, 88, 0, 51, 58,
-197, 81,182, 18,213,108,109,153,243,139,139,195, 35, 28, 26, 97, 58,176, 69,102,168,150,224,250, 82,160, 55,182, 92,252, 40,101,
-121,199, 19, 88, 61,144, 18,235, 10,189,110,140,206,199, 28, 59,182, 0,199,191, 6,210, 7, 89, 96, 54,115, 80,214, 49,142, 54,
- 92, 21,102,195,186,176,146, 77,180,238, 62, 50,133, 39,242,208,120,235,235,157, 42,182, 94, 49,228,115,206,161, 21,210,144, 78,
-228, 69,106,227,104,205,115,137, 99, 85, 36,245,141, 83,130, 99,150, 29, 44,115,195, 64,138,120,122,222,198, 82, 11,248, 56,140,
- 88, 7,159,131, 24,161,170, 22,202, 62, 76, 60, 11, 23,232,196,223,126, 66,217,216,197,134,113,254,128,217,106, 4,226, 72, 16,
- 7, 35, 87,166,166, 8,121, 88,162,218,124,165,194, 56, 46,140, 32,207,221, 87, 9, 72, 52,154, 53,122,149, 8, 52,201, 42,201,
-171, 9,204, 17,143, 87,120,162,145,107,138,127,139, 18,133,173, 71, 37, 67, 71, 92,125, 94,228, 93,229, 52,197,140,151,233, 24,
-199,216,165,164, 68,152, 40, 46, 56, 13, 18, 60, 53,151, 38, 56, 21,140,239,198, 39, 70, 43,108,254,226,189, 27,208,100, 76, 63,
- 41,112, 17,108,222,129,173, 94,251, 60, 52, 85,148,198,118,214, 90,139, 27, 86,217,167,249,251,246,136,144, 77,136,182,239,102,
-231,188,208, 63,124, 63,137,198, 19,157,195,234,101, 98, 74,194,166,146,164,169,111,197, 27,186,199,245,238, 75,130, 68,198, 39,
-129,216,134,192,153, 11,102,110, 83,108,120, 18, 58, 86,103,113,163, 62,210,237,225,146, 20,151, 38, 89,237,248, 38, 34, 88,158,
-147, 44, 77, 94,108, 3,252, 94, 99, 87,231, 10,215, 73, 94,194,182,169,177, 75, 3,212, 94, 51, 26, 52,200, 86,144,160,192,179,
- 84,106, 22, 76,166,124,133,177,249,122, 67,150,166,114,177, 21,239, 60,159,227,227, 85, 22,143, 45,225,206,188,140,167, 94,255,
-125,124,207,181,207,225,201,231,111, 99,151, 59,206,202,226, 93,236, 61,178,204, 96, 56, 36, 77, 18,156,181,140, 83,139,115, 74,
-228,199, 34, 81,135,238,252, 2,113,183,147, 21,137, 34, 66,109,130, 58,199,192, 42,206, 38,196,198,145, 56,197,250, 49,145,245,
-169, 16, 92,220,101, 41,141,232,173, 89,182,164, 3, 46,223,106,232,237,218,142,233,110,161,215, 49,116, 58, 6,151, 14,145,225,
- 17, 86,215,250, 28,238, 47,178, 35, 94, 98,231, 99,186,124,109,203,147, 57,112,215, 25,196,199,190, 76, 20,143, 80,233, 54,250,
-143, 18,172, 57,218, 20, 47, 13,149,187,232,108,167,125,234,218,223,220, 3,161,222, 41,174, 44,193,236,201,168,146, 59, 71, 89,
- 53,209,205, 52,245, 22,129,213,161,112,197,252, 18,187,159,114, 5,251, 71,143, 35, 94,185,143,168,163,108,235,244,120, 32,238,
-113,244,216,136,184,127, 32, 99, 70, 79, 28, 64,131,210,183,178, 97, 5,172,211, 85,236,108, 45,184, 94,129, 24,109, 52,211,167,
- 27, 25, 77, 86,206, 20,111,253,193, 7,238,149,216, 82,182, 63,205,199,145,211, 42, 80, 84,169, 26, 87,129,142,124, 39,180,160,
-198,122,226, 59,133,137, 10,125,173, 46, 12, 33, 16,235,188, 55, 93,118,124,210, 34, 31,189, 98,185, 87,206, 91,246,125, 15, 75,
- 75,210,108, 27, 7,222,189, 86,138,189,148, 47,195, 21, 48,163,205,202,181,101,229,113, 37, 36,240,149, 47,198, 50,217,177,184,
-152, 33,185, 82, 55, 11, 89,100,220, 38,153,135,157, 19,160,162,152,174,177,144,100,241,190,112, 81,206,123,208, 75,192,232,175,
- 68,112,157, 35, 21, 67, 44, 80,169, 22,158,183, 61,173, 25, 54, 8, 36, 73,202,113, 43, 48,183, 27,116,192, 56, 89,161, 19,144,
-226,156, 24,239,113, 59,146,164,132,240, 43, 21,202,180,218, 77, 77, 84, 42,213,201, 84,106, 32,152,212,194,128,193,135,106,141,
-247, 90,107,206, 74,220, 92, 42,241,193,172,214, 95, 68,148, 46,179,205, 9, 35, 49,140, 92,243,218, 80,152, 42,181,248,172, 83,
-124, 38, 67, 83,186,146,247,142, 77,230, 89, 75,222, 17,207,217, 26,242, 96,202, 62,245, 84,155,237, 76,133,149, 69, 72,198, 99,
-108, 50,194,185,178,103,123, 83,185,215,106, 70,130, 76,244, 45,151, 38,197, 94, 41, 5,167, 83,195, 8,161, 18, 14, 65,129, 70,
-101, 91, 47,171,170,245,228, 75,153,184,199, 10,222,161,101,141,135,137,222,238, 53, 66, 94, 94, 45, 47,210,148,149, 99, 71, 88,
-100, 7,143,127,254,143,241, 3, 47,127, 9,207,186,236, 76,122,107, 7,185,255,224, 94,238, 78, 28,163,209,152,213,213, 85, 82,
-107, 73,198, 41,206,166, 88, 15,116, 89, 49, 68,113,143,133, 45,115, 44,204,207,101,245, 0,140, 65, 28,216,212,226,220, 8,196,
-145, 90,235, 25,243, 89,115, 30,117,138, 26,131,137, 58,196,145, 16,247, 22,128, 8,179,208, 69,182,204,211,233, 26,146,100,133,
-213,227, 75,140, 71,125, 22,151,214, 88, 94, 94,101, 56, 28,179,212,183,140,199, 99,186,234,120,250,174,136, 59,183, 94,194,215,
-190, 24,193,161,207, 19,117,211, 44,157, 78,107, 97, 18,154,139,165,149, 94,180,247,160, 69,106,101,104,117,122,252,119, 67, 32,
-125, 64,156, 12,202, 38,132,129,146, 2,127,157,209, 73,175, 25,242,135,177, 10,113,191,207,115,158, 61, 79,114,241,139, 88,189,
- 59,165,103,250, 68,113,151, 56, 86, 14,165, 93, 6,135,239, 99, 75,122, 8,230,186,205,138,184,146, 58, 40, 51,245,169, 82, 39,
- 3,158,202, 38,103,210, 96,142,233,212, 45,155, 67,239,235,154, 25, 39,232,173,111,228, 72, 66,108,173, 98,237,228,224, 43, 20,
- 98, 94, 77, 43,104,137, 90,242,167,124,124,218,149,172,101,241,169, 89, 17, 90,101, 97,123, 96, 56,140,233,106,193,170,205,154,
-186, 72, 17, 83,174, 27,171, 90,243,201,169, 41,233,122,178, 72,233, 93, 24, 95, 35, 61,111, 52,131, 15, 47,132,112,177, 11,202,
-215,230,113, 95, 39,213,122,237,213,254,231, 65,126,183, 4,164, 38, 85,196, 68,152,121,101,110, 52,102, 52,206,188,128,140,169,
- 55,168, 18,156,130, 21,208,228, 68,173, 58,243, 87,203,181,213,122, 38,121, 36, 66,152,178, 50,217, 80,162,234,221,185,133,237,
- 92,112, 78,135,241, 61,139, 28, 24, 26,226,168, 84, 38, 46,128,191,157,214,201,124, 13,217,150, 65,209,134,176, 33,110, 56,120,
-164,161,204,227,228,113,170,221,229, 13, 97, 60,181,172, 19, 32,121, 19,161, 56, 38, 29, 12,248,230,154, 66, 20, 99,204,140, 14,
-204,170, 52,246, 34, 9,202,216, 22,240, 65, 3,232,164, 34,196,177, 33,181,100,196,168,112, 97, 54,101, 23, 53,157, 86, 9,173,
- 1, 74,180,174,102,237,212,141,129,134,242,182,218, 64,144, 43,123, 31,212, 67, 88,147,249,233, 18, 32, 21,141, 43, 68,205,107,
-214,105,144, 98,152,218,166, 52,231,183,135,115, 79, 74,226,231,122,189,221,141, 8,118,176,204,129,163, 43,108,127,236,115,120,
-205,171,126,140,239,127,246,227,217, 54, 60,192,253,251,191,193,202,208, 50, 26, 15,176,137, 99, 56, 78, 25,141,255,127,222,222,
-244,105,146,236, 58,239,251,157,123, 51,179,170,222,165,215,153,158,125,159, 1, 48, 24, 14, 69, 13, 23, 80,160, 22, 80,144, 32,
-138,180,228, 77, 97,147, 10,203,146, 76,209, 54,101,109,161,144, 67,161,160,101, 57, 66, 97,253, 39,254,172,144,236,160,195, 14,
- 47, 90, 24,150, 3, 48, 1,130, 34, 69, 44,131,217,122,102,186,167,183,119,173,170, 92,238,189,199, 31,110, 46, 55,179,170,222,
-238, 1, 64,206,151,137,238,126,151,170,172,204,123,206,121,206,179, 52,120,231,168, 27,223,134,232, 24,108, 49, 99,182,216, 99,
- 62, 43,176,214, 68, 87, 62, 99,176,198,162, 56,132,128,171, 43, 52, 56,234,218,113,190, 44, 9,222, 99,133,184, 31, 55, 57, 89,
-102,217,223, 91,176,119,120,136, 49, 22,173, 87,172,239,127,196,253,179, 19, 78, 78, 79, 57, 61, 95,227,170, 6,111,114,202,144,
- 17,154,138, 78,118, 91,105, 96,182,114,188, 84,220,163,249,220, 83,188,235, 43,228,232,223, 97, 10, 59, 34,243, 78,182, 84,211,
- 21,247,168,192,139, 76,172,128,228, 2,119, 61, 54, 81,181, 71,137,149, 73, 87, 51,189,212, 84, 54, 17,155, 93,121, 14,105, 67,
-120,116,226,248,211, 79,159,243,218,151,127,145,111,157, 62,203,188,250, 45, 52,207, 17, 23,168,230,129, 91,247, 13,230,206,119,
-193,214,192,108,124,143, 41, 91,248, 41, 15,199,155,127,224,148,179,173, 3,189, 14,206,157,170, 59,221,102,183,157, 59,159, 70,
- 58,167,252,224, 21,126, 39, 19, 94, 33,211,182,160,166, 77,137, 25, 69, 45, 78,246,235,201,116, 53,138,143,109, 33, 62, 67,103,
- 35,155, 88, 39,246,187, 54,237, 19,165, 18,133,109, 11, 63, 15, 15,188, 31,113,222,199,218,230,222, 38, 51, 49, 84,209,196,181,
- 75,101, 72, 11,235, 42,159, 73, 93,187, 91,216, 62,253,217, 50,105, 36,250,213,193,228, 67, 12,147,203, 42,169,116,167,131,143,
-252, 26,169, 45, 70,242,152, 83,222, 53, 3, 33,178, 67,199, 80,244, 96,244,147,122,198,143,174, 43,131, 37,172,111, 15,105, 43,
- 41,114, 32, 27,157,115,111,229, 99, 5, 61,125, 7,175, 22, 99, 14, 17,227,226, 28, 42,227,188, 60, 24,204,106, 76,119, 29, 81,
- 76, 98, 56,210,121,158,234,198, 81,197,168, 89,145,222, 89, 46,217,221,233,116, 52, 31,143,140,218,134,213,155,164, 8, 25, 25,
-115, 44,140,201,240, 70, 16, 19,153, 13,193,135, 17,169, 50, 61,106,130,234,133,157, 56, 45, 9, 50,141,170,213, 16, 80, 19,179,
-219,133,184,238, 8, 70,250,134,119, 60,171, 38,218,251,233, 36,189, 77,222, 54,145, 36,109, 43,180,146, 88,240,202,148,224, 54,
- 41,236,163,200,221, 13,114,225,132, 97, 62, 45,238, 27, 4, 57,221, 36,249, 77, 2,100,198, 45,121,218,192, 76,181,241, 41, 65,
- 78, 55,138,214,224,244, 23, 17,177,229,209, 93, 30,248, 3,190,240, 23,254, 6,127,237, 47,253, 71,252,232, 13,225,227, 15,222,
-230, 91, 71,103,168,247, 52, 77,205,122,181, 2, 49, 56,167, 84,117, 36,194, 25,155, 19, 52,144,205,102, 28, 30,236, 51, 43,178,
-214,224, 74,193, 68, 35,170,160,158,106, 93, 82, 46,207,168,170, 26, 87, 87,172,171, 10,215, 52,209,195, 33, 47, 40,138, 25,118,
- 54, 99,239,240,128,189,217, 12,209,154,213,201, 3,238,223, 63,226,222,253, 99,206,206, 86,120,231,112, 33, 32, 26, 88,228,129,
-134,134,186,172,201,172,162, 54, 71,131,114,234, 28,243, 42,240,202,225, 25,229,171,207,241,241,111, 63, 96,222,124,140,228,123,
-125,126,194,198, 17,188,227,116,151,196, 25,110,100,195, 45,219,167,103, 77,134,140,158, 95,196, 67,172,109,135,187,184, 99, 25,
- 15,175,177,189,167, 36,217,179,164, 49,185,211,196,193,123,103,129, 87,243,251,252,220,127,252, 39,249,120,255, 79,177,122,247,
-119,153,211,176,110, 44, 87,178,134,119,242,167,184,245,206, 71,204, 86,239,192,222,222,133,140,179, 93,249,233, 35, 34, 46,187,
- 37,232, 27,109,105,186, 27,122, 4,214,218, 32, 41,157, 58,104,232,214, 70, 74, 30,214, 97,236,224,252,125, 95,133,253, 81,191,
- 73, 32,203, 76, 59, 29,203,152, 43,164, 41,105,105, 98, 67,202,196,134, 51, 6,158,176,225,236,149,234,161,117,242,239, 3,188,
- 61, 20,227, 62,183,185, 37,181, 5, 25, 79,238,182,251,221,237,200, 16,116,139,164, 35,241,220,150, 13,219,216,105, 87,171, 19,
-166,249,216,191,122,219,134,103,164, 80,215,116,194,107, 95,161,201, 81, 12,165,120, 76,166,224,194, 72,255, 62,124,173,244,161,
- 32,134, 24, 75,232,208, 78, 37, 54,214,184, 79,128,160,166,127,189,102, 3,130,234, 95,111,136,254,234, 70,149, 91, 15, 60,230,
-224,128, 43, 7,107,234,165,167, 73,116,227,221,129, 97, 18, 35,149, 32, 99,251,216,192,184, 29,221,194,255, 31, 33, 4,208, 33,
- 10, 67,150, 60, 42, 41,137, 97,251, 94, 76, 82, 80, 75, 38, 80,189,144,181, 69, 55,104,204,253, 83,191,157,192, 38, 73,113,218,
- 5,156,181,104,250,232, 6, 10, 62,180, 13,132,217, 16, 81,110,115,199,191, 48,218,245,162,246,125,155,180,107,203,212,181, 57,
- 85,109,119,143,211,173,211, 63, 27,197,125, 96,191,235,184,193,217,150,206, 54, 56,226, 12,210,194, 41,156, 62,225, 19,104,210,
- 39,117,108,203,233,110, 93,196, 64,104,184,247,201, 29,242, 39, 63,199,175,254,234,223,229, 63,253, 83, 63,134,156,222,226, 91,
-223,185,195,114, 85, 82, 85, 21,174,169, 89, 87, 53,190,241, 88, 19, 3,166, 66, 0,107, 12,121, 97,201,138,125,246,247,247,163,
-194,202,251,190, 97,200, 76, 68,220,202,243,115,206,206,206, 41, 87, 37, 94, 29,231,171,146,106, 89, 98, 12, 20,179, 25,179, 34,
- 39,155, 21, 28, 94,190,196,165,131, 5,235,178,225,254,189, 99,142, 79, 78, 89,175, 74, 74, 31,121, 63, 62, 4,212, 7,188, 40,
-103,165,199,107,192,185, 64,225, 2,121,161, 52,106,104,156,195,107, 32, 95, 85,188,122,101,193,241,179,175,177,250,246, 93,230,
-254, 24,102, 7, 45,167, 38,209,241,168, 62,180, 22,244,168, 71,154, 85,159, 16, 65,199,177,196, 83, 5,209, 67, 40,219, 41,227,
- 94,132,113, 62,192, 84, 13,145,134, 53, 73, 95,220,141,192,131,165,231, 74,117,143,191,250, 87,190,128,252,232, 95,230,238,111,
-223,193,134, 99, 42, 44, 7,234, 49,215,246,249,157,239, 5,194,247,190,138, 41, 60,176,183,241,234,250, 38,230, 81,210, 77,119,
-206,203, 23, 44,251,119,164,237,237,186,238,219,225,247, 93,159,209, 35,160, 34,187,154,183, 31,104, 98,191,192, 62, 86,163,215,
- 12,157,162,113,244,198,100,112,169, 10,201,117,148, 94,230,146, 56,125,117, 19, 92,239,177, 60, 28, 0, 41, 60,189,141,249,220,
-221,222, 65, 67, 43,143, 18,108,231,208,150,208,176, 13,105,222,185,144, 17, 35, 89,157, 14,154,247,238, 13, 24,209,158, 53, 30,
- 77,101,116,212, 76,200,164,203,141,147,146,105, 51,201, 37,177,188,222,180,172, 28, 32,234,212, 64,120,208, 58, 75,203,114,206,
- 90,109,179, 11,221,190, 62,202,214,172,164, 5,107, 32,117, 9, 66,214,165,204,109,129,120,134,181,138,233,225, 57,209, 36,134,
-117, 90, 20, 36,167, 51,253,205,114,160, 57, 37, 4, 33,136,233, 39,127, 73,215, 28,162, 73,210, 92,183, 94,232, 50,235, 45, 42,
- 33,113,188, 79,118,162, 91, 31,175,212, 97, 79, 54, 34, 13, 55,240, 55, 29, 8,107,227,125,247,248,203,250,162,144,124,226,211,
- 20,176,169,212, 80,146,201,125,240,103, 81,210,176,151, 84,226, 22, 66, 24,144,155, 48,149,103,233, 70,231,157,194,254,219,136,
-108, 23,177,227,217,162, 61,151,100, 69, 48,109,172, 54,243,212, 91, 91, 80,101,187, 73,205,100,245,177,185,151,223, 94,156, 73,
- 12,102,186,176, 18, 73,140,103, 82,180, 97, 4,213, 78,108,164,117,242, 59,197, 24,124,185,228,246,189, 99, 94,249,169,175,240,
-183,255,206,223,228,167, 95,189,206, 71, 55,191,199,253,179, 53,235,178,162,170,107,214,101, 69, 93, 87,132,160, 4,239,219,204,
- 30,161, 40,114,140,205,216,219, 91, 48, 95,204,227, 57, 33, 38, 50,218, 5,130,177,120,215, 80,215,107,206,206,215,172,151, 75,
-156, 11,148,235, 53, 77,211,208, 56, 79,134,199, 7,135, 61,216,231,250, 19, 79, 96,141,165, 94,158, 80,214,129,179, 85,131,115,
- 14, 31, 2,161,169, 8,190,137,106, 23, 1,130, 71,172,193, 18,159,171,198, 53, 72,104, 57, 45, 98, 9, 42,172,188,225, 82,189,
-226,229,167, 23,252, 78,253, 19,156,125,242, 62,217,234, 14, 5, 43,108,110, 33,155,197,198,127,139, 60,113,163, 61, 78,228,196,
-155, 7,121, 23, 30, 51,245, 91,148, 71,247,148, 79,205,160,166, 13,111, 66, 74,238, 60,169, 72,166,119,177,134,251,103, 53,123,
-171, 7,252,205,191,252, 69,158,253, 83,191,202, 55,190,115,138,158,190, 31,213, 38, 33,112,237,138,229, 55,151,215,184,249,255,
-253, 63, 28,184,155,176,119,249, 2,142,128,236,104,103,183,163, 24,125,114,228,163,214,208,135,140,200, 27,211,255,200, 27,224,
- 33, 77,198, 31,144,100,253,211,116, 2,153,111, 33, 82,233, 3, 81,100,180, 19,235, 96,230, 33, 88, 68, 71, 1, 87,163,253, 79,
-123, 34, 5, 77,215,150,131, 89,133,142, 32,236, 97,159,234,101,232, 70,163,164, 98,128, 99, 67, 82,116, 66, 27,117, 58,250,251,
- 45,243, 99, 7,229,119,240,172, 85,122, 63,249, 49, 12, 98, 64, 50,144, 16,141, 58,132,177,107, 86,194,150, 87,166,238,110, 45,
-252,217, 59,209, 17,245, 74, 94,192, 24, 84, 2,248, 16, 97, 94, 41,144, 44, 39, 15,235, 94, 58,152, 54, 80,125,193, 8,155,159,
- 92,122, 63,118,114,182,172, 53,145, 8, 29,163,123, 92, 78, 81,175,232,226,144, 69, 81,226,151, 43,154, 96,192,195,169, 83,140,
- 25, 28, 2, 83,102, 65,148,234, 69,185,143,168, 35,132,110,111,111, 49,166,213,190,235, 96, 72,180, 67, 7, 17,155, 1,141,159,
-213,136,153, 45, 23,192,225,125,243,167, 19,146,152, 12,235, 7,137,172,116,215, 22,244,238,245, 61, 18, 73,104, 4, 65,235,100,
- 58,144,150, 1, 61, 60,196, 62,132,237,223, 59,202, 6,215,205,169,103,231,225,185,141,228,182, 89,136,187,102,178, 79,156, 99,
-128,228,173,200,144,137, 48,133, 24, 68,182, 63,239, 91,180, 54,187,162,104,199,175, 71, 70,159, 91,234,207,176, 13, 61,144, 9,
-122, 48,181,224, 21,137,107,147,242,244,136, 79, 78, 75,126,246, 47,252, 50,127,247, 87,255, 11, 30,207,215,124,239,189,247,169,
-154,192,122,185,100, 93,150, 17,238,246, 1, 31, 32, 52, 14,231, 61,153, 53,100,197,130, 60, 51, 44, 22, 11,102,179, 25, 94, 3,
- 33, 40,153,205, 80,245, 72,251,188,157,175,214,172,206, 79, 40, 43,199,122,121, 14, 98,168,170,134,224, 26,188,107, 56, 58,122,
-192, 19, 79,222,224,153,151, 95,101,150, 89, 78, 78,142, 56, 63, 93, 17,124, 77,227, 42,124, 93,225,155, 6,239, 66,139, 70, 6,
-196, 8,222,195, 76,104, 21, 18, 1,181, 5, 4, 79, 46,138,201,108, 60, 75,140,225,188,130,103, 22, 21, 47,124,225, 57, 62, 42,
- 63,195,205,155,119,120,240,201, 39, 44,239,221, 34, 91,221,101, 46, 75,164, 40, 16, 59,219, 46,101,219,121, 39, 39, 77,212, 72,
-115, 42, 59, 27,108,189, 16, 6,224,161, 58,172,177,192, 98, 24, 68,238,222, 63,229,138, 89,241,183,126,229,223,227,181, 47,255,
- 18,191,243,157, 59, 44, 63,254, 30,190, 89,163, 65,121,114,223,240,201,254, 83,124,245,255,126,151,217,189,175, 99,246,246, 54,
-230, 89,157, 82, 76, 46,150,167,111, 16,217,244, 33, 54, 52,187, 43, 54, 59,121, 66,187, 25, 11, 23,193, 6, 99,178,244,182, 10,
-220, 63,215,127, 16, 61,128, 64,230, 21,156, 70, 41, 67,202,160, 14,237, 65, 55,236, 23,180, 13, 37,148, 36, 89, 41,140,166,160,
-116, 11,218, 67,224,201,141,209, 69,148,118, 69,164,243, 43,238, 63, 46,163, 88, 21,188,166, 83,247, 56,174,212,247,249,194, 3,
-132, 47, 58,118, 84, 27,241, 57, 69, 7,137,212,104,242, 25, 74,130,177,194,129, 42,181, 23,234, 36, 49,110,170,153,239, 13,111,
- 70,251, 96,250, 56,203,248,186, 28,174,233,118,163,209, 84, 85,213,163,198,242,184, 21,202, 74, 57,213,214, 72,166,109,162,186,
- 68, 58,223, 65,225,157,241,205, 86,242, 84,251,218,181, 51,118,137,100,188, 78, 3, 32, 42,120,107, 17, 74,102, 56,106,137,166,
- 59, 86, 34,122, 48,124,190, 67,131,213,203,150, 91, 25,153,161,117,204, 19, 25,249,156, 27,209,173,201, 70,163, 63,107,123, 79,
-180, 46,127, 97,178,133, 18,182,192,134,210,161, 53, 19,144,187, 11,212,233,229,139, 29, 68,174, 35, 83, 43,221,178,179, 26, 61,
-127, 45, 7,195, 76,157,162, 18,166,206, 5,219,188, 17,249, 76, 85,119,154,206,108, 39,166,209, 91,119,234, 86,189,187, 36,108,
-244, 49,140, 77,226,218, 38, 64, 33,130,163,187, 22,201, 61,215,230,206, 71, 17, 65, 24, 45,241,119, 54, 21, 50, 94, 75,109, 54,
- 49, 19,159, 10,217, 30, 86, 52,142,179,221, 78,229, 49,198,112,118,116,143,179, 48,227, 63,251, 91,191,198,127,245, 75,127,142,
-112,126,143,247,110,157,144,217,130,242,252, 46,231,203, 21,193,123,188,247, 81,162, 6,212, 62,182,137, 54, 47,216, 63,220, 39,
-203, 50,242,220,182, 41,120,113, 66,206, 44, 32, 25,203,179, 99,170,178,228,236,124,201,122,185,162,172,106,234,218,145, 9,212,
-213,154,170,170, 57, 61, 62,102,113,233, 50,111,252,228, 23,185,180,191,224,238, 39,183, 88, 45,215,172, 43, 71,181, 94, 81,175,
-214,148,235, 10,239,125,159,242,102,218,251, 38,100, 25, 62, 40,193, 85,104,240,100,214,210,168, 68, 43,218, 86, 18, 42, 88, 36,
- 19, 60,134,107,171, 83,174,205,150,188,246,153, 5, 39,175,190,206, 39,231,159,229,163,123,231,220,126,239, 67,194,157,119, 89,
-148,119,201, 10, 19,247,238, 98, 18,164,228,225,146,172,169, 53,250, 56, 16, 71, 38,108,151, 45,149, 40, 73,223,123, 8, 13,110,
- 56,219,141, 80, 59,207,189,187,247,248,204, 51,215,248,107,127,249,175,112,227,115, 95,224, 55,191,241, 54, 39,119, 63,198, 53,
- 53,214,192,149,153, 69,174, 63,206,191,248,198, 61, 86,191,251,127,112,105,166, 27, 18,191,141, 76, 70, 73, 88,228, 59,194,155,
-198,239, 87, 55,220, 24,183,190,250, 71,177,154,190,160,140,127, 42,111,249, 11, 16,128,157,138,148, 31,104,183,190, 27,118,200,
-178, 20,126, 87,105,167,219,168, 93, 20,237,166,244, 24,110,162,125,145,143,161, 44,221, 65,101,218,125,151,151,177, 12, 76, 72,
- 82,162,218,239, 53,109, 5,246,163,180,179,182,247,234, 50,218,101,216,170,154, 68,131, 59, 16,161,232,243,216, 83,153,153, 38,
-146,175,142, 10, 98,218, 74, 24,146, 61,120, 72, 63, 21,117,168,131, 70, 50,212, 64, 80,135, 85,165,179, 56, 49, 73,136,204,192,
-202,214,141, 84,182, 97, 26,141, 76, 59,151, 28,216, 34,129, 80,173, 57, 22, 19, 27, 35,137, 5, 44,235,157,187,162,140,205, 3,
-134,208, 87, 91, 59,105, 8,211,143,113, 72,207,139,187,230, 66,162,138,161, 34,198,123, 26,117,172,215,130,145,140,133, 9,241,
- 58,233, 56,198, 53,103, 64, 34,186,232,198,224,253, 16,220,210,190,158, 94,115, 31,118,247,176,134,193, 13, 45,176,189,251,237,
- 56, 4, 3, 33, 43,140,110, 82, 43,131, 34, 66, 53,153,208,147,131,192,244, 65, 59,227,226,170, 23, 60,152, 35,214,184, 78,217,
-223,210, 35, 58,155,136,120, 66, 40,210, 93, 16,246,150, 34,173, 59,108,176,118, 25,217,244, 15,253, 64, 42, 29,248,133,241,190,
-117,170, 88,157,184, 48,202, 48, 65,245,168, 84, 94,224,189, 71, 59,114,134,240,208,195, 91,100,219,250, 64, 18,102,180,238,108,
-106, 71, 14,116,233,242,173, 95,155, 25,142,238,221, 38,236, 61,206,223,249,123,255, 29,255,201, 87,190,192,189, 91,239,115,188,
-242,236,239, 31,112,239,147,143, 57, 62, 57,110,249, 49, 74,240,129,166,169,241, 62, 80, 20, 25,198,102, 28, 94,190,204,124, 62,
- 71,212,247,106, 26,107,163,134,197,121, 71, 85,214,156, 47,215,148,229,154,213,106,133,115, 17,121, 83,133,163,147, 19, 80,229,
-228,228,148,197,222, 62, 95,254, 51,127,134,235,215,174,112,243,131,155,156,158, 46,113, 77, 77, 8,142,243,117, 77,185, 90,225,
- 85,240, 65,113,222,227, 67,155, 95,174,158,220, 26, 92,128, 38, 8,234, 37,198,238, 26,193, 99, 9,170, 56,175,100,248,136, 72,
-212,142, 59, 98, 97, 21,200,252, 41,135,133,240,228,225,140, 55, 62,115,137,251,159,249, 49,190,119,244, 22,223,251,238,135, 28,
-191,243, 59,236,157,190, 79, 49, 87,164,216,111,189, 44, 38,112,244, 67,152,239,253,222, 29,122,211,170,221, 5, 79,118, 35, 57,
- 23, 16,247, 64, 56, 57, 61,165, 94,175,248,249, 63,254,147,252,135,191,248, 75, 44,179,235,124,245,107,191, 67,185, 60,193, 59,
- 71, 46,158,195,220,178,127,227, 49,126,253, 59, 21,239,255,198,175,115, 37, 63, 71,243, 75, 23, 22,213,225,153,188,120,143,157,
-222, 95,143, 44,162,127, 84,125,186, 76, 81,223, 79,131,171,127,154, 52,185, 63, 0, 84, 94, 32, 83,105, 99, 32,219, 2,105,176,
- 4,217, 7, 60, 38,212, 4,175,248,214,234,219,244,197, 57, 61,242,226, 65,110,204,144,143, 46,189,197,103,215, 81, 73, 47,132,
-183,173,251,144,237,161,213,100,170,208,225,112, 50,210, 25,204,180, 14,119,109,113, 53, 9, 1,106,148, 36, 38, 3,193,109, 20,
-133, 42, 83,233,207,150, 52, 37,133,181, 24,196, 42,135, 82,160, 62,112,234, 27, 64,218,216,129,228, 5, 38,201, 44,169, 18, 99,
-216, 7,179,145,197,208,201,119, 74, 18, 87,184,142,133,223, 18,250,124,130, 3,249,238,125, 38,186,224,160, 9,243,121,100,248,
- 17,226, 4, 97, 38,221,181,137, 78,246, 26,124,123, 93,101, 99, 79,223, 53, 14,190,135,206, 59, 24,122, 8,165,145,182, 66,171,
-108,246,255, 38, 33,230, 4, 6,143,127, 43,137, 70, 57, 41,158, 83,191, 3,213,109, 98,196,177,150, 54,144,154, 11,203, 70, 20,
-175, 60,228, 49, 83, 54,134,114,198,206, 16, 58, 76,243, 27, 63, 40,241,124,111,149, 0,250, 8, 93,255,174,194,191,141, 97,190,
-139,207,188,177,151, 38, 34,106, 99, 60, 76,134,144,164,246,107, 15,114, 67, 41,202,186, 14,137,212,127,208,127,202,136,245,190,
-107,223,158, 68,166, 74,183, 87,213,205, 96,183, 17, 90, 48, 28,206,154,196,190,222,191,115, 27,115,233, 41,254,193,127,255,143,
-249,185, 47,190,193,251,239,190,205,178, 81,174, 95,187,198,131, 59,183,184,115,247,110,108,200,189, 39,104,160,118, 13, 33, 64,
- 81,204,193, 8,123,123, 51, 14,247, 23, 56,215,224,188,199,100,115, 22,123,115,130,171,169,202, 21, 85, 93,179, 60, 95,226,189,
-231,252,108,137,250, 6, 99, 50, 92,211,176, 60, 63,143,251,249,245,138, 98, 54,227,203,191,240,243, 60,113,227, 58,183,110,126,
- 64, 93,215, 52, 78,105,154,134,117, 25, 89,241, 98,132, 28, 67,240, 66,150, 89,124, 8,120,223,196, 21,154,119, 24, 43,204,102,
- 57, 85, 9, 33, 40, 18, 4,131,235, 73,192, 34,177, 33, 8,193, 49,203, 13,193,204, 57,175,224,172,105,144,115,207, 65,190,230,
-133,235, 71,188,254,220,227,220,122,225, 85,254,221,189,207,240,123,223,254,152,163,223,251, 58,251,167,111, 83,204, 3,228,251,
- 32,118,212,224, 93, 84, 74,100,219,100, 46, 92, 56,201,110, 11, 45,217,220,212,196,247,179, 94, 47, 57, 58, 58,229,249,103,158,
-228, 23,127,249, 47,241, 19, 63,251, 21,222,190,121,194,135,255,246,107, 40, 13,222,206,160,241,236, 23,134,171, 79, 63,201,255,
-245,190,231,223,253,159,255,156,203,114, 23,153, 93,109, 21, 33, 60,212, 53,110,107, 99,185,241, 44,167,218,240, 71,204, 59, 31,
-167,233, 60,164, 60, 79, 78, 22,209, 11,126,141, 78,164,164,187, 47,244, 69, 45,203, 15,107, 90, 79,127,142,253,169, 55, 95,255,
- 31, 92,221, 36,248,255, 1,228, 87,225,192,146, 29, 56, 14,172, 99, 17,192,180, 46,112,140, 46,148, 36,140, 75,105, 59,243, 13,
-161, 83, 79,122, 27,171,205, 37,209,111,109,218,142,245,158,227,116,113,167,131,227,154, 38,113,154, 42,178, 83, 79,216, 29, 44,
- 41,141, 36,237,200,198,114,181,128, 37, 48,163,128,194,112,197, 58,140, 23,214,233, 71, 40,131, 8, 47,104, 58,125,110, 47,152,
-211, 63,153,228, 79, 70,166, 81,165,202, 16,138, 22,255,228,181, 99,163, 78,182,240, 50,190,177,226, 62, 60,244,197,213,135,208,
-251,103, 55,158,222, 81,111,219,150,110,163,241,209, 68,169, 32, 3,212,183, 25, 70,147,188,151,241, 22,118, 84,116, 68,198,215,
-103,163,224, 38,121,172,227, 16,145,241,127, 67,240, 79,154, 41,254, 72,243,200,152, 25,180,229,225, 30,249,208,111,249, 65,227,
-173,241, 69,191,100, 59, 59,119,219,154, 66,164,187,159,146, 5,148,145,221, 48,253,228, 48,217,133, 80, 68, 91, 83,109, 9, 92,
-201,235, 78, 60,217,165,187,135, 38, 50,195,222, 29, 48, 53, 37,209, 97,229,182,109,208, 75,100,236,163,100, 57,107, 12,247,239,
-124,194,236,250,243,252,195,127,252, 79,248,210, 91,175,241,254,251,239,177,246, 18, 11,250,221, 91,188,255,193,205,182,128, 41,
-206,185, 22,126,119,204,231, 11,242, 89, 30,239,157, 44,199,218, 12,149,140,195, 43,215,184,113,227, 9,212,213,156, 30, 63,160,
-170, 42,214, 85, 77, 93, 85, 84,101,201,106, 85,146,231, 25,117,213,112,124,124, 66, 93,215,212,101, 77,240,129, 47,255,194,207,
-241,218,103, 95,231,253,119,223, 97,121,126, 70, 83, 55, 52, 77, 77, 85, 59,188,107,147, 29, 90, 98,158,247,158,224, 29, 33,120,
- 66, 8, 61,215,200,180,242, 88,167,218,194,133, 33, 78,243, 34,100, 89,134, 49, 89, 76,225,211, 64,102, 4, 91, 20,172, 75, 15,
-190,194,230, 6,135,225,184, 20, 78,238,159,113,101,245, 9, 63,246,132,231,179,175, 63, 79,241,226,155,220,205,158,230,244,168,
-194, 44,239, 97,117,141, 24,155,196,147,202, 14,166,246, 20,228,149,209,231,146,124,200, 59, 52, 88,178,113,159,198, 91, 38, 80,
-173, 87,220,187,247,128,124,182,199,159,253,185,159,227, 87,254,203, 95,225,181, 55,223,226,119,191,243, 62, 31,124,247,219,100,
- 77, 69,158, 65,163,202,213, 92,121,242,185,167,249,215, 31, 11,191,241,207,254, 41, 7,229, 77,178,131,203, 23, 44,196,166,251,
-232, 71, 53,208,211,239,175, 12,234,163,253,243,116,133,204, 5, 92,160,161,168,202, 35, 84,224,100, 88,249,125,254,111, 54,155,
-145,137,132,126, 18,140, 55,118, 67,224, 12,177,142,189,194,243,188, 8, 87,130,242,225, 90,249,128,168, 63, 55,140,205, 17,186,
-105,179,183, 32,108,211,206,180, 77,243,138,187,209,208, 78, 95,227,176,144, 65,223, 60,182,110, 13, 29,195,187,253, 37,190,101,
-152, 25,134, 32,151,142, 72, 20,182, 20, 13, 73,119,182,147,232,214,254,231,144, 10, 44, 20,175,194,185, 47,177, 10,179,214, 15,
-126, 76, 26,212,201, 14, 82,122, 18, 81,127,160,245, 0,169,236, 60,144,199, 69,114,216, 37,143,164,117,157, 5, 43, 50,161,193,
-140,227, 81, 59,222,128,215, 33,139, 88, 53,208, 52,161,109,104, 36,201,106,219,110, 88, 97, 70,127,167,163,105, 50, 36, 5, 49,
-104,210,140,232,120,231, 63,105,157,226,123,109, 47,178,129, 17, 17,109, 52, 29, 38, 67,163, 73,141,117, 82, 94,239, 72,195,222,
- 33, 23,186,209, 0, 76,143, 42, 29,125,110,143, 96, 63,153,230, 99, 39, 40,144, 36,174,106, 42,105,225,213, 20,170,217,217, 86,
-236,234,244, 85,199,157,188,244, 3,194,166, 28,108,152,166,217,226,235, 22,247,234,210,115, 86, 82, 34,235,112,168,167,147,248,
-136, 52,167,108, 16,233, 6, 2, 86,167,128,216, 21, 27, 42,131, 46,186, 35,245, 25,195,131,187,183,153, 93,123,154,127,244, 63,
-254, 19,190,240,185,103,121,239,253,119, 9,146,115,227,241,235,156,220,255,132, 15,110,126,140,205,114, 20,168,203, 38,194,224,
- 46, 96,242,130, 60,179, 72,150,113,120,233, 58,135,135,151, 41,138,130,162, 40, 56,152, 23, 28,221,187,205, 39,183, 62,166,106,
-162,223, 66,240,129,178,113, 44, 87, 34,121, 94,107, 0, 0, 32, 0, 73, 68, 65, 84, 37,214, 64, 85, 86,156,158,156, 83, 55, 13,
-206,121,234,186,226,167,127,230, 11,252,248, 79,188,197, 71, 31,221,225,193,189, 7,160,158,170,170,250,143, 47,183, 16, 40,168,
-214,107, 64,169, 27,199,122, 93,246, 5, 93, 18, 52,179,170, 27, 22,179,156,202,102, 17, 1, 40,242,248, 92,104, 0,137,185,237,
-153,180, 53,223, 59, 76,102,105, 26, 65,154,134, 60, 11, 56, 85,238,215,142,211, 74,185,187,190,203,211,151,142,248,217, 27, 87,
-248,236, 23,175,243,187,175,252,105,190,253,237,155,156,190,247, 29,138,211,155, 20,230, 12,201,243,232, 78,215, 67,243,122, 65,
- 27,169, 23,175,117,166,142, 55,163, 14, 59,224,235,138,213,106,197,202,103, 92,121,252, 73,190,242,165, 63,203,151,255,196, 31,
-229,115,159,121,145,187, 15, 78,248,234,215,190,193,234,228, 94,139, 66,236, 81, 87,231, 60, 54,135,171, 79,189,200,191,252,206,
-125,254,213,255,242, 79, 57,168, 63, 38, 63,188,210, 27,126,245,234,239, 73,240, 16,147, 97,115,155, 64, 75,182,160, 18,155, 18,
-102,189,176, 90,239, 22,209,178,149,184,186,161, 15,219,213, 70,108, 12, 9,219, 19,244,126,255,235,248,230, 59,204, 84, 7,232,
- 49, 4, 8,172,160,172, 8, 94, 40,115,165, 81, 56,245,194, 73,122,128,245,124,139, 54,163, 58, 64,192, 68,190, 78, 7, 55,183,
-155,121,140,137, 77, 64, 43, 11,105,249, 39, 35, 40, 69, 49,136,116,161, 44,154,248,191,167,215,108,176, 84,221, 22,196,161, 9,
- 11,120,202, 95,216,238,188,148,162,172,157, 27, 94,252, 87,239,225,110, 18, 33, 26, 18,143,108, 77,166,157, 41, 13,172,127, 95,
-146, 60,100, 67, 90,101, 63, 21,155, 9,224,163,108,103, 70, 51, 41,148, 38,125, 0, 52, 45, 14,147,155,191, 61,252,131,106,143,
- 84,200,142, 41,189, 91,171, 4,166, 46, 74, 61, 13,123, 36,229, 11,108,211,206, 71,141,190,216, 24, 12, 19, 90,246,184,145,212,
-207,126,115,113, 37,173, 62, 94,219, 2, 54, 36,147,117,236,254,225,222, 76,217,217,157, 83, 97, 15, 41,235,195,202,182,108, 89,
- 79,142,105,175, 27,235,183,196,126, 85,183,216, 70,117,211,118,211,178,240,243, 29,228, 37,213,237, 20, 92,221,210,182,135, 41,
-138,176,229, 52, 49, 59,229, 80,109,241,157,154,205, 76,224,247,173, 48,164,236, 98,241,140, 77,113, 96, 83,199, 46, 35,144, 77,
- 16, 35,156, 62,184,135,159, 95,227, 31,252,218, 63,226,103,222,120,145,239,190,243, 46,106, 11, 30,127,236, 49, 86, 39,247,249,
-224,230,135,228, 69, 78,240,158,166,172,104,234,154,198, 5,102,179,130,249,172, 64,141,225,233,167,158,225,218,245,235,228, 70,
- 34,187, 60,120,110,221,250,136, 15,110,222, 36,203, 11,102,243,121,156,238, 85, 9,206, 35,170,212,117,205,233,217, 18, 87,215,
-228,153,229,232,232,152, 87, 94,122,142, 63,242,197,159,166,174, 26, 62,254,232, 35, 92, 83,227, 3,148,181,139, 33, 47,170,248,
-160, 45,137,215, 80,175,207,104, 92,220,221,219, 44,202,207, 92,227, 80,239, 49,121,148,207,121,231, 90,107,225,168,200, 80,175,
- 56,107,200, 53,144,181, 76,248,178, 9, 88, 83, 51,203, 11,154,210,224,212,199,123,189,187,159,196,114,230,148,239, 28,121,228,
-232, 62,215,237,109,126,252,218,130,215,126,252, 6,239,188,250,199,120,251,221,219, 28,127,248, 62,254,228, 14,102,125,134,248,
- 37,198,132,214,215, 34, 68, 22,126, 86,128,201,183, 70, 59,111,171, 63,253,218, 37, 4, 84, 3,218, 84, 52, 77, 67,229, 2,141,
-153,179,119,249,113, 94,122,253, 21, 94,127,253,117,126,242,205,215,248,204, 11, 79,114,126,126,198,239,126,243,183,184,251,224,
-152,114,181,102, 63, 55,132, 34,227,228,220,241,196,254,156,203, 79, 63,201, 63,255,205,143,248,234,255,250, 79, 57,228, 1,197,
-193, 21, 34, 80, 56, 52,228,169,231, 1, 27,136,147, 92, 64, 80,125, 24, 68,125, 1,165,252, 83, 56,189,140, 28,253, 54,208, 15,
-125,200, 58,126, 50, 56,110,109,237, 31,174, 50,248, 97,238,221, 51, 35,137,171, 86,207,207,240,216, 74, 88,213,134,239, 26,101,
- 46, 49,133,173,147,148,133,214, 95, 74, 53,131,108,129,177, 21,210, 52, 52,206,224,141,144, 75,100,115, 75,155,204, 38,173,251,
- 92, 42,159,234, 46, 85, 72, 62,226,110,119,222,237, 98, 7,189,252,112, 96,244, 7,137,234,216,133,173, 23, 51,167, 12,252,225,
-195, 49, 35,120,155,129, 14, 40,169,202, 93, 91, 66,221,240, 32, 12,112,120, 59,127,107, 68, 53,212, 26, 10, 9,152, 0, 85, 18,
-203, 41, 91,128, 34, 77, 38, 47, 73,102,252, 48, 6, 17, 70,197,114,120, 95, 38,229,168, 77, 10,217, 22, 90,108,187, 27, 23, 1,
- 47, 54, 6, 93,180,186,243,192,192,182, 79,239,125,191,109,111,213, 54, 35,102,195,150,118,124,200,247,117,194, 8,179,220,226,
-235, 24,131,105,140, 14, 65, 96, 9, 23, 64,182, 52, 99,210,123,155,104,235,197,170,173, 90,162,141,166,156,172, 83, 6, 20, 99,
- 75,193,217, 2,241,143, 3, 76,116,162,143,223, 13,236,245,201,100, 91,178,190, 85, 35,153,234,250, 83,207,145,171,227,246,173,
-143,177, 89,182,245, 64, 21,177,131,247, 80,136,234, 0, 73,125,191, 39,107,136,241,129,161,219, 15,146, 78,126, 57, 9, 93,218,
-125,178,232, 64,126,155,116, 50, 50,162,151,142,204,152,147,105,126,187, 37,174, 38,207,157, 49,134,213,233, 49,167,206,242,247,
-127,237,215,248,202, 31,121,147,111,127,231,109, 76, 49,227,177,107, 87,169, 86,103,124,251,237,239,181,201,106, 66, 85, 53,248,
- 16,200,108,206,124, 22, 51,201,171,170,230,133,151, 95,230,198,141,199,168,171, 10,103, 12,133, 17,238,222,187,199, 71,183,110,
-147,181,147,124,211,196, 61,184,119, 13,120,135,119,142,117,217, 68,210,154,115, 84, 85,205, 98,150,243,135,127,226, 45, 46, 93,
-185,198,187,239,127,196,241,209, 81,219, 11,121, 16,203,170, 44,153,101, 2,121, 65,189, 94, 99,172,165, 10, 22, 85, 71, 49,155,
- 33,170, 52, 77,221,163,129, 6,197, 26,161,106, 98,209, 15, 1,154,166, 33,107,157, 14, 53, 68,114, 95, 36,211,197,230, 86,178,
-120, 93, 10,235, 49, 54, 35,120,199, 44,183,125, 62,187,201, 44, 33, 40, 31, 85, 25, 31,127,184,230,218,236, 61, 62,119,121,193,
-203,159,191,202,157, 87,254, 48,247, 79,107,142,143,207,168,170,146,117,229, 40, 87,145,201,223, 44, 79, 49,203,251,100,254, 12,
- 43, 14, 99, 77, 43,165, 29, 58,255, 16, 66,187, 74,208, 24, 46,164,224, 37,199,139, 69,138, 61,138,195, 27, 28, 94,186,194,203,
- 79,220,224,249,231,158,227,181, 23,159,230,217, 39, 31,227,138,173, 89,159,159,240, 91, 95,255,152, 7, 39, 75,202,229, 10,131,
-103,182,183,199,202,103,152,179, 21, 47,220,184,206, 74, 22,252, 79,191,254,111,248,189,175,254, 75, 46,207, 2,118,126, 53,114,
- 13, 18,130,169,208,234,252, 71, 85,115,130, 43,124,138,170, 38, 27,137, 28, 15, 69,189, 47,116, 98,215,148, 46, 53,106, 18, 30,
-238,254,247,136,158, 57,191, 63,236,185, 11, 76,109,178,142,225,237,146,152,207,142, 16, 38,196,130, 85,107,204,105,238, 64, 98,
-219,217,154,106,141,247, 6,151, 89,230,251,158,107, 21,156,213,194,121,235, 88, 96,213,247,123,239, 65,154, 51,248,176,167, 26,
-100,219, 79,204, 25,166,213,141,251,132, 1, 63,216, 33,134,126,186, 75,139, 93,106,218,209,215,183,196, 57,205,140, 74,150, 65,
- 77,100,159,103, 68,180,161,238, 88,241, 9,217, 79,250, 2, 25,175, 71,199,104, 23, 34, 25,102, 4, 39, 36,175,163,103,242, 74,
-106, 51, 51,252, 91, 72, 12,121, 82,104,223, 51,202,207,232, 65,252, 60,217, 43,143,166, 86, 6, 93,189,182, 48,168,237,155, 16,
-195, 60,207,217,199,113, 90, 57,154,100,127, 59,242,239, 15,155,152, 70,186, 31,239,224,199,148,157,167,201,245,137, 15,109,220,
-236,187,170, 34,196, 78,113, 12, 94,245,121,182,105, 38,183, 14,126,251,161,101, 6, 36, 18,174,254,147,237,246,231,163,162, 39,
-109, 70,252,197, 19,250,118,201,221, 38,151,246,162,103, 78, 9, 35,196, 34, 69, 67, 2,130,212,103, 81, 13, 33,102,251, 44,161,
-209, 27, 32,157,114, 69,117,115,138,106,255,126,163,241,145, 36, 91,125, 43,251,121, 59,159, 74,118,186,218, 73,130, 50,234, 6,
-178,208,215,232, 30,141,211,209,223,111,146,235, 32,179,177,101,174,215,231,220, 61, 93,243,203,127,251,239,243,231,255,228, 79,
-241,189,247,222, 99,239,240, 10, 7, 7,123, 4, 87,243,254,251, 31,176, 46, 43,138, 60,167,172,106,140, 64,158,101,184,186,134,
-224,168,189,242,248,147, 79,241,212,147, 79, 68,211,153,118,117, 83,213, 53, 71,231, 37, 54,159,145, 25,101,181, 90, 71,134,188,
-115,156,157,156,178, 60, 95,209,184,134,249,188,160,174, 43,154,198,113,190, 92,241,214, 91, 63,194, 43,175,190,202,114, 85,114,
-239,222, 61,172,137, 22,212,161,105,176,162, 24,147,245, 60, 32,107, 45,123,243, 2,127,120,128, 43, 13,136, 97, 85,174,105,130,
- 98,212,147,229, 5, 62, 4,172, 53,237, 58,221, 33,214,182, 10, 14,105,173,105, 99, 72,148,141,179, 52, 46, 4, 22, 2, 38, 47,
- 80,215, 68,139,218, 16,250,243, 45,203, 50, 66,112, 4,175, 20,214, 32,197,140, 83, 12,103, 39,158,253,179,187, 60,177,200,121,
-238,218, 30,250,196, 1,166,120,140, 96,231, 4, 59,163,212,156, 59,167, 53,183,238,156,114,239,246,109,206,143,239, 81,175,206,
- 8,117, 73, 8,117,223, 72,231,179, 57,139,253, 67,242,189, 61,178,217, 30,139, 34,227, 96,127,143,131,131, 67,174, 29, 46,184,
-124,121,159,235,123, 51,174, 29, 20,204,196,211, 44, 79,184,253,246, 39,188, 91, 54,168, 8,101, 19, 40,203,154, 76,148,253,189,
- 25,106, 50, 14,247,246, 56,184,244, 12,111,191,247, 1,255,219,191,248,159,121,240,222,183,185,122,105, 31,201,103, 61, 41,110,
- 28, 70, 51, 12, 43,169,230,157,157, 51,250, 69,163,183,124,186, 90,248,168,145,171,137,255,132,108,250, 51,114, 81,220,218,197,
- 82,216, 71,127, 41, 63, 76,121, 91,166,166,213,135,135, 22, 74,148,161, 59,183,164, 26,200, 48,216,136, 38,132, 2, 19, 74,220,
-202,176,204, 12,214,194,194, 42,117, 96,148,191, 28,225,216, 65, 34,214,111,111,181,155,248, 59,226, 92, 11,197, 26,131, 85,162,
-132, 37, 36, 20,178, 32, 40, 54,166,104, 37,250, 42, 25,117, 91,137,229,109, 15,229,210, 59,198, 17,162,229,163, 65, 40, 36,186,
-224,209, 22,206,166, 85, 0,244,251, 78,105,243,201, 19,200, 91,197, 96, 12,228,170,125,218, 90,199, 32,151,169,126,136,193,174,
-118,176, 73, 29,235,127,117,210,245,141, 38,252,118, 34,175,211,130,144,116,191,178, 99, 74,237,175,123, 83,181,202,133,116, 45,
-161,125,104,132, 18, 3,104, 58,125,115, 55,141,133,233,206, 55,217,249,107,146,251,173, 73,243,161, 12,251,220, 20, 9,192,208,
- 91,223,218,132, 76,213, 77,224,182,125,181, 94,135,223, 43, 83, 79,230,174, 81,235,188, 9, 90,253,176,110,177,129,157, 22,249,
-113,194, 92,210,184, 24,233, 39,221, 48,145,198,117,247,174, 36,193, 58,219, 30,186, 89,110,185,119,239, 8, 69,200,243,108,235,
- 14,220,136, 33,132,128, 49,157, 68, 44,108,188,200, 41, 27, 94,183, 64,131,227,112,151,177,102, 64,119, 76,245, 50,213,229, 95,
- 16, 9,185, 89,244,219,198, 62, 65, 2,182,133,196, 24,105,141,113,188,227,214,189, 35,254,252, 95,252, 21,126,249,151,254,125,
-238,222,253,132,131, 75,215,152,229,150,204,192, 39,199,199, 28,157,156, 98,197,224, 92, 19, 39, 89,160,105,106,234,186,198, 24,
-225,177, 39,158,228,197, 23,159,235, 63,131, 34,143,100,185,170,110,184,116,120, 0, 26, 56, 57,186, 79,211, 56,154, 38,178,221,
-151,203, 85,207,181,112,117,217, 78,233, 13, 79,220,184,198, 27, 63,250, 35,204,231,123,220, 63, 89,178, 90, 45, 49, 2,141,239,
- 85,254,204,139,136,172, 84,141,139, 70, 50, 86,176,214, 82,121,135, 21,161,200, 51,154,198,226, 67,155, 70, 97,179, 72,130,179,
- 2, 89,129, 42,184,110,125,213, 73, 93,181,109,155,133, 24,101, 76, 96,111, 94,176, 90, 54,184,186, 34,179, 66,163,113,215, 89,
-134, 6,107, 12, 98,163, 22,104, 38, 74,144,200, 71,170,109,206,113, 99, 8, 71,107,112,103, 44, 12,236,207, 50,246, 22, 57, 7,
-153,229,233,249,156, 55, 94,217, 99,249,242, 75,156, 54,175,113,182, 44,169,203, 18,213, 64,158,229,236, 45,102, 28,238, 45, 88,
- 44,102, 44,114,137,132, 67, 13, 44,108,136,218,122, 87,177, 58, 63,167,190,119,155,219,119, 2,235, 32,168, 87, 68, 76,204,155,
- 87, 33, 4,101, 49,207,153,101, 57,179,189, 3,174, 94, 58,228,188, 90,243,191,255,171,127,205,111,254,191,191,129,169,151, 92,
-187,118, 37, 14, 73, 91,131,131,146,161, 32,189,183,100, 96,232,238,182,218, 26, 47,248,100,226, 76,169, 15,171,136,159, 66, 19,
-158,198, 29,235, 86,150,206,142,159,241,208,103,137, 13, 11,242,223,159,255,198, 63, 55,139,133,208, 32, 18,200,128, 38,116,178,
-178,214, 31,187, 29,231,135,206,127,216,173, 70,200,217,144,137,226,125,224,204, 71, 83,149,188,253, 20,125,203,120, 15, 34, 45,
-209, 70,113,196,253, 85, 52,146,145,126,223,234, 90,118,189, 73, 25,180,237,117,243,189, 36,203,162,166,136, 22,235,226, 16, 95,
-227,131, 73,246,215, 58, 76, 66,146,198,243, 69, 79,118,107, 5,227,171, 40,159, 9, 81, 90,151,181, 9,101,189,172, 75,198,145,
- 37, 83,127,121, 85,197,160, 17,226,144,238, 90,104,178, 39,151, 13,118,120, 74,162, 50, 50,176,246, 59, 83, 18,218,105, 48, 30,
- 14, 41,233,110,124, 51, 73,235,188,166,152,126, 34,111, 38, 5, 61, 36,173, 66, 21, 96, 29,164, 69, 89,232,161,249, 32, 67,156,
-168,177, 22,107,162,231,188,119, 30,175,108,225,228,111, 66, 94, 58, 70,210, 70,175,215,119,141,128,104,239,160,215, 57,239,245,
- 43,144,100, 63,158, 25, 8,126,240,158,191,232,214,237, 56, 8,141,142,131,118, 12,187,125, 32, 36, 9,165, 17, 25,101, 79, 38,
-242,201, 14,185,104, 5,133,125,135,168, 35,211,168,225,193,143,110,129, 54,203, 55, 10, 93, 87,163,173, 64, 97,132,149,235, 16,
-145, 33,230,120,115, 45,184,105,243,186, 49, 24,244,182,183, 19,178,219,206, 83,107,128,220,199, 1, 46,194, 68, 32,180,125, 87,
- 9, 91,172, 72, 55,127,153, 11,202,199,183,111,243,214, 31,251, 10,127,239,111,252, 53,234,245,146,249,222, 1,133, 21,156,194,
-249,249, 41,119,239,124,130,180,207, 75, 89, 53, 52, 85, 69,145,103, 20,179, 25,152, 12,147, 25,158,125,246, 25,242, 44,167,110,
- 92, 91, 60,149,224, 64,189, 35,183, 66, 81, 20, 4, 21,154,186, 98,181,138,154,244,166,174, 35,210,232, 3,229,186,106, 77,155,
- 2,175,124,230, 21,158,121,246, 57, 20,195,241,253,251,248,186,166,170, 26,234,186, 6,148,204, 90, 76, 86, 16, 92,131,177,194,
-106, 29,200, 12,216,214, 67, 66, 67,124, 22,212, 55,228, 89,214, 54,135, 74,221, 4, 12,158,124, 54,139,105,111,121,214, 74,223,
- 90,135, 15,175,189,106,196,136,160, 45, 59,222,187, 38,122,116, 96, 8,222, 71, 3,157,204,180,207, 78,212,185,123, 87, 97, 77,
-124,159,130,224,188,163,118, 30,163,224,212,114,182,244,228,149, 50,155, 21,228,101,141, 80, 51, 23,207, 37, 49,236,133,128,201,
- 33, 55,150,121, 81, 97,243, 10,211,156,177, 94, 7,170,186, 1,107,112,154,241, 0, 33,104, 0, 99, 88, 59, 33,212, 53,214, 4,
-140,205,200,173,197, 22, 57,130,193, 40, 88, 59,227,224,224, 18,135,151, 14, 88,158,159,241,181,223,254, 38,255,230,171, 95,227,
-206, 71, 31,112,233, 96,159,252,242,213,193,165,113,215, 68, 58,229,128,116, 68,208,238,252, 12,190,229, 90,121, 52,180,202, 13,
- 31,215,182,113,229,106,192, 88, 12,130, 49, 1,205, 12,108,152,217,240, 72,154,244,109, 27,114,101, 98,169,172,159, 98, 74,222,
-137,247,237,250,150,139, 11,251,247,191, 91,159, 76,234,195,244, 45, 4, 3, 38,116, 7,115,155, 55,174,130, 23,197,142,228,108,
- 3,199, 89, 90,114, 88, 38,241,123, 58, 8,185,219, 4,183,118, 43,189,230, 47,116,174, 71,125,128,139,105, 89,208,130, 53,237,
-238,187, 69, 5,180,221,175,118,185,233, 42, 6, 49,138,177,134,220, 88,140, 24,124, 3,181, 90,212, 10,214, 68, 84, 32,104,194,
- 49, 87, 65, 37,195,139,141,158,236, 89,142,173,149,202,197,194,208, 62,131,253,235, 78, 97,205,206, 40,102, 92,232,226,207,111,
- 72, 80,129,142, 25,204,196,168, 99,114,115, 11, 67,145, 67, 58, 35,158,208,199,191,218,150,101,235,118,221,136, 9,225,197, 90,
- 75,166, 53,206, 79,216,254, 19, 86,186,221, 8,213,161,103,178,247,113,139,186, 75, 60, 34, 35, 89, 55, 59, 28,209,198,203,165,
- 65,114, 21,116,124, 27,143,247,240,161,127, 29,141,242,240,150,183, 91,125,168,246, 70, 66, 29, 2,209, 53, 67,176, 91,183,222,
- 57,193,137,145,126,229,160, 27,121, 15,130, 41, 22,168,107,250,137, 90,147,198, 96,240, 48,183, 52,117,195,186,246,236, 47,230,
- 49,242, 83, 39,168,130, 68, 87,190,210,251, 17, 81, 41, 93,101,104,194,215,155,186,210, 77,245,175, 50, 37, 62,169,108, 80,143,
-140, 76, 51,204,119, 89, 88,110, 18, 2, 85,199,145,198,253, 94,221,232, 70, 66,200,136, 4, 40,112,126,114,204,229, 27,207,241,
-119,255,214, 95,103, 97, 3, 39,237,189,188, 46, 43,172,129, 91,183,110,115,126,190, 36, 51,150,178,105,226,250, 46,203,169,171,
-146, 34,139, 94,238,215,174, 95,227,224, 96,159,186,174,219,172,115,168, 67,192, 59, 79,227,227,164, 60,203, 51,130, 6,150,171,
-146,245,114, 69, 93, 53,172,203,154,204, 26,130, 42, 69,158,225,156,231,201, 39, 30,231,181,215, 94, 99,111,239,144,117,229, 56,
- 62, 57,198,185, 10,239, 67, 68, 77,108,107,188, 17,124,228,111, 4,197,182, 83,250,250,116, 73,240, 13, 34,134,198, 53,113,168,
-177,113,114, 85,239,201,114,139,170, 37,248,208,255,188, 94, 33,161,145,192,105,140, 68,116, 50, 4,106,209,104, 80, 19, 2,185,
-129,170,246,136,122,138, 89,156,244,235,170, 33,179, 6,155,231, 49, 27,194,100,113, 87,239,154,158,115, 17, 21, 5,113, 55,159,
-231, 22, 49, 18, 67,100,130,114,230,162,206, 40,207,115,130,201, 40,203,138, 60, 52,204, 23,115,156,100, 84,101,197, 60, 23,230,
-179, 25,198,120, 84, 76,124,244, 92, 19,135, 43,107,176, 98, 41,242,172, 85, 35, 68, 51,171,199,174, 95,227,224,242, 53,142,143,
-143,249,173,111,124,141,223,252,230, 55,121,247,221,247, 40,172,229,250,181,235,109, 19, 26, 30,125,133,220,221, 51, 33, 16, 92,
- 77, 83,173,105, 26,143, 55, 51,180, 56,196,228,123,200,108,129,181,150,124, 62, 39,159, 31,144,229,145,103,225,234,146,186,169,
-209,117,160, 88,221, 1,238,130,157, 49,177,231,122,116,179,153, 11, 75,227,167, 48,157, 81,249, 84, 51,184,254,112, 42,248, 67,
- 33,248, 44,116,124,245,196,236,195, 74, 34, 83,105, 9, 93,190,135, 13,165,101, 45, 15,112,233,128,180,134,214,237,107,160,131,
-153, 54,164, 4,137,144,169, 85,193, 17,218,233, 54,209,209,154,110,242, 15,209,187, 61,196,157,122,208,193,217, 76,213,131, 70,
-233,142,104,100,188,246, 33,173, 98, 16,107, 34, 11,185,245,133, 22, 26,188, 83,130,122,140,216,118,106, 9,157,216,174,133,241,
-199, 83,117,191,151,215, 56,209,118,218,212,160, 99,182, 99, 24,121, 17,110,234,134, 55,254,182,183, 53,111, 73, 96, 65, 7, 57,
- 87,123,216, 7, 29,103, 85,202,196,206, 84,219, 73, 83, 91,122, 91,150,222, 91, 27,249,102, 58,178,140,220,246,248, 5, 20,188,
-111, 81,152, 16,247,253, 45,175,194,118, 78,122,221,239,109,223, 89,144, 52, 33, 74,182, 99, 89,194, 6,211, 93,183, 17, 86, 90,
-228,161,111,244,244, 97, 70, 13, 41, 97,111,152,244, 83, 2, 93, 58,181,203,232,186, 38,197,107,130,238,105,219,192, 98,114,174,
- 95, 62,100,121,118,194,114,237, 49,182,117,201, 15,237,221,106,109, 44, 54,229, 25, 87,159,127,157,183, 94,121,133,183,191,254,
- 27,156,158,157,147,229,249,246, 34,185, 5, 88, 76,167,130,105,144,132, 36, 44, 77,157,132,253, 78, 40,186, 27,135,137,142, 96,
-247,244,235, 7,158,204, 46, 67,147,222,253,176,191,161,116,216,189,203,174,157,122,252,243,189,147,115,254,250, 95,253,175,249,
-209,207,190,196,157,123, 15,152, 23, 51,206,206,207, 64, 3,119,239, 31,115,255,193, 81,116,185, 11, 74, 85, 53,168,171,177,153,
-229,188,241,216,178,226,218,193, 33,215, 31,187,214, 70,156, 18,253,222, 77,235,212, 22, 92, 79,226, 61, 61, 59,229,252, 52,234,
-207, 93, 93,183,156, 88, 33,203, 12,222,107, 68,154,188,227,179,159,123,131,199, 31,127, 28, 43,202,233,217,121,156,206,197,162,
-212, 96,162,134, 94, 85,113, 77, 52,180, 9,206,147,217,172,117,226,131,232, 68, 28,167,198, 44,203,250, 33, 37, 24,211, 23,248,
-224, 92, 44,144,189,147, 95, 22,137,188,170,184,198,227, 92, 13, 26,104, 26, 33,179, 57,179, 89,198, 98,239, 18,179,144,145, 27,
- 37,207, 51,170, 96,168,234, 26, 9, 33,174, 2, 9,132,224, 41,171, 10,155,197,189,126,252, 95, 92,249,101, 70, 98,184,141,122,
-212,100,125,200, 79,214, 50,226,213,149,228, 6,138, 98, 6,198,224,154,134, 34, 19,164, 69, 63,138,220,160, 82, 16,130,143, 17,
-206,198, 80, 24, 75, 38,150,249, 98,143, 98,255, 42, 7,139, 25,185, 81, 78, 31,220,230, 27,191,253, 53,190,241,205,111,241,225,
-199, 31, 98,196,114,229,242, 37,140,152, 33,142,121, 51,187,116, 59, 18, 30, 60, 77,185,166,172, 74,106,205, 40,246, 47,113,237,
-249,151,185,254,228,179, 60,118,227, 9, 14,175, 93,199,204, 15,176, 10,135,133, 50,219, 47,104,130,229,236,116,201,201,189,123,
-216,213, 93,202, 44,240,221,245, 30, 71,239,189, 66,241,209, 55,193,127, 0,182, 32,213, 18,125,122, 1,152,142,164,251,250, 40,
- 44,180, 93, 22,159, 63,248,122,255,135,129,188,199,162,222, 33,145, 62,153,179,188,146,216, 63,198, 41, 61, 36,147,166,151,214,
- 97,139, 97, 34, 15,100, 49,184,196,212, 45,116, 37,109, 3,208, 74,197, 52,217,239,137,237, 23,173,161,157,204,209, 78,178,165,
-189, 51,221, 56, 71,162, 45, 77,190,198,119, 62,228, 26, 83,218,252, 56,216, 26,107,226,142,220, 5,131, 26,143,250,134,208, 4,
- 42, 21, 10, 90, 9,138, 74,207,104, 77,112,218, 13, 44,185,115, 98, 19,209, 17, 97,122, 26,228,163, 23, 94,247,137,155,154, 78,
-221, 25,117,108,203,156,188,158,148,102,215,161, 36, 22,165,110, 60,101,167,241,223,194,249,214,164,172,143,118,203,211,175,244,
- 1,199, 40,100, 19,139,146, 75,156,160,125,250,243, 68,152, 89,139,120, 79,169,210,235,208,183,199, 34,245,155,253,222, 44, 70,
-183,213,255,212, 13,115, 2,139, 77,255,243,202, 70, 28,107,154,192,199, 68,218,211,121, 8, 76, 19, 5,101, 66,176, 27,252,211,
- 61,103,199, 15,112, 33,250,149,167,230, 62,217,108, 78,177,216, 39,120,101,185, 46,121,242,218, 1, 63,249,226, 33, 31,252, 54,
- 52,161, 93,199, 76, 96,239, 14, 66,156, 18,231,166, 77,160,176, 73,200,239,210, 22,162, 55,192,196,204,166, 15,148,145,157,232,
-137,181, 57,206, 59,122,188, 95,211,108,251,221,233,113, 29,130, 54,142,223, 76, 67,142,210, 12,117,225,248,193, 3, 62,243,249,
- 31,229,231,255,236, 87, 56, 61, 61,101,111,111, 63,218,180,134,128,115, 77,180, 67,158, 45,104,154,154,166,137,133,184, 81, 8,
-206,115,245,210, 37,156,247,236, 31, 30,176,152,207,105,124,228,117, 88, 49,120,239, 41,203, 53,198,198,232,195,198, 57, 86,171,
- 53,229,178,164,108, 97,119, 16,140,137, 77,168, 23,165,118,129,107,143, 93,227,217,231,159,139, 54,175, 26, 56, 57, 61,163, 90,
-175, 98, 60,107, 80, 44, 6,239, 34, 75, 94, 67,188,167, 84, 32, 51,145,251,144,217, 56, 9,135,208, 42, 63,196, 82, 87,117, 68,
-209,242, 44, 94,151,224, 49, 18,195,100,156, 49,152,214,223, 62,104,100,214,184, 0, 85, 21,139,122, 45,112,184,111,184, 60,159,
- 35,254,140, 80,150, 52,222,145, 23,150, 75,243, 5,249,222, 12, 53, 5, 70, 44,222,236,177,170, 3,133, 94,138,242,226,224, 49,
-198, 80, 87, 21,198, 55,241, 89, 20,143, 53, 54,162, 29, 70,144, 32, 52, 62,176, 44, 27, 68, 27, 14, 22, 5,146,205,169,170,232,
-123,159,229, 5, 78, 5, 27, 2, 34, 25, 14,139,136,141,242,193,189, 61, 14,246, 23, 28, 44,102,136,175, 89,158,221,225,230,135,
-119,248,214,247,222,231,247,190,251, 14, 15,142, 30, 80, 20,115, 46, 31, 28, 34,198,244,124,150,139,138,139, 38,133,188, 90,175,
- 89,175,215, 48, 91,112,248,216,179,188,242,204,179,188,248,210, 75,188,244,242,139, 92,125,252, 9,174, 46, 44,121, 38,132,106,
- 77, 83,158,182, 54,192, 57,235,170,230,238,201,138,211,251,199, 20, 71,159,176,176,107, 30,147,156, 43, 7,107,190,254,234, 37,
-238,202,143, 51,187,233,192,127, 4,118,206,167, 85,131,111, 21,170,109,113,217,219,141, 60,104, 2, 92,238,158,214,183,171,114,
- 46, 78,174,249,212, 3,252,150,111,200, 66, 43, 59, 11,218, 5,160, 76,205, 97, 90,194,148, 57, 64,115,135,145,146,204, 71, 77,
-123,119,116,135,214, 19, 93,197, 64,102,200,197, 97,107,168,195, 64,170,139,238,112, 97,184, 16, 22, 22,173,103,124,169, 17, 2,
-107, 68,251, 34, 27, 84,122,139,204,161,147,106,229, 18, 62,180,228,177,206,183,219,131,215,126,138,244, 93, 48,141,134,232,132,
- 39, 16,212,227,107,165, 20,122,207,249,244,106,132,177, 3, 71,108, 86, 54,188,236,181, 47,242,125, 67, 51,201,144,223, 36,173,
-141,157, 73, 59, 5,192,176,231,220,126,219,140,155, 6,221,172,204,164,201, 97, 50,176,151,167, 8,130,140, 39,194,109,208,216,
-116, 30,244,157, 2, 32,229, 40,116, 61, 79, 8,147, 97, 92, 55, 45, 23, 82, 15,115,211, 46,110,194,244,138, 15, 57,221,221,154,
-199, 76,178,225,119, 89, 42,142, 61,240, 31,198,147, 73, 24,253, 50, 64,102,108, 41,236, 10,172, 91,211,158, 97,171, 16, 83,186,
-242, 89, 17, 39,119, 3,151,175, 94,225,221,223,251,109, 62,248,214,111, 81,171,101, 62, 43, 54,246,233,177,176,155,173,140,241,
-116, 85,160, 91,217,180,209, 21,112,190, 88,144,101, 25,231,167,167,113,183, 56, 98, 55, 36,178, 54,116, 19, 62, 31,101,211,111,
-102, 74,199,134,108,178, 71,212,113,212,206,182, 77,233, 72,210,174,202,201,178,228,175,254,194,207,243,194, 51, 79,114,247,222,
- 3, 14,103, 57,101,121,138,115, 13, 77,221, 80,100,134,107, 87, 46,243,225,249,105, 79,112,180, 18,225,105, 13,158,131,195,125,
-110, 60,254,120,239,216, 22, 66,140, 97,174,234, 42,102,153,183, 22,212, 85, 89, 83,183, 69, 98,189, 42,241,193, 71,206, 66,158,
-199,189, 51, 74,158, 89, 94,126,233, 5,102,139,253,200,168,199,178, 92,173, 41, 87,171,129,108,216, 66,224, 70, 35,178,147, 27,
-193,139,197,181,123,124,155, 89,196, 24,196,187, 86,162, 24, 3,146, 98, 48, 77,231,243, 30,226,138, 80, 60,153, 49, 52, 46, 80,
-215, 37, 89,214, 10,121,125,141,180,142,144,185, 17,230,179, 5,223,125,239, 54, 31,127,240,118,223, 80, 89,129,153,133,249, 44,
-134,212,236, 45,102,204, 23, 11,246,247, 22,236, 29, 92,166,200, 11, 46, 31,238,147,237, 93,166,242,151,112, 33, 54, 55, 54,203,
- 17,147, 83, 86, 30, 87,174,208, 60,128, 13, 88,227,201, 13,204,246,230,120,201,217, 47, 98, 65,207, 50, 75, 16,195,204,192, 98,
-145, 99, 16, 50,234,168,248, 89,159,112,118,251, 3,222,185,247,128,119, 63,248,136, 79, 62,185,197,157,227, 37,181, 83,246,246,
-246,184,118,245,250,232,129,234,248, 70,186, 67,246,165, 40,213,106,205,114,181,130,172,224,218,141,167,121,243,179,159,227,245,
- 55,222,224,249, 87, 94,227,137,199,174,177,151, 11,174, 60,163, 92, 45,105, 92,197,209, 89,195,250,244,156,133,105, 96, 49, 99,
- 93, 5, 86,165,227,238,185,231,108, 85, 98,197,115,166, 57,231,107,207, 85,167,188, 57, 59,231,235, 47,236,113, 82,255, 33,102,
-183, 75, 52,220, 7,179,248, 84, 18,178,157,178,118,121,132,240,151, 13, 63,221,135,107,236, 63,237,164,254,131, 34,243, 89, 23,
-192, 97, 80, 52, 8,190, 11,115,233, 37, 99, 45, 17, 77,215,104, 16,200,149,125, 64,131,176,212, 1,120, 23,241,152,112, 78,168,
-132,208,178,215, 99, 80, 73,151, 33,158, 18,197, 2,248,118,119,156, 18,165,181, 11, 94,145, 81, 44,232,244, 18, 70, 45,102,146,
- 4, 31, 74,112, 25, 77,200, 80, 27,139, 77,199, 74, 77, 29,184, 12,131, 41, 75,104, 15, 23,153, 92,201,148, 70,164,137, 20,206,
- 43, 19,159, 56,134, 8,210,113, 44,208, 22, 46,182, 14, 9, 74,105,196,232,228,119, 14,250,138,221,157,103, 80, 29, 77,154,154,
-100,215,135, 72,146,192, 2, 78, 58, 47,127,153,184,221,177, 49,209,143,236,105,146,100,180,212, 47,190,155,226,235,160, 99,228,
- 73, 39, 52,144,100, 99, 16,167, 76, 67,110,133,166,246, 3,234, 1,209, 35,155,120,184, 77,247,190,250,136, 15,137,108,115, 86,
-219, 81,220,135, 75, 62,176, 5,182, 41,188,173,145, 13, 10, 13,170,248,166,194,216, 28, 66, 64,124, 77,233, 2, 94,161,200,164,
-119,217, 75,245,243, 98, 76,132,144,219,144, 28,157,202,216,116, 92, 36, 69, 54,229, 53,190,105, 32,184,113,234,218,168,229,102,
-195, 20,166, 83,149, 52,141,139,239,210,200,102,115, 56,106, 34,100,172, 91, 31, 49,141, 55,228,252, 9, 63, 4,206,207,207,120,
-229,213,215,248,210,159,248,163,156,156,156, 48,159, 47,168,170, 53,103, 39, 71,212, 85,141, 15,190, 39,140,121, 23,147,207, 92,
- 19,181,211,222,123, 68, 12, 79, 93,190,194,108, 62,143, 19,115,171, 14,240,237,245,234,204, 95, 66, 8,172, 86, 75, 30,220,127,
-192,249,114,217,194,199,113, 37, 40, 45,100, 94, 57,207,245,235,151,121,238,133,231,104,156,167, 40, 44, 34,102,104, 14,162, 73,
- 64,228,227,216,156, 16, 60,117,237,105, 26,135,201, 50, 92, 75,118,179,109,179, 19,130,146,183, 92, 31,147, 66,246,206,161, 33,
-144,231, 89, 12, 97,106, 26, 26, 31, 77, 97,172,181, 44,215, 53,101, 89,246,172,239,195,189, 61,206,150, 37,239,126,116, 11,209,
-130,172, 13,162,241, 8,101, 80, 30, 44,227, 64,163, 97,137,232, 25,133, 40,121, 22, 88, 20,150,195, 69,198,222,222,140,189,197,
- 30,123,123, 11,246, 15, 14,216, 95,236,177,119,176,135,145, 57,115, 19, 88,236,205, 80,201, 16,242, 72,176, 19, 67,112, 13,185,
- 85, 2,209, 10,183,169, 42,202,186,228,164, 92,115,118,186,228,236,236,132,147,243,115,238, 63, 56,229,193,233,146,243,181, 67,
-109, 70, 81,204, 89,236, 93, 98,223,200,142,173,154,140, 72,158,170,134, 16, 28,174, 90,178, 94,151,148,206,240,248,141,199,120,
-253,167,190,200, 27,159,127,147,215, 95,255, 12, 79, 62,241, 36,115, 19,104,214,167,156,173,239,113,255, 56,174, 77,131, 88, 86,
-101,141,171, 75,138,194, 98,108,116,227, 51, 56,234,160,145,107,128, 39, 24, 75,104, 42,172, 56,206, 52,227,178,135,207,239,215,
-124,227,133, 57, 85,245, 38,249,253,175, 66, 94,130,204, 47,192,255, 31,161,104,126,106, 24, 93,182,224,177,187,135,187, 31,110,
-217,190,248,116,204,250,201,120,216,246, 14, 6, 48, 93,233, 52, 32, 52, 88, 7,234,133,117, 66,174,235,253,222, 19,169, 91,240,
-176,110,101,100, 38,201, 99,238,140, 91,124,123,144, 52,218, 73,211,218, 66,158,132, 78,140,125,120,135,163, 43,116,250,113,105,
- 73,116, 90,192,254, 83,216,236,152,234,252,156,198, 91,114, 51, 20, 57, 77,152,227,253,165, 55,210, 51,240,117, 66, 51,143, 83,
-169, 37,136,144, 73,104,205,118, 6,120, 58,158,105, 97, 68, 98,145, 86, 34,167,137, 11, 89,122, 0,167, 35,156, 76, 59,136,201,
- 29, 32, 91, 38,253,113,147,168,219, 15,218,110,127,204,144,189, 62,157,194,167,150,160,170,227, 64,212, 13, 54,117, 2,109,235,
-168,205, 26,243,209,181,197,209,141, 72, 34,127,107,225, 90,239, 90, 69,197, 80, 44,189, 87, 46, 61,246, 4,214,175, 56,122,112,
- 28,125,174, 39,123,229,135, 21,234,135, 68, 36,143, 12,110,166,251,254,135,133,178,244,196,204,228,190,107,202, 10,223,196, 69,
-133,111, 28, 89,150,245,144,187,110,129,215,173, 49,109,140,109,116, 85,116,206, 13, 5, 95,101, 83, 74, 51,249,176,141, 17,156,
-247,212, 78,251,130,194, 68,113, 48,134,242, 38, 33, 50, 50,198, 32,118,166,203,141,156,246,146, 0, 11, 25, 59, 27, 78,153,249,
- 0,231,231, 43,190,244,165, 55,120,230,169, 39,184,127,124,198,225,126,206,131,251,247, 88,173, 43,124,240,145, 29,110, 6, 34,
-236,186,172,251,181,157,109, 9,114,135,151, 14, 65, 44, 69,102, 89, 55,171, 62,177, 48,154,185,196, 44,245,218, 43, 15, 30, 28,
-113,124,114, 66,104,175,163,109, 93,217,156,247,204,103,115,230,179,130, 23, 94,120,150,131,131, 67, 78,207, 74,102,179, 25,214,
-230,168, 87, 50,107,240, 24, 86,171, 53,185,119,204,103, 5, 77, 16,214,181, 67,131,146,181,205, 80,102, 13, 85, 29,223,171,181,
-182, 47,204, 81, 79, 30,155, 13, 99,132,162,200,187, 14,164, 53,207,137, 7, 78, 83,215,184,166,142,140,119, 19,167,251,218, 5,
-110,222,252,136,250,236, 1, 38,155, 81,135,104,141,155, 5, 71, 38,129,153, 53, 72,150, 33, 38, 3,137,235,150, 38, 40,101, 3,
-119,215,158,112,119,141,232, 57,153,120,114,163,100, 70, 89, 20,134, 60,207,200, 51,203,172,200, 48,214,182, 4, 58, 75,221, 4,
-130,143, 57,244,206, 57,170,198, 83, 55,158,117,229, 41,235,134, 58, 8, 94, 13, 98, 44,121,150,145,231, 7, 92,154,125, 26, 7,
-243, 54,138, 22,195,201,201, 25,206, 85, 92,122,242, 69, 94,253,220, 51,124,254,179, 47,241,214,143,189,193,115, 47,188, 16, 17,
-155,186,228,244,252,136, 7,101,141, 54, 53,198, 66, 97, 51,156, 70, 59, 95,171,158,197,172,192,183,230, 56, 26, 60,117, 48,241,
-249, 18,199,218,102, 52,165,105,153,239, 25, 34,134,101,128, 27, 46,240,185, 43, 37,255,246,197,107,184,230, 77,178,211,175, 67,
- 94, 15,172,248, 71,116,145,211, 11,217,117,242,240,114,124, 1,129,248,145,123,133, 31,212,140,102,235, 78,157, 97, 55,157,250,
- 92,135,126,119, 23, 16, 53, 73,182,118, 39,163,138,164, 22,175,210, 91,159,106, 23,225,154, 24, 89,116, 73, 79, 89, 11,181,215,
-147,131, 86,144, 54,161,172,195, 5, 6,118,252,104,114,235, 9,122,209, 78, 22,186, 40,216,184, 19,158, 95,177,188,145,193, 7,
-247,225, 19,133,153, 76,182,187, 50, 62, 56,141,196,195, 35,180,228,179, 97, 95, 24,191, 54, 19,165, 96,200,150,239,253,237,211,
-224, 4,145,141, 79, 70,250,170,100, 80,177, 24,171, 72,240,184,144,234,175,183,120,122,239, 8,234,216,198,152, 28, 29,175,137,
- 49, 75, 15,221,246,147,114, 11,159, 75,162, 40,145,193, 84, 38, 97, 66,141,100, 76, 50,153,188, 69,199,156,131, 81,227,161, 93,
- 60,143,233,191, 70,135,213, 45,105,252,248, 64, 70, 20,104,214,136, 54,189,253,237,136,191,182, 5, 6,219, 42,241,122,104, 99,
- 62,181, 71,213,113,102,210,197, 62, 23,189, 95,122,119,205, 92, 93,183, 46,123,102, 39,147, 60, 38,185, 5, 66,136,108,106, 90,
-231,176,177,142, 45, 13,209,145, 13,251,101,146,207,202,202,112,175, 69,189,187, 69,178,184, 23,158, 30, 75,210,202,149,140, 49,
-209,212,165,105,198,252,130,157,135,138,140, 50,170,123,232, 61,181,209,157,236,225,187,235,242,220,179,207,128, 8, 69,145,177,
- 90,175, 89,149,235,118,191,220,154,238,136,160,184,232,231, 96,162,149,176, 49,113, 13,183,152,207,217,223,223,227,112,127,143,
-178,174, 35, 7,160, 37,112, 9, 80,123, 79,221, 56,238,220,190,197,241,131, 7,253, 61, 27, 66,180, 92,181,214, 98,140,197,136,
-112,233,242, 37, 46, 95,185,138,115, 81, 71,190,183,183, 79,227, 98, 40, 75, 83, 55, 44, 22,115,216,155, 83,151,107,234,186,198,
-102, 25,243, 60,195,155,232,188, 38, 98, 9,193, 69,146,104,150, 83,151,117,139, 30, 74,116,176, 83,112, 26,245,235, 65, 3, 46,
- 68,212, 65,189,163,152, 45,168, 28,156,159,157,226,234, 18, 85, 40,140,193,216,140,183,223,121,159,147,179, 37,207,191,250,121,
-110, 60,245, 52, 7, 7, 7, 84,193,112,231,232,156,211,147, 35, 86,103, 39,148,231,103,132,242,140, 92, 87,228,185, 33,203,231,
-100, 24,102,214,118, 12,151,248, 28, 5,165, 82,101, 85, 43,161,106, 85, 18, 90,247, 94, 11,218,199, 66, 15,228, 81, 17,193,152,
- 28, 43, 5,249, 98, 78,209,158, 25, 27,230,166,143,154, 57, 46,208, 4,195,131,251, 15,248,220,115, 7,252,204, 47,252, 37,158,
-124,249, 45,158,125,236,128,199, 46,101,184,170,161, 94,159,114,119, 37,184,218,225, 92,255,232,183, 0, 0, 32, 0, 73, 68, 65,
- 84, 85,177, 26,144, 60,107,191, 55, 18, 26, 11, 43, 4,137,205, 82,240, 46,146,151,141,193,181,156, 39,107,148, 60, 51,216,121,
- 70, 8, 11,130,107, 80,231,177,166,102,165, 25,207, 97, 40, 31, 91,241,237,250,105,252,219,107,108,245,187,144,185,182,164, 61,
-122,126,250,110,178,252,195,164,103,250,200,208,249, 35,180, 7,223,255, 44,191,209, 20, 72, 71,160,214, 49,163,175, 39,169,181,
-246,136,109, 53,108, 68,201,148, 62,202,115, 48,144,233,100,111, 38,238,197, 58, 31,117, 13,253, 52,235,186, 93,117, 75,160, 11,
- 9,191, 87, 38,212,170,206,143,222, 38,204,243,206, 61,204,180, 9, 80,145, 52, 98, 17,219,144,175,222,163,124, 63,227,131,220,
- 82,217,206,202,118,211, 80, 80,100, 26,105,154, 68,134,142,244,195,145, 12,224,196,244, 54,169,131, 12, 73,123, 4, 99, 10, 99,
-147,102, 96,139, 32, 54,194,185, 96,200, 52,196,194, 62, 45,208,173,148, 47, 39,114, 16, 46,180, 60, 77, 60,206,227, 1,103,200,
- 72,243,172,211,249,153,222, 50, 82, 38,169,102, 83,150,124, 72,128,118, 25, 81,251,100,104,100,100,203,164,172,244,159,137,105,
- 89,230,131, 37,187, 78,130, 66, 82, 57, 30,156,156, 28,199,137,214, 90, 70,198, 15,137,157,217,182,205,213,212,156,231, 81,231,
-139,126,127,159,234, 0,116,199,248,191,149,175, 30, 33,245,135, 78, 52,109, 19, 21, 18, 51,159,141, 88,215,137, 97, 18, 15,201,
-104, 31,217, 11,139, 98, 68, 39,214,190,233,207, 29, 71,196, 14,188, 8,182,239, 66,167,192,190,180, 84, 67,221, 76,149, 74,123,
-173,206, 73,238,242,229, 75,145, 68,229, 29,235, 85,137, 21, 75, 94,100, 80,183,113,192, 45, 81,177, 91, 69,204,140, 69, 37,163,
- 44,215,204, 15,246,216,219,223,143,135,125,221,244, 77, 73,247,107,247,247, 22,220,187,119,159, 91,183,239, 80,150,101,100,188,
-211, 26, 73,181,107,172, 34,207,201,139,156,199,159,188,193,108,111,175,117,125,139,175,117, 93,149,113,185,104, 44,117,227,218,
-160, 35, 7,121,134,171, 29, 54,138,177,105,154,134,249, 44,231,124, 21, 87, 4,121,102,104, 76, 52,173,142, 48,187,224,154, 26,
-107, 45,181,115,184,186,166,104,217,238,193, 71, 13, 58,106, 41,203, 10,117, 21,121, 49,235,115,222,159,125,254, 37,126,246,213,
- 87,184,113,253, 42,130,199,151,231,168, 42,175, 61,125,153, 42, 60,203,201,114,205,217,178,228,248,188,228,246,157, 7, 28,125,
-114, 11, 57,251,132, 69, 22, 48,179, 5,189,152, 88,162, 84, 78, 0,107,101, 75,246,163,110, 79, 64,100, 99,255,180,169, 72,153,
-240,111, 46, 42,232,181, 23,238,221,189,195, 47,188,117,141, 95,253,251,191,198,226,197, 47,113,247,227,219, 44,143, 62,230,238,
-189, 6,239, 0,141,170,130,104, 87, 26,199,180,224,163,209, 88,199,129, 9,170,248,224,169, 42,135,113, 21,100,224,189, 5,231,
-200,140,167,200, 50,116,150, 83,179,160, 44,215,248, 80, 69, 9, 34, 68,243,176, 6, 94,206, 28,213, 19, 37,239,185,151,145,119,
- 27,108,243, 45, 52,147,164,176,235, 35, 87,200,116,240,185,240, 27,116,188,190,219, 34, 0,248,131, 99,190,239, 24,221,179,110,
-190, 54, 26, 89,239, 62,225,243,145, 6,157,104,196,225,189, 12,182,157,218, 89,168,246, 48,109, 11,179,183, 65, 29,241,112,139,
- 14, 73,142, 46,167,155, 62, 62,213, 76,160,226, 62, 12, 38, 57, 76,124, 79,204,136,228,148,160,150,218, 10,153,209, 65,131, 45,
- 5,138,112,199,197,253,189,233,166,248,148, 25,221,190,126, 53,157, 37,105, 87,156,219, 85, 66,219,188,168, 12,210, 92, 15,189,
-201,204,152, 85, 61, 45, 24,244, 38, 53, 38,169, 56,209, 78,118,136, 75, 29, 1, 59, 58, 28,234,146, 72,177,252,174,178, 36,195,
- 53, 86, 50,236,108,134,241,101,107,118, 49,188, 22,219, 95,183, 97, 79, 27,116, 60, 73,122, 29, 28,190, 3,219, 2, 13, 90,246,
- 64,171,161, 79,187,127, 77, 63, 47,141, 49,148,217, 86, 33,218,152,106,197,100, 21, 18,167,216,196,113, 42, 49, 55,234,206,150,
-160,147, 7,238,251,126, 72, 82, 6,248,246, 60,243,241,158, 99,172,187,215,150,121,255,105,118, 91,189,148, 78, 55,134,244,209,
-249, 32,147, 3,101, 87, 34, 84,208,208, 55, 11,222,251,150,233,182, 3,245,209,152, 19, 46,169,135,172,164,235, 32,153, 4,190,
- 48,102, 92,244, 65, 46, 91, 90,171,254,217,143,247,250,124, 86,224, 27, 71,181, 46, 17,161,213, 95,135, 33,161,203, 8,198, 26,
-178,118,223, 43, 38,238,215,231,179, 25, 87,175, 92, 69, 3,156,159, 47,113, 46,186,202, 73, 27, 55,154,137,178, 92, 46,249,240,
-195,155,241,217, 55, 6,231, 3, 62, 56,242,118,215,142, 70,131,150, 39,174, 62,198,211, 79, 63, 73,192, 80,183, 94,236, 67,156,
-171, 99, 86,100,172,171,134,245,122, 77,110, 13,179,162,160,172, 99,176, 75, 85, 55,228,153,193, 57,223, 55,110, 54,139,144,118,
- 91,161,226,254,223, 70,107, 68,231, 60, 62, 64, 93,187,150, 56, 41, 84,181,143,187,235,186,138,114, 91,231,112,206,243,217,151,
-158,228,141, 31,249, 49,214,231,167,220,253,248, 93, 78,207, 87,184,150,225, 95, 88,216,159,229,204,196,112, 88, 88, 94,120,122,
-143, 31,121,254, 85,238,172, 94,225,237,155,119,249,240,221,119, 48,199, 55, 89,228, 96,138, 5,157, 33,146, 12,211,192,164, 69,
-159, 46, 42, 7,131,171,205, 10, 51, 62,193,134,103, 98,236, 38, 56, 37,120,174, 43,199,209,221,187,252,249, 47, 60,193,127,251,
- 15,127,141,226,249, 63,206, 7, 31,223,225,232,232, 62, 84, 43,156, 10, 85,237,176,192,124, 81,224,179,125, 92,237,241,190, 70,
-218,240, 28,212,163,234, 8, 26,104,124, 91,115,212, 34,174,193,107,212,208, 27, 35,209,184, 40, 19,124,105, 8,206, 71,210,115,
- 59,121, 25,160, 84,152,121,225, 53,235,104,158,130,155,205,171,200,251, 37,198,189, 3,118,129,118,177,181,250, 40, 39,198,163,
- 98,224, 58,216, 57, 63,226, 79,122,120, 54,220, 15,169,228, 39, 63, 42, 83,213, 36,235, 60,221,179,118,178, 21,131, 88,193, 72,
-192,132, 24, 79,234, 25, 2, 91,186,105, 55,157, 99, 7,131,144,118, 58,214, 52, 11,187,219,219, 71, 41,154,166,115, 90,146,143,
-110,186, 73,177,131,138, 68, 90, 21,156, 70,227, 7, 49, 24,147, 74,193, 12,214, 68,205,102,231,246,229, 71,201,152,166,133, 60,
- 59, 11,208, 78,123, 46, 91,242,131,198, 19,161,236,216,182, 76, 11,188, 36, 44,100,240, 4,111, 49, 22,108,171,155,223, 90,148,
- 76,188, 86,161, 53,240,209,196,121,141, 29, 36,190,160,144, 89, 40, 68, 88, 58, 29,164,128,137,108, 76, 54,230,218,196, 61,141,
- 33, 74,181, 47, 66,218, 65,231,211, 48,156,228,253, 73,178,158,209,128,181, 57,143,207,227, 1, 89,250, 16, 31, 92,198,122,230,
-205,159, 66,162,217, 31,246,252, 41, 89, 75, 85, 35,217,105,182, 32, 19,165,110,154, 81, 44,234, 24,107,185,160,216,235, 4,126,
-151, 71,107, 11,116,202,135,208, 79,247, 12,138,164,158,215,219,247,216, 42, 83, 46,133, 60, 4,210, 75,188, 7, 68,118, 18, 42,
- 7,243, 27,217, 32,106,110,250,182,235, 36,240,101, 91, 67,161, 19, 50,228, 24, 25,114, 77,197,186,140,230, 32,179,217, 28, 31,
-132,224,192,218,172, 39, 8,206,231,115,246,246,246, 57, 63, 61,233, 95,243, 98,177, 96, 54,155,177, 42, 43,208, 64, 80,143, 21,
- 67,150, 23,148, 85, 77, 93, 87, 60, 56, 62,101,189,174,176,109,172,108,150, 69,238, 54, 26,240, 62,238,189,157, 15, 92,185,114,
-153, 44,203,169,170, 6,231, 3, 89,187,103,214,186,193,251,208,250,204, 11,179,162,136,211,102, 93,163, 26,168,107,223, 55,148,
-104, 52,181, 50, 94,162, 55,189,181, 52, 46,126,127, 44,196,129,170,174, 81,239,227,132,174, 33,174, 85, 66, 60, 71, 86,229,146,
- 60,139, 94,147,181,247, 28,204, 50, 10, 35,124,243,183,190,193,114, 93,182, 1, 48,218, 26, 4,197,226, 89,206, 11,242, 98,134,
-150, 13,230,180,100, 47, 23,158,218, 47,120,250,115,215,184,253,226, 13,190,253,193,171,124,244,157,111,147,157,220,100,190,200,
- 32, 95,244,193, 88, 65,180,229,102, 92, 80, 96, 82, 72, 77,198,195,235, 78, 82, 55,227, 0, 36,105,115, 36,142, 78,207, 9, 77,
-205,127,240,165, 55,249, 27,255,205,127,142, 60,245,211,188,255,225,109,238,220,125, 64, 88, 29, 67, 30,155,182,107, 87, 15,216,
- 63, 56,100,182,216, 39,152,156,186,241,132,166,194,249, 64,237,106,150, 43,135, 59, 63, 6,127, 22,227,108,173,160,146,163,106,
-113, 85,131,197,225, 76, 92, 93,170, 49,209, 11, 64, 58,203,230, 24,126, 99,140,199, 90,131,147,140, 2,248,108,161,184,231,148,
- 91,254,243,204, 62, 12, 24,255, 62,100,115,180, 99, 77,235, 69, 40,196,112, 24,201, 67,166,109,233, 13,216,100, 66,110,121,248,
-121,242,253, 80,222, 31,189,228,143,223, 91,214,237,210, 67,119,163,144,104, 90, 33,106,200,131,224, 45, 81,158,209,238,117, 82,
- 23, 53, 77,173, 85,147,130, 78, 31,250,209,154,210,244, 82, 51, 29,178,211, 25,100,115, 61,108,143, 25, 12, 85,146,168,210,174,
- 75,138, 18,182, 16, 77, 34,232,108,110,187,163,222, 68,192,170, 53, 73,232, 27,135,196,168,100,124,165,219,166, 37,137, 94, 29,
- 14,200,144,210,193,152, 88,135,140, 33,225,132,137,214,101,125, 7,124,164,225, 39,135,178,108,142,224, 17,181, 72, 32, 85,217,
-214, 33,166, 91,123,241, 52,235, 21, 78,162,196, 42,232, 64,132, 10, 50,121, 50, 71,187,127, 77,162, 84, 37,113, 58, 75,233,208,
-195, 77, 62,221,243,143, 24,158,109, 3, 54,207,179,232,107,222, 56,234, 42,180, 18,195,135,192, 80,210,193,112,154, 0,253, 93,
-138,153, 7, 59,231,250,227,151,104, 86,167, 84,181,223,142,144,235, 35, 62, 52,186,133, 86,247,168, 81,140,250,131, 53,211, 59,
-201,105,146,194,217,131, 4,240,162, 95,101,182,106,203,119,209, 4,195, 40,107, 96,130, 45,238,120,125,155, 7,213,195,200,117,
- 65,225,244,236, 12,231, 99, 62,185,181, 25, 33,104,148,118,185,136, 42, 88, 19,163,119,246,246, 23,228,197,140,208, 68,183,190,
-131, 75, 7,228, 69, 17,119,170, 33, 54,136,222, 59,124, 85,210, 13, 26,213,122,205, 98, 86,112,255,193, 17,203,243, 37,153, 49,
- 72,102, 89,174,226,190,219, 7,101,150,231, 49, 93,173,174, 35,185,206, 73,107,195, 26,240, 33, 18,217, 26, 23,152, 23, 25,179,
- 89,198,114, 89, 18, 90,163,165, 24,182, 99, 34,235,221, 10,153, 26,130,181, 24, 12, 70, 34, 81,206,183, 76,251,166,118,120,231,
-219,207, 33,196, 70, 36, 68,244,175,170, 34, 52, 92, 20, 57,174,253, 30, 49,134,155,119, 78,112,222, 71,131, 24, 19, 45,153,171,
-198, 19, 66, 96,150, 91, 26, 53, 4, 23, 9,122, 54,179,148, 38,163, 42, 13,123,238,156,151, 14,103, 60,255,163, 79,243,157,167,
- 31,231,247,190,253, 62, 71, 31,124, 7,123,126, 31,107,227,240, 34,198,160,214,210, 69, 94,181,198,197, 59,198,198,164, 45,148,
-139, 11,251,112, 34,119, 22,221,194,249,217, 25,175, 60,125,153,159,253,242,159,230, 75,127,244,167,225,241, 23,185,125,231, 8,
-215, 84, 92, 58, 88, 48,187,118, 64,145,207, 89,204,103,204,231,115,102, 25,152, 60, 99,237, 44,229,217, 9, 33,115,248, 0,141,
- 70,130,162, 95,129, 6,139, 72, 96,145, 27,156,228,156,175, 29, 5, 21,217, 34,199,215, 51, 22,225, 12, 53, 51,202, 10, 66,149,
-227,137, 13, 86,156,244, 13, 70, 35,194,236,128,194, 27,222,156, 57,120,121,198, 45,254, 16,197,205,128,117, 31,128,221, 99,240,
-247,144, 29,147,123,250,160,203,206, 14,126, 52,216,233, 14, 2,206,247,181, 31,255, 1,167,245,109, 68,185,144, 24,207,160, 67,
- 23, 73, 66,154, 83,141, 48,114, 45,177, 70,117,236,221,208, 21, 84,194, 8,146, 48, 45,196, 27,218,138,156,181, 73,107, 46, 73,
- 1, 49,232,200, 50, 86, 38,219,211, 40,135, 10,237,122,111,176, 20, 13,125, 19, 64,111,112, 19,115,207, 91, 96, 88, 67,191, 19,
- 52,109, 5,243,154,194,215,180,191, 59,146,228, 48,177,105,232,211,233,194, 4, 64, 14, 73,106,186,164,177,148, 36,211,216,184,
-244, 14,147, 90,252,133,126,194, 36, 78,224,144,190,232, 76,207,206,225, 55, 77,180,232, 58,224, 40,177,243, 79,135,210,193,166,
-210,176,105, 71, 19, 66,151, 64, 39, 35,158, 65,159, 71, 46, 50,209,208,203, 72,171, 79,146,100, 39,109,195,247,160,118,228, 70,
- 34,195,216, 8,222,143,177, 2, 67,160,110,167, 42,147,196,205, 74,154,166, 39,131,155, 92,215,160,205, 76,160,106,189,175, 51,
-107, 38, 80,150,126, 10, 18,137, 60, 18, 4, 55, 12, 53, 58, 86, 9,164,236,240, 71,248,165,221, 62,219, 24,115,225, 35,155,226,
- 39,143,106, 77,153,218,183,238,218,193,119,158,254,253,253,184,235,189,107,234, 57, 72,111,250, 98,147,140,120, 70,241,174,155,
-196,122,231, 3,247,239,221,141, 19,106, 75, 56,181,214,182, 58,249,200,124, 15, 33,202,235,180,105,200, 51,203,217, 42, 6,176,
- 92, 62,140,238,100, 46,212, 88, 99,163,125,104,104,211, 27,213,115,118,118,202,122,189,194,135,192,186, 44, 89, 87, 53,153,137,
-202,137, 14, 96, 48, 86, 88,204, 99,122, 90,221, 52,236,205, 22,100, 25,148,117,201,122,181,196,218, 61,140, 24,138,214, 52,166,
-174, 98, 51, 48, 43,114,196,102, 45, 60, 31,161,221,204, 90, 52, 68, 93,142, 15, 13,214,128,177,150,178,170,122,167, 57, 85,197,
-133,208,115,108,140, 49,253, 26, 36,207,103,209,248, 74, 97, 54,179,216,204,208,180,132,190,168,212, 49,184,118,175, 60,155, 21,
- 44, 22, 11,138,162,136, 50, 73, 98, 17, 52,198, 98,173, 64,150,113,123, 45,132,163, 79,248,204,229,130, 87,127,246, 77,190,241,
-206,115,220,126,231,187,212,235,115,170,114,133,171, 75,124, 93, 66,104,144, 80, 97,165, 37,116,218, 40,229,139,146, 37,217,104,
-212,165,133,144, 31, 70,142, 51,173,140,247,193,209, 25, 63,241,194,156, 95,252,139,127,142,103,127,228,103, 48,243,171, 28,159,
-172,153,201,154,253,253, 43, 44,230,115, 22,251,251,160, 22, 19, 74, 86, 85,201,250,236, 12, 35, 21,107, 39, 56,175,212, 62, 42,
- 3,150,149,163, 62, 95, 65,168, 48,173, 91,158,177, 74,237,148,140, 6, 83,196,213, 77,109, 61, 33, 43,208,178,193,138, 39,179,
- 57, 4,219, 54,255, 54, 18,187,131,130, 58,172, 64,109, 45, 11, 49,188, 57,171,104, 94, 90,112,199,253, 24,139,143, 42,196,223,
- 1,187, 72, 38,236,113,147, 67,127,150,201, 40,225,243,209,136,114,187,255,226,251, 46,209,223,207,180, 62, 58,227, 58,162, 92,
-151,140,214, 21, 61,213, 54,195,219,128,213,129, 68,214, 94, 11,237,146, 40,131,246, 59, 50,172, 33,215,128,241, 74, 21, 18,119,
-186,214,170,206,183,211,118,167,153,214, 86,163, 76,103, 72, 19, 35,199, 18, 89, 92, 27,142, 32,177, 65,232,145,132,196,167,189,
- 59,112, 98, 74, 90,123, 56,105, 18, 42,170,131, 47,184,136, 38,102, 37,154,184,231,233, 24,162,157,132,153,144, 16, 2, 59, 68,
-160,157,237, 55,108, 87, 83,234, 89,135,120, 72, 58, 53,165,200,133,200,214,132,177,241,103,165, 61,119, 37, 36,112,167, 72,151,
- 15, 63,200,219,198,129, 49, 50, 90, 33,164,197,189, 11, 82, 25,119,157, 67,134,246,160,253,211, 30, 98,157,238,134,210, 6, 64,
- 67, 0,231, 32,179, 56, 31,179,177, 37, 57, 20, 2,138, 51, 25,207, 28,238,199, 88,206, 58,196,125,103,138, 92, 36,140,244,190,
- 40,168,227,147,187,247, 17, 49,125, 65,255,193,152, 39, 99,104,255, 97,187, 48,217, 72,143,250,244,211,121, 8,225, 81, 94, 78,
-175,255,221,150,217,190, 27,136, 31,118,229,122,193,151, 14, 74,140, 45, 19,119, 79,170, 27,208,147,254, 30, 78,154,152,109,166,
- 28,221,231,159,229, 57, 31,127,252, 17,235,213, 18,105, 73, 92,153,141,187,204, 90,155, 88, 40, 51,195,186, 92,115,231,206, 29,
-170, 50,154,198, 92,186,116,137,189,253,125,202, 58,194,226, 65,163,123, 90,150, 89,214,101, 67, 85,149,220,189,119,143,166,174,
- 89,151,107,188,139,114,167,202,121,188,143,230, 64,198,152, 56,253, 26,161,169,107,154,186,161, 4,140,177,172,235,154,187,119,
-239,114,245,177, 39,227,217,225, 26,108,158,199,162,153,105, 47,195,205, 51, 11, 89, 52,148,105,154,134,170,174, 41,203,154,213,
-106,133,171,171,152, 65,238, 35,255, 38,179,150,198, 57, 52,248,150, 85,110,218,243,210,145,231, 25, 98, 10, 50,155,181,103,103,
- 92,101,212, 85, 73,181, 94,163,206, 97,140,193,100, 57,153,201,163,165,176, 49,145, 76,214,241, 12,124, 76,164,116, 30,202,178,
-110, 13,138, 12,183,151, 48,175, 62,230,179,135, 25, 47,189,245, 57,170, 38, 80, 54,142,229,170, 98,189, 90,177, 90,151,172, 86,
- 43,214,235, 21,213,122, 69, 93,173, 8,117,137,248, 26,163,174, 71, 28,165,151, 43,106, 66,154,149,150,220,170, 35, 2, 36, 45,
-135,196, 5,229,141,231,175,243,199,190,244, 69,102, 7, 55,152,107, 13,133,112,226, 10, 50,239,216,195,147,169,227,236,244,132,
-251, 71, 75,202,211, 59, 84,206,177, 46, 61,198,149,100, 54, 90,212,250, 16,155, 33,231,162,199, 62, 54, 39, 52,113,125, 81,171,
-193, 87, 53,115,171,212, 88,154, 26, 50, 28,165, 49,100, 89, 70, 81,228,212,101, 5, 46, 18,138, 3, 6,117,190, 37, 35,217, 86,
-157, 5,165, 10,123, 94,120,115, 81,241,155, 47,205, 57,109,254, 16,179, 79,190, 6,242,255,243,246,238,191,146,101, 89,122,208,
-183,246,222,231, 68,196,125,100,102,101,101,102, 85,117, 79,215,208,211, 51, 30, 11,195, 96, 15,216, 98, 52, 3, 50,200,230,241,
- 3, 70,178,144, 64,200, 66,194, 96,144, 5, 2, 1, 22,195,152,193,255, 25,191, 34, 64, 2,201, 24, 51, 51,253,154,174,119, 85,
- 86, 86,222,155,247,222,136, 56,231,236,189,215,226,135,181,246, 62,251, 68,196,205,204,234, 46,200,209,116,119,213,205,123,111,
-196,137,115,246, 90,235, 91,223,227, 21,200,109, 26,148,180,153,220, 91, 1,208, 91,112,214,239,255, 39,249,165, 54,244,223, 1,
- 39,238,196, 63,168,236, 17,222,180,227,212,116, 47,165, 48, 57,155,130,133, 5,177,164,174, 9,213,135, 24,146, 33,172, 4,173,
-146,231,157,101,193, 49,174, 19,118,217, 5,150, 40,204,140, 89,147,206, 40,150,178, 52,131,190,101,223, 79,141,238, 89,154, 98,
- 68,141, 71,123, 51,121,112,179, 67,117,152,253,227, 5, 88,248,160, 83, 69, 33,184, 6,115, 21,178, 25,183, 1, 42,199,200,116,
-147,129,174, 5, 86,121, 4, 14,232, 58,172, 48, 33, 69, 84,239,248, 67,232, 88,154,107,113,175, 66,180,102,251,210, 98, 69,209,
- 22,101,111,141, 79,203, 98,149,234,219,175, 71,116,178, 9,190,200, 0,105,241,119,151,183, 33, 47,216,159, 88, 76,113,142, 14,
-166,127,123, 26,114,154, 96, 74,164,133,141,171,121,125,160,243, 30, 23, 46,227, 43,206, 11,132, 0,149,219,112,168,129,214,247,
- 28,130,183,216,221,111,107, 2,121, 98,113,223, 70,151,190,149,126,181, 37,150, 53,236, 62,249, 22, 13,183,156,102,200,201, 1,
- 96,179,200, 93,193,253, 44,248, 67,179,161,183, 63, 52,102, 40, 29, 39, 39,124, 35,140, 90, 68,236, 36,175,193,102,121,217,140,
-172,215, 27,124,254,217, 23,184,190,122, 9,215,159, 35,198, 9,155,179,115, 53,116, 33, 66, 22, 70,240,192,221,237, 29,118,251,
- 1,222, 76, 92, 30, 62,124,160,201,101, 57, 99,181,222,152, 76, 77, 97,237, 85,223, 99,183,221, 33,197,172, 41, 94,153,225,201,
-205, 44, 17, 1, 98, 78, 8,166,221,223, 58,194,205,171, 27,156, 63,184, 68,244, 30, 46,105,136,212, 55, 87,175,224,124,103,170,
- 12,160,247, 4,231, 3,242,160,123,254, 41, 70,155,218, 3,188, 15,216,239, 71,107,196, 8, 57, 49,118,195, 4,130, 54, 26, 49,
-206,166, 51,101, 48,144,172, 68, 57,117,188,115,232,251, 30,222,244,234,165,112, 80, 10, 90, 28, 99,134,163,140, 21, 17,216,107,
-232, 12, 81, 82, 50, 30, 37,120, 4, 68, 97,116, 1,200, 76,136, 41, 98,213, 5,172,250, 0, 16,225, 54, 10,124,140,240, 46,162,
-119, 14,155,206,225,209,163, 0,121,248, 0, 66,143, 32,174, 67, 98,194, 62,102,220,222,237,176,221,237,112,119,183,197,126,187,
- 5,241,160, 65, 55, 8,136, 57,235,202,148, 1,230,136, 32, 25, 93, 23, 84, 3,238,156, 54,212, 94, 51, 50,200,121,188,119,222,
-227, 55, 63,252, 30,198, 16,112,119,243, 10,159,125,254, 28,239,222, 94,227,209,147,247, 17,251,135,120,126,189,195,112,247, 5,
-246,227, 14,219,145,225, 73,224, 67,143, 72, 30,226, 54, 26,241, 58, 90, 66,161,168,227, 29, 35, 32,143, 19, 58,202,144,174,215,
-212, 59, 82,133,130, 99,192, 59, 65, 38,135,149,203, 72,157,190,150,222, 3,169, 95,129,179,146,230,148,201,172,147,122,217,253,
- 11, 11,118, 34,120, 8,224, 95,120, 48,224,255,248,209, 35, 12,211,239,160,191,250,223, 33, 20, 1,244, 32,200,193, 10,148, 22,
-182,199,175,141, 82, 61, 69, 14,250,214, 97, 49,223,241, 31,186, 15,126,103,155,196,205, 32,164, 45, 8,197,157, 37, 86, 43,202,
-217, 11,220,131, 64,164,147, 25,101,104,106,217,162,179,183,112,134,134,100,224,154,201,130, 33, 77, 64,140, 84,153, 28, 85,249,
-141,212,105,180, 76,199,128,148,161,222,186, 76,198,210, 16,133,142, 72,158, 5, 17,160, 3,214,167,212,125, 61,205, 99, 44,181,
-241,165,243, 1, 47,205, 84,212, 58,205, 81, 51,177, 23, 69, 0, 56,206,209,139,181,185,105, 13, 70,232, 4,193,238, 20,134, 35,
-203,233,222,126, 87,155, 42,220,122, 49, 11, 81, 99,102, 66, 71,211, 95, 45, 38,246,154,164, 97, 67,183,166,169,197,101,175, 32,
- 35,157,247,232, 8, 24, 83, 90,238,236,140, 7,224, 64,198,166,135,105,170, 9,153,147, 18,150, 66, 7,226, 9, 63,185, 26, 0,
- 55,135,237,204,145,179, 7,161,174, 53, 60,166, 97,190,159, 64, 68,222,200, 91, 59, 52,232,255, 86, 89,198, 77, 4, 44, 73,211,
- 96,125,139, 4,167, 74,236,121,131, 41, 5,181,104, 9, 14,248, 11,167,122,240, 37, 77,147,238, 67, 30, 90, 95, 1,105,115,173,
-233, 36, 92, 95,156,220, 94,119,178,205, 94, 15,115,231,182,234,123, 60,127,241, 13, 94, 62,255, 10,223,255,209, 63,139,237,205,
- 75,156, 95, 92, 54, 77,157, 96, 24, 6,108,239,238,224,189, 87, 50, 92,240, 56, 63, 59, 55, 77,122,211,248, 91,193,116, 68,184,
-187,187, 67,140, 58, 41,167,148,144,115, 52,195, 19,123,230,137, 16,153, 65,102, 35,187,221,222, 89,156,114,174,171,189,196,192,
-205,221, 22, 4,134,239,188, 77,248, 10,197, 79, 49,193,123,157, 82,119,251, 17,132, 81, 73,158, 4,228,156, 48, 78,163, 22, 26,
- 80,117,183, 75, 57,215, 51,128, 89,209,130,190,239,193, 44,240, 78,229,125,227, 56, 33,166,201,252,227, 29, 98,140,245,186,103,
- 86,242,231,202, 7,253, 28,106,129,208,252,114,129, 50,241, 21,202,247,170,217, 78, 9, 32,134, 55, 68,130, 65, 72,226, 48, 37,
- 69, 54,132, 51,130, 35, 4,159,176,242, 14,189, 19, 92, 94, 18,240,240, 18,228,222, 65, 68,128,228,140, 62,232,206,126,179,238,
-176,217,172,145,169,215,223,149, 19,216, 82,222, 66,231, 53, 23,157,213,114,247,172, 15,160,110,131,207,159,191, 2,189,122, 1,
-225, 53,194,213,136, 39,151, 43, 60,190,217, 97,242,103, 24,167,164, 28, 38, 31, 16,188,250,209, 59, 36,116,222,129,187, 21, 56,
- 7,164, 20,145,137, 1,241,202,118,143, 9, 78, 50,196, 17,166,105, 0,113, 66,232, 3,132, 60,114, 78,144, 44,112,200, 26,197,
- 96,235,160,206, 59,112,214,251, 63,120, 32,146,186,207, 81,206,128, 23, 80, 22, 56,138, 96,239, 49,100,135,103,196,248,237, 71,
- 3,254,175, 15,159, 33,239,127,203, 52,236, 89,145, 86,153, 7,198, 26, 5, 11,117,199,123,237, 9,115,127, 22,210, 91, 65,231,
-242,182,213,249,219, 66,240,116,130, 40,231,138,113,193,114,233, 0, 39,197, 71, 93, 42,100, 12,210,224,138, 74,148,106,148, 15,
-185,129,172, 97,123, 36, 49,163, 24, 54, 77, 41, 31,240,178,203, 33,145, 48, 23,215,162,201, 21,193,129,220, 74, 11,191, 91,176,
-237,237,176,230, 6,146, 39,170, 43,131,146,229, 78, 7,193, 92, 77, 54, 28, 28, 45,127,166,216,174,223,217,239,100, 57,177,115,
- 45, 93, 30,150,114, 60, 64,179,128,199,186,171,190,135,194,238,100,118, 21,195,125,150,167, 82,155, 44,136,128,251,115, 92,116,
-140,105,183, 71, 52,116,162, 28,130,108,172,251,217,208,100,126,141,174, 33,239,201,129, 12,207, 45, 98, 88,155, 32,143,166,200,
-122,114,120,118,209, 35,142, 3,190,216,142,224,162,221, 55,135,192,140, 89, 47,159, 69,192,146, 64,221, 6,143, 31,157, 99,184,
-187,194,148,116,247,120, 90, 91,126, 28,151,202,204,175, 39,218,189,237,238,106,233,103,249,246,227,126, 81, 7,212,189,255,236,
-157,240,182,127,202, 62,189,162, 64,135, 41,168,180,168,183,139, 29,247,253,253,137,180,106,254,134, 98, 40,111,192,230,228,136,
- 25,127,114,252, 40,207, 93,201, 10,144, 19,198,151,141,159, 60, 65,157,214,174, 94,222,225,163,143,126,129,191,248, 59,127, 13,
- 95,125,241, 9,222,121, 39,162,235,123, 76,211, 8,231, 8, 55,183, 91, 76,113,196,122,181,198,221,246, 14, 15, 30, 92, 96,181,
- 94,129,200, 33,231,132, 20, 39,205, 7, 32,117,158,187,219,222,225,230,246, 6, 49, 70,236,119, 3, 82, 76,200,204,245,172,168,
-164, 82,206,232,188, 6, 67, 77,211,132, 20, 19,124,175, 18,203,100,112,247, 48,142,136,211,168,177,164, 89,247,238, 2, 45,194,
- 32, 53,240, 73, 41,215, 41,220,123, 13,142,201, 22,132, 51,197,212,220, 74, 42,205, 83,228, 45, 96,189,238, 1, 43, 68, 41,101,
-236,111,239, 16, 83, 86, 85, 8, 37,132,160, 60,129, 16,188, 34, 88, 94,229,114,220,114,143,156, 18,232,196, 72,127, 57,171, 70,
-190, 36,161, 49, 52,215,221,153,113,149,119, 4, 49, 82,111,215, 5, 48, 58, 37, 4, 66, 16, 19, 91,144, 78,182,162, 24,235,253,
-123,183, 23,120,201, 24, 61, 97,235, 12,117,115, 4,182,108,130,205,170, 3,113,143,172, 33, 25, 88,109, 58,132,208, 99, 31, 71,
-172, 55, 30, 28, 30, 99,114,128,248,128, 59, 89, 35,221,100,132,176, 67,191,234,177, 10, 30, 18, 60, 98, 4, 98,142, 32, 97,244,
-129, 65, 62,129, 77, 99,223,121,175, 90,127, 78, 74, 31,118, 14, 67, 18, 72,206, 88, 27, 65,125,202, 73,109,145, 69,141,104,124,
-177, 23,102,193,148,163, 53, 31, 70, 24,117,154,152,199, 78, 27, 69, 18,134, 15, 58, 80, 36, 6,118, 81,240, 1, 39, 92, 61, 78,
-248,232,123, 31,194,253,226, 26,196,159, 42, 12, 95, 41, 54,135,238,159,210,144,177, 79, 67,242,242,198, 10,251,255,243,164,126,
- 31, 81, 14, 53,170,148, 42,107, 91,137, 22,179,134,124,214,208,210,129, 20,103,214,170,187,146,239, 92, 66, 85,138,197, 34,153,
- 71, 48, 73,163,145,214, 31,192,150, 31, 94,131, 51,106,105,155,135,103,215, 22,248,131,220,233,202,209,108,248, 0,124,116,100,
- 73,221,210,159,250,152,196,118,214,109,137, 41,144,221,161,136,170, 58,180, 1,139,255,141,102,125, 32, 70, 20,212,181, 64,163,
- 83, 46, 90, 97, 43,180, 76,210,212,154,211,166,133, 4,153,163,103,243, 4,113, 38, 49,108,154, 20, 62, 40, 88,212, 32, 20,212,
-184,127,201,129,225,236,161,134,189, 4,205,176,101,142,151, 23,151, 57, 97, 59, 0,158, 91, 8, 87, 63,171, 36, 14,239, 92,156,
-161,203, 19, 94,236, 35, 58, 71, 24, 77, 32,127,185, 9, 72, 59,213,147,122,194, 66,247, 76,181,168, 45,139, 18,125,139,123,120,
- 41,221,122,205, 19, 68,173,247,254,235,205, 40,228,224,179,146, 70, 10,147, 45, 49,235,173, 94,163, 28, 72,199, 14,220, 62,244,
- 58,231,202, 75, 81,167, 56,247,134, 93, 63, 45,209, 10, 17,224, 62,165, 65,235, 9, 76,203, 38,109,185,251,199,210,135, 64, 14,
-137,130,114,239,251,154,159, 63,143,143,126,241, 11, 48,143, 32,215,225,250,234, 37,222,121,242, 20, 62,116,136,211,136,105,156,
- 16, 83, 6, 73,130,247, 30, 23,231, 23, 88,175,215, 72,137, 33,228, 48,140, 3,250,190, 67,215,173, 1,104,108,232,106,125,142,
-235,171, 43,149,145,169,111,171, 18,238, 82,134,247,154, 65, 14, 40, 10,152,153,113,125, 29,113,125,125,133,119,251, 77, 13,179,
-129, 83, 98, 92, 78,169,114,109, 18,171,185,140,239, 58, 76, 49,106,250,153,233,210, 37,171, 15,252,206,166,123, 54, 5, 77, 65,
- 9,130,247,246, 26,146, 77,199, 14, 73,148,172, 58, 77, 19,198,105, 66, 23, 60, 28,116,247,158,134,168,206,120, 78,167,100, 71,
-135, 94,140,234, 47,159, 82,130,239, 58,136,176,126,191,115,224, 44,112,222,166,120, 82, 66, 96,102, 64, 18,131, 88,109,104, 67,
-154,208,245, 61, 28,133,234,135,160, 13,129,254,115, 76, 25,222, 9,124, 8,250,236, 58,189, 91, 70, 1, 98, 98,196, 49, 66,114,
-194,186, 39, 12,217, 1,219, 59, 4, 79, 88,247, 29, 4, 1, 55,187, 17,121, 28,112,222,123,208,249, 10,193,123, 92,108, 86, 88,
-159,159, 99,226, 0,146, 8,136, 54, 62, 18,213, 57,142, 68, 37,207, 83, 22,120, 30,224,131,174, 60, 84,249,199, 74, 26,244,132,
- 40,134,242,146,104,209, 30, 21,117, 32, 7, 68, 4,112,154, 48,229,132, 56, 14,122,253, 21, 6, 84,185, 36, 3,194,172, 81,179,
-142, 64,226,170,236,174,172, 71, 71, 56,132,200,248,161, 79,184,121,127,141,171,219, 31, 97,245,245, 43,128,118, 0,173,148,199,
- 67,167,247,210,212,236, 89,171,195,104, 51,142,138,224,180,231,246,193,185, 34,223,186,176,255, 18,211,250, 61,108,189,192,165,
-251,177, 66, 86,108, 46,133,200,252,207,219, 32, 19, 89, 64,113, 37,169, 43, 31,139,110, 17,234, 6, 67,108,242, 47, 7,186,202,
-219, 50, 73, 3,105, 23,230,253,204,134,119,102, 30, 83,138,107, 53,102, 41,135,142, 65,245,115,167,197, 54, 25,187,133,142,182,
-157, 60,185,249,125,212,216,111,230,123, 36, 59,165, 99, 19,154, 93,244,168,105, 6,138, 30, 31,142,102,190,177,180,191,179, 25,
-215,105, 54,132, 88,233,162, 31,187,198,224,164,232,241,107,246,119,153,134,203,116,148, 35,182, 73,185, 12,238,192,242,182,133,
-170,185, 65, 32,244, 71,243,145,162,187, 68,112, 22, 93,251,236, 0,183,244, 70,119,102, 77,250,114, 24,171,132,177,222,216,222,
- 99,179, 62,195, 59, 93,198,213,152,144, 1,172,137,208,133,128, 56,237,241,233,103, 91,144,247, 8,158,170, 85,172,216,135,233,
-137, 14,100,130, 50,199,126, 10,142,138, 85,187,135, 47, 44,127,221,185,115,109, 68,239,109, 1, 78, 25,197,223,183, 54, 94, 72,
- 51, 27,233,162, 49,100,153, 85,126,244, 38,247,183,194,126,111,157,221,150,127,135, 17,186,222, 14,109, 66,215,117,184,187,189,
- 1, 14, 3, 51, 14,214, 45,135, 12,131,183,114,212, 59,244,131,111, 20, 45,199,139,126, 57, 90,139,220, 47,129,179,231,188, 95,
-225,179,207, 62,199,221,237, 13,206,207,207,112,117,245, 18, 49, 69, 60,121,242,126, 67,222,116,216,238,110,209,119, 29, 54,155,
-141,230,158, 39,133,149, 41,120,189, 14,222, 35,120,135, 24, 7,101, 53, 91, 17,157,166, 9, 49,170,151,185,247, 14,227, 56, 96,
-138, 81,117,202, 57,129,200, 97,216, 39,188,186,126,133,135,143,159,192, 21,246,183,192,238, 15, 45, 96, 41, 39,245,223, 7, 48,
- 24, 41, 45, 4,133,141, 57,103,220, 13, 3, 94, 94, 93, 99,154, 6,115, 3,156,155,226, 44, 2, 98, 70,202, 90, 44,201,147,106,
-214,133, 48, 77, 9,227,160,141,137,238,118,245,148,152,178, 97,127, 44, 32, 18, 4,215, 89,246,187,194,239,206,246,214,217,200,
-166,222, 7, 51,223, 81,185, 90, 49,132,201, 57,107, 99, 82, 94, 77,210,231,121,138, 12, 55, 70,221,231,119, 1,112, 65, 9,239,
- 54,145,172,130, 3,204, 63,191,239, 60,146, 56, 80,142,250,140, 57,192,247, 1, 64, 48,164, 15, 96,214, 79, 62,187, 30, 47,110,
- 19,166,184,135, 23, 70, 23, 8,222,143,184, 88,123, 12,114,166, 43, 5,243, 4, 73, 65, 97,115, 50, 31,126, 7, 49, 2, 32, 48,
-230, 9, 97, 18,100, 10,112,204,232,123,135,236, 86,144,172, 77,150, 14, 96,222,228,184,170,148, 16, 2,178,100, 36, 34,196, 36,
-112,204, 32,239,145,216, 1,105, 2,145, 32,137, 7, 39,229, 40, 80,112, 96,246, 70,182,149,138,244,101,139,221,221, 8,240, 27,
-235, 17,255,228,251,151, 72,187, 31, 33,236,254,239, 10,195, 47,140,201,234,211,229, 48, 59,112, 74, 67,168,251,118, 75,244, 67,
- 30,208,255,183,132,185,227,159, 30, 52, 83,184,120,160,183, 44, 39,131,162, 85, 68, 48,243,191,139,101,171,237, 13,125, 61,122,
- 74,128, 69,145,161,205,233, 96,206,116,201,177, 56,183, 53,135,109, 57, 35,184,248,146,211,156, 4,110, 28,252, 10, 29,207, 94,
-217, 5,158,158,101,101,153, 58,245,129,207, 12,231,128, 78,227,161,234,190,190, 64, 43,229, 67,227, 50,121, 46,252,206, 77, 47,
- 79, 51, 83, 84,154, 29,166,190,143, 37,146, 80, 30, 92,161, 99,197, 99,185,222,188, 48,111, 97,140, 25,166,183,167, 37,201,237,
-112,162,196,220, 56,149, 8, 74, 52, 36,183, 83,214,163, 34,154, 30,182,144,144,181, 26,123,106, 89,244,179, 31, 58, 9, 0,103,
-106,134, 98,113, 90,154, 32, 57,140,145, 37, 16, 11,120,218,225, 23,187,136,200, 14, 43, 15,140, 6,157, 19, 17,224,252, 50,120,
-166, 97,133, 37, 41,225, 47, 56, 8, 42,145, 69,241,160,166,249, 42, 36, 55, 2,208,119, 1, 62, 16,132, 29,166, 41,213,194,190,
-136, 49,165,166,101,126,141, 56,119,201,103,107, 61,177,181,164,167,204,184, 92,175,241,187,191,241, 3,252,236,243, 47,241,243,
-175,175,176,233,187, 95,142,253,110,183,238, 20, 39,124,240,228, 25, 30, 61,184,192,167,159,126,138,206,187,165,212,232, 4,114,
- 33, 7,175,207, 78,210, 58,177,159,162,212, 45, 28, 69, 10, 92,127, 64,248,163,163,133, 84,129, 25, 79, 19, 3,231,207, 67,191,
-119,189, 94,227,171,175,190,194,171,171,111,112,241,232, 25,136, 28,190,121,121,133, 56, 77,120,240,240, 49,200,121,156, 93, 92,
-160, 95, 91,118,247,229, 3,157, 30, 59,133,150, 87,235,141,122, 45,228,132,171,171,107,124,252,201,199,184,185,185, 65, 23, 66,
-125, 70,245,160, 86, 54,166,134,170, 56,228,100, 9,112,193, 97, 24, 39,220,221,222,234, 32, 80,226, 91, 83,174, 4, 79, 22, 32,
-166,164,210, 58,102, 76, 83,196,170,247, 8, 33,224,250,246, 22,211, 56, 97,138, 17, 57, 43, 2,144, 51,207,142,128,128, 73,243,
-116, 66,244,228, 0, 71,216, 15, 35,192,192, 48,105,177, 33,231, 20,254,182, 34,236, 64,166, 99, 87,226,158,230,194,107, 86, 59,
-145,102,147, 59, 86, 15,121,182, 80, 24,102,221,157,107, 80,140,106,236,153, 51,156,173, 38,156,101,154, 67,204,165, 51, 51,130,
-153,230, 16, 71,136, 35,164,148,225, 29,193,245,125,149, 12, 79, 49,131, 89,117,222, 36, 25,253,170, 7,195, 3,156, 64,150, 79,
-208,145,224,108,179,130,116,107,196,253, 30,193, 19,128,206,172,126, 9, 99,118, 72, 35, 67,134, 65,207,124,231,224, 36, 99,181,
-242,232,186, 53, 50,121, 56, 97,184,224, 53, 38,214, 72,196, 68, 17,174, 11,216, 77, 14,156,110, 32,164, 1, 45,171, 14,128,119,
-144, 76,240,196,136, 0,226,126, 2,241,136,148, 5,148,148,201,229,145,193, 14, 96, 9, 64, 30, 21,194,103, 70,240, 86, 33,148,
-108,161,164,224,156, 33, 57,219,189,239, 48,102,224,169, 99,124,255,209,132, 63,127,246, 62,252, 71, 95,131,248, 51,192,109,106,
-102, 69,211,193, 87,101, 79, 13, 22, 43,134, 92,243, 67,113,210, 2,251,190,153,155,126,149, 90,253, 54,211,250,209, 51,106, 41,
-109,222, 43,227, 16, 44,200,162, 55,141,199, 44, 29, 19, 97, 35,155,185, 2, 8, 67, 36,171, 33, 13, 60,146, 39,147,148, 21,120,
-218,129,156, 84, 54,122,221,223,214, 2,221, 64,195, 92,228, 90,109,124,165,185,158,149,125,109, 93,190,179,237,145,231,213, 0,
-140, 80, 7,206, 64,255, 3,184,239,247,248,193,244, 83,108,159, 11,174, 69,137,121, 1,179,229, 40,159,112, 57, 19, 89,146,161,
- 0,245,171,159,153,222, 12,225, 57,187,154,218,176,154, 69,241,150,197,134,184, 53,245, 56,164,132,101,161, 99,151,181, 83,148,
-202, 74, 90,155, 27, 39,162, 89,167, 47, 75,178,186, 66, 92,225, 12,171, 14, 72,227,222,144, 23,106,108,125, 79, 64,169,198, 98,
-103,114,240, 78, 59,112, 33,157, 16, 88,102,206,192,209,171, 19,198,126,210,207,187,115, 51, 89,174, 52, 9,143,214, 29,114,206,
-184,137,169,126,182,179, 7, 74,145,226,201,107,225,235, 2, 93,207, 27, 6,133,171,157,193, 16, 26,137, 9,112, 90,174, 66,138,
-164, 17, 36,245,202,241, 61, 15,198,236,188,214,154,238, 96,177,210,185, 92,117,120,188, 9,248,153,228,183,122, 84,219,157,122,
-235,215, 95,126,108,215,245,184,125,117,133,225,238, 21,246,163, 58,178,221, 23, 18,211,150,221, 83,156, 4, 58,130,202, 15,109,
- 68, 63, 12, 52,177, 0, 0, 32, 0, 73, 68, 65, 84,151, 16,197,241, 30,126, 89,232,219,200,158,215, 18, 3,109, 61,177, 94,245,
-248,250,197, 11,124,250,209, 47,240, 87, 63,252, 77,124,243,205,215, 8, 97,133,219,237,128, 7,143, 28,126,248, 27, 63,194,126,
-191, 3, 4,232,215,107,228, 20,177,223,222, 97,183,223, 33,167,136, 24, 7, 12,195,128,187,187, 59,220,220,110, 49,216,181,216,
-238,246, 74,178,202, 42, 43, 75, 41, 35,101, 37,158,229,148, 45,132, 69, 37,101, 49,101, 92, 93, 93, 97,123,119,139,205,249, 67,
-184,224,205, 81, 78,155, 0, 1, 35,197, 50,241, 10,114, 78,184,187, 27,145,179, 22,122,103,172,245,113,140,106, 48, 83, 80, 22,
-219,179, 67, 8, 49,235,247, 22,130, 29, 39, 13,138, 73,156,112,182, 89,219,148,152,213,173,142, 21,133,200,162, 7, 44,145, 83,
-135,196, 78, 25,230, 53, 55,126,102, 34,105, 38,188,179,113, 70, 8,142, 20,138, 15,193, 89, 49, 22, 67, 16,184,162, 93,112, 78,
-249, 2, 32,228,100,161, 40, 68,112,125, 0,231,164, 4,187, 16, 48, 37,134,128, 17,186, 0,208,170,174, 35, 88, 28, 28,171,100,
-111,181, 10,232,214, 27,236, 71, 86,253,184, 91,169,148, 47, 16,186,190,179,148,180,217,208,104,202,162, 10, 5, 36, 36,100, 76,
- 41, 99,237, 51, 2,173,213,239,160,235,144,132, 16,144, 17, 25,184,219,143,232,120, 68,232, 2,216, 7,140, 19, 33,184, 1, 9,
- 14, 49, 69, 48, 50,134, 72, 24,135, 9, 46,239, 65, 93,192,152, 61,144, 34,250, 32,216, 82, 0,199, 61, 64, 9, 68,198,193,176,
-152,220, 8,168,236, 81, 50,188,176, 25,143, 1,145, 0,151,128, 95, 11, 17, 47,159,173,113,115,253,235,232,175, 94, 2, 46, 2,
-232,234,144,135, 3,155,248, 37,231,107, 89,252,103, 52,249,112,138,248, 46,118,232,111,192,239, 79,235, 86,143,100, 52, 65,164,
- 68,136, 54, 30,240,152,245,233, 98,240,140, 50,215, 25,130, 14,222, 63,132,248, 29,124,154,144,179,154,142, 56, 19,197,177, 40,
- 4, 20,156, 96,101, 50,167,212,192,216,190,217, 97,123,243, 14,231, 66,148, 43,251, 75, 89,250,150,207,220, 96, 13, 31, 17, 33,
- 51,139, 41,133, 54, 0,249, 27, 96,235,177,246,132,232, 76, 71,111,122, 75,129, 51, 47,248,217,228,164,185, 63,103,136,205,184,
-179,100,143, 27,224,209, 57,129,103,198,128,165,238,155, 22,147,235, 44,129,163, 67,137, 68,153,190, 23,110,165,114,154,113,221,
- 76,115,237,132, 42,198,115,208, 24, 75,187,209, 56, 87, 63,114,135,185, 33,130,115, 56,239, 9,219, 73, 48,178,155,119,206,116,
-168, 78,178,107, 42, 11,178, 66,245,244,102, 44,153,217, 51,148,106,196,187,133,222,117, 94,204,151,182, 41,230, 92, 21, 2,139,
- 84, 62,105, 16, 14,121, 3,124,181, 88,207,232, 29, 42,194,200, 41,163, 51, 70,115,182,155,165,149, 25,210, 98,242,156,131, 77,
-218,162, 88,180,206,108,113,192, 82, 82,244, 26,216,154, 0, 4,231,112,125,183,195,255,252,143,255, 12, 55, 83,194,102,213,189,
-214,180,227,200,206,246, 68,126,174, 39,135, 49, 70, 12, 83,137, 85, 93,194,225, 75, 46,188, 28, 79,209,167,154, 31, 57,104,104,
- 22, 75,192,215,199,205, 46,133,134,109,204,210, 27,142, 38,210, 41,118, 63,101,252,252,103, 63,199,239,255,117,135,190,235,176,
- 90,173,112,113,113,137,179,205, 25,118,119,175,112,115,115,141,119, 30, 63, 1,199, 9, 47,191,121,142, 97, 80,219,208, 97, 24,
- 48, 12, 59, 45, 90, 32, 56,167,211,243, 52,106, 38,121, 74, 73,167,116,182, 34,142,162,231,230,250,242, 98,210, 9,254,234,234,
- 6,207,191,122,142, 15,127,248, 0, 4,130,183,181,207, 56, 77,152,166,201, 10,120,172,255,159, 51, 87,120,158, 82,214,221,127,
-140, 32, 82,254, 68,201, 9, 96,139, 5, 13,193, 65, 68,201,117, 98,134, 58, 83,154,208,247, 29, 88, 8, 28,213,200, 38, 78, 9,
-193, 43,135,199,145,201,196,234, 42,198,214, 97,164, 40, 68,223,105,113,234,130, 3,249,174,146, 68, 75, 40, 16,185, 18,131, 77,
- 16,226,218,200, 23, 67,160,206,154,199,108,107, 5, 88,195, 43, 68,136,153,161, 17, 1, 17, 14, 64,232, 60, 86,125,135, 36, 74,
- 80,212,230, 68,155,153, 46,120,149,189,177,142,114, 93, 8, 26,207, 74,140, 85,223,193,119, 43, 99,241,151,238,218,161, 3,163,
- 91, 7, 0,218,116, 0, 64,100, 32, 15,123,181,251, 77,163,114, 38, 50, 67, 82, 70,176, 93, 58,239, 7,184,206, 33, 38, 2,113,
-196,200,130, 52, 37,172, 93, 70,244, 61,118, 35,176, 33,163,103,231, 12, 38,103, 59,249, 4,134,211, 64, 49,175, 25, 32, 46,235,
-192,201, 89,224,136,213,239,157,169,121,132, 5, 17,130, 51, 56,124,120,145,241, 39, 31, 60, 70,222,254, 0, 62,253, 4,240,161,
-174,124, 91, 18,110,225,212,204, 1,156,212, 36, 41, 54,134, 96, 39,168,205,120, 61, 40,248,237,138,253,137,191, 40,111, 98,200,
-149,157, 58, 42,243,155,106,132, 31,139,238,211, 59, 18,115, 22, 34, 36, 51,121,113, 2,100, 90,129,207, 24,151,110,194,230,150,
-241,205, 8,164, 10,157, 55, 21,161, 30, 25,198,156, 23, 84, 93,117,185, 96,190, 72,172,100,206,229,214, 2, 69,149, 96, 85,224,
-249,226, 75,222,184, 96,171, 71,176, 39,120,108,129, 23,140,159,178,131,116,133, 11,208, 16,216,236,119, 23, 19,156,214,231,154,
- 76,243, 13,219,117, 41,147,155, 17,133, 43,114, 0,115, 99,115,173, 54,190,176,227,105,185,141,164,134, 29, 95,238, 20,119, 32,
-148, 40, 19,162,158,181, 60,155, 63, 16, 78, 76,250,114,130,164, 52,135,129,148, 63,222,123, 32,238,112, 29,245,209,247,214,144,
-149,141,147,175, 5,185,205, 77,151,122,211, 22,166,118, 57, 72,102,115,148,198,156,162,209,151,211,162, 8, 45,239,197,109, 76,
-245,112,154,107,190,153, 12, 53,119,191, 0, 39, 77,110, 14,111,224,154, 19, 79,154, 51, 94,236, 59, 79,181, 71, 39,141,243,113,
-236, 19, 80,211,207,228, 96,162,165, 37,169,109,159, 53, 58,183, 51,168,178, 45,170,204,162,211,220, 61,187,117, 58,100,184, 91,
-239,234,141,140,122,114,119,125, 72,106,196,125, 6, 25, 56,189, 31,135, 28, 93, 3,122, 93,142,252,161,201,140,188, 97, 74, 63,
-240,107,234, 87, 27,252,248, 39,127,134,221,237, 13, 30,189,243, 46, 82, 26,145, 57,225,249,215, 95, 97, 24, 6, 92, 62,120,132,
-187,187, 59,188,120,241, 28,156, 25,206, 7,196, 41,218, 13,172,145,167, 34,130, 96,113, 68,227, 56,129, 57,207, 41,130, 54, 77,
-138, 49,196,139,220,213,145, 7,131,209,117, 1,219,237,136,235, 23,223,224,195,127,230,135, 16,116, 72, 73, 37,110, 2, 96,154,
- 34, 82,212,212,180,113, 28,244, 51, 11,190,174,206, 98,102,100, 97,179, 47, 22, 51, 65, 82,152,124,156,210, 12,137,231,140,148,
-178, 66,249,227,164, 30,243, 46, 32,229, 12, 78, 25,227, 52,214, 21,158, 19,160,235,131, 21,117, 58, 50,137, 34,211, 72, 59, 43,
-222, 58,120, 59,120,239,170, 18, 64,207, 30,130,239, 93,189, 87,179, 64,101, 97,142, 32,100, 69,185, 11, 21,205,116,142,106, 51,
-145, 5,136,153, 65,156,213,118,119,154,224,193,232,214, 43, 76, 19,208,121, 66,223,245,128,119,216, 14, 35, 60,180, 48, 70,209,
-117,192,122,189,210,157,118,142,230,160,167,150,180,137,163, 54, 18, 69,174, 39, 0, 36, 99, 20, 93, 47, 22,174, 64,105,192,122,
-175,100,196, 41, 49, 2,101,136,235, 32,156, 32,228,244, 51,118, 14,123,238,224, 36,161,119, 14, 73, 60,242, 84,172,120, 73,155,
- 2, 39, 24,157,199, 20, 29, 58,137,240, 65,144,176, 50, 51, 32,149, 43,178,168, 12,142, 44,136, 74,201,115,122, 15,188,239,129,
-231, 79,128,175, 94,254, 0,254,203,175, 0,119, 11,193,234,232,168,144,230,127, 16,100,174,105,213, 48,140, 94, 3,127,191,206,
-104,246, 87,231,201,211, 41,205,208,137,103, 58, 20,153, 24, 8,182, 63, 1, 60,207,133, 64, 68,195, 91, 68, 84, 70,224, 48,129,
-166, 47, 64,215, 30,251,142,102, 90,186, 49, 31, 13, 29,135, 99,181,133,101,161, 69,127, 83, 33,240,102,183, 91, 38,205,229,110,
- 95,212,219,221,190,190,240, 37,174,218,237, 18,253, 42,112, 8,224,179, 75,172,187, 29,194,126,192, 46,105,162, 28,176, 12,184,
- 56,148,182, 85, 56,197,121,156,145,189, 87, 56,221, 27, 9, 35,102, 96, 44,210,176,131, 93,138, 44,179, 46,142, 15,239, 3,239,
-245,197, 52, 38,205, 44, 36,199,209,162,203,226, 61, 31,110,206, 89, 49, 17,154,161,120, 44,227,101, 51, 55,233,119,116, 48,177,
- 22,121, 14, 22,100,231, 58,157,102,225,185, 17, 59, 69, 85,147,251,148,221, 7, 60,128,194,174,110,111,124,107,126,220, 1,135,
-235,158,141,240, 2,221,106, 13, 35, 72, 4,197,162,128, 78,124,239,162, 93,104, 41,254,237,187,177,101,186, 8,176,222,108,144,
-210,132,113,140,115,212,110,129,254, 13,210,236,253,114, 2,103,102,244,171, 53, 30, 92, 94,226,250,234,165,186,233,181, 68,178,
- 19,153,240,139, 34, 76,244, 86, 40,219, 82,198,246,186, 99,226,160, 33,145,102, 71, 69,111, 64, 69, 26,235,103, 28,160, 21,114,
-207,223,111,129,150,139,203, 75,252,233,159,252, 41, 62,254,248,231,248, 11,191,243, 87,241,197, 39,191, 0,121,143,213,122,131,
- 71,239, 60,198,126,187,197,167,159,125,166,141,165,243, 0,205,211,183,119, 14,108,254,235,195, 56, 98,191,221,131, 57,163,239,
-122,140, 99,196, 52, 89,129,119,128,100, 69, 11, 57,243,236, 77,110,113,156, 62, 4,124,252,201, 39,248,224,251, 31,224,123, 63,
-252, 45,147,137,101,228,152,144, 98,174,118,175, 89, 68,139,125,108, 96,118,209,162, 46,204, 74, 58, 35, 77,123,115, 84, 66,100,
- 4,195, 16,145,162,194,237,211, 56,193,123,205,172, 87, 40, 94,101,109, 57,231,170, 32,241,101,226,182, 29,122, 33,193,149,102,
- 57, 4,111,100, 64,221,241,247, 43,130,247, 1,157, 15, 74,112, 43,142,150, 57, 85, 4, 20, 80,137, 41,133, 0,239,181,152, 58,
- 97,139,119, 38,147,216, 89,240,150,113,147,130,215, 53, 64,202,185,158,117,121, 72, 8, 62, 64,188,199, 16, 51,242, 24,141, 7,
-160,175,185,239, 28, 92,183,194, 20, 19,120,156,244,119,155,121, 84,204,106, 50,147,196, 67,114, 66,240, 0,195, 85,203,106, 71,
-192,148, 35,196,136,141, 68,132, 9,140,105, 74,240,121,132, 63,235, 16,217,193,179,131, 11,218,192, 56, 34,100, 7,140,145, 32,
-211, 8,231,148, 68, 71,146,103,217, 52, 3, 36, 25, 81, 4, 62, 1,171,144,145,156, 64,146,174,143,153, 2, 36,235,103,235, 73,
- 45,193,156, 53,141,145, 9,235,148,241,225, 58,226,234,131, 11,164, 87, 63, 64, 24,254, 31,192,203,145, 76,141, 14,158, 1, 17,
-156,208,159, 52, 17,219, 39, 9,165,175, 5, 34,191, 99,121,219,113, 72, 69, 72, 22,124,160,185, 45, 14,197, 54, 56,216,242,123,
- 78, 91, 99,211,131,151,131, 50, 99,218, 59,236,157, 74,150, 92,237, 36,171, 27,188,145,232, 68,165, 31,133, 93, 92,136,118, 50,
-179,109, 11,171,220, 55, 83, 33, 85,250,249,204, 66,244,237, 89,213, 20, 59,199,128, 16, 3,105, 7,144, 18, 75, 28,212, 14,182,
-181,253, 60, 52,229,175, 40, 0, 20,149, 40, 81,174,201, 46, 82, 0, 89, 99, 64, 7, 62,162, 88, 76,222,237,244,210,158,167, 21,
-160, 33,105,138,115,235, 84, 38,139,164,180, 58,197,222, 67,180, 16, 97, 51, 97, 64, 99, 74,211, 58,202,113,163,171, 87,253, 63,
- 73,241,181,159,147,217,220, 76, 72,168,126,241, 11, 4, 65,102,214, 60,209, 12,202,206,249,234,135,211,236,233,187,180, 52, 93,
-181,165,144,217,254,182, 85, 8,200,169, 73,250,158, 14,181, 78,215,116,186,152,207, 69,115,254, 34,159, 48,119,107,137,128,156,
- 84,151, 76, 13, 23,159,222,100,227, 75, 74,244, 74,113, 60,250,185, 68, 14,143, 30, 61,194,246,238, 14,251,253,160, 68,166,249,
- 35,158, 25,251, 39, 60,163,233,164, 36, 19, 71, 61,250,177,188,229,196, 7,113,208, 53, 29, 53,151, 21,101,146,134,163,130, 35,
- 78,135, 28,172, 79, 42, 33, 88,180, 72,223, 92,125,141,247, 63,120, 15, 23,239, 60,129, 39,135, 39,207, 62,208,248, 82, 8, 98,
-138,120,241,226,133,238,223, 55,107,248,208, 97, 28,246,112, 94,247,204,128,158, 63, 49, 70,133,219, 49,147,227, 96,249,231, 69,
-119,158,133,145,114,170,177,205, 19,103, 68,131,126,125, 8,216,222,238,241,227, 63,253, 19, 60,253,224,251, 16,242,152,166,136,
- 56, 77, 22,240,210, 26,200, 8,146,186,151, 64, 64,136, 49,105, 49,176,253,247, 56, 69,196,148,140,152, 74,154, 10,153,181,104,
- 79, 83,132,243, 78, 35,102,129,170, 83, 87,102,125,225,122, 64,181,248,110,142, 23,246, 65,109, 79,139, 45, 43,108,103,175, 95,
-243,117, 21, 70,166, 33,207, 89, 87, 7,142,148,148, 22,188, 83, 29, 57,160, 28, 0,139,132, 45,205,100, 8, 30,112, 30,204,138,
- 50, 56,175,121,239,186, 78, 99,164,236,204,156, 71,176, 94,245, 32,223, 33,197, 8, 56,216,174,158, 64, 22, 37,171, 71,128, 71,
- 76, 12,176, 94,163,156,213,193,141,200, 33,145, 3,179,174, 33, 38, 22, 56, 47,138, 2,250,128,253,148, 64, 57, 89,211,226, 32,
-112, 70, 84,140,112,146,193,220, 21, 49, 34,212,200, 83,144, 9, 72,160, 57, 1, 15,100, 65, 60, 25, 41, 70, 72,142,186,194, 21,
- 70,231,213,149,110,204, 12,102, 93, 45,120,239,212, 50, 86,138,108,218, 82,253,156, 0, 62,128,197, 35, 50,227, 17,103, 60,123,
- 48,225,211,199,239,195,127,254, 5, 32, 47, 1, 90,191, 65, 18, 51,163,140,109,158, 39, 53,161,101,135, 83,115,219,248,126, 39,
-245,250, 62,134,239, 61,169, 83,129,157, 83,253,179,148, 28,113, 50, 9,134, 62, 56,201, 92,225,218, 29,103, 54,220,215, 57, 54,
-216, 30,117, 42, 22, 59, 68, 65, 82, 37,113,190,250, 11,235,241,145,176,148, 45, 17,230,160, 17, 45, 64,124, 36,170,209, 4, 50,
-215,184,185, 53,251,209, 82,132,242,128, 24,129,209, 57,211,133, 54,164, 6,243, 96,103, 34,235,162, 27, 19, 27,154, 67, 94,226,
-129,199, 53, 31,236, 53, 91,110,130, 28,206,170,210,134,165,232,164, 47, 66, 7,107,131,153,201,221, 90,193, 82,147,204,114,228,
- 46,102, 56,248, 2, 66, 61,178,172,109,140,131,154, 29,107,105, 50,170, 83, 96, 37,148,153,131,189, 52,133,188, 20,122,131,187,
-229, 72,246,113, 98,140, 22,185, 23,101,168, 82,197, 54,249,112,113,255,157,214,231, 31, 18, 25, 15,239,109,126,163,140,100,102,
-246,147,247, 88,247, 29,198,105, 92,120,208,180, 63,115, 24, 71,180,134, 73,139,168, 19,185,191,168,167,148,112,117,125, 13, 95,
- 92,194, 26, 68,104,191,189,211,233,199,209,113,161,118,110,177,210,168,223,119, 82, 7, 78, 71, 75, 10,185,239,221, 31, 70,205,
-190,129,161,223,102, 10,157, 12,187,104,254, 62,139,128, 14, 62, 96,231, 8,215,215,215,120,242,244, 93,252, 55,127,248, 15,241,
-206,227,119,113,245,226, 75,172, 86, 43,172,194, 5,198, 41, 98,183,187,195,163,135,143,112,182, 57,135,243,132,245,106,131, 23,
-223,188,192,203,111,190,134,247,132, 56,149,105, 92, 11,220,122,213, 99, 20,198,221,205,132,113, 24, 20, 65, 20, 27, 40,114, 42,
-102,149, 74,204,172,146, 65, 66,112,138, 24,252,226,227, 47,240, 27, 31,255, 57, 62,252,139,255, 28, 4,192, 48, 78, 96, 43,188,
-133, 88, 88,124, 28,156, 33,112,228,128, 64, 30, 34,108, 86,170,133,235,160,186,116, 50,105, 89,204, 17,161, 11,139,169, 59,166,
- 12,206,185,105,232, 8,222,249,218, 32, 50, 11,156,167,106,115,237, 93,168, 62,239,206,235, 36,189, 89,175,117,229,201,217, 60,
- 67,148,249,238, 12, 57,149,134, 44,236,188, 51, 91, 93, 93, 65,244,171, 94, 11,184,125, 56, 93,112,106,146,227,200, 32,120,155,
-222,136, 0, 38,172, 87, 1,226,180,177,242,142,144,205, 69,114,181, 14, 32,175,110,123, 10,123,231,198, 96, 76, 85, 32, 61, 49,
- 66,223, 97, 63,101,164, 41,194, 65, 19,249, 74,129,155,198, 8,199, 9,171, 85, 15,129,175,124,136,148,141,192,230, 59,220, 13,
- 25, 36, 19,186,224,236,156, 71,125, 86,131,247,200, 80, 67,153, 82, 72, 25,132,152, 29, 36,141,232,156,128,200,155,219,165,131,
- 23, 77,215,115, 78,237,100,217,206,208,196, 2, 15, 86,165, 85,102,192, 17, 70, 33,172, 39,198, 15,250, 9,223,124,112,129,233,
-250, 7, 8,219,107, 72, 40,110, 40,111,168,175,141,105,205, 41, 15, 83, 89,252,165,111,225, 62,249,203,106,214,137,150, 44,233,
- 22,126,119,133,128,228, 4,129, 25,158, 29,152, 74,198, 74,209,126,211, 44,191,151, 37,129,206,134,233,198,199,221, 28,127, 68,
-224, 68,212, 98,182,198,187,210,108, 15,219, 20,220,114,227, 72,133,152, 78, 76, 48, 86,152, 73, 10,251,189, 77,215, 65, 37,147,
-137, 65, 64,109, 34,219, 60,249,183,243,207, 28,134, 66,182,187,201, 21,206, 55,184, 91,142,101, 82, 84, 18,230, 22,215, 83, 45,
-163, 10,100, 95,136, 93,140,227, 66,125, 74,115, 93,119,213,180,164,179, 83,129,154,155,104,206,130, 44, 56,135,170,227, 23, 52,
- 59,251,170, 61,167,133,250,114,150,111,105,226,222,250,236, 12, 30, 35,110,183, 35,156,243, 88,154,145,222, 31, 80,176,152,222,
-171, 79,191,156,242, 47, 91,148,160,226,236,183,188,109,151, 15,198,161, 20,228, 84,168,225,169,127, 71, 45, 81,144, 14, 8,124,
-156,205,223,224, 52,111, 93, 4,102,211,185, 44,114,111,245,232,145, 66,166,167,254,236,246,131,113, 10,230,229,115,202, 9,151,
- 15, 30,226,193,131, 75,124,249,197, 23,139,207,255,222, 53,205, 73, 60, 67, 78,179, 96,219,189,142,208,233,189, 95,221,251,208,
-220,212, 85, 36, 69, 78,160, 14,116, 74, 29, 7, 50, 9, 17,115,196,127,242,247,254,115,252,243,127,233, 47,225,167, 63,254, 51,
-236,135, 61,134,253, 30,231,103,103,120,250,222, 7,234,111, 46, 25,155,117,111, 41,108,140,199,143, 31,227,230,230, 21,134,155,
- 91,149,153,217, 46,152, 25, 24,199, 17,195, 56,128, 89,247,215, 57, 26,252,156, 53, 72, 37,155,203,154, 15, 78,215, 76,153, 76,
-182, 38, 70,124,116,248,232,163,143,241,189, 31,254, 38, 82, 76,186, 75,159, 34,146, 77,117,156, 21,190,239,122,213,104,111,119,
-251,138, 40,101,123,125, 5,146,103, 59, 0,198, 56, 34,199,132,205,217, 90, 17,128,113,196, 52,168, 86,158,138, 49,145,125,214,
-125,223, 41,103, 32,171,159, 90, 8, 1,222,185,202,252, 13,193, 27,255, 69,139, 81,215,117, 11,238,205,148, 82,109,100,187,174,
- 67,178, 64,153,148, 24,228,154,212,204,172,207,191,119, 51, 75, 91,236,236,212,198,113,206,199, 13, 68,160,222, 60,231, 29, 97,
- 50,107, 88, 34,135,142, 8,190, 95,213,243, 45,120,175, 70, 55, 57,153,146, 73, 63, 23,237, 37,188,162, 43,108, 90,111, 82, 72,
- 63,197,136,108,171,130, 62,104, 80, 77, 49,240,137,153,225,196,180,242, 76,160, 50,237, 39,129,247, 9, 25, 1, 57, 49, 86, 46,
- 35,154,217, 15, 33, 35, 51,129, 56,161, 8,171, 85, 77, 64, 72,211,132, 14, 9,174,235, 22,167,136,218, 79, 27,221,155, 1, 79,
-140, 44, 94,165,183,148,145, 51, 33, 18,227,161,120,188,119, 62,225, 23,239, 60,129,223, 61,178,105,125,117,239, 84, 76,247,184,
- 69, 44,161, 66,158, 77,209,154,201,254,117,205,245,119, 2,193,183, 57,216,109, 81,207,162,240, 87,201, 32,115,150,154,198,100,
-142,111,162,133, 52,217,163,239,154,195, 65, 4, 11,178, 83,101, 85,139,202, 53,136, 9, 25, 14,137, 72,151,247, 7,131,158, 52,
-249,222,243,180,171,200,128,151,165,214,125,222, 47,139,201,211,140, 0,103,213,149, 27, 79,117, 39, 75, 39, 46,215,192,237, 97,
- 33,219,153, 59,253,140,217,164,165, 20,124,110,138, 24,201,124,232,241,225,101, 20,149, 5,117,164,235,137,137,103, 97, 55,181,
- 48,185,233, 75, 75,167, 15, 35,226,145, 43,100, 62, 35,204, 57, 45,230,213,240,165,120,207,219,193,225, 90,152,184,108,126, 91,
- 55, 61,211,130, 22,219,220,210, 84, 56, 59,160,133, 4, 49, 14,250,142,205,166,178, 53,138, 61,148,119, 52, 54,253, 71, 85,149,
-238,209, 84,139, 28,228,204, 99,118, 45,107, 99, 14, 95,107,210,112, 96,156, 82,222,251,161, 6, 92, 22,255, 65,139,118, 66,178,
-152, 43, 24, 29, 35, 9, 7, 59,125, 58,224, 16,136,252,242,143,221,161, 67, 92,153,208,227, 52,226,238, 21,227,208,104,230,212,
-123,150, 35,118,197, 27,242, 95,229, 68,102,244, 41, 6,109,243,117,169,228,184, 3, 2, 67,245,143,144,147, 89,210, 2,224,230,
-230, 6,127,229, 47,255,101,252,203,191,247,123,248,234,139,207,209,245, 61,124,215,227,225, 59, 79,208,133,128,179,179,115,132,
-208, 97,140,147,122, 31, 24,100,220, 5, 13, 42, 25,198, 81, 89,220,125, 15, 17,193, 48,142, 42,101,203, 19, 24, 26,186, 50, 77,
- 81, 39,250,164,228, 72,101,182,187,202,112,119,228,224,140, 92, 27, 99, 70,191, 89,227,234,229, 53, 94, 93,189, 84, 98, 93, 74,
-136,147,106,158, 83,102,205, 78, 15,218, 4,239,247,131, 66,208,152,125, 34, 56,243, 12,227,230,172,126,238,113,194,217,217, 6,
- 33,104,145, 21, 40,235, 94,198, 60,223,107,162, 5, 59, 4,141, 80, 37,167,234, 10, 71,138,104, 56, 31, 10,111, 29,171, 85,175,
-103,145,215, 32,149,156,181,169, 9,222, 27, 33,184,184,173,217, 40, 85, 37,146,118,239,147, 83,214, 62, 8, 49, 49, 66,199,154,
-101, 95,166,121, 53, 78,215,123,222,123,116,190,200, 97,141, 56,203,113,150, 26, 23,242,167,157, 13, 33, 56,196,168,241,183,197,
- 89, 19,194, 42, 29, 21, 64, 56,155,125,116, 70,134,195,184,143,181,128,119, 94,239,217,148,216,226,108,129, 46,116,128,116,198,
-198,159,116,109,144,146,218,201,118, 14,226,231, 48, 40,206, 25, 49, 11, 56, 70, 13, 10, 35, 85, 43,119, 36, 64,231,145, 19,192,
-148, 81,163,192,200,169, 51, 99,206,154,232,232, 8, 83,240, 64, 86,207, 18, 71, 64, 38,205,172,135,100,140, 4,208,144,240, 52,
-100,124,241,248, 12,233,155,247,224,247, 87, 64,184, 95, 85,190,224,233,136,156, 24,114,154, 97,151,230,147,180, 32,193,203, 88,
-212,239,218,134, 70, 78,170, 84,130,128, 45,131, 28,224,106,130,100, 5, 92,104,182, 41,109, 15, 62, 57, 22,101,185, 22, 28, 20,
- 1,232, 28, 83, 16, 32, 15,170,129,167, 19,243,217,225, 25, 68, 75,155,211, 25,254,165,250, 69,103,137,108, 9,141,169,140,201,
-220, 10,169,174,152,206, 46,139, 78,101,175, 85, 24,187,245,157,147,226,167, 94,216,248, 40,230, 58, 77,227,210,176,209, 90,147,
- 18,125, 91,140,209,174, 75,133,205,120, 38, 99,149,221,139, 91,196,168,154,235,188, 52, 87,177,241, 34,164, 38,240,163,181,201,
-245, 7, 10, 2, 13,182, 56,224, 78, 31, 72,246, 90,254,147, 3, 33,199,136, 76,122, 40, 46,132,105,188,180,203,109,231,246,146,
- 57,207, 45,236,115,146,132, 37,243,254,181, 89, 89, 44,125,151,229, 36, 73,206, 29,162,251,205, 20, 75, 11, 44, 76,142, 30,174,
-121,175, 94, 18,217,168,162, 43,133,213,124, 56,225,207, 43,140,198,166,239, 59, 54,106,150, 42,101,243,152,166, 9,195, 56, 34,
- 56,255, 26, 81,202,129, 7,255,107,193, 60,121,253,103, 65, 75, 70, 98, 59,125,215,157,249, 97,238,188, 52,201,110, 34,247, 30,
- 31,211, 56,224,251,223,123, 31, 23,231,151,186,134, 8, 94,119,156, 36,240, 30,216,239,111,225,156,199,122,125,134,205,197, 3,
-196,164,241,166,251,221, 14,227,126, 15, 34,160,183,130, 62,165,169, 18,215,134,221,136,221,118,135,113, 24,225,131,241,109, 60,
-169,164,140, 51,200,121, 37,135, 17,129,157,161, 99, 89, 93,201, 54,235, 53,110,119,183,248,236,147, 79, 64,221, 57,182,219, 45,
- 24,185, 66,193,100, 59,228,113,156,144, 98, 54,196,129,193,156,204,236, 70,153,232, 41, 37, 12,251, 1, 83,156,112,126,182, 65,
-191, 90, 99,138, 89,115,223,179,154,204, 20,173,124,240,193, 96,121,109,144,203, 20, 94, 77,179,156,135,119, 30,125, 31,204,241,
-142,140, 53, 46,154, 88, 22, 28,130,239,205, 2, 90, 76, 17, 96, 30,114,198,140, 39,210,198, 6, 4, 4, 71,232, 86, 74,232, 43,
-241,169, 1,172, 36, 59, 82, 38,188,247, 30, 33,120,116, 37,218, 54,179,173, 17,180,224,122,231, 16,186, 14,137,141, 45,109,171,
- 39,206,102,193, 42,192, 52, 77,139, 19, 59,139,162, 36, 49, 50, 2, 49,152, 28,166,148, 17, 40, 35,116,157,238,207, 89, 79, 95,
- 61, 43, 92,253,157,201,114,235,147, 16, 56, 37,116,158, 48, 49,128,172,211,248,148, 1, 65, 68,202, 48,255,122, 93, 77,184, 16,
-180,232,179, 64, 56,194, 35, 43,235, 31,172,196,108, 22, 56, 36, 16, 5, 56, 2,206,130,199,224, 86,112,201, 1,146, 52,119, 61,
-155,204,208, 5, 76, 44,184, 20,193,211, 7, 25,159, 62,122, 6,183,255, 12, 36,119, 0,245,184,207,220,245,148, 13,196,242, 12,
-105,182,237, 21,209,109, 21, 70, 77,147,254,203, 20,248, 83,231,209,107, 6,142,160, 15, 4, 35, 91, 40,138, 55,194, 6, 19,208,
- 17,180,176,131, 43,249,173, 49,211, 91, 28,140, 84, 53,211, 70,186, 91,189, 3,126, 79,240, 91,254, 75, 60,248, 34,227,159,236,
- 29, 6, 39,213,216, 70, 11,182, 91,156,161, 84, 29,235,168, 78,195, 84,225,219, 2,245,211,193,185,219,184,165, 45,176,122,179,
-154, 21, 65, 2, 53,129, 49,237,234,112, 46, 62,133,196, 39,181, 8, 45, 39,226,249,192,148,202, 30,175,141,131, 44,181,210, 5,
-197, 40,206, 68, 37,254,181,132,199,156, 58,194, 51, 11, 92,183,198,166,119, 72,195, 14, 19, 19,252,204,184,131,147,101, 19,116,
-152, 79, 55,107,204,231,198,230,176,251,116, 77,183, 25, 10, 36, 8, 2,114, 68,204, 25,161,235,245,208,147,217,240, 69,236, 58,
- 74, 75,243,163, 6, 35,184,175, 50,181, 89, 33, 71, 76,209,211, 22,164,109, 55,220,118,197, 5, 26,166,251,162, 76, 1,172,131,
- 51,105, 82, 41,222,133, 50,171,236,192,148,179, 25,129, 28, 27,229,147, 28, 72, 16,133,126,165, 41,253,240,123, 99,156,224,157,
- 87,242,152,145, 81,229,181,207, 53,129, 78, 46, 24, 94, 39,116,193,172,151, 91, 52, 78, 75,180, 67,195, 66,120,241,189, 36,173,
-252,242, 16, 33, 57, 26,222,173,200, 56,236,118,123,220,221,221,194, 7, 77,234, 98,206,152, 98,196,110, 24, 16, 99,180,169, 82,
-176,238, 87,120,248,232, 29,120,239, 17, 99,196,215, 47, 94, 32,115,198,217,217, 6,142,156, 6,129, 36,221,175,111,111,119,184,
-187,185,211, 48,150, 20,205,207,156,172, 96,166,122,143,139,197, 65, 59,239,144,147, 22,102,149,188,169,217,201,207,127,250,115,
-188,251,244,253, 10, 15,151, 51, 35,165,132,105,138,102, 72,197,118, 15, 27,212, 14,157, 68, 99, 74, 90,244,115,198,230,108,131,
-245,102, 83, 57, 4, 49,171,209, 9,219,126, 59, 56,175,146, 50,117,142,209,124, 0,210,189,182,135,135, 15, 30, 33,104, 18, 27,
-168, 49,220, 22,253, 57, 42, 67, 11,149, 28, 88, 26, 46,201, 26, 7, 29, 44, 68,166,248, 62, 56,104,200,137,126, 6,172,147,182,
-177,227,189, 21,249,206, 19,250, 85,135,204,205,154, 40,120, 76, 99,182,176, 26, 70,191, 10,186,159,103, 37, 0,250,146,117, 96,
-230, 45,251,113, 2,210,136,208,247, 72, 73, 11,189, 18,208,212, 68, 71,208, 35, 77, 58,165,235,250,174,160,253, 90,208,189, 87,
-184, 61, 39,229, 75,144,168,244,211, 57,135,236,122,243,177,207,214, 8, 48,166,204, 10,249,219,197, 9, 14, 72, 8, 32, 78, 24,
- 89, 48,236, 71, 72, 26,225, 8, 72,222, 65,152, 0, 81, 87,193, 4, 7, 39, 17,189,215, 83,251,204, 39, 12, 20,144, 70, 64,242,
- 88, 93, 79,235,240,195,132,247, 66,194,243,199, 27,228,151,239,193,143, 55, 54,173,159,120,186, 12,217,164, 19, 3,201, 73, 41,
- 46,181,172,121, 57,150,166, 54,127,145,126,149,205, 59,181,175,101,217,110, 7, 50, 72,200,217,238, 54, 11, 0,202,117, 87, 75,
- 32,176,179,144, 18, 99,148,195, 44, 20, 43,196, 43,139, 64, 72,144, 19,240,244, 37,232,107,194,182,215, 14, 65,154,162,201, 52,
- 67,199, 84,200,101, 52,123,165, 83, 99, 11, 91,162, 88,185,157, 38, 15, 36, 82, 21,154, 47, 31,128, 20,239,248,134, 53, 95,167,
-205, 57,246,181, 85,255, 44,247,192,205,222,188,216,215,218,107, 43, 49,149,217,186, 80, 58,152,134, 22,133,238, 32, 75,189, 78,
-196, 60, 19,214, 74, 19,225, 0,128, 35,242,164, 80,153,163,165,223,183, 59,224, 69,184,230,119,205,208,114, 81, 17,204,135,251,
- 17, 1,237,192, 92, 92,120, 66, 56,127,140,135,103, 43,220,124,243,165,238,189, 12, 34,168,175,251,192, 66,216, 53,140,254, 99,
- 7,189,229,154,247, 56,138,252, 20, 17,203,161, 40,198, 50,161,154, 89,208,129, 4,141, 27, 46,194,225,159,204,178, 76,238,179,
-169,155,115, 66,183, 58,195,175,127,255,251,248,234,139, 79,176,221, 13,170,231, 95,114,244,127,101,117,233,125, 4, 85, 2,112,
-121,249, 16, 41, 37,196,105,172,190,228,175, 17,165,157,120, 29,111, 33,124, 59, 10,154, 88,250, 48,139, 40,169,201,121,135,113,
- 24, 15, 6,251,251,163,239,218,200,213, 89,178,235,112,245,242, 37,222,123,239, 25,126,255, 95,251,155,184,185,189,173,166, 46,
-194,130, 85,191, 66,232,122, 51,143,201, 72,204,120,254,245,115, 69,193, 50, 35, 9,112,126,118, 14,129,178,222,243, 56, 96, 26,
- 71,220, 92,223,224,246,246,182, 58,158,121, 63, 55, 11, 10,189,171, 69, 48,139,128,179, 6, 15,169, 29,172,121, 84,146, 64, 72,
-176, 90,173,240,242,250, 22,211, 20,113,249,240,145,218,183,138,182,194,147, 89,197,130, 14,214, 56, 2,164,164,178, 53, 13, 53,
-114, 88,247, 61,206,207,214, 32,231, 49,197, 9,193, 57,176, 87, 86,113, 8, 58,125, 7, 91, 37, 20,249,154, 39, 50,185, 91,175,
-238,113, 38,235,242,142, 16,130, 25,204, 20,190,143, 35, 8,147,177,183, 29, 88, 18, 60,233,189,204, 53,222,122,254,104,157,159,
- 23,149, 44, 98, 63,211,107,164,108,223,233,132,159, 50,156, 87,137, 89, 23,188,202,205, 82,172, 14,119,146,147, 37,188, 57,228,
-152,144, 19, 3,156, 0, 82, 9,177, 39,177,243, 7, 8,171, 30,112, 1,142,147, 54, 80, 4, 36, 33, 32, 37,100, 8, 56, 69, 43,
-240,154, 72, 87,100,129, 33,232,238, 61,217,250,195, 27,131,127, 72, 12,159, 71,136,115,152,146,128, 88,213, 14,146, 85, 74,171,
- 77,129, 98,238, 20, 20,146, 31, 19, 48, 14, 3, 28, 71,144,119,200,226, 16,179,170, 38, 2, 1,226, 29,144, 61, 58, 47, 16,172,
-244,186,176,160, 39,128, 59, 15,112, 15,230, 1, 41,171,229,172,247,132,140,128, 75, 2, 30, 93, 10,158, 95, 62,133, 31, 63, 7,
-100, 80,148,227, 36, 93,133,222,130,103,115, 64, 87,110,139,123, 99, 56,214,238,222, 5, 39,214,101,111,185,117, 95,182,253, 7,
- 59,117,154,163, 2,140,148,101,251, 13,154,137,102,186, 99, 47, 68, 53,237, 10, 51,205,185,211,121, 49,160,217,131, 34, 9,110,
- 39,248,236,214, 33,121, 77,107, 43,133,136,155, 93,177,111,109, 64, 23,132,227,214,131,123,134, 47,234,228,222,188, 23, 87,194,
- 80,154, 64, 74, 7,212,228, 56, 28, 48,167,233, 4,220,139,197,158, 29,139,137,128, 68, 14,124,221, 73,111,224,214,132,165, 64,
-247,141,126,188,194,168, 70,120,227,134, 24,197,141,179,157,254, 28, 53, 77,136, 73, 33,122,223, 20,237, 67, 83,184, 35, 78,212,
- 1,127,147,172,163, 47, 18, 67,180, 13, 69,133,231,117, 26, 77, 41, 99,181, 58,199,175,189,127,137, 31,191,252, 28,163,120,157,
-204,205,252,103,110,122,102,138, 52, 29,200,162,203,207,227,102,162,230, 6, 5,169, 36, 72, 67, 68, 78,234, 58,113,191, 95,178,
-220, 51, 1,183,107,155,201,166,156, 35, 18,185, 77,166,211,176,181, 67,156, 78, 23, 82,153, 71, 82,225,239,166,168, 51, 43,203,
-249,111,254,171,127, 29,207,191,252, 4,255,203,255,250,191,225,108,115,134, 35,231, 35, 57,181, 79, 95,174,135,238, 35,234,205,
- 68,204, 83,102, 20,203, 84, 54,206, 9, 57,183,235,163,226, 42, 72, 75,198,255,125,191,203,140, 82,174,190,121, 9, 17,198,255,
-240,199,255, 8,191,247, 7,255, 10,126,254,211, 31,219, 30,216, 1,208,240, 21, 16,208, 5,143,148,148,228,229,200,107, 44,105,
-231,209,145,102,141,199, 20,117,178,223,237,176,187,221,226,230,213,141,237,108, 25, 49,199, 25, 98,135,233,219,189,145,205,132,
-144, 37,195,121,194,196, 73,225,115, 81,135, 56, 79,154, 84,225,187, 14,175,238,118,216,238,247,216,172, 55,240, 93,111, 41,123,
- 4, 23,130,221, 11,186, 99, 79, 41,129,115,212, 6,217,171,126, 60,120,157,192, 11,140, 30, 92,176, 29,111, 50,159,118,169,174,
-148,133, 23,211,119, 1,171,126, 5,114, 14,161, 11,134,206, 56, 56, 23,116, 74,245, 78, 27,250,108,137,113, 32,116,171, 30, 93,
- 87,166,106,170,197, 51,244, 93, 69, 23,179, 65,254,206,163, 34, 80, 33,120,108,214, 43, 37,232, 58, 7,231,149, 85, 79, 36,240,
-222, 67, 72,189,225, 51, 39,112, 22,164, 52, 33,167,104, 73,112, 38,173, 51, 46, 21, 57,178,223,129,106,194, 19,156,141, 54,204,
-205, 67,106, 81,168, 49, 67, 36, 34, 56, 93, 51, 8, 8, 49, 1,200, 17,112, 14,121,138,112, 20, 1, 71,144, 12, 36, 88, 86,189,
-169, 22,144,116, 13,146, 68, 9,144, 5,117,241,100, 49,205, 62,128, 73, 48, 68, 70,220, 15,232, 92,130, 95,245, 96, 56, 76,137,
-193, 41, 35,144, 32, 18, 1, 41, 34,208,132, 40,106, 93,228,124, 7,134, 71,240,130, 46, 16,134,220,129,166,136,206,101, 16,249,
-122, 63,109, 68,240,189,243,140,151, 79,222, 65,126,245, 20, 62,253, 66, 93,230,240, 6, 64,236,219,100,157,183, 3,245, 34, 5,
- 81, 22,210,230,163,245,215,219, 44,244,228,126,187,106,149,163, 55, 95,103, 27,139, 11, 4,223,238,169, 21,150, 52,120,214,233,
-215,195, 76,175, 50,114,217, 76, 50, 98, 16,224,149,232, 80, 66, 73,138, 13,233, 34,209,172,124, 93, 80, 9,111,229,152, 97,110,
- 67, 96,150,161, 23,210, 16,231,228, 96,215, 92,244,240,220, 20,222,234, 67,210, 76,145,135, 94,247,100,147, 61, 99,217, 48,180,
-215,154, 91,210, 89,227, 20, 69, 7,197,181,101, 20, 23, 66,210, 41,178, 69,249,160,139, 49,197,108, 89,123,176, 75,110,102, 75,
-150, 54, 91,136, 22,157,155, 18,242, 14,118,205,118,119,149, 25,216, 27,235,121,189, 90, 35, 93,127,142,127,122, 45, 16, 9,232,
-156,189,247,197,238, 92,142,246,187,116,176,255,158,255,121, 70, 88,164,146,248, 48,103,170,179, 28,149, 15,102,214,221,161,177,
-147,241, 58,242,220,137,167, 70,108,255, 91, 63,147,106, 26,160,242,190, 28, 39,124,244,241, 39, 8, 93,167,100,164,102,178, 93,
-120,173,176,153,125, 56,247, 43, 76,231,243,254,218,217, 62,244,159,254,227,255, 19,195,184,199,170, 95, 31, 16,103,112,175, 21,
- 36, 45,124, 19,223,226, 34,208,145, 90,255,184,201,144,182, 89,152, 27, 86,224,245,142,117, 45,249,239,213,245, 43,176,100,252,
-247,255,227, 31,227,247,255,224, 15,240,201,199, 31,205, 18, 57, 22,147,106,121,213,109, 83,243,110,108,186, 45,215,200, 5,143,
- 60,142,184,187,189,193,246,246, 14, 47, 94,188,196,118,187, 53, 43, 82,133, 81, 99, 74,240, 54,181, 42,161,174, 83, 73, 88, 74,
- 72,156,173,152, 75, 69,211,196,118,199, 66,128, 15, 30,157,116,200,153,113,115,119, 11,111,105,120, 69,126, 88,236,129,115,210,
- 64, 32, 71, 14, 93,223,213,169,219,123,175,178,176,224,225,132,172,240,231,153,163,193,106,112, 82,154,238, 46, 4,248,208, 97,
-181,238,177, 57, 59, 71,140, 42,191,115,198, 32,215, 92, 5,189,247,162, 36, 56, 59, 41,250,190,211,209, 73, 52,136,165, 20,219,
-204, 17,125, 8, 90,104, 77,191,173,169,126,250,180,119, 94,217,255,142, 4,161, 87,247, 56, 97, 43,232,230, 12, 42,204,102,193,
-171,168,192,217,102,165, 12,242,152,230,225, 72,111,250,106,112,163,247,111, 94,116,219,100, 1, 41, 49, 37,117,130, 51,222,132,
-115,206,120, 67,186,167,167,114, 15,228, 12,120, 64,178, 51,197,131,190, 55,239, 28, 50,107,222,102,209,125, 19,105,128, 20,153,
- 39,128, 55,254,192,144,129,105, 24, 17,144, 16, 66,128,144,105,229, 89,221,229, 84,255, 46, 16, 81, 76, 53, 37, 65, 47, 17,107,
- 39, 32, 90,131,197,161, 35,129,172, 28, 38,108,128,184,135, 16,195,137,131,115, 2, 65,192, 35, 18, 60,120, 32,184, 58,127, 10,
-127,253, 57,202, 2,250, 62, 82,233,235, 74,184,220,247,228, 29,110,196,208,132,197,148, 32,153,111, 93,220,103,174,208, 41, 4,
- 33,148, 41,172,205, 41, 47,144,122,110, 24,213,190, 22,125, 88,183, 60, 23, 15,114, 75, 90,108,245,123, 98,177, 76,241,214,196,
-164,181, 11, 61, 17, 35,217,100,221,202,129, 86,186,117, 2,107,231,118, 87, 17,131, 86,159,222,146,237,104, 62,204,104,150,102,
-249, 58,245, 43, 92,239,155,242, 21, 22, 19,211, 18, 69, 40,205,129, 43, 19, 56,176, 48,101, 89,152,159,212,215,184, 12, 40, 57,
- 77,122, 62,158,207,232, 4, 33,113,110, 54, 96,166,129, 55,100, 99, 0, 0, 32, 0, 73, 68, 65, 84, 11,122,184,177, 61, 20,167,
-136,207, 44, 75,121, 20,215,230, 69, 59,147,196,106, 3, 89, 27, 26, 57, 86, 71, 75,147, 33,223, 94,223,186, 29,146,165, 12,171,
- 50,224,157,249,214,131, 76, 94,114,188, 26, 96,230, 55,113,187,223, 40, 47, 91,188,235, 3, 13,120,223,247,139,207, 83, 14,224,
- 6,177, 98,212,175, 87,170,143,254, 14,228, 38,133, 5,251,179,143, 62,130,247, 65,227, 57,223,128, 2,208,235,143,136,123,145,
-247, 35, 39,164,251,174,145, 28,170, 54, 80, 73,135,175, 61, 70,156,195,221,237, 29,246,251, 29,254,187, 63,252, 35,252,155,255,
-214,191,141,159,255,236, 39,216,237,118,234, 78, 6, 66,226, 12,114, 22, 39, 27,122, 76,113, 68,138, 81,167, 99,239, 84, 43, 94,
- 60,185,227,132,237,221, 45,110,174,110,149,173,254, 74,155, 5,141,100, 85, 68,199, 59,143,208,117,182,171,159, 52,203,124,229,
-212,130, 52,149, 9,143,235,231,167,125, 28, 43,243, 28, 90, 68, 28, 57, 35,183,101,108,183, 59,196, 56, 97,220,239,241,240,225,
- 67,132,205, 5, 32,106, 20, 35,208, 48, 35, 13, 61,209,137, 57,132, 0, 31,180, 72,146, 11,192, 36, 72, 9, 22,161,218,213,102,
- 98,181, 90, 33,116, 29, 86, 93,192, 7,223,251, 30,246, 83,194,120,117,165,247,188, 87, 86,123,223,245, 0, 17,178, 68,116, 33,
- 88,195,103,114, 65, 71,232, 93,135,152, 18, 56,114,117,218, 19, 0, 93,231,209,247, 29,200,193,138,184,106,209, 67,167,158,243,
-222,123,101,140,231,136,245,106,101,235, 83,129,179,188,139,110,221,171,199,189,217,182,194, 38,239,118,231, 91, 44,194,139,231,
-136,112, 82, 69,142, 53, 45,197, 8, 70, 85, 4, 25, 93,240, 32,167,171,132,156,210, 44,169, 99,181,188, 82,229, 7, 25,255, 90,
- 64,206,207,121, 6, 4,107, 16, 4, 48, 68,199, 57, 75,177,179,192,170,196,202, 55,240,142, 33, 8,152,146, 32, 80, 84,198,215,
- 76, 92,130,179,236, 1,161,128,148, 5,195,148,128, 60,162, 95,101,116,171, 53, 64,107,244,196, 64,239, 48,200, 6, 20,247,128,
-203,224,236, 16,211,132, 62, 17,158,116,140,235, 7, 15, 32, 55,143, 64,252, 53, 64,254,128, 4, 39, 11, 87,185,251, 10, 59,189,
-174,184,211,177,164,246,168,128, 83, 67,242,173, 7, 20,225,126, 87,142,251,255, 4, 97, 86,251,197,172,134, 6, 75,168,219,244,
-224, 37, 51,221,246,168,174,105, 96,184,228,207,202, 92,244,203, 68,198,173,233,137,180,242, 52,105,242,211, 21, 42,103,154, 27,
-135,234, 59,222, 30,194, 70, 60, 91,120,117,211, 76,165,171,183,103, 37,210, 45,103,146,242,218, 92,219,125, 81,147,101, 82,221,
-206,168, 49,164, 41,133,105,153,122, 69,237,190,152,168,242, 13, 68, 14,253, 0,104,177, 19, 94,232,142, 73, 78,232,175,105,249,
-115, 15, 8,112,197, 35,190,192,251,133,124,215, 38, 97, 51,150,112,125, 41,190, 14,173,201, 8,213, 69,137, 24,116, 81, 2, 48,
-248, 64, 78, 85,185, 8,208, 72,218,226, 1,144, 23,235, 3,243,204,110,136, 90, 85,174, 88, 53,209,250, 64, 59, 56,136,147,197,
-189,182,208, 69, 31, 60, 58,199, 15,136, 73,117, 42,234, 49,199,213, 22, 85,195,107,243,206,219,121,182,120,156, 19,192,146,177,
-234,214,120,244,232, 33,190,252,226,115,164,100,169, 86,223,150,229,126,226, 95,110,214, 27, 35, 97,201, 73, 82,250, 33,242,116,
- 2, 60,127,195,131,124, 98,244, 63, 21, 8,209,122,220, 11,189,245,214,158,156,195,110,187,197,171, 87,215,248,175,255,219,127,
-128,127,231,111,253, 45,252,244, 39,127,134, 97,191, 71,191, 94,227,225,195,199,152,198, 9,215,215,223, 0, 16,116, 93,143,243,
-139, 75,124,241,197,103,202, 7,105,100, 91, 83, 76,136, 41,226,238,230, 22, 87, 87, 87, 24,135, 1,219,221,174,134,169,164,148,
-144,140,188,214,247,189,182,159, 4,172, 86, 43,196, 24, 49,140,154,175,158,153,231,181,141,204,237,170,243,206,178, 1,216,166,
- 68,109, 86,179,157, 31, 41,101, 60,122,252, 24, 63,248,225,143,192, 2,140,195, 30, 49, 70,155,204,181,168,100,131,186,251,190,
- 87,171,212,156,107,244,105,240, 30, 28, 50, 56,139,134,215,108,214, 32,242, 88,117, 30, 63,252,225,175,227,242,209, 99,124,246,
-197,243, 90, 36,201, 20, 47,229, 28,235,187,206,138,182, 71,113,119, 45,208,185, 99,135, 16,212, 21,174,220,227,153, 51,188, 3,
-132,141,251,100,123,124, 31, 58, 56,102,116,157,199,148,196, 20, 76,130,174,243,128, 80,213,164,135,224, 49, 76,192, 20, 71,211,
-250,155, 47,131,152, 34,164, 78,232,176, 22,223,118,235, 16, 48, 49, 98,204, 22,128,147, 53, 42,183,211,253,127,137,133, 21, 46,
-215, 87,204,247, 93,175, 97,100,129,164,168, 65, 49,162,158, 8,106, 74,167, 77, 0, 25,175,200, 23, 4,199,200,118, 44,234,240,
-232,136,109, 96, 73,182,130, 0, 50, 74,195, 99,186,121, 27, 20,132,116, 40,203,142,176,205, 14,251,187,132,135,241, 6,225, 60,
-131,194, 5,122, 98,164,206, 33,231, 14, 73, 52, 4,202, 75, 70, 79,132, 39,171,128, 47, 30,175,176,253,230, 61,116,187,111, 32,
-206, 8,220,167, 24, 46,212,118,209,167, 32,248, 86, 43,112,252, 72,202, 41, 9, 48,205, 8,118,155, 29, 82, 17,233,147,126, 19,
-175,151,183,134,226, 44, 85,225,168, 38,128,197, 67, 77,127,152,176,112, 98, 42, 47,209,149, 67,182,228,155, 75, 59,213,181,197,
- 17,200, 85,130,182,244,110, 47, 69,124, 73,152,214, 73, 82,172, 8, 84, 3,147, 67,200,180,254, 60,169, 12,237, 90,128,105,214,
-189,139, 57, 71,185,166, 51, 37,123,207,138, 34,232,191, 79, 77,204,222, 50,124,100, 57,225,213, 64,148,154,112,214, 20,244,131,
-204,221,211, 58,108, 89,200,220,138,102, 29,205,132, 92,229,106, 80,146,205, 28,178, 34,154, 98,103,143,160,186,108,185,147,166,
- 45, 21,170, 55, 53, 65,203,145, 99, 44,141,105,168,216,247, 54,126,115,135, 66,117, 79,174, 58,145,249, 6,194,164,131, 6,111,
- 94, 81,160, 70, 88, 58, 79,102,212,193,213,116, 69, 26, 89, 26, 27, 3,217, 59,119,116,205,220, 65, 37,140, 41,161,235, 58, 43,
-148, 77, 99,193,120, 35,107,253,100,214,177,232,110,112, 28, 7, 60,255,106,143,208,173,176, 90,123,140,195, 30,167,197,228,175,
- 97,198,157, 90, 15, 28, 58,197,157, 42,232,114,160,145,127,219,206,124,225,173,127,210,182,239,222, 70, 64, 90,237,227, 61,215,
-141,156,195,126,183,195,171,235,107,252,189,191,255, 95,224,223,253,219,127, 27, 63,251,201,143, 17, 83,198, 59,143,159,224,236,
-236, 28, 57, 39, 12,195,157,218,130,138,194,197,195,126,171, 4,174, 85, 7, 22, 65, 26,246,154,221, 13,104,212,234,237, 45,238,
- 94,221,225,246,230, 22,195, 48,168, 71,131,193,196, 83, 76,234, 32,231,231,200, 81,111, 8, 64, 42, 19,103, 13, 30,146, 89,166,
- 71,115, 90,160, 50,239,237, 12, 48,135,182,148, 18,214,171, 30,239,127,239,251, 90, 92, 37, 3, 88,129, 28, 44, 1,209,233,207,
- 54,247,201,202,209,104, 8, 78,154,153,174, 38, 45,155,205, 6,253,106,133,148, 19,158, 61,123,130,243,203,135, 24,118,123, 92,
-158,159, 97, 26, 46,145,210,164,134, 50, 49, 1, 73, 37,119, 93, 65,107,136, 49, 37, 70, 23,188,242, 2,166, 73, 39,248,160, 78,
- 26,204,243,160, 80,120, 58,193,185, 26, 52,147,179,146,210, 8, 17,193,121,132,205,198, 20, 2,106, 21,157,133,209, 87,181, 67,
-210,117, 16,185,121,106,180,103, 47,166,108, 19,179, 65,255,162,249, 18, 41,179, 42, 24, 68,144,179,158,172,190,243,181, 48,151,
-144,154, 50, 89, 75, 78,170,255,119, 78,161,114,206,232,200,170, 4,103,192,105, 30,189,152,196,205, 53,237, 53, 11, 64,230, 15,
-144, 89, 64,150, 86,199, 34,170, 2,168, 73,105,170,109, 47,150,176,100,168,110,113,226, 35,232,234,101, 18,193,171, 65,240, 64,
-238,208, 93, 48,146,191, 64, 16, 65, 14, 14,121, 12,112, 50,168, 18,198, 57, 92, 58,194,179, 71,130,159, 61,122, 6,222,125, 10,
-146,107, 16,173,150,242, 51,106, 92, 64,223, 72, 96, 59,241,213, 3, 5, 9,157, 88,182, 45, 6,190,150,123,180, 96,221,191,158,
- 78, 59, 75,218,234,195,171, 80,178,151,178,199,182,105,145,164, 78,235, 76,213, 92,116, 46,176, 77,220,166, 84, 95,107,187, 65,
-154, 70, 96, 1,184,138, 78,125,179,145,202,172, 71,231,195,105,190,217,235,151,126,119, 97, 45,107,255, 89, 38,106, 33, 13, 99,
-161, 54, 73, 74,150,251,140,210, 52, 40,107,223,244,142, 53,248,132,106, 22,124, 70,107,170,211, 30,220, 69,239,190,212,108, 23,
-159,119, 1, 41, 73,207,184, 0,109, 72,141, 28,106, 32, 72,109, 42,169,194, 87,205,148,110, 44, 92,111, 38, 16,226, 52, 10,146,
- 27,121,154, 20,219,219,150, 7,112,240,177,251,195,137,221,162,117, 75,211,233,237,117, 4,231,213, 37,204,172,102,143,172,104,
-237,197,123,180, 68, 66, 28, 7,127, 28, 57,144,153, 79,245, 1,143,160,181,130,245, 62, 96,189,233, 49, 14,251,170,239, 63,212,
-161,115, 74,216,156, 95,226,221,139,115,188,186,250,198, 86, 6, 85,142, 81,209,131,215, 62,120,139,167,170,189, 73, 52,214,117,
-138, 17,143, 30, 93,226,252,124,141,175,246, 59,220,107, 18,243, 45, 16, 49,162,165, 10, 64,238,181,153,110,169,152,111,205,123,
-111,171, 78,189,187,193,199, 49,176,179,130,163,129,221, 95,147,222, 70, 68,152,134, 17, 47, 95,188,192,127,252,159,254,103,248,
- 15,255,206,223,193, 39, 31,127, 4, 23, 2,158, 62,126, 23,222, 57, 76,211,136, 87,175,174, 44,224,102,133, 56, 69,196, 56, 97,
- 24,246, 58, 97,101, 99,182, 24, 25, 75,192, 24,135, 61, 94, 93,223, 96,123,183,195,126, 24,144, 45, 39,221,123,103, 5, 68, 47,
- 67, 74,201,124,209, 81, 19,210, 84,191,173, 86,210, 92, 61,169, 81, 9, 93, 26,158,162,235,158, 98,199,154, 88, 97,125,206, 25,
-235,139,115,116,253, 10, 55,183, 55,154,180,214,117, 88,109,122,139, 88,101,244,125, 64, 48,200, 29,100,201,135,118, 63, 77,147,
- 78,245, 93, 8, 88,159,109,224, 66, 64,206, 9,143, 30, 92,226,221, 39,207,212, 67, 94, 4,155,245, 10, 79,159, 62,193,221,221,
- 29,246,187, 29,200,123,155,108, 89,117,213, 78, 11, 89,204,154, 36,231, 67, 48, 29,122,194,249,249, 25, 4, 14,211,180, 71,113,
-201, 8, 33,168, 65, 24,205,119,137,102,157, 59,115, 52,212,159, 9, 34,228,164,207,132,183, 6, 64,204,212,133,160, 60, 3, 22,
-181,219,133,153,241, 72, 33,173, 89, 70,125,137,181,141, 49,193, 65, 19,215, 0,181, 99, 37, 23, 84,134,215, 72, 92, 51,171, 12,
-208, 59,130,131,162, 4, 57, 49,130, 48,124,232, 76, 95,174, 77, 74,240, 30,137,188,118,226, 2,253, 30,231, 0, 81, 95,255,146,
-210,148, 68,211,248, 84,178,230,236,220, 50, 75, 90,167,178,189,204, 37,173, 49, 26,243, 94,101,128,142, 4,157, 35, 36,120,220,
- 70,224,108, 59, 98,189, 17,248,245, 5,178, 95, 1, 76,154, 33, 79,130, 40,132, 62,101,188,215, 71,124,241,238, 6,227, 55,239,
- 35,140,215, 16,207, 58, 2, 82,163,146,178, 68,188, 55, 61,145,111,122, 94,151, 3, 11, 53,199, 80, 51,210, 54,208,124, 75,100,
- 87, 94,214, 1,150,121,226,168, 11,176, 64, 23,230, 22,150,214,143, 44,137,202, 42,138,132, 73, 4,149,146, 85, 45, 67, 69,140,
-104,119,160, 66,166,146,193,110,254, 63, 38, 37,115,205, 91,227,198,100, 5, 77,113,103,154, 93,220, 10,140, 85, 26,138,121,146,
- 63,152, 58,202,174, 88,100,113,198, 85, 72, 67,202,106,192,254,207,200,105,220,172, 7, 92,105, 56,170,182,252, 56, 60,133,237,
- 98, 51,228,232,176,167,198,100,128,186, 14, 43, 48,114, 76,179,112,170, 9,214,176, 68,114,221,129, 51,230, 34,214,172, 33,200,
- 44,108,179,232,180, 78, 34,152,138,188,139,168,126, 79,229, 61,208, 92,164,219, 38,138,205, 87,207,163,229, 4,232, 5, 46,220,
- 9,231, 60,250, 16, 32,156, 23,210, 2, 1, 26,123, 87,170,252,139,250,239,141, 83,224, 26,198,123,235,143,223,174, 31,164, 33,
- 30,202,162,226,233,195,220, 17, 33, 17,153, 26,249, 88, 7,170, 82, 35,194,217,186,199,171, 18, 22, 67,206, 60, 3,176,240,188,
-191,247,161, 59, 32,199, 21, 56,165,124, 91,215,117,216,110,111,177,219,222,190, 53, 97,238, 30,208,109,190, 70,116,175,229,253,
- 98,194, 63,180,220, 37,188, 70,203, 42,167, 85,111, 2,169,193, 36, 41,197,227, 12, 1,204, 62,243,130,215, 23,244,156, 51,158,
- 63,255, 18,255,222,191,255, 31,224, 63,250,187,127, 23,159,127,246, 41,250,126,133,243,243,115,181, 95, 77, 19,182,219, 91, 8,
- 43,228,158, 57, 35,198,201, 92,217, 80,155, 36,213,104, 59,164, 56,225,213,171,107, 92,125,243, 18,187,221, 30, 89, 50, 88,114,
-245, 58,207,147,121,162,147, 3,156, 84,179, 21, 42,146, 69,158,157,222,150,174,134,106,241, 12, 46,191, 87,135,148, 20,181,144,
-171,116,147, 27, 27, 97, 13, 81, 25, 6,129, 23, 86, 78,128, 43,133, 68,170,239,185, 54,137, 26,135,186,221,238,176,223,237,177,
- 89,175,176, 90,111,176, 90,175, 52,104,134, 8, 79,159, 62,131,115, 30, 57,198,218, 72,157,111, 86, 8,206,163, 95, 41, 71, 99,
- 26,247,106,173, 45,140,206,117,243,186,205,246,194, 49, 38, 92,156,173,241,222,179,167, 72, 8,120,254,252, 57,242,184, 67, 8,
-157,250, 48,172, 58,179, 64,101,155,200,245,222, 8,222, 23,230,113,181,168,142, 49, 25,209, 48,163, 35,109,112,224,102,143,130,
- 66, 20,204, 57, 67,160,185,235, 57,103,107, 12,244,190, 17,201, 16,231,204,215, 94,175,131,115, 0,123,135, 41, 38, 56,138, 8,
- 62, 32,103, 70, 64, 6, 81,103,220, 3, 61, 59,125,240,200, 66,112,200,128,185,214,137, 53,103,129,160,171, 45,231,237,115,229,
-202,169, 73, 41,235,239,198,140,194,146, 0,193, 1,112,106,110,227, 40, 67,224,145,152,225, 12,242, 23, 86,166,180, 39,245,124,
-239,172,142,220, 77,128,240,136, 11, 97, 92,156, 93, 98,188, 56,199, 56, 4,200,180, 7, 35, 97,200,192, 67, 78,120,246, 14,227,
- 23, 15,223, 71,120,254, 41, 8, 91, 8,250,197, 65, 70, 5,217,146,239, 78,242,122, 36,127, 51,110, 86,155,229, 94,184, 73, 21,
-217, 94,240,232, 78,147,234, 2, 92, 41, 96, 6,247,240,204, 96, 47,140,224,100, 93,130, 39,133,209, 51,230, 48,249, 67,208,144,
-138,155, 87,113,105,179,146,195,162,191,168,146,171,164,200,160,180,176,184,118,210, 16,158,165, 97, 77,238,120,110,153,241, 66,
- 11,230,160,107,200,111, 45,140, 33, 45, 99, 93, 26,246,118, 77,140, 35, 77,160,107, 96,121, 87,215, 24,210,120,138, 43,155,160,
- 15, 30,107, 34, 56,206, 24,115,198,190, 33, 6, 58,154,139, 15,115, 6, 27, 20, 54, 51,201, 91, 53,252,108,182,226, 76,206, 86,
-154, 9,215,226, 46,102,133,171,233, 67,178,240,117,167, 70,242,215,150,159, 92, 39,118,177,255,118, 11, 66, 91,105,166, 10,138,
-162,254,206, 25,251,209, 12, 46, 74, 70,114,109, 48, 24,194,168,105, 99,185,209, 62, 87,149, 6,205,133, 93,154,107,168,191,202,
- 89,195, 54,211, 64, 43,243, 21,154, 14,200, 57,225,110, 27, 43,169, 78, 14,212, 3, 0, 16,186, 14,251,237, 45,254,252,246, 21,
-130,243,182, 14,152,205, 33,124,177,251,189,223,170,173,241,173, 63, 64,180, 14,114,210,143, 52,253,111,232,206,229, 62, 64,128,
-238,249,226,137,239,167, 35,202,141,188, 93,203,223,118, 89, 44,112,164, 54,165,167, 53,130,244,218,125, 96,123, 13,190,248,252,
-115,252,235,127,227,223,192,223,255, 47,255, 43,188,120,254, 21, 32,192,217,102,131,105,156, 0,160,102,147,111,206,206, 49, 77,
- 35,166,113, 4, 27, 91,189, 21, 60,166,172, 38, 33,211, 56,226,213,213, 43,220,222,220, 97, 24,246, 24,134, 1,227, 48, 34,103,
-158,253,211, 1,149,171,149,231, 54, 91, 17,179,137, 95,189,220, 39, 45,254,110, 70,237,114,214, 68, 55, 64, 39,252, 24, 53, 40,
- 38,103,213,202, 7,175,228,180,104,217,234, 5, 25,112,228,212, 76, 6,106, 82,163, 81,168, 19, 60, 57,116,171, 30,156,245,231,
-220,221,222, 98,181, 82,102,187,166,188, 69, 92, 92,156,227,233,147,167, 56,191,188,172,191, 27,245, 96, 86,237,120,191, 94,225,
- 74, 4, 57, 77,152, 88,141, 95, 10, 43,126,189,234, 17, 99,196,118,187,195,195,203, 51,124,240,189, 15,224, 92,135,117,215,225,
-246,252, 18,175,246,119, 88,123,130,235, 58,115,139,115,152, 82,172,123,107,102,245,223,223,244, 61, 34,151, 93,180, 3,156,199,
- 24, 19,200,252,242,157,102,189,150,110, 7, 34, 89,137,134,194,245,172, 39, 43,224, 25,162,166, 60,162,182,187,193, 9,124,232,
- 16, 19,131,242,164, 43, 46,141, 87, 67, 20, 51,207, 9,110, 14,164,130, 32,116, 26, 3, 43,137,235,249, 84,216,248,142, 4,161,
- 11, 32,167,178,194,108,138, 5, 80,225,217,100,243,179,119,200, 0,156,228,218, 12, 81,206,154, 18, 42, 2, 71, 26,157,235,152,
-224,204,193, 47,101,229, 3,144,176,214, 40, 59,183,111,146, 3,223, 76,120,226,174, 17, 30, 4, 48,157, 35,177,162, 20, 83,102,
-244, 35,227,105,191,199, 23,239,110,144,174,158, 33,164,159,213, 3,245, 40,128,122,225, 5,241,214, 0,252,219,175, 4,233,120,
- 97,123, 24, 38, 67, 39,211, 57,164,133,223,245, 67, 15, 52, 79,166,149, 48, 85,242,176,139, 25, 75, 67, 86,211, 18,199, 85,230,
- 38, 36,117,250,214, 41, 80, 13,255,129, 30,226, 61, 28,141,112, 73, 16, 11, 0, 76,212, 90, 14, 87, 15,118,105,166,188,178,151,
-117, 71,242,176, 70,171, 71, 12,136, 91, 76,212, 85, 7, 78,179,121, 70,203,166,175,113,172,132, 58,157, 87,119,181, 2,215, 55,
-210,173,194, 23,128,119, 56,119, 14,103,186, 96,214, 27, 63,235,244,220,198,184, 58, 48, 56, 50,198, 70,250,118,178, 64,148,162,
-198,121,105, 28,211, 20,150,114, 88, 39, 57, 50,106,211,155,254,212,224, 71, 4,202, 9,145, 5, 33,116,102,164, 67, 85, 26, 4,
-107,106, 92,241, 24,144,214,143,191,176,235,103, 86,186,235,122, 60, 56,219, 96,127,119,139,152,185,218,173,178,201,233, 92,177,
- 15,183,149, 11, 53,186,239,154,249, 38,199, 90,243, 22,210,159,227, 97,231,132,181,138,106,212,107, 49,167, 96,205, 44,209,153,
-164,119,175,195, 29,150, 63,150, 14,201, 7,124, 31,147,254, 91,202,216,238,171,221,133,144,121,162,209,159, 73, 94,139, 86,239,
-228,163,123,242,247, 30,112,228, 52, 61, 46,206,123,230, 19,157,134, 52,119,119, 19,111,180,144,174,125,246,233,167,248, 43,255,
-226,239,226, 31,252,225, 31,225,238,230, 6,195, 56,224,241,227,119,149, 1, 77,192,148, 34,114,102,116, 93,143,148, 19,246,195,
- 94,173, 72,157, 3,177, 32,230,140,156, 18,114, 74, 24,167, 17, 41, 69,179,135, 29, 48, 12,218, 0,196,105,170, 68, 54, 17,101,
-159, 39,102,139, 73,213,156,242, 49,198, 26, 79,218,175,214,120,252,236, 9, 46,207, 47,225,125,128,239,188, 78,118,182,103,223,
-237, 6,196,105,178,132,178,128,204,140,253,126,143, 23, 47,190,193, 55,207,191, 84,142, 4,119,216,239,119,112, 97,165,187,118,
- 98,139,128, 21, 99,229, 71,211,132, 19,134,253,136,253,126,135, 52, 69,244,235, 21, 46, 46, 46,208,247, 61, 66,215,225,252,252,
- 12, 79,159, 60,197,106,189, 70, 74,169,242, 15, 60, 57,192,169,252,139,140,111, 84, 26,161,149,249,175,147,125, 54, 57,171,187,
-221,122,213,227,233,211,103, 8,221,186, 94,143,139,179, 13,246,171, 13, 66,231,225,187,206,216,253,130,205,106,101, 41,109, 12,
- 4, 27,200,178,162, 51,190, 11,128, 56, 76, 9,112,200,136, 44, 72,187, 1,155,205, 74,139, 94, 74,245,188,141,133, 9, 47,100,
-246,183, 73,239, 81,203,165,200, 44,213,255, 32,167,172, 19,117,206, 8, 78, 77,118, 82, 22,136, 68,172,250,128, 12,175, 13,132,
-115, 38, 75,134,250,148, 16, 33,137,131, 19,221,217,123,152,186,192,105,184,140, 24,138, 82, 26, 20, 72, 70,239, 85,167,238, 88,
-224,136,193, 12,228, 84,238,216,178,102,211,221,185, 48,170, 4,144, 57,130,132, 45, 55, 3,213,166, 22, 54,204,109, 57,128, 94,
- 37,188, 35, 47,176, 58,207,200,253, 26, 57,119,144, 60, 96, 39,192,163, 16,241,236,241, 10,159, 60,252, 53,248, 23, 95, 2, 24,
- 64,232,142,106, 38, 53,103, 44, 4, 71, 24, 29,221,135,221,209,155,123,244,227,222,159,170,244,173,245,242,192, 34, 15,228,216,
- 4, 50,120, 34,237,140,106, 48, 10, 16, 74,104, 74, 89, 89,185,194, 76,118,213,140, 68,227, 75, 59,211, 40,102, 99,187, 83,131,
- 10, 26,161, 10, 51,249,130, 44, 53,136,138, 13,172,141,210,124, 64, 46,155, 51,201, 75, 34,220,146,239, 71, 66,203, 55,222, 48,
-228,179,117,166, 78,154,163,177,236,180,173,115,243,173,250, 87, 20,125, 40,181, 93, 10,169,172,105, 14,202,123, 82,226, 96,198,
-190, 16, 52, 26,141, 61,181, 59, 81,115,151,114,109, 44,233,137, 76,111,146,153,159,223, 66,204,237, 46,255, 62,133, 36, 91,215,
-189,212,107, 91,145,207, 25,110,117,142, 85,112,152,118,119, 72,112, 51,137,178,236,167,133,142, 84,208,116,162, 34, 85,219, 89,
-179,100,172,215,166, 56,182, 29,112, 49,155, 72,156, 35,155,227,214, 44,165,245, 75, 94,110,145,151, 76,247, 35,187,216,214, 75,
- 94, 26,206,132, 53,152,111,150,190,153,186,130,102, 84, 73,190, 67,163,247,217,133,239,224,194,210,235, 86,114,109,216,238,178,
-180,127,107,238,125,241,197,167, 19, 38, 59,197, 20, 73,100,161, 0,105, 15, 4,231, 28,190,250,234, 43,252,224,215, 63,196, 31,
-254,195,255, 9,222, 59,188,188,189,193,195,135,239, 32,198, 8, 16,169, 44,108, 28, 16,124,135,148, 38,236,246,123,196, 41, 65,
- 48,107,209, 53,199, 60, 97, 24, 7,108,183,123,131,160, 7,164,148,204,201, 44,193, 59,135, 68, 37, 97,171,160, 86,132,253,126,
-192,176, 31,112,249,224, 1,222,125,246, 24, 23,151, 23,120,247,221,119,112,249,224, 17,214,235, 21,124, 8,102,156,148,180, 0,
-219,189, 63, 78, 26,220,211,175,122,196, 56, 1, 66, 24,166, 9,219,187, 29, 62,255,252,115,124,244,243,159,227,171,207, 63,193,
-237,245, 53, 30, 63,123, 31, 9,192, 56,141,134, 2,133, 58, 41,121,239, 17, 83,194,176,223, 67, 4, 56,187, 60,199,195,135, 15,
-241,238,227, 39,184,188,188, 68,191, 90,153, 70, 91,201,100,229, 89, 40, 73,109,197, 31, 65,231, 0,194,170,239,113,121,113,102,
-126,243,163,194,237, 89, 87, 19,171, 85,135,247,222,123, 15,171,245,185, 37,179, 5,172,215, 27,220,237, 35, 54,155, 21,122, 75,
- 87,235,251,174, 90,192,146,239,116,231, 77,176,204,114,189, 95,146,165,204, 17, 4,125,167,130,221,105,136, 54,148,176,109,186,
- 74,204, 41, 33,138,154, 0,229,164,113,171, 37,138,130,160, 50, 60,229, 95,152, 58,198,145,229,209, 51,200, 5, 80,112, 74, 98,
-118,132,108, 40, 65,103, 57,238, 98,252, 20, 71, 0,103,117, 0,209, 52,186,206, 18,230,242,188, 66,229, 92, 27,137,224,131, 5,
-211, 0,146, 53,178,149, 83, 82,211, 34, 16,188,215,243, 61, 11, 1,102,180,195, 80, 30,129, 23,117,139, 99, 67, 61, 29, 17, 50,
- 41, 7,137, 56,195,145,224,150, 9,211, 85,194,227,248, 2,235,203, 71,216,173, 47,128,145, 0,153, 16,196,225,131,179,140, 47,
-159, 62, 4, 95, 61,133,227, 63,135,184,112,239,162,124,110,208,233, 68, 9,255,246, 39,138,188, 14,158,199,156,117,177,136,165,
-186,135,224, 26,184, 48,197, 73,138, 97, 83,213, 48,131,154, 3,186,154,212,176, 26,151,136,131,248, 0, 10, 17, 61,171,206, 57,
-177, 78,233,197,192, 70,139,113, 4, 49, 16, 19, 33,219,228,236, 23,172,114,106,124,215, 81,104,111, 90,236, 75, 22,245,145, 13,
-118,155, 11, 94, 52,227, 77, 1, 63, 33, 95, 98,123,208,138,164,141, 73, 14,118,197,101, 87,141,133,148,172, 94, 84, 18,100, 78,
-216, 87, 24,159, 44,160, 96,246,137,103, 44, 95,195, 18,169,105, 24,239, 38, 69,155, 85, 4, 52,175, 8,160, 25,244,173, 71, 64,
-137, 85,229,198,143,158,170, 43, 24, 45,237,191,161,144,220,197,217, 37,222,123,216,225,211,143,111,145,121, 41,129, 88,164,152,
- 29, 52, 16,238,232, 58,168,107,211,237, 43,181,119,172, 6, 25,170, 26,109,160, 86,105,214, 37,168, 94,218,213,208,208,205,214,
-183, 37, 59,187,124, 38,116, 10,174,110, 16, 33, 62,209,116, 20,242, 76,203, 26, 23,146, 55,219, 59, 25,236,223, 74, 7,209, 32,
- 69,223,186,148,202,233,152,218, 67, 10,255,155, 56,249,199,191, 93,222,226,213,156,192,215,239,217, 61,144, 37, 9, 30,137, 4,
- 15, 10,250,203,151, 47,177,217,108,240, 71,127,252,143,240,244,233, 83,124,252,209, 71,120,242,244, 9, 0, 65,142,170, 75, 30,
-227,136, 16, 58, 76,211,136, 97, 63, 24,107, 90,149, 24, 57, 39,196,105,194,118,187, 69,202, 25,251,221, 14,219,187, 29,166,105,
- 68, 28, 39,164,148,145,114, 68, 76, 73,117,217,149,156,165,215,224,238,230, 6,235,205, 25,126,247,175,253, 75,120,246,222, 7,
- 0, 8, 49, 14, 56, 91,175,193, 89, 48, 12, 3,210, 52, 41, 75,218,105, 33, 77,201, 32, 90, 78,112,222, 99, 24,246,152,166,201,
-172, 95, 19,198,253, 22, 15,206,207,240, 23,126,251,183,209,245, 43,124,249,233, 47,176, 90,111,224,250, 30, 57, 38, 77,160,172,
-153,241,132,221,110,135, 97,216,225,242,226, 18,103,151, 15,176,234, 3,126,253,195, 15,241,224,157,199, 72, 49, 85, 19,169, 92,
- 9,107, 74,100, 43,207,101, 93, 11,216, 51, 16,188,195,122,189,182,181,129,122,189,167,196,232, 66,192,247, 63,120, 15, 23, 15,
- 30, 90, 51, 17, 16,204,141, 78,106,210, 6,176,234, 59,172,215, 27,236,135, 9, 44,162,113,169,222, 67, 56, 97,221,247,112, 93,
-103, 70, 61, 25,211,164,122,114,231,128,179,205, 74, 37,122,172, 83,116, 18,221,183,115, 78,246,121,113, 69,116, 88,148, 67,225,
- 96,228,192,178,150,165, 96, 28, 3, 70, 48,203, 91,144, 67, 31,156,173, 86,212,179, 93,155,152,255,151,181, 55,127,150, 45,203,
-206,131,190,181,135,115, 50,243, 78,111,170,122, 53,119, 87,119,211, 6, 73, 6, 65, 96,169,165,118,132,176,194, 67,203, 70,180,
- 32,104,133, 8, 4, 18, 97, 3, 17,216,152,144,195, 13,178, 37, 76, 25,248,171, 0, 7,132, 21, 6, 34,240, 16, 33,219, 40,164,
-238,174, 66, 93, 93,195,155,238,187, 67,222,204, 60,103, 15,139, 31,214,218,251,236,147,247,190,251, 94,181, 93, 17, 82,191,170,
-119,135,204,147,231,236,181,214,183,190, 65, 78,170, 50,161, 15,161, 52, 11,194,214, 39,202,213, 97,179,132, 46,149,179, 95, 52,
-231,164,231,151, 56, 93, 22, 31,250,194,148,175,228,108,146,226,205, 89,210,236,188, 53, 66, 15, 83,212,162,152, 88, 37, 78,200,
- 25,160,156,225, 28, 0,178,216,177,193,243,171,140,215,204, 25,142, 79, 44, 54,230, 16, 24, 12, 70, 4, 28, 51,227,222,221,140,
- 71,199,111,162, 59,253, 12, 48, 73,193,108,126, 97, 97,159, 71,173,222, 22,143,124,251,241,242,194,191, 34,204,204,207,246,221,
- 93,170,163, 97,205,174, 32, 56,206, 81,101, 26, 40,163, 42,184,200,217, 24,136,122,112, 19,149,160,143, 98,224,146,145,211, 86,
-208,111,157,216, 12, 41,153, 37,151, 6,128,102, 36, 51, 59,121,210, 76, 6, 2,146,233, 83, 39,215, 73,235, 94, 72,107, 60, 21,
-204, 74,240,161, 57,249,140, 74,193,147, 75,147, 4, 29, 23, 38, 38, 53,123,114,158, 79,143,133,224,151,203, 46,189, 49, 97,160,
-134, 84,100,120,218,245,111, 19,224, 21,113, 72,181, 64, 76,175,131,103,100, 62,133, 79,136,247,102,209,137,165,222, 22,211,242,
- 62, 21,244, 65,192,132,106,148,198,101, 31,230,153,111, 47, 39,178,215,112,254, 4, 31, 95, 18, 50,217, 26,122, 95,228,120,166,
-129,118,203,207, 45,102, 58,169,153,126, 51, 77, 13, 69,113,124, 99, 46, 33, 63,229,117,183,133,189, 37,245, 55, 83,182, 78, 48,
-172, 68,183, 18, 94, 81,148,177, 51, 66, 88,105,238,152, 27,239,255,189,169,191,225, 46, 84,207,255, 87, 44,198,101, 74, 47,146,
-197,114,207,127,161, 32,245, 87,168,179,251, 73,166, 55, 7, 45, 49,230,134, 67,188,215,245,223,226, 96, 85, 85, 24, 55,248,182,
- 95,251, 54,106, 60,172,111, 38, 33,146, 49, 56, 59, 59, 67,138, 17,191,251,193,223,197, 79,254,228, 79,225, 15,255,240, 15,112,
-124,116, 34, 7,170, 78,105, 33, 69,116, 93,135,237,176,195,102,179, 69, 8,163,132,168,140, 90,176, 99,196, 48,200,174, 60,198,
-132, 97,220, 33,166,128, 20, 19,174,214, 27,172,175,214,106, 89,154, 52,119,123,114,104,219, 14, 59,220,189,123, 15, 63,247, 11,
-223,196,151,222,127, 31,167, 79,159,225,209,103,159, 99,216, 13,216,174,165, 73,176, 26,107,154, 98, 66,215,119, 34,147, 83,179,
- 25,103, 29,198, 97,196,213,230, 74,109,113,147, 18,220,118,146, 16,183,221,226,222,221,187,216,110,174,240,236,217, 83,172, 14,
-143,225,188, 68,195,142, 42,223,218, 92, 93,129, 83,194,221,251,247,113,116,114,130,206, 59,188,243,206,219,120,240,250, 67,140,
-227, 8,231,140,146, 16,133, 65,222,117,157, 92,191,164, 76,125,149,244, 17, 0,178, 82,124,201, 24,116, 32, 28, 30, 28,225, 50,
- 51,114,138, 56, 58, 88,225,222,189,187, 56, 62, 62,150,103, 66, 37,117, 94,109,106, 11,185,208, 26,145,206,133,152,224,189, 21,
- 27, 91,253,250, 24,101,205,225,213, 91,222, 26,135,148,132,251,226,172, 56,174, 57,107,148,179,144, 37,159, 62, 39, 36,102,217,
-145,239, 53,181,142, 8,214, 57,217,169,103, 86,212, 48,214, 4, 60,178,174, 38,211,201,227, 43, 8,173, 85,130,157, 68,221,102,
- 68,214,236,144,156, 69,215,238, 58,140, 99,128, 67,130,245, 14, 68, 86,211,224,128,196, 6,224, 44,103,113,100,144,149, 21,164,
-233, 28,114, 22, 68, 35,198, 18,222, 82, 26, 38,130,101, 6, 57,131, 4, 3, 74,169,102, 25, 25, 83,252,227, 89,255, 93, 45,184,
-117,181,201, 22, 88, 71, 3,186,136,120, 64,207,176, 56, 36, 12,221, 10, 33, 50, 86, 41,225,237, 85,192,211, 7,247,144,207, 94,
-131,201, 31,171,126,254,118, 39,185,154,104, 88,162,165,111, 35,207,252, 88, 71,202,228, 43, 79, 51, 86, 86, 75,128,159,204,213,
-156,132,184, 40,179, 93,217,165, 92, 83,210,244,192,214, 9,215, 20,192,149,117,234,102, 77,110, 51,128, 87,242, 6,140, 16,186,
-130,194,218,213, 86,150, 25,108, 38,213,185, 64,109,168,214,132,211,100, 88, 36,111,168,240,117,198,164, 59, 47,110,110, 37,195,
- 87, 30,104,204,163, 80,129, 25, 49,109,158, 24, 94, 10,190,234,189, 9,123,140,227,178, 67, 39,141,145, 36,144, 17, 6,122,249,
-154,180,151, 87,205, 84,184, 6, 60,143, 64,173,124, 67, 69, 8,154,162, 92, 39, 84,222, 71, 6, 24, 35, 79,254,237, 92, 35, 91,
-231, 83,234, 77, 77, 2,239,237,170, 99, 42, 16,115,174, 55,221,194, 24, 36,142, 24, 51,195,106, 23,204,141,205,102,181,157,165,
-166, 88, 54,110, 71, 89, 93, 2, 77, 3,117, 83, 27, 19,139,185,189,109, 21, 85,228, 60,133,153, 48, 55,171,148, 34, 69,164,122,
-111,100,158,155,150,182, 13,194,190,118,158, 85,159,205,175,100,194, 54, 57, 39,178,100, 12, 79,159,216,143,241,192,221,180, 75,
-231,198,177,149,248,165,116,183, 25,227,189,141,132,224, 87,241,215,219,139,192,173, 9, 95, 55,120,228,211, 45, 13, 1,145,193,
-197,249, 57,198,113,196,223,252,239,126, 27,223,252,230,159,198,247,254,232, 15,177, 92, 46,113,112,120,136,113, 24, 53, 84, 69,
- 96,220,245,122,139,205,118, 35,198, 45,163, 16,215, 66, 24,149,185, 44, 33, 30, 21,133,210,194,180, 75, 59,217,187,115,130, 49,
- 14,137,131, 28,184, 76, 8, 41, 98,187,221,225,232, 96,133,159,250, 55,254,117,188,245,206, 59,184,186, 88,227,217,211, 83,145,
-144,121,129,249,119,187,157, 78,151,114, 88,111,135,157, 76,107,154, 91,238,156,195,102,179,195, 48,140, 0, 51,134, 49, 96, 24,
-118, 90,108,146,100,178,199,136,123,247,239, 35,134, 17,227,110, 39, 81,175,219, 45,144, 19,172,247,240,253, 2,247,238,221,197,
-106,117, 0,107, 13,222,125,247, 93,220,127,237, 53,228,156,208,119, 29,140,181,149,125,191, 88,173, 96,172,197,102,179,197,194,
- 89, 13, 57,146,189,113, 12, 81,206, 77, 35,222,236,228, 13, 86, 86,246,232,206, 0,119,239,222,193,225,225,145,164,171, 25,130,
-245, 30,224,140,213,106,137,139,171, 17,195,110,131,195,131, 37,250,126, 33,108,115, 0,139,229, 18, 68, 6,187,113, 64, 78,162,
-185,103,146,137,152,192, 53, 61,206,123,135, 97, 39,159, 25, 25,177, 87, 45, 74, 8,217,229, 75,209, 46,171, 24, 34,198,162,115,
- 53,167,157, 85, 10, 85,120, 73,166, 90,220,106,248,148, 22,214,156,155,103,179,196,163,150, 80, 23, 75, 32,231,196,255,157, 51,
-156, 33, 48,172, 76,236, 26,113,155, 73, 97,122,200,191,151,168, 86, 34, 81, 76, 49, 51,156, 97,184,222, 35, 37,113, 22,148, 81,
- 10,170,187,159, 38,120,106,240,199,226, 95, 96,116,152,203,100, 17, 83,134, 97,113, 60, 92, 56, 96,203, 30,103, 87,192,125,247,
- 28, 88, 57, 12, 88, 33,166, 13,238,217,136,123,247, 61,158, 60,122, 11,221,249,231, 32,147,192,112,183,122, 57,204, 76,157,155,
- 16,175,107, 4,154, 31, 99,175,142,107,136,111, 33,129,235,234, 76, 3,204, 90,251, 89, 23,114,150,204, 89,157,192, 82,179,235,
-141, 37,191,188, 73, 53, 51, 58, 9,103,245, 52,246, 70, 72,118, 86, 75,174,177, 25, 29,139,141,108, 84,205,251,200, 22,201,176,
- 50,175, 39,134,122,106, 29,223,138,158, 93,181,221,212, 76, 86, 98,123, 40,123,126, 83, 11,156, 22, 89,221,229,183,254,238,243,
- 2, 45,172,242, 34, 89, 35, 8,155,223, 52,157, 14, 23,114, 89,115,244,149, 27,162,236,123,139,196,205,214, 72,181, 73, 22,212,
- 98,174,212,240,204,103,251,223,102,175,110,103,217,224,104, 86, 15,123, 97, 51,229,247,235,186,129,155,105,126,150,188,118, 13,
- 93, 80,137,155,126, 6, 45,196,221, 27, 66,200, 6, 67,137,157,108, 37, 99,224,153,149,232,100,247,202,141,218, 97,223, 7,191,
-164,226, 97,143, 63,160, 43,146, 61, 61,122, 46,198, 32,149, 68,200,179, 52, 59,236, 21,114,102,190, 30,111,136,198,230,114, 70,
-174,187,233, 1,105, 8, 97, 76,179, 41,154,255, 37, 38,178,205, 54, 33, 55,228,216, 23, 84, 1, 68, 47,225,162,183, 13,234, 11,
-187,137,235,134, 51,197, 68, 73,181,172,124, 27,229,190, 49,169, 34, 99,112,126,118,134, 97,216,225,111,124,247,183,241, 75,127,
-241, 47,225,251,223,255, 35,228, 28,113,116,244,154, 66,222, 91,200, 26, 51, 98,183,219,226,217,211, 83,177, 22,142, 1,219,194,
- 94,143,161, 22,129,130, 75, 25,107,192,163,222,203,214,192,123, 15,239, 29,118, 67,168, 6, 70, 76,164, 19,157,199,219,111,191,
-131,215, 30, 62,192,241,241, 9, 62, 57,255, 17,134, 97,135,197, 98,161, 16,187, 48,222, 75,180,103, 78, 25,219,157,152,136, 56,
-103,212, 29,110,196,229,229, 90, 83,254,184,174, 20, 66, 28, 49,142,131,172,125, 72,154,214,163,147, 19,108, 46,215, 50,189,198,
-132,229,106,129,187,247, 31,224,232,240, 8,198, 73,168,209, 59,239,188,139,123,247, 31,200, 78,219, 89,248,206, 35, 4,129,178,
-239,222, 57,129,247, 61, 46, 46, 46,167, 53, 64,158, 98, 71,173,153,100, 92,206, 59,120,221,193,119,206,161,239, 60, 58, 13,126,
-241, 53,131,221,160,239,122, 24,235,241,252,252, 49,194,110, 64,127,184,210,247,204,232, 59,139,206,123, 89,115,198,140,133,247,
- 32,227, 48, 14,131, 50,207,149,188,154, 25,227, 24,106,134,193, 56, 70, 12,195, 32, 5,144,132, 88,136, 60,233,192,189,243, 53,
-101,173,152,207,148,194,111, 73,236,113,185, 14,123, 42,125,206, 9,214, 1,198, 72, 26, 27,229,172,198, 66, 74, 62,118,226,188,
- 71, 78,188,247,115, 76, 18,209,106,157, 62,211, 58, 56,101, 49, 13,179,198,130,172, 85,139, 90, 25, 10,115, 78, 42,211,149,189,
- 61, 1, 72,198, 32, 69, 2,114,212,125,188,160, 5,133, 99, 43,107, 4, 35, 59,116,211, 32,132,152,103, 29, 27, 34,116,134,112,
-149, 13,252,101,196,177,125,142,220, 63,192, 56, 46,176, 74, 91,188,185, 26,112,250,224, 30,248,242, 53, 32,127, 6, 24,247,194,
-167,113,174, 85,153,138,109,187,115,255, 34,133,253, 54, 45, 46, 53, 28,152,249,217,202,179,129,192,137, 17,191, 20,172, 88, 83,
-216,168, 66,227, 96, 66,210,137,209, 19, 64,153,106,161,153,180,180,166, 78, 90, 4,249,128, 60,141, 48,129,177, 99, 2,187, 99,
-216,131,128, 59, 97,141,221, 54,227,170,216,155, 54, 94,226,132,121,234, 22,205, 32, 73,106, 76, 0, 52, 93,136, 76, 37,215,149,
- 93,152,120, 62,243,236,231,181,246,171,212, 4,207,164, 61, 66,150, 45, 83,187,158,202,142, 10, 73, 76, 73,131,237, 62, 95,205,
- 81,234,244,156,209,248,205,210,172,136,181, 94,233,134, 90,169,151,238,204, 53, 53,104,159,173,108, 11,138, 13,141, 0, 0, 32,
- 0, 73, 68, 65, 84,154,244, 39, 91, 58,232,218,112,208, 12,162,110,237, 11,107,176,133,190,121, 75,147, 21,170,101,198, 69, 12,
- 2, 85, 26,170, 19, 91,249,181, 70, 87, 13, 51,123, 95, 76,201,103,173,213,109,110, 26,175, 76,220,242, 50,107, 35, 80,252, 14,
-136,184,113, 0,203, 51,210, 92, 77,118,187,133,248,177, 63,173, 51, 55, 52,246,150, 29,202,123,205,206,222,138,162,237,174,102,
- 44,252,198,198,182, 52, 30, 95,120, 74,167,185, 46,189, 93,146, 51,163,198,189,230,234,189,205, 55,144,228,246,203,239,205, 39,
-192, 11,141,100,249,230, 86,133,102,252,250,233, 65, 51,198,226,244,244, 25, 98,140,248,155,191,253,183,241, 23,190,245, 45,124,
-248,131,239, 99, 24,118, 56, 62, 58, 65,140, 9,187,221,149, 58, 47,202,238,251,236,249, 57, 78, 79, 79,209, 57, 89, 18, 85, 11,
- 81, 53, 64, 17,171, 85, 33,154, 49,203,212,154, 57,163, 95, 44, 96,189,199,184,219, 33,134, 17, 45, 77,147,192, 56, 58, 62,193,
-235, 15, 31,226,206,201, 29, 88, 34,236,134, 1,171,229, 10, 49,138,164, 44,168, 35, 91, 89, 3,164,152, 16,134, 1,166,235, 49,
-166, 36,114, 58,230, 42,121, 35, 2,124,231,164, 40,230, 92,109, 77,101,114, 77,232,188, 67,232, 58,144, 9, 56, 57,121,136,163,
-147, 19, 9,116, 97, 70,138, 1,175,191,241, 16,119,239,221, 23, 66,159, 53,232, 22, 29,140,145,212,182,174,243,112, 94, 10, 86,
-215,123, 24,125, 93,142, 80,125,230,125,231, 36, 43, 62, 68,157, 64, 73, 76,107,150, 11,225, 21, 89, 35,202, 20,231, 48,142,163,
- 54, 3, 78,220,217, 88,126,174,120,213, 68, 44,122,143, 69,191, 64, 38,131, 16,118, 88,116,242, 59,131,218,215,146,242, 10,168,
-105,250, 50, 3,195,102, 7,112,130, 85,243, 27,142,186, 75, 87,210,107,231, 5,121, 24, 67,172, 59,111,107, 12,114, 38, 40,223,
-177, 54,244, 41, 79, 46,125, 25,208,164, 53,158,177, 85, 89,221,104,138, 55,125,226,134, 43,164, 90,111,210,102,167, 54, 16,156,
- 97,173, 65, 54, 6, 28,115,181,231, 46, 13, 64, 74, 25, 41, 36, 24, 72,128, 76,164,166, 54, 53, 3, 8, 65,244,254, 32,131,104,
-173, 32,131, 72,186, 22, 16,227, 46, 3,171,242, 56,113,163, 51,148,113,145, 29,232, 34,224,232,248, 25,168,191,143, 16, 86,184,
-135, 45,142,239, 25,156, 61,122, 3,126,253, 24, 48, 17,109,208, 11,110, 65, 72, 91,237, 56, 17, 79, 17,171,252, 74,228,154, 87,
-146,176,214,179,142,104, 79,253, 42,127,112, 80,183,159, 82, 8,140,118,134, 50,212,152, 10, 79,155,134,168, 96,180,219,202, 25,
-136,152, 8, 43,150, 74, 58, 98,153, 96, 69,222, 69,233, 2,121, 11,236, 50, 33,114,123,144,149,130, 57,105,188, 11, 4, 47,208,
-187,217,131, 91,169, 33, 55, 53,122,235, 61, 15,104,185,241,180,201,168, 70, 49,172, 26,199,201,141,174,114, 54,148,137,105,180,
- 40, 90,154,210,218,202,251,176, 96, 69, 50,184, 22,162, 92, 9, 3, 42, 99, 83, 70,186,105,141, 90,154,207,195, 26,113,187, 75,
- 89, 72, 54, 81, 59, 12,179, 55,201,151, 21,131,216, 66,202,207,163, 74, 68,156,131,179,134,246, 81,233,146,106,133, 38,179,125,
- 58,212,219,242, 81, 9, 99,205,180,156,219,215,130,169,193,186, 9,223,206,104,221,255,230, 51, 38,215,150, 50,215,223, 42,144,
- 24,213, 53,118,235,245,190, 79,216,219, 47,238,204,220,212,124,158,237,175,246, 45,153,105,255, 62,167,102,239,196,243, 7,176,
-252, 78,167,216,127,248,113, 7,245,189,144,180,182,176,166,156,176, 58, 60,128, 49, 2,115, 79,164,150,246,138,222,168, 22,191,
-249, 8,105, 63, 11,190, 81, 77, 59,255, 57,109,115, 89, 36,132,214,224,217,179,103,232,124,135,223,253,224,127,196,207,125,243,
-231,241,225, 71, 63,192,184, 27,144, 83,198,102,187, 81, 95, 4,134,179, 14,139,254, 0, 79,158, 60,194,211, 39, 79,224,212,173,
- 45, 38,113, 80, 75, 49,194,117,122, 8,199,132,174,183,240,222, 34, 69,192, 90, 47,159,247,110, 64,223,119,122, 63, 48, 98, 74,
-162, 17,207, 9, 93,183,192,193,209, 17, 34,103, 44, 87, 75, 73, 78,139, 1,214, 89,129,216, 33,211,220, 38,110,177,221,108,145,
- 98,172,186,234,237,118,163, 18, 44,129,125,199, 16,116,202, 99, 96,148,235, 84,108,101,219,107, 97,140, 65,191,232,177, 52, 11,
-156, 28, 31, 35,107, 18, 27,152,113,124,120,136, 7,175, 63,108, 32,107,217, 23, 27, 7, 28, 28, 30,169,193,139,220, 41,157,239,
-224, 93, 70,140,162, 2,170,124,145,242, 44, 27, 41, 42,206,137,175, 59, 67, 10,176,181, 26, 43,155, 19, 86,203, 37, 58,239,208,
-117, 29,194,110, 68,231, 44,250,147, 59, 72, 26, 15,219,119, 11,128, 8,195, 56,194, 90,130,115,157,132,219,176,129,233, 60,134,
-221, 32, 59,116, 34, 24,206,176,222, 99, 24, 71,244,157,133,115,189,184,213,165,140, 97, 24,145,194, 8,130,129,119,226,233,144,
- 99,172,207,185, 36,236,101, 36,101,199,195, 88,132, 33,232, 20, 47,127,111,173,120,213, 11,250, 36,214,206, 57,101,201,191, 40,
-171, 70,171,121,237,234,225,110,141,236,208,133, 36, 8, 16,217,202,149,201, 73,238, 25,235, 8,198, 78,142,113, 49, 50,192,210,
- 80,145,161,106, 34,100, 8, 32,107, 64,214, 32,100,134,201,218, 52, 41, 31,200, 48,195, 26, 6, 89, 66, 98,229, 0, 64,152,253,
- 89,163, 94, 73, 37,189,142, 8,129, 12,158,108, 9,148,214, 88,221, 3,118,238, 1,108,244,120, 99, 21,113,126,255, 1,242,213,
-125,152,252,248,133,211, 58,223,192,136,175,230, 94,133, 79, 67, 37, 93,148, 94, 90,216, 95, 58,200,243, 13, 40, 65, 89,231,103,
- 65,203,165,168, 39, 45,120,152,147,110,202,108,232, 90, 7,170,118, 66,211,147, 51,137, 99, 13,146, 33, 80, 78, 32,102, 68,102,
-140, 89,245,213,121, 68,138, 6,107,154,138, 63,148, 61, 42, 4,187,172,164, 56,177,165, 5, 3, 73,188, 83, 27,217, 17,102,221,
-189,153, 49,163,105,239, 32,231,250,247, 73,101, 15,164,162,247, 66,123, 48, 52,135, 77,106, 65,203, 92,199,173,208, 76,238,115,
-138,194,190, 49,127,107,120,147,145, 26,121, 75,203,191, 74,105, 90,160, 23, 7, 52, 82,119,184,201,117,109,218,191, 23,187,216,
- 92, 28,228,234, 39, 50,151,146,149,249,108, 66, 41,132,147,208, 30,237,220, 54, 15, 45,220, 14, 49,118, 40, 94,215,133, 41, 77,
-234,183, 92, 38,116,154, 17,252,166, 48,158,130, 48,240,158,221,168, 72,107, 90, 9,155,153,140,111,180,129, 48,234,216,150, 57,
-207, 32,255, 18,102,209, 58,159, 1,123, 5,125, 15, 90,199, 11,210,233,166,169,153,167,187,100,182,159,215,204,131,220, 72, 5,
-127, 28, 93,122,195,187,107,126,180, 52,115,214, 98,183,221,106, 4,166,153, 53, 51, 55,177,224,111,123,172,175,217, 12,239,193,
-123, 55,171,219, 27,255, 5, 53, 62,185, 56,191,128,181, 6,191,251,193, 7,248,217,111,252, 60,190,255,253, 63, 66, 80,247, 55,
- 99,172, 4,134, 24,131,229, 98,169, 69, 45, 97,216,238, 4,241,241, 29, 44, 17, 58,120,108, 54, 27,144,119,240, 66, 47, 70,136,
- 82, 84,141,181, 24,153, 97,144, 97, 64,186, 27,119, 0,247,216,238, 6, 77, 42,179,240,112, 48,171, 21, 86,171, 21,238,222,187,
-131,213,225, 17, 78,159, 61, 21,243, 38,229,221, 92,237, 6, 92, 93, 94, 97,187,217, 32,197,136,144, 82,163,111,151, 59, 49,168,
-113,140,252,159,166,119,177, 52, 84, 41, 39, 97,124,235,253,222,119, 30, 33, 16,172,205,112,206, 33,196, 32,239,145, 39, 47,139,
- 48, 12,232,151, 43,133,116, 51,198, 33,160,235, 60,134, 97, 68,214,176,153,190,235, 16, 83, 82,215, 60, 97, 74,103,157,118,140,
-238,178,147, 78,237,162,207, 54, 8,227,136,190,239, 84,194,101,225,188,131,179, 6,171,213, 18,153, 44,182,167,103,224, 20,212,
- 83,159,145, 82,128,181,194,123,242,150,224,252, 82,118,205, 86,150,152,227, 24,224,156,236,249, 83, 12, 24, 71,105, 54,250,222,
-195, 25, 57, 83,115,214,157,182,119, 32,146, 63,199, 32,161, 52, 18,167,154,165, 65, 75, 9,136,106,215,155, 13,144,162,160,169,
-202,133,130,238,192,171,187, 1,147,114, 36, 8,100, 44,188, 70,222, 18, 89,253,140, 98,189,174,208, 85, 44, 32,133,157, 89,206,
-122,182, 70, 86, 10, 33,193,153, 8,178, 94,139, 55, 33, 25,163, 19, 55, 80,244,118,157, 37,192,245,136, 57,195,197, 84, 73,213,
-101,136, 72,153,133,112, 71, 89,201,191, 98, 29, 46,231,152, 16, 51, 13, 73,195, 18, 51,100, 71, 79,192, 69,112,232,174,118,232,
-142, 47, 1,119,140,215, 29,225,179,215, 12,206,159,190, 5,187,121, 38,163, 92,181,138,189,185, 16,243,117, 11,146,201, 52,134,
- 26,206,215, 23, 37,229,242,203,135,248,234,143, 70,128,203,139, 19,120,222,226,112,151, 48,236, 12,118,122,248,115, 49, 13, 81,
-187,216, 66,214, 42,187,223, 68, 90,200,179, 65, 50, 12,239,100,186, 46,249,198,177, 68,183,242, 20,206,210,146,208, 88, 77, 48,
-140, 78,234,150, 4, 18, 73, 25, 32,119, 0,179,180, 56,204,107,140, 3, 99,139,105,103, 47,182,207,226, 83,156,200,195, 58,212,
- 8,213, 98, 49,107,181,236,197, 25,137, 66,119, 49, 25, 48,214,214,180, 49,230, 61,235,208,102,186, 71, 3,201, 23,233,157,157,
-153,192, 76,214,185, 83,206,251,228,219, 94,160,109,110,224,236,144,247, 83,212, 38,200,217,160, 53, 20,144, 46,126, 84,180,132,
-243, 4,215, 19, 55,156,128,210, 76, 24,245,142,103, 52,100, 48, 52,185,236,243,123,105, 50, 25, 98, 56,223, 3,141,165,109,133,
-215,169,133,220,233,218,132,110, 10,137, 17,115,217,228,244, 61,220, 52, 38,185,201, 26, 23, 40,205, 16, 77,225, 56,245,103,152,
- 10,197,231,198, 14,152,104,142, 22, 76,190,204,147, 75, 29,191, 76, 47, 66,123,166, 66, 77,195,144,152, 95,170,134,123,169, 90,
-142, 94,240,128, 3, 26, 20, 50,223,169,211,141,185,108,116, 59, 28,112, 19, 52,113, 93,136,127,189,177,105,126,122, 24, 3, 54,
-155, 13,254,198,119,191,139,159,251,230, 55,241,225, 15,126,128,227,227, 19, 16, 24,151,235, 53,200, 88, 44,150, 11,172, 22, 75,
-100,102, 92, 94, 92,128,136,176, 88, 45, 97,141, 69,140, 1,118,177, 64, 28,130, 6,120, 72,115,215,245,157,120,106,135,132,113,
- 28, 42,219, 90, 72,116,242,181,214,202,212, 70,100,170,121,208,193,234, 0,111,188,241, 16, 95,254,202,251, 51, 88,122,125,126,
-129,221,102,139,245,197, 26,231,231, 23,130, 8, 56,217,161,143, 99,192, 48,198, 42,105, 27, 85, 47, 78, 68,112,206, 85,135,179,
-201, 20,170,144, 87,101,114, 23,239, 12, 89,107,133, 0, 56, 71,234,163, 14,236,134, 17,159,124,242, 9,238,223,191,143,187,247,
-239, 99,209,247, 2,103, 15, 1,125, 47,220, 0, 82, 4, 64, 26, 15, 11,227,202, 51,152,107,179,202, 42, 45,201, 73,224, 98, 99,
- 45,236, 98, 1,171, 40, 1, 17, 97, 28, 71,137, 6,238, 59,108,199,140,221,118,163, 97, 51,130,104, 4,157,234, 37, 7, 94,210,
-234,198, 16,144, 99,130,115, 78,175, 49, 99,183, 27,145, 82, 64,231,172,132,200,140,220,200,213, 24,169,201,119,207,148,213, 7,
- 94,152,235,177, 73,168,204, 89,162, 85, 37,184, 37,235,117, 34,241, 62,215,231, 83,140,105,228,201,239,189, 3,145,228, 83, 24,
-103, 69,179,158, 4, 46,143,100, 49,198, 8,230, 88, 83,213,196,172,140, 53,189, 78,124,221, 51,137,131,104,202,178,123,207, 25,
-112,148,100, 29,161,195,138,113,226, 17,111,148,148,156, 50,224, 76, 6,172,172, 88,192, 9,145, 13,160, 70, 55, 41,203,128, 85,
- 66,190, 12, 17,140,115,122,254, 37,153,164,197,141, 24,189, 3, 98,182,184,216,101, 28,217, 13,236,210,225,200,247,120,235, 30,
-225,252,193, 91,224,143, 63, 1,225, 9, 24,139, 27, 79,130,219,226, 93, 38,107, 87,170,126, 38,251,230, 53,255, 50,254,105, 55,
-126,206, 40,209,160, 51,114,113,183,185, 40, 36, 81,115,194,161,157, 82,108, 8,100,200,114,193, 18, 39,133,238,243,148,190,214,
- 24,139,112, 51,221, 48, 97,138,231,156,193,187,250,239,156, 0, 54,136, 57,162, 11, 18,193, 24,139,184, 95, 3, 84, 76, 78,200,
-116, 8,123,178,196, 49,159, 35,110, 25,177,229, 18,231,140, 12,163,222,232,168,110,106,224, 4,182, 43,248,165,129, 11, 91,140,
-105,178,252, 51, 44,223, 83, 81,130,134,205, 93,155,130,134,112,134,134,188, 70, 51,129, 65,201, 41,111,132, 73,245,242,145,186,
- 29,177,194,106, 83, 34, 92,129,162, 36,205,110,242,111, 55, 74, 34, 98, 8,225,173, 70,176, 54,186,201,202, 59,200,215,253,240,
-169, 38,192, 97,150,153, 77,205, 2, 36,166,136,147,123,175, 97,101, 19, 62,253,252,145,228, 70, 43,153,136, 64, 32,107,170,174,
-188,157, 64, 51, 53, 78,112,152,204, 95,140,162, 4,117,199, 95,229,130,154,164,134, 61, 78, 65,123,141, 48,183,208,157, 14,101,
- 37,202,128, 97,153,106,147,133, 25, 83,254, 37, 1, 46, 52,201, 21,247,191,254,139,228,181,240, 43,116,216,180,103, 65,203,229,
-243,191,198, 76,191,169,172,243, 75,200,238, 55, 44,237, 49, 15,221,225, 57, 61,112,214, 0, 16, 12, 30, 63,249, 12,127,254, 91,
-223,194, 47,127,251, 87,240,163,143, 63,198,225,225, 49,150,139, 5,206,207,207, 96,172,236,125, 59,231, 49, 12, 3, 54,155, 13,
-146,234,148, 15, 86, 7,184,115,231, 46, 62,127,244,121,221,201, 59,239,229,239,179, 76,203, 34,107, 83,255,238, 28,176,219,137,
-107,220,110, 24,128,164, 92, 6,202,210,176,133, 88,253,225, 87, 7, 43, 24, 50, 24,182, 91, 28, 29, 30, 34,167,140,103, 79,158,
- 97,125,177, 22,217, 92,148,184,213, 28, 18, 76, 50, 24, 6, 49,141, 49,206, 85,252,174,160, 95, 69, 14, 70,202, 1, 74, 41, 87,
- 11,227, 66, 60, 43,242, 40, 33,116, 57, 32,169,125,171,106,177, 99,202,120,244,248, 9,114, 74,120,235,157,119,209,247, 30,214,
- 58,244,125,135,190,239, 37, 59, 30, 6,189,179, 8, 24,225,187,197, 68,158, 85, 99, 28, 38,209,176, 71,147,164, 8,235,245,234,
- 59,135,126,185,196, 48,142, 48,198,192, 59,143, 24, 69, 78,135,156,177, 90, 29, 98, 59,142, 8, 97,128,239, 60,114, 38,120, 67,
- 48, 78,226,103, 59,239, 49,176, 65, 76,161,222,215,206, 89, 56,181,225,222,108,118, 32, 36, 88,231,171, 2,192,146,129, 49, 84,
- 45,116,165,233,200, 98,236, 66, 12,211,117, 64,136, 18,224, 69, 6,222,136, 22,188, 36,228, 69,150,120, 98, 83,188, 40,136,102,
- 92,151,148, 89,210,219,200, 86, 52, 8,122,110, 24, 42,200,165, 64,233,220,202, 57,181,200, 27,146,251,169, 72,227,198,200, 48,
-105,132,179, 70,161,111, 97,221,103,136,139, 39,177,240, 35,132,131,144, 32,126, 54, 81,228,209, 49,193, 27, 6,188,215,236,152,
-140,156,169, 18,232,160,105,117, 49, 9,199,197, 35,195, 57,131, 13, 59,240, 85,196, 1,206,225,112,130, 55,123,224, 71,111, 44,
-113,249,244, 29,116,155,167, 32,155, 53,216,101,110,174,252, 42, 3,117,203,153,163,150, 8,254,133, 98,149,111,250,218,235,175,
-197, 97,119,137,112,150,241,140,167, 40,206, 84, 14, 23,221,107, 23, 15, 94, 2, 33,234, 53,177,152,166, 30,112, 68,138,192, 70,
-253,221,139,246,180,212,239,132,214,122, 83,118,211,185, 68,165, 54, 78,107,201, 30,195,245, 9,171,184,197, 56, 16,214, 32, 52,
-105,129, 58,201,102, 48, 60,176, 58,192,125,186,192,197, 46,227,121,214,184, 57,178,128, 81, 34, 27,231, 74,144, 16, 72,153, 1,
-187,196,242,200, 96,121,117,133,199,107, 2,155, 86,179,140,185, 94, 89, 73,106,204, 34, 97,179,202,108, 76,117, 74,148,162,100,
-137,166, 9,176,154,202,204,183,215,101, 82, 54,229,123, 20,154,203,133,108,119,109,183,172,150,177,218, 92, 12, 57, 79, 6, 64,
- 10,103,182,206,126,173,255,122,241, 1,176, 52,201,211,248, 90, 0,206, 4,215,116,206, 97,115,254, 28, 59,101,167,154, 10,103,
-203,142,171, 50,227, 83,154,201,205,168,245,142,203,211,207,227,150,137,217, 16, 25, 19,207,229,110,251,242,187,246, 86,173,228,
- 62,204,107, 23,241,116, 79,237,187,187,190, 80,205, 70,123,255,189,176, 83,249,213,178,196,219,127,202, 53, 48,183, 5,189,240,
-117,246,251,196,145,225,219,248, 47,175, 78,141,229,155, 91,145, 27,237, 42,245,131, 41,124,130,237,176,193,189,187,119,241,157,
- 95,253, 53,108, 54, 27,196, 24,113,116,212,225,106,179,198, 16, 70, 28,172,100,247,191,221,170,129, 11, 32, 59,108, 34, 88,103,
-113,255,193,125,108,182, 27,108,174,174, 16, 57, 42,220, 42,123,214, 24,163,220,215, 90, 44,162, 26,178,236,182, 3,214, 23,107,
-145,219,232,100, 71,200,136, 33,193, 88,194, 24, 6, 60, 63,123,142,119,134, 1,236, 61,126,240,225,255,135, 31,253,240, 19,156,
- 63, 63,195,118,183,171,141,109,214, 0, 18,102, 32,134, 8,223, 57,140, 33,170,183,188, 16, 74,161, 12,112,210,115,192,152,226,
-145, 32,214,175, 49,230,249,133, 82,185,150,181, 78, 61,221, 19,188,119, 74,152, 4, 30, 63,121,138,229,114,133, 7,175,191,142,
-190, 23,141,124,136, 17, 93,231,209,119,189, 52,154,142, 36,120,133, 25,139,229, 10,235,171, 45, 98, 88,163,235,186, 74,102,117,
-222,195,119, 14,119, 78, 78, 96,188, 69,138, 9,222, 58,120,239,148, 36,215,225,234,106, 3, 32, 97,177, 92, 96, 23, 37,191,220,
- 59, 33,232,229,156,193, 37,191,156, 8,203, 69,143,245, 85,212,189, 53, 33, 27,194, 48,102,196, 24,128, 44,138,159, 52,142, 24,
- 67, 20,249,154,147,115, 76, 26,116, 89,135,112, 78, 72,156,225,173, 76,190, 68, 12,227,164, 73,115,198,106, 96,140, 1,147,129,
- 3, 97, 80,107, 89,215,117,200,170, 64, 40,104, 69,142, 73, 28,229,220, 68,172,149, 0, 54, 11, 75, 92,243,210,235,186, 78,159,
-197,162,113, 47,196, 55, 89,171,136,126, 61,115, 22, 61,189,209,247, 72,178, 71, 71, 74,232, 28, 16,225, 64,144, 66,206,208,236,
- 0, 6,216, 24, 48,101,112,202,138, 16,106,254, 0, 39,120, 11, 56,103, 17,225,192, 41,194, 33, 35, 91, 43,103, 88,142,136, 36,
-171,128,173, 27,112,104, 8,239,222,177,248,231,175,189,141,252,199, 31,195,240, 19, 16, 45,103,228, 55,190,133, 21,207, 47, 40,
-236,204,165, 33,226,151,147,231,152, 94,225,144,155,255, 39,251, 19, 95,123,239,131, 16, 70,145, 37, 49,102, 90,111,162, 2,177,
- 78,158,218,121,182,251,203, 85,239,189,223,113,100, 66,253,239,108,230,240,249,254,239,168,193, 36,110, 1,215, 51, 14, 56, 34,
- 36,249, 62, 51,243,207, 32, 16, 89, 24,218,129,174,206,112,113,149,177, 43, 68,168,204,136,254, 62, 14,239,117,184,203, 3, 54,
-246, 14, 86, 43,134,143, 17, 17, 70, 38,207,180,197,184,221, 98, 27,168, 26,153,114,133,236, 9,142,154,157,118,153,210, 27,253,
-244, 53,127,245,150,236, 72,166,146,253, 74,209, 43,108,247, 34,183, 32,204,125,238,247, 77,104,102, 4,182, 90,160,185,217,251,
- 55, 5,119,239,179,110,117,254, 25,197,122,119, 14, 73,243,222,239, 42, 19,116, 49,167, 48,198,168,247,188,174, 91,154, 7,177,
- 68, 50,238,235,236,235,141,221,238,255,247, 76, 45,184,106,150,105, 6,165,243, 30, 11,253,166, 74,199,141, 36,204,182,123, 11,
-106,244,241, 85,186,210, 72,181,104,143,241,215,242,203,248, 85,231,243, 61,179, 32, 53, 5,185, 81,159,142,198, 7,134, 94,204,
-113,251,177, 1,254,125, 35,249, 87,109, 0,104, 98,251, 19, 17,158, 62,121,138,191,240, 75,127, 17,255,222,183,127, 5,159,125,
-250,121, 77,200,138, 57,161,239,123, 32,171,132,173, 24, 65,169, 5,180,179, 86, 11, 8,176, 90, 29,192, 88,167,174,109, 25,222,
-117, 8, 49, 97, 55,142, 72, 49, 32,196,128, 48, 70,132, 49, 96,183, 27,112,121,113,137,113,216,193, 88, 41, 38,219,221, 14, 41,
-102,221,101, 11, 43, 28, 12, 44, 87, 43, 60,125,250, 4, 31,254,224, 67,156, 63, 63,195,102,187,145,248,208,204, 24,131,120,206,
- 23,141,181,239, 28, 66, 20,247, 52,210,207, 6,141,207,129,209,169, 59, 39, 9,104,169,249,220,121,146, 85, 90, 35,210,171,130,
-164, 37,157,214,173,177, 53, 13, 45,166,132, 24, 70, 28, 29, 29,193,185, 78, 76, 92, 82,196,178,239,225,187,190, 50,234,141,194,
-254,198, 90, 68,141, 34,117,206, 33,140, 35,188,247,112,206, 73,192, 75,223, 87,148, 96,185, 88, 96,177, 88,193, 90,139, 97,140,
- 56,123,126, 42,246,173, 65,156,249,156,151,162,239,156,151,221,188, 53, 18,174, 18, 34, 66,138, 24, 7, 41,204, 80,206, 66, 74,
-141, 75,159, 42, 1,202,202, 67,154,157,164, 36, 62,174,254, 24,214,217, 42, 59, 11,138,184,148, 64, 37, 5,100,235,144, 82,244,
-231,176,170, 55, 47,138,156,130, 34,130,181,201, 51,202,183,202,211,181,182,106, 80,195,220,160,136,166,162, 27,164,176,122,249,
-122, 89, 87, 24, 25, 75,180,216, 23,164,197, 26, 6,145,133, 53,162, 65,151,247, 33,114, 54, 11,134,117, 6, 67, 54,136, 99, 16,
- 56, 30,114, 63,192, 24, 37,176,105, 82,159,149, 70, 53,195,106, 16, 18, 16,217, 32,198, 12,147, 71,116, 6, 56, 94, 88,156,118,
- 7, 88,159, 57,184,237,103,128,203,168,137,229,213, 65,147, 94,249, 81, 39,180,235, 87, 82,169, 26, 93,211,188, 95, 63, 11,249,
-214,131,161,124, 89,223,247,176, 63,241,181,119, 62,136,195, 88,217,139,185,129, 24,147, 90, 75, 86,146, 4,113,157, 76,145, 19,
- 40,102,132,100,177,171, 38, 45,109, 24,203,190,171,248, 84,136,120,150,149, 93, 96,114,128,242, 14,105,136,216, 36,249, 65,229,
-235,205, 62,132, 81,114,218,213,217, 12,245,247, 37,152, 52, 34,133,140,129, 28,122, 27,193, 33, 97,204, 2, 61,137,227,157, 16,
-217,102,218,114,162,249,126,154,230,103, 63,191,104, 18,226,150,229, 95, 71,213,234,144,102,201,192, 27,139, 78,245,105,133, 24,
-200,250,218, 77, 35,121,175,196,186,230, 26,229, 98,224,211,222, 12, 69, 2, 72,243,226, 60,237,203,105, 38,152,158, 72,109,183,
- 64,205, 5, 30,171,178, 51,204,137,100, 57,205,120, 29,173,165, 43,183, 70, 58,123,251,229, 25,220,188, 23,255,107,136, 94, 10,
- 58,241, 62,243,189,236,206, 27,167, 58,236,201,214, 12,209,124, 88, 46,239,139,219,152,182, 47, 46, 22, 29,199, 17,239,190,247,
- 37,220,189,115,130,211,211,103,181,145,104, 33,247,253,198,250,165,228,186,153,172,235, 38, 64, 15,123,176,124, 33, 6,208, 43,
- 47, 14, 90, 37, 65,202, 25, 57,101,252,250,111,252, 6,222,126,231,109,156, 93,156, 55, 80,134, 60,255, 97, 12,141, 92, 81,224,
- 90,107, 13, 98, 76,120,246,244, 25,158,159,157,129,153,113,116,116,136,123,247,238, 33,197,132,231,103,103,194,113, 73,161,106,
-139, 67,212, 92,245,237, 14,195,176, 21, 51,152, 33,168,124, 42, 33,102,157, 50,141, 81, 54, 53,227,236,236, 12,167,167,103,216,
-237,118, 24,195, 78,159,113,125,102,179,200,216,164,217,212, 44,237, 40,154,106,227, 68,195, 93, 10, 23,152, 97,156,236,238,119,
- 10,211,151,233,209, 90, 43, 59, 88, 98,120, 39, 5, 19,200,162,219, 38,160,235,188,230,190,163,230,178,143, 33, 74,168, 75,215,
-193, 57,135,190,239, 65,134,224,140, 65,215,247, 72, 49, 98,209,245,112,174,171,161, 41,206, 58, 37, 95, 50,150,203, 37,124, 39,
-150,173,197, 97,206, 26,217,205, 91,103, 17, 98,198, 39,159,126,138, 56,110,225,187, 30, 49, 8, 34,177, 90, 46, 96, 92,135,113,
- 24,176, 84,207,251,113,220, 33,170,108, 14,224,202, 15, 64,185, 78, 41,169,149,179,198,169,210, 20, 89, 44, 22,177, 9, 73,211,
-221, 88,215, 42,204,185, 66, 95,210,160,155,170, 4,152,220, 32, 49,249, 70,168, 44, 53,107,250, 94, 98, 18, 52, 7,168,197,187,
-220,115, 37,213,205,212, 67,171,209,157, 52, 19, 59,233,158, 60,169,100,177,144,239,234, 57,167,223,231, 72, 27, 56, 50,152,162,
-136, 88,217,242, 73,173, 98,229,122, 88,203, 96,114,240,196,112,222, 0,198, 43,139, 63,195, 34,235,106,145,164,150,137,173, 34,
- 8,140, 8, 69, 82, 83,192, 1, 50, 14, 15, 51, 30,185,251,136,103, 12, 59, 62,134, 98,248,115, 46,205, 23, 12,129,162,189,195,
-123,170, 65,244, 5,167, 1,154,253,169,235,123,216,175,127,229,157, 15,118,195, 0, 78, 89, 44,249, 50, 16,117, 39,109,102,188,
-239,169,216,165, 60, 34,229, 37,198,163, 55,224, 94, 3,254,132,207,112, 49,227, 42, 17,246,228,131, 51, 86, 88,217,183, 82,195,
-160, 54,212, 58,144,145,122,195,151,221,113, 41,234,101, 67, 72,117, 45,144,203,206,172, 50,217, 9,196, 35,198, 33, 97, 96,192,
-196, 29,182, 67, 22,137, 82,245,152, 23, 59, 69,163,127, 54,197,112,102,111,234, 77,154,157,203,173, 75, 7,239,245, 82,165,192,
- 18,237, 73,210,228,195,113, 5,146,111, 26,132, 9,130,158, 10,186, 37,163,112, 51,166,152,196,102,226,221,207,226,182,123, 8,
- 71,221, 87, 55,240,251,172,224, 19,221,172,111,214, 23, 86,204, 99,166, 21, 66,195, 15,208,201,134,148, 32, 83,183,178,181, 48,
- 78,215,113,134, 64,204, 18,209,168,233, 80,139, 51,224, 92, 86,215, 22,248,107,197,178,133,175,153,103,157, 43, 55, 1, 64, 21,
- 43,170,154,243,235,247,162,249, 2, 59,244, 23,193,239, 91, 13, 47, 33, 67, 55,180,224,215,133,171,116,107,193,221,103,174, 19,
-232, 70,217,204, 94, 62, 95,245,135,124, 69, 54,128,154,204, 60, 63, 61,197,187,239,189,139, 95,251,143,254, 99,108,183, 59, 97,
-164,119, 30, 33, 6, 60,126,244, 8,219,237, 6, 7,135,135,149, 64, 38, 12,244, 92,225,239,139,203, 75, 60,121,252, 8,214,138,
-117,169,247, 30, 7,171, 67,108,182, 27,196, 56,136, 76,172,239,209, 43, 75,252,242, 98,141, 49,140, 24,135, 65,120, 36, 58,205,
-150, 32,150,242,186, 68,182, 36,228,183, 16, 2,194, 56, 34, 40,129, 44, 37,133,222, 53,201, 80,118,172, 18,226,145,115, 66,223,
-123,120,223, 11,124,174,187,108, 49,164,113, 24,199, 88,139,124,113,181,180,122, 32, 75,129,117, 58,217,231,230,217, 21,215,196,
-114, 95, 58, 43,208,252,102,179,197,110,216, 32,133,168,147,167,129,177,242,154, 39,255,247,140, 48, 6, 45,174, 25, 41, 69,172,
- 22, 11,153,158,220, 84,204, 37, 3,221, 84,105,231,249,229, 37,158, 61,121,162, 58,107, 33,171, 25, 35,168, 80, 74,242, 57, 88,
-107, 48, 4, 49,149,241,206,195, 24,171, 69, 85,174,209, 24,130,186,237,229,154, 57,239, 69,127, 38,174,123, 90, 96,135, 65,136,
-107,204, 98, 38,100, 84,254, 43,206,113, 86,153,245, 4, 34,167,233,111, 66,146, 35, 69, 51, 50,207,179, 27,138,124,175, 34,113,
-237,254, 92, 17,204,226, 52,103,202,239,104,221,203, 21, 85,129,242, 24, 12, 4, 65, 17, 68,140, 38,131, 26,107,193,176, 26,150,
- 35, 70, 58, 5,149, 41, 43,142, 12, 2,107, 35,229, 12, 96,157, 7, 96,148,237,110,166,232, 82, 13,133,145,192, 24, 69, 19,160,
- 74, 13,121,145, 72,204, 24, 98,198,110, 76,184,155,119,232, 78, 24,143,241, 26,248,249, 22, 38, 63,215,117,130,153, 65,116, 68,
-179,197,215, 45, 69,250,250,177,193, 45, 66,123,109, 90,167,151,254,156,186, 78,237,122,216,159,252,234,219, 31,140,195, 32,242,
- 9, 54,146,130, 83,164, 78,205,137, 90,161,106,206,224,100,144, 14,222,199,240,165, 14, 63,121,247, 20, 95,191, 76,248,112,195,
- 24, 10, 51, 30,152, 77,191, 76, 83, 87, 38, 33, 1, 84, 93,220,186, 2, 1, 55,197,142, 20, 21,160, 44,129, 41, 65,242,128,196,
-219, 93, 39,175, 92, 39,228,189,196,182, 10,151,155, 6,154, 45,141,129,108,153,103,238,103, 77, 38,123,241,149, 55, 13,149,153,
-107,171,113,211, 69,156, 87,220,114, 40, 56, 66,125,141, 69,198,149, 48,119, 77,115,181, 56,106, 42,146,178,193,103,150,169,251,
- 48, 52, 79,176,188,221, 91,223, 22, 63, 1,218,163, 97,240,181, 98, 62,239, 83,202,123, 32,174, 86, 51,179, 90, 97,218,247, 79,
-211, 74, 6,134,196,163,153,105,150,201, 70,160,217,100,250,226,200, 89,190,102, 46, 99,154,175,173, 17,180,229,221, 80, 19, 27,
- 78,251, 58,142,121, 66,217, 76,254, 70,237,178,103, 94, 23, 95,181,184,179,178,245,119,187, 29,118,187, 93,133, 51,111, 42,170,
-212,120, 49,123,231, 85,139, 29, 91, 69,255,181,223,251,210,135,159,113, 93,162, 49,211,210,221,178,220,215,206, 57,140, 1,159,
-127,254, 57,190,243,157, 95,197, 55,126,254,155,120,252,248,177,154,197, 88,172,175, 46,176,221,108,112,126,113, 33,210, 59, 3,
-120,133,154, 89,181,200, 70,225,247,113,216,225,206,201, 29, 44,151, 75,108,183, 59,128, 8,157,247,184,188,188, 68,215,117,224,
-156,177,217,136,235,220,229,229, 26,227, 48, 34,196, 8,239, 28,250, 69, 15, 67, 34,123, 43,147, 49, 64,232, 58, 95,159,157, 49,
-140,250,247, 42, 69,211,174,205, 59,167,140,237,140, 16,146,106,194, 1,231, 58,248,174,155,238,117,205, 73,151,232,213,164, 33,
- 51, 50,205, 90,109, 32,178,190, 47, 97,226,167,106,133, 10, 24,101,132, 27, 53,209, 17,119,184,194,166,143, 49, 99,183, 27, 37,
-113,110,148, 53,195,110, 55, 8,242, 16, 3, 6,109, 74,118,195, 0,206, 9,135,135, 7, 88,173, 86,112,206,131, 33,153, 12,214,
-154,234, 17, 79, 0,198,144,241,228,241, 99,228, 52,130,180,168, 26, 99,144, 51, 99, 24, 6, 16,103,244, 93,223,196, 38,147, 90,
- 64, 71,132, 16,165,152,199,160,211,176, 32,151, 99, 8, 26,162, 68,122,253,184, 54, 55,146,178, 23,213,152,101,178, 40, 22, 39,
- 55,145, 10, 18, 19,188, 70,160,102,101,185, 23, 59,239, 49, 68, 49,177, 65,163,182,129, 56,226, 65, 67, 86,140,238,201, 11,140,
-110,173, 21, 89, 89, 46,134, 44,102,118,155,146,145, 34,155, 99,128, 53,172, 58,119, 77,187, 83,159,123,217, 97,103,181,157,133,
-254,110, 97,202, 27,102, 56, 39,197,152,213,112,203,121, 21, 83, 42, 10, 33,126,240, 25,214, 48,216, 56,196, 40,104,115,113,158,
-179, 52,201,120,193, 18,110,102,172,193, 8,135,205,142,113, 20, 54,232, 14, 19,206,236, 61,228,117,132, 77, 23,210,216,151,247,
-194,170,128, 34,254,177,198, 6,186, 70,201,121,245, 19,170,253,141, 93,215,195,254,196,215,222,253, 96, 28, 54,200,217, 3,221,
-107, 24,239, 69, 60, 92,140,184, 55, 0, 79,147,122,203, 98,202, 55,143,121, 68,118,111, 99,120,247, 30,190,250,224,251,248,153,
- 79,174,240,127,125, 74,248, 40,147,232,217, 91,253, 55,209,108, 79, 80, 38,220, 98,218,226,245,235, 98, 83,160,139,141,107,134,
- 1,249, 14, 71, 29,112,136,140,144,117,202, 39, 3, 56, 11,103, 50,136, 61,176, 88,225,192, 7,228,144, 17,120, 14,201,206,247,
-191, 19,188, 93, 38, 82, 57,248, 77,117, 60, 67,181,155,149, 15,135,247,226, 48,247,229, 69,133,209, 95, 38, 86, 91, 12,111,244,
-117,138,225, 65, 18,147, 25,210,223, 3,154, 13, 90, 5,134, 42,123,163, 10, 31,171, 52, 47, 21,123,220,166, 49,106, 87, 2,118,
-182,118,161,198,175, 31,117,157, 82,247,238, 77,140,172, 33, 51,197,116, 98, 10,116,161,189, 9,121, 10, 92,153,195,235, 37,241,
- 46, 99, 30,141,187, 31,171,199, 55, 48, 68,233, 6,136,125, 95,147,110, 72,249,242,140,153,156,178,250, 28,211,237,252,208,118,
-235,204,252,226,157,253, 23,121,252,140, 30,246, 47,134,185,219,134,161,177,185,189,230, 18,201,215,174, 40,237,197,224,222, 40,
- 99,155,121,182,211,237, 15,121,147, 26,197, 57,227,233,211,167,248,203,127,249,175,224,215,255,211,255, 12, 79, 79,159,226,232,
-240, 16, 0, 97,189,190,168,197,169,152,185,156,159,157, 99,187,221, 2,160, 73, 83,237, 28,188,243, 98,109,234, 59,228,148,240,
-236,217, 83, 92, 94,174, 53,190, 84,246,157,155,205, 6,231,231, 23,184, 92, 95, 97, 28, 6, 12,195, 88,189,194, 55, 27, 73,107,
-243,206, 85,125,180, 49, 6,198,217,154, 47, 62, 12,131,152,207, 40,215,131,136,100,215,111, 8, 67, 24, 43, 50, 39, 48,183, 17,
- 25,157, 94, 26,103,109, 45, 2,153,179, 22,219, 88, 85, 0,164, 49,175, 33, 68,181, 78,144,224, 19, 64,116,237,133,157,221,198,
-153,150, 78, 82, 76, 95, 36, 26,212, 26,131, 16,165,144,131, 89,118,224, 57, 85,191,247,148, 18, 22,189,199,189,251,247,213, 79,
-157,209,119,157,104,243,173,232,187, 57, 75, 56,205,229,122,131,167, 79, 30, 9,164,172,178, 46,239,188,162, 10,132,126,177,148,
-253,180, 66,235,211, 26, 37, 33,164,132,172, 82,181, 82,232, 83,148,255, 46,211,185, 60, 83, 33, 37,109, 0, 34, 56,199,170, 53,
- 79,172,242, 51, 35,186,114,112,214, 64, 25, 65, 48, 98,102,140, 97, 4,169,159,124,204, 16,114,153,179, 18,140,196, 73,136,143,
-214,168,129, 25,107,145,148, 81,171, 20,106,103, 1, 99, 61,230, 62,161, 60,227, 15, 37,150,157,189, 37, 33, 83,178, 66,225,165,
-113, 22,231, 95,201,251, 8, 33,195, 34, 86, 59, 94,214, 76,137,105,181,167, 33, 97,169,192,254, 70, 57, 4,170, 89, 87, 57,156,
-179, 22,100, 61, 50, 83, 77,212, 43,104,162, 45, 48,191,234,217, 83, 98,220, 49, 17,203, 35,131,179,238, 62,226, 37, 96,226,115,
-133,137,219,224, 50,170,107,210, 31, 91,158, 86,237,190,249, 21,207,167,233,220,238,187, 30,246, 95,251,218, 91, 31,236,182, 35,
-216,222, 69, 60, 54, 56, 92, 94,224,157, 45,227,108, 75, 56, 7,193, 21, 91, 19,189,248,158, 44,128, 17,216, 62,129,121, 58,226,
-147,231, 22,159,176,129,181, 42,195,210, 98,206,104, 73,110, 84,167,172, 50, 9,187, 2,199, 23, 75, 21, 38,176, 91,194,118, 25,
- 29,203,222, 39, 67,178,222, 61,103, 12,153,170, 6,157,201,192, 80, 6,165,128,144, 68, 30, 83,227,180,155,230, 96, 70,176,187,
-246, 58,218,162, 39, 83,178,109,137, 85,149, 48,151,193, 53,130,122,210,219,211,222, 36, 93, 66, 80, 76, 3,217, 39, 48, 88, 15,
- 1,230,180,183,155,167,185,236, 24,147,211, 93,141, 40,165, 9,125,104,119,174,212,196,195, 86,104,184,204,180, 13,196, 77, 77,
- 52, 41, 55, 30,106, 85, 87, 79, 60,243, 97,161, 27, 10,101,187,147,111, 11,166,209, 38, 38,227,246,232,211, 34, 93, 51, 55, 77,
-181, 55,222,208, 13,171,190, 54, 90,172,210, 66,105,148, 80,114,232,247, 96,122,218,223,233,191, 96, 31,117,179,141,234,205,175,
-233, 54, 9, 91,171,220,104, 53,168,183,125,127,219, 42, 82,171,101,125, 33,183,142, 39, 4,130,246, 4,241,183,244,237, 19,170,
- 65,120,252,232, 49,126,246,103,126, 22,191,253, 59,191,139,205,110,139,206,123, 28,159,220, 65, 74, 9,207,158, 62, 21, 27,214,
- 49,194,123,143,156, 51,182,187, 1,151,235, 53, 46, 47, 47,112,231,206, 29,156, 28, 31, 97, 24,196,219,189,235, 58,140,227,128,
-179,243,231, 88,175, 55,149,160, 5, 0, 41, 68,153,210,159,157, 34,134,128,174,115, 26, 0, 98,165,113, 24, 6,217, 41,235, 52,
-153,121, 90,147, 48, 50,198, 48,130, 21,110,103,117, 3,178, 86,194, 56,182,219, 29, 82,146,131, 60,115, 70,138, 25,206, 89,244,
- 93, 55, 11,178,177,226,108, 82,157,238, 74,226, 88,106,236,121, 83, 78, 21, 10,159,216,241, 84,243,224,203,207,115,206, 78, 77,
- 28,203,196,105,213,227,220,104, 88,139,184,172,105, 67, 64,140,152, 50, 58,107,240,230,155,111,162, 95, 44,101,199,109,141,158,
- 1,220,108, 77,196, 1,237,236,236, 28,219,171, 75, 56,239, 43, 66,215, 45,122, 93, 1,200, 19, 24,194,136,164,144, 63,169,155,
-159,144, 4, 7, 49,138, 73, 42, 39, 76,218, 88,160, 88, 72,139, 79,124, 74, 81,119,232,226,254,198,156,171,225, 84,212,194,103,
-157, 3,242, 52,124,101, 13, 59,202,186, 71, 51, 68,240,222, 2,100, 43,210, 97, 12,193,169, 46,190, 26,203,104, 51, 94,210,209,
- 66,146, 93,183, 33,163,114, 65, 51, 35,208, 74, 35,192, 48,198,129,217,136, 95,137, 53,123, 58, 82,141,101, 37, 73,231, 51,148,
-225,157,149,196, 55, 40, 84,223, 76,255, 69,145, 83,206, 55, 75, 89, 72,114,153, 42, 71,195, 32, 11,122,206, 4,103, 4,137, 50,
-122,125,141,102, 18,196, 12,228,152, 97, 33, 42,141,192, 22,135, 57, 97,113,192, 56,243,119,145,214,128,141,103,162,191,191, 41,
-197,129,232, 11, 79,237, 19,242,202,205,120,208,238, 84,233,197,231, 25,203, 78,221, 25, 13, 99, 73,121,135,188, 27,225, 54, 9,
- 79,174, 8,159, 37,192, 22, 12, 88,242,240,176, 48, 9,125,202,216,166, 1,188,206, 56, 77, 14,143,189,193,194, 10, 31,208,226,
-134, 21, 52,205,201, 87, 89, 33, 31,195, 64,224,134,248, 6, 70, 74, 35, 12,101,152, 44, 5,135,210,136,171, 72, 56, 87,251, 89,
-203,226, 16, 71,105, 68,164, 14,180,236,113,200, 27,140, 67, 70,104,118,189, 86,127, 71,158, 21, 59,136,219, 91, 37, 4,170,148,
-162, 4, 21,148, 92,247, 25,149, 89,136, 22,206,137,113, 77, 72,141,244,140,230, 81,176,173,108,169,104, 98, 83, 78, 48,253, 17,
-142,151,140,245,217, 57, 6,150,160,136, 50,112,217,198,168, 38, 53, 70, 55,164,186,244,145, 27,119,236,242,187,136,107,161, 45,
-217,237,243,106,198, 66, 34, 68,172, 0, 0, 32, 0, 73, 68, 65, 84,141,135,187, 92, 11,102,190, 6,241,114,221, 69, 81, 77,151,
-106, 19,227,102, 90,241,253, 48, 80, 37,240,181,251,255,138, 20,112,158, 61, 92,222, 90,120, 67,216,198,116, 13,102,226, 23, 22,
-193,146,177, 76,115, 61,251,204, 53,110,242,186, 39,141, 11,110, 67,118,218, 56, 92,162, 41,239,248, 69,197,243,166,194,254, 50,
- 77,250, 13, 91,132, 87, 48,169,161,253,214,238,246,224,150,246,195,125, 21, 23,170,178,162,209,159, 42,187,105,198,175,252, 7,
-255, 62, 96, 8,222,119,112,206, 99, 24, 2, 58,223,193, 90,135,225,242, 82, 34, 43,115,210,233, 88,152,199,222, 26,156,159,158,
-234, 4, 43,112,170, 76,198,140,139,139, 51, 57, 68,188,199,152,162, 24,204,140, 35,206,207,206, 17,198, 17, 41, 69, 16,201,196,
-151, 82, 64, 24, 70,113,115,243, 29,114,138, 2, 41, 51, 11,113, 43, 38,137, 43,165, 98,157,202, 53,214, 87,166, 96,217,235, 23,
-169,217, 56, 6,116,125,143,197, 98, 89,179,194, 25, 19,108, 93, 98, 84,131,122,157, 23,118, 58, 50,171,135, 57, 99,185,232,116,
-170,142,176,206, 40,178, 75,245, 18,123, 39, 19, 43,106, 84,176,176,201,115,150,223,211,249,165, 72,235, 52,153, 46,198,136, 16,
- 3, 14, 87, 75,188,254,240,109,244,139, 21,118,131, 92,135,190,243,218,100,168,145,140,106,235,119, 87, 59, 92,173,207, 97,157,
-236,189,193, 50, 29,142, 99,192, 56,238, 64, 44,174,119,222,139,116,175,236,202,167,117,155, 92,159,168,215, 15,234,163,158, 70,
- 77,109,203,146,113,159,147,228,123,148, 96, 22, 9,159,145, 45,116,167,254,248,172,205, 71, 74, 89,221,247,196, 41,212,104,231,
- 26, 99, 70,103,178, 42, 10, 8,206, 25, 69,251, 12, 56,201,132,205,186, 63,119,162,199, 21, 73,156,183, 72,129, 65, 41,192,194,
- 79,195,133, 49,234,245, 81,144,185, 12,239, 13,114,242,200, 49,194, 56,131,172,124, 0, 57,157, 5,181,233,188, 69,102, 7, 70,
-170, 78,149,168,140,250,140,206, 2,201,247, 24,135,136, 20, 89, 16, 17, 43,201,128, 60,237,121, 17, 51,129, 18,195,154,164, 92,
- 2,131,200, 25,208,255, 54,194,130, 67,198,194, 6, 24,223, 35,193, 32, 37, 96,151, 2, 94, 55, 17,233,161,195, 71,252, 62,242,
-199, 1, 38, 61, 2,108,127,243,153,178,239,253,254,133,203,123, 99,116,134,201, 8,109,158, 69, 61,255,199,101,157,126,252,120,
- 1, 62, 35,156,102, 73, 84,243,149, 85,100, 65,222,162,243, 25, 71,153, 65,137,177, 99, 49,224,119, 6,232, 40,131,179, 17, 73,
- 85,177,169,211, 98,147,234,185,212,228,176,171,141,106,108,118,188,172, 81,171,148, 71,196,209, 32,106,156,106,177,148, 45,178,
-186,204, 77,182, 58, 8,100, 59, 44,220, 0, 10, 2,207, 3,242, 33, 6, 50,112,214, 73, 7,152, 18,130, 54, 17,208,236,118,178,
- 4,171,114, 11,106, 2, 2, 50,151,137,190,152,208,136, 17,131,181, 70,180,248,152,244,209, 21,146,110, 8,133,104,228, 87,197,
- 77, 45, 15,107, 92, 4,209, 93, 82,149, 97,105,164,108,121,111,153,225, 12,193, 48, 35,228,140,108, 38,195,150,216, 88,180, 86,
-139, 93, 61,240, 91,185, 97,158,115, 18,235, 52, 95,230,192,180,103, 77, 74,109, 24, 10, 55,179, 34,205,111, 24,158, 21, 35,158,
- 28, 20,184, 56, 3, 50,198,113, 0,145,133,243,118,198, 47,200,153,103,210, 57,190, 93,210, 61,175,101,152, 2,107,172,177,234,
- 77,157,102,133,214, 26,211,196, 18, 78,218,125, 96,114,224,163, 23,144, 29, 95,229,117,188,146,114,124,223, 22,191,121,206, 94,
-220, 20,236,155, 30,223,174, 98,227,253,132,183,219,138, 59, 77,156, 2, 67,132, 71,159,127,142,127,231, 23,127, 17,255,214,159,
-250, 83, 24, 67,130,181,190,186,152, 93,174, 47,177, 88, 44, 4,162,141, 65, 10,164, 21,120,157, 7,217,241, 62,125,118,138,139,
-171, 45,190,252,254,151, 4,150,205, 66, 10,155,224, 9,198, 56,238,176,185,218, 98,216,238,132, 4,199, 50, 17, 14,105,212,100,
- 47, 65,211, 68, 34, 38, 12,108,129,203, 13,152, 28,134, 16,234, 46,148,140,133,133,176,221,173,179, 8, 99,128, 49,162,243,102,
- 72, 97, 13, 99,196,209,209, 33, 14, 15, 15,112,118,118, 38,211,179, 78,234, 67,144,172,246,210, 28, 26, 50, 53,201, 48,229,140,
- 24,138,182,158,148,236, 40,127,182,222,104,158, 69,214,251, 77,149, 53,137,107,147, 83, 98,140, 1,129,223,129, 17,198, 57,108,
-174,182,240, 62, 98,177,232,113,255,222, 61, 28, 30, 29, 99, 80,141,191,119,162,203, 47, 97, 40,226, 27, 47, 38, 45,187, 97,167,
-104, 66, 67,210, 77, 73, 19,212,104, 98,203,147,129,211,181,130, 52, 37, 73,174, 93,215,227,252,252, 2,200, 73,178,228,179,160,
- 29,169,176,210, 53,129, 46, 51, 99, 12, 73,108,128, 21, 82,146,244, 51, 93,222, 25, 53,203,225, 56,201, 79,173, 22,186, 24, 36,
-155,156,128,221, 24, 38,178,177,177, 53, 21,174, 16, 41, 89,209, 1, 88,139, 24, 51,172, 1,156,177,128,117,224, 28,235,121, 91,
- 9,175, 6,176, 44, 62, 40,148, 50,156, 35, 36,178, 69,133, 86,221,216,202,153,228, 12,129,201, 34,197,140,156, 0,147, 18,200,
- 42,251, 62,101, 49,151,177, 36,245,168,146,248,178, 28,180, 86, 62,183,206, 18, 18, 92,141,158,205, 40, 4,189,168,251,113,141,
-221,102,134,119, 25,214,247, 96,242,176,156, 97, 28,192,240,216,129,240, 22, 39,140,111, 56,124, 50,126, 21,248,108, 0,241, 57,
- 64,221,139, 75,243, 77,197,248, 85,124,103,168, 13, 79,219, 83,129, 85,185, 13,207,200,211,206,150,138, 0,217, 39,117, 84, 38,
-163, 98,241,106,145,145,177,224, 12, 36, 96, 83, 2, 67, 96, 42,147,157,117,239, 27,180,149,136,104, 93,115,116, 39,165, 59,156,
-178,219, 29, 27, 66,214,196,109, 39,100,163, 38, 45, 69,130, 2, 11,246, 30, 61, 70,196,200,146,252, 67, 0,120, 64,186,220,225,
- 41,140,102, 54, 51, 64, 94, 10, 75,220, 96,179, 73, 72,222,227,200,201,132, 15,226, 58,181, 91,107,225,114, 70,136, 83, 76,106,
-226,234, 69, 49, 3, 70,145, 71, 12, 91,158,246,222,152,236, 92, 9, 19,131,158,247, 32,211,210, 95, 34, 39,140, 89,229, 49,152,
-199,153, 38, 22,189,229,193,114,137,183,238,244, 56, 52, 25,143,206,214,248,228, 42, 2,198, 84, 37, 64,153,168, 91,200,215,170,
- 46,222,233,103, 58,166,172,211,179,102,158,235,238,177, 77,119,203,179, 27, 77, 83,212,120,158,184,150,184, 13,142,189,129, 32,
-216,240, 15,178, 58, 73,189,249,230,187, 24,119,151,120,126,118, 14, 82,171, 77, 3,160,211, 93, 93, 72,218,140, 20, 98, 96,179,
-219,167, 91,138,189, 76, 89,211,110,189,210,122,202,251,111,230,220,226, 88,151, 42,225,113, 74,247,123, 85, 93, 55,223,212, 89,
-220,246,157, 13, 18,112,173,214, 50,223,210, 62,180,168,193, 11, 92,224, 53, 96,227,252,236, 76, 92,196,250, 14,199, 71,199,122,
-152,242,220,162,234,134, 99,196, 24,131,199,143, 62,195, 87,190,250, 85,252,151,127,245,175, 97,181, 58,198, 48, 72,238,185, 49,
- 6,155,205, 6,219,205, 21,172,147, 60,240,245,250, 10,199, 39,135,176,150, 16, 2, 87,253, 50, 89,139,237,110,131,211,211, 83,
-188,118,255,181, 26,226, 65,100, 36, 69, 77,245,210,219,205, 22,163,146,198, 88,139,120,201,247, 46,135, 77,215, 21,127,248, 4,
-239, 28,162, 22, 58,178, 18, 65,234, 53,249,141,213, 0,164, 88,165, 10, 89,205, 98, 24,130,238,195, 25,222,137,247,186, 49, 6,
- 73,211,189, 82, 76, 85,206,196,202, 24, 79, 81,119,232, 80,216,213, 26,244,125, 87, 33,218,178, 14, 40,247, 87,201,102, 7,237,
- 37,231,105,110,123,225,147, 20,214,123, 71,132,152, 12,250,222,227,181,251,247,112,124,114, 7, 49, 68,221,205,219,170, 49,207,
- 57,107,160,139, 54,235, 57,227,106,125,169, 4, 54,225, 0, 88, 43,103, 89, 78, 89, 27, 39,101,237,171,197,110, 84,142,129, 49,
- 6, 41, 68,140, 26,240, 18, 50, 48,108, 55,147, 20, 57, 37, 4,149,164, 21,255,123, 82,253, 54,212,200, 42,229, 92,147,215, 72,
-147, 47,189,181,178, 42,225,172,228,198, 18,159,154, 20,178,151,157,122,239, 45, 64, 14,227, 24,192, 57,194,123, 43, 13,126,226,
-218,204,167,196,138,174, 72, 3, 16,217,136,116,204,104,227,164, 97, 55,229, 62,102,229, 80,180, 73,142, 73,246, 48,138,196, 24,
-109, 14, 51,144, 19, 50, 24, 99, 2, 40, 69,241,217, 7,129,163,190, 39,206,176, 96,144, 34, 48,202,145, 19, 87, 81,125,182,170,
-110, 62, 9, 74,192,100, 96, 25,200, 86, 62,207, 14, 65, 26, 61,146,156,251,164,250, 60, 71, 89, 20, 5,108,240,186, 75, 56,189,
-183,192,238,236, 33,236,246,162, 20,154, 23,158, 41, 51, 95, 19,166,151, 20,118,158,147,167,246,148, 53,251,120, 95,203, 84,112,
-220,120,153, 27, 22,203, 85, 86,253,119,113,139, 67, 48,216,229, 73,252, 31,152,234,132,152, 10,156,222, 20,141,150,196,149, 49,
- 57,129,181,199, 88,141, 13, 45, 44,117,158,152,232, 78,181,241, 1, 64,228, 4, 14,140,145,248,230,137,206, 88,144, 99,152,148,
- 17, 83, 70, 90, 30,227, 75,175, 63,192,189, 21,131,207, 62,197, 15, 30, 49, 46,141,146,216,136, 96, 17,145,134,136,168, 69,129,
- 56, 33,153, 30,139,222,192,132, 29,118, 81, 58, 87,106,101,111, 84, 17,158,137, 17, 95,156,227,184,101,215, 55,233,182, 90,125,
-173, 53,160,220,196,192, 52,118,175,156, 69, 19,249,240,181,187,248,169,215, 87,240, 57,224,193,202,130,126,116,134, 31,110, 83,
- 13, 82, 40,123,168,164, 89,199, 86, 81,132,196, 4,103, 0,195,210, 61,151,157, 93,209,166, 38,190, 89,113, 85, 83,187,244,115,
-172,132, 61,158,123,163, 23,176, 38,237, 19,223, 10, 9, 47,103, 36, 6,222,123,255,125,156, 63,250, 99, 60,122,252, 12,139,165,
-171,205, 1,211, 20, 96,210, 58,186,205, 12,189,136,102, 78,117,197, 56,195,168,107, 79,133,223,185,189,133, 77, 37, 51, 18,243,
- 20, 41, 94,120, 18, 53, 95,126, 90, 43,188,108,234,230, 47,226, 19, 51, 83, 78,220, 92,195,111,247,153,162, 91, 95,143, 49, 6,
-235,245, 26, 23,231,231,248,153,159,253, 6,190,241,141,111,224,251,223,251, 30,126,239,247,254,190,228,139, 91,115, 43,156, 71,
-100,112,126,254, 28,214, 58,252,245,223,250, 45,188,255,254, 87,112,181,222, 2,106, 14, 18,198, 17,151, 23,103, 48,206,226,217,
-147, 39,184,184,184,196, 98,185, 64,136,242,108, 76,236,126,174,158,227,231,103,103, 56, 58, 60,196,114,181, 66,136, 81,101, 94,
- 59,140, 97,168, 65, 42, 99, 8,216,237, 74,170,154, 65, 66,172,242,167,178,173, 45,105, 91, 89, 95,103,138, 9,189,247,117,138,
-143, 49, 41, 81,137,106, 76,173,213,152,209, 97, 28,171,123, 92,167,223,211,242, 26, 88, 27,136,164, 69, 65,208, 84, 22,255, 12,
- 69, 14, 11,211,157,148,192, 70,141,196,178,174,207,161,214,178, 78,220,175,140, 18,232,140, 18, 56,203,123,138,137,100, 90, 12,
-132,195,131, 21, 78,238,222,213, 70, 87,166,125,209, 83, 43, 36,106,157, 6,250, 0, 32,135,243,231,207,176,190,188, 80,221,124,
-153,222, 1,231, 52,252, 69, 29,237,162, 26,244, 8,236,174,197, 47,102, 49,250, 73,161, 42,124, 24,144,166, 45, 6,140,195, 40,
-175, 81,101,152,210, 76, 8,163, 27,197, 6, 55,102, 24,147,171,169, 76, 49,152,146, 73,220,212, 98, 46,254, 83,242, 89,120,107,
-145,140, 23, 99, 28,171,195, 66,150,230, 40,103,134, 37, 97,150,135, 49,130, 85, 51,206, 24,225,156,240, 30, 56, 99, 22,179, 92,
- 38, 87,175,137,106,200,140, 49, 49,210, 48,160,247, 4,104,184, 11,233,121, 98,202,153,130, 12, 54,166,238,241,139,210, 37, 49,
-116, 90,135,248,241, 67,229,105, 96,228,152,171, 23,124,181,138,133,200,247,216, 56, 57, 43,147,192,252,178,210,183,136,201,192,
-210, 40, 57,238, 73,108,102, 3, 0,111, 2, 6,103, 97,131,195,145, 31,176, 57, 56,132,217, 30,128,248, 10, 32,255, 2,164,111,
-239, 79,213, 94,238,197, 11, 65,194,188,110,220, 70,170, 43, 72,165, 34,229,154, 82, 85,138,106, 66, 67,144, 80, 98, 88, 22, 6,
-119,214,147, 44,171,118,188,221,212,154,102,186,202, 45,115, 84,111,197, 50, 97, 27, 52, 59,222,234, 3, 47,186,115, 3,150, 46,
- 67,137, 2, 54, 51, 6, 16,192, 17, 12,177,104,116, 36,240, 8, 72,254, 44, 29,167,116,184,132,128,180,189,196,101, 7, 28, 88,
-130,201,212,120,137, 79,154,230, 9, 50,111, 34, 96, 83, 84,187,211, 41, 80,156,180,200,152, 89, 2,203,196,136,202,237, 68, 89,
-220,219,234,129, 37, 33, 53, 57,171,143,122, 51, 17,151, 99, 36, 19, 99,140, 1, 87,137,112,231,206, 49,150,219, 11,108,214, 22,
-119,251, 14,103,227,128, 75, 45,128,121, 86,149,166, 84, 55, 64, 30, 2,104, 76,108, 97,136, 23,253,123,210, 41,253,154,121, 78,
-227,146,231,116, 39,149, 80,166,254, 41, 28, 38,177,240, 42, 76,205, 69,230, 89,222, 56,233,202,224,159,252,195,255, 27,156, 25,
-139,229, 98,118, 51,103,230,198, 27,126,154,208, 95,168, 3, 87, 54,244,162,235, 16, 70,129,131,139,146,101,206,170,159, 98,120,
-203,165, 41,235,154,196,121,182, 69,104,221,222, 95,245, 31,254, 2, 9, 74,140,107,106,186,151,124, 63, 53,221, 53, 55, 32, 60,
- 87, 98,216,233,233, 41, 82,138,248,175,254,218, 95,199,159,249,197, 63,131, 56,140,248,233, 63,249,211,184, 56,191,192, 63,252,
- 71,255, 15, 78, 78, 78,110,217,243, 19, 54,155, 43, 92,156, 95,224,183,190,251, 93,252,219, 63,243,179,184,188,184,132,247, 29,
-174,174, 46, 1, 48,118,195, 8,231, 61,174,174,214,248,228,147, 79, 0,164,234,220,182,221,238,112,120,112, 0, 2,107, 24,135,
- 64,223, 33, 4, 60,122,244, 8, 95,254,242,251,112,214,226,226,226, 2,231, 23, 23,232,188, 36,132,237,118,131, 36,165,165,140,
-126,209, 97, 24,133,220,229,138, 99, 25,178, 66,188, 37, 56, 68,236,142,141,186,151,109,182, 59,196, 20,107, 81,201, 53, 90,153,
- 53,129, 44,214,189,187,179, 22,221,162,135,209, 9,222, 57,167,129, 38,185, 78,121,165, 72,113, 74,147, 44,138, 25, 93,231, 84,
-135,175,197, 93,155, 1,107,165, 8,151,157,181, 16,187,212,245,172,164,140,129, 96,157,238,130, 65, 74,164, 35,244,157,195,253,
-251, 15,164, 8,135,136,174,239,192, 12,140,195,136,190,239,225,189,155, 60,210,147, 88,185, 94,173,215,136, 49,194,251,133, 22,
-217, 40, 54,187, 81, 86, 32,229, 53, 80, 81,129,128, 53,181, 45,170, 22, 29, 8, 33,169,103,186,196,186,238, 0,196, 49,192, 89,
-201, 29,207,185, 16, 11, 81,247,249,178, 98,136,128, 17,205,191,133, 1, 71, 33,155, 13, 65,127,191, 81, 82,158,179,213,248,201,
- 59,167,207,162,198, 63,135, 8, 71, 4,234, 60,134,144,224, 40,195,118, 11,132,216, 74, 4, 75,195,144,116,205,161, 60, 45, 56,
-204,198, 7,141,249, 6,137,101,173, 91,116, 18, 37,203, 70, 10, 18, 25, 56,195, 96,178, 50, 32,145, 5,177,196,192, 50,107,113,
- 6,193,120, 91, 9,136, 41, 74,129, 54, 98, 37,167, 26,121,163,188, 13, 83,249, 56, 89,237,191,123, 7,192,123,140,153,192, 33,
- 74, 0, 17, 34,146, 1,114,210,124, 16,130,168,176, 66,130,227, 4,231, 24,119, 93,198,233, 73,143,116,126, 23, 54,172,111,139,
- 93,127,193,190,253, 5,136, 27,115,147,232,246, 10,107, 67,154,106,139,253, 87,190,242,214, 7,187,221, 22, 89,108,125, 5,198,
- 64, 22,255,224, 4,153,202, 73,246, 93,166, 45,140,149,149, 45, 69, 43, 53, 83,120,106, 10, 71,241,128, 47, 38, 50, 37,176,164,
- 36,193,161, 70,231,201, 5,119,186,111, 78,250,161,103,149,131, 25,106, 2, 42, 52, 24,101,210, 97,139, 91, 28,193,192,228, 17,
- 23,151, 23,248,225,227, 75,124,114,101, 0,111,208, 53,123, 70,110,108,105,101, 18, 55, 48, 16,233, 75,228,198,246,175,213,125,
- 51,110,152,174,168, 50,237,109, 53,215,129, 42, 4,164,160,197, 25,155,123, 58,208, 43,108,172,208,240,122,179,195,197,102,196,
-176,221,226,211,211, 75,252,224,114,196,182,146,214,154,244, 55,211,106,219,155, 93, 77,249, 29, 45,179,127, 79,163, 62,249,195,
-243, 12,174,241,214,224,168,147,244,162, 49,139,204,195, 27, 43,201, 91,133,121,218,198,131, 80, 43,245,225,106,202, 82, 14,201,
-219,181,151,183,179,221,115,102, 88,231,112,176, 90, 33,134, 17, 41,241, 36, 81, 36,158, 81,240,171,212,178,109, 34,192, 58,165,
-209, 36, 7, 97,122,161,203,219,191,200, 63,188, 71,176,191, 93,197,194,104,227,106,230,102,194,211,242,198, 24,131,231,207,159,
- 35,197,132,223,249, 59,255, 3,190,253,237, 95,193, 31,253,225, 31,224,159,254,254,239,131,163,236,152,255,249,255,251,207,208,
-233,228,115,211,181, 60, 63, 63,199,233,233, 41,126,253, 55,126, 19,223,249,181, 95,195,230,106,139, 24, 3,158, 62,125,132,203,
-203, 11,248,174,131, 33,131,211,211,103,248,209,199, 63,172, 13,233,229,197,165, 76,102,106,128, 2,133,189,235,238,159,228,160,
- 52,100,176,217, 94,225,244,244,121,101, 23,111,174, 54, 88, 95,110,228,126,114, 14,198, 26,209,176, 55,146, 36, 82,175,240,204,
- 89,243, 15, 38,215,177, 24,131, 64,241,229,115, 83, 59, 81,113, 38, 22,104,184, 16,210,138, 25,204, 27,111,188, 1, 34,131,139,
-139, 75,157,118, 51,194, 56,168,163,154,209,105, 59, 85, 93, 59, 80,216,236,182, 38,171,145,106,148,203,190,220,168,219, 92, 49,
- 79, 49, 80,182,180,162, 82,101,170, 55, 86, 56, 59, 41,101,140,195,128,119,223,125, 11,247, 31, 60, 20, 51,156, 69, 47,106,161,
- 6, 78, 47, 70, 69,101, 7, 61,142, 35,206,207,207,133, 72,166, 48,187,115,194,172, 15,234,204, 86,194,102,178,174, 18, 72, 9,
- 75, 37,144,101,183, 11, 24,134, 1,195, 48, 32,132, 17,227, 16, 16, 53,168, 37, 55, 59,216,114,109,188, 53,112,222,171,241,138,
-174, 55,114, 2,169,209,206, 24,229,223, 13,137, 53, 46, 48,125, 14,165, 32,102, 38, 81, 73, 88,192, 57,175, 50, 88, 8, 15,194,
- 24,132, 12,196,113,132,179,164, 42,130, 66,254,181,138,116,202,128, 68,214,128,121, 50,180,169,102, 81, 36,106, 39,231, 29, 74,
- 86, 40,179,132,113,149,166,168, 88,211,182,114, 55, 49,169,201,147,127,124,166,105, 77,164,209,176, 12,209,201,151,137,222,112,
- 18,149,150,106,231, 25, 4,203,202,114,135, 69,142,178,103,231,106,162,163,201, 40, 37, 50,150, 8,158, 9, 7, 29,176,246, 75,
-108,175, 44,204,238, 57, 64,249, 11,201,217,104,246,255,232,166,191,120,185,182,189, 57, 23,251,190,135, 75,186,219, 45,142,103,
- 49, 39, 48, 14,144, 14,143,209, 31,157,227,235,219, 45,174,206, 13,126,148, 8,201,202, 52, 87,117,235, 58,137,229,134, 80,197,
-179,137,125, 34, 49, 77,235, 77, 70,170,166, 46, 25,148,139,188, 42, 11, 49,163, 36,171,105, 55,218,122, 11,147,254, 46, 41, 52,
-197, 26,150,129, 28, 17,213,118,149,201,162,243, 6,222, 83,141,118, 44,214,183,197,158,150,148, 23, 0,154,164, 21,150, 44,184,
- 97,202,115, 19,216, 66,101,106,168,230, 47,226, 49,156, 51,171,188,174, 20, 26,205, 71,183, 22, 43, 98, 12, 41, 97,100,106,156,
-134,120,198,119,174, 59,243, 56,224, 15,126,248, 25, 62,212,157, 91, 38,192, 21,195,133,162,179, 55,133, 8,168,240,122,221,237,
-107, 96,203, 94,177,143, 55,216, 23,184,210,176, 40,218,144, 1,236, 82, 66,239, 44,142,188, 69, 98,221,133,170, 52,165, 51, 50,
- 37, 77, 8,195, 4,191,151, 96, 8, 71, 6,198, 42,220,206, 55, 71, 18,210,181,210,118,221,148,134,181, 41,200, 41,226,236,236,
-172, 54, 49,188, 15,144, 76,233,173,149,211, 81,212, 2, 69,217, 64, 77, 66, 30, 97,206,124,127, 57, 73,239,213, 2, 85,136,174,
-147,229,136, 95,244,253,243,130,222,218,234,112, 3,185,159,159,157, 97, 24, 6,252,221,255,233,127,198,183,190,245, 75,248,223,
-255,222,255,134,179,231,207,177,219,238,176,219,109,177, 92, 46,224,106, 42, 89,147,146,149, 25,151,235, 75,172, 47, 47,241,198,
-155,111,226, 63,249,205,223,196,159,253,115,127, 14,159,125,250, 41,114,102,108,119, 87,136, 33,224,225,195, 55, 64, 32, 60,121,
-242, 24, 31,125,244, 33,214,235, 43, 44, 23, 61, 88, 19,214, 46, 46,214, 56, 60, 58, 20, 4,199, 89,244,189, 64,176,146, 48, 39,
-133,238,211,207, 63, 83,135, 51, 43,186,242,113,196, 48,140, 85, 38,229,212,155,188,188,191, 2,183, 59,107,193,150, 17, 67,214,
-103,177,200,204,180,113,215,207, 77, 32,245, 92, 11, 56, 17, 9,139, 92,253,231, 65, 4,223, 73, 82, 90,202,210,120, 12,131,164,
-184,145,145,192, 9,145,109, 41, 65, 47, 79, 55,142,216,203,102, 37,176,205,253, 12, 50,203,252,232,237, 36,223,141,218,228, 20,
- 63,248,154,244, 54, 70, 36,155,209, 57,143, 7,247, 30,224,232,232, 68,156,236,188,171,146,174,229, 98, 1,239,123,108,182, 91,
-216,156,209, 47,122,100,149,151, 13,227, 40, 54,172,138, 44, 25, 69,198,172,230,170, 87, 54,125, 8,130,134, 89,135,156, 19, 58,
- 47,159, 71, 8, 1,125,103, 96,205, 18,103,103, 82,220,203,222, 62,115,174, 59,244,156, 69,129,195,153,193,150,212,110, 55,213,
- 36, 59, 81, 40, 40,163, 61,203,179,110,156, 56,237,201,223,165,106,136, 3,206,210,200, 56, 39,105,154, 96,120,103, 16, 18, 16,
-198, 65,180,225,186, 14,180,170, 99,207, 57, 85,253,191, 33, 70, 74,194,174,183, 16, 73,161, 20,123,189, 15, 8,213, 30, 54, 68,
- 2, 82, 16, 57, 99, 38, 32, 6,229, 24, 65,220,238,140, 43,211,140,196,182,234,164,152, 88,226, 86,141,145,181,110,210, 96, 43,
-178, 6, 99, 52, 64, 10,133,153, 12,216, 12,134,149, 88,241, 20, 69, 73, 0,130,143, 9,157, 51, 24, 59, 15,142,208,192, 24, 32,
- 39,128, 88,208, 9,182, 70, 26, 7,202,112, 12, 28,249,140,231,135, 7,192,197, 1,128, 51,160, 97, 79,189,148,108,219,172,158,
- 39,163, 15,190, 14,191,191,196, 73,174, 61,227, 92, 33, 33,165,172, 41, 62,234, 42, 20, 23,239,160,123,255, 8,255,106,252, 99,
- 44,191, 31,240,247, 78, 25, 79, 50,144,204,158,225, 9,166,112,128, 76,184,129, 4, 52,177,220, 83,139,162,146, 16,219,140,205,
- 48, 57,233,158, 62,171, 62,125,223,152,100,254,253, 84, 28,218,102, 12,111,174,147,184,232,187,179,234, 46, 25,201,204,119,224,
-220,192,241,212,232,234, 39, 36,163,184,186,113,163, 23, 69,115, 0,101,149,186, 76,251,140, 90,248, 73, 52,182,217,104, 49, 46,
-164,181,153, 57,139,190,174, 18,213,106, 8,198,162, 18, 20, 45,164,211,172,122, 88,149,222,129, 74,186,221,244,243,218, 82, 46,
- 5,197, 84, 40,166,141, 49,109, 39,201,204,115,136,254,108, 24,177, 84,104, 42,105,176,129, 37,125, 13,220,248,180, 23,255,103,
- 42, 57,233, 83, 67, 87,172,110,115,179, 96,166, 27,160,255, 27,121, 31,141,251, 92,217,143, 85, 89, 22, 79,228,184,198, 66,160,
-190,150, 54,202, 21,251, 44,241,189,251,167,253,221, 86, 15,104,254,113, 96,119,154,235,212,219,140,250,118,106,102,222,127,199,
-188,167, 73,159, 38,244,203,139, 11,140,195,128,223,249,239,255, 14,126,249,151,191,141,255,243, 31,252,125, 92,156,159, 99, 28,
- 6,140,195,128,197,178,135,187,146,189, 99,230,140, 48, 4,236,118,219,234,112,247,229, 47,125, 25,255,230,191,251,151,240, 51,
-223,248, 57,188,245,214,219,120,252,232,177,184,179,133,128,163,227, 19,188,241,240, 77, 92,174, 47,241,209, 71, 31,226,217,211,
- 83, 12,195, 14,227,176,131, 85,210,215,213,213, 6, 87,235,141, 56,188, 45,148,128,166, 19, 91,231, 59,164,152, 20,142, 23, 6,
-121, 76, 81,194, 95,148,241,110, 12,129,178, 6,160,104,170, 27,171,215,188, 49, 70, 39, 80, 33,143,133, 16,170, 1, 18, 17,144,
- 99,172,207,212,126,227,148,213,116, 37,103, 70, 34, 3, 75, 22,119, 78,142,209, 47, 22,216,238,118,112,206, 97,115,117,133, 49,
- 12, 90, 80, 37,163, 59,234,107, 69, 99, 4, 4, 50,240, 94, 2, 78,140, 74,244, 38, 3, 20,145,135,121,239,224,212,124, 37, 41,
- 99,219,148, 21,155, 45,142,111,178, 19,122,112,255, 14,126,242, 79,254, 52, 46, 47,215,184,186,186,194,209,201,177, 36,156, 57,
- 7, 64,253,211, 85,190, 21,213,243,126,140, 65, 92,251, 20, 5,168,227,174,202,211,172, 33,120,239, 97,172,240, 13, 66, 12,106,
-126,227, 42, 10,209, 57,143,160,167,235,201,201, 17,214, 87, 6,235,203, 53,198, 16,228,125,235,100, 95,152,233,153, 25, 20, 38,
-185,109,117,210,203,140,108, 13,192, 89,101,119, 14, 41, 71, 69, 30, 53,125,207, 16, 82, 66, 37,159,117, 94,220,216,198,144,100,
-135, 78, 14,214, 72, 48, 74, 76,172,207, 21,228, 51,102,150,180, 55, 3, 24, 24, 53,221, 1, 82, 22,249,153,213, 1, 41, 38, 6,
- 81, 16,174, 12, 49, 44, 89,192, 73,108,106,103, 25,145, 22,224, 20,164, 17, 51, 94,206,228,204, 19,250, 8,105,136,138,173,117,
- 49, 23, 51,152, 76,104,144, 24,222, 49,178,241,224, 36, 68,108, 89,141,138, 46,190,120, 21, 36, 6, 76, 98, 28,216, 4,238,123,
- 12,105,137, 52,142,200,113, 4,114,134,177, 89,140,218,116,168, 77, 25, 56,116, 1,110,217, 33,185, 35,216,240,188,234,223,175,
- 75,104,233, 86,182, 77,171, 92,249, 34, 12,159,253,191,117,220, 56,163,137,118,219,131,243, 26,230,201, 31,225,210,125, 13,191,
-247,213,247,240,103,191,250, 67,252, 2, 71,252, 31,103,192,105, 46, 54,175, 58,189,105,202,140,108, 77,148,173, 73,250, 33,106,
-129, 44,102, 39, 70, 18, 3,144, 97,196,212, 70,181,141,100, 50,108,158,178,196, 75,209,173, 49,160,186, 71, 54, 69, 2,167,211,
- 51, 50, 11, 81,143, 38, 72,155,181,104, 21,102,155,176, 26,167,224, 21,180,209,160,165,232,233,228, 94,228,109,185,229, 40, 83,
- 27,112, 82,188,131,185, 22,208,234, 80,215, 16,181, 74,154, 84, 80, 47,247,153, 43, 93,201,149,215, 41,189,112, 16, 44,230,129,
- 30,109,254, 60, 23,111,225,210, 60, 53,108,118,162,121,120, 73,155,238,222,178,242, 39,178,137,190,190, 42,139,147,247,180, 83,
-127,104, 48, 16, 19, 35,151, 72, 30, 37, 25,101,245, 92,206,106,196,211, 94,239,155, 10, 90, 37, 67, 18,221,200, 36,231,217,154,
- 92, 27,164,162, 55,157, 57, 17,114,237, 1,249,122,123, 90, 97,247,242,159,136, 27, 19, 54,226, 27, 29,229, 12,137, 45,111,204,
-121, 38, 25,252,177, 96,120,222, 51,138,153,173, 21, 50,234,160, 8,222,163,201, 53, 19,250,249, 57,214,151,151,248,238,111,255,
- 45,124,231, 59,191,138,127,242,143,255, 49, 62,255,236,115,164,152,176,219,237,224,189,199,225,193, 33,158,157,158,226,201,211,
-167, 88, 44, 22,120,237,181, 7,120,247,189,247,240,245,175,127, 29,239,188,247, 46,190,254,245, 63,129, 59,119,239,225,249,243,
- 83, 60, 63,125, 46,132, 25,231,240,240,225, 67,144,177,248,232,163, 15,241,241, 15, 63,150, 41, 49, 4,120,231,144, 83,198,122,
-125,133,113, 28,113,181,190,210,125,239, 40, 7,254,180,164,210,100, 50, 41,230,146,169, 45,205,230,118, 28,148,195,192,115, 66,
-156, 78, 93,212, 58, 32, 38,174, 70, 69,214, 8, 3, 29, 36, 17,175,237, 74, 43,229,172, 50, 52,145,110,165, 66,226, 74,250,123,
- 45, 97,181,146,100,179,245,229, 26,219,237, 6,153, 27,167,181,204, 13,207,197,192, 48, 16,115,132, 83,139,214, 18, 8, 20,130,
- 36,206,137,246, 93, 32,245,152,147, 54, 40, 22, 49, 37, 69,203,166, 32, 19,121,174, 83,157, 68,183,195,136,139,243, 51,185,110,
- 41, 33,134, 0, 90, 46, 48,198,136,176, 94,139,231,187, 70,186, 38,141, 41,229,204,240,222,163,239, 59, 12, 59, 65, 2,162, 18,
- 13,153, 25,195, 40,228, 66,223, 57,120,103,149, 24, 40, 48,125, 8, 34, 69,204,250,222,198, 56, 86,158, 66,241,169,231,156, 27,
- 82,114,210,230, 68, 99, 72,181,168,251, 36,171,156,168,141, 23,145,192,254,206,138, 2, 33,103,209,167,151,168,219,156, 11, 87,
- 72, 8,146,198, 90,189, 39, 24,222,103,248, 69,135,148,196, 27, 84,118,234, 89, 10,189,177,147,125, 44, 3,222,137, 36, 45,171,
- 35, 94,210,169, 90,120, 10, 19,239,161, 58,191,169, 62, 93,252,254,189,250,195, 51, 56,141,213,235,157,154,179,217, 18,170,182,
-221, 56, 70,102, 43, 65, 47, 49,194,155, 12,178, 94,210, 72, 45, 35,103, 11, 98, 33,197,177,174, 7,100, 7, 15,245,231, 55, 32,
- 39,150,190, 91,187,192, 14, 14, 54, 92, 33,155, 36,107, 33, 37,101, 50, 24, 75, 34, 28,172, 8,103,203, 99,216,224, 1, 36, 65,
- 33, 64,115,228,240,150,226, 92,199,175, 86,122, 92, 76,199,152, 95,121,208, 16, 68,182, 76, 60,121, 74, 15,203,198,129,210, 19,
-244, 31, 3,127, 28, 94,199,255,242,230, 18,191,112,116,129,247,214,192,217, 72, 24,141, 28,152, 29, 19,178, 61, 64, 62,138,248,
-114,222, 97,184, 50,248, 76, 11, 71,130,234, 50, 75, 1,174, 83,149, 20,247, 12, 3,195, 1, 8,192, 8,101,153,234, 49,226,245,
- 48, 76,205, 27, 43,223, 79,229, 24, 47,176, 54, 99,150, 23,206,188, 31,111,215,128,149,156,175,209,166,210, 13,210, 42, 33,208,
-180,142,102,123, 59, 96, 42, 68, 65,174, 77,192,172,100, 53, 80,127,129,244, 77,107, 12,170,164,185,122, 35,234,248,233, 0, 4,
- 20,118,124,249, 13, 25,177,248, 0,236, 35, 9,141, 70,154,111,152, 54,139, 22,221, 52,210,193, 76,115,246, 54, 55, 35,108,149,
-196,228, 41, 73,175, 94,123,158,124,225,139, 79,252, 77,189,167,153,213, 93,170,186,126,190,197,173,173,134,193,240, 30, 7,225,
- 70,214,186,252,219, 56, 12, 48,198, 10, 83, 56,243, 13,153,128,252, 66, 98,105,102, 89,141,124, 17,163,153,151,145, 93,152,231,
- 58,248, 58, 5,182, 15,108,243,104,147, 78,112, 79,158, 60,129, 49, 6,255,237,223,250,219,248, 15,191,243, 29,252,179,127,250,
-251,248,209,143, 62,150, 34,154, 19,142,142,143,209,119, 29,250,229, 2, 39,119,239,224,151,191,253,109,124,245,107, 95,197,251,
- 95,249, 10,238,223,127, 13, 7,135, 7,136, 33,224,244,244, 20,223,255,222,247,112,120,120,136, 55,223,122, 27,214, 57,228, 20,
-113,126,113,142,239,127,239,123,120,250,228,153, 78,113,140, 24, 3, 82,204,176,206, 96, 55, 12, 32, 48, 22, 93,135, 97, 12, 88,
- 95,172,113,231,206, 9,220,137,175,247,144, 53, 6,187, 52,136,115, 28,149, 61,184, 88,163, 66, 39,163, 34,161,178, 58,205,102,
-150, 61,184, 81,207,239,130,170,228,156,209, 57, 7, 99,100,221, 67,106, 8,146,153, 65,169,192,178,242,252,142, 33, 86,180, 40,
-169,142,217, 58,139,213,106,133, 24, 35,206,206,206, 17,194,168,154, 99,133,148, 99,152, 98,149,115, 97,240, 27,125, 93,164,114,
- 42,229,232, 40,123, 30, 90,116,157, 74,160,162, 26,177, 52,148,214, 58,201, 19,137, 36,175,239, 60, 14, 14, 14,113,121,121,137,
-126,177,192, 98,209,163,239,123,140,163,152,217,244,253, 66, 83,222,116,157,103,164, 89, 38,200, 62,218, 88,241,234, 12, 49, 86,
-130,159,115, 22,153,117, 24, 34,171, 13, 40,106,136, 10,145,232,198, 13, 17,156,247,202,154, 95, 35,140, 81,220,248, 56,195,123,
- 11, 34, 95,157,236,228,127, 45,134,113, 4,105,108,237, 46, 69, 56,245,200, 55,214, 86, 70, 74,202, 73,155,126,225, 54, 68, 6,
- 56, 8, 12, 94, 92, 59,173, 97,149, 16, 23, 50,159, 28,184, 41,103,121,246,157,171,188,159, 98, 15, 92,211,222, 12, 73, 8,182,
- 66,233,130, 86, 64,224,124,154, 8,136, 98, 62, 36,250,122, 78, 12, 99, 2,140,113, 98, 59,155,162,146,142,169,238,213,167, 80,
- 46, 61,163, 20,249, 32,102, 88, 79, 72,236,133,207,145,132, 88, 88,199,197,178, 58, 86, 67, 34, 48,195, 91, 65,116, 66, 6, 92,
-140,176,150,113,224, 29,188,237, 49, 12, 6, 97, 24, 96, 48,192, 90,201,136,143,108,208,101,198,113,159,112,118,120, 4,190, 56,
- 0,241,153, 32, 29,237,250,249, 37,211,246,108, 48, 99,158, 35,153,116, 11,251,189, 1,190,203,119, 57, 24,154,101, 99, 87,190,
-176, 91,130,248, 12,199,143,175,240,236,204,226,127,117,132,101,146, 83,219,233, 7,156, 77,135,180, 32,220,115, 9,171, 45,240,
- 60, 79,154,225, 92,157,210, 68, 66,224,144, 17,216, 72,124,107, 99, 3, 90,121,213, 76, 96, 99,224, 57,131,204, 2,212, 3,171,
-180,197,110, 36, 68, 18,251,192, 74,214,226,185,156,172, 66,182, 74,180,153, 38, 40,154,194,249,120, 98,226,231, 6, 54, 55,164,
-146, 8, 18, 29, 57, 25,104,183, 59,185,189,205, 8, 98,170, 22, 32, 42,147,118,153,220, 81,157,217,166, 2, 55,193,245,153, 76,
-117,188,171, 59, 85,110,224,113,146,135,165, 3,196, 43,190, 41,155,172, 58,201, 66, 92, 41,205,132, 97,154,208,131,230, 99,206,
-237,180, 75, 19,196,157,247,190,174,236,250,185,169,158, 49, 38,181,188,164,122,221,202,205,153,121, 50,208,160,234,165,205,106,
-141,203, 55, 42,166,203, 84, 94,156,237,120,111,196,101,204,227, 89,121,223, 96,129,105,190,200,209,105,254,245,135, 15, 17,198,
- 1,231,231,151,162, 57,221,119,169, 43, 76,254, 27,122,100,254, 23, 96,187, 95, 3,212,249,213, 52,112, 51, 19, 31, 2,182,155,
- 45,158, 62,125,138,247,190,244, 30,254,234,127,253,223,224,155,223,252,211,248,232,195,143,240,233,167,159,162,235, 60,172, 59,
- 66,215,221,215, 44,110,241,183,126,243,157,119,240, 87,254,243,255, 2,174,243,184, 56,191,192,243,231,167,248,252,243,207, 42,
- 60,109, 8, 56, 62, 57, 65,215,119,184, 56, 63,199, 39, 63,250, 24,159,126,250, 41,206,158,159, 75, 17,183,101, 74,149,224, 17,
- 27, 45,152,179,196,141,106,210,215, 48, 12, 56,191,184,196,253,215, 31, 96,185, 88, 97, 12,178, 51,207, 57,171, 51,155,193,168,
-204,246,156, 50, 98, 76, 85,181, 64,133,169,158, 18, 82,158, 46, 72, 78, 98, 38, 67,134,208,119, 94,166,193,198, 29,205,123,113,
- 53, 11, 49,194,235,225,207, 73,159,169, 36,205, 65, 33,237, 45, 22, 43,248,110,129,207, 31, 61,194,197,229, 57, 56,197, 9,118,
-101, 86,253, 49, 1, 81,228,176, 57, 39, 9,154, 41,211,190,181, 32, 6,188,146, 67, 67, 20,184,188, 12, 8,198, 16,156,151,132,
- 50, 70,209,139, 79,211, 54,212,221,238,193,253,187, 56, 56, 56,148,130,155,202, 94, 92, 38,236,190, 95,104,162,217,180,170,202,
- 90, 56,132, 43, 96,176, 88,244, 18, 73, 27,132, 32, 36, 69, 92, 51,189, 83,130, 9, 65, 98, 94,187, 14, 99, 76, 24,199, 81,166,
-236, 78, 18, 51,182,219, 29,134, 97, 39,170, 15, 35,209,184, 57, 5, 57, 71,153,171,212, 75,118,232,192,106,217, 35,132,132,221,
-118, 80, 45,187, 32, 3,222, 79,132, 69, 67, 86,157,239, 66, 77,147,139,141, 27,101,136, 65,214,118,157,228,188,167,152, 20, 29,
- 73,136, 33,193, 27,134, 81, 41, 28, 85,153,149,144,219,140, 53, 96,182, 66,206,163,178,122,209,117,104,146, 51,142,212,189, 47,
-102,249,158, 2, 73,139, 6, 62, 33,151,240,234,134,148, 92,163, 95,181,104, 19,178,124,125, 46,169,112,164, 42, 9, 66,214,180,
- 17, 82, 22, 59, 71,109, 16, 24,162, 63, 87, 4, 38,102, 33, 39,178, 97,216,156,225, 29, 99,229, 29,172,237,177,177, 14, 97,107,
-129,180, 85,239, 19, 41, 2, 71, 54,193, 29, 44,192,254, 16, 20,207,230,156,183, 90,216,169,193, 89,111,115,184,162, 23,168,220,
-111, 41,236,179, 73,157, 12,216,138,225, 78,206,242, 6,173, 58,176, 49, 89,144,137,240, 67,194,217, 72, 56, 51, 66,182, 50, 58,
-123,102,162,255,159,181, 55,251,181, 45,203,206,188,190, 49,230,156,107,237,211,220, 62, 34, 35,156,233,180,179,177,211, 85,194,
- 77, 53,178, 75, 84,163,234, 44, 11,100,202, 42, 81, 18, 24, 75,118, 89,136, 7, 84, 52,162, 30, 16, 85, 80, 32,195, 59, 15, 8,
-241, 7,240,192, 51,255, 3, 20, 69, 21, 66, 84, 1, 46,108,167, 51,237,204,104,110, 19, 17,183, 57,231,236,102,173, 53,155,193,
-195, 24,115,174,185,247, 57, 55, 34,178, 32,164, 84,102, 70,196, 61,103, 55,107,173, 49,199, 24,223,247,251,224,228,128, 97,155,
-240,241, 76, 77, 34,144,172, 0,177,217,186,236, 76,135, 0, 21, 51,101,211,149,187, 19,197,126,197,184, 10, 0, 87,173, 41,221,
-222, 94,159,135,165, 75, 78,235,199,191, 43,241,140, 78,209,216,212, 91,218,104, 13,239, 34, 21, 84, 56,150,213,110, 37,235, 41,
-175,180,120, 86,105, 34,181, 82,213,185, 38, 44, 12, 76, 8,164,114,138, 36,235,100,160, 5,144, 28,141,197,143,177, 46,212,121,
-192, 21,222, 83,186,160, 20,234, 2, 2,214,157,246,186,127,238, 2, 90,164, 6,208, 24, 99,189,197,148,118,180, 59, 19,241, 53,
- 29, 65, 29,134,182, 81,182, 78, 79,158, 60,121, 7,203,180,197,205,126, 86,199, 3,173, 7,180, 82,167, 4,246, 67, 72,186,125,
-125,183, 95, 95,251,155, 53, 22, 81, 39, 6, 54, 86,149,117, 44, 45, 77, 44, 66,157,151, 97,189, 48,232, 36, 31, 93, 68, 11,196,
-143,255,248,215,241,230,245,103,248,236,179,151, 96, 55, 30, 37,216, 66,243, 60, 50, 0, 0, 32, 0, 73, 68, 65, 84,157,102,191,
-127,158,117, 77,228, 71,203, 94,184, 43,150, 93,190,228, 41, 60,165,132,237,118,139,253,126,143, 71,143, 31,227, 95,255, 91,127,
- 11,255,198,175,255, 58, 30, 60,124,136,239,126,247,247,145, 98, 66, 24,130, 22,133, 54,177,208,209,119,240, 14, 97, 24,240,252,
-147,231,152, 14, 19, 74, 46, 56, 76, 7, 75, 61,171, 86, 49,193, 18,103, 60,123,250, 20,223,255,222,119,241,201,139,207,144, 83,
- 54,133,180,237,189, 89,187, 85, 2, 16,211, 98,225, 28,130,195, 52, 89, 34, 23,225,234,205, 21, 82,202, 8,195,160,190,231,101,
-209,215,102, 66, 78, 69,146,138, 5,220,232,247, 26,188,238,202,115,169, 62,114,143,185, 20,196,172,244,179, 97, 8,202,215,102,
- 77,242, 2, 19,202,162,197,216, 15, 1, 35,208, 96, 51, 82,121,237,246,123, 68, 10,198,113, 3, 16,225,193,195,251, 0, 10, 94,
-191,126,173,227,110, 83, 25, 41,101, 85, 71,181, 57, 21, 83,203, 23, 12, 65,245, 1,113,137,144, 0,140,206,131,156, 62,127, 84,
-101,141,181,171,180, 20,209,156,244,174,116,220, 49,208, 45,128,165,136,224,193,253, 75, 60,120,240, 16,209, 10,111,245,208, 15,
-155, 17,129,214,195,219, 24,130, 42,205, 77,185,175, 80, 25,215,146,223, 0,193,103,159,125,214, 84,234,149,244, 71, 0,246,251,
- 3,188, 99,140,155, 77,155,152,228,146,219,253, 26, 83,194, 52, 77,136, 49, 99,127, 56,160, 24,201, 47, 87,152, 76, 93, 77, 21,
- 77, 86, 27, 7,157,162,156,157,159,117,122, 3,101,169,123,175,169, 29,217,132,109,110, 8, 72,169,128,160,215,192, 60, 77,106,
- 49, 99,135, 34, 9, 78, 28, 98,202, 6,120,241, 88,166,197,248,234, 58,150,167,234, 15, 47,150,237, 14,134,164, 12, 98, 19, 57,
- 59,119, 4, 28, 99,189,136,214,120, 92, 75,114, 19,171, 9,181,123,135,148,150,166, 86,121, 33, 41,195,146,248,138,129,106,214,
-154,145,161, 65, 44, 92,116, 29, 64,236,244,185,106,158,122,213, 19, 8, 60, 0,136,183,216, 86,155, 56, 48, 35,131,177, 68,189,
-167,134,184, 32, 12, 3, 30,142, 1, 83, 56,195,126, 26,145,151, 29,184, 36, 20, 8, 54,142, 48,110,128,253,112, 9,142,149,208,
-194,171,124,204, 20,246,248, 18, 93,251,145,102,167, 54, 76,119,192,166,222,182,122,247, 48,243, 64,150,147,116, 43,131,122,100,
-168, 50,206,211, 58,138,173,225, 29,156, 39,164, 29,225, 25,160,197,155,148,236, 83,105,114, 68,132,209, 1, 92,236, 64,106, 39,
- 44, 6, 16,101,229,173,107,161, 32,164,186,131,206,123, 21, 99,128,143,201, 78,125,167, 71,114,172, 86, 42,181, 8,175,158, 82,
- 5, 22,233, 81, 76, 76,148, 35, 29, 61,165, 42,150, 53, 22, 87, 79,139, 37, 21, 20, 14, 8,222, 4,121, 34, 29,132,166,238,150,
-244, 11, 11,102,203,209, 68, 53, 5,201,148,218,251,138, 28, 89,223,170,192, 15, 64, 11,166,193,201, 88,182, 90,178,200, 40,121,
-124,180, 62,208,159, 23, 54, 35,168,100, 76, 75, 92, 73,113,221,238, 58,219,126,141,187,143,104,205, 0, 33,211, 8, 72, 39, 26,
-180,181, 68, 17,189,233, 42, 83,221, 62,167, 92,228,136, 34,183,142,204,235,196, 2, 71,184,211,163,172,244, 30, 46,131,117,215,
-217, 11,203,164,155, 16, 53,165, 58, 31,255,158,246,223, 53, 89,139, 8,255,207,239,254,223,154,126, 53,142,205,130,232,236,141,
- 38, 41, 45, 35,190,200,219, 11,186,119,181, 72, 37,124, 97,244, 41,125,142, 64, 69,142,197,123, 62, 24,128,199, 30,230, 55, 55,
- 55,216,237,182,184,119,121, 15,223,250,246,183,240,179, 63,247,243,248,235,127,253,151,241,173,159,250, 54,222,188,185,198,135,
- 31,126, 8, 49,134,249, 56,110,236,103, 12, 24, 55, 35, 0,193,110,191,195, 60,207, 56, 76,123,188,126,253, 26, 47, 63,253, 12,
-247, 46,239,235,190,111, 89,154,170,123,158,103,108,111,190,139,105,191,199,171,151,106,141, 75, 41, 91,214,182,121,192, 29,183,
-195,209, 56, 12,112,228, 90, 23,152,211,154, 54,118,216, 29, 32,143,244, 0, 21,130,183, 2, 87,176,204,213, 15,110,162, 78,219,
-143, 39,123,176,138,101,158, 43,174,180,192, 51, 99, 51,142,134, 56, 53,108,169,117,111, 64, 49,214,249,210,196, 96,165, 36, 83,
-173,231, 70,167, 99, 86, 91,216,197,197, 5,158, 60,126,132,235,235, 27,236,182,187,110, 26, 7, 13, 27,129,142,236, 83, 84, 85,
- 55,234, 72,190, 78, 50,152,155, 13, 79,140,166, 86, 65, 59, 82,164,173,218,138,169,172, 29, 57, 36,219,117,215, 11,192, 59,198,
-163, 71,143, 48,142, 27,139,118,213, 3,192,229,197, 57,200,188,233,234, 93,223, 96, 73, 74,192,171,207, 24,231, 8,131,247, 42,
-228,203, 17,142, 61,198,113,196,124, 56,104,113,177,192,152,200,197,168,144,162,154,131,106,241,147,130,121, 90,204, 29, 80,192,
-206, 35, 30, 76,196, 69,250,122, 53, 56,202,240,184, 86, 36,131,137,216,114,156, 49,218, 62,127, 89,162,193,122, 24, 49,235,244,
- 1, 16, 20, 75, 34,116, 76, 26,197,189, 40,129,144, 73,112,113,190, 49,229,126, 86,157,141, 49, 76,130,119, 42,166, 43,130,224,
- 73,137,107,246,179,234,129, 41,102, 2,197,132,209,123,120,231, 16,139,141,236,201,108,104,246,157,144, 89,233,138, 16,138,100,
-123,134, 89,232,140,243,246, 76,210,235,178,118,231,176,131, 64,139, 66,181,230,139, 21,166,111,211, 7, 1, 83,108, 43, 23,234,
-166,149, 82,109,113,146,213, 82,109, 59,246, 36, 69,239, 75,202,136,217, 35,207, 9,131, 19,156, 13, 12,156,109, 48,225, 18,136,
- 91,100,201,112, 34, 56,115, 25,187, 97, 3,236, 6, 64,102, 93, 41,116, 19,199,138,189,253, 66, 22,252,106,223, 63, 22, 22,223,
-241,103,239,130, 95,121,201, 25, 57,137,178,211, 21,166,214, 88,226,125, 48, 6, 87,239, 54,173,133,166, 0, 93,228,156,141,192,
-136, 33,204,240,204, 24,107,106, 25, 3,222,178,111, 11, 17,188,137,192, 42, 40, 68,160, 31, 96, 33, 86,216, 73,183, 25,117,221,
-239,171,158,201, 58,107,168,170,104, 18, 6,156, 67, 64, 82, 76, 96, 55, 42,175,124,155, 98,133,119,237,160, 87, 69,188, 50,223,
-173,236, 4,229,252,150,124,188, 75,111,226, 57, 90, 39, 1,142,128, 60,237,240,124, 38, 92, 92,156, 97,112,107, 82,153,156,136,
-167,154,218,149,212,118,145, 44,116,197,196,234,109,119,226,236,221, 22, 81, 56,135,208,106,126, 42, 32,132, 48,194,149, 5,243,
-178,116,159, 9, 31, 41,209,165, 9, 11,143,191,240, 58, 42,167,154, 47, 92,233,126, 88, 65, 28,175, 94,126, 6,144,131,119,186,
-243,100, 59,205,102,139,107,236, 11,153,156,108,139,169, 59,130,172,243,148, 99,122,124, 57, 82,186,203,145,136,176,159,202, 28,
-169,220,239, 80,131, 44, 49, 42,151,223,194, 60, 96,107, 11, 66, 63,182,251,252, 46,221, 15, 3, 8,192,110, 23, 13, 82,241, 5,
- 39,231,222,130, 34, 39,226,184,142,121, 95, 71,193,175, 95,189,194,188, 44,248,206,119,190,131, 63,253,103,255, 12,126,225, 79,
-253,105,124,243, 91,223,194,131, 7, 15,145, 98,196, 15,126,248, 1, 22,219,105, 59,239, 85,140,232, 61,206,206, 54,184,119,239,
- 62,174,174,175,240, 71,223,251, 30,222,188,126,141,121,158, 49,205, 19,182, 55,123, 21,207, 57,135,247,126,236,125,157,198,216,
- 33,245,176,159,176,221,237,176,187,217, 90, 74, 90,208, 17,108,142,250,128, 47,235,200,178, 20,193, 20, 19,242, 97,106, 29,229,
- 60,207, 24,135, 1,165,232, 65, 96,115,182,193,118,187,195,189,139, 11, 12,195,128, 15, 62,248, 8, 49, 69, 85,164,155,175,217,
- 89,167, 74,220,126,176,118,234,222, 35, 7,237,110, 29,187, 38, 66, 83,187,155,122,125,139,129, 76, 82, 76, 6, 92,209, 99,222,
-188, 36,245, 3, 67, 71,161,126, 80,181,241,187,239,190, 11,231, 3, 62,249,244, 83,219, 21, 83,251, 25,142, 8, 41, 38, 99,254,
-235,189,227,189,111, 86, 47, 87,243,216,139, 1, 80,104,141, 57,214,120, 86,110, 19, 24,198,154, 89,225,189,122,215,131,249,189,
- 47, 46,206, 49,110,148,170, 71, 38,180, 11,110,104,180, 62,128,177, 44, 73,213,220, 57,173,226, 60,123, 13, 75, 74, 58, 89,177,
-157,183,247, 1,201,199, 22,111, 75,108, 32, 41,203,125, 47, 34,237,208, 21, 99, 68,178,200,215,184, 44, 22, 2, 83,144,236,251,
- 80, 81,154,174,208,160,193,100, 42,252, 50,143, 54, 51, 99,201, 25, 1,107, 54, 3,179,129,177,236,130,174,223,143,247,220,132,
- 91,195,224,144, 11,176,204,179,125,166, 42, 40,203, 66,200, 49, 97, 8, 14,222,143, 88,162,182, 53,228,213, 34, 87,109,191,100,
-233,121,197, 44,179,154,240,230,144,138,206, 36, 11, 72, 3,134, 56, 1,126,104, 74,165,156, 11, 88,114,219,253,139, 9, 41,115,
-206,150,226, 87,249,254, 98,232, 86,197,239,194,196,133,167, 83, 62,205, 94, 87,184,143,160,122,231,197, 40, 41,210,137,250,168,
- 25,166,181, 6, 56,100, 0, 75, 42, 64, 74,216, 56,194,229, 89, 64,226, 51,204,215, 2,151,175,176,145,132,203, 97,192,203,139,
-115,200,155,115, 16, 14,183,198,227,234,185,151, 47,203,171,108,172,148, 83,231,206,169, 53,246,244,199,121, 54, 11,136,130, 97,
-172,227,145, 85,137,142,206, 70, 38, 21,247, 74,189,245, 10, 77, 57, 79,125, 55, 47,128,176, 52, 2, 81,233,118,187, 73,180,235,
- 85, 30, 60, 35, 15, 1,247,134,140, 49,102,188,137,107,222,186,227,186,163,102, 19,215, 85, 59, 86, 89,211,201, 68, 21,244,206,
- 57,120,100, 67, 7,174,218,128, 85, 84, 81,236, 33,191, 10,204,214,240, 22,129,164, 45,174,248, 79,226, 47,252,214,175,226,175,
- 60,255, 31,240,223,253,143, 47, 49,159,111, 48,122,110,158,207,202,146,116,196,112,105, 65,220,188,135, 95,252, 51,191,128,119,
-166,167,248, 95,127,255, 57, 94,206,132,224,216,128, 10,107,210, 84, 63,162,149,206, 7,149, 65, 8, 32, 12, 78,189, 2, 73, 4,
-179,237,236,185, 41,239,215,140,118, 64,176,187,185, 54,171,137,107,147, 11,233,124,232,169, 78, 82, 68,144,160, 22,147, 12,165,
-194,113,167,142,215,239,153, 86,191,123, 27, 67,186,118, 83, 17,160,116, 44, 75,202, 90,195, 81,214,226, 43,221,252,122,237,198,
- 75,163,185, 53, 79,122,167, 77,120, 11, 21,249,232,130,150,211,188,215,238, 2, 22, 11,156, 56,213,143,144,244,167, 89,185,115,
- 51,213,171,206,167,195,161,253,239, 31, 73, 28,215, 47,212,229,246,207,189,190,186,194,245,205, 13,126,246,231,126, 22,191,250,
-175,253, 13,252,226, 47,253, 57, 60,120,248, 16,135,195, 1,111, 94,191,198, 15, 95,255, 49,166,121, 50,111,190,217,129,146, 62,
-232, 30,222,187,135,203,203, 75,252,240, 7, 63,192,255,246,143,255, 9, 62,251,236, 83,165, 99, 89,167, 60, 91,218,217, 60, 29,
-176, 44, 11,222,121,231, 9,118,187, 61,130,215, 4,179,195,110,135,237,110,167,216,224, 10,131,178,110,146,160,236,239, 98, 49,
-158, 41, 42,191,124, 63, 41,234,117, 24, 60,188, 99,220,108,119, 56, 28,246, 74, 42,115,206, 82,192, 14,198,142, 80, 65,149,142,
-217, 29,200, 73,235,248,116,132,173,221, 49, 57,134, 75, 17, 82, 52,100,165,136, 24, 37, 80,108,228,111,150, 32,123, 56,123,207,
-109, 77,208,116, 36, 82, 52,134,147,128,135,143, 30,226,201,227,199,120,246,252, 25,166,105,143, 97,112,205,178,149,203,186,203,
-175,223,123, 85,237, 87, 75, 89, 8, 94,125,222, 41,219,189,207,134, 63,205,173,128,171, 50,127,165,191,233, 42, 82,137,113,197,
- 56,228,247,239,223,215,145,123,138, 90,148,157, 55, 5, 61,112, 56, 76,216,156,109,192,240,170, 96,231,160, 54,169, 28,113,126,
-126, 6, 2, 99, 90, 84,216,199,206, 25,228, 69, 47,208,104,182, 64,103, 97, 57, 4,210,239,212,138, 81,138,139, 29, 74,164, 21,
-184,221,118,143,101,158,225, 72, 67,176, 42,103,159,201,161, 32,106, 46, 59, 8,211, 28,213,182,102,142,131,122,168,168,169,116,
-204, 4,102,253,189, 41, 43, 63, 63, 70, 29,101, 7,199,237,179,136,115,196, 40, 5,112, 65,185, 0,206, 89,226,156,174, 33,121,
- 51, 98, 89, 22, 4, 41,112,206,155,195, 64,180,128, 26,175, 96,177,181, 72, 24, 70, 48, 19, 74, 22,144,165,191,197, 4, 4, 74,
-154, 10, 90, 3,126, 44, 33, 48, 21, 32,167,168, 66, 57, 18,133, 8, 85,143,149, 84, 59, 90,105,177,170, 21, 26, 70,164,135, 76,
-120, 70, 46,164,174,134,172, 12,250,213,254,107,110, 43,155, 78, 48, 52, 84,139,179, 58,179, 96,147, 3, 41,130, 76, 5, 83, 98,
-140, 49,226, 94,112,144,203, 13,100, 87,128,178,195,153, 47,240, 99, 64,241,231,160,248,242,136, 46,247,133, 4,185,163,135,140,
-124, 81,212,227,250,164, 44,183,131,164,221,159,252,214, 87,127,103, 63,205,109, 22,218,136,113,178, 62,192,233, 14,177, 79,131,
-144,116, 74,234,138,238,172, 22,177, 36,107, 26, 25, 42,138,214,246,234,197,134,244,197,124, 83, 52, 56,220,227, 12, 78,130,189,
-160, 11, 23,237,122, 56,194,137, 51,187, 27,165,151,132,148, 87,146,221,170, 80, 71, 27,241,151, 58,190, 61,137, 18,213,142,222,
-193,177, 32, 93, 61,199,211,143, 94,226,229,100,106,205, 59, 26, 56, 54,161, 71,137, 51,174,203, 25,190,254,157,175,227, 43,249,
- 19,252,209,139, 5,228, 25,124,228, 71, 95,105,229,245, 51,228,110,165, 32,246,154,206,236, 36, 59,131,112,127, 12, 24,168, 96,
- 50,235, 46, 29,145,220,142,173, 89, 76,188, 90,133,136,142,216,237,167,209, 2, 76,181,136,215,195,206,237, 92,246, 85,184,166,
-239, 61,198,108,202,219,117,117,113,148, 6, 78,171, 5,175,238,196,228, 68,253,126, 42,136,171,212,190,158,187,125,235,162,237,
-171,231,233, 27,151,147, 8, 83,233,168,103,114,251,152,240,121,144, 25,193,151, 79, 60,238,182, 16,237, 94,233,215, 12, 75,140,
-120,246,244, 41,238, 63,120,128,223,252,237,191,141,127,247,239,252,123,248,185, 95,248, 83,120,253,230, 53, 94,188,120,142,235,
-235, 55, 72, 49, 98,115,118,142, 16, 6, 12, 65,187,243,253,116,128, 99,198,215,190,250,227,184,188,188,135,239,253,225, 31,224,
-127,254,159,254, 33, 94, 60,123,209,226, 54,163, 33, 60, 53,206, 82,145,157,203, 60,235,218, 41,171, 96,105,183,223,219,158, 93,
-187,181, 20, 99,195, 6,137,237, 84,146,225, 86, 21,192,162,221,231,188,204, 32, 20,108, 54, 35, 98,202, 56,236, 15,184,119,255,
- 62, 30,191,251, 4,113, 94,116,172,191,221, 66, 68,148,237,110, 22,176, 82, 50,150, 37, 90, 97, 94,231, 89,206,105, 2,217, 52,
- 45, 54, 41, 40,205, 13,192,102, 23, 82,139, 87, 49,192,140,249,209, 83,205, 80,103, 29,171, 22,133,224,156, 95,156,227, 39,126,
-226, 39,113,179,189,193, 39, 47, 62,105,105,125, 57,215, 63, 35, 38,178, 82,120, 81,237, 46,170,167,188, 6,171,140,193,195, 57,
- 45,106,104, 98, 93,193,102, 28, 52, 91,157,106, 71,104,138,121,239, 0,210,208,162,105,154,113,239,242, 28, 79,222,121,167, 37,
-202, 85, 20,170,179, 61,121,178,117,193, 48, 14, 24,194,208, 18,233,134,160,158,235, 57,170, 21,107, 99,224,156,253,126,210,239,
- 72, 76,153,205, 74, 91,139, 81,243,207,153,184, 17,254,106,228, 44,147,134, 64,197, 37,226, 48,169, 88, 14,150,104, 87,161, 61,
-170,246,247,214, 37,195, 82,233,248,104,106, 88,241,188,181, 67,119,204, 29,188,169, 50,234,215, 9,165,103,157, 42,136,185, 0,
- 80, 10, 70,111,129, 53, 5, 32,232,110, 62,102, 66,142,139,137, 28,139, 1,123,208,214, 2, 85, 56, 28, 60,131,216, 91,146, 90,
-229,220,103, 13,125, 33, 52,199, 66,177,125,122,177, 80, 25, 71,164,188, 0,211, 8,233,247,236, 20,178,147,179,226,100,217,163,
- 20,227, 75,175, 18,244, 91, 44, 11,221,213,163,166,189, 84, 88, 41,192,164,184,216,156, 43, 31, 85,247,252, 45, 55, 93, 63,167,
-115, 22,184,141,195,132,115,248,152,192, 46,225, 74, 2,230,109, 2, 47,175,209, 21,130,227, 71,219,231,227, 39,111, 61, 4,229,
- 45,255,132, 90,160,212, 42,192, 30,198, 1,238, 79,124,243,253,223,153,246, 11, 74,177,192, 3, 19,203,245,177,149,133,110,143,
-147,123, 19, 81, 31,218,210,228, 61, 69,199,161,165,142,191,161,227,246, 42,148,171,157, 61, 67,192, 57, 97,153, 51,174,213,225,
-182,178,214, 79,146,220,142, 11,124, 87, 92, 78,132,113,114,186,143, 48,176, 74, 63,142, 62,198,169, 18,192, 30,129, 14,184,122,
-250, 20, 31,222,120, 13,120,161,238, 1,222,125,154,106, 81,103,120, 18, 76, 47,159,225,159,253,243, 31,226,163,157,195,232,185,
-137,242,208, 4,110,173, 71, 90,135,213, 93, 49, 35,251, 92,102, 11,204,169, 2, 29,253,172,168,197,217, 74, 7,191, 17,185, 93,
-174, 42,248,133,187,223,223,155,169, 86, 80,206, 93, 42,117, 62,222,239, 19,183,131, 91,245,203,183,253,101,199, 24,238,127,203,
- 93, 10,242, 91,192, 25,234, 15,138,171,229,175,170, 73,168, 69,158,209,157, 98,144, 91,158,205, 59, 84,110,111, 57, 38,188, 85,
-237,254,101, 11,122, 71, 10,238, 86, 80, 10,217,184,185,185,193,203, 87, 47, 1, 1,254,234, 47,255, 53,252,135,255,209,223,197,
- 95,254,171,127, 13, 87, 87, 87,248,224,131, 15,212,134,100,201,104,103,155, 11,220,127,112, 31,193, 7,156,157,159,225,226,252,
- 2, 62, 4,252,216,251, 95,197,197,229, 37,254,249,239,254, 46,254,209, 63,252, 95,112,245,250, 10,193,188,213,231,231, 27, 11,
-251,112,112, 78, 71,234,213,138, 86, 11, 83, 41, 5,243, 52, 25, 67,124, 85,164,247,103,162,250,208,175,145,158, 58,202, 77,237,
-158,101,214,206,117,158, 23, 8,128,199,239, 60, 6, 32,154,196, 22,147, 10,211,108,255, 92, 35, 61,171,104, 50, 53, 81,155,104,
-176,200,178, 52,151,136, 90,173,130,102,178,103,237,234,151,101,209,177,118,112,173, 59,100,231, 20, 78, 82, 59, 88, 34,140,227,
-136,175,126,237,107,136, 49,226,249,139,231, 16,209,131, 68, 49,188,105,177,107, 39,120,237, 6,171,123, 35,120,223, 52, 14,250,
- 57, 58, 27,213, 75, 99,128, 83,247,112, 33,227,167,231, 82, 11,172, 51,113, 99,110,132,189,135, 15, 30, 96,220,156, 33, 46,250,
-153,141,155,177,165, 21, 58,199, 24, 55, 35,134, 97, 64, 46, 5,211, 50, 43,133,205, 43,242,180, 2,119,168, 19,122, 49,187, 86,
-152,213,242,165, 73,108, 57,197,134,220,173,101,184, 82,242, 68, 84,215, 48,205, 51,226, 50,235, 40,222,242,212,235, 33,130, 26,
-146,214, 40,127,206,129,236,253,175, 76,121, 90, 25,252,246, 30,106, 72, 19,147, 50,242, 29,123, 75,102, 43, 43,234, 86,180, 75,
-174,239,155,161, 7,138,108,121,244,197,196,119,245,122,170,251,242,138,255,101,166,118,159,171,246, 77, 77,197,177, 8,168,164,
-246,236,174,171,186,250,125, 84,110, 9,106,144, 75,221,191,219,235,234, 19,231, 42,167,164,119,247,100,155,234,120, 22, 5,219,
-128,215,169, 14, 85, 97,159,190, 87,169, 98,185, 86,219, 10,156, 3, 10, 57,141,124, 69,182,228, 55,194, 72, 25, 8, 14, 5, 3,
- 54,156,176,245, 14, 55,187, 0,183,123, 13,208,172, 83,135, 59,218,236, 38,160, 38,186,163,253,190,131, 24,123,215, 51,137,112,
-156,199, 74,132,113, 24,225, 83, 94, 31,202,212, 0, 48,198,115,175,254, 66,233,125,223,221,222,180, 79, 72,106,126,108,105, 2,
- 45,182, 16,130, 66,189,181,168, 14,212,215, 93, 65,245, 92,175,217,230,149, 11, 95,189,166,116, 52, 82, 63, 13, 86, 81,149, 52,
-175,202,176, 54,169,165,213, 19, 89, 87,159,165,180,241, 62,186,177, 54, 73, 65,130,195,112,126,129,129,120, 93, 57,128, 86, 12,
-108, 7, 18,168,164,169,176, 57,195,163,182,199,238, 60,220,180, 30, 43, 24,171, 71,159,154,202,151, 86,112,141,144,217, 41, 50,
-144, 11,118,139,193, 36, 58, 17, 7, 81, 65, 42, 2,103,130, 63,181,154,148,206, 38, 39,134,234,164,182, 31, 63, 74, 44,107, 12,
-111, 29, 35, 21,194, 45, 24, 74,253,231,220,204,127,104,136,221, 86,111, 75,133,222, 28,199,165,244,211,131, 35,255,249, 29,197,
-148, 78, 15, 23, 93, 97,166,198, 99, 86,251, 35,173,114,125,203,164,198,209,123,209, 67,167,216, 53, 74, 77,115, 33,221, 97,227,
- 71,119,160,223,185,222, 82,168,146,237,233,110,182, 91,108,183, 55,120,252,248, 9,126,250,103,190,131,175,127,253, 39,240,231,
-255,226, 95,196, 47,254,210, 47,225,112,152,240,253,239,125, 15, 32,193,229,197, 37,198,113,196, 52, 29,144, 54, 9,227,102, 52,
-229,177,118,154,247, 46,239,225,222,131, 7, 88,230, 25,255,228, 31,255, 35,252,211,255,253,255,192, 60, 71,220,187,119,105,187,
- 71,198, 28,151,246,190,193,132,101,158, 49, 29, 38, 92, 94,156, 67,164, 96,154,167, 54, 58,173,194, 73,145, 2,207, 10, 48,137,
- 41,106,204,168, 9,197,106,156, 45, 68,161, 38,211, 60, 25, 20, 69,218,232,252,197,179,231,120,254,241, 83,252,248,215,191,142,
-105,154,145,162,218,156,196, 57,196,105, 94,131, 83,108, 53, 21,188,142,238,183,219, 29,166,105, 6, 59,106,226, 58,102,135, 97,
- 8,152, 38, 61,136,100, 35,158, 57, 70, 19,216,181, 53,129,237, 93,116, 29, 48,226,201, 59,239, 98,158,103,188,121,243, 26, 69,
-106, 40,204,170, 88,103, 6, 98, 44,150, 20, 86,187,118,187, 22, 24, 96, 23, 26,234, 85, 25,239,104,148,200,122, 48, 80, 70,188,
- 98, 76,197,160, 57,165,232,133,158,114, 70, 8,132, 7, 15,238,227,226,242, 94,155,116,184,102,125, 83,118,253, 18, 29,198, 81,
- 33, 52,234, 52, 96, 21,197,149,130,148,102, 21,228, 85,254, 61,151,102,253, 13, 33,224, 64, 14, 49,205,144,168,135,128, 97, 24,
- 86,177,148, 89, 21, 85, 3,160,227,235,121,137,216,239, 15,136,203,220,184,244,197, 32, 64, 68,108, 40, 92,213,218, 20, 1, 22,
- 35,252,113,245, 64, 55, 37,182, 30,134,152, 29,230, 88, 71,219,104, 98, 52,231, 28,156,168,144,110, 94,116,221,224,216, 55, 64,
- 84,150,130, 37,101,140, 68, 96, 23, 20,149,203,172, 40,217, 18,117,162,144,149, 60,167,130, 60, 61, 4,128,216,210,248, 84,209,
-206,206,112,174,214, 20,165, 12,181,155,177,179,107,222,153,144, 15, 71, 29,183, 0, 64, 42,141,176, 89, 76, 48,237, 28, 80,152,
- 90,125,169,140,121,117,142, 59,219,109, 23,101, 24, 16, 65,216,105,206,132, 36,253, 92,172, 19,173,186, 41, 61, 28,171,110, 41,
- 18, 97, 94, 8, 27, 89,112, 0,161, 28, 4,227,184,197,141, 63, 7,230, 17,247,249,128, 23, 23,231, 40,238, 30,184,220,124,110,
-215,208, 79,155, 5,178,250,210, 72,190, 12, 96,246, 24, 89,221,233,178,124, 65, 89,247,222,117,252,126,164,253, 41,182,118, 54,
-150,250, 81,194,217,202,117, 7, 52,186, 85,186, 14,155,142, 34, 74,187, 14,154,186,214,151,212, 43, 94,186,176,147,110, 89,222,
- 58,145, 30, 48,192, 70,149,235, 5, 85,217, 68, 96,220, 85, 42, 22, 89,139,248, 73,249, 90, 1,111,189, 57, 78, 31,154, 76,114,
-228,195,206, 53, 94,245, 4,242, 82, 44, 26,181,249,223,237, 80, 83,101,109, 10,255,239, 99, 89, 86,143,123, 29, 69,185, 10,169,
-233,144,149,174,229,168,175,199,165,250, 94, 11,128, 51,199,240,165, 96, 54,122,212, 17,255,223, 62, 87,103, 59,238,227,249,198,
- 90,160,165,139,128,109,115,128, 78,117, 73,178,254, 51,177,247, 80,108,175, 78,253,232,162,138,255,122, 37,254, 23, 90,201, 78,
-142,163,116, 2,192, 33,185,181,140,170, 5,174, 30,204, 64,167, 34, 53, 58,242,141,211, 91, 92,158,255, 34,144,153,250,135,217,
-224, 31, 47, 94, 60,199,123,239,253, 24,254,198,175,253, 26,254,236, 47,254, 34,190,246,181,175,225,145,197,110, 62,127,254, 9,
-166,233,128,193,248,228,117,212, 60,110, 54,240, 33,224,250,234, 10,111,174, 94,227,209,131, 71, 32, 38, 92,223, 92, 3, 4,124,
-247, 15,254, 0,223,253,189,223, 71,112, 1,231,143, 46,148,195, 95, 18,156,117,115, 53,114, 52,231,130,195, 97,210,157,115, 74,
-136, 85, 61, 92, 57,231,230,102,168, 15,102,137,177, 21,184,154,120, 87, 61,219, 68,186,199, 78, 49, 98, 51,110, 80,114, 81, 72,
-137,113,247,191,255,221,239,227,225,131,135, 24, 66,192, 60, 77, 42,242, 50, 37,125, 21, 89,229,168, 34, 60,239, 29,118,219, 69,
- 71,196, 78,191,163, 10, 86, 57,219,108,116,100,110,135, 91,177,244,182, 58, 85,144,106,143, 3, 35,150,217,212,236, 1,151,247,
- 46, 17,211,130,237,205,181,249,198,237,154,116,138, 96, 45,101,133,254, 20,216,120,214,235, 62, 54,155,155,192, 57,223,148,213,
- 96, 49, 26,102,109, 47,184,117, 60,108, 56, 66,103,172,243,100, 86,175,205, 56,194, 49,225,236,236, 12,222, 43,131,253,226,226,
- 12,165,232, 42,131,201, 25,210, 53,225,234,250, 6,206,123,156,109, 70,156,157,159,105,170,154, 44, 42,134,203, 25,206, 44,118,
-169,102,190,219,161, 42,132,128,148,102,139,115, 85, 79,190,179,169,129,118,161,218,205, 46, 49, 97, 89, 52,222,118,153, 38,196,
-164, 28,120,117, 33, 16, 50,156,218,190,140,229,142,186, 38,180,231,160,216,148, 64, 15, 76, 3,138,184, 22,155, 27,156, 83, 71,
- 82, 73,235, 97, 57, 87, 23,137,114, 3,124, 88, 57,244,193, 51,146, 56,155, 16,136, 6,164,152,150,199, 59, 66, 46,190,137, 7,
- 75, 76, 96,174, 26, 28,221, 87, 35, 39,108,198,128, 40, 30, 44, 9,228, 7, 76,115, 65, 73,139, 22, 82,239, 33,164, 59,247, 34,
- 58, 61, 40, 96,157, 26,216, 52, 81, 51,219,179, 29,226, 24,206,105, 62,122,177, 67, 98,109,178, 42,110,187,170,218,165,232,207,
-112, 22,193, 90,138,249,228,111,237,237, 44,234,214,192, 72,158, 11, 16, 28, 18, 13, 10,230,201, 5,146,236,217,236, 9, 25, 30,
- 23, 0,198, 11,193, 50,222, 7, 14,207,127,132, 71, 12,173,207, 52,249, 2,117,252,201,179, 73, 78,160, 91, 62,149,154,176,214,
-119,241,116,236,201,237, 44,243,100,194,180, 53, 5, 75,218,104,214,190,255,174,137,150, 99, 30,168,104, 10,220,186,153, 80,193,
- 91, 18, 2, 49, 26,206,181,144, 22,238, 85,217,219, 17,187,136, 58, 94, 56,181, 61,123, 85,233,103,208, 49,213,172,138,220,108,
- 90, 64, 93,192, 12, 11, 91, 20, 96,105,106,112, 11,139, 90,203, 96,103,127,203, 29, 97,142, 77,189, 46,109,239,212, 97,107,121,
-205, 39, 47, 29,242,133,137, 48, 50, 43, 77,138,165,141,228,180, 96,230,150, 28, 7,168, 5,144,218, 92,163,216,180, 67, 15, 11,
- 83, 94, 87, 16, 77, 56,102,159,149,216,207, 42, 0,156, 15, 24,153,176, 44,186,227, 98, 58,182,165,245,185,246, 26,241, 88,218,
- 85, 82,167, 17,178,158,165,142,166, 53,165, 51,108,223, 85, 40,123,113,220, 49, 15,253,244, 20, 74,199,208,163,110, 74,208, 0,
- 53,162, 15,158,251, 15, 30, 64, 74,198,245,245,141,193, 44,186,233, 19, 81,231,125,125, 11, 4,231, 95,160,160, 75,119, 96,202,
- 57,225,179,151,159,225, 87,126,229, 95,197,223,249,247,255, 3, 60,126,242, 4, 47, 95,189,196, 52, 77,120,241,233,167, 72, 81,
-247,203, 23,231, 23, 42,126, 51,129, 97, 78,218,181,236,247, 91,124,244,241, 71,152,166, 3,150,175, 70,188,247,222,123,184,190,
-190,198, 71, 31,126,136, 23,207,158,193,185,128, 48,168,182, 2, 89,199,156,245,251,143, 49,153,151,121, 86,181,184,117,219,113,
-209,208, 15,231,188, 33, 78,215,195, 86,206, 73,215, 68,214, 49, 42, 59,130, 49,207, 11, 28, 89,146, 22, 4,227, 48, 0,132,230,
-119, 39, 6,194, 56,224,245,171, 87,248,254,247,190,135,239,252,137,239, 32,198,132,233,160,226,188,121, 90,148, 65, 96, 32, 22,
-102,194, 52,205,152,166,185,121,134,107,177,200, 37,219,107,212,195, 77,140, 73,239, 85, 59,236, 84,146,101, 50,128,139,250,216,
- 5,193, 84,248, 87,111,118,237, 0, 81,239,127, 13, 57, 81, 63,122,177,195,142,178, 15, 4,158,156, 21, 53,157, 16, 84, 11, 31,
- 1, 22,173, 90,227, 89,215,213,132,171, 5,161,238,151, 29, 35,219,142,152, 73, 61,246,155,179, 51,164,156,192, 0,158, 60,126,
-140, 57, 38, 92,191,121,141,113, 51, 98, 28, 55, 88,102,101,180,143, 33, 40,239,188,141,110, 77,131,195,174,101,206,215, 56, 80,
-116,241,173,232, 94,223, 60,207,112,206, 91,119, 15,148,156,218, 20, 35,198,132,253,254, 96, 35,123, 52,144,140,247, 85,171, 80,
-119,122,198,127,111,252,134, 90,184,244,125, 47, 77,144,104, 30,124,210,208,157, 4,141,102,117, 4,132, 33, 32, 22,125, 46, 15,
-230,151,175,154,157,148, 51,188,115,224, 48,168, 46,160,100,211, 32, 40,154,183, 56,160,164,168, 69,157, 25,185, 36, 21,221,193,
- 43,192,135,117,189, 25,156, 83,208,144, 61,255, 98, 18, 8,229,150,216, 38,164, 43, 27,199, 90,164,139, 84,166, 72,105, 40,226,
-166, 36,178, 16, 18, 42,221, 90,165, 2,175, 45,225,141, 44, 85,174,142,191, 11, 88, 89,244, 22,243, 92, 17,218,148,235, 62,190,
-162,192, 9,169,168,251, 93,197,199,140,156, 4,169, 36, 32, 9,238,157,103,224,252, 18,185, 92, 98, 12,130, 41,108,224,246,193,
- 26, 88,254, 82, 5, 90,142,251,178,207, 23,212,201, 91,250,120, 1,188, 38,249, 24,192,193,118,223, 78,122,154,217,233,206,122,
- 45,226,250, 33,104, 1, 46, 96, 8, 19,156,245,220,165, 31,221,214,113, 40, 41, 86,176,142,181,115,237,232,105,197,191, 86,220,
- 93,127, 80, 97, 58, 38,145, 73,239, 93,111, 88, 86,165,206, 73, 17, 36, 82,228,106, 39, 73,238,114,171, 45, 58,207, 8,112, 93,
-136, 83, 19,213, 21,233,166, 12,167, 33, 33,212,117,132,212, 1,109,122,130, 91,111,219,234, 56,212,197, 62,131,156, 35,108, 5,
-217,225, 98,215,152, 71, 24, 59,127,221, 8,213,255, 39, 13, 49, 91,100,221,219,107, 36,122,181,253, 29, 43,211,203,145,114,188,
- 51, 68,208,177, 45,171, 72, 70, 96,205, 41,142,205,144,134, 14,117,139, 59,144, 63,119, 67, 94,228,132, 41,192,119,140,226, 79,
-255,170,222,103,103,133,166,146,236,122, 93,196,126,191,239,146,188, 86,189, 5, 3, 88, 22,197,198, 14,193,119, 72, 98,220,185,
- 6,248,145,170,185,172, 26,128, 79, 62,249, 4,127,237,151,127, 5,255,245,127,243,223,226,250,234, 13,190,255, 71,127,216,148,
-212,185,168,184,233,226,252, 2,222, 7,236,119, 59, 45,166,169, 96, 89, 18,188, 23,236,118, 59, 21, 54, 1,120,241,236, 25,210,
-178,224,250,250, 26,175, 95,189,132, 31, 6,112,210,232, 71, 79, 14, 20,213, 94,180,221,239, 44, 5, 77, 15,129,203,188,180,188,
-234,108,150, 38,207, 1,203,162, 97, 30, 67,176, 20,183, 42, 30,100, 21, 54,137,141, 18,139,201,169, 93, 8, 72, 86,124,157,117,
-160, 41,229,102,213,130, 0,195, 56,226,195, 15, 62, 68, 41, 5,143,159, 60,193, 60, 45,216,238,182, 74, 18,203, 69, 15,165,182,
- 31,142, 49, 90,174,119,208,174, 12, 5, 41,102, 32, 91,106,151,137,157, 32,250,251,136, 9, 34,202, 95, 79,197,166, 47,118, 47,
-186,160,132, 55,221,225,211, 10, 83,169,123, 92, 98,120,118,200, 40, 45,184, 36,167,210, 94,119,177, 93,182, 6,183,232,129,231,
- 40,225, 15,202, 37,103,251,179, 85,199,161,252,245,130,179,205, 25,136,207,180, 35,158, 15,184,188,252,138,170,176, 45,206,245,
-229,171, 87,246, 51,245,126,139, 75,212,216,213, 81,249,228,243,178, 32,140, 67,243,236, 23,123,111, 85,217,158,179,118,174, 42,
- 14, 75,166,113,240,166, 55,168,233,114, 11,166, 89, 44, 87,220,196,144, 54, 41, 41, 57, 53, 86,124, 24,124, 43,252,197,246,202,
-149,102,149,107,132, 44,243,170,177,104,162, 56,152, 99,160,128, 44, 43,156, 73, 48, 14, 1, 57,123,204,203, 4, 89, 34, 96,246,
- 68, 98, 13, 59,129,117,233, 89,106,232, 20, 12,252,163,223,117,125,158, 7, 79, 88, 40,168, 58,223,171,205,185, 88,150,187, 99,
- 70, 33,198,146, 50,216, 69,109,168,164, 96,112,132, 50, 12,200,203, 12, 87,244, 64, 10,130, 18,222,114, 2, 59, 91,141,160,103,
-175, 83, 91, 48, 83, 93, 57, 56,213,134,192, 38,188,206, 14, 55,176,194,205, 6, 29,171, 24,110,174,171, 25,251,121,108,117, 56,
- 23,128,235, 36,192,148,241, 74,170, 75, 0,216, 14, 29,132, 36,192, 18,129,179,180, 96, 24, 6, 92, 12, 14,111,206,206, 32,215,
-231,128, 92,129,104, 56,161,188,190,173, 88,203,241, 86,249, 88, 50,255, 5, 20,186,245,207,248, 35, 58, 89,243,140,247,163,209,
-219,201, 90,220,209,217, 42,148,133, 13,252,159, 27,219,220, 0, 53,141,154,198, 13, 60, 35,157,170,189,141, 98, 5, 72, 86, 48,
- 93, 39,199, 43,157,255,119,253,247,143, 49,167,237,160, 17, 60, 46, 57, 99, 94, 10, 22,225,166, 28,239, 41,103, 98, 52,179, 74,
- 81,203, 85, 73,205, 43,252,164, 9,161,228,148,251,222, 69,184, 74,209,216, 85,172,200, 90,190,197, 96,175,135, 22, 67,104, 22,
-193,174, 50,146,173,144,115, 35,175, 81,203,165,215,211,189,238,208,114,139, 15, 45, 29,135,110,141, 95, 93,215, 20,189, 7, 92,
- 47,184,146, 98,235,240,169,243,176,215,172,100, 38,116, 96, 13,105,177,148,181,226, 23, 40,183,224, 46,161,226,241,116,156,142,
-236,117,206, 38, 8,233, 20,209, 42,114, 82, 51,201, 92, 17, 5,155,243, 11, 4,102,108,119,219,149, 0, 88, 15, 68,181,249, 72,
-169, 19,242,173,140,117,102,198,183,191,241,117,188,185,186,198, 39,159,190,194,184,217,172,169, 77,119,252,238, 47, 59,114,239,
-149,238,135,249,128, 71,143, 31,227, 55,127,235,111, 67,164,224,233,179,143, 21,134, 1,194, 52, 77, 45, 26, 83, 83,213,150, 54,
- 74,139,113, 49,181,182,179, 34, 49, 55,117,248,245,213, 85, 83, 98,171,168, 72, 5,104,176, 28,237,253,110,167,126,100,235,166,
-230, 57,218,131, 95,119,209,142,244, 97, 27,147, 6,105, 12, 33, 52,155,152,115,238,200,121,192,149,130,152,149, 77, 46, 16, 44,
- 81,253,207, 98,170,250,201,192, 50, 67, 80,123, 28, 28,129,201,225,227,143, 62,194,126,191,199, 48,156, 97,158, 22, 77,221,170,
-201,102, 73, 11,251, 56, 4, 27,101, 10, 66,208,127,118,144,201,194, 72, 92, 91,251, 56,167, 17,166,243,148,154,155, 66, 74,237,
-238, 5,204,106, 17,171, 40, 81,231,188,105, 6,168, 5,162, 84,193, 29, 32, 6, 50, 73, 56, 59,219,232,116,162, 40,203,218,135,
- 17,206,113, 27, 73,214,177, 51, 51,129, 72, 11, 58, 19, 3, 92,154, 14,132, 44, 20, 37,155,133,108, 89, 34,206, 54,163, 70,171,
- 70, 59,112, 5,143, 37, 38,200,188, 96, 51, 42,126,118,119,216, 35, 56,135, 92,212, 23, 31, 66,104, 96, 27,129,166,224,133, 16,
- 32, 49,161,250,105,171, 56,205, 49,195, 7, 15,183, 56, 99, 0,100,123,175,122,237, 68, 75,201, 43, 82, 48,205, 26,188, 83,114,
-130,243, 14,211, 60,131,179, 62, 71,196,144,168,149, 41, 66,193,168,109,166,122,175, 76,126, 38,106, 36, 9,239,116, 18,145,179,
- 6,245, 40,219,161, 52, 55, 77, 50,132,110, 41, 25,222, 5, 12,158,145,178, 30, 18, 7,239, 0, 23, 48,207, 17, 76, 26,150,146,
-114,129, 71, 4,135, 1, 49, 9,114, 92, 12,225,172, 36, 58,201, 25,222,217, 8, 63, 23, 76, 75,193,192, 19,200,143, 16,203, 76,
- 15,158,129,226, 33, 98, 7, 23, 35,205,149,148, 49,146,128,252, 96,252,142,210,124,230,197,166,147,206,236,214,100, 60, 19, 97,
-130,148, 85, 16, 7,115, 18, 20,203, 80,175, 86,103, 93,189,112,251,121,140, 21,100,198, 86,208,205,255,141,204, 14, 84, 52,150,
-186, 66,203,114, 33,108,179, 64,182, 17, 15, 47,175,240,248,226, 62,158, 63,120,132,242,242, 1, 56,189, 81,143,248,151,232, 34,
-232,100,242, 73, 54, 41,125,219, 98, 94,238, 40,238, 4,130,167, 62,222,178,137,195,208, 40, 96,108, 39, 23,116,202,118,169,253,
-163,141,187, 11, 17,194, 17, 34,100,245,166,175, 27,252, 53,144,165,138,224, 88,128, 62,246,130,164, 19,203,153,207,186,174,109,
-235, 16,155,155,146,252,196,196, 44, 25, 49, 2,251, 64, 24, 44, 32,185,212, 78, 86,122,129,221,218, 73, 82,167,156,151,126,206,
-220,173, 24,212,111,207,183,186,115, 84,202, 83,219,189,168, 90,189,242,224,235,141, 83, 10,153, 39, 82,218, 77,213, 16,170,245,
-107,144,154, 52,182,202, 16,179,121,242, 65,134,237,181,215, 80, 11, 85,145,110, 53,129, 78, 56, 98,194,198, 42, 36, 59,133,233,
-178,141,206,139, 20,205, 58,174,254,242, 58, 53, 56, 17, 95,228,163,232, 89, 28,241,227,235,170,160, 14,238,251, 75,215,217, 58,
- 32,153,213,141, 79,199,217, 85, 99, 97,223,149, 62,220, 92,219,209,247, 5, 29, 39,130,186,118,184,176,189,127,201, 25, 75,204,
-248,214, 55,190,129,135, 15, 30,226,163,167,207,144,114,178,149,194, 23,143,221,223,118,110,238,127,247,246,230, 6,127,254, 47,
-254,101,139, 53,125, 1,239, 60,102,153, 91, 46,118, 8, 3, 94,125,246, 9, 98,202,120,255,253,175,218,131, 64, 16,134, 0,159,
- 29, 14,135, 3,174,174, 94, 99,137, 17, 50, 45, 16, 20, 44, 75,180,213,136, 22,115,178, 7,126,140, 9,243, 50,163,216,206, 57,
-101, 85,124,107,156,165, 62,100, 82,212, 81,240,102, 51,106, 12,106, 39, 10,148, 34,128, 19,139,235, 20,176,217,131, 10,218,180,
- 3, 0, 0, 32, 0, 73, 68, 65, 84,234, 62,156, 57, 96,178,130,206, 76, 6,242,209, 11,188, 22,244,100,105,100, 62, 56, 20, 38,
-124,250,233,103,240,206, 99,179, 57,131, 15,174,105,111,152,200, 58,111,182,200, 82,193,126,191,199, 60,107,130,216, 48, 4,221,
-237, 23,117, 21,195, 25,166,150,149,235, 94,191,214,154, 29, 62,142, 22, 8, 66, 48,222,195,122, 40, 22, 43, 94,165,148, 54,119,
-139, 49,129,152,109,132,173, 99,249, 58,118, 23,209,247,238,205,195, 31, 83,194, 16,130, 81,236, 52, 91,187,174,132,152, 86,235,
- 87,253, 78,152,128,135, 15, 31,129,109,149, 82, 67, 86, 80,185,245,118,218,116,172,216,215,205, 56, 52,155, 86, 74,169,209,242,
- 6, 79,240,126,163,157,241,162,235,141, 97,112, 42, 32,131, 32,120, 21,243, 5, 31,112,176,232, 84,213,252,233,247,144,243,140,
-221,126,143,155,235, 27, 76,243,161,233, 24, 28,171,182,192, 49, 43,194,182, 19,171,162,238,210, 77, 52, 89,151,146, 58,225,145,
-198, 46, 96, 19, 14,214, 3,114,202, 51, 24,192, 16, 2, 98, 18,212, 5, 34, 76,244, 92,239,207,195,188, 96, 12, 14,227, 16, 32,
-153,173,248, 82,235,252,171, 98,129,157,195,180,100,164,101,182,162, 56, 52, 42, 94,140, 25, 68, 25, 27,239, 81,200, 41,178,202,
-246,221, 53, 8,172, 70,244,178, 99,100,114,160, 84, 26, 5,174,213,149, 6, 76, 83, 13, 64,229,172, 87, 56,153,173,206, 1,147,
-202,213,186, 68,166,205,201,202, 6,182, 24, 86,103, 84, 58,229,168,144,115,107,156,116,187,191, 84, 1, 15,242,112,208,216,236,
- 76,140, 93, 6,252, 46,227, 62, 95,227,236, 94,192,110,243, 24,110,251,113,107,162, 62,255, 89, 68, 56,113,105,183,245,234,221,
- 45,249,219, 33, 28,126, 53, 39,173,125,152,180, 2, 80, 71,184,212,110, 40,119, 20, 32, 82,149,117,132, 76, 43, 99, 93, 11, 81,
- 65, 17, 94,211,116,108,180,158, 76, 10,199, 77,200,117, 28, 23, 90, 81,167,183,181,109,210,236,117,232,252,210,235,207, 1,184,
- 36,204, 19, 97, 38, 52,110,121, 5,252,131, 84,221, 47,160,163,124,116, 24,109,142,251,254,177,178,208, 69,247,119, 36, 93, 44,
-107, 85,218,247,197, 64,164,209,226,216,240,142, 5,171,119,176,228,212, 56,242,125,164, 42, 80, 85,232,117, 91,190,114,217,148,
- 61,207,141, 58,199,213, 78, 86,145,138, 56, 78, 74,235, 22,199,186,199, 41,132,163,153,227,137, 92,146,204, 46,210,139, 52, 58,
-244,220, 58, 77,225, 14, 28,115, 82,232,164, 15,187,169,190, 81, 59,120, 20, 8, 2, 49, 60,160,248, 92, 19,118,121,239,143, 99,
-227,160,226,164,195,246, 6, 59,232, 94,175, 38,115,209, 91,198,251,107,225,215, 99,144,119, 14, 63,248,224, 67,188,124,115,141,
-239,124,235, 27,120,112,239, 26, 47, 94,190, 70, 8,252,185, 5,157,190,128, 15,223,207, 21, 74, 41,120,242,228, 49,174,175,174,
-176, 63,236, 48,140,193, 2,110,212,130,248,236,233,199, 56, 76, 7,124,227, 27,223,196, 48,142,152,230, 3,166,195, 1,135,195,
- 30,251,253, 14,251,221, 30,187,221, 94, 65, 35, 81,139,121,140,139, 22,219, 37,226, 48,205, 77, 45, 62,207,150, 81, 78,140,195,
- 60,181, 44,238, 90,120,171, 45, 77, 80,204,246,163,221, 93,202, 74, 70,171,157, 69,178,206,150, 69, 17,173,165,148, 22,155,169,
-255, 60,129,202,138,119,170,190,232, 37,198,245, 90, 50,145,108,221,203,239, 15, 59,240,172, 5,136,109, 26, 16,227,130,152, 8,
-165, 76, 32, 84, 69,123, 70, 24,130,170,177,151,108,163, 90,177,215,153,209,130, 53, 22,141,122, 69,135, 54,141, 41, 91,200,139,
- 94, 7, 33,216, 46,188,117,243,122, 47, 20,139, 51,245, 76,170, 19,240, 30,231,103,103, 77, 24, 22,140,237, 94,121,245,108,180,
-176,148,179,161, 79, 87,199, 12, 49, 55,175,182,179,213,198,217,249, 25, 46, 47, 47, 45,158, 84,177,166,136,201, 96, 57,206,252,
-249, 10,182,217,108, 70,125, 54, 24,251,158,237, 64,226,172,136,234,184, 28, 96,167,186,129,105,158, 27,101, 77, 68, 20,140, 99,
- 66,212,156,197, 14,165,250,218,247,251, 29,174,222,220, 96,119,115,163,107, 18,123, 47,181,179,171, 97, 57, 57, 11, 42, 50,143,
-186,216,220,170,222,214,105, 97,105, 41,111,203,188, 32, 75,174, 67, 75,180, 95,104,122, 11,129, 52, 11,226,180,164, 6,193, 10,
-222, 1, 24, 48, 47, 51,206,153, 64,110, 48, 33, 43, 33,103,106,222,115, 48,225, 48, 39,164,168, 89,228, 73, 8, 89,162, 77,101,
- 84, 35,144, 88,215, 21, 34, 12,205,236,241,109, 18, 9,155, 60, 56, 2,200, 57, 21, 44,215, 80, 41, 75, 20, 37,177,157,185, 57,
-122, 80,242,250, 76,227, 21, 50, 68,235,220,189,205,137,217,113, 27,253,215,103, 42, 75,110,130, 66,234, 96, 49,250, 89, 23,165,
-151,114, 65, 6,195, 21, 81,192,154, 40,107,193, 49,225,166,120, 92,236, 50,238,243, 27,220,156,159, 1, 55,231,128,220, 64,104,
-232,224, 88,119,236,203,169, 83, 42,223,234, 56,232,238,241,251, 91, 88, 53, 53,112,173, 25,201,214,156,108, 90,199,199, 94,227,
- 80, 89, 8,177,235,232,114,135,170, 75,178,142,214,185, 51,191, 53,224, 30,161, 21,225,106, 23, 40,178,198,156,172,246,174, 42,
-243, 94, 13,238,165,143, 63,149, 90,164, 13,142, 96,223, 85, 21,192,113,119,232,112,189,183, 89,122,235, 0,110, 49,229,251, 92,
-212,220,197,149,182,195, 4,250,221,127,223,209,210,145,186,189,130,117, 20,131,217,241, 83, 68,142, 51,196,233,132,103, 79, 56,
- 37,253,130, 69,142,252,229,100,197,177, 28,209,211,214,207,125,125,232,211,209,251, 65,221, 67, 1, 71,246, 15, 2,142,242,123,
-143, 44, 22,157, 74,146,238,184,166,228, 14, 17,218,113,194, 26, 33,218, 7,160,233, 85, 3, 30, 61,124,132,237,205,149,142,249,
-169,215,103,232, 13,236,112, 42,186,187, 29,186, 90, 57,173, 45,114, 86,244,251, 26, 55, 27,136, 20,252,193,247,190,143, 37,234,
-184,243, 75,139,224,222,242,247,122,104,156, 15, 1, 31,127,244, 17,118,187, 45, 54,231, 27,196,152,224, 93,192,230,114,131,253,
-110,135, 16, 2, 46, 46, 47, 17, 83,194,171,143, 63,196, 52, 79,152, 15, 19,182,187,109,219,155,214, 34, 52,207, 19,166,195,164,
- 52, 52,139,197, 76, 41, 34, 67,247,200,185, 84,175,185, 88, 68, 40,161, 44,121,245, 82,155, 56, 76,105,101, 89,167, 87, 54, 94,
-149,234,141, 46, 64,204, 26,155,169,251,233,100,227,111,110,175,163,142, 75,184, 22, 6,183, 2, 74,156, 87, 47,115,182,215,209,
-148,192,185,192, 3,200, 37, 34,217,232,157, 44, 35, 32,219,138,200, 7, 15,111,233,114,234, 24, 72,237,193,218, 48,159, 38, 26,
- 91,230,185,117,144,236,212,250, 54, 12,131,249,156, 93,139,139, 85, 17,157, 22,174,186, 59,206, 57,155,134, 64,199,250,193, 59,
-219,185,147,142,240,153, 91, 42,152,118,235,107,246, 64,141, 86,109,239,173,118,181, 45, 72,166,224,241,163, 71, 24,198, 17,100,
-171,169,246,104,146,181,195,175, 30,234,154, 90, 23,130,199,224, 7,221, 69, 27,126, 55,198,136,156, 76,215,192, 58, 13, 32,169,
- 9,103,197, 8,140,102, 39,117, 12, 74, 70,132,172, 81,185, 49,227,102,187,195, 50, 77,205, 66, 72, 78,204,162,199, 13, 6,195,
- 84,197,202,170,223,105,254,110, 91,189, 52, 46, 70,209, 9, 64,229, 22,212, 67, 74,105,242, 61,110,172, 0,174,162,178, 26, 22,
-195, 4, 36,194,217,232, 17,195, 57, 82,138,240,172,168,218,146, 34, 6, 79, 72,228,176, 28,102, 29,161,103, 81, 17,222, 24,144,
-197, 38, 76,166, 86,215,179,187, 30,226,152, 84,216,168,255,205,171, 16,186,136, 38,105,146,131, 43,130,130,122,152, 90,153, 11,
-212,220, 49,132, 66,202, 43, 32, 42,104, 9, 27,166, 37, 17,211,110, 48, 74,115,244, 16,178, 69,196,186,149,181,210, 38,133, 90,
-240, 87,206, 7,175,224, 24,169,177,173,128, 80,177,122,163,247,243, 82, 28, 30, 32,227,147, 75,143,252,250, 49, 92,188, 6,156,
-172, 97, 98,132,219,193,213,114,187,149,160, 35,238, 10, 29,173,117,235,100,251, 46,189,144,175,175,216,209,186, 7,175, 39, 3,
- 1,161,176,146,214,130, 46, 73, 49, 23,171,183,116,250,195, 10,164, 48, 10,173,163,238, 22,103,216,205, 90,185,195,113,137, 53,
-148,220, 6, 5,210,198,209, 77,216,102, 93,180,116,209,161, 90, 52, 24, 27, 79, 8, 82,176, 20,157, 20, 52,240, 74, 23,155,154,
-251, 9,132,116, 60,224, 58, 74,233,126,254, 10,178,169,251,244,117, 95, 13, 19,147, 84,191, 98, 43,168, 77,148,213,137,238,236,
-162,225, 38,236,113, 96, 35, 83,233,239, 59, 1,166,212, 88,217,238, 80, 34, 93, 1,150, 2,245,182, 10, 53,161,156, 28,209, 80,
-112, 11,196, 35, 29,133,143,106,103, 87,199,213,189,157,205,216,207,171,176,111,133,224,208,201,174,156,190,196,248,186,118, 15,
-149, 91, 79,166,209, 96,246,184, 56, 63,199,246,230,141,238, 27,153, 45, 63, 96,141,145,173, 88,220, 83,244,140,220, 18,213,169,
-199,129,187, 34, 4, 3,193, 28,101,178,139,124, 97, 71, 46,111, 27,130,117, 39, 48,133,153, 4,252, 95,255,231, 63,195,203, 87,
- 47,241, 51, 95,249, 25, 92,223,220,192,251,128,171,215,175,177,223, 31,240,240,225, 35,248, 65,173, 95,243,162,251,114, 29, 19,
-235,245, 51, 79,179,238,197,167, 5,113,137, 74, 98, 43,217, 80,153, 5, 57,166,230,195,175,251,227,250,157,196, 37,154,230, 66,
-187,197, 98,170,223, 26,195, 75,206,117, 86, 69,152,221, 42,183,125, 92,125,128, 3,192,178,168, 24,110,240, 65,113,167, 86,236,
-171,119,123, 37, 1, 42,213, 77,138,104, 64, 78,101,218, 23,129, 31,212,198, 21,115,210,244,179,150, 17,128, 6,249,224, 22,118,
- 4, 44, 75,108, 93,105, 85,200,167, 92,244,225, 11,181, 47,169,248,177, 96,179,217,224,226,252, 2,251,195,190,141,248,171,248,
-171,170,234,235,249, 55,120,223, 38, 8,218,145,122, 37,195, 57,115,103,228, 26,171,170, 98,185, 92,178,217,180,164, 1, 81,156,
-115, 93,132,172, 52, 44,238,253,203, 11,140,155, 51,213, 32, 56,205, 66,112, 33, 40, 34, 55,174,150, 62, 54, 46,185, 42,208,125,
- 11, 9, 74, 49, 99,246,241,136,201, 78, 96, 27,113, 47, 77,180, 70,208,245,128, 38,175,173, 65, 46, 26, 22, 83,144,162, 90,229,
-226, 60,129,108,255, 93,167, 48,206, 14, 24, 41,107, 8,143, 99,194, 48, 4, 45,188, 89,154,159,156,137, 17, 75, 65,201,169, 57,
-100,196, 14, 33, 98, 89,241, 26,136,228,145, 69,113,181,101, 37, 70,161,148,130,179, 49, 32,130, 49,239, 15,154, 57,110, 45,218,
-180, 36,140, 37,130,252,166, 53, 63,203,146,116,239,207, 0, 7,135,146,109, 66,192, 14,155, 49, 88,180,105, 1, 28, 52, 55,192,
-210, 41,149, 22,199, 32,225, 22, 16, 67,102,169,173, 7,178,152, 11,144, 19,188, 3,152,189,137,177,117,157, 83,245, 18, 25,170,
-211, 16,219,143, 55, 97,181,152,237, 83,178, 9,210, 5,142, 10,200,208,192,109,189, 87, 12,137,222,188,255, 38, 32,183, 53,104,
- 1,175, 60, 5, 1,156,117,247, 66, 74,137, 47,236,112, 73,140,247,238, 39,124,252,248, 93,240,139, 43, 80,121, 3,240, 96, 74,
-124,224, 40,130, 85, 62,127, 17,120,244,119,155,227,137,222,138,147,245,149,193,158,140,247,222, 3,227,129, 2,151, 11, 74, 2,
-174,172,195,230, 46,221,162,118,215, 77,252,102,123,242,100, 93,163,147, 21, 39,203, 71, 2,178, 85,148, 71, 93, 49,151,142,179,
- 38, 36,232, 2, 85, 87,117,183, 93,164,131, 99,108, 88,192,133,176, 80,181,147,113, 19,159,137,117,204,237,193, 44,235,136, 89,
-250,201, 65, 35,166,173, 69,156,152, 26, 98,246, 86, 49,179, 7,105,233,109,124,182,173,105, 10,127, 84,161,153,237, 82,234, 40,
-159, 78,216,233, 93,200, 9,117, 59,235,190,232, 23, 27, 47,113,161, 38,248,105, 71, 30,145,246,126,155, 23, 83, 4,241,136,186,
- 70, 77, 43, 81,234,106, 3, 45,123,163,121,116,235, 33,167,224,120, 69, 65,221, 94,135,186, 3, 71,175,110, 47, 39, 2,184,222,
- 11,153, 69,195, 74,226,124,192, 7, 31,125,160, 1, 31, 22,114, 65, 16,120,182, 83,111, 27,185,203,109,108,109, 55, 98, 18, 8,
-158, 60,121, 7,243,116,192,118,183, 55,242,151, 28,189, 93, 62,121, 77, 95, 94,240,190, 18,248,234, 20,128,136,177,219,237,112,
-117,117,133,223,248,173,223,194,215,127,226,235,120,241,226, 57,156,243,120,254,244, 41,158, 63,123,134,155,237, 13,216, 57,220,
-191,127, 31,143, 30, 61,198,227, 71, 79, 48, 12, 35, 94,188,120,142,156, 34,110,174,111, 0, 8,150,105,193,213,213, 21,226,162,
-129, 60, 53,208,131,105,221,255, 85, 98,215, 48, 12,234, 1, 78, 73, 15,101, 44, 88, 22, 13,207, 80, 33,150,180, 16,148,156, 74,
-203, 47, 39,195,213, 50, 59,140,222, 91,162, 85,110,251, 89, 17, 24,112,196, 14,156, 76, 71,239, 62,165,220, 38, 66, 68,100,135,
- 98,187,175, 5, 24, 70,125, 0,198, 57, 53,107, 89, 76,186,218, 34, 2, 74, 74,152,226,210,224, 46,171, 56,179,168, 0, 45,229,
-214,145,170,245,204, 30, 68,214,217,199,148,177,223, 31,154,133,176, 20,131,185, 88,113, 41, 38,230,244,222,169,242,187, 78, 82,
-124, 80, 68,166, 91,179,203,235,164, 80,201,104,134,149,173, 83, 14, 11,158,241,222, 70,229,194, 13, 16,227, 8,120,248,240, 1,
- 66, 8, 90, 68, 69,112,126,121,137,205,230, 12,219,221, 22,251, 69,215, 38, 69, 68, 35, 74,153,245,254, 42,130, 24, 51, 54, 27,
- 21, 48,238,247, 7,189,222,141,237, 95,108,212, 93, 59, 75,103,158,239,113,244, 24,199, 51,236,182,123,157,168,160, 96, 8, 1,
-251,152,241,242,213, 27,108,175,175, 20,142, 85,187,122, 83,145,107,132, 45,175, 24,103,104, 90,159, 64, 3,114,156, 81,241,164,
- 75,205, 76, 45,145,173,174,190,140,173,158, 10,152,114, 59, 4,128,169,173, 12,218,157, 33,192, 16,116,210, 16, 83,105,105,123,
-158, 25, 20, 60,230, 24, 17,167,104, 22,219, 26, 23,171,197, 84, 72,179, 6,198,193,195,251,128,121,137, 40, 37, 41, 22,214,212,
-248,148, 18,156, 77, 21, 68, 86,237, 69,197,119, 45,169,192, 73,130, 31, 44, 12, 38,119,228, 58,118,141,207, 95,243, 62, 80,138,
- 37,201, 85,186, 39,175,162,107,170,150, 54,103,129, 54,150,124, 87,185, 28,198,203, 40,194,112, 80, 30, 1,200,153,130, 95,192,
-146, 76,209,175,207, 71,207,197, 94,131,117,240, 89,240, 21, 46,184,121,103,192,205,254,107, 8,215,123,128,179, 78, 15,142, 84,
-251,119, 44,199,223,210,125,172,246,218,218,108,174, 44,149,227, 78,189,168,116, 63,183,241,174, 62,108, 29,170,127, 93,193, 6,
-174,249,192, 59, 58,167,117, 7,165,103,194, 19,180,171,111, 66, 57, 75,236,146,245,100, 33,189,224,138, 86,207, 58,132,187, 49,
-244, 74,117,235, 19,227,170, 8, 44,231,132,109,150,102,195,131,229,188, 55, 63,121,237,207,237, 4,230,148,240,130,212, 94, 7,
-117,234, 65,233, 88,237, 54,146,100,214, 27, 73,212, 26,194,221, 8,164,113,228,143, 50,191, 45, 26,213, 5,156,147, 96,151, 50,
-210,209,120,125,157, 30, 72, 39, 40, 20, 88,136,131,197,159,138,168,131,128, 13,223,166, 42,228,128,179,179, 17,203,180,195,156,
- 10, 60,147,237,216,233,104, 60, 95,186, 53, 2,183, 14,124, 93,167,112,157,200,180,207,180, 64, 10,233,169,213,124,172,149,178,
- 69, 77, 28, 40, 71,135,185,211, 67,142,220,198,250,172, 15, 18, 57, 70,187, 58,226, 99,142, 59,225,142,208,150,187,241,176,245,
-226,165, 14,115, 41,119, 12,159,232,142,130,126,170, 7,120,155, 40,206, 89, 72, 78,110,147, 10,198,171, 87,175, 16,151, 25,191,
-249,219,191,141,127,243, 55,126, 3, 31,127,248, 1,174,174,222, 96,158,103,188,120,241, 9,102, 83,187, 59,239,112,216,239,241,
-236,233,199, 8, 97, 64,240,186,115,156,109, 39,126,115,179,195,110,187,195,178, 76,102,165, 42, 96, 10, 22, 92, 66,141,241, 78,
-188,166,244,197,148, 0, 75, 41, 75,211,172,142, 8,219,247, 58, 54,192,136, 61,152,149,190,104, 29, 53,173,120,225,186,243,207,
- 69,239,141,113, 8,240,206, 97,154,181, 91, 28,131, 71, 46, 2,246,150,150, 86, 63, 91, 67,170, 66, 74, 91,139, 16,137,134, 6,
-165,172,164, 48,169,170, 96,237,178,115,197,137, 22,237,170, 83,155, 54, 24,243,221, 82,204,152,107, 60,107, 2,123,135,251,247,
-238,225,226,226,162,117,210,185, 36, 19, 82, 69, 37,125, 17, 33,166, 12, 17, 27,149, 90,103, 86, 67, 67,166,195,140,159,248,201,
-159, 4, 17,176,189,185,134,243,222, 34, 61, 53,114,180, 72,180, 2, 97, 62,248, 26,164,227,156,253, 44,110,221,123, 92,102,156,
-159,109,112,121,239,158, 66, 89,188,199,197,229, 37,198,113, 3, 31, 92,251,243,213,163,239,199,161, 21, 48,103, 97, 78, 75,140,
- 24,135, 65, 57, 0, 22, 57, 27,124, 64, 96, 45, 78,206,105, 94,121,177,253, 59,145,107,172,126, 38,125, 30, 3,132,253, 97,198,
-124, 56,180,117,150,190, 7, 6, 75, 65, 8,163, 90,194, 76,119, 0, 1,200,169,151, 58,165, 5,227,232,225,156,186, 33,116, 2,
-100,251,105, 86,251,113,202, 17,222,115, 75, 62,243,182, 22,168,250, 17,226, 85,216,149,139, 38,248, 13, 97,128,176, 82,226, 74,
-137,240,142, 48,140, 1, 83,202,160,114,208, 85,141, 69,252,138,232,186, 73,236, 26, 29, 2,163,240,128, 84, 10, 8,218,197,151,
-194, 96,202,109, 50,144, 4,200,230,159,119,208, 61,122,202, 5, 14, 17,185, 16, 72,178,217,119,117, 73,144,132, 32, 37, 35,136,
-128, 93, 80,203,153, 24,204,200,196,238, 2,110, 4, 61,245,184,231,214,185, 87, 11,112,213,129,113, 7, 59,115,117, 68, 79,250,
- 51, 73,178,194, 99, 5,150, 29,175,205,136,222, 91, 14,169, 36, 56,100, 21, 88,219, 51, 38,128,240,222,152,177,127,114,137,114,
-120, 15,156, 62,172, 17,129, 71,209, 22,183, 10, 60,189,101,132, 40,221, 70,245, 8,215,126,252, 7,124,161,154,152,182, 6,174,
-192,108,104,114, 20,170,210,169,212,187, 31,194, 29,146,179,159, 93, 10,186, 44,107,129, 10,233, 58,197,121, 83,190,203, 26,161,
- 90,173, 97,117, 7,141, 19,117,245,122,100,201, 72, 89, 85,247, 85, 7, 64, 39,116, 50, 89,159,240,166,100, 95, 73,120, 82, 11,
-123,183, 31,163, 38, 62, 51,255, 97,205,103,239,246,190, 98,113,141,167,225, 30,125, 17,201, 57, 97,111,175,215,217, 77, 34,130,
- 35,123,213, 58, 14, 23, 8, 7, 85,127,198, 25,177,179,234, 73, 83,126, 18, 68,116, 15, 91,138,217, 45,100,229,188, 55, 70, 78,
- 21,157, 89,120, 12,153,192,164,141,115,205,110, 56, 58,141, 95, 44,165, 11,131,169, 35,246,174, 8,231,146,155,112,105, 29,245,
-174,169,108,132,211,248, 84, 28, 9,234,110, 5, 22, 16,117, 32, 31,155, 71, 8, 78,214, 34,210,193,245, 79, 99, 13, 86,225,202,
-167,159,126, 2, 98, 82,181,245,105, 1, 23,249, 92, 65,220,231,177,222,107,224, 77,253, 48, 62,253,244, 5,222,253,202, 87,240,
-219,255,246,191,131,127,229, 87,127, 21, 31,127,244, 33, 62,254,232, 35,156,157,157,227,213,203,215,248,224, 7, 31,130, 29, 53,
-245,114, 17, 65,138, 90, 64, 98, 76,141, 16, 33, 2,236,182, 59,133,200, 36,237,214,134, 16,218, 46, 87, 5,110, 43,240,105,221,
-235,234, 21,233,189,179,157,185, 61,212, 25,166,150,215, 7,136,243, 30,193,196, 98,149,109,174, 25,235,201, 62,107, 75,187, 50,
-191,119, 76, 81,247,206,222,173,171,163,148,219, 20, 37,198,213,171, 94,239,139, 98,121,223,201,138,181,247, 78,253,239, 82, 19,
- 28, 75, 43,236,165,172,191, 19,246,247,152,189,230,183,123, 19,191,121,135, 97, 51,130,192,184,184,188,208,159, 61, 91,158,187,
-117,199,197,198,253,213, 67, 12,176, 9,205, 60,152, 29,130,247, 96, 98, 92, 94, 92,224,221,119,159,224,211, 79, 63,109,236,119,
-111, 32,148, 22,245,106,135, 32,230,181, 0, 87,114,156,109, 14, 16,188,218,203, 30, 60,124,128,224,131, 90,198, 66,128,243,193,
-190,219,212, 84,253,222,107, 66,153,174, 25,142,125,198, 41, 43, 46,117,115,126,102,238, 8,175, 19, 53,239, 64,240,186,243, 54,
- 75,145,186, 18, 18, 14,211, 1,211, 50,183, 60,251,253, 97,194,238,250, 6, 49,170,222,130,157,179,107, 76,125,213,151,151,151,
-216,238, 15,152,247,251, 22,104, 83,221, 53,240, 30, 75, 44,202, 37, 55,189, 67, 11,193,177, 73, 73, 99,175, 27, 52, 75,104,181,
-224,213,172,121, 2, 26,188, 71,211,249,138,125,182,202, 73, 47, 57, 27,234, 87,144,167,189, 94,143, 6, 15,210,240, 21,192, 13,
- 30,169,172,171,142,105, 22, 80, 90, 20, 0, 35,130, 33, 56, 36, 4, 72,140,118,255, 41, 66,182, 32, 91,243, 84,218,228,152,109,
-253,185,164,108, 11,114, 75,227, 19, 64,114,130,119, 30,165,166, 87,218, 51,215,113,213, 24, 16,216,196,123, 2, 94, 9,123,101,
- 21, 43,235,253,200,150,209, 90, 15,250, 0,196,107, 90, 91,133,151,129,219,190, 93,107, 59,181, 80, 25,166,172, 92, 20,210,215,
-245,144, 4, 79, 30, 20,188,216,190,139,240,217, 21, 32,215, 0, 13,111,241,216,188, 29, 54, 67, 39, 75,118,233, 53, 83,119,237,
-212, 91, 80, 60, 74, 75, 83,107,118, 48,210,125, 39,136,193, 84, 48, 64,187,245,114, 43, 9,123,141,241, 44,122, 84, 71, 78, 30,
- 75, 0, 54,220,154,227, 38, 84,163,254,229,154, 26, 92,172, 58,245, 39,151, 10,131,233,195, 80,234, 30,186,226, 98,107,167, 95,
-228, 52,185,171,142, 1,138,158,226,152, 86,111,118,141, 97,101,235,188,155,192, 78,179,212,117,231,178, 42,186, 87, 92,233,122,
-178, 3,208,108,108, 21,203,154,114, 65, 34,198,104,221, 75,233, 88,247,213, 31,207, 22,128,163,163,184,140,101, 42,232,179,205,
-169,235,236,245,161,153,149, 92,100,123,250,182,185,183, 61,169,171, 87, 96,247,125,112, 99, 61, 27, 60,203,206, 49, 83, 52,197,
-246,105, 80,142,117,250,253, 78,185,223,221,158,152,245,205,110, 33,183,246, 61, 77,159,208, 29,202,228,116,172, 94, 53, 27,116,
-146, 54, 4, 58,242, 94,210,241,153,182, 77, 82,156,119,107,236,235,151, 32,188,126,222, 14,189,255,251,177, 11, 18,121,246,241,
-199,248,169,239,252, 12,254,147,191,255,159,226,103,127,254,231,113,216,237, 17,194,128,243,243, 11,188,120,254, 28,159,190,248,
- 4,187,155, 27,108, 54, 35,178,203,216, 31, 14, 13,119, 90, 63,179,224, 53,172,100,183,223,183,112,145, 82, 10,200,217,120, 27,
-210, 70,236,181,243, 38, 34,228,154, 53,158,171, 74,221, 68, 64,173,163,212,110,217, 7, 50,138,151,142, 4,171,202,218, 25,109,
-175, 10,157, 82,204, 38, 78,203,106, 11, 50,117,115,187,151,152,155, 87, 62, 27,110,214, 89,184, 11,140,219, 77, 69, 31, 96, 25,
-104,123,236, 26, 6, 82,187, 59,105,226, 37, 61,120, 80, 1,150, 69,247,237, 33,120,237,122, 12, 0, 2, 67,184, 50, 43,122, 55,
-198, 5,203,146,154,128,175,105, 70,216,188,251,134,233, 85, 33,183, 74, 96,151, 37,226,253,247,223,199,123,239,191,135,253, 94,
-115,230, 7,243,142,215, 67,160,183,212,181,154,234, 6, 33, 56, 79, 45,225,173,118,211, 14, 26, 46, 51,112,208,208, 22, 99, 34,
-140,155, 13,134, 33,128, 65,152,151,216, 92, 8,100,164,190,170,203,113,204,109,138,226,157, 67,129, 96,187,221,195,123,198,102,
- 24,225,134,128, 20, 23, 4, 63,216,125,171, 7,157,184, 44,200,162, 96,162,148, 22,227,148, 51,182,187, 61,166,105,223,154,155,
-184, 84, 18,157, 32, 23,224,250,250,166, 19,109, 1,190,178, 5, 44,239, 34,183,244, 53,103,238, 8,233, 58,239, 12,239, 44,165,
- 45,151, 53,213,174,233, 85,208,160, 62,220,190,119,194,180, 44, 24, 61, 97,220,156, 1, 37, 32,230,131,194,138,160, 64,161,100,
-118,182,234, 5,135, 8,130,137, 20, 83,138,240,148,224, 29,131,200, 65, 88,189,232,177,144, 17,236,204, 78, 86,167, 9,194,160,
-172,255,190,176, 55, 80,146,180,200,216, 98,176, 32,170, 82,121,163, 10,162, 91, 79, 54,142, 69,213, 55,153,111,189,197, 98,183,
- 34, 79,109, 42,213,236,107,134,190,133, 91,211,220,200,158, 89, 73, 0, 87,138,198, 14, 67,173,137,226,244, 64, 34,133, 12,140,
- 83,181, 0,132,119, 92,198,213, 99,143,101,251, 21,184,105, 7,184,114, 98, 97,147, 47,180,176,201,219,138,252, 81,129, 71, 93,
- 77,217, 78,137,202,145,218,142,237,225,161, 86,172,117,111, 94,218, 14,125, 37,141,173,190, 97,210,146, 47, 3,150,123, 15,241,
-238,131, 43,124,253,106,198,239,223, 16,118, 92, 85,121,199, 41,111, 26,139,170, 59,116,234,138,185, 96,181, 85, 29, 73,166, 68,
- 58, 93,253, 90, 8,235, 72, 34,203, 26,249, 73,189,229,170,117,232, 90,200, 85,245,202, 24, 28,129, 75,198, 94, 86,128,140,122,
- 24,215,209, 8, 19,142, 4, 99,220, 35,109,104, 21,252,233, 5,169, 54,174,220,193,105,164, 99,245,163, 8,132,187,112,144,162,
- 98, 62,103, 35, 43,116, 25,234,185, 90, 59,172,251,174, 99,115,106, 25,192,166,192,165,188,170,251, 5, 45, 8,166, 81,231, 90,
- 58,147, 29,210, 44, 20, 70, 4,240,162, 9, 73,197,118,209,167,133,178,156,136,205, 90,199,221,173, 21,238, 66,196, 54, 39,195,
- 45,202, 92, 47, 70, 92,103,235,116,231, 21, 76, 45, 92, 8,213, 79,223,167,187,245, 35, 44,185, 13,152,161, 31,209,194, 86,223,
-223,211,143, 62,194,191,244,115, 63,135,191,247,159,253, 3,124,227,155,223,198,205,213, 22,243,114,192,246,230, 26,175, 94,189,
-196,155, 55,111, 80, 32,184,119,255, 2,203, 28,177,223,111,219,251,141, 75, 49,196,165, 67,146,140,121, 73,136, 38,130, 35, 3,
-132, 48, 92, 35,146, 29,166,131,118,165,102,125,170, 66,175,250,128, 25,130, 55,108,176,190,247, 37, 38, 19, 5,185,246, 73,164,
- 20, 45, 86, 24,240,196,134, 76, 85, 5,120, 74,181,152,105,177, 15,222,233,184,221,246,134,228, 88,177,175, 69, 52, 80,200, 30,
-170, 57, 43,205, 45, 12,193, 2, 87,108, 47,153,117, 71, 47, 69,147,201,144, 75,179,171, 73,169,132,174,117,172, 91, 45, 80,149,
-101, 94,202, 42, 40,171,170,247,138, 29, 46,101, 77,151,211,123,180, 28, 7, 55, 97, 13, 49,174,190,251,253,126,143, 87,175, 94,
-225,234,205,149,130,115, 6, 15,117,158,169, 0,208, 59,253,156, 42,180,167,186,100, 68,244,112,232,141,118, 87,247,222,231,231,
- 35, 66, 24,176,196, 5, 99, 8,216,108, 70,120,231,141,113,174, 84,183, 48, 12, 90, 36, 82,129, 27, 44,121,204, 92, 0,170, 87,
-168,137,111,210, 66, 7, 75,202,170, 45, 49,101, 61, 58,203,212, 97, 58, 96,154,103, 72, 42,230,243,159,176,189,222, 34, 46, 11,
-188,103, 56, 63, 34,185,140,105,153,225, 29, 3,112, 88,230, 73, 49,171,222,215, 57, 51,132,244,208, 34, 69, 73,116,217,198,217,
- 58, 77, 36, 45,172,158,213, 54, 86,170,117,139,225, 60,217,126,223, 86, 40, 36,112, 96,205,101, 55,241,102, 74,217,180, 29, 30,
- 75, 84, 87,133,144, 71, 94, 14,112,142,141,213, 94,128, 28,117,207,111,112,160, 37, 21, 20,137, 64,169, 46, 13,198,126, 33, 72,
-220,169,247, 92, 17,155,200, 36,112, 37,235,235, 96,130, 43,118,120, 51, 43,158, 35,180,224,149,146,138,134,245, 84, 12,110, 37,
-103, 22,128,141, 23,130,110, 21, 37,102, 61,235,218,134,102, 81, 94,181,103,100, 26, 37, 5,204,100, 19,114, 50, 18,132,212, 78,
-231, 37,129, 60,193,147, 7, 57,178,221, 59, 90, 7, 79, 98,160,159,122, 15, 57, 70,204,132, 77, 78,120, 50,206,120,250,224, 62,
- 48, 63, 4,228, 37, 64,225, 8,242,217,142, 34, 95,132,135, 61, 25,197,247,123,246, 58,138,247, 34,108,126,100,128,242,105, 72,
-140,154,249,107,215,206, 36,112,162,187,246, 53,121,172,223,145,139,117,119,103,192,253, 7,120,124,249, 6,247,174, 10,162,184,
-149,154,211,154,100,235,238, 5,109, 95, 93,161, 50,109, 74,112,178, 21,149,206, 58,214,162, 64, 59,158,251,106,205,182, 71, 62,
-211,173, 68,176,182,223, 55, 96,205, 28,169, 21, 92, 38,105, 35, 29,161, 21,112,114,234, 99,151,246,251, 11,156, 21,238,210, 9,
- 25, 74, 95,196,168,251,247,107, 32, 14, 49, 36,206,120,121,200, 56,187, 60,199,133,151, 21, 0, 33,232,240,135,107, 0,204,177,
-141,172,155, 88, 52,209, 92,247,251,165, 47,154,210, 68,141,142,215,206, 87,195,111,244, 34,100, 87,116, 23,103,220,253,254,192,
-116,219,230, 46,183, 60,227,117, 37,241, 54,113, 26,117,132,186,245, 74,166,118, 56,145, 59,180,238,107,225,150,147,152,223,210,
-124,163, 71,244,190,255, 15, 81,108,235, 87,195,120,250,244, 35,252,212, 79,127, 7,127,255, 31,252, 23,248,234,215,190,138,253,
-110,143,253,110,139,207, 62,251, 4, 79, 63,254, 16,215,215, 55, 77,236,229,156, 71, 76,123,245,155, 51, 99, 28, 6, 20, 95, 12,
-161,186, 96, 59,233,202, 68, 58,255,111, 77, 31, 19, 1, 98,156, 27, 41, 48,231,213,214, 84, 15, 67,195,224, 27,227, 29,166,114,
- 38, 2,184, 40, 81,139, 10,192,162,255, 78,177,145,181,115, 30, 36,218, 57,198,168,129, 31,108, 52,173, 97, 8, 72, 69,173, 84,
-193,172,114,217,208,176,142,217,224, 79, 90,164,185, 10,168,114,182,152,203,202,251, 55,117,187, 29, 16,107,104, 70, 93, 21, 57,
-246,141, 13, 46, 69, 3, 75, 0,157, 44, 16,107, 34, 88,253, 44,198,113, 68, 74,185,121,169,217,248,240,213,227, 45, 68, 13,113,
- 74,214,129, 86,219,153,119,132,179,179, 13,118,251, 29,230,249, 0,231,188, 69,149,154,118,196,185,230, 71,172,135,139, 33,120,
-181,128,217, 10,196,187,122,253,219, 14,184,100,156,159,157,169, 51,195,188,249,196,154,191,174,233,112, 5,193, 59,203,110,215,
-239,140,205,154,197,118, 95,103,195,240,138, 61,243, 8,192,180, 44, 8,185,180,116, 60,231,189, 30, 36, 88,233,120,135, 73,243,
-234, 29,233, 52,224,213,203, 87,216,109,183,170,224,134,111,171, 29,101,167, 19,114, 78,138,164, 5,235,181,101,106,118,166, 21,
- 28,148, 82, 82,134,125,203,106,166,117,242, 69,132, 4,130,164, 98, 76,125, 82,164, 47, 68,139,126,205, 14, 48, 12,113,181, 98,
-137,117,179, 66, 1,243,188,232,193,208, 7,115, 62, 25,192,202,188,227, 99,240, 16, 98, 76, 75, 4,149,168,157,245,146, 33, 84,
-144,150, 12,150,140,100, 7,192,245, 57,173, 83,169, 58,173,144, 14,133, 82,241,182,142, 3, 50, 23,192,118,220, 45,156,197, 10,
-248, 74,102,235,158, 28,196,109, 90, 88, 5,116, 76, 53,182,181, 6,137,233,169,184,250, 85,244,101, 57,219,157,235, 36,135, 60,
- 1,228,149,219, 34, 10,175,161,106,129, 35, 19,205,149,164,207, 40,102, 80,105,173, 43,158,120,194,155, 71, 30,251,237,187,240,
-187,107,192,101,128, 92, 71,145, 67, 23,148,245, 5,128, 44,121, 91,147, 98,246, 68, 87,119, 23, 69,199,126, 34, 43,171, 27,198,
- 71, 87,241, 22,119, 59,245,250,184,237,189,232,245, 94,245, 0,237, 48,188,248, 62,126,248, 76,240,135,226, 1, 47, 24,100, 29,
-163,175,111,213,124,241,178, 22,220,106,135,106,153,186, 77, 41,223,201,203,232,184, 4,212,104,216, 62, 9,110, 37,195,245,185,
-221, 53,113, 77,186, 29,187,254, 76, 71,199,123,251,214,213, 91,231, 44,212,237,255, 79, 70,205,185,219,253,139,233, 17, 8,170,
-176, 77,168, 32,138,234, 9, 6,226, 60,227,236,157,175,226,223,250,246, 25,126,240, 7, 63,196, 63,189, 33,156,121,106,251,234,
- 85, 5,191, 50,220,143,114,218, 79,138, 45,119, 19,148,154,207, 46, 82, 15, 74,157, 91, 65, 86,132, 98,168,135, 13,102,120,168,
- 8,165, 34,135, 82, 23,215, 74,180, 70,205,190, 13, 6, 83,106, 68,111, 71,130, 59,186,232,106, 98, 84, 87,160,228,104, 55, 36,
-199,216,223, 78, 20, 87,167, 67,210,197, 7, 18,157,114,230,191,120,236,254,121, 4,185, 90,208, 95,126,246, 41,190,253,237,159,
-198,127,254, 95,254, 87,120,239,189,175, 96,191, 59, 64, 74,198, 71, 31,254, 16, 31,126,248, 1,174,175,174,176,189,217,234, 88,
-212, 80,173,196, 10,242, 96,235, 76, 5,192, 52, 47,152,166, 9,239,190,251, 21, 92, 92,156,195, 57,135, 97,216,224,217,243,231,
-184,186,186, 2, 51,107,135,110,162, 63, 13,243, 48,188,175,247,186, 7, 47, 48,143,185, 77, 99,106, 49,117,220, 31,109,155, 50,
-188, 2,101,132,181, 11,143, 49, 99, 58, 76, 58,238, 52,165,121, 8, 14,101, 17, 44, 41, 2,163,118,177,203, 28,219,142,217, 85,
- 1,105, 94, 17,194, 41,234, 8,212, 7,103, 4, 48, 40,250,179, 93, 15,229,232,161, 91,175, 7,197,185,214, 15,151,219, 1,208,
-123,205,245,142, 75, 66,240,193, 88,220,100, 65, 42,222, 34,118,179,137,253,148,211, 89,181, 29, 53,210,184,216,142,120,112,193,
-200,104,234,211, 47,101,141,125,118,142, 27, 26, 86, 12, 54,227,216,217, 14,189,174, 31, 86,161,107,206,122, 56,173,223, 87,201,
-122, 8, 81,125, 64,105,182,185, 98,163,217, 16,188, 78, 49,164,128,115, 1,187, 13,162, 65, 85,234, 24,126, 28, 7, 83,201,219,
-115,175,168,189,173, 90,254, 98, 76, 56,204,147, 18,216, 68,176, 95, 22,188,121,117,133,195,126, 11,199,192,146, 43, 7, 94,139,
- 41, 57,135,195, 97, 70,137, 11, 48, 14, 54, 93, 19, 59,236,232,234, 48,120,165,219,205,145, 80, 82,110, 85,177,174,111, 82, 41,
- 96, 41, 22, 53, 42,235,232,189, 66,141,108, 5, 84, 5, 98,108,113,177,193, 1, 60,110,244,115,136,201,238,233,212,138,248,122,
- 24,213, 90, 34,164,221,244, 38,168, 82,221,151, 4,231, 71, 20,120, 8, 18, 74, 44, 24, 60, 67,200, 25, 14,155,144, 83, 82,104,
- 25,233,232,157,155,237, 85,243, 1,216, 18,228, 8,132, 66, 26,168, 82,114, 70, 34, 1,103, 50,110, 13,153, 5,141,193,149,168,
- 82,179, 55,228, 88, 88,219,130, 94,170, 54,202,248, 40, 4, 83,221,147,186, 34, 86,216,232,154,199, 81,225, 54,117,119,143,146,
-129,162,203,231,108,107, 13,210,177, 49,146, 8, 70, 18,188,179,137,248,240,209,125,148,233, 9,184, 60,211,155,190, 11,103,233,
- 28,107,159, 63, 82,188,131, 91,211,211, 53, 60,213,140,101,209,208,247, 98,163,142,158,240,218,115,218, 11, 86, 54, 58,223,122,
- 56,214, 19,189,158,238,163, 41, 15, 73,112,132, 64,173,123,212,210, 64, 52,210,120,241,232, 88,205, 14,119,128, 81, 58, 38,187,
-116,214,176,246,144,233, 10,121,175, 40,236,139,123, 77,247,100,230,126,161,107, 99,156,245,205, 75,169,202,247, 21,150,211,152,
-224, 71,227,120, 29,121,147,237,121,178,117,148,245, 85,212, 93,105, 29,227,151, 82, 64, 97,192,176,217, 40,105, 45, 51,214, 97,
- 70, 21,164,229,213, 43,222, 78,226,212,165,157,202, 81, 81,115, 29,156,160, 84, 77, 1,233, 24,214,217, 65, 41,219,174,212,153,
- 72,166,230, 25,195,198,241,237,129,104,163,217, 90,154, 11,142,119,231,114,215, 72, 91,228, 8, 29, 43,183, 78,144,132,224, 60,
-138,100,235,116,143,127,216,233,133,220,255, 89,177,253, 74,221,227,247,226,189, 31, 5, 44,243,246,137, 59, 97,123,115,131,179,
-243, 11,252,221,255,248,239,225, 39,127,242, 39,241,209, 71, 31, 34,167,132, 23, 47,158,227,251,223,251, 62,166,253, 1,243,180,
- 32,165, 5, 37, 23,236,247,187,118,208,216, 12, 35,156, 83, 80,202,205,118,135,195, 97,194,251,239,191,143,111,126,243, 91,234,
- 99, 38,224,249,139, 79,177, 44, 17,227,102,196, 18, 23,148,100,102, 49, 39,109, 4, 13, 81,174,118, 45, 58, 57, 91,242, 88,112,
-166, 34, 62, 6, 17,105, 7, 28, 43,210, 9,195, 96, 22,182, 92,128, 34,205,186,198,206, 33, 4, 21,151, 57,214,104, 79, 41,192,
- 50, 39,100, 17, 12,158,219,202, 6, 32,172,205,154, 96,232,200, 98,206, 52, 68, 48,214,129,198,166,150,154, 35,216,217, 54,165,
-117, 91,100,142,135,202, 93, 95, 35,115,215,120, 83, 98, 29,145, 18, 1,236, 25,146,164, 81,217, 74,209,142, 42, 25,223,222, 57,
- 21,243,133, 33, 24,212, 70,154, 96,207,123,223, 38, 8,154, 10,167, 22,190, 33, 40,204, 38,166,100,122, 1,110,116, 61, 98,168,
-178,190, 8, 46,239, 95, 34,132, 81,199,230,166,141, 72, 41,219,119, 72,230,201,151, 38,142,139, 49,225,252,108,196,147, 39,239,
-224,102,187, 67,206,234,199, 39, 34,108,134,128,179,179, 51, 21,113,165,100, 66, 67,205, 58,247,172, 83,171,148, 52, 74,245, 96,
-222,253,155,235, 45,118,215,215,107, 66, 90, 74,136, 49, 35,103,181, 50,138, 9,191,156, 9,225,132,178, 50,216,133,109, 23,110,
-247,183, 99,140,195,136,133, 34, 40, 71,128,169,173, 14,152,109,108,108, 83, 85, 87,181, 71,178, 18,232,234, 29,207, 4,184, 33,
-152,170, 57, 91, 87,204, 16,100, 48, 11,178, 48, 74,142,106, 75,181,164,187, 68,132,146, 18,114, 42, 64, 89, 84, 16, 25, 60,206,
-206, 47,128, 97, 68, 74, 2,246, 11,166, 61,144,243,162,211, 96,219,161, 51,233, 58, 8, 69, 87,164, 98,185,235,140, 12,103, 35,
-112,157, 50, 25, 96,201, 14,136, 34, 17,115, 46,112, 54,246,173,209,172, 98, 66,183, 76,206,226, 88, 87, 97, 91, 22, 93, 75, 50,
-170,208,205,174,219,110,140,173,227,123,156,197,209, 0, 0, 32, 0, 73, 68, 65, 84,103, 99,162, 54,113,112,181, 41,175,250, 31,
- 41,218,253,123,100, 11,147, 89,221, 34,181, 97, 41, 2, 60,228,130, 87,247,128,237,213, 59,224,235,215, 0, 45,186, 10, 33,220,
- 18, 7,247, 88,115,220, 21,161, 69,111, 95,182,123, 34, 75,177,113,130,160,207,130,149,199,110,201, 61,189, 49, 10, 54,142,135,
- 21,221,117,211,101, 23, 69,245,108,147,238, 55, 68, 42,189,236,216,187, 84,127, 71, 29,191,175,123,121, 27,191, 91,190, 59,119,
- 71, 24,234, 60,125, 34,212, 13,102,143,149,242, 77,200,245, 5, 67,215, 92,114,203,115, 79,133,214,189, 70,183,151,175, 86,177,
- 74,181,171,126,119,233,243,187,169,142,205,165,163,180,145,117,215,199,121,229, 25, 2, 63,142,216, 63,255, 99,252,247, 63, 40,
-184,188, 56,195,147,141,138, 19, 51, 86,235,133,172,131,246,245, 51, 19, 59, 32,213,211,148,141,254, 87, 7, 38,214,221, 78, 7,
-126,169,187,239, 44,162,185,212, 76, 71, 19, 10, 65, 50,246, 60, 26,165,169,250,152, 91, 64, 4,213,174,185,124,110,110,249,105,
-161,165,238,107,143,105, 57, 26,199,159,176,118,215, 14,190, 30,254, 90,119,118,187, 37,255, 50,248, 87,124, 1,254,181,254,216,
- 82, 10,118,219, 27,252,250,111,254, 54,126,238,231,127, 22,207,159,126,140, 23,207,159,227,197, 39, 47,240,234,179, 79,177,187,
-217, 33, 39, 21,188, 5,239, 17, 83,212, 61, 99,204,173,216, 10, 1,143,223,125, 7,247, 30, 62, 68,142, 25, 79,222,125, 7,243,
- 50,131,136,112,117,245, 6,207,158, 61,111,202,246, 20,211, 90,180,109,111, 92,178,234, 81, 42,147,127,179,209,174,104, 73, 17,
-185, 56,163, 94, 41,220, 37, 4,167, 52,186,148,219, 1,175,142,104, 43,196,131, 7,237, 50, 82,206, 22,144,194,109,226, 19,130,
-138,167,110,182, 59,220,191, 56,195,187,143, 30, 32,231,140,253, 52,175, 17,150, 0,166, 37,106,238,121, 54,229, 51,214,142,174,
-254, 7,214,169,228,152,205,102,166, 34,198,106, 31, 83, 6, 57, 90, 92,177, 18,194,200, 44,101,171,197,172,180, 53, 14,195,141,
- 14, 37,169,165, 79,160,135, 19, 79,174,217,179,188,243, 90, 64, 76,177,175, 73,116, 17, 37,103,156,157,159,129, 44, 52, 70,243,
-182, 19,134, 51,181,144,229,168,113,161,245,242,171,158,245,170,237, 57, 63, 63, 7, 57,143,146,103, 91, 7,184,166, 24,207, 57,
- 35,197,185,105, 18, 20,238, 35, 26, 29, 74,140,156,114, 11,255, 8,222,225,236,108,163, 57,233,243,130, 92, 5, 95, 66,134, 88,
-101,228, 20, 17,130, 71,190, 41,184,190,186,194,178,204,200,113,105,150,182,100,232, 95,166, 2, 56,135, 57, 70, 77,150,179, 90,
- 19, 6,103,226, 72, 0, 37,181,155, 63, 89,130, 30, 49,193, 51, 35, 22,135,121,158,193, 92,169,122,166, 91, 0,129,156,111, 58,
-137, 14,214,104,130, 96, 85,135, 35,103,227,192, 19,114, 90,192, 16, 4, 95,213,223, 0,137, 51,193,157, 78, 64, 28,107, 34, 91,
- 96, 66,161,128, 56, 71, 92,142, 5,195,102, 3, 97,175,225, 47,214,145, 29, 38, 66, 94, 38,227,197, 19,216,233,243,114,240,140,
- 2,141, 18, 70, 41,198, 17,209, 3, 46, 75,129,115,170, 5,240,142, 33,193,233, 1,194,226, 88,139, 56, 32, 11,136,146,161,125,
- 45,131,195,194,169,200, 19,132,125,115, 11, 73,115,228, 84,120, 88,233, 4,187, 85, 41,175, 11,230, 36, 2, 78,128,115,217, 38,
- 12,235, 10, 84,199,245,188,226,101,203,186,148,214, 56, 87,129, 23,224,201, 16,177,123, 48,162,236, 31,131,243, 83, 11,123,161,
- 99, 92,186,220,142, 96, 61,202,198,148,187,235,185,244,152, 88, 17, 70, 65, 54,180,105, 39, 80,107,208,152,181,128,202, 9,224,
-174,116,156,120,116, 59,101,238, 18,200, 68,110, 83,230,122, 40, 66,203,252,237,119,207, 6, 70,201, 54,178,166,163, 61, 66,255,
- 42, 42, 50,175,178,225, 87,145, 28,186, 19, 15,157,224, 71,169,179, 6, 74,135,130, 97, 90,113,171, 5, 56,218,237, 31, 91,172,
-123, 84, 41,110, 29, 34,106,168, 77,133,161,112, 39, 44, 68, 41, 96, 23,240,232,158,126, 1,185,172, 5, 93,112, 58,230, 94,149,
-228,117,220,169, 33, 49,234,163,207, 32,120,131,132,144,168, 10,223,173,180,253,245,117, 24, 57,138,132,144,138,180,105, 75, 17,
- 58, 18,195,149,150, 14, 36,107,118,188,125, 71, 53,166,129, 1,100, 42,159, 27,124, 70,167,130, 55,186,189, 11,186,147,146,216,
-169,227, 75,117, 74,244,120,223,255,159,254,234, 63,227,195,225,128,247,190,250, 53,252,229,191,250, 87,240,234,229, 39,120,246,
-244, 41,158, 63,125,138, 87,111, 94, 97,119,179,197,124,152,177,196,197, 14,130, 9, 41,107,199,166, 76,242,218,177, 2, 55, 55,
- 91, 60,124,252, 16,142, 24, 47, 94, 60,199,126,191, 7, 72,105,114,222, 64, 48,243, 50,183, 2,221,194,119,170, 6,194, 84, 85,
-204,140,195, 97, 50, 52,170,137,118, 42,133,203, 50,209,197, 52, 58,163, 31, 80,114,105,211, 25,136,142,199,217,212,252,193,136,
-106,202, 32, 32, 60,124,240, 16,159,189,124,137, 87,175, 94,227,167,190,249, 13,252,216,123,239, 96,154, 22, 61,176,228, 2,103,
- 44,238,148,107,231, 86,211,203, 8, 57, 85,242, 97, 62,154,204,212,212,193,134,204,236,224, 30,130,149,239,239,156, 51, 10, 96,
- 29,197,123,156, 95, 94,226,176, 63,232,125,199, 90, 28,157,119,152,243,178,118,247, 80,228,170, 38,226,205,246,187,164,169,239,
-217, 44,108, 57, 21, 44,243,140, 97,220,152, 88, 81,187,166,148,181, 43,119,118,216,102, 3,212,168,176,207,172,101,204, 45,195,
-189, 38,184, 49,235, 72,184,198,156,214,251,144, 89, 87, 23, 33, 12,136,165,224,213,203, 79, 49, 14, 3,114,209, 67,143,247, 30,
- 75, 74,112, 62, 32,120,143,146, 19,124,240, 24,195, 0,231, 61, 14,135, 3,156,247,152, 99, 70,140, 51, 46,207,207,241,244,122,
-139,253,110, 15, 17,193,180,204,170,188, 31, 61, 82,102,148, 37,154,222, 32, 35,154,173,108, 52,139, 92, 76,121, 69, 89,231,210,
- 22,162,121,201,235,225,219,236,136, 69,148, 72, 87,227,154, 91, 81, 50,219, 87, 76, 89, 97, 48,166,181,105, 93,162, 72,203, 0,
- 97, 59,200, 44, 89, 64, 72, 8, 38, 76,212, 60,244,245,176, 93, 0, 4, 6,206,239,159, 1,236,141,231,207, 8,158, 65,236,116,
- 26, 21, 60,174,175, 25, 37,238,192,172,235, 27,161,122,136, 76, 96, 20,144,119, 72, 69, 87, 50,100,162,201,197, 70,241,206,105,
- 97,103,242,171, 40,186, 8,132, 29, 42,137, 67,167,178,186,182, 42, 70,106, 84, 97,182, 61,199,244,162,213,148, 81, 98,213,163,
- 80,105, 0,154,130, 58,158, 82,198, 9,103,219,231,179,194,213,188, 23, 8,105, 66, 97, 54,209, 30, 3, 16, 7,196,226, 65, 37,
- 35,160,170,232, 61, 30, 0,184,188, 7, 92,223,188, 3,126,243, 6, 40, 7,128,195,145,150,232,182,240,151,110, 3, 55,228, 45,
-107, 68, 0,190, 20,149,235,215, 78, 84,119,200,218,143,149, 42,138,163,181,104,247,213,176, 31,115, 31,197,169,118,133,250,168,
- 87,173, 96,149, 91,211,131, 78,210,127,235,245, 31,251,202,237,177,215, 10,185,224, 86,202, 72,123, 56, 82, 29, 83,203, 42,134,
- 59,222,153,247,197,185, 63, 41,221,225,177,110,251,225,178,142, 98,208,199,225,200, 74,152,235, 26, 81,110,221,240, 73,239, 45,
- 5, 49,215,184,217,110,167,124, 18,152, 83,173, 33,100,217,194,149,240, 68,182,167, 38,136,238,237,237, 53, 70, 40,115,128, 91,
- 68, 43,119,194,190, 21,181,219, 80,176,230,109,111,192, 8, 59,160, 21,169, 41,104, 88, 83,179, 12,249,123, 10, 60,160,110, 15,
-126,171, 43,174,148,190,211,174,156,232,238, 56,212, 46, 17,208, 28,123, 71,113,187,111, 67, 35,126, 81,151,206,221,181, 90, 58,
-241,164,142, 52, 29,230,105,198,203,151,159, 97, 12,140, 63,248,189,223,195,118,191, 7, 74, 54, 96, 76,106, 71, 88,182,124,114,
- 21, 90,121, 48, 23, 44,179, 62,248,211,213, 53,246,123,141,142,221,109, 15, 24,198, 96, 69, 85, 71,173,186,255,134, 81,240,236,
-179,169, 96, 23,167,129, 34, 75, 92,213,242,117,167, 94, 15, 53,195, 16,154, 46, 3,236, 77, 24,167,227,113,202, 90,244,135,193,
- 55,164,234, 56, 14, 77, 12, 87,105,105, 49, 70,108,198, 1,127,225, 95,254,115,248,233,111,127, 27, 47, 95,191,198,243,231,207,
-145,139, 96,154,162, 30,236,165,180,221,115,245,139,123,231,109,212, 61, 55,241,102,141,243, 84, 36,232,138,206, 76, 22, 2,210,
-127,246,107, 55, 14, 56,114,230,161, 87,101,124, 10, 30,113, 86,164,106, 46, 25, 14,222, 16,182,209, 34,119, 75, 67, 28,111, 54,
- 42,174,219,237, 38, 56, 71,112,227, 96,108,120, 7, 56,163, 65,154, 8, 80, 76, 56, 88,223, 75, 49, 69, 52, 21,110,215,163,115,
- 74, 71, 11,227, 96,169,118, 73,175,251, 96,162, 52,227,246,103, 67,206, 86,203,162, 15,190,221,179,103,155, 17,206, 7,213, 96,
- 64,177,184, 66, 80,221,128,193,125,114,154, 33,165,224, 50,220,111, 69,243,102,123,131, 24,103,236,167, 5,219,155, 45,226, 60,
- 27,179, 93, 89, 0,197, 88, 17,154,151,110,135,186,230,167, 62,114,152,218, 51,130,140, 44, 40, 13, 37,139,218, 89,219,123,241,
- 42, 27,183,180, 63, 54,214, 1, 33, 21, 75, 0, 49, 74, 90, 41, 5,131, 95, 19,248,148,250, 91, 58,166,136, 33, 41,157,111,186,
- 9, 71, 2, 71,122,208,136,203, 1,195,200, 8,126,131, 66, 42, 12,204, 41, 35, 12, 64,240, 67,155,252, 93,156,111, 48, 79, 5,
-172,178, 57,196,164, 24, 88,177,177, 43, 25,123,158, 37, 3, 94, 9,132,165, 11, 4,170,141,103, 97, 27,129, 59, 32,243,202,149,
- 71,123, 78, 86,171,156,179, 61,106,130,229,193,233, 90, 82, 52,251,160, 64, 5,215,129, 43, 91, 95,197,160, 34, 4, 79, 0,123,
- 2,115,176,166,202,230,215, 54, 62,173,162, 68, 70,177, 56,114,105,154, 36, 54,125,218,192,132,119, 54,132,237,163, 11,148,253,
-187,224,248,225,157,207,193,158,245, 33,130,219,117,238,115,254,114,223,249,198,251,191, 51, 79,147,158,134,170, 93, 76,104,141,
- 5,173, 99,103,172, 29,105, 63,243,231, 54, 54,165,134, 72,229,147, 51, 68,243,167,247, 8,155, 78,164,178,238,155,215, 46,250,
-118,119, 76,109,143,140,166,198,167,166, 7, 16,208,237,128, 27,166, 91,240, 18, 58, 57,213, 8, 58,124,107,119, 48, 1,238,200,
- 82,239,202,114,233, 67,104,176,190, 7,234,108, 95, 76, 74, 70,106,185,243,245,243,163,227,169,134, 28, 13,218,143,121,231,206,
- 7,140,131, 83,228,161,244,110,237, 53,221, 77,186,253,190,216, 78,188, 93, 76, 53, 96,167, 77, 31,164, 67,160, 82, 19, 25, 50,
-169,242, 61,159,236,206,215, 3, 35,173, 5,215,238,235,154,205, 12, 28,239,211,143,118,236, 29, 91,254,120,207, 77, 29, 82,246,
-244, 11, 95,191,161,245, 59,199, 93,129, 3, 95,170,176, 59, 98, 56,214, 7, 62,184, 59,104,218,231,230,131,199,126,123,131, 23,
- 47, 62,197,195,251, 15,241,193, 15,127, 96, 59, 82,237,252,152, 53, 55, 92,137,103,217, 20,218,140, 24, 99, 3,190,136,157,128,
-164, 72, 59, 4,212,110, 82,163, 46,139, 49, 23,164, 81,213,170,102, 66, 71,238,170, 10,207, 22,121, 90,247,236, 38, 14, 86,221,
- 3,107, 34, 29, 68, 52,211,219,172, 70,181,163,119,174,238,226,165, 97, 88, 25,220,148,250, 67, 8,248,163, 63,250, 35,252,165,
-191,240,151,240, 55,255,230,175,225,143,127,248, 67, 29,113, 75,193,245,245, 77,203,242,174,163,109,176,230,169,159,198, 70,150,
- 82,148,217, 93, 25, 12,164,158,118, 65,209,174,173, 38, 1, 18,153, 47,153, 21, 20,227,122,117,187,192,135,128,139,139, 11,251,
-179,186, 55,175,175, 33,120,223,244, 20,130,170,196,150,166,144, 79, 57, 97, 28, 6, 4, 31,212, 21, 80, 83,209,156,215,238,205,
- 64, 42, 92,133, 85,189,152,203,238,207,186, 55,207, 41,226,242,242, 18,247, 31,220,183,142,188,250,150, 13,173,156,179,217,189,
- 84,232,231,220,255, 75,218,155, 62, 75,118, 28, 87,158,199, 35,226,222,155,153,111,169, 42,160, 80, 0, 9, 66, 32, 9,136,100,
-139,162, 36,146, 34,103,233, 54, 73, 51, 45,217,152, 62,205,244,252, 69,248,187,198,230,211,180,181,153, 90, 61,221,109,211,106,
-169, 37, 8, 32,136,165, 94,173,111,207,229, 46, 17,225,243,193, 61,226,198,189,153,175,170,192,134,140, 38,160,150,247, 50,243,
-101,134,135,187,159,243, 59, 46, 23, 76, 33,177, 73,182,249,106,209,128,140, 67,167, 33, 53, 85,237,116,247,175,239,155, 40, 25,
-233,117, 37,152,212,221,118,131,171,235, 13,158, 62,125,134,118, 39, 46,138,160,104,214,212, 81,167,143,134,215,199, 64, 70,214,
- 7, 73,177, 47, 14, 3, 85,228, 99,188, 36,142,162, 82,206, 72, 91, 33,222,153,156, 73,207, 5, 42, 54, 42,127,157, 83,110, 61,
- 24,206, 24,216,202,137,247, 90, 51,217,131,102,155,103,182,137,226,120, 65,105,178, 35, 10,246,147, 58,226,228,254, 61,116,220,
- 32,246, 29, 42, 11,216,170,202,147, 36, 82,172,107, 12,137,161,174,177,173, 16,235,165,181, 46,199,199,146,158, 17, 38,139, 46,
- 73, 63, 63,178,247, 76,147, 19,144,213,203,159,234, 84, 68,125, 42,239,127,146,117, 15,178, 21, 52,185, 36,228, 98,103,140, 65,
- 80, 54,127, 10,217,137,105, 21,153,106,148, 78,121,242,215, 72,234,121, 70, 70,230,166,241,253,152, 63,161,223,199, 0,108, 45,
- 34, 44, 26, 48,182, 38,162,221, 45, 96,186, 27, 0,221, 40, 38,189,235, 64, 75, 55,152,215,156,127, 77,211,192,254,254,247,223,
-251,164,109,119, 96, 79, 90,216, 11,208,138, 30,168,121, 4,159,197, 2,250,194, 77,242,208,117,167, 48, 74,225, 70, 18, 92, 49,
- 10,167,114,116, 94, 48,225,247,242,105,104, 90,120,115, 87,157,199,202, 52,201,220, 45, 1, 40, 84, 94, 72, 14,129, 68,105, 74,
- 42, 75, 48,254,241,245, 43,218,237, 36, 34,163, 73,169,153,118,168, 9,195,106,104, 20, 15,238, 5,183, 80,142,196,228, 3, 73,
- 60,227, 68,160,128,159, 50, 96,170, 5, 86,141,131,239, 59,248,108,111,155, 7,185,160, 16,208,165,108,247,114,170, 50, 13,136,
-201,161, 0, 60,250, 27, 57,171,230,121, 50,157, 96, 46,225, 68,119, 11, 49, 75,187,204, 33,121, 58,209, 12, 36, 83, 78,121, 38,
-129, 50,211,253, 57,243,235,105, 75,175, 43,234,198, 72,113,100, 18,241, 13,167,149, 73, 97,133,107,154, 6,255,244,143,255,136,
-227,147, 83,124,244,131, 31,226,236,241,153,138,169, 12,186,174, 19,145,149, 10,215,196, 35, 29,192,129,117,148, 27,115,250, 87,
-242, 98,219,116,232,230,220,235,144, 11, 74, 41,116, 75,169, 89, 50,149, 25,217,219, 10, 80,203,221,108,140, 17,109,219,195, 41,
- 53,200, 24,131,166,105,242,184,190,174, 44, 22,117, 37,160, 22, 85,179,167,120,201,229, 98,129,229,178,193,203, 23,231,248,231,
-207, 62,131,171,106,252,233, 47,127,137,203,235, 11,141, 83,221, 73, 44,172,194, 71, 18, 65,206,192,100, 72, 77,242,141, 91, 87,
-105, 11,197, 25,255, 26,116,239, 28,245,240, 72, 2,189,100, 37, 50, 70, 60,243, 70,189,233,194,124, 23,149,254,114,181, 28, 51,
-217, 49,118,196,174,114,163,205, 79, 39, 6,117, 85,137,255, 89, 15, 91,171,148,181,126, 24, 80, 89,131,166,169, 39,168, 99,163,
-151,172, 68, 92, 35, 93, 93,164,117, 68,186, 88, 90, 67,120,248,246,219,168,155, 5, 98, 20,241,158, 8,154, 67,142,113,101, 37,
- 33, 82,113, 89, 17,236,173, 38,229, 17,193,186, 10, 67, 63,104,194, 29,208,212, 13,140, 19,193,155,136,212,244, 50,103, 12,158,
- 63, 63,199,243,103,207,113,117,125,141,245,245, 13,250, 78,236,141, 77, 83,195, 88, 82,159,185,136, 0, 19, 93, 80, 96, 61,182,
- 88,225,201,197, 36,125, 0,211, 69,144, 57,102, 95,190, 81, 1,155,252,207, 98, 8,140,174, 31, 52,218,119,188,136,167,194,159,
- 73,161, 4, 56, 43,108,244,168, 64, 26,231,156,228,139, 7, 47, 5, 18, 54, 67, 91,140,177,240,145,165,227,239, 59,124,240,206,
- 17, 78, 30,125, 15,145, 93,158,118, 88,107,148,206, 71, 57, 41,173,247, 65, 34, 96,195,128,138, 98,254,125,112,204,220,248,196,
-214,176,133,200,175,148, 82, 73, 56,148, 81,159, 58,178, 85, 13, 42,152,179,250,132,196,125, 47, 98,195,196,105, 55, 42,124, 11,
-233, 82,145,220, 14, 12,248, 40,158,120,230, 32,252, 19, 22, 17, 52, 7,130,133,124, 86, 99,202,169, 47,214,166, 6,233,188,209,
-232,113,201,228, 85, 96, 14,161,138, 30,100, 35,110, 98, 13,222, 69, 80,184, 30,139,246, 65,188,117,209, 14,189, 70, 43, 86, 55,
- 13,236,143,190,255,221, 79,118,187, 29,188, 60,151, 17,147,169,251,105, 83,136,229,198,238,117, 78,221, 46, 64, 50, 69,209,156,
-159,178, 52,177,179,149,129, 40, 92, 48, 38,104,220, 79,211,140,217, 77, 34,192,168, 53,125,141,153, 38,143,107,218,149,151,227,
-214, 3, 15,136,230,187, 8, 58,248,122,141,105,113, 41,151,168,156, 98,160,160, 87,165,155, 36,237,177,198,141,142,116, 98,129,
- 64,157,112,231,103,204,180,242,231, 23,195,128,174,247,249,113, 38,112, 12,202,232,212,130, 8,149, 16,137,229, 5, 37,150,210,
- 48,253, 77, 99, 38,223,113,138,177, 77,157,140,174, 9,128,105, 4,250, 84, 21, 47,183,224, 50,148,182,140,230, 41,225,238,180,
-231, 99,152, 94, 60,166,233, 5,148, 11, 7,209,183, 43,232,147,248,212, 44,132, 74, 99,202, 36,186,217,199, 51,197,224,113,116,
-114,138, 63,252,233, 79,177,190,189, 70, 85, 59, 81, 39,239,118,249,171, 26,229,238,123, 29, 21, 39, 18,163,181, 46,243,210,211,
-235,105,204,136, 35, 77,209,155,233,170, 55, 38,143,113, 46,210, 18, 53,169,151, 47, 45, 72,214, 90, 56, 87,161,247, 67, 86,109,
-115,140, 10, 69,145, 14,173,118, 22,171,197, 66,138, 32,241,168,116,183, 22, 71,171, 21, 66, 8,248,242,183, 95,226,171,175,191,
-129,115, 14,191,253,237, 23,248,248,227,143,241,241,199, 31,225,233,211,103,154,100, 6, 92,223,220, 2,204, 24,250,190, 16,138,
-137,210,184, 31,130, 10,251,120,180, 21,169,117,205,135,144,223,203, 68, 34,226, 34,245, 63, 59, 87,193, 85, 99, 4,166,181,186,
- 30, 80, 39,198,189,147, 83,221,177,154,209,207, 78, 69, 40, 75, 70, 81, 10,181, 76, 88,240,200, 69,157,193, 74, 91, 51,163,165,
- 50, 57, 66,108,185,230,208,162, 84,162,143, 35, 35,114,192,131,123,167,120,235,173,183,179,159, 29,106, 71,229,228, 92, 1,161,
-105, 42, 69,237,202,180,196, 58,151, 63,247,233,235,245,253, 32,236, 10, 39,161, 59, 33, 70,180, 93,155, 41,136,149,115, 96, 34,
- 60,127,113,129,103, 79, 30, 75,162, 95,219, 97,215,238, 20,106,147,216,242, 42,206, 13,250,220,116,170, 65, 70,196, 89,117, 93,
-201,186, 65,223,211,105,189,144,114,224, 77,198,181,202, 4, 40, 98,228, 65,244,131,144, 5,173,186, 34,132,242, 23, 51,160, 7,
-250,121, 51, 74,130, 75, 98,220, 20,197, 27,163, 92, 92,229,107, 43,126, 88,199,172,130,129,141,248,238, 9,227,123, 63,252, 33,
-214,225, 24,161,219,162,169, 12,140,171,242,199, 60,125, 46, 64, 6, 67,136,240,125, 15, 7, 73, 75, 75, 22,214, 24, 99, 62,109,
- 72,133,200,201,218,103,146,150, 67,138,147, 94,158, 35,172,145, 53,204, 24,171, 90,176,178, 18, 13, 84,187,120, 38, 65,221,114,
- 8,136,250, 57,116,236, 81, 87, 4, 87,213,136,100, 65, 28,149,243, 46,197,217, 71, 89, 53,177, 58, 4,172, 2,230, 71, 56,150,
-218,164, 19,133, 49, 77,185,201,228,162, 77,138,189,117, 36, 64,182,174,173, 97,186, 53, 64, 45,144,162, 98,247,212,111, 84,156,
-137,175,166, 99,214, 77, 3,251,251, 31,126,247,147,109,219,101, 36,107,218, 39,231,144, 20,237,166, 39, 48, 24, 26, 11,165, 57,
- 64,137,131, 18,226, 70,241, 87, 89,100,105, 38, 4, 35,240, 1, 6, 46, 17,231, 15, 88, 38,216,145,201,118,187, 80,116,253,145,
-198,113,124, 66,219,150,244, 50,204, 14,248,249,206,162,124,110, 76,180,111, 43,136, 49, 11,246, 14, 21,237,177,243,164,201, 88,
- 61, 22, 95, 15, 42, 66, 76,221,248,164, 80, 21, 86,181,113, 71,192, 69,140, 40, 79, 99,107,147,184,101,118,177, 48, 51, 72, 13,
-138, 24,213,156,145, 78, 83, 0, 13, 10,127,121, 58,164,146, 61, 48,121,115,147, 61,132,232,208, 77,146, 38,160, 57, 3, 9,253,
- 24, 93,255, 69,136, 75,126,186,102,223,170, 49, 55,223,211,196,149,255, 59,139,224,242,250, 39, 82, 30, 23,166,244,176,172,201,
-211,191, 83,215, 53,158, 61,123,142, 7,111,191,133, 71,239, 60,196,229,229, 21,250,126,200, 69, 38,189,254, 33, 10, 63, 93,126,
-158,105, 60,203, 72,225, 78, 9,163,106,181,147, 19,240,202,104,247, 18,160, 88,202, 7,143, 58, 45, 65,182,238,165, 63,107,212,
-118,233, 99, 68, 12, 1,139, 69,157, 59,176,101,179, 0, 64, 88, 54, 13, 78,142, 86, 89,113,158,212,231,139,102,129,213, 98,137,
- 39, 79,158,226,211, 79,255, 25,231,231, 23,168, 42,201, 42,191,189,189, 69, 4,227, 23, 63,255, 57, 46, 46, 47,176, 92, 44,224,
- 67,192,118,187, 17,203, 23, 25, 84,181,164,110, 5, 85,121,135,192, 89, 13,158, 38, 24, 49,170, 66, 61,242,152, 85, 96, 70, 16,
-145,177, 14, 85,165,197,208,152, 44,206, 98, 6,218,182, 67, 93, 55, 56, 57, 61,213,188,121, 66, 85,203,178,202, 15,126,244, 86,
- 43,185,206, 24,155,209,173, 92,112,250, 83,168,139, 15, 33, 23,140,202,169,135, 92, 47, 69, 33, 4, 56,235,180,179, 30, 37,186,
- 33,120, 28, 45, 26,188,243,232, 93, 56,229,187,131,101, 23, 46,143,167,202, 5,142,153, 65, 70,196,113, 32, 30, 19,230, 56,162,
-105, 26, 12, 33,192, 25, 18,245,189, 94, 32, 88, 69,172,162,132,119,168,155, 6, 23, 87,107, 60,125,114, 38,151,245,110,192,118,
-179,149,200, 96, 32, 95, 4,118,109,171,158,118, 59,134,244,232,137, 36,252,124,151, 51,229, 99,100,129,234,104, 65,151, 70, 64,
- 18,225, 12,141, 8,224,244,103,101,237, 33,154, 5, 99, 71,234, 29,105,209, 19,193, 34,141, 83, 24, 21,169, 89,167,157,120, 22,
- 14,202, 70,218, 88,139, 33, 0, 28, 6, 4, 24, 44, 66,143,223,255,193, 35,152,251,191, 7, 14, 3,156, 53,250,248,220,168,205,
- 81,204,107,142,234,213, 85, 6, 84,249, 31,146,125, 46, 79, 31,228,188,203,190,114, 66,118, 79,176,166,172, 37,237,143,177, 4,
-144, 29, 39,132,249, 2, 32,133, 53,197, 59, 11, 4,145,117, 92, 46,211, 26,103, 13,200, 85, 32,114,106,169,179, 57, 52, 41,173,
- 92, 5, 45,155,232,163,156,131,131, 88,195, 94, 70, 68,172,205, 22, 56,232,207, 47,137,181, 3, 8, 78,130, 83,112, 3, 7,236,
- 24, 20,110,246,186,245,217,177,249,202,115,142, 39,227,247,143,222,255, 36,246, 59, 80, 96, 12, 81,180, 15,177,216, 53, 51,165,
-178, 90, 52,184,153,176,134,252, 32,131,218,218, 18,121, 45,164,152, 84,140,124,111, 42,232,230, 60, 30,249,135,143,110,194,222,
- 94,219,128,225,153, 69,133, 56, 87,165, 99, 84,106, 19, 70,108,227,212,150,143, 3,187,242,233,152,126,190,127,207, 54, 32,151,
-120,232, 83, 1, 32,221,161,242, 42,243,205, 99,148,199, 92,175,142,176,116,114,251,102,141,137, 37, 42, 42,139,118,208,130,173,
-172, 81, 57, 11, 14, 97,178,219, 62,244, 61,205,252,178,114,199, 45, 46,187, 16, 48,141, 87, 69, 1,240, 73, 5, 53,198,128,102,
-121,140, 7,247,142,209,117,187,172,130,158, 92, 98, 10,235, 31,138,188,246,212,169, 79, 80,140,229,228,136,198,248, 67,222,155,
-139, 80,177,243,158, 89, 57,190, 21, 38,142,103,196,248,233, 52, 34,175, 86,139,231,109,140,193,110,187, 69,219,247,248,232,163,
- 31,225,252,229, 75, 9, 63,177,178,115, 20, 5,113,148,131, 45, 4, 77, 71, 27, 83,200,164,145,144, 78, 73,108,100, 10,164, 81,
- 44,168, 20,151,209,103,157,130, 91, 50,252, 69,191,158,201, 64, 31,163,187, 92,217, 51,203,110,222, 99,185,168,241,206,219, 15,
- 81, 87, 13,142,143,143,180,152, 25, 28, 31,159,160,114, 13, 66, 8,120,121,126,129, 47,190,248, 13,190,254,230, 27, 48, 51,154,
-166,201, 63,191,166,105,240,213,151, 95,225,227,143, 63,198, 15,127,248, 3,156, 95, 92, 96,179,109,177,219,237, 16, 6, 81, 52,
-123,245,110, 51, 51,186,110, 24,163, 42,121, 20,205,166,181, 67,178,197, 90,147,118,209, 36,120, 83,107, 21, 10,131,236,164, 16,
-132,171,116,246,139,166,193,114,181,202, 95, 3, 4,180,187, 14,125,223,143,136, 99, 34,212,117,173,233,109, 33,243, 0,124,136,
-185,240, 47,151,141, 62,158, 49, 63,253,248,228, 88,184,231,193,231, 16, 19,235, 68,125,239, 85,116,182, 90, 54,120,244,232, 93,
-212,205, 66,190,103, 74, 65,211,164,188,186,170,196, 62,103, 18, 4,135,114, 65,171,170, 90, 10,117, 93,203,251,195, 7, 84,206,
- 10,112,198, 85, 8, 94,186,223,244, 26,132, 24,113,179,105,113,118,118,134,174,221, 32, 50, 97,179,222,162,239,213,242,230,100,
- 45, 52,248, 65, 47, 71, 99, 65, 39,229, 22, 84,218,173,123,239,165, 56, 91,151,105,160, 49, 66, 25,249, 26, 13,173,206,135,148,
-183, 14, 64,105,120, 38,119,216, 82,247,210,251, 58,209,169,164,115,111, 42, 11,178, 85,190, 24,244, 67,212, 4, 54,153,209, 57,
-231, 48, 68, 18,252,171,238,183, 55,219, 30, 31,222,139,248,222,143,126,140,109, 88,193,240, 0,178, 54,139,241, 72,167, 49, 86,
- 11,102,239, 61,252, 32,159, 37,214,206,156, 1, 88,142,121,202,146,117, 57,234, 70, 72, 19, 97,167,224,154,132, 53, 78, 5,216,
-144,128,165, 77, 18,210,149, 13,151, 10,222,164,152,235, 36, 77,167, 26, 99,209, 55, 42,118,147, 40,239,224, 1,203, 62,243,254,
-153,173,234, 8,162,138, 94, 73,199,158,102, 2, 73,203,161, 93,100,242, 30,173, 76, 75, 49, 0,106, 3,108,172, 65,215, 54, 48,
-221, 45,128, 86, 46, 36, 7, 24,239, 99,222, 59,221,189,118,207,157,250, 15,222,251,164,221,237,224, 61,224, 35,101,117,116,161,
- 5, 47,144,164,210, 21, 71, 68,141, 98,165,137,176,107, 34,148,202, 5,219,100,251, 84, 26,217, 30,234,167,166, 67,121, 26, 47,
- 15, 84, 32, 97,203, 0, 16,140,211, 8, 42,174, 9,105,175,107,138,241,244,252, 18, 82,142,185, 9, 99,232, 60, 25,154, 6,157,
- 48, 35,218, 37,222,255,254, 91,248,193,241,128,203,107,143, 86,111,223, 38,231,167,143,217,240,114,171,228, 73,209, 99,230,130,
- 84,167, 57,200,179,194, 91, 98,108,115,119,170,244,181,252,193,214,167, 98, 96,242, 44,156, 80, 8,222,176,159,251, 78, 69, 54,
-248, 30,142,133,138, 81,125, 97,227,203, 2, 68,102,216,170, 65,211,212,232,118,187,194,148, 55,115, 3, 16, 79, 18,252,202, 36,
-183,233, 69, 16,185,227,176,147, 63, 61,155,209, 48,138, 75, 10,227,219, 54,234,188, 7,113,184,131,209, 80,218,233, 10, 33,104,
- 83,215,184,190,186, 2,217, 10,247, 78,142,243, 97,159, 32, 36,164, 42,226,116, 8,200,216,209,101,255,115,122, 29,125,162,143,
-233,107,209,104,151,220, 52, 77,222, 41,151,221, 37,149, 66,184, 4, 49,210, 49,103, 93, 85, 98,243,106,123, 44,151, 75,124,240,
-221, 15,112,188, 60, 65, 85,215, 88, 46,151, 26,138, 18,112,121,117,133,199,143, 31,227,235,199, 95,227,236,236, 12,187,221, 14,
-139,197, 98,114, 64,166,253,233,197,197, 5,142, 79, 78,240,235, 95,255, 26, 79,158, 62,149,247, 96,144,248,207,192, 33, 83, 0,
-147,151,222, 37, 66,155, 78, 10,162, 34,146, 89,147,180,178, 42, 60,237,154,149,187,158,129, 52,122,233,139,250,156,173, 53, 88,
- 52,114, 41,177,106,115,107,187, 1,187,237, 14,126,240, 89,189,158,198,151,125, 63, 20,121,243, 38, 79, 38, 56, 70, 60,124,248,
- 16,143,222,125, 23,187,237, 54,191,127,229,130, 83,161,107, 91,185, 64,177, 34, 73, 73, 4,121, 71, 71, 43, 60,124,248, 16,214,
-213, 42,212,227,124,137, 33,146, 11, 22,233,190, 60, 93, 20, 82, 94, 72, 26,227, 39,247,129, 49, 70, 17,181,185, 10,229, 16, 21,
- 31,162, 36, 44, 50,112,246,228, 25,214, 55, 87,226,114,104,123,189, 44, 71,120, 47,106,249,160,188,122,163,252,126, 14,227, 40,
-221, 57,155,167, 21,193, 7,212,206,193,213,117, 22,118, 69,198, 24,178, 99,164,128, 70,102, 5,235, 68, 52,206,201, 78, 55, 4,
- 84,214, 0, 70, 52, 11,115,145,107, 66,195, 6, 38,248, 48,160,182, 4,184, 10,125,223,131,216,139,248, 76, 49,169, 38,137,163,
-137, 65,214,161, 14, 61,254,248, 71,239,225,248,131,159, 34, 4,225,190,243,208,171,216,117,124, 76, 96, 17,225,129, 36, 49,210,
-247, 3,160,176, 45,104, 18,161, 53,114, 41, 36, 69,246, 90, 37,231, 25, 21, 94,114,233, 61,210,179, 54, 93, 58,131, 34, 92,229,
- 14, 97,243,247,207,118,233, 28, 25, 62, 10,133, 3,166,130,222,116,244, 68, 34,232, 66, 93,237,147, 26,131,171,157,150, 17, 37,
-174,118,234, 9,151,172,130, 78, 50,136,209, 72,198,123, 1,190, 33,229,179, 56,102,192, 68,220,178, 5,111, 33,187,245,164, 7,
-160,253,141, 36,205,132,216,135, 14,199,186,105, 96,191,255,254,187,159,108,119, 93,182, 15, 77,133, 85,133,149,173,128,194,210,
-100,103, 95, 48,215,139,223, 39, 36, 53,184,192,100,184,140,214, 44,136,244, 92,118,197,147,253,252,158,105,106,186,145,159,248,
- 96, 49, 97,187,231,168,212,201, 4,128, 38,235,219,210,220,111, 48,158,234, 60, 11,153,149,108, 65,143,139,219, 30, 91,175,111,
- 44, 76, 11,191, 8,112,144, 47, 9,102,130,209, 45,190, 94, 12, 57, 43,153,232, 64,107, 93, 68, 0,146,134, 91,112, 81,208, 99,
- 81,140,204, 65, 1, 0,105, 84,161, 88, 75,146,235,128, 38,105,105, 83,219, 96,249, 90,112, 33, 86, 51,198, 32,244, 29,214,155,
-141, 60,103,154,175, 38, 82, 17,166,252,184, 76,225,143, 31, 57,230,148,133,105,128,224,105, 87,206, 9,145,140,167,130,151, 52,
-117, 72, 16,163,111,223,156,243,183,110,228,231, 63, 6, 50, 6, 67,223,227,197,203, 23,248,243,255,229, 47, 64, 49,224,249,203,
-115, 44, 23,141, 48,205, 7, 63,249, 57, 89,141, 5,141,218, 81, 56, 91, 73,167, 20,163,142, 92,107, 57,240,245,114,214,247,131,
-140,139,125, 40, 62, 67, 18,103, 89,170,179,203, 75,117,226,140, 31, 29, 45,241,157,119, 30,161,239, 6,188, 56,127,129,139,171,
- 11, 60,126,252, 13, 30, 63, 62,195,215,223,124,141, 47,127,251, 91,188, 60,127,137,190, 23,133,117, 85,185, 59,239, 68, 85, 85,
-225,236,201, 19,252,139,159,252, 4,143, 30, 61,194,118,187, 83,194, 89,151, 5,111, 49, 6,144,205,138,147,204, 97, 79,194,223,
-164, 46,103, 48,130, 87,207,184,230,135, 39, 24, 14,244,128,102,229, 49,164,140,242, 90, 71,219,203,229, 10,174, 18,129, 89,223,
-123,244, 67,159,207,171,218, 9,203,188,109, 91,153,254, 41,134, 53,169,184,229,235,212,104,219, 22,239,189,251, 8,111,191,243,
- 16,219,205, 22, 94,109,123, 85, 85,163,235,123,161,208, 25, 85,196,235,193,251,224,254, 3, 52,205, 2, 94,113,164,233, 83, 61,
-106, 56, 20,148,163, 74,109,102, 9,219,112,206, 96,217, 44, 80,213,181,138, 28, 67, 94,127, 5,150,173,106, 8, 41,247, 61,157,
-189, 6, 47, 94, 94,224,246,250, 34,163,121,119,187, 45,186,190, 19,129,161,174, 28,140,238,235, 7,175, 93,177, 2,124,164,184,
-169,189, 81,113,183,172, 59,112,103, 45,188,106, 54,130,174, 39, 82,225, 76, 22, 67,103, 12,156,238,180,115,228,106, 10,205,226,
-241,148, 44,199,227,172,170,242, 0, 82,177, 24, 52,106, 84,118,203,136,178,210,136, 68,240,131,199,110, 96,252,240,212,227, 15,
-255,244,143,113, 25,223, 69,220, 93,101,193,164, 80, 0, 45,154,218,129, 77, 45,116,187,224,197, 9, 1, 66, 31, 25,125,215, 1,
-236,179,184, 50,198, 88,216,130, 85,252,166,113,166, 33, 74, 46,186, 83,193, 27, 24,133, 85, 87,166, 7, 80,198, 73,130, 59,165,
- 78,123,156,224,210, 94,238, 68,234,192, 83, 19,104, 13,178,205, 13,202,152,207, 12,125, 50, 9,114,174,235, 38,221,235, 35, 33,
-121, 53,198,149,121,156, 26, 16, 77,113,218, 48, 88, 16, 99, 87, 49,118,126, 5,187,219, 1,216, 20,235,131,153,166, 44, 87,216,
- 89,183, 52, 47,234, 31,127,248,222, 39,126,167,182,156,136,140,130,205, 79,129,202, 17, 57,229,240,149, 18, 62, 51,229,158, 97,
-210,217,115,177,216,156, 0, 90,120,127, 76, 61,247,126,207, 11,158, 57, 40,116,163,137, 16,111,174,135, 99, 42,199,192, 52,118,
-247,133, 86,224,144,178, 47,249,205,137, 3,118,219, 14,189,167, 73,208,196,212,125, 53,238,241, 73,197, 84,229,149,194, 76, 68,
-100,211,177, 51,205, 46, 49,163, 72, 78,136, 80,194,114,103,172,154, 6,239, 52,192,122, 59,160, 39,139, 74, 49,124,165, 48, 49,
-119, 54, 58,199,183,105, 92, 88,172, 25,120,226, 17,167, 61,157,218,232, 79,167, 73,140, 40, 10, 65, 80, 74, 63, 42,215, 27, 25,
- 79, 75,229,244,102,156,159,164, 15,205,189, 85,141,198, 25,172,251, 97, 98,253,200,156,130, 34,221,109, 46,164,255,239, 41,226,
-119,237,163,104,126, 73, 1,112,187,190,197,175,254,135,255, 17,255,199,191,249, 63, 49,244, 45, 46,207,207, 85,184, 20,101, 92,
- 24, 21,195, 99,147,236,141, 52,216,102,244, 59, 28, 47, 87, 66, 20,243, 1,117,189,192, 7,191,247,123, 88,175, 55,216,172, 55,
-210,149,131, 50, 13, 77,176,200,210,129,120,181,138,149,211,175, 16, 2, 22,139, 5,250,174,197,167,159,254, 35, 62,251,205,103,
- 56, 59,123,140,103,207,158,226,197,139, 23,184, 82, 34,153,181, 50,162, 77,158,244, 87,253,227,156,195,243,103,207,112,122,122,
-138, 95,252,226, 23, 56,191,184,128, 15, 1, 93,219,229,142,213, 7, 25,119, 19, 40,135,154, 64, 59,103, 25,171,199,156,170,198,
-170,102, 15,106,249,147,201, 5,103, 49,150, 81,228, 39, 0, 44, 22, 77, 46,254, 85,221,128, 35, 48, 12,189,130, 84,162, 22, 20,
- 66, 85,215,153,230, 54,215,115,196, 24,179, 87,124, 24, 58, 84,149,195, 91,111,189,141,200,140,203,203, 75, 88, 99,176, 92, 30,
-161,237, 4,193,106, 20, 89,219,247, 3, 44, 17,238,221, 59,133,117,213, 68,112, 87, 57,135,166,110, 70,212,173, 34, 89, 13,141,
- 42,249,204, 14, 80,177, 95, 12,162,119,136, 42, 74, 75,151,100, 99,100, 85,195,145,177,222,108,113,113,241, 18,126, 16, 29,198,
-102,187,193,102,189, 22, 97,163, 18, 4, 99, 10,246, 81, 49, 22, 41,207, 94, 18,237, 70, 59,160, 37,201,124,143, 10, 35,178,206,
- 41, 69,206,103,239,127, 26, 3, 39,197,121,229,170, 81, 24,168, 59,107,131,145, 66,152, 10,159,213, 12,122,112, 74,210,171,132,
-165,209,247,168,172, 16,232,134, 32, 84,183,170,170,148,149, 32,105,146,188,190,197,191,249,179, 15,241,246, 47,254, 26, 87,231,
- 91,112,104,213, 61, 0, 88,226,188, 87, 39, 43, 22, 73, 89, 53, 68,244,189,228,211, 7, 47,221,108,122,109,179,101,173,116, 80,
-145,198,168,199, 0, 71,156,173,101,146,216,106, 96,152,213, 46, 55,126, 14,211, 74, 76,144,253,162, 13, 17,192, 78,186,196,164,
- 11, 43,143,255, 78, 58, 49,135,129,101,117,184,100,164, 87, 58,227,161, 32, 37,217,165, 91,245,249, 50,153, 61,241,184, 85,207,
-112,208, 28,118, 1,233, 72, 84,177, 3, 80, 87,192,181,181,136,219, 26,166,191, 2, 76,200,237, 52,237,237, 85, 15,103, 79,150,
- 59,117, 3,150, 55, 22, 71, 25, 91,148, 9, 93,166,176,122,217, 44, 48,145,255, 11,197, 94, 54,203,225,120,204,101,231, 4,182,
-215, 95,143,106, 9, 73,183, 42,166,177, 83,207, 32, 25,198,164, 28,140,106,108,206,132, 55,222, 51,191,201,223, 45,153, 36,121,
-220, 59,185,177,162,160, 36,209,172,101,139,152,178,254,167,212,114,231,172, 4, 26, 96, 28,233,199, 20,247, 7,181, 58, 20,109,
-116,136, 5,112, 69,159,161, 35,154, 16,226,114,147, 90, 60,190, 57,148,167,252,245,206, 71, 52,247, 30,224, 47,126,244, 16, 31,
-214, 17, 67, 28,127, 22,227, 24,125,180,105,177, 30,174, 84, 48,225,153,247, 6,255,147, 95,167, 66,140, 23,213,167, 89, 22,109,
- 83,172, 49, 70,189, 65, 49, 65,137,242, 1, 26,163,115,227,148,120, 68,192, 77, 59,224,229,174,211,177, 93,162,237, 21, 23,147,
-137, 0,143,222, 8,251,250,173,186,249,217,227,225,217, 77, 48, 42,231,252,143,254,228,231, 96, 4, 12, 33,226,195,239,127,136,
-213,114,161, 59,215,132, 54, 21,219,144,188,125, 68, 92, 22, 6, 73,199, 90, 54,141,196,176, 14, 3,156,149, 61,235,131, 7, 15,
-176, 90, 46, 81,185, 10, 70, 81,173, 2,147,209, 80, 23,189, 33,167, 56, 93,232,141,159, 8,168,107, 81,186,127,253,213,151,184,
-184,188,144,247, 83, 85,201,248,125,181,194,106,181, 68, 93,213,122, 89, 56,120,129,223,123, 13, 34, 51, 78, 79, 79,241,183,127,
-251, 31,240,228,201, 83,156,158,156, 8,179,124,185, 28, 19,174, 72,210,187,136, 8, 77, 93,195, 89,139,218, 85, 50, 30, 14, 42,
-194,212,247,128,117, 38, 83,193, 72,117, 36, 70, 59,142, 52, 85,114, 78,199,212,170,214,190, 60,193, 0, 0, 32, 0, 73, 68, 65,
- 84,100,142, 33, 34, 12,131,218,214, 12,154,166, 82,219, 91, 68, 93, 73,177,234,251, 62,139,189,164,155,180, 8, 1,186, 18, 25,
-208,245, 45, 92, 85,225,233,179,231,120,241, 76,158,135,117, 21,252,224, 81,169,234,158,244,178,221,182, 45,252, 48,224,244,244,
- 20,203,229, 42, 79,250,130,234, 35, 68,119, 32, 5,214, 90,147, 19,230,114, 65, 55, 70,231,112, 69, 98,158,230,170, 47, 22,141,
-128,158, 18,189,206,138,115,226,229,249, 57,206, 47, 94,130, 99, 68, 12,140,245,122,131,118,215,102, 43,134,104, 15,164,240,198,
- 40, 29,119,226, 30, 88,253, 58, 80,167,129, 85,161,159,164,212, 73,247,222, 15, 3, 98,240,249,114,149, 41, 34, 42,252,114,233,
-162,161,184,222, 24,163, 52, 11,218,249,155,108, 17, 35, 12, 67, 16,117,119, 41,224,209,206, 53,157, 7,204,242, 25,136, 26,188,
- 19, 35,163, 50,192,206,212,248,252,203,231,120,187,106,113,242,240, 93,172,150, 75,212,205, 50,175, 39, 36, 20, 72, 24, 2, 85,
-229, 80, 85,181,192,145, 92,165,137,117,242, 24, 19,203,131,117, 87,158,184, 0, 32, 11,195,140,218,137,250,223,186, 74, 41,133,
- 70,138, 59, 25, 9,121,137,138,131, 85,155, 91,250,186,242, 51,147,247,140,247, 3,134, 65,254, 63,135,144,227,176, 70,162, 40,
-161,148,128, 91,102,144, 5,130, 22,246, 68,224, 19,203,186,145, 28,120,162, 60,201,142,145,244, 28,140, 57, 4, 76,133,251,242,
-235, 49,130,163, 84,199, 30,140,147,200,248,206,209,128,248,240, 20,236,190, 3, 40,199,127,234, 54, 42,237,234,229,194,121,127,
-133,105, 63,250,224,209, 39,109,219,107,184,251, 84,185,157, 71, 21, 52, 38,144,229,155, 96,161,152,206,137,101, 51,176, 8,229,
- 41,187,201,221,236,168, 42, 47, 96, 45, 57,254,110,252,122,243, 35,157,243, 86,151,114, 91, 75,135,250, 47,154, 2,107, 80,126,
-205,100, 59, 43,118,239, 84,248,201,185,192, 94,142, 48,151,113,100, 98, 10,156,236, 92,224,149,114,216,179,192,189,244,217, 23,
-107,130, 88, 22, 68,236,131,104,230,234, 2,104, 23, 7, 63,224,233, 54,226,193,187, 15,241,190, 29,112,118,221, 35, 26, 26,247,
- 60, 41,122, 53, 33, 30,139, 31,183,161,241, 66,147, 14,126,240,126, 51, 87, 54,190,113, 79, 88,198, 19, 85,186, 81, 14, 53, 51,
-207, 60,139,188,111,197,160, 98,140,172, 15,212,166,231, 62,210, 77, 71,238,124,161,214,167, 3,157, 57, 21,174,133,223,165, 67,
-103,236,183,231,133, 57, 18,126, 24,224,234, 5, 62,252,254, 7,184, 56,127,137,118,215, 97,232,122, 57,252, 45,101,178,151,213,
-177,172,115,162,242, 94, 52, 13,238,159,158,162,105, 22,176,206,225,104,121,140,186,174,113,113,113,142,207, 63,255, 28,100, 44,
- 78, 78,100,215, 43, 29,176,230, 84, 39, 22, 66,145, 72,134,130,168,119,255,254, 61, 60,121,252, 24, 23, 23,231, 88, 44,151,133,
- 93,134, 14,174, 16, 14,128, 16, 15,254,160,235,186,198,211,103,207,112,114,114,130,159,255,252,231,184,184,184,192,224, 61,186,
-182,205,172,247, 48,248, 12,199,145,168, 82, 89,239,164, 11,163,216,236, 18,147,221,170, 19, 32,100, 62, 64, 10,250, 72,115, 43,
- 17,186,169, 23, 62, 74, 23,190, 80,172, 43,171,128, 73,252,224, 6,219, 93,139, 97, 24,242, 4,209, 24,163, 42,194,152,187, 48,
-105,182, 4,200,115,124,124,132,197, 98,133,203,203, 75,112, 8,120,251,225, 67, 1,213, 12, 67,118, 36, 84,206,226,221, 71,143,
- 96, 92,149, 65, 55, 64, 68,173,106,249,224, 61, 42,107, 97, 43, 7,231, 42, 21, 62,202,186, 66,246,219,148,139,112, 58, 63,162,
-254, 28, 43,107,177, 88, 52,232, 7,209, 55,172,215,183,216,110,214,224, 16,209,117, 61,218, 93,139,161,239,209,171,101, 80, 44,
-141, 94,127,238,148, 5,170,100, 36,173,175,170,170,241,115, 81,112, 13,162,166, 48, 70,133, 26, 9, 5, 47,102, 49, 85, 34,247,
-213,106, 73, 75,239,173, 68,167,148, 75,101,157, 93, 22,169, 57, 75,160,151,170,178,106,243, 10,185,192,203,100, 64, 20,254,198,
- 42, 26,150,165,192, 53,206,224, 50, 46,241,127,253,223,255, 9,191, 60,253, 2,191,255,175,254, 26,103, 47, 6, 96, 88,231,239,
-111,245, 57, 89,107, 17, 64,232,123,175,133,213,131,131,151,247, 21, 35,175, 15, 69, 55, 23, 50,219,195,164,179,206, 90, 97,224,
-235,197, 36,194, 72,198,122, 12,217,103,110, 72,210, 39,105, 50,241, 43,128,101, 70,214,130,134, 35,200,112,206,100, 79,171,176,
- 34, 37,123,156,216,106,242, 91,240,105,244, 47,152, 94, 67,106, 67, 84,237,152, 73,122, 46,155,138,128, 41, 86,217,156,137,152,
-166, 92,106, 71,224,190,141,216, 44, 9,155,225, 62,236,102, 11,166, 53, 64, 14,135, 54,231,147,226, 78,211, 74, 89, 55, 13,236,
- 71, 31,188,247, 73,219,118,121,207, 18,181, 8, 19,166, 35,111, 46,110, 6,163,200, 95, 21,231, 19,162, 92,178,159,205,110, 24,
-179, 29,110,182,143,229, 49,136,201, 80,155, 52,138, 53, 7,198,164,163,238,107, 74,136, 59, 92,216,203,196,176,113,199, 79, 92,
-118,134,132, 67, 8, 59, 58, 96,155,102, 26,187, 72,179, 55,238,159, 49,230,169, 28,214, 72,138, 27,102,197,148, 39, 33, 38,148,
- 89,197, 99,224,202,168,221, 38, 99,224, 66,135,175,158,223,226, 89,207,154, 28, 87,140,245,205,204,183,142, 2,231,155,189,231,
-152,230,161, 31, 56,245,121,246, 26,242,108,173,194,115, 55,120, 26, 59,149,247, 40, 42,199,234, 92, 98,233,212,122, 82, 22, 84,
- 42, 10,246, 8, 26, 38,218,215, 64,148,143,247,119, 46,236,124,160,147,157,125,137,170,174,241,207,159,126,138,123,247,223,194,
-123,143,222,193,217,227,199,184,185, 93, 35,248,168,135,187,140,175,211,104,116,185, 92,226,104,117,132,251,247,238,193, 26,135,
-231, 47,207,113,113,121,129, 39, 79,206,240,245,215, 95,227,233,211, 51, 92, 94, 94,226,250,230, 10,235,219, 91, 69,181,174,112,
-124,114,146, 59, 25, 81,207,138, 8, 45,249,204,125,240,120,240,224, 1,214,183,183,248,237, 23,159,139,250,249,128,192,148,103,
-207,137, 95, 51,169, 40, 95, 79, 34,194,217,217, 25,126,246, 71, 63,195,233,233, 61,172,111,215,232,186, 14,219,205, 46,123,233,
-189,238,141,173, 66,112, 66,224,137,184, 50,123,163, 73,216,236,146, 25, 95,229,247,137, 81,104,138,104, 37, 68,153,221, 52, 53,
- 12, 89,116,125,175,226,189, 74, 73,105, 42, 34,212,113,127,204,161, 49,177, 32, 80,154,172,150, 21,123, 98,196,106,185,192,195,
-183,223,193,242,104, 5,223,123, 92, 95, 95, 97,177, 88,194,185, 10,219,237, 38,119,185, 71,171, 21, 78, 78, 79,117,236, 45,193,
- 54,137, 59, 15,142,217, 30,150,198,181,206, 24, 44,151, 11, 25,167,171,111,190,174,235,124, 57,241,106,233, 51, 68,168,106, 7,
-178, 14,183,183,107,108,214, 55,138, 51, 21,246,124,187,107,209,117, 29,218,174,205,103,104, 44, 96, 79,137,152,151,244, 14,117,
- 37,138,126,171, 23, 9,185, 68, 37, 44,176, 8,122,201, 90,180,109,139,138, 0,178,174,176,164, 34,159, 25, 33,253,123,194, 69,
-235, 36, 40,101, 65,248, 32, 93,163, 92,208, 40, 11,243,160,171, 32,240, 8,247, 50, 36, 59,230,146,116,103,228,195,128,203,235,
- 45,206,158,159,227,171,255,246, 95,241,103,127,120, 10,126,255, 87,184,120,114, 6,239, 7,132, 97, 64,101, 5, 48,100,157, 20,
- 64, 31, 34,250, 97, 64,223,246,224,232,243,212, 39, 93, 44,242,120,220, 72,209,182,196,136,100,243, 36, 48,167,248, 97,220,161,
-151,197, 46,219,176, 83, 34, 93, 18,178,209,120, 62, 59, 35,116,184, 62, 90,144,247, 48, 38,200, 74,161,248,124, 68,150, 75,188,
- 37,150,252, 3, 99, 17, 34,193,241,160,154, 3, 43,153,173, 20,199,216,112, 83, 84,172, 12,223, 26, 11,175, 73, 12, 18,213, 36,
-249, 24,177,136,140,227, 69,192,229, 98, 1,191,187, 7,219, 93, 0,102, 56,236, 93,191, 99,151,200,201,210,246,241,247,164, 83,
- 23,182,176,201, 74,109,123, 0, 28, 51, 22,247,132,135, 68,238,200,137, 32, 59, 92,140, 29,249,254,150,123,191,179,224, 61, 58,
-218,156, 38, 55, 45,156, 6,251,187,239,195,222,100, 51,235,230,199,113,191, 41, 11, 86, 33,142, 51, 52,165,175,149,170,249, 60,
-138, 46, 71,156, 37, 65,141,138,208,149, 12, 58, 41, 10, 59,141, 63,204, 67,227,224,185,211, 32, 97, 74, 38, 59,111,178,168, 72,
- 19,179,178, 96,143,139, 11, 1,221,125,168, 39, 53, 60,237,191,166,184,227, 53, 44,133,136,211,230,118, 86,218,103, 2, 16,154,
-203,203,231,237, 35, 79, 97, 54,129,199, 96,141, 66, 93,148, 61,166, 18,187,233,117, 12,247,223,151,234,114,144, 49,176, 71,160,
- 51,224,224,241,248,236, 9,222,127,255, 3, 12, 93,139,155,219,117, 86, 33, 87, 85, 5,231, 28, 78,142, 79,113,239,244, 62,200,
- 24,172,215,107,252,230,139,223,224,159, 62,251, 20,223, 60,254, 26, 47, 95,190,196,250,118,141,126,232, 85,177, 75,232,251, 30,
-183, 55, 55,184,186,186,196,245,245, 21, 54,155, 53,188,247,104,154, 5,142,142,142, 80, 87, 85,246, 52,135, 16,240,246, 91, 15,
- 17, 67,192, 63,252,215,255, 34,118, 45, 5,183,220,241,146,190,118, 85,145,179,165,203, 29, 92, 93,227,249,243,231,168, 92,133,
- 95,253,234, 79,113,115,115,141,109,219, 9,229, 43, 9,175, 34,103, 8, 81, 58,232,141, 49, 19,108,108,226,192, 7, 29, 75, 87,
-105,119,170, 63,201,152,164,227, 49,141,157,173, 42,162,229,242, 66, 96, 44,154,101,110, 20, 82,103, 29,124,208, 46, 78, 30,195,
-152, 16, 55, 94,234,141, 70,141,222,127,240, 0, 71, 71,199,216,108,183,184,186,190, 70,211,212,168,155, 6,125,215, 74, 78,125,
-136,120,251,173,183, 80,213,141,130, 86, 40,239,143,211, 20, 38,117,186, 73,189, 47, 17,174, 62, 59, 19, 42,237,224,219,174, 87,
-107,153, 92,194, 22,203, 37,186,193,227,252,226, 2,221,110, 43,170,246, 16,208, 15, 30,125,219,129, 99, 64,239, 61,134,174,147,
-125,173, 90,184,156,138, 70, 41,199, 9, 3,174,178, 10,151,161,188, 94, 75,150,188,228,187, 33, 99,176,237,122,248,174, 69, 93,
- 59,176, 49,210,229,107, 1,119, 58, 22, 14,154,192,150,200,134, 6, 2,124, 1,139, 94, 66, 68,103, 34, 94,180,214,130,181,208,
-203,206,221,142, 57,246,121, 95, 45,190,112,103, 12,140,179,168,157,193, 54,214,120,122,246, 2,199,124,133,207, 46, 43,216, 39,
-255, 31,254,242, 47,255, 4,207,233,135,232, 46,207, 68,220, 72, 12, 91, 57, 84,214,194,213, 53, 6,182,216,238,122, 12,109,139,
-224, 7,141,160,142, 48,136,218, 73,143, 76,141,196,195, 71,234,118, 11,248, 76,154, 90,229, 40,212,217,231,188,140,230,206, 21,
- 76,245,207, 2,149, 49, 51, 79, 59, 70,132, 46,171,197, 56,217,117, 33,148, 61,214, 95,116,196,136,198,202,123,145, 99,238, 24,
- 56, 53,172, 44, 73,165, 73,100,156,166, 3,169, 17, 34,178,153,220,234,153,112, 15, 64, 92, 6, 92,210, 61,152, 53, 64,254, 92,
- 51,215, 15,147,230, 48, 59,199, 9,132,186,169, 97,127,248,123,239,125,210,247, 93,174,100,113,175, 99,163,169,101, 42,191,152,
-152,174,242,139,130, 56,231,137,196,212,253, 38, 70, 57,205, 75, 26,101,112, 9, 49,205,192, 57,101,120,202, 84,156, 86,142,204,
-233,192,120,162,188, 29,205,117,117,124, 64, 80,151,113,190,147, 75,195,200,238,133,122,167,247, 10, 33, 77,249,105,229,101,128,
-139, 67, 55, 98,218,105,230,164,174,242, 37,204, 66,196,233, 52, 33,103,220,155,169,106, 19,234, 11,143, 41,184,128,202, 9, 6,
-231,177,229,152,165, 50, 93, 93,240, 28,180,243,170,130,144,109,130,233,177,242,100,100,207,133, 39, 84,188,217,179,206, 61, 79,
- 95,104,178,219,141,197,139, 68, 5,254,141, 33,222,219,163,163, 35,156, 30, 47,177,107,219, 60,101,249,182,149,156,103,194,187,
-169,180, 98,140,219, 69, 33, 56,185,186,186,192,203,243,115, 60,124,231, 29,172, 86, 43, 52,106, 73, 91, 52, 75, 44, 22, 43,180,
- 93,135, 47,191,254, 18, 95,252,246, 11,124,249,213,111,113,126,126, 14,239, 7, 84, 85,133,202, 85,186, 67,116,249,155,217,188,
- 87,116, 24,134, 30,215, 87,151,184,186,188,192,213,213, 37, 54,219, 53, 34, 51, 22,203, 5, 6, 47, 2,163,161, 31,240, 15,255,
-240,119,216,237,118,104,116, 79,127,215, 45,133, 14,195, 18,247, 46,118,124, 0, 90, 81, 85, 21,190,250,242, 75,252,224, 7, 63,
-192,195,119,222,198,237,205, 45, 78, 78, 79,176,107,119,216,109,219,169, 20,135, 19,148,100,100,251,139,182, 96,100,136,167,233,
-140,181, 70,126, 47, 89,128,136,100, 23,175,129, 47, 86, 61,225, 73, 11, 82, 57, 39, 35,213, 52, 94,143, 17, 67, 63, 32, 66,236,
-104, 9,184,228,117, 44,156,246,159,117, 93, 97,209, 44,208,118, 61,110,110, 55,184,185,189, 70,244, 17, 77, 85,225,232,104,133,
-182,237, 48, 12, 3,150,139, 26, 15,222,122, 75,173, 85,114,216, 46,151, 11, 24,107, 53,151,158,116,148,171, 89,244,214,100,152,
-144,213,221,121,100, 73,191,227,200,130,230, 93, 52,176, 85,133,245,102,135,139,151,231,216,237, 54,138,178, 21, 65,218, 86,189,
-255, 62,120,197,165,170, 67, 69,221, 17,146, 33, 16,224,131,151,136,217, 74,118,197,198, 58,228,189,131,238,244,211, 89, 97,201,
-160, 29, 2,218,237, 22,206,161, 72, 31, 99, 29,179, 71,201, 0,136, 0,179, 40,241, 37,128, 45,228,233,138, 33,249,185,167, 51,
-222, 89,161,190,181,157, 7,180,115, 54, 42, 34,140,105, 40,109,148,178,102, 13,152,101, 95,221, 52, 13,158,173, 35, 46,159,124,
-131,138, 91,212, 71, 71,248,187,223, 92,225,167,199, 79,241,147,127,245, 87,120,252, 50,194,244, 55, 42, 48, 52,168,107, 11,114,
- 53,250, 8,220,110, 58,180,155, 53, 98,232,229,185,234, 10, 32, 42, 16, 39, 17,253, 28, 1,209,168, 25, 95, 71,231, 73,153,110,
-212, 93, 65,214,192,144, 69,229,128, 64, 85,206, 79, 15, 0,140,134,221, 8,102, 86,186, 99, 67, 12, 38, 39,197, 73, 47,139,148,
-237,165,197, 10,152,120, 2,255, 33, 22, 87,192, 0, 11,246, 12, 75, 30,100, 92,138,186, 43, 34,183, 49,186,192, 76,154, 24,152,
- 49, 1,115, 90, 64, 16,212,206,123, 68, 17,183, 53,163,237, 78, 97,183,183, 32,218, 74,230,250, 29, 57,171, 60,171,184, 82,212,
- 63,120,244, 73,183,235, 17, 2,193,207,207, 10,125,112, 86,187,112, 20,105, 93,169,139,179,197, 8,112,204, 77,199, 4, 13,202,
-123,244, 48, 2,221,161, 67,102,226,189, 96, 23, 46,130,101,128,105,183, 61,245,157, 23, 32,253,194, 76,198, 52,159, 14,148,154,
- 1,168,223,190,188,109, 76,247,239,156, 85,145, 52, 27, 73,207,208,178, 5,252,166,124,158,165,112, 49,149,215,136, 41,247,158,
-230,221,242,100,133, 64,147,113,189, 49, 52,129, 42, 16, 97,162,122,205,136,213, 50, 52,133, 74,244,207,184,235, 63,188,175, 17,
-244,235, 62, 73,117, 54,137, 56, 48, 23, 32, 46,231, 14, 52,209, 28, 48,128, 74,215, 4, 67,142,104,228,233,243,167,105, 51,190,
-107,183,248,254,199,127,128, 31,127,252, 3,124,245,197,231,136, 48,121,207,246,173,148,113, 37,168,175,116, 85,206, 49,189, 52,
- 18,209,154,197, 2, 23, 23, 23, 56,123,114,134,237, 86, 60,197, 12,194,245,205, 53,126,243,197,231,248,244,179, 79,113,246,228,
- 12,187,118, 7,107,173,142,101,221,204, 66, 74, 88, 45,151, 96, 78,153,228, 35,187,221, 85,149,168,151,135, 1, 55, 55,215,184,
-188, 56,199,203,231,207,113,126,113,142,171,139,115,124,253,245,111, 49, 12, 61,154,102,161, 54,179, 3,245,156,238,240,224,191,
- 18,198, 51,253,236, 56,231,112,123,123,139,203,171,107,252,252, 79,126, 14, 70,196,197,197, 21,174,174,174,115,129, 45,111,236,
- 82, 36, 66, 46,234,172, 1, 50, 41, 17,142,149,166,231,156,205, 23,189,100,107, 74,244, 61, 73, 60, 83, 56,139,118,132,131,151,
- 76,244,190,151,160, 28,231, 36,138, 53, 79,141,162, 20,148, 52,146,119,149,131,181, 14,139,166, 70,179, 88, 96,187,221,224,246,
-230, 90,124,217, 77,141,197,162,134,177, 78,237, 98,140,119, 30, 61, 66,211, 44, 68,245, 29, 34,156, 37,212, 77,131,200, 82,196,
- 83,104, 78, 83,139, 29,144, 33,221, 58,171,170,191,169, 43, 13,120,145,130, 44,159,127, 73,214, 59,127,121,142,190, 19,159,252,
-224,133,136,215,118, 3,118,187, 22,155,205, 6, 93, 43, 42,124,161,151, 89, 29,163,203,197, 36, 68, 81,129, 87,214,194, 85,117,
-126, 79, 86,117,149,181, 71, 80, 53,189,209,105,104,223,117,112,102,228,223, 15,131, 87, 49,171, 81,203,159,136,232, 42, 55, 10,
-254,132, 81, 31, 51,229, 47,157, 25,253, 32, 59,121,137, 0, 15,250,117,144, 29, 3, 46, 77, 13,184, 8,140, 81,114,100,103, 44,
-206,158, 94,193, 95,157,193, 84, 14,181, 33,172,177,196, 55,159,126,138,127,253, 39,167,224,247,255, 37,118,231, 79,101,204,237,
- 25, 6, 30,206, 89,248,104,176,222,118,216,221,222, 2,161,203,107,130,164,112, 79,246,214,228,136,177,202,133, 48,218, 62, 19,
-138, 96,158,204, 52,129, 8, 45,141,203,232, 88, 73, 87,139, 57,228,199, 88, 97, 12, 68, 21, 28,178,170,208,193, 34,214, 19, 27,
-190,153,106,187,210, 42, 64,250,110, 41,236, 36, 35,125, 10, 17,108,130, 8,249, 82,168, 19,132, 6,137,188, 10,136, 89,251, 65,
-229, 90, 86, 95,103,210, 61,191,103,194, 42, 2,166,242,184,180, 11, 96, 83, 1,195,121, 82,254,189,150, 52,151,199,239, 31,190,
-175, 66,185,172, 36,151,234, 19,114, 20, 43,246,108,104,172,217,207,115,223,114,217, 1, 71,154,118,155,148,177,173,249, 86,144,
- 21,226, 37,201,141,139, 48, 24,162,185,254,111, 90, 96,112,240, 48,147,189,208,202, 24,221, 99,115,246, 74, 27,218, 31, 95,228,
-132,181,121,167, 61, 43,178, 84,192,229,203,209,187, 33,236, 45,203, 71, 81, 93,122,189,104, 70, 85, 43, 58,195,244,186, 48, 50,
- 52, 71,185, 51,123,129, 52,121, 39,150,119, 92,242,198,136, 60,130,112, 38,126,247, 61,101, 36,237,101,173,240, 29,197,157,247,
-113, 53,123,251,109, 42, 43,203, 30, 62,103,204,134,159,112,248,213, 2, 99, 74,112, 78,202,226,158, 12,205,180,224, 88,135,237,
-118,141,103,207, 94, 40,110,213,252, 78,222,181,156,207, 83,254,236,153, 95,123, 27,168,235, 10,193, 15,184,188,188,192,139,151,
- 47,240,236,249, 83,156,233,142, 60,117,244, 9, 78, 50,231, 59,141,145,152, 70,242,166,231, 84,190, 98, 42,224, 84, 65, 27, 66,
-128,247,157, 88,175,140,116,110, 99, 97,221,239,206,185,216,218,188,234,170, 19,239,176,239,165,255, 94, 46, 22,248,234,171,175,
-176, 90, 29,225,199, 63,249, 9,190,249,230, 27,116, 93, 43, 62,109, 40,132, 38,137,177,244,242,216,123,175, 5, 90, 68,116,201,
- 31, 29,162,207,201,112,233,155,141,246, 51, 25,223, 87,181,131,173, 68,112,149,108,101, 33, 4,196, 16,177,219,237, 16,189,151,
- 11,143,218,217,140,138,209, 70,238,130,102,160, 87, 14,171,213, 50,175,184, 86,171, 37, 42,167,191, 70,132,229, 66, 66, 90,142,
-143,143,241,224,193,219,168, 84, 11, 17, 35, 75,209,100,233,156, 43, 87,101, 16,144,179,226,175,174, 43,201,201,102,181,232, 37,
- 24,143, 49,163,103,223,135,136,155,219, 53,218,221, 6, 78,211,219,140,174, 41,118,219,173,138,227,186,252,218,164, 8,101,163,
-194, 53, 25,251, 27, 61,183,237, 36, 61, 77,154, 99,171,124,132,144, 41,114,221, 16,208,119, 59, 88,167, 9,100,198,170,229, 50,
-192, 57, 81,241, 71, 16,134, 32, 81,171,198,184, 44,228, 35,235,178,178, 62, 9, 18, 51,164, 70,211,238,172, 33,212,149, 67,132,
- 68,209, 58,107,114, 88,132, 80, 18,117,100, 95, 59, 60, 95, 51, 46,206, 30,195,241, 26,100,132,209,176,106, 12, 62, 59, 55, 88,
-188,252,123,252,213,191,254, 5,158,154,143,112,243,242, 41,216,239, 36, 75,192, 48, 60, 12,182,219, 30,221,110,135,224,123, 25,
-243,235,238, 58,217,222,108,122, 95, 48,129, 67,144,100, 58,213, 39, 57,231, 16, 52,123,157,195,152, 29, 31,153, 96,120,180, 48,
-202,215, 32,144, 85, 2, 93, 20,251, 90, 36, 51,138,253, 16, 71,187,162, 25, 83, 9,161, 66, 64, 76, 88,112,105, 61,205, 32, 75,
- 8,112,162,142, 55, 44,206,136, 66,147,149, 70,252, 12,245,157,231,244, 56, 32,210,184,139, 79, 53, 47, 0,176,145,112,108, 2,
-214, 13, 99,235,239,193,110,118, 0, 95, 75,183,254, 6,189, 75,211, 52,176, 63,252,222,187,159,116, 93,159,173, 80,113, 6,109,
- 25,125,232,194,114, 79,157,115,156, 88,225,167, 65, 47, 99,103, 54,237, 40, 81, 28,240,229,222,149, 38, 93, 97, 25,247,202,179,
-145,126,217,114,239,247,152,196, 17,145, 42,216,166,198, 59, 21,195, 6,198, 78,199,255,134, 15,116,158,229, 1, 60, 3,222,204,
- 41,118,121, 87, 82,196,146, 16,141,143, 41,239,233,153,246,124,251, 84,132,214,100, 34,122, 94, 87,140, 2, 57, 91,142,169, 13,
-129,253,128,155,157, 7,172,133, 51,156, 71,142, 25, 53, 72, 69,170, 94,217,137,205,224, 37, 40, 71,203,119,220,240, 38, 43, 3,
- 85,215,210, 1, 33, 26, 29,184, 68, 77,126, 30, 60, 37,216, 81,209,253,115,226,158,207,174,156,204, 50, 74,107,148,144,197,179,
-253,246,208,183,216,238,118,154, 16,246,122, 0,205, 94,225, 44, 11, 59, 24,111, 98,111, 47, 61, 14,148,186,106,181,178, 9, 27,
-189,206, 10,230, 59, 63, 97,250,141,164,139, 58, 44,234,227,153, 78,193,104,231,149,189,230,135, 30,236, 44, 54,160, 92,221, 28,
-170,236,204,123,242,198,253,159,165,162, 50,191,248,226, 11,188,243,240, 33,222,122,240, 0,237,110,135,161, 31,176,221,182,232,
-251, 30,174,114,153,156,102,173,236,109,193, 17,174, 18, 44,106, 55, 12,233,100, 29,225, 67, 80, 66, 26, 72,195, 68,164,219,174,
-154, 70, 71,178,233,240,148, 3, 58, 38, 27,166,106, 41,188,118,189,201,219,159, 94, 53,107, 44,150,171,133, 88,249, 82, 20, 38,
- 67, 11,250, 2,171,163, 35,132, 16,112,122,114,130,247,190,243, 30, 8, 22,214, 73, 42, 92,208, 0,148,213,234, 88,188,203,131,
-207,132,184,196,103,144, 41,130,211,139,168,162, 84, 35, 52, 66, 87,158,230,224, 35,110,110,111,208,110,215,176,198, 96,240, 1,
- 78, 59,178,182,235,209,117,194,112, 39,237,158,141,181,121,146, 17, 98,204,226, 48,107, 68,181, 76,198,102,123,157,117, 90,176,
-244,179,200, 58,246,142, 32,236,182, 59,128,125, 30,235,138,136,110,116, 79,144,234, 2,162,134,174, 36,230,187, 49, 14, 93, 63,
-128, 56,228,206,143,138,219,118,154,208, 25,167,126,116, 68,248, 40,150, 93,227, 44,130,103, 88,138, 48,206,193, 89, 66, 75, 14,
-103, 79,174, 16,174,207, 84, 0, 55, 54, 47,174,105,240,247,159,189,192,175,223,189,198,251,191,250,223,240,248,108,141,198, 95,
-225,222,201, 18,177, 90, 98,211,121,108,119, 29,134,118, 7, 63,244,170,128, 31, 91, 9,217, 38,202, 5, 74,194, 87,164,232, 59,
- 67,168,172, 5,108,165, 9,104,113,140,146, 86, 27,168,209, 93,117,174, 78, 58, 82,143,172,151,235,114,207,174, 12,251,202, 64,
- 69,112, 22, 14, 94, 46, 1, 24, 87,130,227,191,115,177, 82,100, 12, 76,160, 0, 88,242,128,113,179,124, 17, 86,207,188, 29, 27,
-156,252, 44,149,138,168,150,106, 34,249, 83,158,128, 37, 91, 24, 23,112,101,107,240,182, 1,245, 23,128, 9,152,145, 90,166,145,
-172,147,162,254,193,163, 79,218, 93,135, 16, 24, 65, 51,229, 99, 62,180, 77,246, 18,151,132,155, 81,200, 54,203,221, 34,154,188,
-152,177, 24, 97, 32,191,184, 60,139,204,222,175, 50, 84, 92, 24,152, 74,120, 44, 79, 44,106,152,239,218,139,226,217, 6, 70,199,
- 12,207,227, 15,128,248,112, 87, 58,233,196, 49, 21,215,241, 4,166,195, 7,198,238, 26,187,170,105, 70,160, 3, 60,123,218, 95,
- 59, 80,158, 16,232, 27,185, 16,246,177,238,227,226,226, 20,127,252,225, 61,184,110,141,139, 65,125,145, 51, 79,117, 9,180,201,
-195, 2,162,153,130,159, 15, 40,190,169, 72,145, 27, 47,112, 0,233, 14,145,178, 56,240, 46, 87,128, 88, 27,139,236,102,208,193,
-226, 51, 87,219,115,169,200,215,164, 47, 34,225,161,139,231,118, 90,152, 41, 21,185, 55,248, 71,254, 28, 31, 44,108, 9, 49,154,
- 64, 28,119,121,190,230, 83,167,137,187, 33, 9,115,238,250, 75,186,131,224,217,123,235,110,149,190,234, 33,166, 30,208, 81,252,
-248, 26,242, 61,207, 31, 40,189,122,143, 78,251,247,130,145, 70, 85,213,216,237, 90,124,249,229,151,248,224,253, 15,208,212, 53,
-118,109,171,108,114,171,100, 56,205,219,142, 17,141,142,135, 7, 47, 29,118, 84,113, 88, 10,109, 73,251, 95, 31, 5,151, 74, 32,
- 37,231, 25,165,184, 73, 55,108,140, 88,210, 82,204, 40, 17, 52, 83,126,196, 49, 11,249, 77,254,188,181, 6,205, 98,145,211,210,
- 18,122,182,170, 37, 51,190, 89, 44,132, 72,167, 46,130,251,247, 31,192,168, 40,198, 89, 7, 50,132,197, 98,137,109,219,225,246,
-230, 70, 47, 81, 70,119,220, 4, 87, 73,199, 22, 52,248, 39,161, 74,119,109, 43,105,123, 12,244,222, 99,189, 94,163,221,109,117,
-132, 43,227,220, 36,114,220,238,118,232, 90, 65,222, 66, 51,194,165,203,135,174, 92,188, 70,152, 42, 15, 93, 61,233,214,144, 76,
-103, 88,144,174,194, 54, 39, 13,113, 1,186,174, 3,199, 33,231,202,155,164, 96,215,175, 69,133, 21, 52,147,252, 66,196,178,174,
- 17,137,164,168,233,215, 78, 22, 49, 82, 22, 71,132,209,136, 93, 17,116, 25,125, 13, 44, 69, 24,227,244,162, 16,176,172, 12,170,
-197, 18,103, 87, 1, 87,103, 95,162,194, 14,108,170,201,210,181,177,140,139,176,196,243,207, 63,197,159,255,252, 45,248, 71,191,
- 4,110, 47,113,116,188,128,119, 43,220,174, 59, 92,223,172,209,111,214, 64, 28, 84, 91,163,159, 81,200, 52,207,251,168, 36, 70,
-206,107, 68,147,167, 29,226,187,151, 40, 85, 37,150,242,216, 4, 38, 84,107, 36, 41,252, 17, 52, 70,190,178, 81,242,219,184,190,
- 96,114, 57,212, 6, 41,173, 79,191, 71, 42,252,169,131,231,210,216, 76,128,143, 6, 54, 6, 24,203, 50,250,199,184, 15,205, 66,
-195, 92, 63,120,140, 99,229,176,247, 41,148,221,186,193,137,137,216,214, 17,155,112, 2,179,241, 64,184,206, 89,242, 7,202, 74,
- 94, 69,212, 77, 13,251,131, 15, 30,125,210,183,189,140, 34,202, 18,160, 42,111,155, 8, 63, 84,170,198,229, 73,197, 73, 97,165,
-195,177,171,147,225,186, 90,213, 40,113,224,203,125,248,236,176, 49,178,175,231,188, 43,231,209,112, 79, 51,235,218,252, 58, 16,
- 3,134,136,188, 66,200, 40, 90,194, 12,107, 50,165,188, 97, 82,192,161, 54,187,148,234, 85,228,201,143,213,102,202,101,215, 34,
- 29,185,236,136,247, 47, 11,153,154, 84,164,215, 17,141, 66, 66, 16,129,124,139,120,255, 67,252,244,199,239, 98,115,246, 21, 94,
-116, 22,181, 53, 99,162, 87, 49,213, 72,254,120, 99,104, 58, 90,166, 67,227,241,125, 85, 85,249,156, 98,100,172,142, 78, 80, 89,
- 66,219,245, 51,158, 63,221, 49, 44,161,172,158,163,195,171,246,241, 22, 80, 50,249,139, 11, 23,107,228,231,212, 1,240, 45, 86,
-231,218,205, 29, 29, 31, 35,134,128,193,135, 49,207,126, 38,126, 36,122,181,237,107, 46,210,124,227, 44,247,194,197, 87,170,248,
- 95,247, 87,168,216, 11,150,184,251, 87,174, 7,232,141,126,105,166,112,193,193,142,189,188,158, 54, 77,131,151, 47,207, 97,173,
-193, 47,127,249,115, 92, 94, 94,104,151, 26,115,214, 58,145, 81, 49,159, 40,199,179,175, 62, 65,135,212,250,101,180,227, 76, 1,
- 46,178, 3,183,249, 53,106,154, 58,167, 61,166, 75,238,152, 77, 63, 46, 12, 40, 33, 87,139,174,171,105, 26, 1,220, 88,202,226,
-179,202, 89, 28, 29, 31, 33, 68, 66,136, 1,171,213, 10,195, 32, 66,177,166, 89,228,231,185,168,107,116, 67,192, 87, 95,127,141,
-151, 47, 94, 32,114,196,201,241, 49, 22,139,165, 42,249,157, 16,244,148, 20,215,182, 29,174,175,111,112,123,115, 45,222,105,107,
-209,181, 29,182,155, 13, 98,244,112, 85,157,197,108, 62, 4, 12,131, 23,113, 94,223,139,242, 91, 71,234, 65,199,196, 80, 55,128,
-181,178,130,180,214,229, 29,189,202,175, 53, 98,151,139, 32, 17, 33,252,121, 63,228,116, 52, 67,138, 76,133,192,104, 18, 94,213,
-144, 36,251, 73, 33,146, 83,148,201,162,237, 7,105, 12,156,153,124,110, 68,201,238,198,194,169, 44,126, 50,144,181,138, 66,116,
-157, 19,150,191, 53,140,219, 88,225,236,241, 75,240,237, 83,152,202, 29,124,223,173, 26,139,127,122, 22,241, 96,251, 25,126,245,
- 47,127,142,103,253, 35,244,219, 43, 16,123,244, 17,184,190,109,209,175,111, 0, 30, 50,249, 77,143, 85, 48,100, 61, 65, 28, 68,
-203,198,170,237,178,201,114, 39, 83,133,132,143,229, 34,115, 87,232,168, 33,191, 95, 2, 75, 82, 34,171,203, 34,139,147, 83,147,
- 65,132,192, 86,197,122, 12,207, 6, 20, 2,172, 9, 96,227,212,199, 46,171,129,140,155, 75,142, 2, 2,172, 5, 2, 52,202,149,
- 99, 78,141, 99, 98, 16,155,172,140, 55,154, 18, 7,205,117, 55, 38,234,186,197, 78, 38,171,129,129, 5, 24,182,138,184,180, 53,
-194,110, 5,211, 94, 1,166,211,193,255,221,159,113,237,212,223,249,164,219,117,185, 67, 47, 67, 82, 98,105, 1,162,100, 61, 82,
- 63,123, 2,226,211,225,125,107, 44, 13,222, 68, 7, 78,158,187,108,111,251,138,119, 20,133,125,158,162, 6,162,125, 1, 16, 81,
-177,251, 43, 11,123, 65,132, 43, 46, 19,243,200, 82,154, 36,212,141,171,128,137, 2,188,180,135, 81, 49,112, 39,154,238,202,203,
-201,120,246, 79, 74,151,226,244, 54, 16,117, 34, 66, 5, 68,198,184, 26,102,119,133,191,251,244, 12, 55,188,192,189, 70,118, 96,
-113, 2,170, 41,198, 65,251,125,116, 81,208, 49,205, 92, 63,144,234, 6,140,174,134, 97, 24,208, 15,126,242,124,247,187, 87,154,
- 76,108,246,199,201,251,223,135,177,239, 79,207, 99,103,204, 30,235, 29, 35,245, 57,128,102, 46,112, 75, 7, 49, 79,118,207,227,
- 90,131,249,205,198,239,251,162, 50,122,163,130,158,213, 71,111,242,119,138,251, 59,205, 46, 73, 7,133,238,140,169, 37,145, 94,
- 83,208,153,247,186,243,215, 93, 2,160,135,247,229,213, 21,254,236,207,254, 2,223,121,247, 29,188,120,241, 66, 3,102,100,255,
-235, 67,148, 72, 90,125,204, 86, 59, 93,168, 7, 93,212,237,172,187,105, 81,154, 75,126,122,178,136, 5, 84,117,133,170,174,100,
-188,158, 57, 11, 52,129,132, 48, 35,219, 1,229, 51, 38, 22, 45,241,185, 55,218,165,199, 73,219, 32, 23, 7,233, 80,143,150, 11,
-132, 24,177,221,110,112,255,222, 61, 84,117, 13,107,128,163,163, 99, 92, 92, 94,226,250,234, 18,204,140,190,235, 1,150, 75,128,
-100,136, 19,218,110, 64,187,219,225,230,230, 22, 87, 87, 87,216,237, 54,176,122,233, 25,134, 1, 93,215,193, 15,131,142,213,147,
-205,140,208,119, 1,183,183,183,104,219, 29, 56, 4, 52,141, 4,169,244,253,160, 77,145, 92,204, 35, 51,162, 15, 88, 52,181,194,
- 92, 98,118, 21, 12,131,215, 73,217,232, 52,241,145,209,247,189,120,178,193,168,157, 5,200,106, 52,176,114,205,245,149, 72,121,
- 4, 9,150,147, 60,246,105,181, 6,166, 60,117,145,113,186, 80,221,210,229, 41,133,247,140, 98, 90,153,226, 26, 48,140,179,232,
- 35,225,236,197, 26,235,103, 95,163,182, 62,239,123,231,171, 47, 67, 0,215, 11,124,241,249, 51,252,226,187, 29,238,255,248,127,
-194,246,122,131, 72, 30, 55,109,196,213,213, 26, 97,119, 43, 97, 46,137, 78,200, 99,180,110, 18,168, 49,137, 24,179, 50, 98,139,
- 35,178, 8,108, 64, 49,162,170, 12,200,213,249, 2,159,173,214,154, 54,103,116, 95,206,100, 16, 3, 96, 72, 20,244,169,240,198,
-100, 61,203, 44,124, 25,137, 79, 66, 97,140,205,150, 54,225,168, 21, 17,227, 44, 30,122,227, 12, 60,156, 40,226, 49,232,235,111,
-133,216,151,224, 52,170,186,151,247,179,205,211, 4, 34,155, 57, 45,121, 66, 29, 25,199,196,232,106,198, 45, 31,195,108, 34, 40,
- 92,106,179, 61, 59,111,245,168,239, 25, 96,167,234,247, 93,215,231,211,120, 68,170, 30,242,199,236,239,200, 39, 59,200, 49, 58,
-124,244,143,167,131,180,120,131,236,121,214,139,177,248,164,107,164,253,227, 53,239,189,137,246,186,252,233, 1, 70,211,218, 81,
-230,148,207,186,116, 38,154,136,185, 82,129,150,238,215, 98,229, 12,170,132,128,229,169,234,188, 4,233,164,174,126, 12, 56,153,
- 22, 49, 75,102,130, 90,205, 99,114, 98, 13,129,161, 25, 64, 36,162,177,172,183,101,206, 99,181, 84,152,140,209,140,222,146, 20,
- 87, 22,128,196, 64, 46,200,108,229,170,196,208,254,234, 97,252,224,243, 84,169,185,247,197, 15,117,156,251,124, 1,158, 23,240,
-116, 89,122, 77,101,229,131, 59,252,195, 99,236,242,215,146,168,172,244,205,227,119,180,182,191,154,215,118,151,101,108,238,132,
-231, 87,123,230, 11,111,221,216, 61, 20,167,121,241,143, 31,250, 44,158, 42, 47,139, 68, 4,126,195,215,242, 77,174, 25,214, 57,
-188,120,254, 28,239,188,253, 16,255,235, 95,254, 21, 46, 47,207,177,221,110, 20, 2, 83,100, 12, 36,204,106,148, 80, 18, 48,161,
-107,135,194,239,155,118,227, 49,231,203, 27, 35,212,141,186,174,242,164, 11, 64,206,101,151,139,173,116,203, 78, 97, 37, 73, 39,
- 24,212,135, 61,146,221,108, 78, 37,147, 0, 22,217,125, 59, 87,193, 18, 99,185, 92,193, 84, 21,110,174,111,209,247, 29, 30, 61,
-122,136,147,147, 99,212,205, 18,235,245, 6, 55, 87, 87, 88,173, 22, 88, 44, 22,104,219, 29,140,181, 88,174,142,113,125,179,198,
-213,213, 21,218,221, 22,187,221, 22, 97, 16,177,152,173,212,123, 31, 99, 30,192, 82,209,245,117,221,128,205,118,135,182,221,102,
- 27, 85, 12, 18,167,106, 84,228,150, 70,250, 81, 67,111,234,102, 1,171, 94,228,168,137,119,105,122,227,172, 92,254, 67,144,181,
- 6,135, 33, 91,174,130,166,252, 17,113, 38, 27, 86,186, 54, 24,188, 87,109,128,250,221,161, 26, 1, 99, 69,168, 26,124, 70,250,
-138, 55,221,130,245,241,248, 64,224, 40, 34,205, 72, 9,119,154, 46,148, 17, 67, 96,220,236, 34,206,159,191,132,233, 46, 4,243,
-154, 28, 82,206,170,229,119,124, 55, 46, 28,225,233,174, 70,247,228,115,252,203, 95,124, 23,195,131,159, 98,189,217,224,197,229,
- 22, 55, 47,207,129,110,157, 59,115,102, 61, 95, 67,132, 53, 81, 60,224,145,149, 92, 41,182,222,218, 57,176,113,185,153,136,250,
- 1,119, 70,113,173,122, 86,165,184, 92,214,203, 8, 89,185, 8, 68, 21,172,150, 67,113, 66,122, 95,235,216, 94, 95,251, 64, 6,
-134,229,177,144,113,217,117,147,249,240, 41, 3,131,229,191,173,194,108,210,100, 3, 9, 88,198,102,164,216,231, 21,158, 92, 22,
-164, 1, 54,153, 49,146, 62,247,145, 9, 11, 0,181,139,184,170, 44,250,221, 9,194,246, 6, 62,110,208, 71,135,214, 51,218,158,
-209, 15, 17, 97, 8, 48,195,128, 19,238,240,221, 35, 3,251,195, 15,222,253,164,107,197, 82, 48, 30, 50, 35, 49,174,236, 2, 9,
-135,160, 48,211, 17,188, 60,232,196,123,223,247,172,243, 60,111,124, 98, 99,162, 73, 97, 0, 29, 26, 19, 82,182, 54,204,220,224,
-251, 59,241, 25, 70,147,103, 19, 5, 59, 1,101,211, 65, 76, 14,167,132, 50,205,114,143,156,132,128,101,166, 59, 79, 58, 35, 67,
-197, 42, 64,133, 55, 14,148,137, 90, 9,102, 16, 83, 8, 74,138, 35, 77, 24, 67,146,255, 6,233,141, 90,133, 53,163,120,204,225,
-225,178,198,146, 24, 59, 61, 8,193, 5,188,237, 64,215, 60,181, 19,206,147,241, 14, 79, 91,112,176, 60,149, 19,143, 59,236,120,
- 7, 6,214, 83,236,237,116, 61, 81, 58, 11, 14,186, 26, 94, 81,196,177, 87,244,167,218,178, 61, 11,222, 43, 42,219, 92,123,255,
-109,238, 2,156, 99, 86,139, 55, 52,189,170, 45,230,241, 61,143,169,157,111, 62,118, 79, 93,204, 71, 63,252, 8,214, 26,220,220,
-222,230,194,158, 47, 47, 7,254,206,155,140,231,239, 84,203, 51, 99,187, 93,227,151,191,248, 83, 60,124,244, 46,252,208, 99,187,
-221, 10, 65, 45,121,149,139, 23, 46,121,213, 57,120,248, 48,192, 90, 11,167,170,236,224, 35,156, 51, 9,180,160,254,116, 41,240,
-156, 25, 48,177,136,214, 36,132, 40,163,214,144,194, 56, 82,104,138, 42,211,147, 37,139,244, 51, 66, 36, 93, 52,200,162,107,119,
- 56, 57, 57, 66,211, 44,208,107,250, 89, 8, 3,142, 86, 75,156, 62,120, 11,195,208,163,110, 26,172,215,183, 32, 34, 84,117, 5,
- 87, 85, 50, 82,111,119, 88,223,174, 49,180, 91,212,181, 19, 38,187,142,183, 23,154, 73,223,118, 67,198,146,202,122, 87, 56,239,
-237,110,135,245,250, 86,161, 61,200,138,116, 20, 22, 90, 41,254, 29,192,140,186,110,192, 36,249,230, 85, 85, 97, 80, 93, 66,186,
-136, 91,245, 97, 7,150, 20, 51, 2,103, 59,218,224,125, 70,243,210,164,193, 33, 13, 48, 17, 69,251,160,233,109,172,123, 98,177,
-183,118, 85,118, 35, 0, 0, 32, 0, 73, 68, 65, 84,141,171, 12,214, 4, 50, 97,247,203,247,138, 62,104, 84,173, 20,234, 33, 18,
- 12, 6, 48, 73,130,220,229,109,139,221,229, 11, 56, 18, 43,215, 40,227, 49,217,190, 92,190,219, 22,141,195,103,103, 45,222, 55,
-143,241,193, 79,255, 8,207,111,107,236,110, 47,224,119, 27,221,167, 35,179,210,243,133,209,104,222,101,214,191, 72,113,119,142,
- 0, 35,157,121,227, 36, 3,129,201, 98, 8, 18, 29,156,105,167,170,236, 15,201, 35, 71, 10, 26,231,136, 33, 74, 54, 6,120, 76,
-112, 99,117,104, 25, 10,202,146, 23, 47,124, 48, 21, 16, 25,198,176,102,173,235,250,152,160,170,246, 17, 16,100,136,192, 6,224,
-104, 96, 89, 33,244, 90,224, 77, 94, 43,168, 9, 92,113,184,130,103, 31, 19,243, 70,253, 19, 3,100,113,108, 8, 93,205,184, 14,
-199,104,110, 13,142,251,167,120,232, 54,248,222, 42,224,247,238, 71,252,232,109,131,159,189, 95,225,167, 63, 56,194,207,126,255,
- 33,126,246,211, 15,101, 2, 28,153, 38,163, 15, 46,137,236, 76, 19,213, 48,151, 7,115, 78, 33, 67, 49,110, 31, 99, 91,167,163,
-244,226,118,196,152, 9,224, 48,118,111, 60, 38,164,153, 3,214,170,244,152,146,127,145,178,197,139, 39, 96,146,185, 2,157,115,
-224, 76,193,170,207, 57,232,242,130,134, 57,154,150, 0, 4,143, 46,232,212, 32,249,245,211,222, 60,245,101, 5,126,181,196,163,
-178, 86,152,168,232, 64, 66,132, 97,185,144,132,130,158,150, 87, 29,197, 46, 54, 63,255,124, 81,208,241,114,100, 44, 22, 53,190,
-247,246, 2, 23,231,215,120,210, 49, 26,123, 32, 28, 60,219, 8,167, 35,244,180,124, 74, 94,255,114, 68, 31,203, 11, 27,239, 11,
-201, 70,230, 64,218, 13, 21, 37,137,231,162,194,233,212,163,172, 44, 73,164,150,245, 25, 60, 31, 70, 79, 47, 6,124,199, 88, 25,
-175,248,117,158,219,190,246, 77, 2,119,138,202,105,111,235,204,251, 35,109,154, 47,209,139,219,195, 36,152,249,112,195,158,110,
-230,201, 53,146, 10,124,228,120,215, 16,160,128,244, 20, 99,117, 21, 24,189,234,245, 57,148, 43,127,232, 66, 87,254,218,106,185,
-196,227,199,143,241,217,231,255,140, 63,248,195,159,225,225,187,239, 97,183,107,193, 79,159, 34,198,128, 33, 4, 65,175,242,184,
- 43,238,250, 30, 31,127,252, 17, 66, 12,248,199,255,246, 79,176,141,114,200,173, 22, 94, 99,245,125, 46, 5,203, 58,171,227,119,
-202,197, 42,104, 66, 89, 8, 61, 42,103, 80, 87, 78, 86, 65, 74, 68, 20, 48,140, 81, 65, 26, 11, 9,211, 26, 84, 86,198,230,125,
-223, 33,120,143,161, 23,128, 74, 93, 59, 88,195, 88,173, 30,224,234,230, 22,174,126,129,102,177,194,205,205, 13, 78,239,157,226,
-234,242, 82,114,231, 85,141,159, 50,217, 87,171, 37, 92, 37, 1, 51, 33, 6, 84, 78,138,122,175,151, 26, 86,229,244,162, 89, 98,
-219, 5,108, 55, 59,108,182, 91,244,125, 87,128, 83,144, 53, 6, 49, 70,144, 35,244, 65, 10,237,178,105,100,119, 30, 34, 6,237,
- 80, 67,156, 6, 14, 15,189,199,114,217,128,130, 83, 56,141,248,209,147, 51,162, 76,159,204,227,111,232,101, 64, 47, 70,131, 22,
-244, 0, 2,115, 16, 77,142,126, 86,253, 32,105,109,181, 27, 67, 99, 12, 1,108,173, 76, 18, 98,132,135,129, 33,134,143,132,208,
-245, 8,100,176,219,182, 48,126, 7, 84, 35,126, 44, 48, 1, 62, 76, 4,196,233,159,202, 48,194,242, 20,255,246,223,255, 22, 63,
-253,245,191,195,233,195,191,198,205,229, 18,166, 94, 0,221, 22, 20,251,140,160,245, 12,248, 62,192,113,144, 49,121,206,221, 48,
- 50, 74, 79, 62,107, 86, 11,154,179,178,183, 54,130, 28,142, 42, 76,244, 12, 80,244,176, 70, 56,240, 33, 74,186, 28, 89, 66, 13,
-139, 72, 34,222,116, 26, 80, 83, 89, 43,207,155,197, 94, 24,145, 66,196, 34,122,111,176,240, 61, 76, 21,192, 84,165,120,245,137,
-144,149,117,194,105,201, 74,120, 93,116, 34,101,206, 25,235, 25, 58,154, 29, 95, 40, 32, 97,162, 79,179,160, 8, 68, 13,152,233,
- 35,128,129,241, 17,121,252,242,123, 91, 28,127,248, 54,172,253, 99, 52, 13, 97,181, 58, 65, 92, 54,232,237, 49, 34, 86,240,100,
-208,163,198,109,117, 10,151,110, 36, 28, 53, 7,155, 38,168,110,129,152, 20, 29,224, 28, 35, 75,243,129, 54,143, 30,117, 83,236,
-161, 89,169, 53,201,175, 94, 66,117, 70,235, 27,231, 93,244, 93, 98, 30, 20,187,250,148,209,110,230,221, 79,145,221, 62, 71,191,
-206,141,109,102,126, 72, 30, 16,147, 17,201,253,138,185, 16,245, 36, 65, 6,143,157,102,226, 10,199, 60,162,231,156,179,235, 33,
-172, 97, 67,144,253,148,238, 34, 67, 82,125,166,215,149,198, 67, 63, 11,251,104, 52, 15, 14, 12,172, 22, 21, 28, 34,110,135, 56,
-178,191,243, 69,169,176, 1, 22, 23,140, 56,177,150,165, 98,128, 9, 32,199,204,107, 16,207, 2, 98,179,187,128,139, 75,147, 36,
- 5, 24,163,177,145,172, 41,195,123, 25,184,170, 10,103, 26, 1, 22, 69, 7,109,238,228,208,255,142,163,115,194,100,175, 62,167,
- 29,222, 41, 92,223, 91,208,188,226,210, 48, 47,149, 84,200,209, 95,241,205,120, 18,134, 48,154,231, 57,242,157, 19, 8,107, 9,
-159,127,254,207, 10,185,105, 70, 7,193, 27, 94,120,230,170,126,126,197,197, 38,178,248,152,119,187, 29, 62,251,252, 51,252,225,
-207,254, 8, 0,240,214, 59,143,196, 62,246,244, 9, 46,175,175, 17, 56,140,233,125,117, 37, 98,181,102, 81,172,170, 98,254,140,
-249, 16, 52,169,144,116, 36, 76, 57,183, 29,170,194,238, 7,143,161,235, 97,173,147,177,179,170,233, 73, 71,201,145, 67, 30, 43,
-131, 72,188,193,172, 68, 59,171, 23,252, 24, 36,179,188,151, 36,174,213,209,145, 10,188,128,193, 7, 92, 94, 92,160, 90,116,120,
-242,248, 27,172, 86, 18,143,107, 85,120,215,251, 0,110, 59,144,145,176,155, 16, 25, 93, 39,121,236,198, 58,116,131,172, 22, 22,
-139, 6,219, 93,135,198, 57,192, 24,120,223,106,226,151,196,186, 38,165,125,140, 81, 59,117,241, 59, 7,142,130, 5,214,176, 22,
-103,109,190,252, 39, 96,141,161, 81,171, 99, 34, 97,215, 14, 24,134, 30,206,146, 38,223, 49, 98, 44,244, 7,202,108,135,250,174,
- 19, 75, 32, 49,222, 9,105, 12,173,232, 91, 35, 66,176, 97,240,112,137,181,143, 68,155,147,175,231,172,168,198,125,100,192,251,
-220, 72, 85, 6,216,121, 96,104,119,194, 73,207,217,157, 83,109,207,161, 11,233,233,202,224,239, 95,212,248,242,191,252, 71,124,
-240,191,255, 57,190, 48,167, 8,195, 99, 65,237, 70,181, 20,234,247, 14,134,208,123,134, 51, 67, 94,181, 68, 22,203,151,177, 6,
-156, 80,181, 54,130,157, 69, 12, 6,214, 18,156,171, 48, 68,150,221, 57,100, 37, 36,235,142, 32,138,126, 4, 48,137,194, 63, 5,
-194,112, 12,136, 28, 64, 73,220,169,227, 50, 3, 2,179,133,141,140,104,162,124, 77, 14,114, 49,101,146, 14,155,130, 58,105, 72,
-215,163,128,229, 32,175, 55, 9,117,143, 74,133,187,214, 4, 17,230,169,209,141, 32,177,174,186, 38, 96, 67, 48,106,139,142,196,
-232,153,208,244,192,241, 98,139,213, 59, 43,236, 78,127,140,155,248, 29, 92,251,136, 16,122, 12, 3, 48, 12, 4,244, 29, 16, 54,
- 88, 44, 59,216,143, 63,212,241,123, 44,104,113, 60,134,178, 28,154,136, 18, 70,244,171,153, 23,116,140,169,110,102,210,249, 20,
-227, 95, 42, 99,229,104, 34, 62, 75, 79,188, 20,185,209,235,124,210, 19, 76,171,178,163, 85,165, 27,103, 99,102,154, 96, 88,147,
-112, 97,106,117, 43,191,150,161,113, 68,108, 40,111,210, 38,171,101,166, 49, 81,131,104,223, 91,159, 58, 42,102, 72,160,133,126,
-109,103, 12, 26,253,239, 56, 19,128, 69,154,141,173, 21,181, 89, 85, 21,222, 63,174,176, 91,239,240,120,227,149,231,204,186,219,
-225, 61, 87, 64,105, 11,156,163,108,203, 71,152,246, 69,119, 1,103,112, 64, 48, 70,121, 18, 81,136,189,239, 42, 21, 52, 93,237,
-164,187,148,217,255,129,222,249, 56,222,108, 14, 94, 62,199,153,167,243,117, 26,183, 9,161,225,205, 10,229,168, 94,163, 55, 83,
-201, 31,140, 82, 27,129, 46,175,179,235, 17,153,125,167,200,155,189, 36,223,250,159,182,235,176, 90,173,240,231,127,241, 23, 0,
- 8, 79,159, 61, 21,207,190,118,114, 41, 91,222,169,250,153, 1, 60,123,246, 28, 79,207,206, 4,220,146, 68,181, 49, 69,201,106,
- 12,167,179,112,186, 83,151, 84, 52, 81, 94, 39,150, 58, 20, 24,194,172, 30,255,180,195,102,205, 62,215,125,126, 84, 66, 95,202,
- 13,151, 4, 47,225, 29,116, 58,118, 63, 57, 94,161,110, 42,116,109,175,217,244,140,237,102, 13,231, 68, 93,237,172, 69, 85,215,
- 24,130,196,142, 26, 67,168,156, 3, 10,150, 61, 88,184,235, 41, 61, 76, 10,233, 56, 52,105,187, 30,125,215, 10,146, 53,237,117,
- 13,114,212,105, 10, 22,233,250, 65,196,118,203,133, 4,216,148,246,206,124,177, 37,245,200,203, 55,232, 7, 9, 60,169,235, 6,
- 65,125,231,129, 9, 62,120, 69,241,138,122, 62,164, 88,212,132,110,214,203,130,196,154, 42,237, 47,178,130,100, 44,192, 30,206,
- 25,193,209,210, 92,136, 57,126, 34, 12, 34,152, 68, 28,233, 12,176,238, 9,155,171, 11,216,216,103, 32,205,155,188, 1, 45, 1,
- 87,222,193,222, 62,197,159,254,236, 61, 92, 47,255, 0,235,139,231,216,110,183,224,161,149,142, 58, 55, 15, 98,131, 68, 24, 4,
- 28, 67,182, 16,100, 58, 84,214,160,174, 12, 76, 85, 1,228,224,153, 16,125, 0,113, 16, 11,115,140, 32,138,186, 14,208, 48, 28,
- 14, 19, 29, 8, 71, 17,205,165,145,122,194, 85,167,156,121,214,228, 63,210,174, 58,133,254,112,102,130,142,204,248,169, 85,153,
- 11,146, 92, 90,191, 66, 40,120, 84,164,241,101,223,187, 86, 3, 22, 1,165,136,193,237,136,170, 37,131, 1, 6,215, 3, 48,108,
- 34, 66,187, 67,215,109,209,238,182,240,187, 53, 66,183, 70, 24,214,240, 67,139,224,123, 56,195, 24, 53,147, 37,160,165,200,186,
-230, 3, 35, 75,105,186,104, 26,240,193,233,239,149,204,179, 18,130, 50,235,134,105,196,190, 48,207,197, 60,148,187, 66,240, 97,
-209, 84,185, 34, 96,189, 76,140,113,121, 14,214, 89,156, 16,195,233,239,153, 57,171, 30, 50, 62, 11, 58,161,160,148, 18,116,224,
-168, 52,217,138,167,187,111,142,197,152,180, 24, 63, 43,221, 13, 69, 17, 79,187,238, 66, 84, 32,234,202, 24,176,243, 1,187,148,
- 76,132,113,188, 30,244,239,196, 52, 13, 40, 70, 13,206, 90, 12,253,128, 23,155, 30, 62,219,233,120,244,202,166,221, 12,151,211,
- 11,126,173, 50, 58, 89,137,168,216,225,230, 63,195,163,112,112,146,242,150, 14,164,244,220,227,225,145, 56,207,252,214,105,186,
- 96, 85, 60,200,121,253,192, 51, 93,194,239,168,110,163,137,203,238, 91,252,213, 41,133,143,249,117,212, 57,220,225,236,120,117,
- 97, 77,239,107, 42, 70,232,252,102, 68, 28,165, 51, 30, 46,214,123,123,245,217, 75,114,104, 44,127,208, 26,168,255,222,212, 13,
- 46,206,207,177,217,172,165,192,116, 61,250,161, 21, 15,120, 93,163,174,235,156, 3,206, 81,118,154, 9,233,105,244,127, 33, 68,
-212,154,137,205,144,241,110, 8, 17,100,172, 64,124,156,147, 14, 54,248, 12,221,113, 70,224, 62, 2,184,177,163,162,219, 24,101,
-180,139,160, 44, 6, 25, 84, 58,181, 99,117,157, 36,196,129, 4, 87, 27, 84,157, 78, 36,204,125, 74,209,166,208,208, 30,205, 8,
- 15, 33,102, 46,187,115, 14,117,179, 64, 12, 65,166, 4,198,192, 57,202, 92,250, 65, 45,101, 85, 93,131,201, 98,179,237,176,221,
-172,181,211, 21,101,255, 48, 12, 24,122, 47,164, 50, 13, 65,233,186, 1, 28, 60,170, 90,124,249,164,112,152,168, 5,207,169,136,
-208,234,168, 46, 68,241,230, 55,149,197, 98,185,148,130, 67,164,145,164, 49, 11, 7, 99, 84, 22,189,122,214,141,238,131, 35,203,
-126, 62,197,226, 38, 79,111, 55, 72,212,169,117, 14, 67,144,245,162,240,226, 1,171, 77, 11,199,128,138,228, 18,230,163, 36,200,
-113,144, 8,222,174, 31,192,161, 7, 27, 42,148, 86,175,255, 76, 74,183,110,241,159,190, 50,248,252, 63,254, 59, 60, 56,190,133,
- 89,220, 71,237,170,140,117, 77, 69,215, 16,137,186,223,202,138,133, 57,192,104, 72, 77,237, 44,234,218,161, 89,212,168, 23, 11,
-152,170,206,133,146,201,192,105,236,105,178,137,101, 59,182, 78, 73,211,247,136, 48,240, 94, 46,109, 33, 51, 22, 24,221, 16,224,
-187, 30, 20, 7,157,154,136, 39, 62,192, 96, 8, 26, 71,171, 68,189,172,128,199,248,249,101, 26, 39,145, 28, 57,215,129, 17,230,
- 70, 57,122,149, 38,151,249,177, 41,142,249,179, 46,154,171,192, 12, 31,128,117, 31,208,237, 58,196,238, 6, 49,118,240,145, 49,
-132,128,224,133,121,192, 49, 0,250, 62,200,231, 82,130,153,164, 8,214, 88,164,177,149,187,102, 97,193, 51, 76,209,223, 76,197,
-111, 52, 41, 98, 49, 93, 28,184,204, 12, 47, 19,214,226, 68,228,197,123,197,119, 58,250,223,247,221,242,104, 12, 98, 49,245,119,
- 1, 88,243,235, 71,142, 4, 33, 21,141, 66, 65,221,119, 39,118, 92,122,204, 90,176,147, 54, 32,237, 41, 98,241,104,141,102, 65,
-199,201, 46,185,172,236,197, 30, 30,242,225, 28, 66,132,207,251,120,206,227,237,100, 3,138,169,184,235,117,195, 15, 61,190,186,
-222,225, 58, 0, 21, 21, 49,165,152, 66, 93,246,148,232,204,123, 98, 65,230,105,111,200, 60, 94, 34,104,162, 21,224, 28,110, 16,
- 11, 69, 30,207,156,220,211,231, 57,109,151,101,189, 83,190, 2,242,188,134, 24,103,151, 11, 70,211, 44,208, 84,213, 36, 97,234,
-119,237,216,223,188, 83,229,241,178,152,247,212,252,237,190, 1,223,125,139,160,242,242,203,179,119,199,155,182,219,132,187,130,
- 15, 95,249, 80, 51, 86,216,208, 43, 59,120,158,189, 71,140,179,216,110, 55,216,110,214, 82, 88, 21, 28,195,202,216,118,149, 40,
-130, 13, 36,118,212, 24,171,252,114, 85, 39,147,201, 72, 85,107, 82,230, 1,171,120, 77, 58,118,177,131, 73, 21, 19,133,182, 17,
-124,172,146,212,172,181, 10,190,177, 89, 77,111,212,214,147,104,158,193, 71,248, 68,171, 51, 86, 3, 95,196,130, 39, 64,155,136,
-197,162,198,114,185,208,142, 53,100, 69,254,122,179,193,208,183, 88,165, 96, 23, 21,228, 25, 99,225,135,160,177,158, 50,190,174,
-157, 67, 83,215,240, 33, 98, 24,122,189, 56,244, 64,148,132,177,160, 19, 5,209,158,233,104,150, 12,134, 97, 0, 16, 81, 55, 21,
-170,170, 22,246,123,229, 64,214,230,216,233,168,130,173, 20, 26,227,189,120,221,145, 59,125,177,154,213,181,203, 23,166, 90, 95,
-191,168, 34,184, 49,190, 84,222, 99,150,140, 38,207, 97,146,133,157, 80,182,117, 93,229, 72, 82, 1,220, 8,231, 94, 38,177, 34,
- 82,244, 62,202,229,200, 0,108, 28,130, 15,160,156, 67,255,250,233, 82,121,224, 52,150,113,109,143,241,239,255,246, 51,156, 92,
-254,103, 44, 78, 31,200,100,131, 92,118, 85,228,179,212, 88, 24, 91,103,108,174,133,240,219, 43,235,112,180,112,112,139, 37,156,
-173,208,212, 14, 84, 53, 50,194,142, 17,198,112,206, 91, 79,235, 87,103,245, 82,104, 93, 78, 61,115, 70,108,104,164, 52, 58,142,
- 17,196,162,221,232,131,176,248,225, 59, 24,138,112,198, 42, 15,193,100, 48,152,120,234,131,158,217, 38,219,184, 35, 51, 40, 6,
-169,105,105,146,201, 65, 11,124,208,203, 22, 96, 98, 80, 81,158,201,116, 57,196, 0, 82,189, 70, 84, 75,157,165, 8, 54,132,142,
- 9,173, 7,186,118, 0,186, 14, 54,236, 0,242,186, 38, 0, 44, 2,106,138, 32,203, 73,121, 95,164,202,112, 65,115,227, 2,139,
-170,221,187, 37,236,197,159,146, 14, 37,242, 97, 0,134,101,228, 14,205,228,209,243,252, 0,163,189,142, 61, 78,200,117, 36,224,
-129, 89, 33,185, 59, 62,147, 71,101, 97,244,232, 25, 26, 82, 83,250,229, 83, 71,142,252, 67, 24,187,201,162,179,205,116,189,177,
- 11, 13, 96,132,108, 7,227,188,171, 24, 5,132, 35,231, 62, 22,130, 65,154, 5,150,242,204,122,103, 84,100, 17, 11, 91, 33, 23,
-132,165,148,237,236, 33,217,213, 33, 5, 1, 36, 25,130,254, 4, 45,237, 39,147, 78, 66, 76,152,225, 99,196, 16, 11,170, 31,143,
-177,154, 89,177,203,211,199, 90,232,235,242, 20,101,156, 8,240,126,231, 87, 42,193,147,165, 78,161, 57,101, 97, 63, 20, 82, 98,
-140,140, 28,187,193,231, 15, 28,102, 93,252,157,133,139, 95, 49,234,190, 11,134, 83, 78, 38, 10,242, 30,189,214,202, 70,179,146,
-201,111,112,131,152,171,226,211,107,207,111,230, 71, 43, 28, 14,229,207,246,174,195, 53, 63, 66, 45, 12,143, 30,189, 43, 40,222,
- 16,222,232,154, 99, 20,213,218,117,125,230,164, 39,132,103,213, 52, 88, 44,150,178, 63, 38, 20,240, 42,233, 82,146,223, 59, 51,
-184,157, 4,221,248, 33,160,170, 44,142, 87, 75,212,117,157,227,108,179, 31,221, 16,134, 65,190,167,247, 1, 33,248,124, 66, 85,
-169,227, 87, 96,138,181, 50,190,239,135, 94, 50,187, 93, 37, 98,171, 65, 8,101,253,208, 99, 24, 6, 57, 87, 52,106, 53,117,227,
-198, 26,212, 85,133,213,114,129,166,110,144, 88,242, 66, 86,139, 58,185, 26,227,102,119, 93,135, 16, 2,234,186,134, 81,219,204,
- 48, 12,114, 65, 8,114,154, 68,205,250,174, 43,217,153,135, 8, 85,158, 7, 84,206, 96,217, 44, 68, 16,104, 70,230,164,116,211,
- 81, 3, 75, 36, 28, 38,228,238, 75,208,187,134,160,204,122, 17,238, 57,231,100,106,168,217,239, 86, 59,202,160,221,255,148,127,
- 41, 59,223, 16,188,172, 53, 20,127,155,226, 85, 93,229, 50,137, 50,234, 41,238,163, 92, 90, 12,226, 24,177,171, 0, 46, 31,162,
-118,169,116,192,190,121,119,151,158, 14,239,147, 35,135,255,240, 5,240,197,255,251,255,224,225,233, 22,212,220, 7,138, 73,169,
-136,250, 4,116,100, 17,181, 8,219, 81, 0,104,229,103, 87,213, 21,170,170, 65,229, 28, 22, 77,133,170,174, 1, 91, 33, 48,233,
-235, 9,249,179, 90,184,162, 94, 28, 98, 72,103,107,200,250,159,244,117, 37, 75,125,132,217,116, 33,194, 15, 30,204,189,224,105,
-157, 5,172, 69,100,241,253, 7,117, 37,145,190,230, 52, 57,223, 99,158, 10,144,146,237, 34, 43,215, 91, 63,243, 81,233,114, 96,
-155,149,239,163,147, 74,180, 87, 49,253,121, 37,215,117,158,209,245, 61,120,232, 81,193,163,113,132,166,118,176,181, 3,185, 90,
- 46,138,204,148,243,172,211,143, 41,238,245,181,148, 49,123,204,132,136,187,198,172, 99, 7, 18,102, 85,197,140, 38,185,153,162,
- 61,249,196,213, 79, 88,118,199, 32,212, 74, 14, 66, 17,132, 50, 62,198,253,115, 59, 23,103, 50, 26,229, 90, 42,243,139, 81, 63,
-143,197,125,162, 36, 46,187, 73,158,118,175, 28,121, 44,188,233,209,235,229, 37,178, 20,252,146,229,205,133,218,126,108,216,227,
-120,155, 6, 84,248,146,246,210, 81, 45,111, 92,136,230,116, 76, 23,211,101,129, 71,145,158, 86,117, 86,219, 79,122,117, 99, 28,
-191,126,246, 51, 48,224, 25, 56,169, 29, 30,214,148,163, 51, 83, 33, 79, 44,234,114, 84, 27,131, 92, 52, 74,106,222,168,212, 46,
-232,130,204, 83,225, 24, 23, 23,177, 34, 99,184, 68, 39, 78, 89, 45,211,113,127,240, 9, 23,122,247,126,251,240, 40, 57, 61,119,
-126,163,197, 60,163,180,130, 81,254,121,211, 12, 3,252,250, 78,132,222,120,244, 94,206,209,191, 13,162,102, 98,108,152,193,234,
- 94, 43,142,211,136,188,155,155,219, 60, 82,126, 51,221, 0,233,133, 54,104,240,136,149,247,154,122,195,173,181, 56, 90, 29,201,
-142, 93,127,102, 18,161, 90,129, 21,184, 2, 64, 59,119, 74, 35, 47, 44,154, 26,139,213, 74,210,217,162,234, 73,244, 51, 18,116,
-140, 79, 76, 8, 28,148, 59, 32,239,163, 24,198, 79,184,177, 18, 84, 98,212,146,182, 88, 46, 97,156,140,191, 67, 26,123, 70,198,
-102,189,133,239,122,196, 16,243,206,222,232, 4, 33,130, 96, 93, 5,207,140,219,205, 14, 93,215, 11, 21, 44,200, 88,214, 89,131,
-170,170, 96,212,155,238,253, 32,212, 67, 50,216,108, 59,236,182, 27,236,118, 45,162, 94, 60, 98,178,223,121, 61,236,105,244,130,
- 91,235,164,200, 24, 43, 69,223, 57, 56,103, 80,215,149, 8,193, 98, 49,114,141,114, 73,112,206,232,231, 48,228,247, 75,226,185,
-187,202,201,116, 32,196,204,121, 39, 45, 2,146, 62,150,154, 17,229,167,131,132,206,166, 69, 47, 68,198,144, 9,115, 66, 77,235,
-123,143,224,251,177, 17, 96,160,114, 36, 29,174,190,255,228, 66, 24, 14,112, 61,238,150,156,148,127,104, 97, 25, 55,246, 4,255,
-246,111,126, 3,243,244,111,224,142, 78,101, 13, 83, 57, 56, 91,229, 12,130,228,184, 18, 81,154,132, 0,213, 6, 88, 44, 44,162,
- 93,192, 69,198,162,150,203,165,117,149, 0,116,212, 94, 23, 24,136, 62,192, 82, 0,172,131,248,204, 56, 19,247,100, 50, 75,240,
-158,225,135, 65,245, 9, 81, 94, 11,189, 92, 70, 0, 49, 26, 12, 94, 94, 39,223,247,114, 57, 51, 4,231, 44, 96,205, 56, 62,231,
-152,215,159,185,241,100,202,141,218, 56,134,167,124, 38, 6, 16,124, 52,136,158,129,232, 1,120,140,191,205,147, 73,177, 52,218,
- 1, 30, 17,125, 48,232, 6,200,165,183,107,193,161, 83,160,142, 3,155, 10, 68, 53, 92,196, 72,210,201, 74,228, 52,215, 47, 32,
- 33, 57,170,116,230,231,205,233, 56, 58, 99, 13,179,251, 10, 40,249,168, 15,219,174,166, 98, 48,206, 69,146,161,196, 29,140,161,
- 50,156,212,243, 60,210,236,204,193,157,101,233, 60, 31,131, 84,246,144,176,243,241,100, 86,153,143, 80, 24, 78,214, 52,157, 70,
-208,136,172, 25, 11,243,196,154, 53,158,188,227,135, 35,137, 3,203,187,237, 8, 61, 32,146,160,147,152, 64, 22, 60, 66,255, 71,
- 54,188,142, 30, 57, 42,204, 32,229, 82, 83, 30,217,251, 28, 26, 50, 13,143,201, 62, 86, 6,154,102,137, 37,119, 56,239,122,101,
-183, 79,189,210,105, 12, 8, 38, 84,150, 16,250, 22,183,222,226,222,209, 2, 86,247,116,124,224, 53, 76, 59,119,202,115,131,113,
- 60,199, 60,117, 59, 76,173,101,124, 64,119, 70,175,245,132, 83,193,122, 46, 99,106, 41, 95,220,248,181, 95, 39, 19,156,242,216,
-153,179,250,251, 91,203,236,249,110,217,218, 33,148, 49,242, 78,110,180,137, 30, 44,200, 52,181,232, 77,196,245,252,250,130, 94,
- 26, 5,215,235,219,204,190,127, 19, 33, 96,136, 17,203,197, 10,167,167,167,184, 93,111,176,109,119,122,177,149, 66, 67,170,186,
- 62,189,127, 31, 87,151,151, 64,223,137, 31,157,129, 97, 8,168, 82,222, 53, 73,152, 10,179, 7,123,175,157,178, 85, 17,145,100,
-125, 27, 16, 6,221, 71,215,138,158, 53, 49,169,222,229, 98, 1, 5,177, 24, 24,244,125,143,197, 98, 1,160,198, 48,120,241,191,
-219,113, 26,231,156,140, 95,125, 24, 38,135,107,242,247, 71, 31, 1, 14,240, 94, 5,127, 58,198, 7,128,168,143,173,114, 46,127,
-246,171, 74, 38, 15, 62, 50,110,111,182,184,190,186, 66, 12, 67,126,207, 36, 54,125,140, 64, 55, 12,136, 49, 74,210,153,142,182,
-171,186,209,162,226, 97,140, 92,122,210,158,190,237,132, 20,103,156, 69, 28,100, 10,209,122,101,201, 91,125, 61, 35, 35,244, 61,
-234,202, 10,160, 37, 53, 88,193,231, 61,124,154,162,112, 12, 42,138, 3,154,202, 33,146,129, 13, 1, 49,136,112,206, 24,209,179,
-136,187,192,131,169,130, 15, 81,160, 52,218, 29,139,163, 37,181, 99,177,112,242,112,241,201,126, 67,169,102,209,208, 51, 3, 39,
- 43,131,127,120,218,224, 95,252,231,191,193,163, 95,191,143,199,139,123,176,241, 28,204, 78, 2,113, 98, 4, 87, 14,209, 3, 21,
- 7, 16, 89,212,142,176,170, 13, 22,203, 26, 84, 45, 80, 25,177,222,133,232, 96,173,135,179,189,140,220,137,208, 56, 66,240, 34,
-230, 76, 41,104,164,190,112, 17,117, 64,167, 0, 64, 96,185,176,197, 24, 1, 19, 64,228,244, 61,100,181,246,169,157, 47, 6, 80,
- 16, 64,143, 51,162,251,136,112,234, 55, 71, 81,176,163, 90,222, 24,134, 98, 6, 19,145,214,183, 8,181,175, 35,194,144, 45,234,
- 2, 21,130,222,146,172,153, 88, 2,210,200,118,145,129,158, 65,228, 65,212, 35,194, 10, 66,158, 34,136, 44, 98,112,208, 31,219,
-190,234,145, 83, 7,151,142,105, 66, 49, 70, 38,253, 49,147, 10, 5,246,182,181, 83,235,153,238, 99,109,193,231, 69, 81,104, 39,
-135, 79,185,103,143, 17,109, 68,206,121,167, 25,156,134,249,112, 68,232,124,224, 61, 45,246,211,239, 93, 54,100,114,187, 26, 59,
-254,168, 35,100,131,162,123,211, 11,137, 45, 60,237,229,255, 76,250,250, 5, 33, 40,143,180,185, 92, 88, 20, 88,196,178,179,229,
-209,203, 31,116,215,159,139,110, 28, 63, 72, 49,139,201,120, 50, 57,201,244,190,244,248,245,131, 24, 24,168, 44,225,114,189,193,
- 87,235, 33,231,154,207,231,214, 57, 80, 38, 12,104,185,194,255,252, 39, 63,195,159,127,124, 31, 93,215, 73, 7, 68,229,212,131,
-247,246,176,242,182,142, 99, 7,142,113, 47,207,111,184, 60,158, 23,252,196, 29, 63,216,177, 23, 22, 76,142,251, 26,129,210,246,
-189, 47, 36, 27,129, 15,252,109,244,246, 92,172, 24,192,251, 59,143,215,116, 46, 66,236,195, 68,204,248,186,203,192, 4,136, 72,
-111,182, 67,159,175,224,109, 1, 42,121,147,127,134,190,199,195,135, 15,113,124,122, 15,183, 55, 55, 24,218, 14,195,208, 35,250,
-144,217,228, 98,101,148, 46,216,168,173,170, 31, 6, 16,241, 24,144,226, 28, 22, 26,192,210, 84, 21,156,138,230, 66, 84, 46,123,
- 93,193, 88, 3,239, 83,204,167, 0, 84,132, 65,174,204,249,192,242,153,211,120, 90,232,207, 86,178,215, 59,116,221, 78,124,244,
- 49, 98,185,104, 80, 85, 53, 34, 51,218,182,197,237, 70, 34, 80,211, 37,176,170, 28, 22,139, 70,198,255, 36,106,249,166, 22, 92,
- 43,153,226,194,106, 76,142,123, 5, 67, 19,235, 58,108,183, 27,120,223, 1, 28,209, 84, 50,242,143, 49, 8,213, 44,119,211,102,
- 92, 69, 84,181, 98, 65,197,189,226,117, 15,153, 46, 88,181,162,109,135, 65, 20,248, 94, 81,184,214, 36,238,123,250, 12, 9,149,
- 47, 69,244,202,229,197,234,185, 69,121,213,130, 66, 15,227, 35, 84, 1, 47,161, 48, 38, 37, 74, 90, 3, 87, 89,157,106,132, 60,
- 41, 77,217,246,105, 58,147,117, 45,144, 84, 58,153, 74,148,181,226, 77,202,250,244,160,118, 96,116,245, 2,191,249,167,151,248,
-201,242,183, 56,250,232,199,136,177,206, 54, 95, 91, 85, 32, 83,201,138,193,200,234,198, 89,139, 85,237,112,116,180,194,209,106,
- 9,119,180,130,107,142,224, 42, 7,227, 68, 24,109,171, 74, 46, 36,250,119, 34, 57,196,192,170,132,151,195, 34, 93, 86, 64,162,
-103,176,206,194, 26,151, 85,246,172,194, 73, 14, 17,145,131, 34,100,145, 1,100, 67,136, 8,253, 0, 10,157,218, 54, 13,124,208,
-105, 74, 12,170,126, 2, 56, 10, 23, 32, 42, 63,101,106,153, 77,172,122,193,216,146,129,140,254, 53, 93, 14,138,175,141,108,245,
-120,137, 89, 73, 31, 9,104, 35, 97,215, 49,186,182, 69,215,111,208, 15, 3,134,193, 99,232,123, 12,190,131,113,134,178,231, 60,
-157,166,105,151, 92,132,191, 76,138,223,116,139,194,217,227,156,201, 57, 7,230,134,251,155, 67,158,216,231, 38, 10,100, 66, 14,
-119,157,143,123,129,113, 84,111, 14,136,232,242, 45, 50, 89,173,138, 55,158, 33,236,237,205, 75, 29, 0, 10,161,224,184, 39, 39,
- 69,176,254,255,204,189, 91,175,100, 89,114, 30,246, 69,172,181,119,102,158,186,116, 79, 79, 55,103,200, 25,106, 46,228, 92,196,
-185,208,132, 68,209,134, 77,208, 4,168, 7, 3,126,243,139,127,206,252, 9, 1,122,149, 97, 63,202,128, 33, 72,166, 72, 27,148,
- 12,209,162, 44,138, 4,135,166, 64,147, 38,104,243, 58,211,211,151,234,170, 58, 39, 51,247, 94, 43,194, 15, 17,107,237,181,118,
-238, 60,231,212, 12, 9,184, 6,131,238,174, 58,149,151,157, 59, 87, 68,124,241, 93, 22, 61,185, 40,144,124,116, 42,154,208,198,
-230, 31,104, 59,219, 78, 35,176,132,222,240,170,161, 33, 92, 50,250, 22, 82,158,125, 89, 43,191, 93, 23,100, 69, 21, 29,156,175,
-171,253,179, 54, 12,250,217,247, 51, 1,203,181,225, 6,110,111,243,198, 99, 96,164,187,151,248,189,215, 35,126,234,239,253,125,
-252,196, 19,193,221, 57, 85,155, 75,125, 96,210,171, 94,121,171, 31,214,198, 44,229,122,141, 47,175,223, 14,175,155, 39, 79,241,
-238, 59,111,215, 24,202,139, 70,173,177, 37, 94, 99,130,138,109,119,182, 37,209,169, 91, 4,189, 17,169,110, 25,157, 31, 62,218,
- 22, 38,189,246,122,187, 71, 55, 17, 27,178, 61,213, 7,183,253, 15,189,178,251, 26,173,148, 38,188,247,222,123, 70, 40,123,253,
- 10, 79,159, 61,197,211,167, 79,113, 56,236, 45, 93,205,147,205,114, 74, 53,167,188,172,169,114, 86,223,137, 11,142,231, 19,142,
-147, 57,135, 89, 70, 57,144,231, 84,119,214,133, 75, 19,153, 45, 39, 59,155,197, 42, 59, 19,142, 93,167, 79,108,255, 31, 29,122,
-127,125,119, 7,149, 92,155,149, 18,243,202,193, 34, 70, 85, 45,239,252,124, 62, 2, 16,164,148, 49, 77,147, 59,193,113, 45,224,
-182, 67,158, 17, 67,201, 80,183,231, 49, 50,157, 53, 48, 73, 50,230, 36,184,125,245, 10,121, 62, 27,148,188,219, 65,193, 72, 30,
-221,122,158,146, 39,204, 69,183,250, 20,236,118,163, 21,144,146, 97,238,136, 2, 59, 1,108,246, 66, 48, 12,131, 17,165,156,217,
-111, 59, 97,139, 90,181,189,186, 37,165,221,157, 38,228,148, 16,216, 8, 96,228, 73, 98,115,202,198, 18,103,114, 98,153,217,210,
-150, 36, 72,147, 83,177, 17, 26,125, 39,111, 4, 70,174,103,124,140, 1, 49,122,147,225,205,131,233,200, 29, 37,177,165,244,227,
-123, 95,221, 44, 24, 80, 0,207,247,192,255,241,193, 19,220,253,225,239,224, 63,253,217, 3,248,211,223,192,200, 25, 66, 1, 44,
-130, 49, 88,190,124,242, 9,120, 23, 9,135,195,128,155, 39, 59,196,155,167, 64,184, 65,246,149,162,168,186,177, 11,129, 60, 37,
- 77, 97, 97, 43,196,253,158,171,174, 26, 37,215, 85,133, 53, 79,126, 61, 66,116,142, 7,213,148,210, 33, 90,243, 20,130, 53, 23,
-182, 87, 39, 68,100,196, 8, 71,157,236, 32, 74, 66,174,121, 95,236,117,139, 81, 81, 65, 95,139, 24,156, 90,179, 42,207, 82,177,
-245,136,175, 84, 37, 91, 48,141,136,239,232,157,227, 64,140,147, 16, 78, 19,144, 78, 19,116,186,133,228, 51,178,204,144, 44, 46,
-186, 35,170,110, 55,229,250, 7, 52, 18,174,242,223,157, 52,108,129, 60,185,241, 78,191, 36,232, 74,221, 39,200,138,149,221,239,
- 96, 55,168,119,149,117,191,144,232, 90,107,209, 42,159,107, 66, 58, 20,253, 36,223,195,158, 75, 90, 91,105, 12, 10,252,121,145,
-192,214,238,217,101,153,166, 85,115,195,150, 95,200, 94,173, 7, 52,123, 54, 46,175, 72,116, 80,113,130, 69, 89, 41,172,139,243,
- 66,204,211,198,132, 71, 32,203, 97, 41,104,204, 99,164,129,138,251, 73,184, 85, 49, 44,251,236, 69,101, 80, 27,148,238, 96,151,
-250,243, 2,198,126, 63,224,253, 63,252, 29,252,147,127,246,111,241,193, 52, 98, 55,114,231,229,223,214, 27,209, 94,154, 88,112,
- 29, 1, 86, 55, 76, 91, 76,180,243, 47, 95,231,147,215,226, 75,209,246,122,186,198,146,182, 11,249, 5, 57,189,198,174,210,102,
-149,212,123,179, 75,175, 20,243,106, 5,171,143,146,166,231, 60, 59,233, 75, 27,153,231, 27, 18,250, 59,151, 60,189,183,246,211,
-143, 88,208,203,138,227,199, 62,243, 25,100, 81, 39, 90, 81,229, 44, 20,238, 65, 22,179, 46,221, 29, 14,230,213, 30, 66, 35,171,
-178,207, 55, 37,155, 34, 74,100, 41,220,160, 37,240, 0, 34,147,123,229,148, 92,118,230,153,245,220,250,219, 83,221, 39,219, 62,
-254, 9,206,211,236, 89,238,177,202,211,198,113,128, 16,225,120,116, 51, 24,223,117,146,250, 68, 63, 77,206,160, 54, 72,127, 55,
- 12,184,217, 31,140, 4,235,182,171, 37,243, 93,253,224, 39,135, 86,231, 41,225,116, 60, 66, 37,185,247, 55, 33,137,224,120, 58,
- 98,154, 38,136,199,132, 78,201,154,135,133, 63, 73,216,143, 1,251,253, 30, 28,173, 97, 24,135,136, 48, 88,218,150, 90,180, 23,
-146,199, 13,103, 81, 68,182,130, 54,207, 25,243, 52,155, 47,123, 49,141,202, 69,146, 71,216,237, 45,131,189, 64,123, 54,165,251,
-170, 48,144, 23,162, 80,179,232,201,119,212, 69,194,197, 30,250,210, 82, 98,205,243, 61,120,226, 88,145,251,154, 52, 79,253, 51,
-165,110, 78,127,195,166,212,255, 57, 48,112, 62,220,224,159,253,198, 95,227,103, 62,249, 13,124,251,151,127, 1, 79,223,253, 50,
- 14, 79,158,248,125,228,228, 74,182, 16,159, 65, 19,158, 29, 34,198, 39, 55,160, 97,103,208, 53,155,107,222,121, 74,200,211, 4,
- 86, 39, 85, 54,156, 19,162, 50,178,185, 74,131,129, 33, 88, 51,163, 76,238,246,151,221, 83,192, 24,159,236,126,250, 28, 44,128,
-200,124,218, 25, 68,209, 86, 73,129,129, 16,145,192,134, 32,193,155, 9, 10,117, 5, 66,154, 1, 94, 76,181,132, 22,136,158,144,
-151, 49,148,185, 35,170,195,137,214, 1,130,192,118,102, 41,115, 55,240,145, 79,242,231,204,152, 39, 5,230, 19, 72, 78, 32,216,
- 26,137,139, 37, 41, 81,123, 94, 81,135,235,147,135,127,180, 46,114, 92,123, 13,109, 44, 87,169, 51,157,193, 74, 18,166,186,189,
- 57,164, 21, 66,211,193,232,212, 18,224,218,201,220,141,240,169,149,147, 93, 30,108,210,188, 22,169,108,254,117,154,153, 94,200,
-187, 8, 11, 90,160,144, 70,230,183,192,182,109,106, 93,150,197,152,166, 53,212, 41,180, 66,209, 86,163,236,250, 88,233, 41,204,
-237, 36, 90,118, 45, 82,244,223,218,255,221,170,121,175,132,190, 30,233,162,213,251,107,137,132,109, 7, 36,205,123,232, 40,214,
- 94,216, 15, 67, 64, 60,189,194, 57,155, 86,148, 86,153,232,253, 68,216,163, 8,229, 95,234,126,125,211, 49, 77, 47,136,114,237,
-175, 16, 2,110, 95,189,192,251, 63,248,192,164, 69, 88, 88,248,218, 73,235,122, 20,188, 52, 98, 61,243,156, 55,106, 54,117, 77,
-223,195,229,185, 29,189,129,149,117,222,230,129, 54,167,140, 31,255,241,159,192,123,239,126,218,204, 84,222,128, 30,183,245, 20,
-162,143,217,221, 63,174, 77,185,175,129, 24, 98,196,243,183,222,198,221,221,177,178,180,231,121,178,130, 87, 86, 83,108,110,112,
- 97,136,136,195,208,226, 75, 70,198, 74, 9,199,243,185, 50,184,207,147, 57,198, 17, 7,164,108,177,166, 92,179,207,185,154,181,
- 20,125, 53,193,140,101, 84, 4, 67, 8, 8,113,192,237,221, 9,146, 51,134, 33, 26, 23, 69,204, 62,180, 24,193,204,231,201,208,
- 65, 49,180, 32,165,108,132,182, 52, 87, 86,126,145, 45,138,163, 82, 55,135,157,103,143, 79, 80, 53,134,241, 60, 79,230, 42, 55,
-153,239,253, 52,157,113,158, 28, 30, 87,197,221,241, 8,145,180,216,128, 6,243,128, 31,124,245, 80,204,171, 66,113, 58,147,236,
-201,157, 37,165,139,234, 30,254,246,238,132,187,227,209, 72, 97,254,169,165,172, 16, 73,245, 3, 28,135,136,113, 55,186, 12,140,
-145,230,108, 33, 39,187,193, 81, 0,223,253,122, 35,146,178,152,175,123, 48, 84, 34,169, 41, 11, 36,153, 61,172,105,225,197,253,
-247,237,254, 63, 39,193, 60, 25, 26, 48,207, 9, 44,201,146,208, 56,150,249,108,203,117,228,135,186,191,222,189, 81,252,111, 31,
-124, 10,191,243,207,255,103,252,151, 95,252,115,188,251,141, 95,198,167, 63,253, 14,110,222,126, 7,113,119, 48,107,222, 33, 96,
- 63,142, 8, 49, 98, 24, 24,227,254, 0,142,123, 87, 93, 24,225, 81,201, 10, 63, 73, 2,179,154, 41,142, 67,237,102,230,179, 52,
-244, 70, 12, 12,160,104,107, 32, 4, 67, 3,212,157,231, 10, 97, 92, 26, 14, 65, 82,251, 44, 32, 98, 5,153,140, 20, 61,103,194,
-148, 4,121, 78, 8,154, 60, 7,192, 28,250,230, 76,206, 83,144,230,177,168, 91,253, 74,167,248,178, 58,106,223, 39, 71, 80, 44,
-240,221,131, 95,130, 71,206,106,173,119,194,192, 41, 51, 78,103,130,158,207,190, 18,200,224, 11,253,178,162, 87, 89,107,157,183,
- 43, 41,172,200,176, 10,240, 44,126,177,134, 70,171,222, 66,241,116,207,198,178, 85,236,174, 77, 53,168, 33,158,113, 7,173,163,
-217, 81,175,118, 3,221,174, 94, 87,147, 75,223, 88, 72,159, 32,191,250,127, 15,197,227, 66,159,189,222,203, 46, 70, 43, 1,189,
-142,155, 33,139, 76,174,149,146,161,236,129,219,247,184,220, 0,117, 34, 43,187,243, 98, 71,219, 53, 24,107,114,224,242, 58,105,
-115,215,222, 78,175,210, 21,143,197,232,102, 97, 15, 11,145,195,117,168, 33, 22, 23,147,180,246,215, 79, 21,117, 5, 65, 88, 50,
-178,239,155, 14, 11, 83,119, 11,150,103,118, 5,196,170, 9,168,143,215, 48,253, 93,253,129, 24, 92,118,216, 46, 4,114,190,232,
- 42,233,106, 58,241,149,189, 32,240,232, 29,122,219, 68, 37, 1,146,188, 65, 84,252, 21,211, 37,136, 62,170,237,208, 7,213,124,
- 15,191,135,130, 62,157,142, 37,200, 69,235,228,193, 76, 93,212, 38, 51, 99, 24, 70, 63,104, 25,228,146,177, 24, 2, 32,217,100,
- 56, 10,220,236,247, 62, 1,145,219, 6,219,238,156, 30, 72,104, 25, 0, 0, 32, 0, 73, 68, 65, 84, 66, 52,131, 22,127, 76, 17,
-211,224,198, 33, 0,190,139, 38, 14,184,189, 61, 66,114,178, 48, 18,209, 26,244,194, 49, 98,206, 9,105, 58, 87,227, 21, 21,155,
-132, 83, 78,238,208,102, 69,223, 24,242,192,221,221, 9,243, 52, 33, 4,243,158,223, 31,246,102,193, 11,219,171,158,206, 19,142,
-119, 71,204,167, 51,142,199, 19,238,238, 78, 72,243,140,156,103, 71, 95, 22,189, 55, 66, 48, 95,118,168,185,229, 57,203,125, 28,
- 71,220,157,103,164,249,140,113, 8, 8,209,140, 86,198, 64,120,250,244, 6,227,206, 44,127,231,105, 70, 78,246,254,167,148, 33,
- 98, 68,195,154, 63, 47,110, 46,227,146,190,224,250,118, 67, 53,200, 87, 31, 70,170, 43,166, 41,217, 89,244, 62,106, 34,137,153,
-236,192,253,206,197,215, 91, 89,115, 85,191, 64, 21,145,213, 86, 4,100, 22,180,204,134,192, 40,155, 77,222, 99,182,233,173,140,
-237, 26, 77, 62, 2,136,207,247,248,239,255,245,107, 12,255,225,127,192,183,190,253, 14,158,125,230,171,120,246,214,219,120,254,
-236, 57,110,158, 60, 69, 28, 15,136,113,192, 48,238, 16,195,136,195, 8,240,238, 0, 38, 43,118, 44,132,145,197,115,207,203,226,
-143, 93,121, 96,196, 72,165, 96,245, 40, 48, 18, 49, 82,182,251,130, 84,204,186, 59, 68,100, 71, 48,202, 62,157,104,201, 54,207,
-217, 81, 16, 73, 32,228, 26, 94, 83,149, 4, 57, 65,188,176,199, 64, 32, 30,205,172, 38, 89,168, 78,158,205, 66, 24,154,124,192,
-165,186,123, 23, 63,103,181,154,127, 21, 40,190, 60, 62,154,122,167,125,112,151,147,163,143, 9, 56,157, 50,228,116, 2,201, 17,
-177,192,163,129,109, 23,144,176,236,211,213,221,114,114, 83,208, 47, 38,108, 47,234, 92, 9,119, 84,255, 76,138, 60,124,101, 59,
-187,117, 59,148,195,149, 26, 87,187,222,126, 78,251,155, 5, 10, 85, 94,216,219,132, 14,138, 23,244,113,170, 23,254,244, 40,200,
- 66,113,145, 91,182,222, 23,154,103, 90,138,174, 21,227,242,229,209,142,173,173,133, 63,208,145, 10,171, 90,116, 97, 73, 82,111,
-221,208, 89,228,170,237,251,165, 65, 73, 90,189,113,113,182,227,141,199,211, 46,172,206,155, 17,162, 75, 93, 54,168,147,153,105,
-155, 54,231,252,135, 34,167,214, 54,196,187, 35,178, 93,198,177, 58,244,211,193,234, 90,195,127,214, 5,101, 9,228,185,132,229,
- 55, 88,240, 87,156,219,180,193,165,141,184,153,145,105,192, 23, 62,255, 57,188,252,248, 3,124,248,226,149, 39, 83,233,197,114,
-165, 79, 25,120,200,104,166, 55, 84,106, 92,125, 54,255,170, 54,238,123, 97, 8,248,254, 95,253, 5, 20,230,196,166, 15, 25,219,
-232,234,109,106, 35,147,124, 4,201,248,225, 41,233, 49, 5, 29, 72, 41,227,229,203,215, 96,182,184, 78,242,105, 88,107,230,117,
- 49,162,113, 15,118,104,221,213, 14, 62, 73,176,155,206,204,211, 4, 82,193,205,211, 27,140,187,177, 66,216, 70,144, 51, 7,136,
-156, 18, 16,205,147, 59,120, 22,123,150,140, 49, 70, 16, 15,120,117,123, 11,201,201,118,197,176,215,199,204,216,239,134,186,159,
-100,247,246, 38,247,155,135,123, 29,156,166, 25,131,239,150,130,239,179,247,187,209,156,232,166, 9,115, 22,223, 75,155,203,164,
-101, 98, 4, 28, 79, 39, 76,238, 84, 39, 57, 35, 70,242,248,210,140,192,140, 57,217, 46, 77,189, 96,134,192, 53,123,123, 28,108,
- 29, 32, 57, 97, 55, 90,211, 51,139,101,161, 43, 51, 78,231,100, 5, 3,140, 33,154, 94,121, 78,158,234,166,130,209,119,240,240,
- 52, 71,130,233,237, 99,224,154,174, 38,112, 35,147, 16,161, 72,128,136,187,221, 69,204,105, 70, 22, 11, 45, 17,138,149, 52, 90,
-114,202,197, 83,208,170, 10,199, 87, 84,196,102,197, 27, 41, 67,133,221,245, 78,125, 82,236, 93, 7,183, 67,143,174, 28,242, 27,
-206,164,239, 30, 20,191,253,254,167,241,171,255,244, 95,225,191,253,249,223,196, 95,252,244, 47, 35,221,125,128,145, 18,120, 24,
-144,241,202,131,102, 50,118, 35, 35, 12, 59, 80, 30, 0, 4,140, 44, 56, 13,209,215,115, 12, 81,134,230,212,156,161, 37, 55,157,
- 48, 43,129, 61,208, 6,106,236,247,228,185,246, 76,106,153,233, 98, 77,102,118, 35,152, 0,128,130,217,242,154, 17,140, 13, 57,
-101,226, 30, 96, 97, 49,194,138, 89, 8, 57, 1, 67, 72, 24, 66, 64,162, 1,146,212,148, 8, 69,141,131, 84,173,198, 77, 21, 38,
- 75,176, 21,181,138,150,133, 0, 93, 8,117,229,159, 4,234, 8,235, 32, 67, 92,142, 25,144,179, 96,119, 58,131,179,218, 94, 34,
-195, 37, 85,110,167, 23,157,108, 81, 7, 19,135,155,251, 9,145,124,223,190,200,224,164,153, 70,185,250,223, 54,132,166,149,129,
- 70, 39,105,107,143,173,213,207,181, 36,179,110,194,215,203, 32, 22,110, 38, 86,189, 42,119, 43,107,130,133, 59,192,213,145,174,
- 55,147,233,166,201, 2,147,151,102,128,184,155,144, 85,196,172, 94,219, 73,147,168,154,246,132, 85, 64,206, 2,177,219,245,205,
-104,246,253,210, 78,161, 84,155, 10,105,244,242, 11, 41, 80, 23,228,161, 69,216,181,213,145, 95,162, 11,104, 86, 35,232, 32,237,
-214,249, 78,123,123,216,110,135,175, 93,113,173,211, 63, 97,115,215,191,254,134,223,199,138,111,145,128,251, 72, 97,181,249, 40,
- 9,119, 42,248,224,227, 79,112,119, 78,206, 66,190, 36,155,235,163,202,228, 10, 79,234, 8,138,122, 15, 49,190, 49,149, 33, 59,
-136,247, 55, 7,124,250,157, 79, 85,249,225, 67, 79,215,242,239,116, 29, 6,247, 35,252,122,172, 59, 95,241, 86,255,139,191,252,
- 75,192, 9,110, 57,101,204,105, 70,202,217,101,100,168,153, 1,236, 59,240, 24,130,197,129,114,172, 94, 8, 28, 2, 56,114,181,
-188,140,195, 0, 34, 96,183, 27, 48,196,136, 33,154,190, 56,142,195,162, 14, 96,143, 93, 21, 91, 95,156,167,147,217,174,178,183,
-225,140,154, 63, 94,160, 74, 49, 47, 85,107, 18, 10,193,205, 37,107,121,158,145,210,108,196,189,211,185,154,189,100,135,232,111,
-111, 79, 56, 29, 79,230,205,224,150,155, 57,219, 78,251,116,154,112, 62,159,171,129, 82,206,230, 96, 39,158, 54,152,230,212,216,
-204,134, 26,253,201,193,138,116, 12, 4,144,165,189,237, 6,155, 48,167, 89, 48,207,103,164,233,108,141,195, 52,185, 23,187,123,
-210,147,177,213,179, 75,253,202, 36,151,221,250,181, 38,178,121,113, 46,186,122, 34,246,224,151, 37, 63, 61,101,227, 7, 48,156,
-128,199,238, 8,226,135,181,197,130,114, 61,168, 83, 54, 87,180, 16,108,191, 94,144, 15,155, 34,249, 1, 22,231,149,206,244, 74,
-183,201, 10, 60,121,107,196, 63,249, 45,194, 95,253,218,127,135,159,251,242, 29, 14,159,253, 38,194,112,192,211,195,136,167,207,
-158, 33,238, 15, 38,113,214,140, 24, 35,110,134,128,221, 62, 2, 97,135, 73,109, 34, 14,174,164, 0, 17, 34, 21,233, 98,168,251,
-109, 14, 70,188, 28, 73, 77, 58,232,147,118,206,100, 22,187,200,238,128, 88,194,134,108,173, 3, 17, 68,118,239,133, 24, 49,107,
- 64,158, 25,200,166, 45, 55,106,124,132, 80, 64,202,132,105, 18, 80,154, 48,114, 54, 54,126, 24,109,234, 22, 79,242,146, 12,169,
-213, 97, 89, 1,233,170, 38,224, 66, 96,147,235, 98,171,102,109, 96,137,169, 21, 98, 28, 51,112,119, 86,132, 47,127,254,189,239,
-156,110, 39, 99,171,186,235, 27,161, 53,146, 41,105, 94, 27,250,222,134, 57, 46,205,135, 72, 77,250, 58, 81,239,180,211,126,192,
- 61,109,105, 29, 40,210, 20,240,117,226, 23, 53, 90,239,246,181, 16, 86,236,114,106,210,206,122,167,226, 37, 79,188,120, 2,211,
-170, 64,161,121,158,203,198,160,107, 70,219,189, 56, 90,159,223,133,159, 64, 14, 9,181,100, 64, 90,201,248,150, 63,100, 96, 67,
-183,216, 6, 7,160, 34, 31,237,117, 90, 12,115, 43,177,102, 67, 89,192,104,179, 8,104, 67,250,215, 71,156, 96,227,250, 95,124,
- 79,105,249,188, 85,183, 29,161, 31,150, 83,209, 35,224,105,234,124,221,117, 45,249,242, 87,127,188,187, 53,120,212,131, 57,186,
-148, 74,234, 83,214,136,112,225, 97,173, 85,221,176,137, 43,110, 92, 43,244,186,121,162,229,243,129,130,217,200,126,243, 60,221,
-127,202,173,179, 81, 59, 67,138,199,182, 31, 63,202,182,179,127,176, 57, 37,124,245,107, 95,131,170,224,116, 58, 98,118,151, 54,
-114, 47,153,148, 76,147, 61, 39,155,180, 85,205, 51, 61, 57, 67,123, 73, 99, 3,210,156, 48,140, 35,158, 62,127, 14, 10, 30,164,
-225, 94,218,226, 80,186, 89,195, 26,204, 27, 8,181, 1, 40,205, 72,240, 4, 52,109, 37,163,141,197,108, 69,129,200,204, 63,202,
- 79, 21,242, 85, 65,157,138,157,114,245,144,119,169, 86, 74,150,235,144,146,224, 60, 77, 72, 41,153,222,217, 93, 17,139, 92,205,
-118,214,118, 90,150,243, 35,184, 26,128,136, 48,198,136, 57,171, 17, 0, 99, 0,152,240,236,102,135, 48,238,145, 82,174, 49,211,
-167, 57,227,120,188, 5,139, 5,172,132, 24, 43, 15,165,216,140, 70, 82,140,227,128, 57,163,230,156, 3, 86,172,169,192,192,121,
-118,150,123, 48,169, 91, 96, 80, 8, 62,157, 75, 37,215, 69, 15,190, 41,152,100, 8,132, 12,182,207,193,157, 42,139,172, 45,149,
-228, 19, 85, 68, 2, 78, 26,240,234,147,215,224,116,123, 53,204,101, 77, 99,121,140,195,210, 33, 2,127,122,187, 71,254,243,255,
- 27,255,245, 47, 28,112,247,147,255, 16, 31,127,240, 26,124,126, 1,138,140, 44,140,168,130,247,158, 7, 60,123,239,211,152,194,
- 59,200,115,134,228, 25,231, 36,152,238, 78,192,124,135, 12, 69,202,234,188,132,106,151,234,193, 81, 90,125, 79,137, 25, 89,172,
-201,130,100,244, 86,102,203, 56, 83,138,104, 73,183,204,204,150,149, 46, 25,130,100, 87, 85, 60,187,221, 31,129,155,128, 46,134,
- 41, 58, 2, 45,193,227, 4,117,107,216,197,130,189, 13,120,129,234,245,139, 70,168,105,118, 29,194, 72, 75, 29, 9,113,135,240,
- 83,159,127,239, 59,230,138, 68, 72,101, 18,247,105, 91,186, 51,124,129,108,181, 41,102,133,225, 44, 23, 90,229,246,103,169,145,
- 24, 97,187, 40, 52,187,250, 11, 28,144,214,147, 89,195, 98,111,226, 99,150,130,223, 22, 30,221, 44,156,186,113, 18,234,134,161,
-130, 18,109, 54, 34,107,170,245,186,248,213,107,230,204,255,174,159,165, 94,199, 86,210,158,168,105, 16,212,159, 91, 43,181,239,
-130, 1,183,200,233,154, 12,243, 98,186,210, 94, 19,162, 75, 3, 20,166,158,128,213,226, 18, 75, 86,248,234, 91, 73, 91,133,188,
- 93, 49, 95,198,135,221, 87,200,183,255,108,173,144,216,130,149,169, 99,104,183, 79, 91,158,186, 55, 89,209, 14, 9,106, 33, 44,
-108,188,159, 11,180,223, 11, 65, 81,121, 44,235,131,254,125,148,232, 74,172, 52,169, 37, 72,228,116, 62,249,207,242,227,170, 51,
-225, 13,204,225,187, 62,224,135,222,163,119, 59,207, 24,241,193, 7, 31,226,115,159,251, 28, 62,251,217,207,224,163,143, 62,130,
-200,226, 60, 89,236, 88, 37, 43,206,231, 83,213,142,159,206, 39, 67,165,162,185,158,193,201, 91, 41,101, 16, 3, 55,207,158, 97,
-140, 35, 78,167, 9,211, 52, 87,159,116, 43,206,206,200, 97,151,246, 64, 92,255,238,242, 35,151,175,229,226,173,238, 82,184,253,
-126,143,185, 18,235, 66,109,132,146,179,188,199, 49, 90,179,172,132, 97, 48,100, 96, 24, 34,118,187, 1,227, 56, 56, 41, 45, 99,
-246,201,126,158, 19,210,156, 61, 18, 85,220,241, 44,122,163, 82,246,213, 90,137,125,133, 24, 71, 76,150, 91,128,128, 57, 77, 56,
- 12, 17, 74,140,195, 46, 34,238, 14,184, 61, 77, 6, 3,131,240,234,238,132,219,219, 87, 24, 72,140, 25, 95, 45,185,125,173,232,
- 41,114,204, 17, 2,207, 98,159,167,106,125,154,179,214,181, 72, 33, 80,134,146, 2,230,232, 86, 40, 55,179, 7,199, 88, 65,119,
-159, 13, 14,230, 67,226, 40, 64, 25,132, 2,147,195,209,185,254,126, 8,150, 22,246,242,213, 17, 56,191,222,116, 37,236,136, 88,
-111,232, 75, 51,142,140,239,254,185,224,107,250,127,225, 23,126,233,103,241, 98,255, 77,220,189,124, 1, 73, 71, 76, 2,228, 41,
-227,237,113,198,225, 83,207, 49,133, 79, 33, 21, 14,130,223, 23, 73, 50,166, 36,208,148, 0, 73, 85, 70, 86,206,240,226,197, 46,
-206,113,130, 51,231, 43,233, 83, 96,220, 39, 82,139,103,109, 73,227,174, 74, 16, 49,190, 20,113, 70,166, 0, 18,170,126,238, 65,
- 45,214,150,162,217,194, 38, 98, 32, 3,172, 9, 49,170,125,190, 60,212,179, 71, 29,198, 47,231,145,247,184,205,170,141,186,248,
-235,146, 38, 87, 81, 97,223,235,115,173,127,246, 56,227, 48, 46,167,139,172,116,101,101, 7,110, 13,101,221, 8, 55,122,238, 5,
- 75, 47, 58,193,178,208, 23,237,113,246, 53,105,173,133,204,215, 18,184, 77,118,252, 34,229,235,182,223,109, 41,226, 11, 34, 28,
-213,221, 17,161,117,162, 91,171, 43,218,199,105,244,230,237,206, 89,183, 57, 0,253,194,128,112,197, 59, 12,197,227,219,236, 96,
-253,231,152,186, 53,193,165,188, 79, 59, 11, 83, 93,177,167,168, 54, 12, 61,115,191,141,121,109, 53,251,218, 53, 89,139, 86,252,
- 82,228,165,157, 23,250,114,125,181, 18,244,176, 34,228,105,219, 20,181, 95,106, 92,243,108,167,141,161,151, 22, 89, 96, 5, 44,
-184,227, 20,172, 22, 8,117,191, 7,185, 31, 8,124,112,162, 64,175,239,239,215, 21, 27,236,124, 90,239, 16,215,127,182,240, 43,
-234,106,195,141, 52,238, 35, 24,117, 13,175, 62,174, 16,235, 99,127,239,135,192,238,153, 25,146, 19,254,227, 31,252, 71,236,198,
- 29,130, 7,122,168,239,148,107, 35,161,102, 68,147, 82, 50, 82, 26, 7,196, 97, 88, 96, 98, 11,176,182, 85, 68,202, 38, 27, 10,
- 6,235,102, 39, 47,218, 46, 89, 17,227, 96,206, 89, 94,236, 11, 25,142, 24, 8, 49,212, 12,246, 24, 67, 93,125, 29,246,123, 99,
-211, 59,153, 79, 11, 84,236, 65, 50, 28,216,144,200,121,134,136, 5,188,152,196, 49, 64, 17, 48,229,197,183,129, 8, 30,234,146,
- 16,163, 77,182,165, 73,176,156,121,107, 14, 36, 75,213, 70,155, 51,155,212,251, 32,171, 57,204, 5, 50, 62,197,147,155, 17,135,
-155, 27,156,103, 65,158, 78, 32, 50,105,223, 60, 79,230,160,198,182, 6,152,230, 84, 37,108, 75,188,179,105,228,179, 91,153, 18,
-212, 27, 14, 99, 91,115, 73,158,115, 95,119,109,191,119, 34, 30,205,234,154,124, 54,210, 88,100, 35,236,153, 36, 43,215, 38,158,
- 92,177,144, 83, 50,235, 81, 10,221,106, 99, 8, 10, 30,134,199, 57,201, 61,194, 22,190, 93,163,222, 4, 69,126,254, 22,254,209,
- 63,255, 8,223,251,213,127,140,111,124,254, 14,239,126,225,103,176,127,242, 14,118,187, 17, 52, 68,124,116,199,152, 94,190, 66,
-208, 91,131,187,149, 49,137, 35, 10,236, 77, 87, 12,230,127,206,206, 22,175, 86,174, 77,138, 39,140, 68,203,129,160, 20,235, 46,
-189, 20,203,224,188, 16, 43,238,140,192, 10, 79,180,241,100, 60, 5,107,225, 38, 40, 6, 38,148, 91, 60,147, 34,129, 45,241,148,
-128,179, 16, 78,179, 66,211,140,128, 12, 13,140, 76,177, 74,164,197,211,248, 76, 6, 89,252,226,217, 51,215,139,242,201, 82,225,
-168,157,204,105, 53,136, 53,168, 97,248,210, 79,190,247,157,211,105,114,148,197,253,105,209,106,164,151,209,190,221, 5,107, 67,
- 14, 99,223,171,235,106, 82,160,134, 48,119,193, 51,166,203,161,100,107, 30,187, 6,189, 99, 13,211,211,229,196, 89, 36, 76, 76,
-151,243, 76, 59,221, 86, 82,130,155, 13, 16,174, 5,110, 93,102,149,119, 28,170,246, 96,214,214,166,148, 54,216, 76,212,172, 15,
- 20,232,204, 85,219, 41,154,214,168,243,106, 53, 65, 23,175, 77,239,153,134,137, 86, 88, 67,145,222,233, 5,186,222,161, 21,145,
- 24, 35,195,125, 11,180, 97,113,234, 37,145,204,255,108,107, 16,223,154,206, 55, 61,222,155, 98, 89,255, 92,239,233,254,238,181,
-151,165,238,126,124,163,242, 86,110,124,208, 61,252,128,141,103,212,213,139,188,188,153,183, 15, 56,237, 21, 10,111, 2,185,255,
-168,123,244,205,105,125,176,105,253,167,191,242, 21, 60,123,254, 12, 63,248,193, 15, 60, 19, 64, 42, 20,158,230,217,184, 36,115,
- 90, 34,137,221, 49, 13, 88, 53, 0,146,177,191, 57,224,240,228,105,253, 84,166,169, 64,250,118,207, 84, 41, 91, 12, 78,168, 99,
-247,176,231, 10,138, 22,120, 43, 4,194,225,176,199, 60,155, 55,123,201,108, 47, 28, 21,246,169, 53,120,194, 25,121,226, 26, 51,
- 59,163, 88,160,190,179,206, 41,131,212, 86, 14, 41,153,244, 80,178,105,196,179,187, 26, 22,169,164,136,201,159, 76, 95,238,223,
- 5, 21,236, 92,107,207,197, 71, 28,132,253,126,103,146, 36, 8, 98, 8,238, 55,225,140,247,156,234, 52,156,197,214, 0,195,104,
-211, 61, 42,100, 30,144,132,160, 57, 89, 50, 27,199,154,215, 94,238,128,192,168,105,111,129, 44,168,165,246,153, 30,224,162, 46,
-169,179,107,226, 5,170,174, 40, 22, 14,141, 22, 85, 24,216,185, 1, 86,224, 50, 17, 94,222, 38,228,219, 79, 76, 58, 6,218,100,
-201,252, 80,123, 30, 40,158,140,192,159,188,222,227,197, 31,255, 17,126,229,103, 50,246, 63,245,159,227,110,138,144,243,201, 76,
-122, 38,193,123,135, 51,244,249,219,120,117, 62,224,124,247, 26,167,211, 17,167,227, 9,243,233,206, 39,247,180, 72,103,125,141,
- 93, 89,229,117,128,181,221,145, 58,209,185, 68,169,146, 79,142, 54,203, 47, 57,233,170,141,150, 71, 23,150,186,210,194,245, 42,
-153,233,130, 96,103,159,203,223, 10,202,103, 46,146, 82,211, 11, 91,181, 84, 69,122,125, 85,162,212, 24,159, 41,249, 32,157, 11,
-249, 1, 37,139,165, 87,143,217,107, 29,198, 1,225, 75,159,123,239, 59,199,211,180,152,154, 96, 29,113, 74, 87, 60, 61,168,209,
-136,183, 19, 96,255,103,237,228,140, 43, 59,245,107,207,181,253,215,250,189, 48, 45, 14, 3, 27,115, 50,213,124,219,182,224, 45,
-147,188, 94, 17, 3,109, 65,214, 61, 92, 78,235,150,132,180,203,227,174,152,122,167, 89, 71,125, 78, 82,244,145,181, 74, 29, 51,
-253,242, 90, 45, 69, 82, 91, 50,211,186,209,216,154,108,233, 18, 20, 70, 3,203,117,235,102,234, 35, 85,187, 47, 2, 8,209,223,
-124,214,102,143,238,111,104,139,125,253,216, 34,254,240,206,157,250, 75,122,181, 70,210, 69,115,242, 6, 6,176,143, 40,155,143,
- 11,111,169, 13, 19,189, 65,245,109, 9,135,143, 68, 27,104,235,121,239,225, 0,188,233,175, 16, 34, 94,124,252, 2,207,223,122,
-142,175,127,237, 43,120,255,253, 31,224, 60, 77, 75,192, 11, 80,247,206,229,144, 74, 73,124,146,164, 74,184, 3, 44,178, 50, 39,
-243, 59,120,250,252, 25, 66, 24,170, 30, 58,165, 92,223, 69,206,217,200,115, 28, 60,233,109,129,136,155,101, 23, 24,100, 83, 92,
- 28, 48,207, 22, 78, 18,152, 23, 26, 82,206, 14, 67,103,220,236,119,134, 2, 52,150,195, 67, 12,230,142, 55, 26,169,207, 34, 82,
-151,137,110,158, 18,114, 50,126, 64,242,215,174, 82,179,181,144, 44,245,163,154,223,236,199,136, 56,238, 60,251, 92, 49, 12, 86,
-128, 99, 40, 78,109, 3, 56, 68, 39, 26, 78,102, 67,238,110,118, 57, 11,134, 96,142,111,134, 4,180,190,210,102,116,163, 57,153,
- 28,208, 13,101,218,148, 68,109,162,163,217, 45, 79, 1,170, 50,182,200, 11, 18, 70,108,136, 7,123,184,118, 33,117, 22,183, 76,
- 38,212, 93,187, 22, 77,149,127,255, 95,221,206, 72,119,159,120, 74, 37,221,115,243, 63,124,191,215,134, 93, 23, 33,201,126, 31,
-241,251,223, 35,156,254,244,187,248,197,159,125, 11,251,191,243,243,120,117, 6,210,249,132, 65, 51, 62,117,200,200,207,222,198,
-221,116,131,249,248, 26,167,105, 66, 62, 27, 9,114,154, 51,242, 52,193,204,208,187,229,111,227, 23,218,103, 62,100,113, 27, 86,
- 42, 12,116,174,249, 6, 69,190, 87,174,139, 74, 6,171,175,136,136, 59, 4,181, 69, 40,217,141,169,216,125, 28, 64, 92,243,231,
-217,149, 4,197,223,161, 58, 33,170,177,225,213,141,224,202,231,202,133, 37, 95,247,240,212,216,138, 47,242,225, 18, 7,190, 27,
- 6,132, 47,255,228,123,223, 57, 29,207, 21, 1, 22, 45,133,129, 26,134,123, 47, 32,215,238, 48, 95,158, 0,234,188, 1,127, 49,
-151, 90,219,166,175,160,203,253,116,187, 31, 39,244, 1, 88,212, 21,241,166, 5,104, 8,111, 53,237,109, 21,231, 90,205, 96, 90,
-102,252,149, 6,131,188,216,147, 46, 5, 82, 47,134,109, 90,224, 14,234,129,252,182, 8,111, 77,196,168,187,242,229,204, 45,186,
- 71,162,109, 62, 1,249, 14,188,151,159, 45,215, 81, 47,246,221, 13, 57,144,154,120, 86,106,143,196,126,128, 92, 18,135,174, 53,
- 3, 54,249,204, 46, 93, 42,133,103,201, 93,239,201,120,143, 33,193,221, 55, 89,211,125, 28,136, 55, 41,209, 43, 54, 29, 61,182,
-178, 18,176, 34, 12, 60,234,121,151,157, 23, 93,172,154, 30,122,186, 66,222,123,147,130,190,246,120,127,172,234,254, 77,127, 29,
-143, 39,124,235,219,223, 70, 96,224,245,171,215,198, 44,119,146, 27, 26, 25,171,170, 26,129,204,125, 7,164, 73, 11,179,105,216,
- 38,162, 39,207,158,130,131, 21, 99,243, 75,207,117, 63, 29,221,201,171, 24,113, 20, 67,149,210, 24, 4,182,172,112, 98,198,126,
-127, 64,202,130, 52,207, 96, 98,203,124,135, 71,173,170,218, 68, 43, 54,153,143,227,224,236,117,155,240, 99, 8,190, 87,223,227,
- 56, 37,156, 79,103,204,105, 46,176,143, 49,231,115,242, 9, 61, 89,129, 35, 96, 55, 14, 80, 48,230,121,194,232,228, 59,130, 69,
-125, 10,156,185,238, 7,118, 12,140, 33, 70, 95, 63,176, 55, 65,150,195, 94,220,243,140,169,111,136, 0,113,112, 50,156, 27,123,
- 5, 50,120,185,152,152,136, 86, 39, 56,162,133,197, 30, 60, 14, 54,144, 33,142, 57,139, 23,103,211,167,179, 10,194, 48, 44, 70,
- 86,222, 80,192, 73,164, 89, 22,147, 44,214,108,201,109,162, 24, 72,144, 41, 66, 82,194, 24, 21,119, 18,113,247,242, 21,130, 78,
- 29, 19,126,189, 30,124,164,196,226, 98, 88, 10, 4,240,126,196,255,254,199,103,204,127,244, 91,248,229,191,247, 12,251,159,254,
- 47,240,226, 21, 65, 78, 47,113,136, 2,218,239,113, 59,239, 48, 31,111,205,239,252,108,159,219, 60,103,104,178,245,133,144,169,
-144, 52,107,213,156,151,149,101, 97,241,151,149,138,145,235,146,161,144, 62, 48,219,208, 46,203,249, 70,168,105,111,197, 97,142,
-155, 63,140,205,116, 91, 46, 65, 6, 60, 12,198,126, 51, 22, 83, 47,231,141, 16,147, 59,215,177, 91, 9,243,178, 50, 38,172,194,
- 93,176,228,174, 87,228,129, 58, 5, 18, 65,109, 82,255,226,231,222,251,206,241,120, 54,202,253, 18,208,221,147,196,154, 2, 78,
- 45, 65, 10,107,205,245,226,203,174,155,211, 18,117,197,143, 46,183,231, 15,192,239,205,174,124, 85,141,203,227, 15, 68, 8,164,
-173,147,123,227,242,198, 30,106,223,175, 3,104,163, 16,215,169,151,250,215,219, 74,225,116, 69, 46, 83,186,143,137,188, 76,237,
-221,102,152,108,129, 81,118,199, 76,151,200, 0,220,209,111, 81,220, 45, 72, 72,167,176,167,109, 70,122, 87,142,168,231, 78,182,
- 57,243, 11,173,156, 46, 30,167,220, 26, 68,218, 52, 53,165,169,235,159, 71, 55,152,250,219,141,194,195,172,247,174,113,211,246,
- 57, 23,126,234, 53,168,191, 37,198,233,170, 17,122,212, 96,254, 67,141,248,203,250, 65,233,113,127,189, 34, 90,122,217, 28,190,
- 9,211, 93,255, 6, 97,247,118,210,143, 49,226,253,247,223,199,167,223,253, 49,124,249, 75, 95,196, 71, 31,125,104, 14, 94,206,
-109, 40, 59,234,226,171, 93,242,219, 11,121,171, 20, 15,246,117,152,138, 21,152,253,225,198, 44,100,231,212,100, 49,104,101,128,
-199, 33,186, 38,188,132,199,176,123,153,219,190,113, 28, 2,216,167,244, 82,112,161, 62,217,183, 94, 25, 37, 72,196, 33,105,245,
- 60,240, 16, 24,207,158,220, 96, 24,119,120,245,250, 14,105,158,172,121,117,247,188,242,218,164,217, 59,171, 26,132, 46, 48,253,
-121,201,222, 54, 91, 91,193, 16, 3,118, 59,119, 43, 35,139,153,165, 48,152,180, 44,205, 0, 41,230,164,152,230, 12, 70,198, 48,
- 12, 80, 98, 68, 55,243, 81,143,167, 45,133, 99,206, 48,107,216,226, 79, 65,168,238,149,234, 81,181,129,164,202,217,136,138,115,
- 98,179,172,163,197,227, 51,112, 73,121, 19, 39,128, 73, 13,129,129, 79,145, 74,140,148, 20,131, 57,182,216, 89,235,143,119,151,
- 25,199, 87,175,193,114,244, 0,146, 70, 45,244,134,223,146,246,252, 34, 90,228,162, 35, 43,198, 39,123,252,214,159,158,241,253,
-239,254, 22,126,241,171,132,183,190,246,159,225,147, 87, 1,135,244, 2,195, 77,192, 81,110,128,243, 29, 68, 39,156,146,163, 42,
-243,140,156, 38,100,181,247, 52,103,133,166, 12,166,217,174,129, 79,124, 74, 75, 16, 89,185,111, 73, 44,166,204, 38,108,238, 24,
-229,197,207,164, 16,147,203, 23,187, 6,164,234, 82,101,132,141,173, 47, 89,107,206, 58, 68,193,146, 65, 16, 8,155, 57, 14,212,
-138,189,138,216,126,158,141,224, 25, 67, 0, 7, 87,121, 80,112, 57, 28,106, 98, 92, 35,238,174, 43, 0,105,138,253,110, 55, 32,
-124,225, 39,222,251,206,249, 52, 45,176,180,110, 72,172, 26,236,186, 78,210, 68,171, 66, 76, 53, 53, 12, 13,191, 88,251,182,160,
- 43, 6,116,121,124,111,129,157,171,195,145, 86, 42, 47,135, 53,136,177, 11,132, 17, 46, 7,172, 69,110, 9, 92, 89,118,231, 13,
-139,208,133, 8, 88,201,154,188,212, 54,165,129, 87, 30,247,180, 32, 4,171,162, 79,155,171,133, 53, 67, 95, 59,233, 24,105, 65,
- 19,122,130, 0,131, 46, 26,158, 53,171,189, 99,187,211, 6, 63,191,223, 4, 44, 59,102, 15, 19,208, 77, 62, 63,109,163, 41, 84,
- 16, 16,186,168, 62,244,200, 9,253, 90, 17, 47,239,131, 54, 9,100, 77,247,122,133,226, 77, 68,219,195,118,183,218, 89, 75,213,
-180, 15, 42,199,154,173, 70,125,120,249, 61, 71, 84,103,254, 67,141,145,210, 99,224,118,237, 63,175, 55, 41,232,127, 83,196,184,
-237,150,200,158, 69,210,140, 79, 94,190,194,183,190,245, 77,156,207,103,188,122,245,202, 93,204,236,222,154, 39, 75,138, 42,111,
- 36,139,177,214,219,137,189, 40, 21, 68, 76,134,118,120,114,131, 24, 7,156, 78, 39, 35,180,213,233,201,244,200,197,115, 62,132,
- 80, 61,231,199,193,160,231,156, 19,158, 28,246,152,147, 96,154,166, 42,105,203,174, 93, 31, 66,180, 3,188,184, 29,178,201,204,
- 56,184,119,183,146, 75,200, 6,156,231,140,200,246,216,149,203, 81,246,222,179,237,189, 69,212, 53,249, 22,244, 82,138,162,136,
-201,199,118, 99,196, 48,142,136, 67, 68, 28, 70, 4,207, 74, 7, 5, 15, 23,177, 64,149,148,213, 93,237, 38,135,242, 93, 87,239,
-251,255,228, 44,108, 51,222, 33,144,152,254, 92, 10,167,217,181,231,154,147,125, 58,146, 93, 50, 23,205,118,186, 6, 85,195, 35,
- 64, 5, 33,216,193,239,217,200, 94,212,164, 58,176, 17,204, 35, 63, 16,204, 53, 78,221, 76,204, 89,249,230,249,110,136,192, 36,
-192,237,237, 17, 52,223,218,122,228, 71,192,132,168, 54,228, 23,190,159, 24, 89,177,123,114,192,111,255, 89,198,247,255,195,191,
-198,175,252,221, 35,158,127,227,151,112, 62,237, 17,226,132,204, 79,113,158, 50,238, 82,194,233, 44, 72,167, 19, 36,157, 23,238,
- 67, 54, 66,166,241, 21, 60, 9,205,139,105,185,103,139, 63,136, 21,243, 98,191,204,230,207,194,138,140,176,144,145,197, 16, 38,
- 91, 41,241, 18, 87,222,216,117, 23,119, 56,246, 5, 54,123,252,106,102, 2,193, 3,114, 96, 57,237,101,143, 47,170,152, 75, 50,
-156,152,201, 76, 34,130, 34, 32,144,153, 20, 89, 97,183,159, 71,107,242,230,239,137, 26,156,110, 55, 68,155,212,207,167,169,113,
- 98, 91, 50,212,181,251,113,123,140,232,118,176,209, 89,130,107,232,175, 94,176, 70,175, 78, 27, 5, 19,221,254,182,103,239, 93,
- 20,194, 43, 83,189, 82,145,191, 44,147,110, 86, 69,110,157,216,104,121, 30,161,203,199,231,246, 80,166, 21,154,176,218,246, 87,
-143,124, 90,105,147,219,235, 68, 88,101,206,119,222,105,171, 33,122,139,175,192,141,119,126,121, 77, 90,201, 65,125, 77,243, 6,
-140,168,255, 90, 53,143, 27, 54,224,255, 11,136,190,225, 65,172,202,116, 51, 6,234, 5,167, 64, 9, 43,173, 59, 93, 41,238,143,
- 47,236, 91,127, 70, 43, 69,195,125,118,235,107, 34, 96,219,212,233,189,248, 60, 53,190,246,171, 54,147, 30, 98,160, 83,229, 75,
-144, 82, 79,130,105, 52,245,189,187, 95,163, 8,121, 36, 83,248,177,133,254,111,172,160, 55,187,189,113, 28,240,254,251,239,227,
-221,207,124, 22, 95,252,194,231,241,225,135, 31,214, 64, 18,179, 24, 21, 75, 34, 27,140, 50,107,108, 94,237,248, 46, 38, 77,203,
- 38,195,113, 66,221,225,112, 83, 19,209,138, 85, 41, 19, 99,154,147,155,205,152,208, 53, 57,110, 60,196,136,236,100,228,113,183,
- 55,150,124, 74,117,197, 6,247,104, 40,107,193,224,170,131, 24, 3,246,187, 29, 66, 12,158,231,110,185,216, 67,140, 75, 58, 91,
-136,254, 16,226,172,114,173, 6, 92,234, 41, 91,230,231,109,133, 86,137, 23,125, 50, 89,131, 64, 94,152, 83, 74, 94,131, 3,152,
- 2,178, 95,199, 57, 9,114,154,170,236,104,118,198,126,246,160,150,150,253,108, 48, 59,234,110,155,200, 26, 13,170, 62,225,140,
- 16,216,134, 24, 47, 38,204,228,177,207, 90,207,145,172,228,211,184, 52, 38, 77,112, 40, 62, 35, 6, 0, 20,171,153, 14, 67,113,
- 24, 35, 40,142, 16, 49, 16,122, 74, 25, 72, 9, 20, 9,183, 71,129,156, 94,213, 38, 7,215,164,213,244,208,189,218, 15, 44,107,
-107,227, 8,197,225,233,136,223,253,222,136,247,127,231,223,225, 31,126,243,136,195, 55,126, 5, 31,189,222,225,116, 60,226, 60,
- 39,220,158, 38, 76,199, 59,228,233,104,161, 73,146,145, 61, 10,149,145, 17, 72,106, 51, 89,174,136, 54,100, 78, 41,202, 40, 88,
-204, 56,164,216,187,180,217, 38,197,212,106,113,127, 3, 49,164, 89,183, 49,172,233, 43,142,243,230, 24,215,164,202, 56,145, 50,
- 67, 93, 10, 39,128,102,127,108,245,201, 61, 99,206, 51,210,108,164, 77, 73, 25,164,179,163,163,229,115,150,197,128,166, 14,103,
- 62,252, 17, 16,199, 17,225,139,159,127,247, 59,231,243,100,249,175,197,201,172,154,152,184,110,145, 44,238,240, 16, 8, 55,129,
-113, 19, 8,123,235, 61,154, 80,147,134, 96,183, 50, 2, 89,179,144, 47,224,229, 13,246, 59,175, 32,120,221,188, 95,168, 58,200,
-214,206,169, 77, 91,163,118,183, 76,117,103, 73, 85,115,191,132,213, 80, 83, 40, 55, 52,255,254, 97,182, 70, 54,218,155, 38,209,
- 37, 65,139,112, 93,215,126,173,149, 97, 55, 0,194,197, 32, 76, 75,209,184,194,114,191,168, 11, 77, 24, 79, 37, 44, 86, 40, 93,
- 27,147,152, 21,121,110,179,200, 82,215,196,116,112,251, 38,241,241,145,133,124,163,177,161,245,207, 82, 95,216, 31, 5,141, 87,
- 5,194, 5, 78,114,255, 95, 42,175, 71,245, 30,244, 97, 53,107,235, 10,109,160,254,222,220,108, 58, 26, 91,200, 55,173,231,247,
-137, 0,254, 70,108,231,208,170, 44, 23, 4, 41,167, 25, 31,126,252, 9,190,253,237,111, 65, 37,225,120, 60,185,220, 75,125, 31,
-188,100,136,171, 74, 13, 43, 41, 80,120,221,225,250,231, 17,152,112,243,228, 9, 66, 28,204,237,205, 11, 97,206, 70,110,139,158,
-210,165,158, 57, 48,248,164,157,230,132,195,110,180, 98, 51,205, 11, 87,134, 96,174,108,108, 69, 52,103,117, 27,217, 17,129,163,
-235,201,109, 31, 78, 42,136, 49, 98, 24, 70,140,251, 61, 64,140,187,227,201, 88,239,206,152,175,108,119,226,202, 9,128,152,173,
-104, 8, 92,215,101, 67,180, 34, 92,245,204,121,198, 97, 55, 84,141,124, 86,134,228, 25,115, 54, 8,190,186,217,169,185,209, 5,
-202, 14,173, 27, 57,173, 83, 42, 19, 35,168, 96, 24,130,171, 80,236,141,230,146, 41,193,161,190,247, 96,169, 50,198,104,119,254,
- 77,206,158, 24, 86,247,195,189,113, 73, 73,218,171, 95,255,106, 21,107,241,182,226,133, 36,231, 4,214, 4, 10,140,215,103, 32,
-221,221,130, 57, 65,125,207,124, 1, 31, 61, 36, 51, 41, 82,216, 78, 2,186, 65,212, 4,112,243,100,192,239,126,127,135,143,190,
-251,239,241,159,124,245,136,233,199,127, 17,175, 62, 78, 56,221,125,136,124, 62, 33, 77, 19, 52, 77,152,114, 70,154, 5,200, 25,
- 65, 51,136,178,213, 50,151,166, 81,123,160,250,196, 46,234,126,246,154,205,153, 77,225,150,176,174, 0,240, 41,187,216, 31,131,
-109, 96, 21,247,117, 37,111,166,180, 68, 5,211,194, 80,111, 7,158, 50, 48,150, 12,147, 8, 5,187, 61, 59,147, 15,166, 30, 7,
-204, 32, 68, 21,179,149,133, 23,126,150,101, 12,149, 34,229,205, 70,176, 83, 5, 40, 91, 35, 52, 58,252,126, 60, 78,238, 79,187,
- 76,154,182,131,176, 47,200, 16, 35, 14, 67,192, 97, 12, 56, 68, 15,110, 81, 96, 22, 96,114, 66, 64, 11,213, 46,186, 71,189,167,
-176, 97,155, 94,126,157,103,133,237,224, 76,106,146,229,176, 10,127,105,223, 80, 9,224,107,111,231,165,240,111,174, 2, 72, 87,
-119, 93,123,102,246,108,116,186,194,188,190,104, 66,186, 98,164, 23,251,113,169,135, 42, 93,202,241,136, 58, 51,157,203,168,216,
-229,137,185,249, 94, 73, 67,200,107, 24, 6,155,124, 21, 90,173, 87,168,191,210, 23,110,127,111, 90,180,183, 97,118, 2,209,181,
-230,158,122,235,249,181, 34,130,232, 74,193,211,206,234,151,232,145, 4,185,173,169,153,238,163,215,173, 38,124,234,221,255,244,
- 30, 52,161,254, 61,122, 51,250,223,223,234, 14,189,125,228,142,180,161,216,237, 70,188,255,189,239,227,230,217,219,248,187, 95,
-255, 10, 62,250,240,227, 10,111,179, 71,100,166, 57,185, 37,167, 21,139,114,168, 77,201,136,102,129,201, 93,217, 44, 50,148, 3,
- 99,119,216,251,132, 14,196, 16,253,159, 46,221,241,253,252,110, 48, 11,217,115, 74, 32,207, 41, 79, 98, 19,146, 29,140, 6,139,
- 26,211,220,160,203, 57,219,115, 70,159,238,203, 33,171, 40,169,138, 75, 67, 62,121,114,153,133,254, 88,241,158, 82,194,221,241,
-132,243,233,236, 99,173,253,253,209, 13,101, 10, 81,112,191,223,129, 56,186, 23, 61, 33,122, 44, 42, 60,117, 46,146, 49,229,207,
-167,179,133,122,136, 57,215,169,204, 22, 40, 82, 38,110, 48,166, 41,131, 52,129,163,193,233,228, 44,125, 26,118,152,178, 58, 98,
- 64, 22,205, 25, 92, 96, 74,166,199, 87,182, 52, 49, 53, 74, 55,178,147,222, 66,108,226,112, 81,153,204,126,227, 73,195, 68, 55,
- 84, 0, 10, 4, 5,146, 75,184, 40, 16, 82, 6, 8, 25, 33, 48,238, 18,227,124,251, 10, 92,200,114,244, 24, 25,198,234, 62,237,
-200, 49,215,227,135,212, 11,251,225, 38,226,119,255,106,196,243, 63,255,109,124,253,167,206,184, 61,124, 21,243,105,194, 60, 29,
- 49,167,132, 60,103, 76, 57, 35,207, 25, 33, 79, 32,182,201, 91,132, 93,182, 38, 6,139, 19,215, 76,115,168, 35,187,238, 57, 96,
-124,130, 18, 71,166, 30,151,186,196,169, 22,255,125, 38,182,162, 95, 36,152,190, 54,170, 94, 42,229,207,120,137,183,134,146, 89,
-175,147,214, 52, 55, 45, 80, 62,185, 14, 65, 25,177, 32, 52,129,173, 65,141, 1, 20,108,117, 67, 28, 16,137, 17,130, 33, 85,228,
- 72, 17,123,122, 26, 19,155,249, 76, 19,212, 85, 71,250,186, 53,102,118,184, 42, 24, 17, 3,192,156, 21, 47,103,197,135, 89,241,
- 82,129,249, 98,119,222,236, 47,169,175,246,235,140,150,246, 35,236,204, 81,232,250, 57,123, 57,213,104, 23,205, 42, 10, 36, 93,
-242,202, 11,243, 81, 87,230, 38,139, 75,155, 9,252,115, 67, 72,227,238, 89,151,221, 51, 90, 35,125, 44, 74, 1,166,150,253,169,
-151,242,228,102,119, 74,171, 11,192,144,205,216,217, 18, 21, 43,218, 55, 20,210,196,163,174, 77,113, 90,243,177,101, 21,210,104,
-171, 11, 65, 6, 43,119,187,141,200,218,234,115,222, 56, 22, 73,251,217,108,154,242,232,229,160,184, 33,207,210, 11, 47,249,203,
-232,219,229,114,234,197, 32,112, 95, 33, 91, 37, 8,248,235, 94,188, 2,113,245,177,180, 57, 92, 86, 48, 64,243, 26,214,254,239,
-107,227, 31, 85, 65, 9, 65,184, 86,100,101,229,197, 95, 81,122,194,255, 47,126,169,244,102, 72,165, 73, 81, 37, 60,125,114,192,
-111,254,155,223,196,247,126,240, 2, 63,249,249, 31,119,178, 39,234,180,206,129,160,130, 42,215, 33,103,106, 91,225, 10, 86,128,
- 66,168,209,185,119,183,183, 72, 83,194,205,225,128, 39, 79,158, 84, 91, 95,230,136,192,193,225,104,115, 56,155,147, 32, 77, 54,
- 5, 19, 7,228, 52,187, 69,171,121,166, 15, 49, 86, 35, 24,142,132,195,110, 68,140, 1,226,144,185, 66,220,194,214,244,217,105,
- 54,143,247,125,100,220,236, 6, 51,132, 10, 1,162,100, 36, 43,241,211,176,200,152,216,166,224, 18, 43,171,217,118,209,199,211,
- 12, 82,155,216, 3, 91,104, 79, 33,248,185, 49,105,117,214, 27,162,237,244, 35, 41,118,227, 0, 26, 6, 55,180, 9,126, 31,152,
-109,109,154, 83,181,104,157,146,224,124,158, 16,201, 39, 72,168,167,166, 5, 39,113, 25, 34, 32,238,100,215,167,161, 0, 0, 32,
- 0, 73, 68, 65, 84, 22, 98, 76,120,247,220, 8,161, 49, 94, 33, 79,217,179,247, 6, 55,200,161, 18, 1,171,182,195, 15,200, 72,
- 0,242, 44, 32,157,141, 69,238,250,124, 82,193, 97, 31,128,225,208, 89, 45, 95,235, 11, 55,127,155, 86,131,147,110,143,234,218,
- 21,118,197,254,217, 14,119,159,236, 48,124,255, 55, 17,134,247,161,225, 6,160, 1,100,206,237,128, 88,177, 37,182, 85,171, 32,
-248,231,100, 65, 61,102,138,150, 42,112, 77, 85,114, 22,106, 96, 74,112,248, 69,168,140,228,101, 71,111,159,119, 78,102,178,100,
-141,128, 33, 54,112, 78,131,157,215,206,183,112,196,155,137,173, 16, 19,144, 97,251,243,164,102,100,227,250, 66, 4, 24,185,155,
-139,131, 27, 9,132,128,164,193, 72,119, 96, 16, 5,179,156,141, 4, 10,209, 86, 69,113, 0,194, 14, 74, 35, 20,177, 26, 92,177,
-177,193,181,217, 28,195,255,144, 16,193, 54,145,231,140,219,243,132,151,199, 25, 31,157, 50, 94,204,130, 59, 1, 18, 86,174,108,
-205,212,219,196,105, 47, 50,199,170, 47, 93,206,207,139, 34,221,212,197, 22, 70, 7,173,208, 0, 44,182,168, 53, 38,180,113, 3,
- 43,166, 57,236,144, 54, 53,249, 40,221,227, 52,137, 67, 11,233, 77,107,120,202,150, 74,163, 48, 38,219,206,228,130,233,174, 27,
- 77, 9,173,247, 79,139, 41,138,234,150,204,115,237,130,167,189, 51, 95, 23, 45,187,148,223, 26,128,162,109,221,214,138, 2, 20,
-215,191, 54,188, 5,186,184,238,213, 73,223,157,194, 90,124, 76,165,117, 7,212,134,181,124, 79,129,190,150,151,190,110, 12,154,
-207,175,227, 82,168, 94, 56, 18,174, 63, 15,221, 76, 50,211,139,207,172,106,156,219,100,187,182,155,236, 34,147,232,162, 97,233,
- 60,151,181,185,160,229,177, 43,226,165,247, 79,218,186, 28,148,111, 58, 67,175,227,118, 85, 31,111,138,243,208,207,174,215, 43,
- 61, 22,175,216, 29,110,112,126,253, 2,191,254,191,252, 6,246,135,103,120,231,237,183,144, 82, 50,232,123, 24, 44, 34,149,200,
-228, 69,168,135, 76,117, 38,179,212, 44, 15,218, 32,198, 60, 39,124,242,201, 39,230,205, 62,140, 56,236, 71,220,220, 28,188,120,
-186,235,155,231,164, 79,243,132,195,200, 56,220,220, 88,156, 38,115,117,175, 36,143,123, 37, 39,231, 25,243,221, 66, 81, 4,236,
-198, 43,246,243, 4,231, 3,177, 67,176,176,131,178,144,214,114,202,152,167, 51, 84, 77,106, 22, 60,115,251, 60,153, 22,126, 55,
- 70, 12,193, 80, 1, 37, 50,214,188, 38,236,247, 22,221, 26,139,235, 90,117, 96, 84, 12,209,215, 0, 33, 66,201,156,221,146,144,
-243, 1,164, 34, 82,187, 33, 34, 12,131,105,238, 93, 46,151, 69,144,231, 9,145, 20,113,127, 0, 56,214, 3,214,252,219, 25,167,
- 76,200,211,100,104,164,103,141,147,223,175,213,131,191,177,138, 13,108,239, 57, 59,126,201, 0,198,200,216,143,134, 10,100,101,
-176,204, 54, 68,100, 75,108,203, 96,228, 89,176, 15,138,176, 63, 24,116,189, 61,145, 60, 14,107,122,195,123,159, 33,136,195,128,
- 48, 30, 16,135,136, 16,198, 10,147, 19, 51, 66,105,138,216,210,237,202, 90,162, 20,236,133, 24,151, 27, 68,147, 16,130,161, 28,
-162,132, 0,245, 41,184, 64,238, 22,227, 28,203,116,236, 15,170, 30,248, 50, 59, 33,143,117,177,237, 22,231, 56, 72, 35, 25,228,
- 80,248, 21, 17, 16, 53,169,100, 74,238,185,239,181, 55,144,123, 16, 88,211,155, 65,134,134,207,138,211,148,113,158,147, 53,182,
-106,174,117,118,253,141,124, 55, 11, 97,206, 46,215,252,210, 79,188,251,157,211,105,110,166,178, 37,179,219,146,194,164,238,180,
-230, 46, 69,108,101,171,186,177, 95,212,149, 39, 54,117,250,187, 75,216,119, 61, 67,213, 60,242,106,247,186, 61,101,173, 25,249,
-107, 18, 88, 27,124, 82, 22, 2,218,236,155,187,199,242,223, 15, 77,129,144,141,251,145, 54, 94,113,139, 40,173, 25,227, 23,221,
- 1,109,179,180,177, 41, 87, 67,151,185,190,245,119, 8,180,233,210,167, 23,204,244,222,247,124,177, 97, 45,228,194, 69,154, 88,
- 96,242, 26, 44,226, 95, 2,189,106,208, 67,219,170,134, 71, 64,242,215,126,175,253,215,173,213, 7, 54, 26,156,109,190,198,138,
-127, 80, 86,129, 45,251,191,189,105, 30,210,149,181, 97, 43, 63,170, 26,156,126,184, 31, 37,160,218,253, 62,230,151,168,226,176,
- 27,113,115,179, 55,130,150,104,175, 24,216,132, 78,151, 34, 95,154,192,195, 97,143,191,254,203,191,192, 25, 17, 63,247,237,159,
-193,233,246, 22,167,105,174,159, 87, 22,129, 36,199,253, 60, 9,205,136, 94,182, 67, 76,238,100, 22, 61, 27, 60,103,131,155, 21,
-214, 24,112, 24, 76, 23,238,146,173, 57,153, 45, 42, 65,240,252,233, 83, 80,220, 89,162,154,103,140, 43, 19, 36,171, 23,106, 43,
-236,150, 91,110,249,216, 68,106, 83,206, 48,120, 62,184,199,137, 50, 33,132,104,147, 40, 76, 67, 95,144, 44,114,127,246,147,179,
-250, 37, 39, 4,216,107,166, 56,248,110, 30,152,102, 67, 11,134, 33, 98, 24,247,152,179,173, 24, 66,140, 53, 19,221,224, 83,131,
-201,179,147,232,114, 78,110,122, 66,174,227,215,218, 4, 20,115, 19,155,176,109, 42, 7,177,231,172, 11, 6, 86,119,156,179,130,
-157,192,200,243,140,125, 84, 36,183,242, 13, 62,177,171,218,128,150, 17, 0,103,204, 39,129, 17,177, 0,176, 59,169, 73,145,105,
-177, 57,162,141, 44,160,200, 80,101,176, 42, 12,233,183, 48, 19, 30, 8,175,231,128,244,250, 37,152, 82,159,220,246, 24, 91, 88,
-255,222,245,136,189, 62, 64, 91, 81,156, 19,225,107, 79, 18,190,254,205, 27,156,126,236, 31,224, 60, 61, 71,158,110,161, 57, 97,
-206,130,115,158,145,140,184, 0,209, 12,205,126,122, 19, 47, 81,213,142,188,160,102,162, 55,169,155,190,171, 46, 49,179,117, 85,
- 73,182,235, 54,127, 17,163,207, 5,146,234, 62,199, 5, 17,166,133,112,107, 22,190,197, 41,154,234, 38,183,100,212, 11, 19, 84,
-131, 35, 8,226,142,115,182, 30,145,130, 26, 87, 73, 29, 60,250,215,121, 30, 41, 67,115,118, 7, 66,151,144,170, 17,240,134, 24,
- 29,125,168,249,228,182, 31, 87,181, 41,124,130, 66,200,114,100, 7, 42, 26,112, 43, 44,188, 98,198,183,145,170,218,238,182, 27,
-210, 92, 27,252,162,212, 59,216, 53,246, 0, 23,187, 86,162,203, 96,152,109,162,101, 13, 51, 53, 47,234,172,152, 26,102,119, 97,
-240, 87,147,131,139, 21,234,242,197, 74,181, 59, 84, 4, 93,215,100,194,229, 22,104,217,171,114,137,197, 43,239, 76,117, 59,181,
- 12, 27,137,111, 13, 28, 47,221,207,105, 79, 70, 92,189,110, 45,153,187,171,125,122,191,230,186,132,237,197, 35,117,123, 40,217,
- 35, 1,171,191,241,150,197,170,214,233, 87, 86, 48, 75, 95,103,174, 77,238,171,215,215,192,218, 45, 12,172, 77, 12,225,250, 49,
-215, 85,124, 29,147,187, 36,217, 95, 22,183,156,181,194,224,197,192, 65, 91, 88,233,161, 98,189, 72,250,113,197,243,248,254,105,
-123,221,208,210,195,162, 57, 93, 29,140,242,134, 99,190,177,124, 25,231, 84, 76, 57, 46, 87, 34,151,112,200,114,244,238,198,193,
- 44, 67, 65,120,251,249, 83,252,251,127,251,155,248,157, 63,248, 19,124,249,203, 95, 70,228, 80,173,145, 11,219, 60,198,176,248,
- 47, 52,132,160, 24, 67,109,210,119,227,104,154,226,211,209,200, 96,234, 86,169,113,196, 56, 12, 24, 35,227, 48, 14, 64,217,151,
- 15, 3,142,231, 9, 41, 77, 14, 29,115,149, 17,101,135,203, 57, 4,204,115, 2,187,249, 11, 51,129, 99,244,195, 54,120,222,185,
-253,108,202, 25, 36,150,129, 29, 98,168,247, 68,136, 3,166,172,238, 34,151, 49, 48,155,123, 93,136,184, 59, 30,241,250,238,174,
-249,126, 16, 52,155,252,205,118,242, 54,221, 71, 55,157, 81, 53, 84, 32,171,130,196, 51,215, 37,155,157,107, 12,224, 96,107,131,
-234,236,166,203,119, 66,138,211, 39, 7,235, 53,115,194, 57,171,147,219,180, 26, 42,141,145, 33, 60,216,164, 6, 65,140, 0,130,
-125, 94,179,195,234,209,179,199,163, 11,228, 72,178,145,111,221, 20,199, 32,230, 4, 66, 70, 38, 70, 18, 67, 4,212, 37,113, 55,
- 3, 99,124,114,131, 24, 70,236,118, 3, 36,236,107, 19,244,166, 44, 79, 82,170,248,226,214,215,172, 59, 95,169,245,151, 32, 76,
-179, 96, 58,159,145, 37, 35,169,241,190, 56, 70,128, 71,219, 61,187,219,157,208, 98, 34,179,132, 88,121,212,120,118,219, 86,183,
-195, 37, 37, 87, 26, 16,114, 82,144, 38,211,128,107, 48, 14, 68, 89, 63,120, 1, 87,159,102,153,125,210, 15, 4,225,128, 18, 68,
- 94,222, 39,163,236,221, 45, 48,109, 22,241,240, 24,135, 77,124,237,226, 31, 0, 32, 9,201,185, 1, 50, 39,168, 36, 63, 99,173,
- 1,177, 96,153, 12,201, 9,146,102,204,217, 9,166, 57, 1,152, 1, 54, 68,170, 22, 56,130, 57, 15,169,152, 12, 34,129,144,200,
-247, 21,126,184, 15, 32,219, 1,248,158, 99,225,200,235, 5,241,140,154,134,161, 77,221, 88,159, 31, 93, 81, 93,165,130,109,238,
-137,113,153,139, 78,171, 37, 76, 86,133, 6,194,179, 1, 56,144, 24,219,208, 83,148, 34, 45,105,112,114,177, 65, 53,116, 66,212,
-246, 42, 54,205,187,100,161,190,110,221, 56,112,117,245, 79,234,223,223, 69, 17,187,143, 83,178, 70, 60,208,217, 17,234,198,177,
-171,141,236, 70, 55, 90,143,106,194,209, 64,199,218, 93,178,165,248, 82, 3,245,139, 46, 48,149, 93, 3,217,164, 74,235,125, 83,
-243,106, 47,221, 53, 0, 29,111, 80, 59, 8,126,185,110,219, 59,247,229,247,245,226,179, 88,130,109,228,122,145,116,200,108,136,
-161,121, 31,122,157, 65,174,219, 31, 17,145,118, 74, 6,210, 7,206,180,102,125, 95, 95,135, 62,120, 14,246,150,149, 63,140, 46,
-152, 25,231,243, 9,167,187,219,199, 57,220,116,187, 9,216, 1,228,246,164, 97, 24,241,108, 31,240, 47,255,197,191,192,239,255,
-209,159,225, 43, 95,250,201,186,210, 24, 6, 99,169,151,191, 22,156,244,134, 70,226, 99, 36, 47,207,238, 38,139,101, 37,133, 65,
-212, 49, 32,137, 32,101, 51,162,217,237,119,184,217, 69,236,118, 59,100, 37, 32,155,239, 58,177,157, 53,145,128, 97, 24, 23,127,
-115,166,106, 81,203, 33, 26,243,185,172,160,220, 18,116, 24,162,241, 97,220,228, 38,249,141,110, 28, 51, 99, 77,231, 60,131,144,
- 45,213,141,108,148, 97,102,236,199, 17,154, 51,210,116,194, 24, 3,134, 97, 64, 24, 6,119,210,179, 48,150, 2,219,219,101,204,
-200, 78,234, 27,134,232,242,186,209,243,182, 7,136, 88, 97,200, 21, 82, 71,229, 39, 24, 35, 91, 60,175, 93,160, 28,108, 98,155,
- 39, 0, 2, 35,123,103,159,230,128,160, 25,187, 72,144,176,195,156,220,248, 39, 11,128,236,206,105,190,170,112,242,156, 40, 87,
- 79,120,109,120,188, 89, 0,157, 39, 16, 82,205, 3,153, 69,161, 8, 24, 57,224,201,205, 0,218, 63,169,235,227,135,118,233, 29,
-152,167,143,156,208,155, 63,229,114,174,139, 21,182,148, 18, 78,231, 9,119,199, 25,167,187, 35, 36,157,141, 87, 64,132, 9, 12,
-201,132, 80,217,107,139,105, 12, 67,161,108,242,176,156, 4,144,180, 20,118, 8, 34,169,173, 71, 4,136,206,165, 96,127,114, 75,
- 10,204, 62,204, 88,236,170, 89,205, 18, 72, 8, 65,201,119,250, 10, 45, 43, 15,119,226,204, 37,173, 83,140, 95, 65,146, 17,145,
- 13, 65,242,176,163, 50, 80, 71,255, 44, 50,236, 53, 74, 78,118,207,139,128,164,148, 40,191,215,189, 25,156,115,198, 60,103,204,
-217,115,229,185, 97,135,115, 99, 50, 79,106,240, 77, 38,130, 56,201, 34,178,177,223, 11, 36,206,101,122,111, 32,242,222,218,165,
-213, 45,232,134,164,145, 86, 59,109,186,216,149,202, 61,112, 46, 55,127,183,211,143,135, 1,251,167, 1,207, 15,140,155, 72, 24,
- 96,108,208,172, 75,196,172, 77,238,188, 16,122, 58,153,154,122,115, 96,187,141,242,231, 37, 7, 89, 55,103,153,165,148,234,138,
-182, 85,202,173,220,179, 86,162,245,238,188, 76,193,186,141, 38,108,237, 87, 33,254,103,173, 59,153,234,229, 94,186, 41, 94, 29,
- 98,210, 78,223,126,168,103, 21, 15, 70,160,126,247,125, 95, 97,223,250, 25,108,144,251,218, 61,122, 83,185,106,178, 92, 7, 57,
-108,237,160,181, 78,173,107,134, 65, 69,121,154,199, 91,183, 98, 68, 54, 41, 93,146,243,180,115,121, 91,223,147,221,109, 93,199,
-246,237, 68,191,205,173, 0, 93, 74,122,174,165,172,210, 10,209,120,156, 60,239,202,243, 23,105,206, 22,217,144, 86,221,241,234,
- 9,206,231, 83,141,250, 84, 85,140,251, 27, 12,122,194,175,255,218,191,196,251,175, 19,190,240,185, 31,183,105, 79,201,173, 47,
-151,152, 90,166,197,156,170, 24,152, 73,217,104,179,133,186,220,222,222,214,239, 49,147, 33, 93,243, 52,131,153,241,252,173,103,
- 24,119,123,204,211,140, 16, 24,129, 3, 66,136, 96,102,219, 97, 83,192, 16, 44,169,139,188,192,149, 48, 15,103,211,217, 97,183,
- 58, 43,178, 2,211,156,161, 57,185,235,157,214,116,192,253, 56, 96, 28,119, 6,105, 70, 70,202, 2,145,140, 24, 34,158,222, 28,
- 48,142,131,185,223,145, 19,178,148,234, 10,160, 22,129, 2,199,186, 83, 94, 86, 54,130,213, 16,173,184,164,108,187,226, 96,100,
-100,113, 83,152, 37, 23,222,214, 9,145,205,135, 31, 0,134, 96,147,123,137, 26,149,236,201,115, 16,196, 72,160, 56, 64,133, 16,
- 44, 41, 29, 67, 4, 56,142,181,193,152,147,184, 75,157,173, 37, 98,228,218,112, 21, 51,150,253,192, 24,157,144, 72,126, 93, 50,
- 24, 41,157,145, 36,227,201, 64, 24,111,158, 66, 48,192, 42,205, 27,232, 42,168,172,189, 20, 15, 45,228,173, 1, 94,206,169, 57,
- 19, 56,205, 24,249,108, 46,124,200, 56, 78, 9,243,241, 4,164,179, 59, 28, 18, 52,205,128, 38, 63,219,217,153,253, 38,177,148,
- 98,246,229,204,119, 72,174,123, 90, 55,209,243,149,130, 86, 36, 99, 96, 70, 12,102,227, 91,212, 68, 90,254, 5,226,191, 39,176,
-255, 89, 96, 78, 97,222,151,153, 54,168,201, 23,149,212,234,138,152,116,211,246,246, 1, 33, 26, 34,197, 98, 28, 6, 98, 53,201,
-162, 26,159, 32,144, 32,176, 88, 13,142,214, 8, 70, 38, 75,137, 11,110,209,158, 0, 86,215,213,134,226, 84, 83, 52,116,218,218,
-213, 91, 81,207,190,191, 26, 24,216, 19,234,196, 94, 36,247,101,226, 71,199,188, 70, 7,171,210, 21,229, 76, 91,108,164, 19, 36,
-233, 37,169, 92,221,234,175, 33,207, 21,237, 53,169,152, 41,196, 16, 16, 65, 56,101,224,152, 21, 71,129,217, 7, 58, 76,221,238,
-154,185,105, 68,184,129,155,203, 39, 66,171,125,177, 49,214,181, 91, 55,172, 39,176, 74, 86, 67,207,150,238,119, 20,151, 48,249,
- 37,113, 80, 47,144, 13,237,174,203, 82,224, 91,136, 93,156, 40,164,173,252, 92, 55, 8,250,170,157,163,153, 54,236,108,169,176,
- 44,186,248,214,142,236,165, 15, 20,242,213,223,235,137,124, 43,159,188, 21, 65,174, 56,123, 93,204,231,221,115, 52,173, 80, 7,
-235, 8, 56, 68, 59, 8, 23,234,122,157,236,213,159, 40, 75,194,249, 60, 93, 57, 87,244, 10,185, 76, 23, 71,190,149, 82,226, 94,
- 2,176,246, 72, 21, 20, 77, 58,162,246,107, 0,244,164,224,246, 53,208, 35,135,162,199, 18,231, 46, 95,224,245,134, 96,189,226,
-120,242,236, 45,164,187, 79,240, 79,255,199,255, 9, 57, 30,240,165,207,127,214,119,245,188,172,163, 2, 99, 24, 7,176,135,140,
-216,206,217, 96,240, 64,140, 64, 1,146, 51,166,211, 9,211, 60, 99,136,140,155,195, 1, 55, 55, 7, 60,123,122, 64, 86,198,237,
-217, 66, 85,198,129, 49, 12,209, 2, 75, 28,105, 73,162, 54,233,251,151, 55,132, 96, 12,232,156, 59,178, 82,245, 93,241,230,171,
-112, 93,178, 19,253,246,187, 1,187,253, 14, 89,128,233,124,182, 67,155, 76, 38, 6,138,224, 96, 6, 33, 89, 50, 38, 97, 76, 25,
-152,147,173,249,230, 57, 67,242,108,201,108, 62,125,149,168,216, 44,185,129,153, 91, 82, 50, 99, 8,112,127,123,120,161, 15,213,
-105, 76,156,139,128,226,102,231,143,171, 94,232,217,221,243, 80, 84, 23,158, 40,119,150,128, 52,155, 37, 45,133,136, 89, 3,230,
-180,156, 87,145,128,193, 25,102, 89, 81,112,100, 27,146, 92,126,151,179, 32, 48, 87, 20, 98, 22, 54, 4, 83,128, 60, 39,140,122,
-198,211,103, 7, 72,124,234,208,239,195, 20,148, 11,212, 78,215, 50,156,141,117,161,239,164, 11,255,197, 60,212, 5, 99, 16, 28,
-246, 35, 14,251, 29,194, 48,154,199,250, 60,129,117, 70,100,183, 79,117, 25, 91, 96, 53, 2, 26,187, 79,191,136, 73, 2, 89, 64,
-193,215, 35,154,221,114,213,247,232, 78,190,227, 10, 46, 25,127, 33,198,224,205,149,175, 44,100, 57,203,236,117, 42, 40,171, 33,
-222,197,236,167, 70,149,251, 96, 24,150,124,116,113,181,134, 37, 19, 10, 56, 50,114, 12, 16,184,242,195, 35,115, 11, 83, 94, 64,
-152,149,172, 57, 68, 0,113, 68, 8, 1,163,231, 24,240, 16, 45,122,245,236,146, 12,109, 88,236,235,128, 16,245,229,106,217,177,
- 6, 50,221, 93, 37,156,109,184,193,133,118, 15,190,142, 44,237,121, 80, 27,127,123,139,132,182,142, 58,165,198,133,169,157,216,
-141,206,149, 83, 70,154,179,121, 3, 19, 53,250,117, 90, 44, 85,169,119, 93,187,204, 95,163, 78,134,129,142,176,183,210,165, 19,
-238,245, 48,223,138,140,221,150,234,109,122,168,174, 83,102, 55,136,111, 11,193,173, 86, 15,162, 43,207,143, 7,244,215, 61,217,
-140, 87, 92,251,246,125, 87, 31,118,186,116,163,163, 43,100, 56, 85,155, 92,246,129, 12, 54,245,116, 34,197, 21,130,219,102, 18,
-159,118,143, 75,157,232,144,106,195,115, 69, 45,142,203,103,163,135,221,102, 26,222,129, 62, 10,190,110, 45,149,219,191, 79,203,
-122,234, 17, 59,248,191, 21,233,218, 22, 44,160,247,153, 29,111,236, 4, 20, 24,119, 35, 94,127,244, 62,254,250,163, 91,252,131,
-159,255,251, 96,153,240,250,238,232,133, 84,171,149,170,193,237, 86, 44,216,229, 97,145, 25, 49, 68,100,181,227,116,183,223, 97,
-127,184, 49,184,154,140,224,117,123,188,131,204, 19, 84,178, 21, 93,101,228,121, 50,133, 78,140, 85,166,197,100,204,111,246,252,
-243,194,114, 23,245,195,209,247,253,195, 96, 91,229,192,110,239, 58,248,132,239,102, 57, 57, 39,164,121,198, 52,207,144,108,114,
-178,121,158, 29,225, 96,156,167, 25,211,116, 6,196,162,102, 37,103,236, 98,192, 16,131, 91,207, 70, 36,159, 4, 99, 88,130, 67,
-168, 70,193,182, 95, 47,103,184,103, 65,206, 22,246, 66,154, 33, 62,209, 83,241,177, 47,132,195,130,124, 64, 17,221,144,102, 96,
-135,245,153,144, 57, 96,154, 5,154, 38,111, 40,188, 89,206,201,176, 17, 5, 34, 41,130,163, 27,112,167, 57,118,210, 93, 65,114,
- 68,151,102, 85,201,100,113,193,167, 74,114, 45,190,198,136,151, 71, 1, 29, 95, 46,238,114,143, 32,122, 42, 61,246,158,110, 12,
-186,200,136,114, 95, 28, 51,190,249,245,128,215, 63,241,115, 56, 79,159,133,230, 35, 78, 57,227,238, 88,166,245, 35,128,220, 60,
-129,248,119,218, 89, 96,164,139,201,152,175,164,102, 88, 83,165,146,145,213,226,116,109,239, 77,181,184,104,179,255, 47,100, 75,
- 38,246,180,186,226,152,168,203, 26,163,122,220,112, 3,193, 45,106, 39,166,130,194, 16,192,118,150, 20,162,158, 33,193, 75, 90,
-155,146, 54, 41,159, 84, 45,109,165, 4, 37, 65, 33,142, 72,236,118, 59,196,234,136,221, 6, 0,248,212,158,219, 99,212,181,220,
- 38,152, 55,162, 69, 96, 96, 80,243,184,205,133,229,199,192,142, 20,131, 2, 39, 53,186,253, 5, 19,187,235, 87,245, 98,103, 72,
- 27, 7, 38,173,244,212,189,225,203, 74, 18,166, 25, 72,102,201,151,116, 89, 45,244,216, 3, 45,132, 35,234, 35, 63,212,255,187,
- 20, 25,110,210,205,138,179, 50,145,141, 89,234,164, 8,109, 37,118,212, 67,239,220,189,163,198, 79, 94,168, 35,142,182, 39, 38,
-173, 9, 94,186,152,206,172,251,218, 94,226, 70,221,126, 86, 85,220,116, 66,187,117, 69, 29,142, 55, 35, 74,123,252, 64,117,177,
-216,237, 12, 29,181, 15,244,129,182,209,175,101,242,166, 94,154, 70,139,211,146,168,226,148,151, 92,104,106, 38,244,203,152,182,
-102, 85,208, 48,246, 43, 36, 77, 23, 52,190,234,117,125,209,188,232,194, 84, 93,208,129, 94,199,126,181,142,149,104, 68,104,159,
- 48, 3,244,217,239, 88,140, 78, 90,223,125,109,101,104,205,244,187,181, 35,255,219, 42,230,216,132,249,215, 80,154,110,125, 97,
-251,218,223, 60,216, 91,159,250, 20,254,244, 15,127, 15,191,250, 27,239,225,191,249,175,126, 9, 41, 11,190,255,193,199, 72,148,
- 76,179,207,132,113, 55, 32,165,236, 5,146, 60,190,212, 16, 21,118, 63,114, 77,102,232, 18, 67, 0,199,128,211,235, 19, 32, 25,
-196, 54,213,198, 16, 76, 90,230,114,178, 57,155,115,195,126,103,161, 41, 89, 21, 41, 59,131,221,167,118,153,230,166, 53, 93,148,
- 30, 41, 37,132, 24,176,143, 86,216, 85, 9,211,156,144,189,225,228,121, 6, 19, 89,190,249, 41, 1,146,109,231, 46, 25,187, 8,
- 40, 13, 8,206, 28, 39,223,211, 11, 25, 31,160,112, 57, 52,154,222, 30,226,226, 49,118,223,112, 55,213, 41,247,111,100, 2,107,
- 6, 13,140,243,196,198, 74, 15, 84, 45, 94,153, 50, 2, 7,164, 84,166, 79, 11,252, 24,163,157, 69,153,140,208, 37, 89,192,152,
- 64,209, 89, 82,106,123,224,192, 86,186, 89,141,213, 62,123,101,229,198, 25,143, 66,196,156, 96,188,128, 96, 62,245, 36, 25,138,
-140, 29, 43, 52, 14, 21,113, 20, 85, 60,139,130,155,231,207,240,250,229, 13, 6,189, 3, 40, 62,192, 43, 93,237,216,208,184,120,
- 54, 27,118, 90,161,189, 45,108, 63,101, 2, 77, 25, 83, 58,225,227,219, 25,250,250, 14, 17,130, 97, 24, 49,113,172, 86,170,128,
- 25, 34, 45,188,157,197,142,213, 2,180, 74, 76,139,147,234, 52,120, 98,107,170,235, 15,245, 8, 90, 10, 1, 80, 94, 94,171, 40,
- 2, 27,103, 11, 58, 24, 73,211,255, 14,187,137, 82, 33,157,195,253,220,209, 36, 48,154,210,192, 35, 85, 61, 51,221,254,187,200,
-167,114, 73, 80,175, 50,217,154,167, 66,126,134,202, 18, 72,163, 89,160, 89, 64, 44,144,148, 16,101,225,134, 57, 33, 78,193,190,
- 51,206,229,163, 40, 14,117,238, 3, 60,179, 95, 14,159,114,163, 31,142,137,217, 48,127, 53,227,255, 25,203, 20, 44,197,230,212,
- 79, 4, 65,239,231,141,106,140,143,206,171,187,141, 12,181,110, 28,139, 94,184,196,228,109, 16, 48,104, 35, 41,110, 77,178, 18,
- 93, 17,156,168,129,233,136,160,108, 76,118,109,216,109, 84,104,253, 94, 80, 24,122,129, 34, 85,251,207,106, 71,173,171, 34, 76,
- 93, 85,165, 70, 22, 77,186, 77,130,235, 11,219, 61,206,123,126, 51,162,250, 22,183,251,185, 53,233,106, 41,188,109,192, 73,253,
-113,109, 73,120,125, 83,193,222,153,138,246,147,178,125,137,238, 41,246, 53,255,153,160,146,155,132, 53,183,173,173,241,244,122,
-105, 84,209,189,199,181,250, 66, 46,165,110,212, 79,215, 75, 30, 59, 93, 78,252,218, 7,226, 92, 11,106,107, 89,184, 53,114,216,
- 19,156,232,202,244,187,232,215,169,213,193, 45, 30, 1,143,144,175,233,223,104, 65,215,235,147,247, 86,197,215,235, 56,135,186,
-237,171, 18,240,206, 91,207,241,239,254,205,191,194,215,191,246,211,248,217,175,127, 29,199,223,251, 46, 62, 17,143,103,117, 93,
-250,110, 55, 84,115, 14,101, 70,202,201, 26,207,114,183,120,140,232,254,112,131,227,105,178, 29,114, 28, 64,200,120,250,228, 0,
-225, 1,113, 78, 16,142,230, 76, 87, 44,108,213, 92,213, 34, 3,211,188,184, 84,164, 57, 99,136,236,147, 57,124,111,109, 75, 62,
- 11,118, 49, 99, 18,114,199, 53, 85,197,116, 58,185, 89,206,136,147,206,134, 46, 4, 54,141,121,202,102,160, 19, 71,136, 36, 75,
- 99,227, 96,112,171,191, 22, 21,113, 36,194,160,226,236, 56,102,136, 1, 83, 90, 38,244, 2,243, 2,140, 48, 70, 76, 51, 1,115,
-194, 16,173, 16, 39, 53,168,152, 25,149,121, 29,131, 33, 28, 25, 64,240,239, 90, 18,191,142, 57,129,121,105,184, 57, 16, 2, 5,
- 51,219, 41,231, 20, 17,166,100, 38, 41, 35,102,132, 33,154, 25, 10,249,116,234, 22,168,236,129, 53,170,118,239,102, 81, 39, 22,
-218, 57, 41, 96, 12,164,120,251,173, 3, 94,127,248, 41,224,246, 53, 16,239,135,155, 58,155,142, 46,102, 88,175,222,110,228,171,
-180,242, 31,199, 76,160,121,198,147,221, 4,196, 17,183,119, 51,166,243, 11,219, 67, 15, 1,105, 26, 33, 46, 65,100,205,182, 89,
-192, 66, 68,171,249, 0, 72, 53,129,141,148, 22,174,140,107,218,139,193, 80, 61, 3,201,148,239,220,229,109,169,171, 27, 24, 1,
-128,248, 20, 72,133, 85,239,223,121,110, 76,199,200,135, 70, 51,250,113,163,153,230,219,190,184,218, 1,172,132,236,196, 88,114,
-210,111,246,139, 24,154,200,180,202, 38, 18, 49,205,124, 80,237, 18,213, 10, 79,189, 24,221,179,150,212, 25,173,246,137, 34,132,
- 25,132, 9,132, 68, 11,228, 29,200,152,150,199, 76, 56,119, 26,118,135,190, 92, 22, 23, 89, 17, 73, 27,151,227,149,204,135, 22,
-248,190,202,179,104,137,193,171,111,165,192, 19, 74,221,170,154,215,172,248, 43, 2, 33,189,232, 6, 23,127,248,198, 58,109, 37,
-157,179,152,190, 78,249,212,190,206,149,238, 72,117,123,216, 89,203,249,214,194, 60,189,151, 27,170, 27,196, 52, 52,114,172,254,
-253,173,229,108,178,177,227,150,166,208,244, 63, 75, 23,207,139,198,211,160, 20,106, 89, 95,163, 7,100,108, 23,238,115,205, 4,
-208, 13,137,138, 11,254, 66, 47, 89,187,156, 64,175,153,171, 92,240, 58,252, 53,154,145,197, 18, 95,216,114, 3,168, 97,216, 83,
-251,223, 43,115, 26, 85,189, 72,210,235, 16,165,150, 83,241,195, 16,220,240, 35,231,189,172, 10,186, 94,239, 32, 30,251, 75,180,
- 35, 10,132, 97,196, 33, 42,254,215, 95,251,117,204,136,248,202, 79,127, 9,159,250,212,219,136,131, 77,226,146, 77, 42,182,219,
-239,170,109,105,225, 20,196, 24,145,114,198,121,154,145,179,253,183, 40, 48, 77, 19,134,200,120,246,244, 41, 50,141, 72,115,194,
-232, 12,242, 33, 70,140,187, 17,113, 28,144,242, 12, 38,155,216,152,217,251,238, 50, 65,143, 24, 98,240,148,182,232,250,222,132,
-192,132, 39,251, 61, 66,136,152,147,216,212,239, 18,177, 52,207,152,179, 96, 78, 9, 36, 9, 68,108,176, 44, 17,146, 6,168,204,
- 24,227, 96,147,180, 74,205, 31, 71, 97, 70, 55,247,120,105,160,179,122, 3,146,115, 13, 0,169,141,104,137, 6, 85,177,102,153,
- 2, 52, 11,184,236,131, 75,204, 41, 53, 57, 15,164, 56,101,193, 60,157,193,106,142,121, 22,165,170, 30, 62,227,156, 20,182, 41,
-158, 60, 20, 71, 68, 16,116, 50, 66, 88,136, 80,216,115,205, 62,153,135,104,251,222, 16, 44,239, 59, 6, 32, 81, 64, 78, 25,208,
-185,158,102, 41, 43,158, 12, 25,251,183,222, 66,194, 30, 54,234,222,119,243, 45, 9,149,143,106, 83, 75,225, 47,131, 4, 1,175,
- 18,227,197,139, 4, 58,125,130,195,129, 65,251,103, 56,205,140,233,238, 14, 65, 78,216, 13,132,195, 24,177, 27, 24, 8,214, 36,
- 74,182,138, 86,214,196, 35, 27, 66, 97, 43, 63, 15,229, 33, 87, 60,101, 67,158, 11, 78,154, 0, 76,217,208,159, 57,139, 95,131,
-106, 24,187,248,233, 55,132,115,117,253, 59,124,253, 67, 78, 26, 37, 6, 40,152, 37,112, 52,182, 27,132, 99, 45,242, 16,179,227,
- 77,217,119,245,101,105,224, 43, 15, 91,121, 59, 49, 47,103,176, 36, 48,102,187, 71,156, 15, 48, 57, 82, 0, 91,233,219, 7, 37,
- 14, 27,136, 19,223, 10,179,189,144,130,196, 93,198, 36, 19,102, 81,156,197,244,236,128, 32,136, 65,202, 93,138, 88,179,151, 8,
-196, 24,152,176, 71,105,234,180,163, 68, 22,211,124, 39,171,250, 63,181,237, 39,156,229,220, 23,190,174, 44, 54,235, 64, 90,161,
-137,221, 49, 91, 23, 59, 82,167,118, 99, 70,182, 17,163,139, 33,203, 37,195, 79,107, 26,157, 82, 79,150,171,244,200,123, 72, 77,
-180, 34,126,193, 59,111, 96,219, 22,247,154,236,173, 94,141,245,148,165,168, 41, 68,184, 40,226,232, 24,250, 90,137,129, 82, 75,
- 23,173,138,248, 22, 89, 45,183,197, 92, 23,249, 27, 26,226, 34,182,100,108,218, 19,192, 68, 47,139,223,154, 10, 87,148, 7,116,
- 65,212,211,109,166,184,110,105,217, 27, 52,197, 9,147,180, 52,184,151,235,244, 90,188, 47, 53,244,168, 22,196,219, 51, 6, 93,
-153,180, 31,187, 79,124, 19,149,208, 99,225,246,254, 90,209, 70,159, 75, 61,228,244,128,127,119,183, 56,243,142,246,233,179,183,
-240,103,127,250, 39,248,189,223,251, 46,190,240,133, 47,225,221,247,222,195,147, 39, 79, 48,142,177,126,190,195, 48,184,172,205,
-138,115,246, 2,203, 32,228,116, 54,194,147, 31,171, 49, 88,211,117, 78, 4, 73,147,147,149, 34, 98, 28,188, 49, 48, 98,218,126,
- 24, 64,108,174,112,195, 24,221, 30,213, 29,233,192, 86,216,200,227, 73,213, 86, 98, 67, 12, 64, 48, 89,217,156,102, 39,199,101,
- 8, 24,231, 36, 56, 31,111, 1,153, 17,189,120, 79,211, 12,146,140,231,163, 77,204,217, 51,220,166,148,145,115,182,232, 87,151,
- 61, 65, 21, 67, 96,159,248, 76,158,151,211,140, 98,200, 51,123, 44,104,174,164, 52,203,211,182,224,150,224,197,221, 73,189,210,
-192,211,190, 87, 15,102, 13, 7,205,128,230, 25,162,217,141, 80,168, 54,230,170,192,156,178, 23,181,229,163, 13,126,206,206, 26,
-204, 43,221,225,222, 65,179, 61, 39,204,177,140, 69, 48, 12,132,153, 77,118, 71,146, 43, 19,158,152,145,148, 16,114,194,243, 39,
- 3,116,247,220, 88,228,247,212,243,218, 51, 95,233, 34,117,163, 1,111,117,236, 68,192, 36,132,233, 40, 56,221,126,132,249,248,
-202,209,244,157,193,221,243, 12, 72, 2, 71,198,184,219,225,201,205, 1,187,253,222,154, 34, 53, 43,214,125, 36,236, 6, 2,141,
- 12,196, 17,160,104, 6, 63,110,140, 20,120,209, 97,129,221,108, 70, 1,202,142,158, 72, 54, 93,184, 24, 71, 65,154,212, 59, 16,
- 53,241,220,161,158, 87,166,155,103,168,186, 5,177, 24, 25,209, 62, 39, 6, 35, 58,255,172, 88,207,100,139,100,205,166, 71,103,
-191,174,234, 59,248, 49, 0, 97, 32, 8, 5, 75,209,211, 98,236,228,123,254, 58,149,147,120,180, 28,117, 80,237,250,144,102,136,
-177, 51, 69,188, 1, 48,136,160,152, 29, 6, 6,134, 2,207,118,100, 46, 70, 38,194, 12,216,132, 15,234, 2, 21, 66, 19,128, 33,
-186, 88,183, 44, 31,173,244,187,226,139, 57,141,170, 17, 67, 99,152,186, 25, 16,210, 51,125,169, 2, 24,133,173, 88,172,254,218,
- 78,129,187, 67,142, 22,153,153,182,187,126,237,118,179,219,211,248,234,240,111,166, 94,129,118,204,243,251, 78,123,109, 76,219,
- 47,244,223,235, 50,190,225,209,222,153,171,172, 38,232, 53,110,160,208,171,143,177,102,182,235,214,239,109,176, 95,251, 21,238,
-198,227,235, 50,253,114,123,127,104,239, 7,112, 73, 94,219,184,210,107, 45,187, 72,223,156,164,185,178,136,175,211, 28,139,110,
-191, 73,102,127, 68,181,189,216, 6, 60,114, 64,161,141, 79,243,161, 96,186,251,111,153,199,190, 88,197,198, 77,177,189,143,167,
-254,212, 54, 34, 53, 99,140,140, 63,248, 63,127, 31,162,192,187, 63,246, 25, 28,158, 62, 3,135, 17,251,253,128,193, 37, 96,198,
- 96, 39, 68, 47,240,170,140, 33, 14,128,154, 75,219,235,211, 4,205, 25, 79, 14,123,196,184,131,202,236,190,233,131,193,195,108,
- 58,107, 14,198,158, 15,113,112,164, 45,187,132,137, 49, 14, 92, 39,227,156,178, 37,164,145,184,124, 40,184,159,124, 70,154, 18,
-134,192, 24,130,185,221,205,105, 2,201,140, 24,236, 80,159,146,231,141,179, 98, 8,192,205,211,231,152,104,143,243,249,136,121,
- 78,206, 3, 48,183,182,232,222,238, 69, 66, 85,118,226, 4,235, 28, 73,196,195, 96, 20,105,158,125,245, 32, 62,229,195,223, 83,
-116, 83, 19, 99, 89,179, 67,178,133,223, 19,124,253, 51, 11, 16, 92, 71,175, 96, 48, 9, 98,228,250, 26,204,104,199, 18,200, 6,
-214,154,189, 18,216,252,248,161,132,128, 4, 14, 64,224,136, 56, 48,116, 24,161, 26, 92,194,230, 6, 84, 8,136,154, 16,131, 0,
-193,132,114,201,229,239,148, 20,159,190,201, 56,188,243, 14,146,238,221, 91,253,254,239, 65, 43,203,188,255,190,213,134,232,102,
- 67,230, 81,129,227, 81, 65,114,135,147, 40,242,249, 12,202, 19, 66,201, 76, 87,219, 37, 27, 98, 1,140, 99,192,225,102,135, 48,
-238, 16,137, 49, 6, 2,198,128, 16,119,136, 60, 66,217, 33,114,144, 7,163,152,167,190,128,171,103,126,128,130,120,201,162, 23,
-101,219, 99, 75, 2,147,172,236,203,201,227,126,201,238, 51,247,129,177,166,141,151,164, 54,127,157, 1,179,165,244, 49,170, 47,
- 65, 32,170, 33, 45, 2, 32, 8, 48,120,147, 87, 34, 96, 7, 2,226, 64,224, 97, 0, 33,130, 68, 65, 98,126, 44,145, 26, 15,108,
- 89,201,104, 4,171,228, 53,178,244, 30,177,245,186,123,237, 22,243,124, 79,160,241,221, 73,104,184, 78,226, 26,113, 82, 65,242,
-127,175,240, 5,245,147, 80,203,176, 22,215,119, 46, 14, 68,205,207,208,198, 45,227,251,100,190,150,203,126,223, 97,165,151,144,
-185,108,133, 8, 53,249,216,173, 52,170,101, 56, 87,247, 53,237,137,109,186, 1,195, 75, 3,233,166,182,137,113,222, 1, 61, 48,
- 45,213,231, 21,221, 30,174,180,217,233,118,251, 98,169, 13, 77, 65, 46,186,114,121,193, 54, 95,244,249, 68,235,194,222,198,193,
-186,191, 1,245,205,160,174,216,241,186, 34,153, 21,141,247,122, 47,174,170,149,164,103, 55,244, 34,253,178,123,164,245, 23, 40,
- 76, 97,186, 56, 26,234,117,184,200,180,237, 27,155,107,215,123,105, 32,196,249, 33, 27,242,190,149,170,163,222, 59,173, 74,224,
- 30,179,186,107,177,234,180,217,170,253, 8,251,243, 45,182,192, 35, 59,142, 50,241, 19, 22, 27,225,174,145, 82,197,254,176,199,
- 7,239,127, 15, 47, 95,126,130,231,111,191,141,183,223,122,134,211,237,107,104, 14,102,223,153,206, 24,198, 61, 68,128,121, 58,
-215,160,148,192,132, 41, 37,188,126,125,135, 12,114,163,150, 1,146,196, 51,208,131, 65,194, 98, 69, 17, 49, 32, 75,198,126, 48,
- 8,121,154,147, 19,224,108, 84,137,113, 4,179, 24, 33, 46, 4, 12,140,154,126, 6,223,153,134, 0,119,237, 34, 48, 71, 95, 35,
- 42,198,221,136, 87,199,140,148, 79,102, 80, 2, 91, 29,156,178,226,238,147, 35,114,154, 65,146, 76, 39,207,128, 82,192,233,156,
-177, 27,128,253,126,176,134,193, 28, 78, 48, 48, 97, 70,132, 22,217, 84, 74,136, 62,229, 5, 21,168,147,220,152,204, 1, 83, 68,
-144,197, 97, 96, 39,148, 22,136, 87,157, 24,194,149,112, 42, 0, 51, 88,216,144, 54, 37, 40,179,101,193, 19,160, 33,128, 53,131,
-131,121,133, 51, 53, 12,122,135,242, 19, 89,245, 32, 24, 33, 44, 66,160, 12,100, 53, 98,222, 46, 36,200, 24,145,133,145,148,145,
-147,197,126, 70, 88, 49, 26, 3,225,157,119,159,227, 47, 94,188, 11,189,251,115,208, 16,239, 65,211, 31,207,123,215,213,151, 40,
- 18,240, 74, 9, 31,189, 36,124,233,248, 2,225,112,198,168, 1, 41,204,200,129, 64,137,129, 16,192, 25,136, 81,145,133, 17, 36,
- 97,140,128,196, 8,205, 1, 89, 51,132, 0,228, 1, 68, 69, 6, 25,170, 93,180,212,178, 43,221, 48, 96,235, 95, 66,112, 55, 56,
- 37, 32,169, 32,102,131,148,217, 7, 74,241, 51,138,200, 73,212, 68, 75,106, 26, 1, 44, 84, 73,188, 86, 63,170, 70, 12,193, 7,
-217,228,104, 76,177,168, 77,234,228,111, 22, 40, 69,136, 12,174,100, 48, 15,251, 16,163, 17,242, 28, 93,136,157,150,124,237,173,
-214,236,176,225,246,167, 45, 28,186, 20,217,114,232, 50,148, 20, 17,102, 80, 99,230, 41,228, 12,240,165, 59,107,109, 76,203, 81,
- 40,208,149,228, 77,171, 23,110,233, 84,209, 48,210,123,253,148, 94,206,150, 43,203,212, 54,214,180,151,101,105,199, 94,239,102,
- 27, 89,145,192, 22,250, 93,179,127, 70, 67,152,234, 79,229,146, 89, 94, 92, 3,239,131,225, 47, 97,250,133, 80,182,236,161, 8,
-155,146,128,166,146, 44,250,233,141, 10,223,202, 42, 58,174,158, 94,233,166, 55,138,120,247,154, 86, 5,159,182,174, 7, 93, 52,
- 0,173, 45,170,170,174, 68,101,205,190,218,223,183, 10,144,105,139,151,224, 59,204, 21,131,188, 60,102, 33,184, 80, 3, 59,105,
- 33,179,108, 82,224,112,209, 88,212,171,208,233,253,181,243,161,175, 77,144,174,109,149,174, 24, 20, 93, 33,158, 17, 45,132,125,
-253, 17,247,232, 15, 31,160,107,247, 35,186,223,214, 14,141,141, 49,181,250,140,203, 87, 24, 99,196,237,221, 29, 94,188,248, 24,
-159,123,235,109, 60,123,254, 28,175, 94,191,198,233,213,173, 47,187,156,230, 51,142, 32,168, 37,167,205, 9, 4,198,156, 50,224,
-150,177,187,225,169, 17,145,144,221, 32,133, 49, 14, 86, 48,111,239,142,166,235, 21, 59, 8, 99, 24, 48,120,162,153, 69,187, 50,
-114, 54,107,212, 34, 5, 11,113,132,128,145,243,132, 93, 52,219,213,115, 18,236, 71,179,146,157,146, 73, 49, 66,136,152,166,140,
-243,121, 50,219, 84, 95, 18,227,205, 0, 0, 32, 0, 73, 68, 65, 84,255,108,231,100,167,217,160, 51, 34, 51,206,217,164,104, 76,
- 62, 41, 65, 48,205,198, 90,143, 67, 0,171, 5,185, 36, 98,228,201,164,106,202,214, 52,104,224,106, 46,165,238, 2, 70, 76,230,
- 21,175, 12, 21,130,164,134,231, 66, 90, 39,124, 35,247, 49, 34, 71,164, 16,144,179,133,148, 44,105,112,245,147,170,212, 7, 21,
- 67, 2,163, 10,136, 66, 93,203,137,167,239, 25,203, 93,106,226,157,114, 4,170,109,172, 88, 80, 79,182,196, 51, 81, 1, 35, 35,
- 4, 69, 38, 91,141,188, 51, 38,188,254,204,167,241,226,255,253, 24,163,220, 1, 60,174, 20, 52,215, 85, 30,215,167,244,190,186,
- 51, 1, 39, 0, 31,188, 12,248,234,139, 15,241,236,217, 71,192,225,109,228, 20,144,101,103,126,232,147, 5,164, 4, 16,198,145,
- 32,216,129, 84, 49, 4, 66, 30, 35, 36, 11,134,217,104,224, 2, 53,103, 84,246, 98,236, 40, 8,249, 90, 86,252, 62,207, 94, 38,
-130, 75,199,196,125,218,129,128, 89, 24,148,125,210,166,224,147,191,161, 32, 4,241,129,100,177, 99, 51, 30, 5,251,240,185,112,
-163,172,136, 11, 8,118,127,164,220,248,174, 20, 21,215,236,181, 16,217,207,229,130,190,200, 18, 84,102, 69,125,109,108,162, 23,
-211,233,122, 40,110, 93,213,106, 43, 64,230,188,214,177,163, 11,137,204,167,251,212, 24,102,175, 61,231,130,215,105,193,226, 32,
-132, 10,122,182, 28,245,166, 9,208,181, 54, 90,239,183, 95,213, 13, 8, 94,155, 59, 71,215, 75,120,170,123,243, 70, 49,185,128,
-188,157, 44,170, 36,187, 81,149,196,213, 98,124,241, 58, 55,107,237,198, 28,213, 60,126, 39, 21,107, 26,146, 54,147, 88, 31,147,
-207,189, 81,152, 55, 11,120,127, 13, 46,126,127, 45, 87,187,242, 62, 91,230,125,249, 57,193, 18,112, 80,180,204,165, 98,234, 70,
-163,208,166,159,161, 97,196,183,153,180,122, 17,242,162, 93, 24, 13, 54, 27, 19,185,100,214,119, 36, 62, 90, 61,151,214,144,141,
-203,125,136, 94,188,231, 69,253,112,105,169,190,134,216,137,157,116,163,242, 67, 79,229,111, 58, 13,109,236,116,182,245,107, 23,
-143, 75,151,138,130,174,168, 7,124,242,201, 75,124,244,209,135,248,226, 87,190,142, 41, 41, 66, 24,176, 63,236, 64,211, 18, 9,
- 52, 12,140,105, 8,120,253,250,136,172, 51, 36,153, 62, 60,229,140,195,225, 0, 38,115,104, 15, 4,135,215,109,138, 49,163, 14,
-131, 56,121,136,174,217,205, 38, 67,203,103, 75,141,139,140, 33, 68,144,239,206, 77,131, 12,179,111,117,201,154, 34, 64,230, 25,
- 26, 2,166,188,179,137, 30,230,226,149,100,130,164,185,255,254,170, 21,245, 16, 71, 40, 51, 88, 12,166, 15, 30,137, 90,245,228,
-115,178,204,237,192,150,254, 38, 64, 32,147, 74, 33, 39,128,204, 88, 4, 98, 54,174,230,168,107,254,241,102,204, 51, 96,128,169,
-135,146, 47, 95, 5,168, 54,165, 41, 11,136, 51,198, 17,246, 88,152, 43,146, 42, 98,175, 51,120, 2,157,138, 21,109,150,132,200,
- 12, 98,231, 76,101, 71,157, 20, 96,100,196, 32, 8, 49,120,218,151,218, 53, 98, 64,185, 52, 69,134,114,236,216,196,206,105, 54,
- 52,193, 82,220, 4,163, 36,124,246,157, 3,110, 95,127, 30,249,253, 63, 70, 24,147,157,234, 69, 73,244,192, 29,189,182,208, 94,
- 16, 61,234,134,193,153,129,191,126, 29, 64, 47, 94, 97,247,119, 62,192,171,155,207,130,207,207, 17,211,107,200,110, 97,188, 3,
-201, 24,235,108,238,131,101, 71,190,231, 17, 66, 10, 14, 39,128, 7,103,147, 79, 0, 51,136, 34, 2,103, 67,160,220,220, 40, 9,
- 1,217, 10,174,168,248, 36,206, 85,214,106, 5,182,240,171,202,222,212,178, 13,140,171, 38,222,168, 27,234,204, 84,242,111,236,
-113, 10, 9,171, 88,191,177,163, 48, 20,128, 92, 21, 67,217, 21, 30,228,159,111,170,114, 56, 21, 59,199,136,184, 14, 76,177, 88,
-227, 17, 46,211,198, 22,178,155,118,118,157, 76,203,110, 83, 74,124,168, 55, 7,137,128,236, 55, 78,108,200, 95,229, 67, 41,147,
-127,213,123, 99,145,138,173,227, 55,214, 33, 34, 45,148, 72,141,236,237,126,162, 81, 99,204,114,117,191,168, 87, 80,201,254,176,
-211,186, 78, 95, 5,203,116, 7,183, 75, 2,137,218,124,171,250, 24,180,149, 58, 72,215,161, 86,106, 52,225,117,254,164,229, 49,
- 43, 43,187, 93, 93,104, 5,194, 87, 19, 39,186, 37,128, 42,109, 23,251, 71, 77,231,189, 92, 13,104, 95,211,202,148,103, 37,157,
- 35,135,222, 69,169, 91,239,108, 53, 0,149, 61,220, 76,252,229,189, 94,192,236, 87, 94,163,138,221,180,212, 33, 60,218,200,106,
- 86,144,127,183,235,215,198,213,160,197,150,244,225,194,170,173, 28,115,181, 18,106,100,121,128, 7, 76,116,192, 70, 63,211,208,
- 3,166, 56, 63, 84, 49, 87,189,130,119, 94,195,221,177, 52,172, 5,201,211,203,165, 18,145, 77,220,127,249,215,239,227,231, 68,
- 42, 17,142,134, 1, 41, 43,246,251,157,155,152, 5,224,110, 2,221,157,161,202,110,232, 98,102, 47,175,134,215,120,235,237,103,
-216, 15, 35,102, 26, 29,138, 52, 93,186,102,219,175, 43, 24, 41, 41,118, 44,216,239,204,131, 61,237, 71,176, 8,166, 52, 33, 99,
-196, 64,192, 48, 4,164,204,213, 0,198,216,242, 6,175,134,194, 86,158, 39,176,102,156, 11,107, 92,109,199, 41, 98, 65, 44, 42,
-166, 37, 55, 23, 66, 1,192,230,204,182, 27, 32,228, 94,247,100, 16, 49, 71, 91, 39,144, 16,230,212, 40,107, 64,110, 22, 98,247,
-160,161,243, 25,177, 4,112,168, 88,112,135, 8, 6, 34, 76, 28, 48, 75, 6,231,140, 24,141,137, 78, 76, 32, 1, 34, 27,153, 45,
-137, 79,116, 37,115,131,225,129, 36,106,204,118,113, 98, 91,185,125, 56, 64, 51, 65,114, 70,160, 34, 37, 76, 16,101, 4, 48, 52,
- 68,243, 17,208, 25, 9, 17, 9, 12, 18,128,178, 77,230, 67, 32,196, 49, 32,229,209,162, 94,117,198,192,150,132,246,132, 19,222,
-121,239,109,124,255,229,187, 8,211,247,141,229, 72,247, 40, 46,238,217,189,171, 94, 34, 71,100, 47, 31,255,207,109,192,221,247,
-143,216,233, 95, 65,195,207, 2, 58, 34, 66,145,153,161, 49,130, 89,192,228, 90,252,108, 40,113,140,132, 68, 17, 34, 12, 10, 2,
-162,157,251, 34,176,115,153,114, 89,199, 87, 13,123,112,195, 34,113,222, 67,238, 52,227, 0, 72, 22,197, 84,155, 87, 65,169,174,
- 27, 5, 10,245,213, 72,114,146, 97, 13,129,161,198, 14,141,122,117, 64, 96,212, 0, 36, 99,198,231,138, 8,170, 4, 95,143,107,
- 93,187, 22, 89,173, 42, 33,252,212,231,223,251,206,241, 52,217,158,137, 46,139,187,254,127,180,189, 91,175,100,215,145, 38,246,
- 69,172,181,119,230,185,214,189,138,197,162, 72,138, 20, 69, 81, 18, 91,221,237,238,105,184,199,118, 15, 26, 6,198,104,140,167,
- 31,198,131, 25, 79,195, 3,248, 6, 3, 54, 96,216, 47,182, 1,191,232,193,191,196,127,192, 79, 54,140,241,192,126, 24,195, 51,
- 99,117,171, 37, 81, 20, 37,138,215,170, 98, 85,145,117, 63,117,206,201,204,189,215,138,240, 67,196,190,230,206, 60,135,106,185,
- 0, 9, 82,213, 57,121,217,185,115, 69,196, 23,223,101,196, 98,111,164, 98,220,121,210,116,241,149,218,151,133,245,229,113,157,
-196, 76,122, 16,187,162, 31,252,210,155,132, 91,135, 30,151, 10,140,246,253, 52,128,240,105,114, 15, 58,112,125,211, 97,145,217,
- 6,107, 78,231, 92,140,203, 4,173, 49,159,105,234,189,248, 11, 19, 26, 62, 14,209,116, 53,167, 9,230, 52, 77,176, 2,198, 7,
-252,148,215, 90,211, 64,141, 31,183,191,166,234,138, 37, 77, 19, 10, 39, 39,254, 77, 26,249,233,216, 85,208,186, 55,254, 57, 46,
-248,154, 75,220,208, 5,111, 72, 63,155,174,119,212,243, 89,167,193,205,179,177, 60, 14,244,246, 29, 92, 69,125,105,205, 89,143,
- 49,154, 52, 26, 56, 98,176,219,118,134,108,115, 10,208,216,221,142,232,204,120,218,223,108, 34,223,178,192,223,210, 52,244,189,
-225,169,183,154,155, 98,172,180, 92,145,148,144, 53,224, 59,239,188,141,186, 94,161,174,204,225,108, 85, 39, 16, 7,196,162, 4,
-199, 2,171, 58,227,116,177, 68, 93, 45,145, 82,237, 42, 57,219,217,238,239,239, 98,239,224, 2, 6,214,178,126,128, 20,209,200,
- 76, 5, 3,151, 14,230,184,112,225, 2,246,246, 15, 48,155,237, 0, 69,137,211,101, 54,182,124, 32,196, 98,102,211,189,203,125,
- 66,140, 70, 18, 99, 5, 71, 19,206,198,192, 0, 71,212,117, 66, 93,173,144,146,165, 95, 53,252, 13, 70,151,240,197, 4, 51,139,
- 9,100,182,174, 78,208, 99, 14, 94,244, 74,191, 64,205,170, 66, 81,165,134, 37,109,208,108,206, 25,164,130,136, 12, 4,130, 82,
-244, 29,169,101,122,131,109, 74,172,151, 85,235,183, 31, 60, 47, 62, 4,130,112,129,148, 9, 82,175, 12,182,109,156,207,220,201,
- 78,178,180, 50, 85, 35,134, 82,187, 4,101,127, 63, 69,104,115, 94,187, 60, 2, 37,228, 36, 96,212,200, 20,144,171, 12, 72,229,
- 81,163,141,148,142,157,188, 42,136, 36, 8,209,138,169, 42, 99,111, 22,112,138, 25,150, 71, 47, 16, 80, 65, 61, 27,252,220,176,
- 83,187, 58,211, 73,238, 7, 51,240,100,201,120, 13, 75,188,241,173,136,147,253,223,129, 44, 20,200, 47, 0,202, 16, 33, 68, 5,
-202, 32, 70, 36,139, 69,219, 64, 55, 22,175,234, 30,247,109, 90, 91, 54,239,127,201,181,125, 6,141, 85,185,152,251, 30, 27,179,
-208, 21, 25,161, 85, 97,161,205, 41,160,222,226,151,214,191, 98,228,195, 45,251,222, 91, 76,125,147,155,168,221,129,147, 37,181,
- 35, 43, 53,133,182,141, 9,103,203, 90, 39,237,201, 26,135, 22,228,101, 12, 8,223,124,229,218, 15, 23,139,202,165, 92,180,129,
- 92, 70,131, 66,222, 91, 69,175,205,196, 58,250,226,107,243,187,126, 91,133, 94,147, 48,120,124, 26, 30,218,230, 56, 53,220, 13,
-117,150,129,163, 98, 54,158,126,123,190,206, 83, 89,173, 83,187,206,109, 53,166,157, 94, 39,232,204, 52,176,214, 29,170, 7,186,
- 29, 50, 13, 28, 72,187, 98, 75, 27,167,117,108,101,238, 99,226,208,167,181,166, 64,123, 21,136,116,170, 48,244,190, 60, 27, 45,
- 99, 55, 20,235,141,117, 96,115,166,250,248,158, 58, 87,179, 48,241, 36, 58, 81,216, 55, 22,218,254,218,162, 31,120,191,109, 69,
- 49, 32,230, 97,164, 4,233, 21, 96, 58,135,223,251,214,107,187, 41,208,167,151,101,191,241,241,244,111, 88,204,117,152, 40,115,
- 86, 65, 31,115,110, 8, 35, 91,185,225,159,178,136,184,247,224, 43, 92,185,241, 50,222,120,229, 38,238,125,249, 16, 85, 85, 67,
-115,221,153,174,112,192,209,139, 83,172, 22, 75, 52, 1, 40,169, 78, 80, 17,135,214, 75,204,102,115,236,204, 11,223, 69,218,129,
- 90, 4,177, 48, 21, 2,246,231, 5,246, 46, 92, 66, 40,247, 80, 20, 51,112, 81,226,171,163,132,227,103,207, 17, 41,187, 29,167,
-105,188,219, 44,117,119, 90,179, 34, 25, 90,163,145,166,145,171,179, 98,185,172, 44,187,218,155,129, 38,105, 46,231,100, 50,223,
- 96, 62,237, 57,101,236,148,140, 80,150, 38, 67, 99, 70, 25, 3, 98, 89, 34, 11,185,153, 72, 64,170,147,121,204,251,101, 11,108,
-251,209, 88, 20, 88, 73,132,166, 26,196,140,156, 5, 69, 36,112, 40, 33, 30,179,153, 83,106,245,239, 68, 48,179,152, 44,136,193,
- 57, 75, 13,226,208, 31, 1,200,176,248,208,114, 87, 26,118,184,175, 72, 2,129,163,237,206,155,244,202,172, 62,176,185,113, 74,
- 3,225, 19,204,112,199,227,204,188, 15, 48,130, 88,140, 17, 28, 3, 18, 34,170,236, 48,255,188,196,209,178,132,158, 62,181,196,
-178,150, 16,125, 94,138,220,244,173,217,120,144,188, 80, 32, 28, 3,127,251,214, 83,208,183,190,137, 19,249, 38,234,213,137,161,
- 48, 4,203,126,103,184, 47,122,105,177,172,196,173, 21, 46,162, 33, 16,117,130,231,145, 91,186, 94,110, 86, 73,210,131,205,197,
-200,136,230, 3, 31,218,233,157,220,164,134, 60,245, 79,168, 33,201, 13,207,219,208, 4,129,185,181,122, 91,164, 65,230, 43,160,
- 22,121,219,196,224,194,215,216, 89,105,200,253,105, 19, 67,209,121,209,187, 31,189, 5, 28,217,154,106, 86, 22, 54,169,167,101,
- 13,238, 16,195, 65, 38, 58,245, 18,216, 90,113,143,246, 44,236,122, 52,128, 62,129,174, 97, 44,135, 86,239, 13,163,218, 59,195,
- 16,218, 77,229,218, 99,187,247, 9, 83,227, 83,143, 38,204, 61,168,119, 8,211, 26,147,151,122,110,110,180,177,120,158, 57, 56,
-246,181,234, 62,174, 81,255,224,223, 32, 32,106,118, 28,220, 56,144,141, 60,240,251,110,105, 83,207, 59,140,148,237,201, 20,214,
-224,237,169,108,249, 49, 61,128,134,207, 59,178, 85,221, 90,228, 54,161, 33,180, 5,239,160,177,120,112,248, 23, 52,137, 4,108,
- 43,206,253, 59, 64,167,235,253,150,198,132,166,246, 30,253,159,239,252, 91,167,192,242, 45,208, 14, 13,250, 5,210,141,112,203,
-217, 82,159,175,241,135,136,206,132,228,183, 63,233, 38,207,188,222,180,173, 58, 65,224,236,223,175,155,215, 16, 76, 12,169, 79,
-113,251,171, 23,248,198,155,239, 96, 7, 75, 60,126,242,220,242,209,103,102, 6, 83,103,194,209,209, 49, 40, 85, 78,152, 51, 83,
- 24,109,116,185, 10, 28,236,237,224,240,194, 33,200,229, 89, 12,193,188, 44,192,197, 12,243,178,192,193,225, 1,132,103, 54, 8,
- 16,227, 40, 5,220,191,255, 0,188,122,142, 16, 35, 2,199, 86, 10,102, 36,176, 96,209,150,238,241, 45,218,227, 73,144, 17,237,
-170, 42, 35,173,150,208, 84,183, 58,228,198,205,173,121,207, 49, 24,244, 45, 41, 25,209,174,152,183, 94, 7, 92, 68, 36, 42,160,
- 57,217, 74,210,181,241,164, 25,145,155, 66,108,174,115, 96,182, 53,187,214, 78,226, 51,108,179, 40,204,246, 86, 36, 35,186,215,
-119,206,141,142,217,172, 68,197, 51, 57,162, 40, 56, 0, 9,193,249, 6, 6,241,138, 23,133,178, 96, 32, 70,211,180, 55,123,119,
-104, 91,164,219,245, 25, 25,150,170, 68, 72,217, 2, 92, 66,224,238,188, 86,177,248, 85,183,253,173,133, 77,162, 23, 24, 89, 44,
-148, 39,213, 53,230, 72,224,217, 28,207,143, 19,168,126,225,198, 57, 91,131,166,167, 73,114, 83,253,168, 2,129, 21,247, 78, 25,
-111,224, 24,111,254, 32,226,249,222, 31, 35, 45, 24,168,143, 17,144,128, 64, 16,138,136,100,198, 57, 66,132,146, 76,234,215,186,
-254,113, 68,173,132,170,206,168,147, 25, 13,169, 24, 1, 78, 52,155,238,191,237,243,196, 10,174,167,247, 21,193,120, 35,226,197,
- 57, 2, 16,182, 68, 79, 18,114,119,193,206, 8,157,219,212, 48,106,145, 81,105,118,232, 77,157,112,134, 59,185,127,188, 0,200,
-217,255,135, 74,139,162,180,223,125,120,250, 92,111,162,167, 16, 80,204,119, 16,222,124,245,218, 15, 83, 85, 89, 12, 93,107,151,
- 61,178, 61,161,225, 20, 44,107,160, 51, 70,161, 45, 29,197,159,168, 41,214, 6, 53, 72,207,190,148, 90,152, 24,131,253,226,218,
- 97,186,101,138,165,141,213,104, 10,218,158, 14, 69,153,148, 16,209, 58,199, 96,109, 17, 78,125, 40,146, 38,158,163, 3,101, 6,
-129, 48,212, 39,221, 17,214, 84, 86,227,227,182, 15, 33,143, 15,227,190,101,225, 48,154,100,195, 65,190, 45,134,132,182, 35,177,
-155,138,230,150,207,142,122,182,236,212, 95,131, 16, 70,100,180,225,122, 99,216, 3,232,128,231, 65, 95, 11, 69, 24, 10,249,105,
- 19,212,223, 71,138, 90,184,189, 55,249,232, 89, 89, 47,244, 55,171,210,248,173,252,250,153, 92,184, 22,122, 64,143, 13, 75,211,
-251,249,193,119,164, 7,249,157,247, 85,206,102, 51, 60,251,234, 62, 62,250,226, 41, 94,127,227, 13,236, 82,133, 58, 37,236,238,
-239,130, 66,137,163, 69,141,197,241, 9, 10,178,112,146,101,157, 90, 75,208,192, 86,208,102,243, 57, 46, 92,186,140,249,108, 6,
- 2,176, 59,143,160, 88,160,242,240,233,217,238,190,233,134,213,156, 44, 31, 62, 57,198,242,217,151,173, 73, 77,227,215,201,189,
-248,200, 98, 86, 32,196,194, 52,230, 34, 96,205,136,129, 80, 9, 97, 85,213, 72,213, 10,208,108,210,162,236,145,151, 49, 24,251,
- 92, 60, 6, 51, 90,179, 80, 80,198,204,247,234,117,178,169, 47,186,163,157,106,130,100,109,179,175,193,108,233, 91,112,217,147,
-159,135,226, 89,235,205, 14,211, 52,235,130, 16, 11,207,136,183,226,106, 26,117, 35, 69,101,176, 17,226,160,136, 1,208, 88, 32,
- 11, 27, 17,175,189, 89, 45,215, 93, 89, 33, 84,250,247,175, 57,123,205, 98, 55, 6, 43, 52, 77,161, 87, 34,179,234,117,231, 12,
-102, 65, 12,209,228,202,108,102, 62,171, 36,168,107, 83, 10,228,156,140, 37,239, 48,127, 65, 25, 5, 41, 14,119,129,101,121,136,
-147,103, 11, 4, 61, 5, 56,110, 92,213,172,143, 67, 61, 15,144,222,191, 69,255,135, 8,197, 11, 16,158, 61, 36,252,173,203,247,
- 81,190,253, 58,170,244, 45,112,125, 4, 32,163,100,131,161,205,164, 79,220,131,160,128,176, 64, 66, 64, 70, 68,114,105, 89, 22,
- 66, 85, 11, 82, 85, 33,215,169, 53,242, 49, 47, 46,237,148, 68,170,200, 30,153, 42,234,105,158, 49,120,179,105,123,119,147, 27,
-178,223,195,185,245,214, 16,106, 76,211,168, 77,231, 67,123, 15,104,187,218,107, 60,203,152,140, 48,201,161, 9,145, 81, 35,199,
- 57, 17, 19,173, 17,156,249,249, 55,173,158,128, 81, 22, 51,132, 55, 95,189,254,195,213, 98,101, 93,167,142, 17, 53,194,184, 33,
-151, 13,135,143,210, 48,225,173,237,246,209, 40, 44,156, 29,239,157, 6, 19, 80,184,246, 80, 8, 61,136,222, 14, 94,105,165,116,
- 52, 25, 28,165, 83, 27,229,158,244,107, 32, 67,154,120, 63,103, 73,203,198, 4, 56,218,152,224,181,101, 37, 64, 35, 82, 49, 58,
-151, 58,165, 62, 76,238,255,159, 54, 64,165, 91,154,149,182,164,211, 80, 98, 36,155, 38,205,243,236,132,183, 77,204, 91, 96,242,
-105,143,253, 41,121, 23,109,124,204,245,253,249,152, 60, 56,113,161,182,192,219,212,226,254,180,189,246, 18, 6, 6,252, 93,184,
-130,158,235,186,244,146, 33,123, 59,114,234, 66,115, 54, 12,196,138,205, 30, 6,191,213,138, 78, 83, 11,113,218,192,157,211,233,
-229,187,158, 35,153,110,112, 64, 51,230,179, 2, 79,239,125,142,175,158,175,240,246,155,175,155,129, 70,136, 88,102,194,241,209,
-115,212,171, 85, 27,234, 66, 30,122,146, 83,110,157, 29,247,102, 5,118,246,247, 48,219,221, 55,183,184,162, 64,166,136,106,185,
- 68, 25, 0,138, 37,150,149, 96, 85,213,120,246, 98,133,147,167,143,192, 90, 57, 11,159,221,161,210, 88,208,112,133,129, 18,252,
- 48,182,198,161,140, 1,161,136,168,146,162, 94,154, 46, 61, 9, 80, 85, 9,164,226,120,179,217,138,166,100, 69,131,131, 77,185,
-179, 89, 9,226, 2, 2, 70, 74, 9,177,137,135, 45, 11, 52, 6,219, 41, 43,114,206,221,196, 79,112,235, 80,155,190, 88, 93,210,
- 70, 70,202,107,188,214, 45, 62, 56,180,174,112, 28,130, 17,242, 66, 68,206,138,128,108,241,174, 20, 33,226,158,243,144, 54, 11,
-156, 29,234,237,172, 82,179, 7,113,121, 72,137,203,215, 56, 68,247,246, 16,247, 42, 55, 8,155,156,183,192,228,164, 59, 50, 83,
-156,140,128,180,202,160,188,116, 40,218,224,106, 85, 70, 65,130,224,182,203, 59,251, 59, 56,150, 93,172,158, 63, 65,160,186, 93,
-131,208, 38, 66,243, 0,115, 95, 23,117, 6,255, 47, 65,196,140,129, 59,203,128,139,143, 79,240,189, 55, 31,225,248,218,191, 1,
- 84,187, 8, 88, 88, 72, 77,100, 80, 17,193, 92, 34, 18,129, 10, 66,205, 17, 73, 35, 36, 51,178, 8,234,100,118,171,170, 10, 77,
- 2,145,218,248, 11,146, 17, 32, 78, 8,151, 33, 34,237,102, 66,162,102,246, 18,154,100, 51,247,197,135, 75, 27,163,187,212,129,
-201,249,241, 38, 85,108,173,149, 73,218,179,162,207,177, 82, 37,143,115,117,162,120,176,245,145, 18,247, 52,243,221, 32,220, 56,
-172, 54, 29,193,172, 40,108,167,190, 92, 84, 22,218,174, 24, 57,150,217, 73,197, 61,182,249, 38, 35,140,113, 40, 72,195, 80,214,
- 17, 49,174,217, 13, 4, 16, 34, 81, 63, 53,125, 68,206, 67,207, 27,158, 48,166,141,211,232,223,169, 15,209,110,176, 14,237, 19,
-241,112,198,164, 78, 19, 53,149,206, 26,175, 6,107, 0,234,106,201, 26,193,202,139,240,218, 72, 77, 3,222,194,144,168, 69,235,
-199,254,232,119,181, 41, 72,218,175, 81,212,154,182,140,119,198,127,163,194, 62, 57,209,143,254, 94, 59,222,193,166, 93, 57,109,
-152,116, 7,239,148,250,205,128,110, 64,196, 55,163, 12, 52, 73,232,154,126,127,138, 46,250,144, 55,150, 88,154,234,147, 90,100,
- 66,183, 17, 55,104,227,171,249,255,113, 82, 31, 75, 56, 55, 20, 97,221,252,126, 91,175,160,115,182, 30, 93, 14,130,153,200, 60,
-249,234, 46,190,247,214,171,120,249,214, 77, 60, 63, 93, 96,181, 88, 1,169, 70,189,170,145, 83,237, 44, 94, 70, 45, 70,146,203,
- 57, 33,137,226,112,127, 7,215,175, 93,118,194,149, 77, 86, 76, 0,107,182,201, 58, 1,139,197, 18,199, 39, 11, 44, 78,142,128,
-250, 20,204,132, 34, 50, 66,195, 30,110,141,174,108, 50, 45, 99,176, 66,171,150,165,174, 48,139, 77,192, 98, 87,115, 22,212, 41,
-155,193,140,211,124,197,125,211, 73, 21,179, 72,152,237,236, 98, 89, 59,164, 94, 22,166, 43,150,140,189, 25, 35,204, 74,100, 10,
- 88, 36, 66,189, 74, 96,113, 55, 48,184,171,152, 51,154, 67,239,251,207, 33, 64,216,244,233,208,108, 19,115, 22, 47, 42, 1, 34,
-182,223,111,194,172, 26,195, 42,179, 31, 53, 70, 62,137,249,198, 55, 74, 15,115,230,100,103, 69, 27, 75, 62,184,143,184, 18,183,
- 13,156,136,221,184,153, 2, 72, 76,151,173,238,110,151,209,248,243,195,217,228,130,210,225, 94, 67, 37,172,231, 17,116,210,175,
- 76,132,149, 22, 96, 81,196,157, 25,142, 87, 17,114,250, 12, 28,220,205,220,145,199,113,170, 6, 77,226,241,212, 54,199,185, 13,
-253, 98, 4, 40, 82, 84,220,123, 92,224, 93,253, 2,151,222,217,197,130,190, 15, 78, 11,143, 50,245,160, 21, 34,132, 72,200,196,
-200, 20,161, 18, 32, 41, 35,107, 66,149,205, 87, 64,170, 4,213,140,236, 78,169,150,129, 42, 30,229, 75,237, 53,110, 88,233,112,
-185,154,145,211,164, 93, 93, 68,118,115, 36,118, 61, 58,163,211,173,195, 44, 98,205, 99, 64, 91, 9, 52, 55,211,123,191,196, 17,
- 90, 31,127, 17,227, 82,152,159,188,187,172,234,232,154,181, 44,117, 49,127, 4,145,206,147,183, 97,170, 15, 24,124,110, 0,163,
- 35,201, 79,223,252,179, 11,190,232, 21,114,234,239,198,221, 33,135,186, 66, 44, 0, 42, 85,183, 76, 64,107, 78,211,120,207,247,
-147, 45, 91,225,190,118,230,249, 83, 70, 36,173, 63, 55,173, 23,231,109, 69, 92,177, 69,228, 70,103,144,160,250,135,161,174, 55,
- 58,131,204,247,254,181,107,130,104,250, 36,186,198, 7, 93,135,212, 0,221, 52, 94,234,196,187,208,225,238,190, 33,126, 12, 33,
-241,190,189,236,122,248, 75,255,205,232,153, 64,217,196,223,247, 62, 7,210, 78,254,184,118,205,214,236,105,199, 80,121,227,186,
-180,217,191,126,237,174,212,113, 80,140,174,187,158,141, 31, 67,135,255,233, 66,106, 54, 70,225, 13,109,241,251,143, 67,147, 29,
-239,250,189,210,187, 6,219,238,195,223, 26,238,222, 39,201,140, 38,160, 54,200,102,242,101, 82,107,127,124,166,221,236, 68, 64,
-143,249,148, 7,228,148,112,176, 23,240,198,155,175, 99, 94,148, 40, 29, 75,141,145, 80, 22, 1, 41,103,156,174,106,164,170,106,
- 39, 73, 21, 65, 85, 85,136,177,192,225,222,174,177,214, 93,235, 27,102,187, 22, 66,114,250, 2,245,226, 20,213,233, 11, 80,125,
-138,232, 38, 46,204, 1, 28,109,178, 44,130,239, 73, 37, 25, 12, 31,108,178,214,108, 78,107, 57,215,168, 83,133,101, 18,131,245,
-209,133, 77,105,143,151,195, 42, 32, 38,172,132,112, 90,121,171,160,230,211,157,178,226,160, 84,236, 31,238, 32,241, 12, 57, 19,
- 40, 87, 32, 89, 1,200,238, 90, 70, 72, 89, 12,194, 87,117,243,144,232, 4, 60, 65,174,197,237, 78, 13, 98, 53,174,155, 66, 83,
-141,208, 76,221,106, 80, 62, 19, 89, 6,124,239,164, 97,103,106, 27, 67,218,237, 70,213,140,188, 11, 38,131,233, 93, 35, 93,176,
-127,166,190,179, 77,142, 6,100,111, 30,164, 22, 72,170,144, 4,168,107, 53,205,190, 39,193, 65, 43,148, 51, 70, 57,223,177, 38,
- 37, 18, 10, 14,152, 69,130, 6,227, 16,228,170, 70,125,186,196, 97, 62,193,181, 27,135,200, 59,215,161,181, 51,177, 54,220,111,
-107, 94, 8,221,201,222, 53,138, 2, 64,106, 40, 4,251, 12,124, 81, 68,252,239,127, 85, 98,231,103,255, 12,135,135,159,160,216,
-187,142,178,136,152,207, 10,204,103, 17, 69,100,179,193,141, 1,129,221,146,152, 0, 82, 70,129,134,231,165,230, 25, 15, 91, 47,
- 48, 25, 67,190, 50, 98,188, 53,117, 28,144,213,188,253,115,179, 54,209,128, 44, 4,205,201,154, 80, 11, 22, 48, 11,226, 56, 3,
- 66,137, 64, 5, 10,142,198,233,112,252,185,201,177,176,244, 66, 75, 90,145,222, 26, 90,201,253,255, 61,231, 61,165,132, 92,213,
-144,156,144,147, 32, 37,129, 36,103,236,171,169,225,155,148, 15, 53,137,186, 93, 77,241,255,100,160,147, 66, 52, 5, 88, 27,252,
-126,124,110,245,149,236,212,125, 9, 48, 78,169,114, 3,137,222, 23,190, 86,194, 10, 64,101,183,252, 32,149,141,251,177,165,212,
-133,171,172, 59,121,172,227,212, 52,113,124,211,224,245,104,111,234,152, 62,153,116,180,198, 62, 63,224,168, 45,231, 96,221, 91,
-108, 75,113, 24,240,251,122,197,173, 93,141,105,103, 4,224,228,195,216, 92,207,169,107,161,212,131,189, 71, 71,177, 14,169,124,
-218,232,223,117, 74,125,173, 19,233,106,235,255, 54, 69, 17,236,135,198,245, 45,117,117,227, 99, 12,205, 91,250,169,103, 52,248,
-187,241,239,234,132,188, 90,135, 1, 38,170, 27,178,105,100, 80,244,181,243,187,235, 2,110,244,172,207,187,215, 76, 52,253, 19,
-109,253,196,219, 16, 27, 52,210,200,222,251,210,223,122,161, 31,248, 26, 15,186,197, 46,161,112,189, 61,162, 46,236, 15,116,142,
-111, 64,127,197,164,174,161, 29, 44, 92,200,138,235,245,155,175,224,224,194, 5,196,162,196,172,140,152,151, 17, 33, 88, 14,118,
-174, 86,144,156, 28,242, 53, 22,121,206, 2,145,132, 98,190,107,236,118,102, 44,107, 69,170, 51,230,179, 2,179, 89, 68, 8,218,
- 50,135, 17, 34,152, 3,146,135,102,136, 16,136, 35, 40, 70,176,179,211,171,108, 49,150, 74,221,161, 93,103,193,242,116, 1,169,
-151,168, 82,178,196, 50,117,183, 46, 66,231, 11,174, 64,206, 10, 89,157,160,224, 26, 26, 11, 84, 21, 64,185, 6, 7,194,170, 56,
-196,162,102, 84,213,210, 38,240, 24,109,242,245,100,182, 72, 0,107, 2, 72,156,216,166,128,147,209, 10,152,191, 60, 81,232,101,
- 88,144,179,205,141,168,149,197, 10, 61,147,130, 34, 35,193,210,236,154,148, 46,245,142, 94,149,140, 69, 95, 22, 32, 10, 40, 35,
-192,101,132,146, 93,211,164,102,120, 98,150,167, 10, 85,134,166, 12,228,236,249,228,106,166, 91, 89, 17, 53, 35, 34,153, 49, 75,
- 48,171, 88,205, 38,101, 19, 46,160, 26,140,185, 31, 24,202, 37, 2, 2, 74,202,152, 21,138,200,130, 27,123, 25,151,111,189,132,
- 58, 92, 2,114, 53, 57, 28,208,228,152, 53,212,120, 52, 30,234, 77, 29, 32, 0,251,115,197,191, 60,222,195, 47,254,197, 35, 92,
-126,252,191, 98,126,129, 17,231,151,129,162, 64,140, 5,202,249, 28,177,220, 1,135, 2, 28, 8, 28, 3, 98, 8, 40,216,174,107,
-102,207,162,135,173, 75,154,192,188, 24, 76, 70, 41, 48, 47, 1,228,212,157, 43, 98, 60,135, 38,168, 39,137, 57,191,193,167,107,
- 75,114,203,198,176, 87,115, 46, 44,130,153, 45, 5,247,245,143,198, 93, 28,196,138,183, 82,182, 38,131,196, 93,236,130, 7,140,
- 72,206, 16,169, 45,116, 72,196, 50, 13,114, 66, 22,215,216,123,237, 97, 17,160, 22, 55,239,239, 53, 74,226, 41, 92,218,155,226,
-214, 99, 66,117, 96, 22,207,189, 9, 91, 90,179, 17,135,203,218,195,213, 32,165,134,117,154,149,144,122, 31,108,155, 12, 55,154,
- 82, 91,125, 60,214,214,246,232,178,195,117,109, 56,209,105,164,122,107,177,238,195, 64, 27,157,245,206, 40,236,235,245,150, 54,
-160, 1, 58, 8,133, 25,172, 62,125,135, 67,163, 73, 43,247,248, 9, 27,103,104,209, 94,108,234, 25, 83,183,118, 54, 63,180,177,
-128,111,254,125, 29, 79,188,189,230,106,240,111,212, 43,196, 58, 21, 4, 51,154, 6,117, 67,124,236,248,218, 74,175,137,208,238,
- 62, 91,203,174, 95,107, 82,214,141,216,117,188, 12, 26,189, 94,157, 24,194,117, 0,221,111,106,130,198,128,162, 14,236,140,181,
-109,226,104,240,247, 52,110,158,250,182,206,122,222,102,147,122,111,167,223, 8,233, 38,176,125,109,202, 39,197,198,163,119,208,
- 56, 43, 6, 77, 34,128,214, 32,229,226,254, 14,226,206, 1,246,246,247,113,184, 55,199,206,222, 46,202,157, 61, 8, 5, 68,178,
-176, 20,155,122, 19,178,168,237,122, 67, 64,157,204,188, 38,198,128,192, 1, 5, 50, 2, 50, 68,217, 82,214, 56,154,126,219,119,
- 87, 89,185, 77, 69, 35, 8, 82,206,208, 44, 40,138,136,140,128,147, 69,133,147, 69,133,229, 42,129, 52, 65,164, 33,126, 37, 4,
- 24,116, 41,117,133, 16, 20,130, 96,100, 55,215,184,219,158,218, 8, 74, 10,135,248, 37,163, 96, 65,230, 2,139,147, 5,184, 62,
- 69,206, 53,150,171, 26, 57, 25,139,186, 96, 75, 86,179,125,111,129,164,140,148, 4, 57,217,207, 64,220,111,157, 11,143,110, 37,
-115,114,203,198,188,206, 98,196,184,200,150,148,153,178, 32,123, 56,133,230,140, 2, 98,251,110,103,207, 67,225,147,163, 21, 92,
- 97, 6, 40,182, 41, 98,156, 21,133,102, 51, 98, 97,147,222, 5, 54, 47,124, 98, 64,136, 1, 42, 80,144,162, 40, 0, 20, 5,192,
-133, 71,159, 16,164,225, 9,184, 54, 62, 75,182,215,157,213,139, 63, 65,152,145, 67, 9,166, 2,183, 46,151,216,189,245, 13,212,
-186, 7,146,106,128, 6, 55,196, 84, 26, 25, 74,233,224, 32,245,255,231,205, 85,131,237,206, 1,188, 40, 9, 63,190,115, 0,254,
-197,143, 81,208,255, 11,218,185,140, 16,118, 17,185,180, 21, 71, 8, 32,127, 29, 68, 12,230, 8,142, 12,113, 62,130,106, 52, 27,
- 93,201,166, 31,247, 87, 19,217, 86, 53, 69, 12,136,172,230, 86,215,200,211,224,126, 2, 16,187, 63, 76, 10, 97,106,135,198,160,
- 72, 82,155,196,167,238, 12,200,145,161,161,128, 80, 1,144,133,247, 88,174, 1,143, 20,203,218, 30, 79, 1,150,171, 66,193, 24,
-239, 54,233, 75,119, 54,136,113, 3, 44, 48, 72,193, 34,186, 54,129, 11,214,227, 63,215,191,200, 58,216, 25,211,160,252, 83, 11,
-115,160, 7, 14, 52,255,141,134,245,167,221, 46, 56,181,201,109,138, 2,138,162,183,127,212,193,235,161,206,126,182,157,238,215,
-142,226,237,219, 69,157,210,217,235,208, 57,110,235,123, 63, 3,122,156, 76, 43,219,196,244, 30, 66,195, 58,242, 19,149, 1, 74,
- 43,189,169, 83,145,183,108, 3,180, 69, 80, 70,147,237, 86,216,220, 49, 23,253, 13,224,120,197, 96, 66,111, 93,150,182,173, 11,
-198,207,179, 97,231,161,227,166, 72, 55,161, 53, 58,225, 4, 44, 19,240,255,212,181,104, 38,110,233,200, 39,235,120,242,228,212,
-223, 79,235,163, 94,225,157, 66,220,105, 43, 98,173, 3,135, 54,213, 62, 87,197, 31,179, 37, 68,118,241,191,103,213,116,213,126,
- 20,173,246, 71,240,173,211,253,186, 91,183,174,179, 85,123,161, 23,220, 28, 70,158,172,213,245, 33,130,200,130,131, 11, 23, 16,
-138, 25,102,179, 25,118, 15, 47,161,156,205,193,113, 6,227,162,153,105,139, 21,110,119, 76,203,198,176, 22,207, 57,223,219,153,
- 97,103,167, 68,156,239,128, 99, 97, 59,230,148,173, 1,128,133,190, 40,200,163, 49,107,211, 17, 19, 33,176, 17,184, 50, 8,146,
- 5,215,202,132,235, 59, 25,151, 75,155,152, 43, 33,164, 58, 65, 36,163, 82, 66, 18, 6,179,231,162,139,189,118,192,134, 31,219,
-213, 90,156,106, 93,219,161, 61, 43, 25,153, 24,203,108,123,102,109, 98, 80, 53, 67,114,109,214,191, 76,144, 80,162, 86, 70,157,
-156,184,150, 43, 24,143,221, 78,220,148,129,236,205, 5,147, 56,228,174,173,159, 68,132,180,140,235,148, 51,114, 85,129, 52,249,
-158, 28, 40,138,104, 72,133, 8,102,133,183,142,185, 54,249, 94, 54, 2, 34,193,166,208,162, 48,103, 56,112, 97,166, 38, 86, 57,
- 64, 28,192,108, 70, 50,172,130, 16,129, 28, 34,106,137, 32,241,108,111, 98,155,114, 69, 33,217, 20, 11,150, 60,102, 3, 91,206,
-226,196,174,128,156,108,111, 29, 82,198,205,171,187,136, 87, 94, 67, 74, 97,148,230, 54,142,211,158,190, 49,179, 58,178,162,237,
- 8, 9, 0, 40,163,226,215,203, 18, 71,159,103, 92, 60,249, 87,136,179, 83,204,194, 30,202, 64, 40,138,128,178, 32, 20, 33, 32,
-122, 54,188, 50, 80,105, 35,249, 51, 2,164,223, 29, 45, 66,151,196,242,229,179,136, 89,241,134, 2, 92, 68,135,241,109,202, 15,
- 1,136,209, 88,234,112,210, 90,214,236,104, 10,129, 69, 17,212,242, 75,107,111, 86, 37, 39, 4,152, 45,116,150, 0,227, 79,138,
- 75,211, 2,132,131, 35, 56,102, 25,171, 32,212,254,149, 13,254,217, 49, 71,179,149,238, 69,163,115, 99, 67, 11,147, 64, 78, 75,
- 90, 54, 16,120,250,196,183, 97, 0, 7, 70,246,158,246,165,206, 14, 49,210,196,188,218,143, 0, 23, 16,132, 21,209,117,127,109,
- 38,112,239, 16,145,113,110,186,110,183,137,165,141,187,244,254, 4, 71, 61,130,176,142, 76,106,167,119,233,231,131,228,123,254,
-248, 52, 85,216,181, 69, 1, 58,243,209, 30,203,184,217,193,244,124,223, 59,242,160,174, 33, 10,253,148, 45, 26, 49,213,180,109,
-130, 58, 43,213,105,200,171,155,177, 27, 23,166,181,160,155,137,247, 68,219,174,138,106, 43,249,155,108,184, 26,152,125, 96,125,
-187,222, 77,105, 47, 51,160,223, 56,141,255,174,111,127, 75, 27,159,103,244,119,232,195,204,186,241, 59, 48,213, 4,209, 70,190,
- 69,119,173,251,247, 27, 77,211,215, 54,148,250,117,222,129,174,177,240,186,235,176,254, 5,238,133,255,174,221,196,147,203,150,
-181,149, 81,147,113,208,111, 54,215,166,124,135,219,153,250,247,239,176, 81,141,129, 81,204,118,144, 52,160,210,128, 69,102,172,
-114,192,233,210, 14,185,218,221,218,178,218, 29, 94,206, 10,148,141, 12, 76,128,148,107,132,114, 7,194,138,186, 90,129, 73, 81,
- 22, 1,203,156,221, 28, 38, 88,130,152,212, 32,103,147, 71, 39,191, 17,128,178, 44, 80, 43, 99, 7, 53,174,222,184, 2,240, 28,
-171,156,240,226,193,115, 84, 95,125,133, 50, 90,115, 82,123,240,138,229, 19,152, 17, 76,134, 57,208, 33,103,207, 11,232,120, 41,
- 41, 37, 80, 81, 66,136,177, 90, 44, 17,163, 79,175, 34,182,175, 23, 47, 70, 53,160,117,109, 19,159,113,197, 59,200,220, 73,107,
-154,179, 75, 7,185, 69, 3,140, 75,148, 49,139, 64,166,128, 42, 5, 0,150, 46,150, 37, 33, 74, 64,116, 34, 24,251,117,102, 55,
-169,225, 98, 6,202, 9, 57,103,139,127, 85, 35,112,133,200,200, 20,208, 8,215,236,179,180,223,167,102,164, 11,209, 8,131,217,
-172,107, 41, 43, 50,106, 32, 16, 34, 5, 43,100,204, 88,213,110,156, 18,204,235, 62,146, 37,196,229,156,219, 5,130, 66,145, 18,
-176,207, 25, 55, 94,218,199, 23,171, 91,160, 23,183, 65, 69, 95,220, 60,132,158,134,183,176,142,234, 69, 30,252,220,140,129, 7,
- 2,220,123, 48,195, 31,191,184,141, 23,215,238, 98, 89,189, 3,193, 11,255,137, 2,137, 9, 65, 19,130, 68,164,160, 88,170, 96,
- 85, 37,104, 74,176,112, 23, 64,132,219, 4, 66,192,136,227, 42,130,136,218,214, 47,228,124, 13,234, 44, 96, 73, 28, 97, 2,204,
- 27,222, 81, 66,246,251,216, 47,170, 33,112,194, 30,151,155, 60,106,149,141,184, 39, 0,147, 73, 15,155,207,164,137,255, 86,247,
-143, 39, 53,114, 57,220,184, 73,193,206,191,178, 12,148,134, 97, 45,126, 31, 88, 10,150,194, 35, 81,187, 63, 60,154, 28,117, 3,
-212,172, 45,121, 77,219, 73,124,224, 27,167, 61, 77,242, 88,182,160,210, 59,197, 25, 25,192, 10,138,202,159, 63,170,142, 58,185,
-225,129, 35,216, 28,207, 59,206,162, 30, 35, 18,208,254, 84, 69,107, 22,127,155, 38,115,218, 12,188,175, 19,186,198, 83,123,159,
-128, 68,227,230, 70, 71, 68,145,142,216,166,122, 22, 89,111,164,235,108, 28,137,122,211,101, 99,233, 75,192, 6,152,125,212, 8,
-232,102, 66, 90,255, 77,233,212, 52,187,190, 72,222,216,132, 81,111, 42, 29,238,196, 39, 26, 0, 93,207,102,215,222,103,216,103,
-174,233,185, 56, 2, 30,131,168, 3,133, 44,250, 24,247, 36,209, 15,221,181, 29,236,147,105, 98, 76, 30,221,163,211,252,130,223,
-128,252,182, 6,207,244,255, 35,163, 70,114,140, 18,233,198,181, 64,123,253, 73, 39,187, 88,210,233,197,143,113,111,164,245,177,
-110,145, 63,177,180,178, 24, 75,228,156, 81,114, 70,189, 60,134,214, 75, 32, 45,220, 7, 62, 90, 81, 83, 35, 2,173,234, 12,229,
- 18, 66, 22,198, 66,170, 88,173,106, 32, 87, 32, 22,228,172, 22,154,161, 68,117,251, 0, 0, 32, 0, 73, 68, 65, 84, 18, 45,250,
- 52,195, 92,219, 32, 9,204,100,210, 47,246, 3, 19, 10,225,136,253, 34, 96,118,225, 0, 79,170, 29, 8, 34,158,166,125,156,174,
- 2, 74,182,241,175, 8,132, 89, 80, 71, 10, 44,108, 67, 40, 56, 29, 57, 59,234,219,157,117,129, 13, 35, 92, 44, 19,164,206, 96,
- 85,179,186,205, 54, 17,139, 40,144,141,249,206, 42,216,225, 26, 76, 25, 66, 62, 83,185,116, 77,115,110,237, 73,205, 33,182,147,
-150, 21,172, 40, 11, 2, 21, 1, 21,102, 54, 45,107,246,198, 53,160, 32,177, 41,155,130, 63,175,128, 11,155,248,178,199,123,198,
- 64, 78,148,179, 61,177, 53,235,182, 23,103,169, 81, 32,161, 17,193, 22, 76, 6,243,170, 49,175,115,173,160,186, 2,105, 5, 69,
- 54, 38, 63, 50,106, 53,216, 61,134, 8, 80, 64, 45, 98, 18,121, 16, 16, 13, 82,182,200,122, 51,170, 9,238, 66,119,121, 86,227,
-226,205,107,168,139,107, 64,170, 91,232,125,203, 46,241,204, 63,145,128, 5, 3, 31, 62, 41,192, 95, 30,227, 48,124,138,226, 96,
- 15,161, 60,116,125,124, 52,102,122, 81,160, 40, 74,112, 52,239,148,148, 8, 82,213,160,122,233, 73,103,205,222,216, 22,151,145,
- 8,129, 44, 51, 32,139,152,126, 93,164, 53, 36,138,100,146,201, 38,168, 94,152,221,104,135,125,189,220,177,204, 24,132, 72,140,
-232, 46,125, 41, 11, 36, 37, 8, 50, 18,177,121,236,171, 34,114,182,253,123, 36, 95, 39,117, 43,235, 14, 13, 77,118,128,251, 90,
- 69,153, 7,223,226,168,189, 69,250,192,143,125, 11,107, 92,160, 45,161,186,129, 6,169,215, 8, 52,211,144,140, 12, 81,250,154,
- 93, 26,228,144,233,160,190, 43,117, 16,187,246,166,232, 33,123,124,187,182,151,182, 20,101, 29,147,226,104, 10, 39,221, 60,143,
-111,154,226,250,214,172,227, 9,151,124,194, 29,154,218,116, 26,168,241,188,217,119, 38,211, 65, 50,158,182, 22,162, 52, 65,240,
- 27,167,231, 77,237,206,181, 39, 83, 84,156,229,241,164,163,148,184, 41,102, 53,173,167,142,173, 69,168, 78, 79,250,125,246,110,
-147, 63,207,125, 72,110, 83,204,107,219,160,244,166, 97,233, 17,188, 7,220,134,169,199,104,134,213,126, 35,209, 57,204, 48, 38,
-154,135,145,247, 58, 97,104,212,210, 92,127,218, 66,192,236, 23,246,173,209,125,191, 13, 5,219, 86,153,218, 54,248,137, 90,148,
-108, 45, 74,119, 4,147,245,215, 98, 58, 10,244,233,127,207,152, 45, 23,122, 85,215,152,207,119,176, 55, 43, 80, 23, 4,138, 37,
-210,201,194, 9,134,110,135,169, 53,144, 21,194, 9, 5, 23, 40,162,253,190,102, 69, 18,113, 34, 89,101, 30,242, 49,154,215,250,
-170, 6, 57,164,171, 61,250,174,217,134,218,225, 28,230, 1, 74,187, 56,148, 19, 84,216,195,139,163, 37,228,197, 67,107, 2, 56,
- 0, 16, 80, 44,128, 58, 33, 68,133, 34, 34,167,236,118,169,108, 17,167,238,140, 73, 33, 64,153,221, 85,173, 66,193, 10, 13,209,
-189,199,109,114,141, 96, 43,214, 46, 85,163, 8,128,103,200,139, 10, 76,238,251,237,201, 95,162, 30, 6,227,218,102,245, 8, 78,
- 9, 1, 85, 54,167, 50, 74, 25, 42, 43,128, 9,146,129, 82, 5,179, 2, 88,134, 18,117,101, 76,119,228, 12, 97, 6,115, 48,253,
-184,100,211, 91, 7, 6,185,105,138,184,166,154, 2,140, 32, 71,182,185, 37, 17,131,161, 57, 34, 2,238,255,174,208,172, 93,144,
- 21,236, 11,154,149, 64,181,130, 56, 89, 49,243,212,183,164, 25, 16, 3,131,137, 9, 68,133, 57,174, 73,134,144, 34, 72,192,245,
- 61,194,201,245,151, 81,223, 59, 69,212, 83,128,138,158,109,177,110,192,143, 54,139, 74, 24, 0, 34,240,201, 9,227,228,110,198,
-193,242,215, 88,238, 29, 99,185,186, 4, 44, 87,208, 92, 35, 36,119,202, 67, 1, 70, 1, 4, 5,104,229, 18,182, 4,210, 26,193,
- 61, 83,148,164, 27,126,200,210,210, 84, 8,212,248,232, 6, 32, 1, 8, 89, 65,172, 16, 98,136, 6, 55,147, 33,159,173, 21, 89,
- 45, 26,184,177,215,239,185,137,155, 81,144, 40, 92, 11,105,100, 77, 56, 75,156,109,125, 65,193,154, 44,168, 55, 22, 25, 96,187,
-105,124, 72,229, 86, 21,214,100,151, 18,186,136,244,118,197, 70, 19,164,184,221,221, 61,188,251, 7,255,102,199,206,214,225,198,
-185,201, 42,151,222,182,111,250,171,221,135, 86,135,150,176,236,212,147,230, 72, 20,181,232, 65, 56,211,155, 39, 38,183,102,182,
-110, 29,218,116,250,108,219, 86,154,219,176, 1,221, 78,135,163,173,112,126, 95,151,187,254,111,141,255,239, 96,152,237,163, 14,
- 13,244,220,234,210,123, 4, 69,165, 65,161,110,139,143,174,243,245, 21,132,249,206, 46,190,247,131, 63, 0, 81,243,191,255,112,
- 8,199,123, 22,112,227,242, 71,122, 78,134,245,214,159,115,118,102,175, 70,170, 98,203,242,162, 55,193,142,218,197, 6, 18,215,
-169,149,253, 20, 74, 52, 1,169,172, 35, 55, 58, 98,253, 99,141,128,211,217,200, 78, 35, 10, 58, 34,169, 77, 42,213,166,120, 4,
- 19, 80,187, 98, 19,250,245,219, 84,177,209, 22,102,204,244, 11,212,126, 2,221, 25,235, 45,218,108,178,188,246, 47,204,132, 85,
- 86, 28, 45, 86, 72,213,210,174, 85,220,193, 82,130, 25,157, 80, 70, 18,105, 61,217, 7,190, 20, 28, 48,159,207, 17, 11,163, 10,
- 75,157, 48, 11,130,217,172, 68, 6,163, 22,115,130,179, 72, 75,246,207,209, 72,102, 6,203, 19, 40,148,136, 1, 72, 58,199, 97,
- 72,216,187,188,143,147, 52,199,242,228, 57,230,161,106,167, 88, 52,108,116,247,228,102,102, 20,145, 91, 38, 15,179,137,133, 98,
- 96,112,140,102,245,153, 51, 24,217,200, 81, 14,215, 38, 0,181, 4, 36, 17, 84, 20, 81, 39,187,182,203,218, 8, 85,166,183,207,
- 72, 25, 6,111,139, 73,170, 68,146,169,143,132, 16,212, 98, 61,115, 38, 72,149, 33,203,133, 25,184, 48, 35,103, 32, 66, 48,139,
-130, 58, 68,212, 90, 2,181, 34, 72,178,188,237,156, 65, 82, 35,178, 32, 80,240,230, 1, 40, 24,160, 96, 16,188, 50,163, 82, 66,
- 37, 1, 85,102, 35,123,121,110,119, 93, 3,117, 6,132, 3, 56, 22, 8,165,249,167,135, 24,189,145,113,153, 23,140,247,160,226,
-222,243, 44,157,162, 66, 18, 36, 89,194, 92, 32,129, 4,134,100, 11,139,153, 73,141,107,151, 35,232,194,203,144,204,128,166,222,
-217, 77,235,228,184,115, 12,238,243, 0,124, 94, 19,238,124, 17,176,251,236, 14,230,197,125, 20,187, 7,224, 98, 15,145, 75, 80,
-136,214, 12, 17, 33,107, 64,150,140,236,164, 74,139,160,183,187, 95,204,115,213, 86, 34, 14,179, 7,246,157,124, 96, 8,137,133,
-247,120,106,155,120,142, 45,249,224, 70,238,241,198,238, 23,175, 78, 88, 76,217, 82,218,146, 18, 68, 25,236, 84, 59, 66, 0,139,
-173, 48,224,124,132, 84, 39,164, 42,161,170, 5,117,242,159,103, 70, 44, 8, 20, 3,128,208,105,228,165, 33,169, 55,181, 80, 13,
-221, 22, 47,140,236,161, 1,210,119,247,162,117, 24,123,124,128, 72, 43, 91,233,147,108,166,225,105, 6, 48,223,221,195,183,223,
-121, 23,239,253,248, 95,183, 83,206,193,197,139,120,229,245,183,112,255,238,103,120,242,232, 81,127, 27,232,144,148,167, 19,194,
-117,236,132,118,250,237,167,213, 0,192,206,238, 30,222,122,231, 93,252,204, 31,127,234,102,248,254,239,254, 97,111,240,176,160,
-135,156,187, 93,205,207,127,250,163,175,133, 6,233,228,216,227, 76,217, 41,226, 85,111, 98, 37,237, 81,218, 6, 16,131,246,125,
- 98, 49,246,243, 82,172, 79,187,231,194,172,180,107, 2, 64,125, 97,226,118,169, 95, 63,175,125,156,248,214,230,203,235,148,137,
-128, 14,188,223,105, 52, 69, 42, 97, 32, 37,235,231,145,143,209,128,193,176, 56,224, 71,120, 67,216, 62, 38,109,140,137, 93, 55,
-185, 16,183, 47,166, 17, 1,141, 38,248,141, 46,137,220, 54,101, 79,236,239,199, 44,241,254,148, 63,108,238,126,155,147,250, 56,
-102,246, 28,191,170,125,219,230, 45, 56,142,142, 82,180, 28,228,208,113, 34, 29,236, 80, 60, 89, 37,220,255,234, 41,222,146,100,
-233, 94,193, 24,230,204,138, 28, 10,104,174,189,225, 52,211, 15,179,222, 52,226, 79, 81, 20,160, 80, 2,186, 66, 8,132, 42, 7,
- 71,171,106, 11,128,169, 86,182,255, 14,140, 76, 2,201, 22, 21, 74, 49, 2, 28, 17,192,224, 34,162,196, 10, 60,223,195,179,116,
-128,227,227,103,192,234,212,156,223, 56,162, 41, 83, 49,103, 36, 97,228, 36,102, 49, 90, 4,144,152,172, 73,189,216,130, 0,161,
- 96, 4, 62, 40,212, 97,126, 73,181,241, 10,146,165,142, 90,124,186,237,196,225, 9,107,164,149,177,212, 19, 1,217,174,133,153,
-194, 80,187,139, 7, 41,168, 96,100, 68,104,202, 8,156, 92, 6,105,254,246, 32, 65,105, 12, 49,156,202, 12,168,107, 20, 92,249,
-167, 17,108, 50,132, 21,111,161,104,121,216,200,102, 87, 74, 5,234, 76,110,129, 10,103,162, 43,122,171,117, 0,158,217,174,138,
-130, 9,226, 19,189,237,108,201,252,222, 53,249,247,128,173, 65,129, 73,243,160, 13, 89,139,160, 12, 36, 85, 4, 8, 34,151, 78,
- 72,171, 32, 34,184, 24, 8,139,107,135,120,188,184,142, 98,117, 15, 26, 24,152,168, 28, 52,129,190, 78,253,153, 17,240, 8,192,
-251,247, 11,252,224,139, 39, 40,190,241, 17,184,124, 23, 92,238, 58, 65, 77,140,247, 64,138, 36,132,224, 30,246, 89,224,255,158,
-141,224,215, 68, 38, 43,141,184,164,138,204,118,125,181, 13,122,177, 90,196,162, 32,202,222, 12, 52, 42, 46,143, 24,151,206, 34,
-189,137, 66, 13,189, 44, 17,241, 97,110,124,116, 26, 88,224, 25,238,217, 54,237, 33,144,221,211,161,240, 90,221, 41, 29, 26,159,
-130,192,110,167,107,133,149,214, 76, 52,212, 25,135, 50,146, 41, 13, 36, 75,107,187, 88, 7, 2,180,255, 55,118, 10,243,232,124,
-201,254,175,215,174,221,192,205, 91,175,226,246,167, 31,226,197,179,231, 93,118,182,246,204,112, 28, 50,110,247,223,212, 61,110,
-243,131,227,245,204,148,169, 87,243,255,127,254,147, 31,181,255,123,103,119, 15,111,191,243, 46,222,251,201,143, 70,156,182,166,
-184,172, 31, 84, 27,201,120,189, 80,156,110,234,158,250,197, 81,252, 23,209,160,144,147, 98,130,117,220,223,120, 43,160,220,225,
- 13,164,107, 72,197,185,246,178,106,215,114,154, 24,183, 29,110,239, 55,213,221,160,171,216,100, 24,219,170, 11,104,244,110,180,
- 43,236, 99, 13, 61,209,134,182,201,229, 95,173, 71, 34,141,154,158, 41, 98, 92,115,159, 16, 13,225, 41, 69,143,156, 56, 77,136,
-235, 55, 18, 68,125, 72,122, 83,244,107, 15,138, 62,151, 45,188, 14,152,254,160,245,251, 87,207,101,241,219,187,214,107,108, 82,
-218,216,126,174, 53, 78,210, 92,143, 9,140, 68,117, 20,109,140,161, 50, 97, 60,169, 19,161,206,192,199,159,222,198,159,200, 10,
-137, 34,150, 82,184,159, 58,217,244, 74,130,192, 22,129,154, 92, 70,150,179, 96, 94, 48,118,231,165,205, 63,217,152,200, 41,101,
-168, 36,159,198,179, 77,225,181, 37,134,217,206,217,136,100,196, 70, 58, 42, 67, 2,241, 14,118,231,132, 21,118, 80, 29,191, 64,
-181, 56, 1,201, 10, 57, 22,109, 83, 29,152, 64,101,244, 22, 58, 89,174, 58,200, 44, 93, 69, 81,104, 66, 44, 3, 42,141, 64, 50,
-159,243,165, 2, 84, 11, 10,143, 67, 19, 73, 8, 20, 16, 72,145, 16, 64,200, 96,178,157,108, 86, 69,201,140,178, 8,230,229,174,
- 25, 76,190, 19,117,150, 62,152, 76, 7,175,138,228,200, 5,171,103,190,187, 81, 76, 96, 43, 30,149, 22, 64, 13,112, 90, 34, 71,
- 1, 81, 97, 48, 49,188, 41,208,208,126,183,178, 18,114,118,151, 58, 19, 95,155,159,123,240,233, 84,123,252, 36, 82, 20, 12, 4,
- 21,100, 50, 2, 89, 84,103,136,251,234, 52, 58, 4, 15,215, 81,107, 86, 32, 37, 59,231, 27, 71,181,192,168, 37, 64,170,140,178,
- 72,200, 49,128,197, 76, 92, 88, 20,151,119, 51, 78,174, 94,195,234,222, 49,162, 28, 1, 92,158,123,145, 62,254, 41, 6, 32, 17,
-248,249,179,136,227,207, 94, 96,246,131,247,160,187,127, 10,208, 46, 64, 75, 40, 76,221,144, 4, 88, 38, 66,189, 50, 52, 65, 73,
-236,251, 45, 22,168, 2, 73, 30,101, 43, 45, 82, 32,125, 78, 87, 63,241, 76,213,241, 73,203,139, 16,106,246,127,174,255,135, 66,
- 24,109, 28, 46,181, 48,109,246, 65,210,252, 15,114, 99, 23,227,223, 29, 86, 64,168, 31, 65, 43,142, 62, 9,180,182, 52, 63, 80,
- 19, 69,215,120,246,119, 17, 98,177,185, 32,185,157,184, 77,130,175,218,159,212,237,201, 46, 92,185,134, 27, 47,127, 3, 33, 70,
- 60,127,250, 24,119, 63,251, 24, 89,129,171,215,110,224,234,245, 27,248,229,251,239,181, 95,246, 98, 54,195,119,223,253, 61,188,
-255,179, 31,163,174,171,206, 64,132, 58, 14,143, 40,112,243,230, 55,112,237,218,117,124,242,225, 7, 56, 61, 57,110, 15,141,192,
-140, 87, 94,253, 38, 14, 47, 94, 2, 17,240,252,217, 83,220,187,253, 41,160,130,189,221,125,188,241,206,247,241,217,199, 31,226,
-165, 91,223, 64, 89,206,176, 92, 46,112,247,211,143,176,170, 42,124,235,237,239, 1, 0,190,247,131, 63,128, 2,120,240,197,109,
- 60,126,248,229,192,183,126, 27,187,121,199,145,132,219,159,125,132, 27, 47,189,130,162, 44,241,222, 79,126,132, 43, 87,175,227,
-234,245,151, 80, 20,118,243, 29,191, 56,194, 23,183, 63, 67, 74,181,253,206,119,190,143,207, 62,249, 53, 94,186,121, 11,229,108,
-134,229,114,137,187,159,127,130,114, 54,195, 75, 55, 95, 65, 57,155, 99,181, 92,224,246,231,159, 96,181, 92, 96,103,103, 23,111,
-125,231,123,248,252,211,143,112,227,230, 45,148,101,137,213,114,137,187,183, 63, 69, 89,150,184,209,251,157, 59,183,237,119,224,
-114,136,151,111,189,134,131, 11,118,109,142,158, 63,195, 23,119,110,183,126,194,231,250, 74, 40, 13,136, 14, 45,193,241,204,194,
- 62,236,250, 6,158,245,125,205,245,198,233, 83,123,201, 80,141,197, 6,245, 8,103, 27, 38,102,234, 55, 11, 77, 51,208,103,251,
-247,220,244, 48,177,195, 71,207, 76,173, 93,190,143, 88,224,125, 54,252,120, 58,111,246,229, 52,229,101, 72, 91,215, 60,253,169,
-127, 42, 44,110,107, 67,208,188, 87,234, 17, 10,221,246,119,250,181, 98,248,217, 14,224,116,221,186,126, 39,215,177, 55,238,134,
-125, 73,157, 98,141,233,217, 3,125,206, 96,113, 18, 97, 86,150,248,228,163,143,241,213,147,103,168,115,129,163,103, 47,176, 88,
-101,164,236,186,107,135, 64,133, 2,146,203,194, 36, 17,202,192, 56, 56,216,199,194, 11,100, 99, 6,146,235,202, 60, 27, 68, 1,
-142, 16, 84,128, 24,225,142, 10, 99, 41, 87, 89,177, 11, 1,239,236,153,188,168,156,161,146, 8,193, 2,185,174, 13, 45,144,220,
-237,224,213, 8,103, 49,194, 96,238,170,134,230,228, 58,110, 0,222,112,152,115,104,134, 6, 70, 1,130,212, 75, 0,182,223,207,
-201, 15,111, 47,210, 57, 39, 64,156,137,159, 4, 57, 85,144, 96,126,241, 96,113,187, 81,110,173, 67,137,130,191, 47, 51, 48, 33,
- 53,242, 96, 43,147, 34, 55, 35, 9, 86,228,163,214, 8, 81,177, 82, 70, 16, 11,166, 81,181,120, 86, 1, 60,210,211,144, 40,235,
- 10,196,227, 85,197, 34, 86,185,177,253,106,178,215, 77, 3, 29,156,108,152, 65, 64,178, 5, 67, 12, 38, 1,147,100,171, 82, 9,
- 70, 54, 11, 32, 80,104, 10,156,186, 72,143, 65,194,152, 19, 33, 19,161,174, 87, 64, 81, 64,180, 0,180,182,228, 52, 85, 92,190,
- 16,240,224,197, 75,208,103,167, 0, 39, 64,195,228,106,234, 60, 8,214, 78, 0, 62, 92, 16, 62,254, 52,224, 59, 79, 62, 70,177,
-247, 57, 82,248,157, 86,243,205, 0, 88, 50,178,102,172,146,162, 94,173,128, 84,181,196, 88,210,220, 78,101, 10, 12, 88,230,182,
-194,232,156, 6,201,186, 0, 4,237,204,215, 26,119,246, 38,102, 92, 61,221,212, 86,118,118,253,173, 97,112,186, 91,195, 23,106,
-210,219,196, 28, 3, 27,193,158,244, 52,227,210, 91,122,169, 72,247,140,212, 56, 7,160, 13,118,225,129, 15,155,191,241,136,113,
-236,167,253, 57,184,112, 17, 31,189,255,215,248,248,103, 63,198,238,238, 30,110,190,242, 26, 24,138,167,143, 31,162,156,153,153,
- 68,211,196, 92,185,122, 29, 47,142,158,163,174, 42,239, 66,164,199,140,183,151,248,250,235,223,196,229, 43, 87,240,225, 7, 63,
-199,201,241,139,246, 32,103, 40, 94,251,230,155, 8, 49,224,131,247,126,130,247,127,250,215, 40,138, 18, 55,110,189,218,130,165,
- 0,112,241,210,101,124,252,203,159,227,253,159,252, 8,203,197, 41,110,189,246, 6, 68, 50, 62,254,213,251, 0,128,247,127,250,
-151,248,249, 79,126,132,199, 15,191,156,112, 62, 59,251,102, 57, 56,188,136, 15,127,249,115,252,252,167,127, 9, 0,168,171, 10,
-159,126,244, 43,188,247,211,191,196, 7,239,255, 20,204, 1,175,188,250,205,193,227, 93,184,120, 25, 31,253,250, 23,120,255,103,
- 63,198,114,113,138,215,223,252, 54, 46, 92,188,140,143,127,253, 1,222,255,217, 95, 97,177, 56,197, 43,223,120,125,240, 60, 23,
- 46, 94,194, 39,191,254, 0, 31,188,247,215, 88, 46, 23,120,237,141,183,112,225,226,101,124,242,209, 7,248,224,189,191,194,114,
-121,138, 91,175,188,222,190,250, 87, 94,125, 3, 28, 34, 62,252,197, 79,241,171,247,127,130,162, 40,240,210,203,183, 58, 55,216,
-115, 22,246, 41, 36,160, 79,250,210, 51,126, 91,251, 4,111,221,162,127,159,156,246, 59, 15,183,129,182, 65,117,218,210,117,109,
- 87,222,155,252,251,235,138, 13,246,179, 10,247, 80,118,104,185,115, 85, 24,107,189,135,251,250, 33,113, 84, 59, 55,184,241, 66,
- 93,113, 6,163,189,179, 65, 86,156,215, 41, 78,135,172,253, 30, 52,162,125,189,250,248,121, 7, 44,203,115,142, 61, 58,216,168,
- 15,114,232, 85,167,165, 69, 64,163, 75, 63,251,205,236,236,236,224,206,157,123,248,229, 47, 63, 65,132, 32, 45,143,145,150,167,
-168,170, 26,172, 25, 37,121,246,183,138, 79,176, 64,170, 51, 14,102,192,108,255,208,172, 71,253,117, 4, 22, 36,177,124,114,117,
- 7,175, 34, 6,168,219,192, 42,219, 49, 23, 64,136, 51, 64,105, 23, 7, 51, 96, 73, 37, 56, 45,177,146,128,106,181,132,122, 28,
- 39,181,126,252,217, 11,159, 23,119,102,148, 5,155,105, 12, 71,204,202, 2, 5, 51, 2,137,153,177,104,192, 60, 50,118,230, 37,
- 66, 32, 68, 86,139,133,101,143,101, 21,216, 46,151, 12, 73,155,149, 1, 28, 3,170,156, 1,201,221, 38, 84, 59,201,153, 41, 0,
- 82,107, 75, 27,157,147, 96,251, 89,123,125,236, 33, 34, 76,228, 97, 43, 1, 49, 22,173,151, 60,135, 96, 30,242, 57, 65, 53,129,
-196, 7, 55,191, 87,109, 66, 55, 73,154, 34,182,247, 79,176,135,117,237,179, 34, 19, 65, 16, 92,131, 13,104,242, 46,158,139, 14,
- 61, 37, 54,243, 19,195, 58, 64, 20, 12, 94, 22, 49,230,191,212,136, 37,160,177, 52,183, 92, 77,110, 93,106,239,247, 98,204,184,
-120,109, 23,105,126,221,225,233,117, 30, 19,157,115, 13, 58, 39,224, 9, 1, 63,190, 63, 3,223,126,136, 50,255, 12, 84,102,196,
- 88, 56, 25,146, 81, 4,251, 60,213,211,240, 76,173, 80, 25,185,205,181,235, 45,237, 76,217,137,175,140,224, 70,238, 22,182,226,
- 9,142,190,182, 5, 49,132,128,164, 61,146, 38,117,126,238, 77, 76,170,182,140, 57,247,132,111,226, 84,165, 85, 74, 58,187,204,
- 53,244,173, 52,148,123,138,164,241, 25,152, 33,110,160,164,110, 24,199,138,190,202, 76,187,195,171, 15,132,250, 11,121,112,255,
- 46, 68, 21,117,174,241,240,254, 93, 92,188,114,213,165, 27,130,167, 79, 30,225,234,213,235,131,162,254,232,225,131,193, 99,141,
-255, 92,184,120, 9, 71,207,159, 97,181, 90,182,144, 53,193, 34, 19, 15, 47, 94,198,253, 59,159,155,109,164, 8,190,250,242, 62,
- 46, 93,190,226,110, 63,182,127,121,248,197,109,203, 44, 22,193,147,135, 95, 97,119,111, 31,107,105, 45, 19,207,191,141, 58,212,
-255,201, 7,247,239,184,203,144,253,237,209,209, 51, 84,213,202, 86, 7, 41,225,203, 7,247,176,127,120, 97,240,251,247,191,184,
-141,156, 51, 68, 5, 79, 30, 63, 68, 89,206,112,239,139, 59,173, 86,244,201, 99,127,157,189,103,187,127,239, 14, 82, 54, 15,233,
-230,119, 30,220,187, 11,241, 29,207,211,199, 15,219,223, 9, 33,226,240,194, 37, 60,184,127,199, 32, 61, 81, 60,250,234, 1, 46,
- 94,186,252,181,118,167,152,148,223,161,155,128,199,103,245, 20, 9,177, 87,101,101,219,254, 94,167, 11, 59, 77,146,206,116, 44,
- 89, 93, 43, 60, 3,206,129,202, 4,111, 98, 40, 93,107, 11,179,234,208, 7,127,244, 62, 55, 73,247,134,245,123,147,149,155, 78,
- 62,239,186, 33,146,174,203,229,244,235,130,142,163, 34,223,119,157,107,190,208,125,139,189, 51, 50, 88,198,246,206,208,225,223,
- 97,148,243, 48, 70, 20,214,215, 62,235,223,172,178,136,120,242,252, 24, 31,252,248, 39, 32, 73, 40,130,162,100, 49, 47,113, 2,
- 98, 89,130, 67,132,154,187,137,193,230,200,120,233,202, 30,234,184,143,106, 85,155, 55,121, 22, 8,204, 65, 78, 53,251,199,152,
- 61, 70, 52, 66, 68, 80, 6, 66, 8,132,195, 25,163,226, 61,204,100, 5,218,221, 1, 82, 9,142, 25,203, 90, 64,185,130,102, 35,
-141,114,104,156,214,204,149,142,152, 12,126, 14, 4,225,210, 96, 97, 98, 16, 69, 20,179, 57, 66, 44, 81,114, 64,201,182, 59,159,
-205,230, 40,103,115,128, 45,237,109,190, 51, 3, 17, 33,165,100,207, 1,139, 54,205, 10, 40, 23, 16, 33,228, 92,183, 12,248,198,
-211,163,246,124,247, 44,206,178,119, 7,186, 68,108,100, 41, 79, 95,107,136,120, 44,230, 0, 39,173,245,152, 91,217,168,241, 24,
- 34,187,156,138, 45, 54, 84,149, 90, 18,174, 16,155,189,171,239, 98, 27,162, 46, 49, 16, 66, 48,135, 51, 54,198,124,208,220,134,
-184,100, 15, 36,161, 38,205,141, 21, 28,205, 93,141, 85, 92, 70, 7,243, 92,143,182,131, 87, 8, 66, 48,187,218,198, 84,199, 50,
- 60, 4, 1,192,229, 61, 69,121,237, 42, 18, 93, 4,180,158, 60,149,206,108,130,155,253,119, 9,252,232, 73,196,151, 31, 40,102,
-207,222, 67, 40, 30, 35,132, 3,112, 8, 88, 49, 99,169,102, 5,203, 69, 1,166,210, 72,240,106, 77, 22,169,152,100,207,221,218,
-200,211, 26, 11, 40, 74,119, 60, 36,118,253,151,163, 39, 89,125,162, 38,251,124,204, 93,207, 62, 67, 21, 27,144, 35,219,125,197,
- 62, 77, 39,101,136,152,158, 60,248,116,157,213,238, 99,162,220,152,213, 90, 3,214,100, 4,244, 76,215,154,115, 85, 92, 46,166,
-158,161, 34,238, 39, 31, 27,214,122, 23,173,218, 9, 5,200,161, 77,114,146,196,106,181,106,243,214, 87,213, 10, 49, 22,254,147,
-138,167, 15,191,196, 27,111,127, 23,119,238,124,142,195,131, 11, 0, 17,158, 61,125,186,213,169,229,163, 95,125,128, 55,222,250,
- 14,160,192,157, 59,159,117,186,195,162, 4, 17,225,173,119,222, 29,156, 19, 68,220, 69,178, 2, 72, 14,235, 55,144,132,197,108,
- 14,161, 81,110,119,162,125, 51,144,117, 2,223,212,209, 89,175,170, 1, 13,235,226,197, 75,184,118,227,101,204,102,243,150, 20,
-200, 3,141, 32,144, 82,221,173,111,189,235, 79,169,118,190,155, 37, 30,141, 33,220, 84,215, 29,121,173,247, 59,205, 27, 23,233,
-178,172, 11,191, 54,223,250,246,119,135, 92,228, 38,137, 77,167,209, 8, 61, 83,198, 52, 33, 8,236, 19,227,104,157,240,213,144,
- 19, 91,239,127,218,162, 52, 24, 64,238, 61,169, 95,239,115,161,181, 9,159,134, 92,193, 73,130,224, 54,217,221,208, 37,176, 33,
-167,168,244,183, 3,195,192, 19,157,220,101,235,228,188, 48,206,131,167, 73,186,254,121,150,224, 29,220, 78,244,155,181,100,235,
-232, 11, 13,225,248,141,226,206,222,171,150,225, 52,190,201, 83,160, 91,115,216, 4,186,110,136,179,254, 10, 23, 25,184, 64, 25,
-127,235,240, 83, 60, 61, 57, 6,115, 68,156,237, 0,180, 68, 85,155, 15,121,157, 97, 17,163, 80,172,132,241,237, 11,130, 87, 94,
-185,129, 37,230,152,233, 83, 36,181,244,180, 84,213, 38, 47,131,101,149, 19,153,197,103,140,193, 28,192, 56, 98, 55, 16,202,157,
-128, 80, 71, 28,238, 10, 86,124,136, 18, 47,240,101, 54,214,251, 78,148,214,203,173, 33,160, 89,249, 49,168, 51,146,216, 68,154,
- 18,136,141,216,215,192,184,101,140,136, 65,145, 53, 34,137, 66,148,205, 47,156, 50,234,148, 16, 99, 68, 89, 6, 96,181, 66,237,
-108,119, 98, 56,252,106,175,187, 74,138,153,243, 8, 82,157,219, 36,181,160, 6,235,231,156,141, 19,192,193, 43, 71,178, 25, 46,
- 24, 10, 64,146,172,176,176,177,163,141, 29,104, 95,202,156, 45,229,141, 35,155,215,187, 55,128,133, 42,148, 4,181, 48, 88,204,
-181, 47,120,170,155, 10, 59, 71, 1,173,238, 58, 80,180,221,114, 48, 20,165,166, 0,100,159,194, 41, 35, 48,163,178,138,134, 16,
-162, 77,187, 94,208, 34, 0, 42, 2, 68, 3, 68,146, 83, 81,189, 56, 49, 67,216,238,249, 44,192, 14, 8, 87, 46, 2,247,142,111,
- 64,159, 30,131, 98, 66, 67,247,218, 36, 99,219,244,103, 47, 0, 31,175,128,159,253,170,196,159,124,246, 17,240,253,247,160,225,
-223,129,112, 68,133, 26,171, 28,145, 86, 12,212,157,214,155,155, 34,194,226, 70, 75, 58, 16,204, 53,206,109,228, 18,195,156, 3,
- 40,155, 94, 60, 75, 23,182, 28,124,250,206,208,214,195, 34,251,153, 18,136, 17, 34, 65,132,145, 36,119,222, 24,172, 46,163,115,
- 51, 43,233,136,194,218,151,151,250,142,189, 49, 31, 19, 47,250,141, 90,164, 1,224,161, 64, 76, 61,211, 25,157, 16,193,168,118,
- 15, 31,139, 25,150,171,133, 65,244,197,220,138,149,127,151, 23, 39,199, 88, 45,151,184,116,233, 50, 46, 94,186,130,199,143,190,
-106,161,220, 77,127, 78, 79, 79,240,225, 47,127,142,183,222,254, 30, 56, 4,220,254,244, 35, 40,128,170,182,130,246,193,251, 63,
- 65,174,235,118, 99, 41,189,248, 87,248,206, 65, 71, 81,209,195,169,176,217, 39,246, 34, 76, 21,107,153,236,116, 6, 27,216,252,
- 20, 10,188,246,205,183,112,251,179,143,240,236,217, 83,168, 42,246,247, 15,241,173,111,191,243, 53,138,229,246,103,213, 9,223,
-248,241, 79, 53,197,254,195, 95,252,204,255, 55, 77, 22,142,254,244, 23, 54, 78,210,211,154,250,181, 86, 64,215,141,114, 90,178,
- 90,187,242,214, 86,103,190,241,221,233, 80,194,167,152,214,175,175,177,227,155,182,138,104,251,149,236,135,192,208, 20, 22, 65,
-147,132, 63,162,169, 93,118,143, 24,215, 49,243, 38,144,139,109,122,120, 12,180,219,116,142,226,222, 18, 0,127, 99, 45,219,186,
- 59,215,198,227,176,117,251,235,174, 53,157,121,120,246, 61,187,155, 47,223,248,249,134,223, 64, 1,240,240, 73,141,255,226,119,
- 9,255,193,127,252,231,248,159,255, 53,225,197,243,231,208, 88, 32,139,229,130,167,186, 50,242, 22, 50, 78, 17,176, 35, 21,254,
-173,223,185,138,217,173,183,113,124,162,152,205,102,168, 83,198,233, 98, 5,166, 12,214,140, 58, 11,250,170,244, 12, 70, 40,140,
- 25, 92,148, 10, 42, 15,113,101,190,194,114,118, 8, 74, 25, 71,161,192,147,135, 75,232,241, 67, 80,105,144,106, 74, 13, 20, 14,
- 4, 14,168, 26, 47,210,128,150,124, 25, 26,117,140,154,117, 39, 5, 70,102, 11, 83,169,115,237, 58,103,211,163, 71,102,164, 84,
-129,185, 64, 40, 10,100,169, 77,163,221,172, 52,196, 38,112, 5,144,170, 26,179, 89, 9,141, 1, 41, 37,131,119,217,215, 52,206,
-126, 38,135, 97,153,108, 50,180,152, 53,182, 85, 67, 80,136, 4, 35,169,169, 97,236,145, 21, 26,108, 16,176,134,194, 12,189,130,
- 8, 56, 8, 86, 32,104, 29,144, 36, 89, 54,185,103,169,147,123,216, 67, 5,194, 25,148, 3, 40, 40, 50, 1, 1, 17,194,234,219,
-120, 99, 54, 36, 97, 20,176,104, 83, 17,155, 50,179,239,160, 3,105,155, 38, 71,158,110, 70,238, 97,111,125,135, 56, 83, 60,130,
- 88, 32, 89,112, 41, 40,142,175,238,225,232,244, 58,138,234,174,233,200, 71,148,219,141,190, 36,189,191, 40, 1, 60, 47,128,127,
-126,175,196,239,255,226, 5,118,222,248,151, 88, 20,191,143, 90,231,168,101,137,148, 9, 85,157, 81, 85, 75,212,105,225,219, 22,
- 91, 25,136, 75,208, 26, 25, 0,245, 76,211,196,199, 93, 51,132, 97,115, 74,205,112,101, 2,155, 41,141, 8,154, 88,109,109,132,
-218, 42, 93, 38,187,155,213,148, 76, 72, 34,158, 89, 33,173, 29,172,249,222,180,243,124, 91,128, 85,155, 85, 7,252,231,154,186,
- 70, 62,122,171, 91,205,250,179,250, 94,190,199,162,238,155,251, 25,194, 31,252, 95,111,190,252, 10,152, 24, 28, 10, 92,127,249,
- 22,158, 62,126,228,201, 48,166,113,124,252,240, 75,220,120,233,101, 92,184,112, 17,143, 31,126,217, 13, 9, 91,164, 95,171,229,
- 18, 31,126,240,115,236, 31, 28,224,245, 55,191,109,241,132,169,198,243,103, 79,112,235,149,215, 16,131,145, 56, 66, 40,176,127,
-112, 56,248, 80,165, 79,130,234, 77, 24,169, 54, 19,138,114, 54, 31, 6, 7,156,115,222,153,250, 19, 92, 3,155,179,193, 79,101,
- 81,226,165,155,183,206, 57, 68, 77, 44,157,245,140,254,115,195,170, 50,167,132,163,231, 79,113,243,149, 87, 17,130,145, 74, 98,
-140,216,223, 63, 24, 29,184,221, 59,206,219,128,209,115,153,217, 79,184,199,117,117,177,215, 64,140,245,231, 19, 83, 94,179,151,
-158,132,255,117,235,107, 81,237,139,252, 71,197,116,109,135,142, 33,204, 62, 17,237, 58,118,252, 27, 63,223,120,255,173,218, 79,
-101,219,206, 96, 95,135,222,245,252, 62, 48,231,245, 14,152, 42,184,250,117,238,112, 26, 52, 44,107,150, 13, 91,250, 81, 82, 5,
- 38, 69, 72, 99,230, 59,240,240, 4,248,189,189,135,248, 39,255,228,239,224,225,203,127,129,183,175, 6,236,201, 49,142, 23, 53,
-114, 78,224, 16, 80, 20,246,253,226,192, 72, 43,193, 31,221, 92,225,214,239,255, 17,158,211, 45, 44,151,167,182,255, 46, 75,196,
-232,110, 22,209,124,197, 77,122,102,137,110,129,108, 2, 62,152, 1,179,249, 14, 14, 67, 6,237, 31, 32,213,115,188,168, 78,241,
-240,137, 32,156,124,133, 24,236,112, 87,144,177,208,217, 80, 46,241,184, 18,168, 21,121,118,227, 15,130, 21,114, 98, 11, 85, 73,
- 10,172, 18,144,171, 4, 77,117, 27,228,145,221,163,126, 22, 35, 72,141, 4,200, 33,128,189,240, 73, 6,178,154, 6, 62,248,242,
- 90, 36,129, 56,128, 40, 90,233, 80, 69, 78,102, 52,162, 57,155, 3, 29,139, 35, 97, 38,181, 67, 78, 80,216,207,144, 42,136, 76,
- 6,152,125,167, 42, 48, 55, 61, 38,178,134, 67,146,105,233, 73, 33, 82,218,174,158,178,187,198, 37,228,218,116,237, 33, 24, 84,
- 31, 8,238,225,158,218, 27, 34,171,250, 78,220, 79,123, 81,139,107,149,100, 65, 52,104,121,120, 32, 49,100, 66,148, 90,227, 26,
-227,106,229, 54,194, 87,169, 75, 6, 85, 0, 49, 3,215,246, 4,197,149,171,200, 56, 52,239,126,172,165, 34,159,249,157, 80, 0,
- 23, 11,224,175, 42,194, 63,251, 81,137,195,143,127, 6,240, 47, 80,209, 46, 36, 41,146,123,209,215,110, 17,171, 57, 65,125, 93,
-218,144,219, 20,205, 46,189,255,157,240, 32, 28, 37,115,154, 11,240, 38, 32, 56,225,189,137,188, 85,119, 4, 52,117, 64, 99,229,
- 10, 53,233,155, 58, 81,143,217, 18, 5,205,145,200, 81,101,242,117, 70,235,215,209,125, 47,219,245,161,219, 11, 19,184,147,221,
- 57,129, 87, 92, 34, 23,155,162, 76, 61,159,203, 38, 63,185,137, 65,109, 46,229,201,243,231,248,222,247,127, 23, 33, 70, 60,123,
-250, 4, 95,124,113,103, 80, 40,158, 60,122,136,151,191,241, 58,142,143, 95,160, 90, 46, 59, 83,152,230,128,220, 32,253,169, 42,
- 43,236,111,189,253, 93,188,241,173,183,241,233, 71,191,194,103,159,124,140, 87,190,241, 42,222,254,254,239,129,152, 81,215, 21,
- 30, 63,252, 18, 39, 71,207, 7, 78,170, 77, 8, 73,243,216, 12,139,112,124,244,213, 3,124,235, 59,223,107,247,220, 79, 30,126,
-233,122, 64,234, 35,203,231,211, 5, 43,176,170, 86,184,247,197,109,188,250,218,155, 32,102,172,150, 11, 60,121,252, 16,251, 7,
-135,231,159,161,206, 8,208, 88,223, 45, 79, 67,183,119, 63,255, 24, 47,189,252, 42,190,253,221, 31,128,136,145,234, 10,143, 31,
-125,133,227, 23, 71,163, 9,113,125,223,173,103,145,225,207,195,120, 63,171, 94,104,199,216,238, 55, 92,195, 2,183, 1,174,239,
-121, 27, 13, 38,246,158,103,253,144,221, 62, 64,207, 71, 83,123, 47,163, 64, 59,147, 30,162,237,242, 51,234,115,218, 39,210,201,
- 90, 99, 12, 93,127, 44,109, 60,253,137, 38,121, 11,155,245,239, 83, 23, 97,205,245,122,228,117,191,233,163, 58,123,222,110,100,
-149, 10, 12, 77, 30,206,232, 25,214, 46,137,110,222,241, 16,128,147, 76, 40, 94, 60,199,127,245, 79,111,226,226,223,254,207,241,
-139,143, 30,227,198,107, 55,241,135,233, 91,248, 63,255,159, 15,240,112, 81, 97, 30, 44, 87, 92, 41,225, 89, 21,240,238,193,115,
-252,209,191,253, 14,158,238,253, 0,171,199, 71,144,213, 41, 22, 68, 56,173, 8, 73,163, 77,185,201, 63,223,108, 18, 50,179, 38,
-101, 28,166, 5, 46,236,205, 81,236, 31, 2, 5,227,184,218,195, 50, 61,199,253,103,138,112,252, 0,140, 5, 52,204, 76,174,149,
- 45,138,213, 60,101,212,207, 65,193, 60, 6,100, 50,201,104, 89, 52,166, 50, 12, 86, 35,143,165, 4, 72, 78,136,148, 16,153, 92,
-126,172,160,108, 80, 42,135,128,130, 3,168,174,177,170,141, 61, 95,184, 9,137,168,201,191,152, 8,129, 3,148,196,125,210,205,
- 83, 92,122,156, 11,133,162, 86, 35, 98,169,235,189,193, 64,146,140,130, 8, 37, 17,148,196, 39,232, 96,231, 96,110, 38, 97,131,
-139, 57,152,230, 90, 32,230,171, 47, 22,159,197,209, 99, 93,157,181, 45,162,110,103, 23,144,124,156,139,202,136, 16,247, 30,111,
- 62,236,220, 58, 90,170,164,214, 12, 28,109,106,153,137,184,137,109, 16,210, 12, 79, 55,115, 13,119, 32, 36, 55,230,129, 24,220,
- 12, 8, 42, 2,118, 53,227,194,165, 2,143,142,111, 34, 28,157, 2,156,209, 11,236, 62,247, 57, 27, 1, 20,115,224,127,185, 59,
-195, 91,255,252, 41, 94,185,249,191,225,238,206,155, 56, 77,251, 88, 84, 15,176, 74,201,100,145,117, 2, 82, 5,209, 10, 44, 53,
-114, 43, 89,237,212, 8, 77, 72, 81,107,110,230,186,236,146, 20,177, 32, 84, 20,125,208, 75,238, 9,207, 29,226,237, 72,139,170,
-186,220,141,205,226,216,245,131,140, 38,149,177, 48, 84, 3,104, 87, 53,226, 70, 72,162, 98, 72, 81, 19,146,214,112,196, 90, 55,
- 77,234,134, 13,114,215,203,223,253,254,119,244,248,248,197,218,201,216, 16,233,185, 55,245,177, 31,146,149, 67,223,125,179,147,
-198, 13,238,157,223,249,125, 60,184,123, 27,207,158, 60, 6,122,113,174,147,134,109,195, 84, 72, 63, 23,184, 71,187,239, 14,115,
-234, 7,158,244,133,220, 52,220,159,115,107,132,223,113,134,154,215,215,159,102,148, 54,215,165, 73,182,229, 68, 40,201,249,179,
-214,187,221,200,118, 68,147, 54, 60,191, 31,228,164,232,214,241, 61,135,186, 77,175,130,122,143,120,102, 19, 67,103,230,128,119,
-206,185,244, 53,190,100,253, 92,128, 30,163,186,255,126,105,203,139,215,205,107,127, 58,227, 61,232,228, 39,182,254, 0,147,118,
- 23, 61,122, 70,107, 39, 75, 91,252, 6, 55, 24,205,108,223,169,127,205, 98, 61,186,151, 90,150,186,158, 23,111, 26,173, 93,180,
-187,187,116, 91,117,158, 90, 17,209,184,121,152,248, 61, 6,110,127,149,241,159,189,243, 16,255,245,255,244,223,225,179, 11,255,
- 17, 22, 95,252, 20, 97,190,143,195,221,128,199,191,248, 23,248,191,254,239,159,224,163,199, 9,251,251,115, 60, 58, 90,225,210,
-234, 9,254,195, 63,189,132,249, 31,252, 99, 60,124,182,135,234,244, 49,242,106,129, 69,149,112,116, 90,161, 94, 46, 80,215, 53,
-234,106, 9,164, 26, 34,201,100,102, 28,113,101,206,184,126,133,145,119,175,226,180, 46,161, 26,176,172, 87,248,252,209, 18,167,
- 15, 30, 96,135,159,163, 40, 75, 84, 73,236, 99,113, 39, 52, 33, 66,157,173,184, 68,177,100,178, 83,141,168, 22, 53, 98,176,131,
- 89,196,130, 90,146, 18, 52, 53, 73,108,130, 16,162,163,164,130,212,236,147,217,108,100, 73,129,156, 19,170,170,178,240, 22, 37,
- 72,206,158, 4,136,150,145,109, 22,180,217,165, 72, 6,191,138, 42, 2,128,228,159,111,112,185, 97, 82,160,206,138, 40, 9,123,
-115, 70,142, 17, 85,205,160,156,123,206, 37,246,121,132,102,237,232,239,113,149, 20,154, 4,140, 26,228, 14,122,193,199,104, 1,
-192,106,251, 99, 6, 80, 59,201,107, 22,129, 58,152,139,156,177,197,165,109,178, 73,140,236,135,182, 50,160,157, 22, 25,150,144,
- 6,138, 80,143,210, 21,205,110, 64, 19,161,217, 98,101, 25,217,252,207, 65, 40, 5, 88, 49,112,231, 40,162,190,247, 5, 66,126,
-208, 49,237,113, 54, 8, 53,112, 71, 37,224, 89,165,120,165,174,241,159,254,187, 11,208,191,255, 23,120,239,232,207,241,244,147,
-207,177,122,116, 15,249,197, 99,200,242, 41, 80,159, 64,116, 97,164,203, 38,212,203,191, 23,217, 27,116, 75, 85,235, 94, 44, 49,
-153, 0, 0, 13,167, 73, 68, 65, 84,177,217,137,219,147,172, 6, 80, 37, 65,170,205,162,151, 72, 93,138,214,219,252,146,244, 98,
-205, 13, 89, 34, 14,230,169,224,210,184,110,250,106,242, 76, 13,132, 39,105,164,116, 54,184, 10, 53,200,171,161, 6,102,130,229,
- 89,238,106,114,236,112,243,250,149, 31,174, 86,171,150, 54,223,137,121, 27,151, 26,251,171,216,219,112,104, 47,104,181, 57,137,
-152, 8,151, 46, 95,193,225,197,203,184,251,249, 39, 78, 64,153, 8, 81,161,117,180,176,201, 74,199, 38,191,180, 86,118, 75,189,
- 67,108, 56,152, 80, 47, 19,136,250,208, 98,251, 60,235,243, 34, 77,153,159,109,186,121, 8,107, 59,158,223,100,243,185,253,124,
-167,117,194, 21,122,182,200,212,151, 26,209,168, 1,219,240,232,231, 46,236,211, 69,171,111, 70, 68,163,215,122,158,166,166,251,
- 29, 66, 95,121,125,190,102,162,211,105,211,184,112,208,166,119, 60, 76,124,107, 91,169,141,239,125,253,186,108,178,207, 57,187,
-241,161, 77, 31,193, 6,239,252,137,247, 73, 95,243, 78, 26,135,173,156, 11,222,167, 30, 15,133,190, 86,163,214, 54,214, 46,211,
- 2, 81,151,253, 78, 35,216,253,148,240,237,240, 37,254,199,255,246, 79,176,252,206,127,137, 71,119,191, 4,180, 66,189, 90, 33,
-243, 12, 7, 47,221,194,203,151, 9,207,238,221,197,189,231,130,189,148,241, 15,126, 63,227,198,159,252, 61, 60,173,191,137,188,
-120, 10, 72,141,228,228,161,170, 90, 33,173, 86,102,194, 33, 22, 57, 26, 67, 64, 41,130, 27, 59, 9,179,139, 37,142,230, 47, 1,
-124,128, 34, 39,172,210, 2, 95,156, 2,139,175,158, 98, 46, 15,161, 4, 20,177, 48, 47,239,100,190,233,228,100, 50, 21,155, 40,
- 57, 50,106, 42,160,153, 77, 83,158, 5, 33,152,143,121,115,200, 22,148,221, 57,143, 92, 66, 70, 78,184, 50,196, 35,123, 3, 32,
-106, 6, 56,129, 27,117, 51,183,114, 39, 81,115,117, 99, 34, 48,147,171,188,122,103,151, 18,152,196, 77,103, 60,195,219,205,105,
- 84,196, 10, 34, 43, 52,204,144, 51,131, 36,245, 44,179,187,111, 75, 8,150,224,214, 64,180, 42,217,135, 45, 99,103,177, 23, 44,
- 40, 35,194, 28,201, 56,192,236, 72,197,136, 92, 41, 68,100, 9,230,117, 14,219,129,147,102,123, 55,100,191,175,196, 72,205, 26,
- 71, 45, 76, 6, 30,186,163, 46,249, 82,144, 33, 9,234,242, 61,181, 61,116,203,138, 16, 96,142,140,186, 0, 78,234, 57,120,113,
- 10,226,170, 85, 59,125,221,243,118, 30,129, 47, 37,226,215, 31, 37, 92, 95,252, 26, 7,223,184,138,147,234, 53, 84,143,238, 3,
-171, 39,224,124, 2,210, 21, 84,147, 69,218, 52,235, 0,159,204, 3,161, 91,195, 53,254, 13, 48,150,123,112,199,188, 38,218, 23,
- 20,160, 26, 92,154, 40, 3, 62,142, 54,168, 9,217,231,170,173, 10,167, 25,109,204,134,205,108,108,185,157, 40,184,217,155,147,
-145,249,148, 26, 55, 67, 63,127,181,113,225, 19, 8, 41,148, 24, 69, 89, 34,188,116,245,218, 15,171,170, 26,100,151,179,223, 24,
-220, 10,219,173,128,103,162,222,126,150, 58, 61, 30, 8,239,254,238, 31,226,224,194, 69,220,254,236, 19, 44, 78, 79, 7, 97, 15,
-155,234,151,162, 99, 67,247,109,100,167,139,252,104,158,162,225, 73, 61,206,183, 30,151, 96,154, 58,154, 54, 28,134,116, 70,209,
- 61,251, 0,221, 76,134,163,179,171,223,250, 1, 58, 96,247,141, 11, 75,191, 40,157, 99, 98,223, 54,229,142,254,173, 93,181,210,
-250,203,235,199,125,210,118,202, 86,143,161,191,173,120, 15,167,227,150,213,168, 95,239, 53,175, 23,215,241,183,107,251,107, 24,
-166,214,210,246, 79,145,166,108, 44,105,235,154,229,236,162,253,117, 25,240,253,151,212, 57, 70,209, 89, 63,219,176, 28,155, 38,
-153,206,180,195,233, 93,210,126,151,169,131, 70,171,249,153,149, 18, 86, 79, 78,240,223,255, 89,129,111,255,163,255, 1,247,159,
-221, 2, 45,110, 35, 9, 65,165,134,230, 26,181, 20,160,195,111,224,218, 33,176,122,112, 23,127,120,245, 8,239,254,217,159,226,
-217,236,143,145, 79,158, 99, 85, 85,168,179,162, 78, 25,139,100,123,208, 92,215,168,106,203,168,174, 50,176, 91, 70, 92,190, 72,
-168, 47, 94,192,253,124, 3,143,190, 74,168,150, 39,200,101,137,135, 75,198,139, 47,143, 48, 95,221, 5,202, 96,154,108, 6, 2,
- 71,168, 38,100,102,135, 62, 29,106, 37, 64,219, 84, 54,207,251,206,181, 35,127,193,134, 27, 22, 80, 32, 40, 66,199, 62, 38,131,
- 75, 9,150,174,149,179,171,113,216, 10,183, 18, 0, 14,254, 93, 50,191,240,236,141, 74,163,200, 8, 28, 90,115,146,214,125,147,
-169,133,130,217,247,176,205,235, 80,152,124,137,156, 56, 85,144,216, 62,150, 59,163,146,198, 2, 60,195,201,116, 54,143,183,146,
-173,224,208, 59, 17,129, 41,128, 89,188,176,184,118,139, 34,178, 42, 72,172,129, 9, 98,200, 5,216, 53,244,238, 35, 15,143,144,
- 21, 95,148, 51, 20, 5,251,243,105,234, 53, 49,205,173,151, 91,151, 8, 51,197,177,251,145, 21, 40, 32,208,168, 56,193, 12,122,
-170, 64,126, 49, 24, 52,207, 51,165,247,255,199,110,161,120,162, 37,126,253,235, 99,200,227,247,113,225,250, 5,204,203,235,144,
-147, 71,208,250, 4, 74,217, 96,119, 53,148,151, 84, 33, 57, 67,218,203, 69, 78,200, 54,174, 69, 31,125, 12,204,109,222, 64,211,
-216,216, 96, 46,142,114,187,211, 39,105,187, 26, 14,212, 64,230, 86,252,205, 39,190,183, 80,116, 84, 69,149, 7,180,112,234, 33,
- 46,150,196, 99,207,213,198,179,250,142,181, 44, 10,132,151,174, 93,249, 97, 93, 85,189,131,144, 90,157,104,255,128, 19,227, 73,
-244,104,246, 67,191,173, 47, 31,220,195, 87, 15,190,232, 92,207, 54,102,128,233,168,112,141,206, 73, 58,227, 0, 7, 38,139, 3,
- 77,129,220, 27, 30,107,236,196,181, 41,227,154,206, 81,216, 55,188,194,115,254,220,182,162,174,235,182,221, 19, 93, 8,157, 85,
-216,105,234,181, 97, 51,244, 60,174,135,122, 86,118,253,182,199,155,248,172,233, 92,213,169,221, 23, 13,138,200, 57,145, 6, 58,
-243,162,211,198,123,172,255,138,137,206, 42,238,235,255, 70,152,102,193,159,213, 16,124,253,159, 57,139, 12, 55,221, 28,104,111,
-172,182, 0, 10,157,108, 65,117,226,123,209, 36, 58,174,125,103, 70,215,150, 24,184,255, 76,240,103, 47, 63,194,127,242,223,252,
- 5,110,239,252,125,172, 30,223, 70, 40, 24,117,109, 69,146,221, 99,224,116,177, 2,118,174,226,123, 55, 20,111,190,123, 13, 71,
-215,255, 46,100,145,112,154,150, 88, 44, 86,208,106,133, 42,101,156,158, 46,161,171, 21,178,102, 44, 87,181,217,157,230, 26, 66,
-130,103,229, 53,220,123,182,143,244,232, 25,248,244, 11, 44, 79, 95,224,100, 33,168,142, 22,224,211, 7,136,101,134,240, 12, 16,
-139, 71, 37,159,136,164,246,244,106, 50, 2, 19,147, 5,157,168,100, 47,166,240,132, 45,117,104,221,172,173, 19,162,187, 32,202,
-192,183, 32,139, 34,134, 0, 10, 1, 41,231,182, 96,138,116, 54,214,205, 14,159, 36, 27, 75,217,239,237,192, 64,136,236,133,216,
-173,155,137, 60,163,222, 65,121, 38, 36,113,182,185, 23,195, 6,159, 12, 80,196, 72,208, 16,109, 50, 55, 59, 57,164,150,149,214,
- 8,248,224,132, 44,180, 5,153,217, 38, 79,227,135,185,189,108,110, 34, 91,156,209, 70,185,211,202,132, 8,229,136, 12, 69,102,
- 6, 83, 68,244,102, 66,115,215,152, 80,227,119,239,245,145, 84, 93,231,222, 65,172, 13, 1,140,161, 96, 82, 48,219,107, 91, 48,
- 99,181, 44, 64,213, 49, 64,117, 59,230,109,231,242,108,158,216,171, 56,199,157, 59,199,120,124,231, 23,160, 34, 98,247,224, 42,
-118,203,140, 82, 87, 38, 21, 84, 70,104,160,118,178,138, 78, 62,117,183,187, 36,103, 5, 51,105,219, 4, 68,119,222,163, 70, 30,
-233,138,114,234,237,184,133,154,144,180,134,255, 69,174,119,231,102, 70,111,139,121,179,187,111,226,139,225, 25,247, 74,157, 36,
-216,175, 86,183,126,109,136,120,170, 40,139, 2,177, 79, 99,106,206, 78,241,221, 66,147, 92,195, 58,117,237,100,141,109,166, 91,
-103, 77,157,218,106, 14,138,172, 17,234,244,156, 16, 98,247,162,199,123,211, 62, 65,138,177,221, 26, 83,167,185,222,191,193,206,
-124,109,241,252,245,254, 40, 70,214,158,221,206,115, 0, 71, 80, 47, 89,142,166, 87, 27, 3,147, 47, 29, 12,248,195,191,192,152,
- 32,215,211, 32,107,215, 96,169,158,163,152,172, 17,223,116, 84, 42, 59,221,249,246, 98,213,253,236, 48,107,121,168,155,159,108,
- 32,122, 18, 53, 85, 93,139, 22,154,140,111, 69,103,187, 79, 45,196, 54,218,203,244,164,117, 52, 38,235,141,194,106, 54, 17,239,
- 38,175,215,232,169,214,174,221,218, 99,244, 37,107,189,104, 66,157, 10, 75,214,214,179,126,176,104,164, 94, 86,252, 40,173, 73,
- 71,122,197, 33,234,208, 89,205,234,218, 59,234,127,147, 21,199, 53,225,122,122,142,127,244,247,222,194,233, 27,255, 16,167,183,
-159, 65,242, 9, 64, 37, 10, 38, 44,171, 4, 9, 1, 51,202, 80,169, 81,212, 9, 87,222,250, 62,170,253,155, 72, 71,132, 85, 62,
-198,139,133,249, 68, 16, 50, 22,181,128,115, 13, 80,141, 74, 20,146, 5, 17, 25, 33, 2, 39,171,132,197, 23, 79,160,171, 83, 68,
- 62,133,204, 74,104, 82, 20, 11, 83,223,172, 56,161,206, 37, 2, 1,165, 15, 57, 73,164,133,183,197,225, 77,226,224,242, 35,119,
-232,112,146, 89, 86,139, 49,101,205,168, 83,134, 38,181, 16,150, 96, 50, 53, 33, 43,174,141,133,104,157,106, 32,148, 96, 46,144,
-165,106, 53,206, 10,241,203,174, 32, 14, 40, 74,178,166,196,159,211,172,114, 35,152, 11, 80, 22,223,225, 43, 56, 24, 50, 32, 98,
-146, 58, 79,137,105, 77, 99, 68, 58, 83, 20,115, 45, 15, 62, 17,215,214, 60,100, 2,229,132,192, 10,167,171, 25, 33,143, 12,244,
-101, 16, 10, 39,112, 41,113, 87,144, 26, 54,184,159,160,236, 95,172, 44,228, 27, 95,115, 88,211, 4, 36,168,175, 2, 8,200, 17,
-208,218,222,167, 24, 43,188, 89,193,154, 99,155,161, 23, 81, 45, 58, 46,187,172,178, 73, 25,203,222, 4,204, 35,240, 98,119, 6,
-156, 30,130,242, 18,202,231,111,103,167,172,140,231, 65, 81, 94, 56,192,243,231, 11, 60,253, 87,255, 7,246,175,191,134, 75, 55,
- 94,197,193,225, 1,202,121, 13,206, 43,112,157, 64, 41, 97,166, 0,212, 66,122,200,210,129,252,181,217,234,131, 85,221,215,192,
-120, 25,230,234, 23, 81,146,189,139,228,239,177,145,154, 57, 87,221,223,191,182,205,158,186, 79,124, 82,147, 70, 24, 82,196, 29,
- 78, 77, 93, 3,145,155,251,199,104,141,222, 92,135,174,241,242,236, 15,130, 34,158, 30, 31,217, 19,162, 31,121,217,201,142, 24,
-100,230,242, 61, 3, 11,106,237, 46,125, 15,184,129,120, 70, 24, 74,205, 20, 67, 63,235,241, 70, 81, 39,119,174, 91,201,193, 3,
-182,115, 55, 37, 81,159,132, 61, 36, 61,141,206,234,241,238, 99,235, 68,189,173, 94,107,223, 5,124,187, 2,126,227,195,232, 8,
- 70,237,225, 29,131,131,158,186,235,222,213, 73, 90, 91,209,158, 69,121, 26,248,183,227,140, 78,103,195,131,245, 37,133,212,211,
-169,247,127,105,205,206,100,171,158,125, 64,201, 26,225, 47,211, 70, 49,227,102, 64,135,174,233,131,102, 98,234, 83,104,238,147,
-129, 29,190, 78,223, 0, 83, 6, 70,180, 81, 62,176, 65,127, 63,209, 12,109,190, 47, 70, 13,200,100,255,168,231, 58,238,198, 97,
- 59,170,253,216, 89, 29, 4,198, 52,141,145,246,201,145, 77,147, 39,195,126,160,223, 61, 42, 1,207,143, 18,254,233, 59, 25,223,
-255,247,254, 1, 62,126,241, 18,168,250, 37, 34, 17, 88,106,132, 50, 98,167, 94, 33,167,132,196,115,204,192,184,118,152,145,246,
- 94,198, 98, 53, 71,157,158,226,197, 2, 88,157,156, 64,171, 5,132, 25,105,181,194, 42,213,168,181,128,164, 37, 72, 18, 18, 25,
-207, 89,115, 5,172, 30,131,164, 70,230,128,144, 92, 58, 21, 2,160,133,153,161, 84, 43,132,130, 33, 5,131, 97,196,182, 36, 22,
- 62,162,217,164,223, 45,210,162, 98,250,111, 16,130, 50,148,205, 37, 45, 48, 67, 56,123, 50, 91, 70,134, 21, 89,115,125,244, 9,
-152,205, 81, 12, 41,249,245, 35,104, 45, 8,133,145,171,224,103,106,206, 48, 7,178, 88, 26, 42,160, 86,112,115,114, 93, 58,119,
- 97, 58,129,129,204,198,108, 71, 54,127,114, 91,209,119,187,104, 17, 69,136,193, 24,211, 73, 16,124,154,180, 29,183,193,195, 77,
- 78,186, 37, 47,139, 65,249,158, 86, 70, 33, 27,195, 30,236,170, 20,241,111,156, 39,230,145,177,212,133, 1, 13, 77,194, 91,110,
-139, 14,137, 37,227,105, 38,168,154,125, 46, 40,185,174,223, 33,125,113, 15,116,233,216,253,228,102, 58,236,250,251, 6,148, 15,
- 66, 40, 1,196, 25,144,139,125, 32, 63,105, 87, 7, 95,127, 82, 26,158, 14,179,157, 29, 64, 51, 86,143,110,227,238,163, 7,224,
-253, 27, 40, 14,175, 33,238,238, 33,150, 59,136, 92, 32, 80,133, 8,215,213,179,229,212, 71,223,137,131, 2, 2, 4, 59, 0,246,
-189, 41,204, 78,109, 11,161,176, 44, 0,207, 50,208,156,123, 48,188, 15,173,212, 44,238,173,176, 55,200, 64, 99, 23,107,146,181,
-108, 46,115,182, 28, 66,240,181, 75,114,200,156,180,161,148,187,143, 60, 53, 5, 95,113,114,122,130,248,210, 75, 47,225,248,248,
-196,161,117, 26,144,207,122, 36,214, 65, 79,174,189, 73,185, 63, 13,245,127,167, 97, 81, 82,175,224,201,196, 94,123, 19,137,110,
-147,223, 47,141, 38,212, 53, 68, 90,135,214,182, 4, 29,189,135,126, 86,252,111, 16,119, 73,219,183,227,180, 17,143, 56, 31, 12,
- 63, 32,152,235,246,215, 49,197,174,166, 65,241, 28,221,218,132, 54,144, 96, 51, 62, 79, 95,139,148,194,189,151, 42,235,139,241,
- 45,184,216, 54,136,121,186, 72,210, 70,168,190,185,247,134, 77, 38,157,177, 42, 56,251, 51,162, 45,171,160,142,177,190,246,105,
- 79,134,226,208, 25,239, 67,207,127, 63,142,134,108, 58,243, 90,247, 17, 7, 26,166, 39,110, 33,167,110,138, 45,222,246, 28,167,
- 9,248,238,197, 35,252,253, 63,255, 99, 44,110,254, 93,240,189,167,216,157, 7, 4, 42, 28, 98, 44,177,207,140,186, 94,161,202,
- 1, 23,119, 8,179, 43, 47,227, 56, 31, 32, 85,199,168, 4,208,106,137,168, 21,168, 96,172,132, 81, 6, 66,102, 70, 94, 38,148,
-129, 64,243,153,219, 55, 51, 80, 42, 32,115, 72,142, 8,129, 17,162,249,160, 71,142, 40, 96, 86,174,169,180, 9, 48,112, 64, 17,
- 24,202, 1,203, 42, 33,186,223,124,118,195, 31,114,253,189,128,157, 84, 38, 72, 82,162, 78,166, 99, 46,102, 51,115,152,115, 8,
-181, 74, 10,145,100,187,112, 6,152, 13,134,237,252,240,103,144, 92,155, 38, 57, 70,247,135,177,199, 21,145,246,188,148, 44,200,
- 0,230, 89, 77,159,237,210,178, 2, 22,217, 90, 83, 68,204,190,139,206, 25,129,157,160, 40,141,127,131,128, 3,129,185,240,221,
-170, 77,249, 51, 16,114,118,163, 26, 82, 79,246,130,229,151,155,129, 60,130,102, 16, 11, 40,148, 72,106, 50, 42,242,166,192,108,
-120,221,112,198, 17,133, 54, 23,168,225, 28,180, 8,156,231,139, 39, 69,148, 0, 14, 37,196,167, 89,101,194, 12, 1, 57, 41, 84,
-106,219,187,171,192,178,107, 76,235,157, 52,155,156,207,165, 94, 12, 96,197,132,101,125, 17,124,124, 2,224,180,211,116,235,121,
-166,116, 61,227,142,189, 96,141, 81,125, 4, 28,157, 64,143,119,161,197, 62,114,220, 65,142, 17,171, 16,109, 61, 17,187, 51,141,
-160,110,159, 11, 20,100, 69,253,229, 25,225, 96, 22, 33, 28,145, 41, 32,105, 68,149, 9, 85,149,144,234, 57,144, 42, 16, 58, 14,
- 65,243,189, 85,209,150,104, 40,232,165,191,137, 66,145, 91,152,116, 48, 48,252,127, 99,130, 92, 25, 3, 89,227, 0, 91, 8, 12,
- 57,109,238, 63,116,213, 62, 23, 23, 55, 3, 0, 74, 93, 38,154, 21, 95, 60,149, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, 1,
+ 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,
+112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8,
+ 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,
+140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,
+231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10,
+ 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,
+192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,
+128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,
+148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216,
+ 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35,
+ 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113,
+ 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,
+145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112,
+ 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15,
+ 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,
+103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,
+146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243,
+ 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,
+246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37,
+ 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192,
+ 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176,
+ 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9,
+ 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81,
+ 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71,
+ 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,
+140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,
+203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30,
+ 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,
+196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,
+164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,
+228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229,
+ 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,
+131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,
+151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199,
+ 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,
+166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83,
+ 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,
+198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,
+169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,
+239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,
+189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,
+174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253,
+ 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,
+195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163,
+ 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61,
+ 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133,
+ 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,
+182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,
+141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,
+103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203,
+ 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,
+105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67,
+ 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,
+222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37,
+ 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,
+130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,
+195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,
+103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75,
+ 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,
+167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,
+103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132,
+ 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,
+103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,
+232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,
+255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86,
+ 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11,
+ 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,
+216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,
+151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,
+188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,
+213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109,
+ 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,
+190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,
+225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252,
+ 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,
+219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,
+229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,
+123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,
+126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,
+127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62,
+ 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,
+209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,
+119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,
+252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0,
+ 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,219, 12, 13, 17, 26, 29, 77,120, 44,213, 0,
+ 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,188,109, 89, 85,223,251, 29,115,206,213,236,230,180,183,173, 14,170,138, 70, 16,
+165,171, 2, 84, 8, 2, 94, 94,130,109, 52, 84,229, 35, 79, 77, 66,158, 85, 81,223, 67,226, 83, 11, 19, 99, 72,158,137,162,143,
+ 72, 64,125, 84,105,162,190,232,203,123, 20, 24,141,138, 13, 85, 98, 20,108,128,139, 2, 82,101, 81,197,173,134,186,213,220,123,
+ 79,115,207, 57,187, 91,107,205, 57,223, 31,115,174,181,215, 57,220,170,219, 80, 13,133,107,240, 41,238, 57,251,236,189,246,106,
+230, 26,191, 49,126,227, 55,198,130,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,
+172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,
+206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58, 59,119,147, 39,227, 75,253,111,188,241,
+ 91, 41,253,155, 80,164, 40,255,110,254,254, 47,255,170, 8,190,187, 28,157,117,214, 89,103,157,117,246, 20, 2,117,255,155,223,
+245,106,182, 70,127,200,230,200,179,176, 4,251, 87,133,170,248,127, 40,182,174,151,107,111,222,233, 46, 73,103,157,117,214, 89,
+103,157, 93,152,169, 39,252, 27, 31, 56, 54,224,193,123,224,228,241, 9,247,222, 49,230,158, 99, 99,188,126, 3,249,202, 39,253,
+239,124,247,179,187, 75,210, 89,103,157,117,214, 89,103, 79, 21, 80,255,103, 31,250, 29,122,234, 71, 24,166,125, 4,195,201, 7,
+ 28,199,110, 31, 51, 45, 47,199, 37,183,251,223,249,238,127,208, 93,150,206, 58,235,172,179,206, 58, 59,127,147, 39,235,139,253,
+187,190,234,117, 76,171,247, 50,243, 25,182,154,144,230,138,167, 61,211,176,186, 47,197,206,222,129, 74,223, 34, 95,255,174, 89,
+119,137, 58,235,172,179,206, 58,235,236,139, 28,212, 1,252,141, 87, 61,131,145,126, 63, 83,251,108, 74, 59, 70,107,184,248, 10,
+197,225,139,115, 92,249, 9,180,255,251,242,186,119,223,243, 84, 57,153,222,251,171,128,149,248,235, 49, 17, 57,246,165,188,120,
+254,182, 29,111,103,157,117,214, 89, 7,234,103, 3,134,159,126,254,128, 36,249, 85,198,254,155, 41,253, 20, 28, 28,186, 76,184,
+232,105, 61,180, 20, 36,213, 55,202,223,189,241, 3,143, 49, 24, 93, 9, 92,121,142,111,223, 16,145,163,231,184,221, 15, 0, 71,
+226,175,111, 17,145,183,125,137,131,250,223,170,227,125,140,206,153,136, 72,215,233,209, 89,103,157, 61, 46,102,190, 96, 39,245,
+193, 87, 25, 62,151,102,103,252,227,118, 33, 44,164, 30, 14,193, 33,224,244,116, 30, 68,100, 11, 66, 50, 19, 88, 5,191,246,102,
+238,187, 47, 99,199,253, 79, 56, 10, 54, 78, 65,127, 56,101,249, 64,130, 77,255,192,255,222,255,250, 99,100,127,253, 19,242,234,
+ 63,170, 30,163,227,190, 6,248,201,243,112,196, 0, 55, 3,183,136,200, 77,221,178,249,146, 0, 87, 37, 34,174,245,251, 37,192,
+203,128, 23, 1,207, 3,174, 0, 46, 1, 22, 9,218,147, 77,224, 94,224,207,129,255, 42, 34,127,122, 65, 81,244, 89, 0,221,123,
+255,194,184, 62,143,196,239, 63, 8, 20,192, 3,192,167,129, 15, 1,191, 45, 34,119, 60,194,231, 15, 2, 95, 1,124,101,235,223,
+231, 1,195,214, 62, 72,183, 2, 58,235,172,203,212,119, 59,143,183,190, 85,177,120,235,117, 88,249,151,136,236, 71,107,135, 8,
+ 40, 21,254, 19, 1,173, 5,165, 64,199,223,149, 2, 21, 95, 19, 1,169,223,171, 44, 90,207,240, 50, 64, 90,239,213, 26, 28,138,
+ 60, 77, 16,251, 63,232,113,141,188,242, 93, 39, 31, 3,135,126,195,249,128,250, 30,187, 5,184, 86, 68, 54,186, 76,253, 75,231,
+120,125,140,220,206,195,254, 24,120,163,136,124,246, 49,250,254,139,129,159, 1,174, 61,199,224, 64, 46,244, 56, 58, 80,239,172,
+179, 46, 83,255,124, 91,190,245,251,113,234, 63, 80,249, 2, 45, 30,208,136,128, 39,252, 23,126, 22,148, 7,231, 65, 73,248,131,
+114,160, 37,188, 65,121, 80, 30,196,107,156, 77,208,218, 71,175, 19,183,227, 65, 41, 71,105,103,104,245,181,140,253,223,248, 91,
+191,239,181,242,117, 63,247,241,199,248, 60,220,242, 40,127, 59,114,134,223, 63,224,189,127,237,153,128,189,179,191, 53,246, 74,
+224,163,222,251,215,136,200, 95,125,129,128,254, 60,224, 15, 99, 86,222, 89,103,157,117,246,196,130,186,127, 43, 10,231,191,135,
+113,233,177,101,137,117, 32, 34, 33,239,151,144,255, 71,220, 6, 97, 92,218, 62, 90,161,246, 29, 4, 99,192,122, 36,100,232, 1,
+228, 69,129, 85, 1,224,149,155,103,234,162,200,242,100,134, 0,150, 2,203, 10, 36, 71,253,173,111,250, 30, 94,243, 31,111,124,
+172,106,147, 34,242,218,179, 56,221,154,174,175,235,240, 87, 1,215, 1, 93, 13,249, 75,207, 70,192,239, 1, 31, 0,142, 18, 40,
+247, 77, 2,125,253, 34,224,159, 2,111,136,239, 93, 1,254,187,247,254,185, 34, 50,186, 64, 64,127, 6,240, 65,224, 64,124,169,
+ 0,126, 17,248,117, 2,221,126, 10,200, 9, 84,252,151, 3, 47, 7,190,241, 81, 54,121, 42,126,238,211,192,109,173,159, 79,116,
+151,182,179,206,190,244,237,194,233,247,119,190,252,122,182,167,239,166,178, 17,188, 91, 91, 19,153,255, 92, 89, 55, 46, 80,178,
+176,130, 44, 44,204,105,119,173, 17,165, 67, 6, 47,177, 84,174, 36, 80,238, 74,133,141, 41, 67,150,245,102,212,239, 67, 11, 34,
+138,220, 24,112,239,101,188,244,143,228,155,223, 58,190, 0, 71,186,139,126, 63, 23, 58, 50,138,235, 62,198, 92,237,125, 84, 68,
+174,222,243,158,142,126,127,234,236,123, 42, 34, 69,235,247,143, 0, 63, 7,188, 71, 68, 38,103,249,236, 63, 0,254,223, 86, 80,
+124,131,136,252,212, 5,236,131, 0,127, 20,179,126,128,187,128,175, 23,145, 59, 31,135,227,245,231,179,222, 59,235,172,179,191,
+ 69,153, 58,128,188,233,195, 55,250,255,240,226, 91,209,234,153, 56, 37,136,115,243,191,170,248,179,157,145, 14,190,122, 54,205,
+127,178,159,244,112,206, 5,208, 22,192, 57,124,177,131,104, 65, 93,246, 2,212,129,103, 34,139,135,145,124, 17,170, 25,110,116,
+ 18,191,253, 32,179,147,159,201,152,237,128,238,129, 88, 80, 26,217,113,164,131,236,245, 12,183,174,240,191,255,131, 95, 43,127,
+247,255, 28, 61,222, 39, 74, 68,142,121,239,111,142, 25,122,157,173, 63, 22,206,118,101,207,182,142, 62, 22,180,254, 30,133,255,
+ 5,181,155, 61, 22,219,120, 34,142,119,207,126,158,211,246,218,128, 30,127,127,233,121,172,133,247,121,239,127, 26,248,145,248,
+210,183, 2, 63,117, 1,187,254,143, 91,128,190, 14,188, 90, 68,238,239,220, 82,103,157,117,246,132,131, 58,128,252,192,199,239,
+138,217,197,153,157,237,175,124,243,243,153, 86,223, 49,212,158,170,174,171, 79,167,248,217, 8,236, 8,253,236,191,131,185,250,
+ 13,232, 43,190,234,243, 62, 91,143,186,243,235,247, 80,125,246, 86,236,189, 31, 70,116, 10,222,227, 5,138,113, 65,218, 79,175,
+ 66,251,247,251,143, 93,119, 68,174,190,169,124, 2,206,215, 99,210,135, 29,129,237, 58,130,202,249,170, 51,252,253, 24,112, 19,
+112,211, 35, 1,148,247,254, 39, 91,159,189, 89, 68,110,106,109,247, 58,246,180,236,197,109,190,237, 92,212,251,222,251,235,128,
+ 27, 30, 97, 27,143,186, 95,143,199,241, 62,202,177,222, 16,183,187,210,122,251, 45,192,107,159,128,181,240, 75, 45, 80,191,208,
+241,198,111,106,253,124, 67, 7,232,157,117,214,217,147, 10,234,143,234,200,255,243,107,175,103,103,250,110, 42,177,149,245,248,
+114,134,159,142,161,154,129,241,100, 95,255, 35,152,171,191,253,236,129,195,234,229, 36,171,255, 20,117,248,249, 84, 31,253, 69,
+ 80, 54, 64,190, 8, 20,174,160,159,188,146,141,254,191, 6,126,244, 9, 56, 95,109,240,184,160,236,210,123,127, 4,120,207,158,
+109,237,181, 43, 9,229,129,235,188,247,215, 62, 66,159,252, 85,204,169,239, 91,226, 32,152, 27, 31,133, 65,184, 18,184,209,123,
+127,149,136, 92,255, 40,224,123, 99, 4,223, 71,219,175,107,188,247,175,125, 2,143,247, 76,199,250,129,179,108,243,241,182,251,
+ 90, 63, 15, 47, 96, 29, 92, 13,188, 48,254,186, 6,252,151,206, 29,117,214, 89,103, 95,116,160,238,111,252,198, 62,110,242, 46,
+ 70,254,141, 88,153,225, 75,235,119,118,250, 84, 37,136, 71, 18,200,190,245, 39,208, 95,241, 13,205,103,182, 38, 51,126,255,175,
+238,225,247, 63,113, 15,235, 59, 19, 18, 45, 60,247,226, 85,190,249,234,103,242,226,103, 92, 4,128,190,236, 37, 72,186, 64,249,
+161,183, 67,106, 8, 74,122, 96, 82, 86, 36,230, 95,250, 15,254,243, 95,150, 87,255,204, 93,143, 91,144, 18, 0,239,154, 61, 25,
+225,249,110,227,154, 8,112,109, 59, 26,183, 85, 7, 9,237,108,246, 74,230, 74,251,163,103, 9, 54,222,211,202,172,111,142,219,
+173, 1,177,189,223,215,121,239,143, 61, 66,253,251, 39,207, 0,232,237,109,213,251,118,213, 25,142,227,137, 58,222,149, 61,128,
+190,209,218,191, 43,159,192,123,231,146,214,207, 23,210,102,249,154,214,207,255, 77, 68,186,145,200,157,117,214,217, 23, 23,168,
+251,119,191,242, 89,204,118,222, 79,165,158,137,103,130, 29,123,202, 25, 56, 7, 70, 35,213,136,228,229,255,203, 46, 64,255,243,
+ 59, 31,228,135,126,237, 79, 56,118,106,155, 60, 75, 72,140, 66,121,248,196,231,214,121,239,159,253, 13,223,116,245, 51,248, 87,
+215,252, 29,250, 89,130, 58,244, 28,204, 87, 92, 75,245,151,191, 4, 11,135,106,133,189,195, 11, 84,250, 63, 2,223,240, 56, 2,
+250,141,123, 64,227,166,243,220,198,149,113, 27,181, 29, 3,174, 23,145,189,193,193,219,246,100,183,245,119, 95,253, 40,155,191,
+161, 5,192,215,239,165,176,227,119,191,167, 5,158, 55,120,239,119, 81,221,145,114,191,110, 15,248, 94,187,167,142,222,222,183,
+ 35, 79,210,241,222,208,218,222, 91, 68,228,230, 51, 92,171, 39,194,190,173,245,243,199, 46,224,243,237, 26,254,159,196,125,223,
+ 79,168,179,191, 62,174,181, 69, 66,173,253,179, 4, 65,221, 47,117,163,120, 59,235,172,179, 39, 4,212,253,207,189,226,239, 49,
+241,191, 65,133, 65,217, 49, 85, 1,182,138,138,118, 1,111,145,253,151, 97, 94,250, 93,205,103,238,124,104,131,239,250,185,223,
+231,196,164,162, 63,232, 81,106, 77,146,104, 82, 45,104,159, 34,182,226,125,127,113, 23, 90, 41,126,252, 13,175, 10, 25,251, 51,
+ 95,141,189,227,247,192,238, 64, 50, 12,192,110,109,133,150, 35,254,143,223,124,145,188,242, 29, 15, 94, 0,104,223,240, 40,127,
+ 62,114, 6, 0, 59, 19, 56,157,205,110,220,147, 93, 94,253, 72,117,105, 17,185, 37,210,219,117, 70,122,149,247,254,186,179,212,
+195,111, 17,145,107, 31, 97,123,199,188,247,111,137,219,171,179,221, 35, 49, 8,216, 11,150, 53, 96,158,177, 15,191,181,111, 31,
+123, 18,143,247,216, 35,109,239,137,152, 29,224,189, 31, 2,111,110,189,244,155, 23,176,153, 47,111,253,252, 73,239,253,183, 16,
+ 90,217,246,239,121,223, 69,241,191, 87, 0, 63,226,189,127, 55,240,191,119,153,125,103,157,117,246,184,128,186,191,241,170,132,
+105,239,199,153,249, 31,166,146, 25,186,154, 97, 3,213, 78, 82,203,221, 4, 95, 22,152,103,191, 18, 25,206,125,214, 91,126,237,
+195,220,121,255,105, 88, 26,114,122,167, 2,177,104,129,190, 22,246, 15, 12, 43, 61,195,210,210,144,223,248,200,157,188,234,121,
+ 79,231,200, 11,174, 0,109,208, 87,190,146,234,175,126, 5, 6,139,224, 29, 40,113, 36, 58,165,116,223, 2,188,251, 2, 14,227,
+ 92,167,203,221, 68, 16,106,157, 23,160,199, 26,112, 59, 48,120,203,217,192, 71, 68,142,122,239,111,106,129,237,145,179,176, 3,
+215,159,101,123,183,120,239,143,178,155,234,174,247,239,154, 61, 44,196,219, 30,109,255, 90,251,118,221,147,116,188,111,123,146,
+ 7,255,252, 28,115,250,253,179,192,175, 93,192, 54, 86,247,100,237,239,230,236, 45,166, 26,248, 62,224,133,222,251, 35, 34, 50,
+237, 92, 88,103,157,117,214,182, 47,232,121,234,254,157, 47,187,148,237,228,195, 76,237, 15, 83,250, 49, 98, 45,182, 12,174,199,
+ 8,104, 17,140,136,104,133, 24, 65, 93,252, 21,205,103,239,126,120,147,223,253,171,251,160,223,155,247,166,107,141, 69,177, 61,
+179,220,125,114,204,177, 19, 99, 74, 47, 56,173,185,245, 83,247,206, 1, 96,255, 51,241,147, 45,160,138, 20,188,135,202,129,227,
+165,143,243,249,186, 38,102,145,231, 75,241,182, 1,110,227, 60,230,199,223,178,231,187, 31,201,142,158, 35, 45,123,244, 17,246,
+233,200, 30,128, 61,151,253,187,249, 73, 58,222, 99, 79,230,252,125,239,253, 63, 7,106,186,201, 3,215,237,109,143, 59, 71, 91,
+110,253,252,142, 22,160,223, 10,124, 11,225,105, 9,105,252,247, 91, 8, 19,231,106,123, 57,240,179,157,251,234,172,179,206, 30,
+179, 76,221,191,235,171, 94,206,216,222, 74,169, 18,140,140,209, 46,100,205, 30,161, 18,193,136, 71, 75,156, 14,103, 17,147,162,
+ 86,158,214,124,254,158,147, 91, 76,198, 37, 44,102, 52, 35,232,234,241, 24, 74,129,247,108,238,148,148, 69,197,165, 75,134,237,
+233,188, 99, 77, 22, 14,133,164,101, 54,130,222, 66,152, 63, 91, 86, 96,120,129,247,111, 85, 34,111,117,231,121, 56,111,121,148,
+191, 93, 25, 65,234, 74, 2, 53,220,168,191,207, 35, 91, 60,242, 8,192,202, 57,100,215,187, 50,224, 71, 16,144,157, 43,115,112,
+236, 81,142,241,188,182,181,119,223,158,192,227, 61,250,100,221, 44,222,251,255, 25,120,123,235,165,127, 43, 34,127,248, 24, 4,
+212,189,214,246,254,245,158,247,157, 0,254, 59, 97,114,221,191, 5,254, 85,124,253,159,120,239,223, 33, 34,127,221,185,177,206,
+ 58,235,236,130, 65,221,191,231, 26,205,189,119,255, 0,219,213, 79, 97,165, 32, 99,138,114,130,245,158,210, 9, 90, 82, 18, 54,
+176,126,128,209, 33,107,119, 49, 13,241,243,135,172, 29, 92,234,163,211, 4,235, 0, 47, 97,206,187,143,201,143,143,175,105,197,
+104, 92,114,239,116, 74,246,130,214,174,122, 11,190,132,106, 10,106, 17,188, 21,176, 30,235, 47,230,119,215, 18,224,188,234,141,
+231, 50, 9, 45,214,221,111,136,192, 94,183, 84, 93,125,142, 95,209,110, 51,187, 50, 78, 98,187, 16,123, 36,134,224, 11,165,162,
+ 47, 8,132,227,123,175,122,130,143,247, 73, 1,117,239,253, 63, 4,126,165,149, 81,223, 40, 34,111,253, 2, 54,185,205,110, 10,
+254, 3,103, 0,244,189,235,244,199,188,247, 95, 29,175,151, 34,136,234,126,176,115, 99,157,117,214,217, 5,129,186,191,241,170,
+ 37,238,249,236,123, 41,228, 8, 34, 19,122, 26, 20, 66,233, 60, 51,107, 72, 85, 74, 38,223, 13,254, 74, 44,111,193, 51, 69, 5,
+250,157,178,196,157,186, 11,117,217, 75, 0,120,238, 37,251,120,217,179, 14,242,167,183,159, 12,243,224,189,132,217,239, 62, 4,
+ 1, 0,184,144,233, 79,215, 71, 60,235,240,220,191,251,173, 7, 96,182, 5,197,216,199,136, 0, 28, 30, 5,244,182, 31,151, 17,
+152, 34,242,182,152, 69,214,245,247,115, 17,175,157, 9,156,206,231, 89,238, 79,134,109, 60, 6,239,125, 42, 29,239,185, 0,250,
+183, 19,250,200,117,124,233, 87,129,239,253, 2, 55,187, 23,212,223,121,142,159,123,103, 43, 8,123,117,231,194, 58,235,172,179,
+ 11, 2,117,255,246,151,190,128, 53,251, 91, 84,114, 25,137, 30,147,171, 0,158,133,243, 20, 54, 39,151, 41, 61,249,102,249,223,
+ 62,242,251,254,237, 87,255, 56, 78, 4, 65,130,242, 93,192, 40,252,195,115,166, 80, 41,225, 71,191,245,106,190,254,182,223,134,
+105, 9, 89, 26,222, 71, 4,117, 71,160,243,119,198,188,232,203, 47,225, 59,191,246,121,205,103,221,137,219,241,190, 4, 91,132,
+ 55,122, 15, 56, 5,242, 32,175,186,188,120,188, 78, 86, 4,246,182,168,238, 26,206,179,181,141, 64,129, 95,104, 91,210, 83,241,
+169,112, 79,233,227,245,222,127, 7,240,203, 45, 64,127, 31,240,143,219,207, 98,191, 64,187, 31,120,122,235,247, 63, 63,199,207,
+181,223,247,180,206,133,117,214, 89,103,231, 5,234, 30,132,159,126,209, 27,153,218, 95,192, 73, 69, 79,143,201,148,224,189,103,
+ 98, 61,206, 15, 24,234, 59,232,201, 55,201, 63,251,139,248, 32, 10,185, 11,241,224,241, 40, 17,148, 64,222,199,222,243, 33,204,
+198, 61,200,202,229, 0,188,238, 69,151,115,211,247,188,154, 55,255,167, 63, 97,188, 57,131, 60, 11,207, 94,247, 30,138, 18,198,
+ 19, 94,252,156, 67,188,247,135,190,129, 65,158,132, 77,151, 19,236,109,239, 67,210, 44,204,130,247, 14,156, 11, 89,186,241,127,
+121, 1,245,244,243,181, 91, 90,153,210,145, 11,248,252, 77, 95,234, 15,122,249, 82, 57, 94,239,253, 27,129, 95, 96, 94,255,254,
+109,224,219, 69,196, 62, 6,155,255,107,130,224,173,182,205,115,252, 92,251,125, 75,157, 11,235,172,179,206,218,118,118,245,251,
+219,175,190,142, 82,253, 34,168, 41, 11, 73, 73, 79, 11, 30,207,200,130,146, 1,125,253,235, 28,144,151,206, 1, 29,200,249, 52,
+ 42,148,185,129, 0,212,198, 64,181, 67,249,161,159,217,181,249,239,254,186,231,241,103, 63,241,122,222,252,141, 95,201, 21,171,
+ 25,185, 47, 25, 42,203,215, 60,107, 63, 63,251,189,175,225,143,255,221, 53, 92,113,104,238,187,170,143,254, 34,126,243, 30, 72,
+ 50,144, 16, 57, 80,197,126,120,241, 71,191, 72,207,243, 35,169,206,159,234,251,119,228, 41,122,188,231, 2,232,223, 67,232, 27,
+175,239,145,223, 5, 94, 47, 34,143,213, 51, 6,246, 62,131,125,249, 28, 63,183,124, 1,129, 64,103,157,117,214,101,234,224,111,
+188,170,207, 9,251,239,113, 82,176,168, 33, 17,161,244,158,113,169, 73, 85, 70,162,126,138,188,252, 81,249,142,163,187, 29,157,
+113,159, 70,212,231,176,238, 48,222,219, 60,213, 83, 4,200,134, 76,239,251,227,188,250,240, 59, 48, 47,159,207,238,120,254,211,
+247,243, 51,111,124, 37, 63,241,157, 21, 15,173,143, 72, 19,195,197,171,131,207,219, 31,123,219,111, 82,125,242,191, 64,222,143,
+ 33,137, 14, 2, 61,235, 4, 95,150, 40,255,219, 79,192, 57,187,144,250,112, 91, 80,118,196,123,191,242, 36,247, 89,239,181, 99,
+173,253, 59,167,167,207,197, 94,244,167,234,241,158,237,216,190,159,208,102, 86,219, 31, 0,223,246, 24, 15,124,249, 45,224,231,
+153, 11,239,190, 58,190,118, 54,251,234,214,207,247,118, 46,172,179,206, 58, 59,247, 76,125,194,126, 60, 43, 32, 21,206,123,198,
+214, 51,174, 82, 82, 17, 22,184, 86,190,255,207,111,144,235,143,126, 94,230, 34,215, 31, 29,147,201,187, 16,159, 48,181, 62,146,
+248,130, 82, 34,253, 5,236, 39,255,111,202, 91,126, 20, 63, 62,181,235,115,121, 98,184,252,208,210,231, 3,122, 57,193,254,197,
+207, 83,253,201,191, 67,178, 20,209, 58, 60,194, 61,201,160, 44,193,185, 4,236,251,229,181, 55,221,247, 56, 59,251,189,162,175,
+115,101, 6,246,182,137, 93,247, 69,182, 14,218,251,183, 18,199,182, 94,104,150,254, 84, 56,222, 71,187,198, 63,180, 7,208, 63,
+ 0,124,203, 99, 61,232, 69, 68,142, 3, 31,106,189,244,166,115,252,104,251,125,183,118, 46,172,179,206, 58, 59,119, 80,191,120,
+242, 16, 61,125, 15,137,244, 25,149,125,156,235,211,151,109, 22,244, 43,229,250,143,220,252,232, 28, 64,250,139,104, 78, 51,171,
+ 12,165, 11,253,234,154, 48, 50,118,176,128,251,236,239, 82,188,239,187,176,159,126, 31,126,235,248,153, 29,236,232, 36,238,179,
+183, 80,252,183, 55, 82,253,229, 47, 64,158,131, 54, 97,216,140, 8, 72, 34, 76, 74, 65,123,240,205, 99, 48, 31, 47,103, 95, 63,
+ 52,165,109, 55,159,163, 3,191,153,221, 98,177, 27,206,146,233, 62,209,118, 51,187, 69,105, 55,156,195,185,184,225, 41,124,188,
+143,116, 92,255,130,221,207, 69,127, 92, 0,189,101, 63,222, 14,146,188,247,255,230, 44,251,247,111,128,175,139,191, 90,224, 63,
+117, 46,172,179,206, 58,219, 5,189,143, 10, 70,215,222, 86,248, 27, 95,241, 42,166,229, 15,224,212, 37,164,234,163,244,146, 95,
+146, 55,254,201, 89,159, 74, 37,223,251,161, 13,255,243, 95,253,221,204,220,123,216,169, 42,140, 2,173, 37,164,216, 64,127, 17,
+170,211,148, 31,250,247, 72, 58, 68,246, 61, 7,181,250, 12, 48, 57,184, 18,183,121, 31,254,228,167, 97,186, 9, 73, 2,131,150,
+ 38,168, 22,187, 23,202,147,145,226,171,159,144,111,250,149,219, 31,199,236,252, 8,159,255,124,241, 13,206, 79,249,126, 61,187,
+103,175,127, 32, 62,102,244,150,115,248,254,107, 34, 88, 62, 46,130, 51, 17,217,240,222,191,141,121,187,222, 17,239,253,141,103,
+122, 68,107, 4,244,115,121,236,233, 23,237,241, 62,194,247,254,107,224,173,103, 0,244,201, 23,176, 77,223, 58,199,114,134,243,
+254, 7,222,251,223, 36, 76,140, 3,248, 49,239,253,215, 16,218,214,254,140, 80, 51, 95, 38, 80,238,111,218,195,142,252,172,136,
+220,217,185,176,206, 58,235,236,156, 65, 29, 64,174,255,208,125,236,126,120,197,185,219,247,254,217,123,249,217,151,189,131,202,
+191,153,173, 98,194, 66, 42,104,130,168, 13, 15, 73,130, 36, 9,120,135, 95,251, 4,213,137,163,212, 99,229, 68, 25, 48, 41, 12,
+246, 60,170,218, 3,133,197,187, 30, 40,157, 65,245, 65, 38,147,183,126,129, 14,221, 95,192,199,174, 63,159, 58,113,156,150,118,
+ 61,243, 39,151,213, 64,119, 11,129,174,110, 83,249, 53,205,127,132,121,109,250, 45,143,243, 90,184,137,221,143, 65,189, 46,210,
+240, 55,181,246,237, 8,129, 74, 95,137,153,248, 6,143, 80,131,127, 10, 28,239, 94,219,187,134, 94, 11,140,207, 99,105, 60, 75,
+ 68, 46,228,209,191,223, 73,120, 2,219,139, 91,231,248,108,229,143, 63, 0,126,232, 66,215,242, 35,189,231, 76,129, 71,103,157,
+117,246, 37, 6,234, 95, 80, 6, 8,222, 39,213, 15,163,146,131, 20,254, 13,108, 21, 83,159,107, 36,215,129,134,175, 93,136, 40,
+ 72,243, 71,127,154,133, 7,156,135,153,197,109, 21,244, 46, 58, 4,218, 30,165, 50,223, 38,215,222, 92, 60,129,231,236,104, 4,
+244,243, 86,218,139,200, 77,173, 1, 54, 43,231,225,196, 31,119,139,217,250,181, 49, 67,189,178, 5,182,103,122,216,205, 6,112,
+ 45,103,121, 16,206, 23,243,241,126,177,152,136,108,199,224,233,157,192,119,156,229,237,101,124,223, 91, 68,164,234,206, 94,103,
+157,117,182,215,212,227,253, 5,114,253,209,146, 19,249, 63, 34,145,159, 66,200,147,173, 18,119,186,132,169,131,138, 70, 67, 39,
+114,134,255,226,255,176, 64,225,240, 91, 21,178, 49,163,183,178, 12,253,252,215, 97,235,213,242,173,191,252, 68,180,245,220, 18,
+ 51,214,107, 69,228,234, 11, 1,244, 54,208, 17,198,203,222,196,185, 13, 87,185,153, 64,101, 63,238, 15, 49,137, 15,133,185,250,
+ 44,223,117, 11,225,177,167, 71,159,234,199,251, 69, 4,236, 27, 34,242,157,192, 87, 69,208,254, 20,176, 22, 65,252, 4,240,167,
+192,255, 17,217,128, 31,236, 0,189,179,206, 58,123,148,100,250,137, 51,255,127,125,205,107,238, 61, 49,190,245,233, 43, 25,213,
+204, 83, 25,129, 92, 35, 70,133,204, 93,181,118,199,123,176,224, 43, 7, 83,139, 46, 29, 73, 34,108, 89, 88,124,250, 69,111,224,
+175, 95,248,255,201, 91, 31,247, 65, 51,143,255, 57, 9, 89,218, 94, 10,251, 24,225,233,102,183, 60,137,251, 85,211,225,237,103,
+162,223,114,142, 79,131,123,202, 29,111,103,157,117,214, 89, 7,234, 23,226,212,223,249,178, 69,114,249,135, 76,252,191,192,249,
+203,195,104, 88,239, 81,202,161,152,131,180, 67,225,156, 34, 36,242,160,213, 73, 12,239,160,151,255,103,249, 39,127,244, 80,119,
+233, 58,235,172,179,206, 58,235,236, 73, 6,245, 6,220,223,255,186,140,207,109, 62,155,210,189, 30,228,229, 88,127, 17,206, 45,
+227, 73, 65, 74,140,156, 70,203,195, 56,255, 87,164,242, 95,169,242, 79,203,247,253,209, 78,119,201, 58,235,172,179,206, 58,235,
+236,139, 12,212, 63, 15,228, 63,248, 42,195, 61, 24,244,186, 38, 31, 56, 54,138,234, 76,131,109, 58,235,172,179,206, 58,235,172,
+179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206,
+ 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,
+172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,139, 38,111,191,238,245,222, 36,
+ 6, 17, 1,239,177,206,147,101, 41, 74, 4,147, 24,172,117,100, 89,138,136, 48,155, 21, 40,165,240,222, 81, 76, 11,172,117,224,
+ 61,101, 89, 98, 43,139, 7, 68,132,170, 40, 80, 90, 35, 34,164, 89,138, 49, 9,251, 15, 29, 64, 27,195,104,235, 52,219, 91, 59,
+148,101,133, 82, 66, 81, 84, 40,165,209, 90,112, 14,242,193, 2,139, 75,139,244, 7, 25,101, 49, 99,235,244, 22, 85, 81, 97,210,
+ 4, 17, 33, 73, 52,222, 67, 89,150,120,231, 41,171, 10,103, 29,218, 36,228,189, 28, 81, 10, 17,161, 44, 43,138, 89,217, 60,241,
+ 77, 27,131,247,158, 98, 86,197,239,242, 88,235,176,214,209, 31,228, 36,105,130, 82, 66, 85, 88,172,173, 40,102, 5,206,121,146,
+ 36,193,123,135, 82, 10,147, 36,104,163, 72,211,140, 94, 63, 69, 41, 69,154,165, 12,134, 57, 74,107,140,209,100,121,134,136,167,
+ 42, 45,182, 42,217,218, 28,177,177,182, 69, 85, 57,188,119,128,167, 42, 43,148, 82, 32, 96, 43,135,210,130,224,113,206,225, 28,
+ 40,173, 1, 88, 90, 93, 33, 77, 83, 78,175,175,161,180, 33,239,247, 88,123,248, 33,202,178,162,126, 34,182,136, 71,107,131,247,
+ 14, 17,193, 24,133,247, 96, 18,131,115,142,170, 12,199,235,189,199, 86,142,162, 40,177,214, 81, 22,225,220, 40,109, 48, 70, 49,
+155,206, 40,203, 2, 17, 72,179, 12, 91,121, 76,162,153, 78, 42, 94,242,138,151,114,223,177,251,240,174,100, 58,153,177,176,188,
+200,131,247,221, 71,175,151,147,247,123, 0, 20, 69,137,214, 97, 64,225,108, 50, 97,180,179, 67, 85, 89,190,226,170,171,185,239,
+174,187, 88,221,191, 2,162,184,237, 83,119,146,247,122, 88,235, 24,109,111, 50, 43, 42,178, 52, 35, 73, 83,188, 87,164, 89,194,
+120,103,135,157,157, 45,202,114,198,171,255,222,235,184,245,119,126, 27,235,194,241, 93,114,233,165, 60,253,138,167,145,229, 25,
+ 85, 89,114,226,161,147, 60,112,252, 65,202,162,192,186,112,237,156,181, 56,103, 89, 88, 60,200,161,139, 46,226,115,119,223,193,
+100,178,131,224, 17,132,231, 62,255,165,140,182, 78,241,224,253,119,179,239,224, 37, 92,250,180, 75,185,228,138, 43,168,138,146,
+187, 63,115, 7, 15,221,119, 7, 87,191,226,235, 56,117,114,141, 83, 15,220,203,129,139,175, 96,115,237, 97, 38, 91, 15,162, 84,
+ 56,151,120, 7,222,225,177,241,209, 5, 10,188, 67, 36, 92, 19, 17, 65,148,230,210, 47,123, 5, 27, 15,220,193,108,188,206, 11,
+ 95,249,141, 96,134, 60,112,236, 51,172, 29,191,157, 23,188,252, 8, 58, 25,112,199,199, 63,204,246,233,181,120,221,114,150, 87,
+ 87, 73,210, 20,147, 24, 60, 30, 91,121,188,247,244,134,203,160, 50,238,250,212,135, 41,139, 49,206, 78, 17,226,190, 64, 60, 62,
+143, 8, 40,165, 73,178, 37, 22, 14, 62,143,201,169, 79,225,189, 69, 41, 65, 43, 5,184,248, 62, 3, 34, 40,165,113,241,252,106,
+229,240,174, 2, 28, 72, 6,122, 9, 17,135,216, 83, 8, 21, 34, 26, 68, 35, 42, 69,233,112, 47,122,239,241,104,130, 11,177,120,
+231,176,182, 8,127, 3,156,243,104,147,211, 27,174,144,102, 57,158,176,127,147,105,193,108, 50,101, 50,222,164, 44, 11,156,115,
+120, 52, 94,194,218,141, 11, 28,239,108, 56,231,241,105,142,222,251,248, 93, 62, 30, 79,248, 93,240, 40, 37,205,207, 32, 40, 21,
+238,123,173, 21, 90, 9,222, 91,164, 57,126, 1,194, 78, 42,109,208, 58, 65, 68, 97, 76, 26,183, 25,182,225,124, 60,183, 18,238,
+ 95,239,226,121, 86,225,115,225,154,179,107,223,136, 62,195,227,113,182,194,123,139,179, 22, 31,191,215, 57, 11, 8,214,133,123,
+ 57, 28,174,224,227,126, 55, 79,188,143,143,184,247, 46,248,143,224,139,192,199, 99, 83,218,128, 15,107, 45,156,111,143,136, 2,
+234,107, 26, 30,159,225, 92,120, 93,107,131,179, 21, 74, 25, 36,110, 62, 28,143, 67,107,141, 45,103, 97,141,187, 18,163, 21, 96,
+209, 90, 35,128, 82, 30,188,141,254,202, 69,204,136,255, 66,196, 6, 31,190, 75, 9, 62, 60,215, 35,172, 51,194, 51,186,240,196,
+107,171,112,206, 34, 74,225,157,199,121,135,243,210,236,171,247,225, 73,219,206,131,143,127,115,206,134,223,145,224, 43,189,196,
+ 53,163,112, 94, 16,209,225,111, 62,252,231, 81, 32, 26, 36, 1, 20,196,115, 84, 89, 11,162, 16, 73,240,120,170,202,198,245, 68,
+ 92,155, 42,158,127, 1, 28,222,131, 82,130,138, 15, 28,243,184,230, 56,172, 45, 27, 63,236, 93,240, 59,205,121,245, 14,188,109,
+214,167,119, 54,248, 12, 31,222, 67,196, 3,239,125,248, 93,234,147, 20,205, 55,255, 23,215,126,251,245,250,213,221, 63, 8,160,
+180,209,241, 36,122,172,245, 24,173,113,214, 99, 93, 0, 60,128,170,178, 84,165, 69,226, 98,243, 14,146, 52, 9, 78,199,123,140,
+209, 36,169, 33, 49, 26,173, 2,144,215, 55,146,173,108,115, 48, 90,107, 76,154,226,156, 67,137, 32,162, 72, 18, 19, 22,172,243,
+104, 5,174, 28,179,126,234, 20,227,209, 20,147,164, 28,186,232, 16,139, 43,139,164,105, 18,222,235,195,129,167,105, 0,216, 0,
+ 36,225,187, 2,112, 89,128,230, 95,173, 53, 89,150, 53,159, 55, 70,199, 27, 47, 0,160, 49, 26,165, 20,206,186,112,220,214, 98,
+173, 67,233, 26,160,131, 35, 81, 74,145,166, 9,198, 24,146, 84,211,235,247, 88, 92, 26, 50, 24,246, 48,198,160, 36, 44, 6,165,
+192,217,112,177, 70, 59, 83, 54,215,183,176,214, 81, 85,101,235,230,244,225,198, 16,193,249, 16, 92, 20, 69, 25,157,159,161, 44,
+ 74,156,179,140,118, 70,152, 36,220,184,163,157, 29,108,229,232, 13, 23,154,155,222, 86, 22, 99, 12,218,104, 76, 18,175, 7, 10,
+ 81, 10,231, 28,179,105, 65,146,104,108,229, 40,203,138,233,116,198,120, 60,102, 50,153,134,235,150,152,112,243, 33, 40, 29,110,
+174,170,172,152,140,103, 88,107,153,140,103,193, 73,227,169,202,146, 36,203, 80, 74, 72,146,148,229,213,101,108,116, 52, 85, 21,
+174,167, 82,130, 45, 43,180, 86,205,162, 61,249,240, 26, 73,154, 98,157, 67,107, 69,158,103,209,113, 26,148, 40,210,196,160,148,
+194, 90, 27,207, 69,248,215, 57, 63, 7,208,104,198, 36, 44, 46, 45,144,164,225, 51,179, 89,193,104,103,132, 86,154,188,151,147,
+166, 41, 90,233, 38,192,233,245, 7,128,167, 44,103,120,231,234,187,134,125, 7,246,177,177,118, 18,165, 12,121,158,147,247,122,
+136,132,243,182,254,240,253, 44, 44,237,167,183,176,200,137,251,143, 49, 88, 88,194,122,176,229, 52, 56, 2, 20, 74,169,230,253,
+120,162,147,118, 1,128, 34, 72,120,239, 89,220,119, 5,182,156, 49, 29,157,228,203, 94,252, 42,210,172,199,104,107,155, 83,247,
+125,138,149,253,151,208, 95, 88,229,196,253,247,178,181,254, 32,196,251,101,176,176, 64,214,203, 26,112,114, 54,120,194,172,183,
+136,201,134,220,125,219, 71,130, 99, 85, 26,165,146,230,220,204,215,159,198,152,140, 44, 95, 96,233,208,115, 81,213, 58, 73,214,
+ 39, 73,251, 1,172,234, 71, 26,171,250, 56,194,218,214, 74,161,181,154,251, 12, 73,144,100, 9,165, 5,229,183,193, 77,119,221,
+ 11, 34,126,238,128, 68, 53,206,169,118,112, 53, 96,138, 40, 4,135,179, 5,197,108, 28,215,143,137,251,170, 80, 70,163,148,158,
+123,170, 8,136, 18,144, 25,226,189, 26, 2, 21,105,112, 78, 68,208, 90,163,180, 66,226,235, 74,235,230,103, 81, 58, 0,158, 72,
+ 56, 46,145,176, 46, 98, 64, 81,175, 5,169, 3, 7, 31,128, 5, 81, 32, 62,252, 71, 29,192, 5,144, 18, 9, 62,166, 70,241,240,
+187,155,127,222,218, 38,184,210,198, 68, 71, 27,142, 37, 4, 74,190, 73,138,234,115, 95, 39, 83,193, 31,250, 93,143,161,174,145,
+ 80, 90,248, 46, 82,131,128,195,251, 10,103, 11,194,179,169, 29, 80,131, 69, 12,236,132, 38,248, 17, 9,231,199, 55, 64, 31,207,
+107,235,124, 58, 91, 54,201,152,138,231, 91,199,223, 67,128, 67, 56,191,113,159,194,182,104, 2, 13, 36,252, 93,105,133, 18, 21,
+175,153, 10,215,168, 14,160, 36,156,117, 81, 58, 6, 34, 49, 32, 65,135,251,169, 62,131,162, 98, 64,232,162, 63,176,115,160,175,
+ 65, 63,222,211, 62, 62,190, 27, 81, 13,232,123, 31,130, 49,235,194,253,227,145, 24,251, 10,160,168,170, 24,124,196,245,172,148,
+158,195,167,196,251, 59, 6,199, 90, 43,180, 14,127,247, 4,255, 46, 66, 19, 8,135,251,191, 62, 63,170, 57, 14,145,122,109, 69,
+128,111,225,113, 8,132,227, 45, 36, 18,127,158,191, 86,239,117,253,183,112,127,213,239, 9,107,160,249, 57,254,141,120, 75, 42,
+ 16,146, 52,193,123, 2, 48,226,241,222, 97,173,165,170,108, 4,123, 75, 89, 85,232, 8,218,245, 13,105, 98,118,170,181, 38, 73,
+ 18,210, 44, 0,139, 54,134, 36, 73,154,136, 21,160, 42, 75,170,178,100, 48, 28,176,184,188,136,210,170, 57,129,117,134, 39, 34,
+ 84,149,197,150, 5,235, 39, 79,176,126,106,131,233,180, 98,117,255,126, 86,246,173,146, 70,198, 64,148,132,108,204, 90,240,144,
+ 36, 9, 85, 85, 81,149,182, 1,187,144, 89, 7, 16,215, 38, 44, 44, 99,194,239,243,136, 63, 28,115,146,104,148,146, 24, 57, 6,
+112,202,210, 0,212,206,185,176,157,196,160,180, 34, 77, 83, 86, 86, 23,227,118, 53,105,150, 96,173,107,246,171,152, 85, 84,149,
+101, 58, 41, 40,139,200, 96,196,133,232,156,195, 58, 23, 89, 7,197,120, 60,139,129, 79, 21,111, 52, 69, 81,148,136, 10, 17,117,
+ 57, 43,216,218,220,166, 63,236,131,247,108,174,175,211, 31, 12, 73,146, 20,173, 21, 89,158,133, 27, 68,194, 53, 20, 21,174,133,
+179, 33, 67, 79, 82, 19,162, 80,173,176,149, 99, 54,155, 49, 25, 79, 3, 83, 16,207, 63, 30,202,162,106, 22,229,108, 86, 50, 25,
+143,153, 76, 38,205,113,149,179, 50, 6, 64,134,193, 66, 31,109, 20,131,133, 33, 74, 96,180, 61,106, 28,155,173, 28, 85, 85, 49,
+157,204, 40,138,146,201,120,194,198,169,117,250,131, 62,179, 73,129, 73, 12,105,150,160, 84, 56,239, 53,152, 7,144, 15,153, 69,
+ 85, 89,242, 44,195,196, 32, 3, 31,110, 20, 37,225,220, 15, 6,125,180, 54, 8,158,241,104, 18,217, 35, 1, 15, 70, 71,128,240,
+ 30, 91, 85,164,105, 74, 85,149, 56,107,227, 77,104, 81,162, 81, 90, 51, 25,111,163, 77,130, 49,154,254,112, 72,222,239,115,234,
+193, 7, 41,102, 99, 46,127,214,115,121,232,254,227,204, 38, 59, 36,105,143,178, 40,169,170, 41, 34, 10,231, 3, 80, 37,105, 30,
+178,157,232,232,165,229,128, 61,158, 36,233,177,124,232,114, 78,221,127, 27,151, 63,247,101, 44,174,172,176,189, 93,240,192,157,
+ 71, 1,207, 37,207,120, 14,224,121,224,179,159,136, 32, 8,253,225, 34,121,158, 7, 96, 78, 18,170,202,197,215,151,201,135,203,
+220,115,251,199,230,206, 53,130, 74, 56,119, 25, 73, 58, 36,203,151, 24, 44, 30,100, 97,229, 98, 22, 15, 92,201,210,190,125,104,
+147,144, 13,246, 49, 88, 58, 64,111,184,143,222,112,149,124,184, 74,154, 45, 96,146, 28, 99,146,224,156,149,224,157, 11, 25,137,
+ 40,148, 89, 64, 41,131,102, 10,110,212,164, 8, 1,132,234, 71, 39,198, 87,157,111, 64, 40, 56,175,112, 78, 66,176, 92, 65,157,
+153,198,172,197, 89,135, 7,180, 49, 40,165,227,218,167, 1, 56, 23, 25,143, 6, 76,149, 52,204,199,220,111, 4, 63, 20,182, 27,
+153,146,232,213, 84,235, 17,206, 77, 32,128,111, 28,174,111,101, 64,115, 71, 46, 17, 88,153,103,184, 34, 17,228,163,167, 21,105,
+152, 64,234, 76, 12, 31, 0, 91, 84,124,171,219, 21, 64,132, 68,200, 5,240,146, 16, 4,170,246, 62,248, 0, 28,210, 4,138,154,
+ 6, 61, 98,112, 66, 3,244,115,176,105,167,190,129, 29,169,226,126,249, 38,163,167, 1,220, 24,192, 69,164,145,232,195,235, 75,
+ 88, 7, 85, 74,155,248, 62,143,104, 19, 89,131, 57,184,171, 38, 99, 87, 49,136,154, 95,103,239,133, 26,145, 68, 4, 79, 88, 75,
+ 77,192, 23,143,165, 14,182, 66, 16,172, 64, 84, 8,173, 36,128,174,117, 33,209, 9,151, 50,114, 79, 94,199,123, 47, 70, 14, 17,
+176, 27, 22, 69,233,248, 62, 98, 6, 94, 3,116,100,106, 80,129,253,148, 58,243,247,225,120,148, 4, 6, 53, 6,166, 66, 96,139,
+235,184,205, 53,235, 79, 71,254, 36,220, 35,218, 24,230, 68,146,154,199,162,245,177,251, 57,208,214,247, 86,125,178,155,100, 60,
+ 6, 45, 53,147, 21, 64,186,195,206, 76, 7, 0, 0, 32, 0, 73, 68, 65, 84, 5,232, 17,224,235, 0,166,121,173,245, 30,118, 37,
+246,243,160, 90,137, 8, 11,139, 11, 44, 45, 47,198,104,205, 69, 10,161,190,201,117, 4,240,176, 40,172,117,209,137,133,157,204,
+251,189,221, 17, 60,160,149,132,140,216,249,102,193, 76,198, 19,132,176,192,250,131, 1,121, 47,143, 55,156,111,168,113,107, 45,
+ 73,162, 73,211,224,152,203,233,132,211,235,235,108,110,110,147,102, 57,171,251,247, 49, 92, 28,144,231,105, 3, 66,170, 1,225,
+ 4,239, 61,105, 22,162,243, 36, 53, 36, 17, 68,146, 52,105,178, 16,147,232, 38, 91, 15,191,155,184, 80,194, 5,170, 74, 27, 35,
+123,213,156,236,196,104,210, 44, 69,107,205,226,210,128, 52, 75, 73,179, 16,180,212, 89,173,247,176,179, 53, 10,217,240,206,148,
+237,211, 59,140,118, 38,113,251, 45,170, 15,193, 24, 67, 81, 84, 24,163,169,170, 0,168, 38, 73,176, 46, 48, 16,245, 62,149,101,
+201,198,218, 58,222, 43,134,139, 11, 20,179,130,233,100,202,210,234, 82,188, 97, 32,203, 83,178, 60,141,231,191, 14, 76, 2, 67,
+ 81,211,252,227,209,152,209,206,136,201,100,134, 8,100, 89, 18,168,191, 24,113,214,217,250,108, 86, 96,227,254,104, 37,104, 29,
+ 28,192,116, 58, 35,239,165, 40,165, 73,179,140,217,100,134, 73, 18,138,162,108,168,232,170, 44,155, 32, 48,252,235, 24,143, 71,
+156,222, 88,103,176,176,192,108, 58, 13,215,190,223,195, 90, 31, 89, 20, 5, 53, 99, 32, 66, 76,168,112,222,199,232, 62,236, 91,
+ 77,177, 46, 45, 46,134,136, 57, 6, 71,211,241,164,185,249,141, 49,209,225, 73,204, 86, 19,210, 52,141,212,109, 96,130, 20,144,
+245, 22,169,138, 25,120,200,178, 30,131, 97,159, 44, 31,224,189,231,196,241,123, 25, 12, 87, 88, 62,176,159,227,119,223,137, 82,
+ 9, 73,154, 51,155,140,241, 54,128, 85,160, 91,235,181,148, 97,146,180,137,196,219, 20,241,202,225, 47, 99,180,121,146, 3, 23,
+ 61,157, 75,159,241, 76, 30, 62,254, 48, 91,235, 15, 49,217,122,144,149,131,151,113,240,178,167,115,207,109,127,137,171,102, 8,
+208,235, 15,232,245,135, 36, 89,218,148, 98,188,115,244,134,203,244, 22, 86,249,220, 29, 31, 15,153,148, 82,104,147,160,117, 74,
+150, 15,233,245,150,201,251,203, 44,172, 28,102,105,255,101, 44,172, 94, 66,127,241, 32, 43,135,174,164, 26,111,144,102, 41,121,
+ 44,129,153, 36,139, 1, 64, 78,214, 95, 34,237, 45,146,100, 3,146, 52,139, 14, 48, 56, 31,157, 45,163, 76, 31, 45, 21,190,218,
+110,104, 66,162,147, 21, 21, 28, 82,200,234, 90, 89,182,119,141, 95, 8,217, 75,164,164,157,101,158,120,134,181, 30, 0, 46,128,
+ 69,160, 48,125,227,168, 84, 4,207, 58, 72, 8,142, 81, 53,215,178, 14, 32, 92,244, 79, 18, 65,180, 73,143,124, 43, 27,106, 74,
+ 34,210,162, 49,165,201,232,219,160,230,226, 53, 12, 89,183,139, 14,216,181,178, 56, 31, 0, 35, 6,118, 53,149,238,125,200,108,
+125,204, 18,109, 85, 6,226,214,187,120, 29, 3,229, 79, 3, 53,177, 68, 80,179, 61,141,123,151, 24,248,212, 37,132,176, 81, 31,
+ 51,249, 38,187,143,255, 83,210,226,180,227,127, 82,179, 1,174,138,193,108, 93, 98,136, 64, 95,151,106,164,197,110, 8, 40,157,
+ 52,199, 37, 49,115,141, 41, 48,222, 91,144,249,117, 9,247,165,106,125, 87,100, 10,124,213,176, 31,117, 16, 18,216,137, 36, 6,
+ 46,177,116, 35, 42,150,110, 66,182, 28, 63, 17, 83,219,240,187,173,193,204,215, 84,123, 67,174, 4, 70,197,215, 44,158,110,178,
+221,152, 26,199, 64, 99, 30, 12, 5,166,212, 70, 70, 82, 35, 42,248,215, 16,228, 69,198,197, 5,112, 79,146, 36, 38, 27, 14,163,
+ 13,222,205,207,127, 83,218,240, 49, 30,169,215,157,119, 45, 58,124,158, 48,214,126,213,123, 2, 3,236,108,120,182,184, 8,206,
+219, 22, 43, 86,255, 43,173, 12,188,117, 91,181,193,190,157,237,195, 60,179,111, 1,191, 26, 46, 12, 88, 94, 89,164,215,239,163,
+180, 66,199, 76, 54,100,187, 33, 35,174, 35, 60, 27, 51, 30, 99,116,164,181, 12,222, 65,154,134, 26,188,214,115,240, 51, 70, 99,
+ 18, 67,146,134,236,216, 89,139,173, 42,108, 89,146,230, 57,203,171,203,225,239,137,193,104,213,128,112,213,212,194,125,160,116,
+188, 99,186,179,205,198,250, 38,214,193,226,242, 50,105,150, 97,140,106,168,161, 64,157,133, 5,104,173, 39, 73,116,100, 0, 52,
+ 58,214,140, 27,186, 79,207,233,247, 58,234,175, 3, 4,231, 28, 89,150,196,155, 39,156,184, 36, 9, 81,180, 49,138,213,253, 75,
+244,135,189,230, 68, 59,231,201,123, 1, 80,203,162,164, 42, 43,198, 59, 19, 38,227, 41,179,105, 25,162, 57, 81, 49,250,171,107,
+ 77, 33,112,168,121,175,217,180, 68, 27, 19, 40,108, 21,162, 84,165,132,217,116, 26,153, 8,139,181, 37,189,193, 16,173, 21,219,
+155,155, 36,105,206,112,113,129, 94,191, 23, 74, 4, 77,116, 31, 46,115,205,146,104,163,217,217, 25, 51,157, 22,204,138,178, 97,
+ 47,172,181, 77,144, 83,150, 21,147,241,148,201, 56,208,171,225,102,114,120,132, 52, 77,201,243,140, 98, 54,101,184,184,128,247,
+ 22,173, 13, 85, 85,162,117, 66,150,101,120,103, 41,203,170,169,223,135,227, 12,212,191,119,142,217,100, 20,178,206, 50, 4, 0,
+ 89,150,161,117,200,204,147, 36,105,162, 87, 99,116,116, 85,225,247,196, 24,240,160, 99,157, 46, 73, 18, 22,151, 23, 72,211, 20,
+107, 45,211,241,148,217,172,192,123, 79,158,167, 49,160,148,150,147,139,245,249,209, 40,158,234,224,128,246,237, 63,200,230,218,
+ 26,120, 79,127, 48, 36,207,123, 44,239, 91,101,227,196, 9,118,182, 54,185,236, 25,207,230,212, 67, 39, 24,111,175,145,245,134,
+120, 81,216,114, 26, 28,157,214, 24,147,162, 77, 8,138,194, 58,207, 48, 38,105,130,170,160, 73, 88, 98,184,114, 16,113, 19,158,
+253,162,171,185,227,227, 71, 49,189,101, 78, 28,251, 24, 74, 25,174,252,202,151,176,189,113,138, 19,159,187, 19,240,244,135, 75,
+244,250, 11,228,189,140, 36,209, 32,129,189,201, 7,139,100,131, 85,238,185,237,163,120, 95, 6,118, 67, 20,105,154,135,236,189,
+191,204,112,229, 48, 75,251, 46,102,184,180,159,188,215, 39, 73, 12,249, 96, 5, 69, 1,222, 70,240,169,179, 74,139,146,232,248,
+ 9,247, 87, 8, 18, 76,115,158, 69,247, 16,221, 71,107,143, 43, 55,241,174,108,101, 8,174,185, 66, 66, 72, 0,172,173, 34,181,
+233, 26,176, 15,181,207, 80,191,110,192, 10,133, 73,178, 57,165, 29,247,201, 86,101, 4,133,144, 41,207,125,187,223, 69, 67,207,
+147,134,154,198,149, 38, 51,175, 51, 88, 98, 86,140, 82,145,181, 10, 76, 0, 77, 41, 64,106,191, 63,207,156, 34, 56,207, 19, 30,
+ 55,175, 40,196,213, 89,215, 73,125,235,187,130, 51, 15,201,141, 82,210,232,139,106,122,223,121, 7,206, 33,196,115, 32,106, 87,
+240,215, 80,249, 49,153, 16,116,195, 12,132,253,172,233,232,152,197, 74, 60,199,245,235, 17, 8,234, 42, 5, 77,253, 22, 16, 31,
+147,177,121, 96, 67, 4,210, 80, 50,242,243,224,168,198,211,150, 30, 65,105,141, 18,223,148,106, 2,192, 7,253, 72,205, 42, 52,
+ 1, 74,227, 71, 93,195, 54,212,231,215,123,135,214, 73, 96, 83,154,215,252,252, 56,163, 38,192,199,100,209,186,122,101,214, 58,
+143,121,169,195,123,105,232,247, 58, 67, 15,153,124,157,173,170,200, 90,234, 80,155,151,154, 82, 87,145,141,242, 77,153,108,174,
+177, 2, 37, 58, 18, 38,130,214,193, 31,133,242,171,106,216, 4,165, 2,173,175, 36, 4, 1,206,185, 72,193,135,128,192, 58, 27,
+180, 41, 17, 91,106,124,113,182,205,150,212, 76,205, 60,128,219,157,109,207,207, 77,139,196,137,199,203,156,122,247,187,107,234,
+ 53,184, 55,235, 0, 48,189, 65, 31,231, 96, 50,154, 4,154, 53,214,187, 68, 5, 26, 91, 18, 69, 85, 85, 49,123,164, 1, 60,145,
+144,105, 57,231,209, 89,168,205, 54,236,191,115,205,142, 6, 70, 45,220, 84, 59, 91,219, 44,174,104,242, 52, 37, 93, 92, 96, 54,
+ 9, 66, 56,165, 85,168, 35,123, 23,178, 53, 64,235, 36,128,143, 49,136,120,102,227, 17,107,101,193,226,242, 50,131,133, 69,210,
+ 44, 99, 99,109,157,201,104,210, 0,123, 40, 5,168, 72,159, 8,121, 47,141, 34, 50,143, 82,158,138, 16,125,155, 36,208,210,222,
+121,146,152, 37, 86,101, 96, 9,132, 80,131,155, 76,102, 36,137,161,215,207,201,251, 57,189,126,222,232, 8,170,178,138, 96, 47,
+ 56, 27,182, 49, 30, 77,168,202,138,178, 44,153,140, 2, 37, 44, 49,232, 48,137, 6,130, 70, 65, 16,108,172, 5,133, 26, 92, 88,
+ 96,182, 10,223,111,140, 97, 50,158,236, 10, 60, 78,175,111,114,224,240, 33,134,139, 11,140, 71,129,238,190,232,210,195, 60,252,
+224,137,168, 29, 8, 87,218,185,224,196,173,173,168,172,101, 54,157, 81, 85, 21,182,170, 34,149, 9,130,162, 44, 43,144, 34, 44,
+250,186,142,237, 28,214,121,242, 94, 22,106,212,253,156, 44, 15,231,111, 60, 26,177,186,111,137,147, 15,157, 98,176, 48, 36, 49,
+193,105,166, 89,202,100, 60, 66,170, 50,126,111,200, 70,106,145, 97,168,237, 87,148,165,163, 44,203,152,145,230, 49, 67,159,215,
+250,156,115,228, 73,134,247, 80, 20, 85,172,127,131, 54,129,158,207,210, 4,231, 97, 48, 24,196,117, 6, 59, 91, 59, 84,101, 25,
+106,243, 42,148, 23,154,192, 9,137, 64,171,168,138,105,200, 22, 36,100, 22, 75,171,251, 56,249,192,189,136, 50,100,121,200, 90,
+ 77,170, 57,121,252, 62,210, 52,231,192, 69, 23,241,241, 15,253, 15,196,123, 6,195, 69,156, 11,245,116,239, 64,180,180, 50,148,
+184,190, 85, 29,220, 70,113, 25,194,129,203,190,156, 98,188,206,243, 94,250, 53,220,254,145, 15,179,124,241,115,120,248,238,191,
+164, 42,199, 92,116,229, 75,200,122, 3,238,187,253, 40,222,149,100,249,128,222, 96,129, 44,207, 81, 2,211,113, 96, 52,146, 52,
+103,184,114,136,251,110, 63,138,171,166,161,228, 32, 6, 68,163,141, 33,239, 13, 49,105, 70,146, 36,204, 38,163, 70,163,130, 8,
+217, 96,145,141, 7,239, 4, 23,106,174,182,152, 96,109, 17,152, 23,162,224, 51, 2,158, 18, 79,229,125,160, 75, 77,134, 36,203,
+ 40,177, 72,181,131,183,179,230,126, 70, 90, 25, 21,210,202, 50, 36, 36,105, 66, 84,123,213,206,171,154,131, 55, 66, 98, 82,146,
+ 52, 11, 66, 45, 23,216, 24,239, 29, 85, 89,204,105,108, 95, 75,147,230, 34,162, 26, 36,234, 53, 49, 7,240,154,154,118,248,152,
+ 49,170, 58,187,165,166,230, 29, 58, 82,250,210,232, 51,230, 2, 56, 26, 97, 91, 40, 57, 52, 96, 19,193,202, 58, 55,167,202,101,
+ 78,181,250,128,155, 17, 52, 92,212, 40, 72,100, 50,124,204,160, 67,166, 22, 88, 41,105,125,111, 60,158,154, 42, 85,181,144, 13,
+ 84,244,160,117, 62, 31,246,173, 22, 63, 42,188,154, 7,172, 68,122,157, 58,183,109,216,138,200, 26,196,114,131,179, 22, 37, 38,
+178, 15, 37, 74, 37, 13,184,105, 5,222,201, 92,255,160,116, 4,135, 0,102, 90,116, 8, 74, 68, 80, 58, 1,111,131,200,171, 62,
+ 23,222, 70,102, 68, 34, 99, 19,179, 84,234,250,125, 4, 56, 53,167,196,189,183,177,142,174, 32, 10,203,156,115, 49, 49,241, 17,
+ 43,162,143, 20,193, 86, 85,147,237,214, 92,132,141, 66,187, 16, 40, 73, 19, 24, 8, 10, 27,191,207, 90,135,212,154, 19, 17, 68,
+199, 96,204,213, 1, 21,141,208,211,197,200,192, 19,104,121, 98, 57,140, 88, 63,167, 14,168,116, 0,234,250,152,156,173,176,182,
+154, 7,147,109,160,141,219, 19, 36, 48, 64, 17,153,125, 35,106,157,215,192, 27,150,170, 93, 22,218,171,151,195,239,122, 78,122,
+179, 38, 91,191,215, 92,176, 89, 88, 24, 82,204, 10,118,182,183,231,130, 19,145, 64, 11,219,144, 33, 41, 81, 77,148, 82,223, 4,
+ 58, 82,188,218, 4, 33,157,142,145,161,115,150, 44,207, 40,203,146,158, 81, 20,211, 18,148, 3, 66,109,123,188,179,141, 82,194,
+ 48, 91, 98,184,180, 72, 89, 22,204,166,161,182,236, 35,125,139,247, 49,163,239, 53,244,186, 40,133,194,179,189,185,193,104, 39,
+ 99,101,117,145,131,135, 15,178,126,106,157,157,237, 81, 20,204,132,122,178,210, 42, 82,209,208,235, 39,204,102, 37, 68,134,161,
+ 44,162, 3, 80, 30,147,134,133,231,112, 49, 2, 11, 89,126,157, 45,247,122, 57,131,133,126, 0,186, 24,133, 77, 39, 97, 95, 37,
+214,128,148, 10, 74,251, 90, 44, 49,155,150, 49, 75, 54, 17,212,124,172,219, 72, 20, 22,130,142,234,125,240, 12, 22,250, 56,235,
+130, 8,144,121,176,228,241, 24, 29, 0,184, 44,166,156,222,220, 98,101,117, 5,239, 29,211,201, 4,115,104,149,133,197, 33,147,
+ 81, 16,190, 41, 45,248,194,199,154, 90, 16, 12, 78,167, 5,197,108, 70, 21, 89, 23,239,160,116,129, 94, 47, 70,227,112,205,180,
+142,130, 69, 77,158,167, 77,205,182,102, 65,148, 22,202, 89, 65,150,231, 76, 39, 19, 6, 11, 67, 68,107,202,162,160, 55, 28,176,
+126,234, 20, 85, 85,145,102, 57, 85,101,153,140, 39,148, 69, 25, 51, 89, 67, 89, 20,161, 59, 65,107,202,178, 34,203, 83,188, 3,
+167,124,140,240,231, 74,102, 16,140, 86,204,170, 50,100, 8,209, 73, 56,235, 24, 46, 44,132,204,222,131,181, 21,155, 27,155,140,
+118, 38, 77,233, 6,124,168,175, 71, 53,175,206,210,160,202,159, 5,122,219, 57,139, 19, 97,255,193, 85,142,221,246,113,178,172,
+ 71, 98, 12, 11, 75,139,108,173,175,113,122,125,157, 75, 46,127, 38,107, 39, 79, 49, 58,125, 34,148, 26,242,126, 0, 29, 27,130,
+150, 16,213, 75,204,226, 84, 44, 49,129,215, 26,188,193, 86, 5,131,197, 67,244, 23,150, 56,124,233, 1,238,185,237,147, 72, 50,
+164,156,108,179,179,126, 55,195,165,139,217,127,233,149, 84,211,211,172, 29, 63,134, 54, 41,139, 43,251, 72,243, 60,172,175, 8,
+204,202,100, 44, 31,122, 26,247,124,250,163,148,197, 56,208,133, 98,200,242, 30,214,194, 96,105,137,188,215,111,238,252, 36,205,
+152, 77,199, 76, 71,219, 12, 87, 47,225,228,125,183,177,179,126, 95, 84, 40,215, 37, 42, 5, 46, 64,158,171, 66,208,172,116,237,
+224,195,189,158, 14, 87, 72, 18,131, 43, 38,204,102, 91, 33,131,117,118, 87,237,183,201, 56, 27, 10,183, 86, 8,123, 98,106, 24,
+ 0,187,201,208, 67, 78,146,245,130, 22, 36,220, 19, 18, 50,124,231,168,202,105, 3,222,245, 26,192,123,148, 14,247,161,119, 54,
+ 2,165,154,103, 64,141,120,172, 86,174, 71,186, 89, 84, 44,213, 4,231, 93, 51,132, 90,107,136, 0, 93, 43,255,131,215,214,141,
+ 48,207,225, 80, 62,214,191,197,180,202, 17,109,229,177,111, 50,189, 58,107, 18, 84, 44, 3,196, 12, 56, 72,216,226, 58,116,173,
+186,119, 60, 83,222,198,192, 80,230, 12, 65, 64, 24, 20,117,201,207,134,123, 35,130, 34,145, 25,144, 70,144,104,119,169,157, 27,
+ 0,105, 68,134, 33, 1,115,126, 94,255, 22, 31,124,176, 80,151,180,130,175, 76,106,241,156,154,171,171,165, 6,106, 21,217, 51,
+241, 17,192, 67,182, 10,110, 14,236,248,134,150,174,131,131,186,227,128, 22, 51,226,252, 92,167, 32, 74,135,164, 42,208, 2, 49,
+193,241, 49,235,173, 34,248, 75, 12, 38, 2,179, 40, 42,136,174, 3, 13,111,230,107,176, 14,186, 84,232,212,106,128, 94, 25,108,
+ 76, 44, 66,252, 83, 3,189,198,232,132,202,186,166, 94,173, 35,184, 71, 9, 95,131, 57,243, 12, 58,126,127, 20, 66, 6, 22, 33,
+176,147,117, 2,169,164,102, 99,231, 73,150,119, 14, 47, 45,178, 92,194,126,248,184,142,106, 86,168,206,190, 27,189, 76, 43,251,
+158,103,229,145,254,159, 43, 20,144,189,192,222,112, 98,192,104,103,135,233,100, 18,197,102,101,163,112, 55,137,222, 37,150,171,
+105,234,154,102,181,214, 54,130,185, 44, 79,209, 70, 55, 66, 14, 99, 76, 84,115,135,236, 57, 73, 19,138, 89,104, 67,171,138,130,
+201,206, 14,121, 47,103,105,117, 31,105,154, 54, 7, 19,232, 43,154, 90, 69, 83, 15,243, 30,235,108, 0,169, 98,196,218,137, 83,
+ 76,103,142,125,135, 14,178,239,224,190, 93,116, 77,154,154, 80,107,206,146, 0,184,145,218, 19, 32,205, 18,178, 44,137,226, 56,
+133, 54, 42,182,202, 37,145,182, 14,206, 35,239,101,228,189,156, 44,207, 72,123,121,227, 88, 84,108,211, 83, 53,165, 32, 66, 85,
+ 86,161,110, 83,148, 49, 58, 37, 10, 56,164,105,153,203,242, 44, 42,253,231,229, 35, 99,146,152,129, 73,115,158,138,162, 12, 34,
+ 34,165,163, 40, 43, 44,152,201,104, 7,157, 24,246, 31,218,135, 86,194,214,198, 22,131,133, 97,160,126,240,148, 69,133, 68,225,
+135,181,129, 18, 47,203,114, 46,118, 43, 99,246, 62, 43,152, 78,167,148,179, 34, 30,119,100, 35,122, 57,189,126, 80,242,167,105,
+216, 47, 68, 40, 11, 75, 85, 85,232,196,132,172,187,152,133,182,144,178, 36,203,115, 68, 66,128, 50,155, 78, 25,143, 38,187,168,
+253,218,209,141, 71, 35,146, 36,193, 86, 65, 71,144,102, 73,163, 40, 53, 90,135,104,220,209, 8, 25,117, 84, 52,187, 24,224, 5,
+ 45,195, 34, 73,106,154,146,193,246,233, 45,108,140,148,171,178,196,150,101, 12,228, 2,213,149, 38, 25, 90, 41,108, 85,204, 21,
+204, 18, 90, 16,103,179,113,168, 97,247,114,146,124,192,201, 7, 30,196, 86,150,195,151, 93,202,189,119,220, 30,110, 94,209, 40,
+157, 48,222,217,198, 86, 5, 58,214, 51,141, 73, 34,160,135,122,155, 54, 73, 40, 61, 69,145,226,254,203,158,203,129,195,251,216,
+ 94, 59,193,218, 67,159,227,240,229,207,226,248,103,254,148, 36,237,113,209, 51, 94, 64,158,105, 54, 31,190, 31,239, 75,134,139,
+ 43, 36,105,218,100,149,182,178,152, 52,101,249,208,211,184,239,246,143, 51,155,108,135, 96, 88,167,104,147, 98,146,156,225,210,
+ 10,189, 94, 15,173,194, 61,133, 8,197,108,194,233,147,247, 83,149, 21,174,154,177,249,240,109,184,106, 20, 85,209,190, 1, 40,
+129, 64,191,139,135,168, 72,247, 62,180, 55,165,131,125,228,189, 1,226, 75,170,217,102, 83,211,103,238,182, 35, 88,186, 6,208,
+156,155,215,157,137, 20,124,253,243,156, 62,116,152,164, 71,154,247, 16,101,168,236,156,234, 46,139, 89, 0,245,154,102,111,105,
+115, 92,236,152,105,106,228,241,239,193, 25,198, 54,167,150,250,184,214,254, 32,115, 38,177,166, 92,189,155, 43,212,231,220,186,
+236, 18,195, 53,199, 33,210,116, 93,212, 76, 68, 29,188,132, 86,211,118,251,150,139,170,108,191, 27,196, 26,134,194, 69, 48,214,
+243, 58,107,147,237,215,244,118,108,139,107, 94, 11,107,202,199, 54,187, 58,145, 82, 53,104,198,253,169, 25, 9,223,114,249,237,
+214,170, 90,199, 80,127, 31, 50, 47,111,212,106,241, 58, 81, 81, 90,163,148, 1, 84,147,105,215,181,102, 21,197,167, 97, 31,104,
+213,212, 5,223,252,190, 87, 27,208, 42,111,214,129,106, 44,137,212, 34,185, 70,216, 24,207,139,170,253,157,142,181,247,250,254,
+143,138,246,154, 82,119,117,224,133,196,224,165,181, 46,162, 14,170,190,174, 38, 73, 27,113, 99,125,205, 65, 26, 49,114, 19,168,
+ 54,224,163, 26, 65,115,205,250,213,250,170, 42,118, 83,249,136, 67,109,218,187, 22, 64,215,165, 21, 23,215, 5,113, 13,182, 42,
+163,187,107,229,168, 38, 35,175,239,177, 93, 34,184, 93,117,243, 40, 30,100, 14,252,187, 82,247,121,247, 35,202, 90,207,246,233,
+157,176, 80, 98,123, 85, 85, 22,243,218, 22,117,102,174, 98,127, 93,136,128, 85,172,139, 10,190,169, 63,212, 32,105,162, 74,190,
+223,239,145,101,105,236,181,181, 81, 24,102,153, 78,166, 84,101,201,120,103,135, 36, 49, 44,237,219, 71,175,223,139, 53, 69, 67,
+154, 24,210,212,132,236, 42,214,226,235,144, 70, 69,113,149,173,102,108,156, 60,201,206,246,132,225,226, 18,251, 15, 31, 12,226,
+ 59,153,139, 19,202,210, 54,173, 86, 74, 73,212, 11,208, 40, 88,235,104, 76,199,204, 94,105, 65, 41, 72,211,100, 94,223,196,227,
+171,138,196, 24, 68,121,210, 60,109,192, 35, 56,166, 16, 4, 21,211, 34,182, 94, 4,166,160,166,152,211, 44, 13,237, 45, 4, 42,
+206, 36,186, 17,215, 36, 89,216, 86,154, 37,205,149,212, 38,232, 26, 84,252, 60,177, 54, 30,122,198, 67,109, 91, 41, 97,123,107,
+139,170,178, 44, 46, 45, 5,103, 30,157,139,224,152, 77, 75,166,211, 25,206,250, 72, 77, 7,225, 99,208, 43,204, 98, 57, 37,128,
+107,158,103,100, 89,168,157, 39, 73, 18, 4,123, 54, 42,136,189, 71, 27, 21, 91, 4,131, 96,232,244,198,233,102,141,212,148,219,
+108, 58,101,103,123, 43, 0,104,188,169,130,248, 77,147,164, 9, 91,155, 91, 44, 44, 45, 48, 25, 79,201,122, 65,115,209,168, 58,
+ 99, 59, 76,211,235,171, 66,155, 99,173,254,112, 81, 72,215, 31,244,163, 90, 90,216, 62,189,197,104, 52,106,222, 83,211,105, 54,
+ 6,160,222,185,112, 67,123,139, 45,203, 38,251, 72,146, 30,179,201, 20,188, 39,203,114,134, 75,203,164,121,143,205,147,167,216,
+127,248, 18, 78,111,110,177,121,234,126,192,211,235, 47,226,189, 80,205, 70, 77,159,180,139,130, 27, 98,159,108,168,201, 65,146,
+134,249, 8, 11, 43,151,112,241,229,151, 99,180,227,246,143,125,144,203,190,252,171, 56,126,199,199,193,205, 56,124,197, 11, 99,
+169,199,113,242,248,221, 12, 22, 87,233, 13, 22, 72,146,208, 10, 74,116,238,203,135, 46,231,129,187, 62, 69, 49,217, 66,169, 4,
+147,164,136,210,244, 6, 3,250,195, 1,105,106, 26,145,228,116, 60, 98,103,227, 20,163,211,107, 56, 87,113,240,178,103,177,246,
+185, 79,180, 20,216, 62,106, 93, 84,147,209, 42,147, 52,253,196,117,205,214,228,139,244, 6,139,136, 47, 41,167, 91, 56, 91,197,
+123,191, 86, 37,207, 53, 39,109, 5,184,111,178,114,213,212,213,173,245,115,209,160, 7,173, 83,250, 11, 43,104,147, 54, 74,110,
+111, 29,229,108, 70, 49,155,196,140,221, 54,247,247,156,182,164, 9, 20, 2, 77, 58,175, 1,215,128, 35, 77,189,213,205,213,207,
+ 77,145,120, 46,230,219, 69, 83, 71,182, 65,234, 90,123,236,174, 8,181, 83, 19, 1,140, 93,212,188,139, 96, 95, 39, 13,181,110,
+164, 6,164,154, 74,109,148,243, 74, 90,190, 83, 53,179, 12,106, 96,175,147, 21, 85,239, 71,108,215, 84, 74,163,149,105, 74, 87,
+196,154,111,160,132,165, 97, 49,230, 30,220,207,245, 97,117, 22,215,162,120,195,253,209, 18,233,213, 52,114, 19,232,169,121,135,
+ 64, 12, 72, 26,170, 87, 41,148, 14,125,232, 65,124,171,155,206, 40,137, 98,183,250,251,230,252,111,236, 11,111,128, 72,230,231,
+153,121, 11, 90,104,247,155,235, 7, 66, 11, 27,136, 74, 16,101, 98,253, 92, 26, 1, 24,162,231,202,246, 40,188,155, 3, 94, 13,
+244,210,116, 15, 4,102, 75, 71,166,194,180,102, 0,132,238,170,166,109, 47,210,246, 33,179, 87, 13, 54,232, 24,200, 4, 77, 86,
+196,134, 38, 29,150, 38,161,245,113, 46, 70,221,109, 80, 39, 97, 66,221,163, 63,207,164,165,213,182, 54, 15, 44,221,110,225,155,
+159, 83,239,126, 23, 61,255,249,109,235,237, 98, 24,187,106,234, 30, 53,175,185, 18,157,119, 21, 23,106, 93,155,212, 1, 20,132,
+166,157,161,238, 51,119,222, 82, 69, 5,117, 93,139, 79,147,186,151,219, 52,180,170,105,245, 71,214, 3, 53, 70,219, 59,216,178,
+192, 85, 37, 73, 98,216,119,248, 16, 11, 75,139,241,239,109, 45, 76,168, 89,183,157,168, 73,234,108, 18,198,219,167, 89, 95,219,
+ 68,196,176,239,224, 1, 6, 11,131,152, 5,134, 69, 25,250,157,213,174, 1, 2,206,206,135, 7, 4,193, 86,136,136, 27,135,137,
+144,101,129,121,168,107, 94,149,181, 49,155, 55,205, 80,158,102, 8, 6,145,201,176,190,105,211,128, 0,232,189,126,160,238,179,
+ 60,109, 28,138,214, 58,158,159,216, 31,238,193,196, 44, 20, 95, 59,209,112, 2,140, 14, 61,241,105,146, 48,155, 76, 40,102, 21,
+195,165, 5,156,181,156,124,232, 36,189, 97,159, 94,191, 71, 89,134, 89, 2,179,162,162,170,202, 88,215, 14, 61,247, 33,168, 8,
+ 25,181,210,154, 60, 15,204, 65,150,101,152,196, 68,177,159,106, 74, 47,225,220,133,154,121, 45,104,218,217,222, 33,203, 82,198,
+ 59, 59, 16, 65,174, 42, 45,105,158, 51,155, 78,130,176,207,185,102,168, 79,205,126,136, 8,147,241,136,222, 96,192,120,103, 4,
+ 30,122,189, 44, 4,134, 49, 43,171,153, 31,173,231, 2, 71, 36, 48, 54, 90, 9,131,126,159,225,226,160, 41, 77,108,159,222,138,
+195, 61, 2, 19, 82,247,203,106,173, 16, 31, 75, 64, 89,206,116, 58,197,218, 18,111, 67,208, 51, 92,220,199,120,251, 52, 73,146,
+209, 31,244, 88, 92, 61, 0,190, 98, 58, 30,115,248,105,151,114,207, 29,127,211,128, 89,127,176, 68,229, 60,229,116,187, 9, 30,
+154,168,222,207,107,163,181,166, 65,107,195, 37,207,122, 1,131,129,225,227, 31,252, 29, 86, 47,122, 14,222,150,108,157,252, 12,
+203, 7,175,164,183,176, 66,150, 27,198,155, 39, 1, 33,239, 15,131,230,195, 68, 81, 21,176,116,240,233, 28,191,243,211,140,183,
+ 55, 80, 73,222, 56,152,197,149, 21,210,172, 23, 6, 36,105,197,206,230, 38, 59,155,167, 24,111,173, 81,149, 65,224,120,201, 51,
+ 95,204,250, 3,119, 82, 21,167, 27, 7,173,181,137,117, 82,105,234,154, 33,152, 53,104,147,134,108, 63, 27,144,100, 67,180,130,
+114,186, 69, 85,142, 90,130, 52, 23, 41,229,182,186,150, 6,228, 27, 37,121,147,229,170, 38, 96,173, 51,225,222, 96,153, 36,235,
+197,222,224, 0, 16,101, 89, 50,157,236, 48, 29,159,110, 1,115,171, 45,206,181,232,229,122, 42, 72, 4,120,124, 77, 1,199,253,
+114, 62,182,208,185, 24,100,206,149,221,161, 91,199, 54,175,207,101,198,204, 7,188,200, 92,223,209,118,172,141,130,223,250, 88,
+ 59,151, 93,169, 81,157,205,213,181,239,134, 82,109,128, 53, 6,152,113, 80, 9,209, 79,212,165,196, 80, 75, 14,195,124,106,117,
+189,196,246,174,208,178, 57,103, 2,241,181, 46, 64,181, 84,252,187,219, 10,137,172,200,156,234,245,177,254, 61,167,109, 93, 13,
+ 64,225,221, 77, 0,224,234,214,171,102,136,140,110,174,159,104,221,234,248,152,179, 27,222,187, 38, 40,172, 3, 19,105,245,102,
+135, 54,184,164, 17,253,209,100,235,237,214, 60, 29,216,129, 58, 59,175,187, 29,154,214, 59, 29, 84, 42, 81, 24,232,188,199,135,
+137, 63,187,214,182,247, 32, 90, 71,145,111, 88, 79,214,249, 72,193,187,134, 73,208,218,132,228, 44,130,127,189,230,234,150,238,
+122,230, 68, 80,220,215,235, 65, 62, 47, 27,246, 77, 63,155,106,186,120,218, 3,100,194, 18,114, 13,165, 95,119, 81,213,107,195,
+197,196,163,222,182,111,129,183,111,177, 47,123,138,234,143, 60, 65,174,213, 89, 34, 34,152,114, 86,196,158,209, 88,143,174, 51,
+114, 73,154,161, 44,181,176, 34,212,162,133, 52,205, 26, 16, 75,211,121,175,162, 40,133,171,170, 38,186, 17, 44,149,170, 66,107,
+ 75,157,221,198, 41,109, 8, 76, 39, 99,202,162, 10, 52,119,191,207,194,202, 62, 4,216,218,220,104,181, 83,184, 72,253, 71,167,
+ 77, 0, 61,147, 38,100,121,200,252,157, 45,216, 92,223, 96,113,101,133,197,149,101,140, 38,208,179,142,160,222, 87, 65,141, 31,
+ 22,148,221, 61,142, 39,210,102, 90,197,237, 38, 9,105,106, 34, 29, 30,197,112,222,145,247,114,242, 60,101, 54, 45,176, 51,139,
+173, 92,204,220,170,160,116,143, 10,202, 16,208,132,193, 56, 52,180, 93,168,231, 36, 49, 24, 40,139, 89, 0, 53, 99,192, 57, 92,
+ 92,152,198,104,138, 72,139,251, 24,204,132,126,248,160,224,175,172, 99,123,107,155,165,149, 69,146,116,139,141,181, 77,180, 49,
+172, 30,216,199,206,246,136,162,152, 81, 22, 85, 16,237,197,136,180,206, 2, 19, 99,226, 48,157,144,161,167,105, 66,111,208, 39,
+ 77, 3, 59, 98,210,132,178, 8, 98,175,154, 25,177, 85,133, 46,131,224,110,115,125,139,172,151, 97,109,201,198,218, 38,131,197,
+ 33, 69, 81,160,117, 18,166,251,121, 72, 83,135,137,215, 86, 34, 69,171,148,102,180,181,141, 73, 50, 38,147, 9,206,121,178, 60,
+ 99,180, 51,137,181,197,185,250, 86,132,208, 1,129, 35, 49,134, 73,236, 76,232, 13,250, 97,202,161,210,204, 38, 19,182, 54, 79,
+163,213,124,104,135,141, 29, 26, 97,174, 64, 21,196,144,105, 74, 89,204,112,182,108, 50,138,213,253, 7,216, 56,117,138, 44, 31,
+176,188,186,143,149, 3,251, 88,123,240, 56,131,197, 37,138,162, 98,107,237, 33, 68, 98, 59, 92,111, 64, 85, 22,184,106, 22,123,
+ 83, 19,146, 36, 13, 78, 55, 50, 84,186, 17,135,122, 22, 15, 62,141, 75,159,113, 37,159,248,224,111, 33,162, 57,124,197,115,185,
+235, 99,239, 39,205, 23, 89,189,248, 89,108,157, 60,206,129,131, 95,201,253,199,239, 36,239,133,182,204,186,100,230, 29, 44, 29,
+186,130, 83,199,239, 97, 54,222,136, 45, 55,138, 44, 79,232, 13,151, 17, 21,130,100,103, 43,182, 55,214, 24,109,173,161,116, 66,
+222, 31,144, 24,205, 96,241, 18,140,134,209,198,221, 13, 29, 45, 13, 13, 74, 67,127, 6,193,160,142, 61,233,130,152,156,108,120,
+ 32,204, 74,152,109, 81, 21, 59,177,118, 93, 5, 48,218, 53,244, 36,102, 32, 81,196, 86,183,111, 5,177,103, 45, 66,138, 19,194,
+162, 0,180, 55, 88, 38, 73,123, 17,180,116, 12, 4,203, 16, 4, 78,182,155,233,108,141,234, 92, 76,107, 42, 94,164,224, 91, 0,
+ 91,143,253,178,177, 85, 75,226,164, 13,223,244, 60,215,109, 74,180, 4, 73,115,245,186, 40,153,103,215,117,203, 86, 61, 16,197,
+185,144, 17,214, 34,175,200, 12,132, 97, 66, 97, 26, 93, 45, 68, 69, 92,171,166, 62,207,216,105,234,218, 68, 1,221,156, 24,175,
+157,122,221,114, 90,139,192,131,243,215, 13, 51,170,180,142,173,104, 65,100,170, 34, 21, 93, 31,199,188,147,225, 12, 10,232, 93,
+173,109, 45,182, 33,126, 70, 84,210, 4, 8,141,202, 94,155,185,152, 76,164, 37,186, 10,193,185, 49, 10,239,138,184,126, 84,156,
+ 76, 24,174,103, 96, 28,194,245,242,115, 68, 15,215, 52,182,186,137,104,188, 4,138, 63,168,202, 77, 51,220,203,227, 98, 96, 35,
+ 17,220,109, 80,210,120,162,150, 98, 94,135, 15,135,236,154,242,168,171, 1,177, 17, 69,250,216, 25, 16, 2,133, 36, 81, 17, 51,
+ 76, 19,144,213, 90, 6,231,194,160,160, 48,120, 45,148,147, 69, 9, 42,150, 98, 67,251,153,195, 68, 6, 90,199,146, 65, 85,149,
+ 49,232,168, 7, 13,185, 93, 32,239,234,217, 4, 66,156,152, 87, 69,231, 22, 7, 27, 53,211, 2, 93, 75,220,188, 87,206,238,155,
+ 14,143, 57, 13,239,217,203,182, 75, 43, 91,111, 4,233,117, 39, 81, 93, 59,107, 38, 52,169,240,165,229,172,104,134, 58, 36,105,
+104, 9, 80, 26,202,216, 70,164,181,166,215,207,113,149,197, 24, 21, 84,158,205,120, 76, 9,237, 28, 42,212,229,131,138,209, 54,
+ 2, 13,165,107,209,131,103, 58,217,137,244, 38,100,189, 30,131,229, 21, 68, 41,182, 54,214, 3, 53,110, 12,206,186,160,114,214,
+ 58,168,161,123,217, 92,149, 88, 83,110,174, 98,107, 99,157,197,229, 85,122,251, 22, 89,222,159,176,115,122, 59,140, 73, 85, 10,
+ 27, 79,248,124,138,144, 68,186, 91, 55,130,146, 44, 11, 89,184,179,237, 41,102,154, 52, 77, 49,137,102, 50,158,198,172,117,210,
+156,216,178, 40,153, 76,138, 38,106, 79, 98,191,188,210,134, 94, 63,163, 44, 28, 73,170,231,206,182,172,168,202, 56,214,208,249,
+166, 45,206, 86,150,170,242, 77, 43,154, 18, 67, 18,105,249, 26,228,181,146,144,173,247,123, 12,134, 3, 78,175,111,178,185,182,
+206,194,210, 2, 75, 43,203, 60,240,185,227, 65,152,230, 92,211, 57,144,102, 41, 38,210,119,117,189,114,105,121, 33,102,194, 97,
+106, 94, 61, 4,164,110, 93,145, 60,141, 76, 68, 0,217,217,116, 22, 38,236, 45, 44,115,247,103, 62, 75, 85,110,146,100, 41,101,
+ 81,209, 27, 44,144, 38, 41,179, 98,198,108, 58, 13, 0,148, 36, 49, 80, 20,108,165, 40,139, 9, 38, 73, 40,103,179, 56, 75, 32,
+ 37, 73, 12,197, 44, 46, 77,239,176,206,146, 42, 21, 71, 54,134,114, 79, 29,115, 45, 46, 45, 68, 96, 10,212,251,108, 58,142, 45,
+116, 37,105,150, 5,193, 77,100, 75,234,207, 36, 73,202,206,230,102,147,133, 13,134, 75,124,217,243,159,195,167,254,252,207, 88,
+217,183,143,125,135, 15,227,157,101,123,115,147,131,151, 94,198,253,119,223,141,179, 37, 90, 27,180, 78, 73,243,156,201,198,122,
+ 51,157,203,150, 5,149, 78, 91, 3, 83, 66,237, 82, 27, 77,146,246,120,214,139,191,134,123,254,250, 40, 59,155, 15,115,197, 11,
+ 95,195,137,123, 62,141,171, 38, 92,246,188, 87,178,189,246, 16,251, 14, 93, 4,190,192, 86, 54,150, 18,194,228, 70,239, 29,131,
+125,151,178,246,224,113,182,214,142,135,178, 76,154,146,247, 7,161,198, 45,144,100, 9,182, 44,216, 57,189,193,120,123, 61, 40,
+203,109, 96, 85,146, 44, 99,113,223, 33, 30,188,243,104,188,239,216, 53,182, 52, 56, 76, 27, 89, 33,221,244, 90,235, 52, 35, 91,
+ 56, 24, 70,246, 22, 35,198,227,205,121, 50, 27,155,130,149,214, 56, 87, 54,162, 56,105,234,143,186,153, 46, 25,232,233, 57,245,
+ 23, 58,189,132,188,191, 68,214, 31, 98,146, 60, 6,188, 97, 92,170,179,150, 98, 58,106,196, 85,243, 76, 54, 10,146, 68,135,128,
+163, 6,200,166,102,106,231,131,106,118, 77,123,163,105,213,170,123,230, 67,246,171,112,182,140,181,100,213, 48, 10,160, 3,173,
+ 12, 40, 99,112, 85,156,181, 64,157,117,153,121,141, 28,217,149,157,138, 10,140, 99, 8, 18,234,190,253, 58, 40,117,243,122,185,
+111, 77, 26,139, 10,241, 32,216,114, 77,246, 23, 74, 78,186,225,103,107,113, 89, 93, 19,118,126, 46, 62,171,135, 98,181, 6,129,
+134,158,112, 57,195,184,208, 70,164,232, 98,253,218, 71, 65, 96, 0,217,250,123,124, 11, 64, 68, 20,226,109,152, 70, 41, 58,150,
+222,170, 40,246,179,173, 65, 93,186, 9,194, 66,125, 94, 71,240,109,181,248,197,172,186,201,162,235,125,138, 44, 75,141, 41, 97,
+212,117,160,221,235,178, 11, 94,197,253, 14,153,118, 96, 27,164, 41,105,250,168,250,247,209, 95, 91, 23, 2, 21, 17, 29,197,184,
+134,202,210, 36, 68, 68,112,181,173,178, 9,177,157,141,216, 11, 95,179, 88,117,208,235,162,198, 64,107,141,117,150,196, 24,138,
+ 98,214, 12, 19,170,203,123, 8, 13,205,238,154, 73,138,243, 62,250,122, 13,184,102, 70,131, 52,215,198,215, 12, 88,211, 24, 33,
+115, 49,165,204,127, 70, 62, 95,245,222, 68,112,106, 78,235,215,197,250,250, 30, 52,245, 56,192,122,176, 64, 85, 86, 81, 12,150,
+ 52,253,195, 42,102, 82,245, 76,241, 58, 19,175,138, 2, 81,138,217,180, 34,205,235,158, 99, 21,163, 24, 31,231, 12,123, 84,170,
+ 40,162,115,173, 5,119,161,254, 20,230,204,151,101, 9,147, 49,120, 75, 62, 24, 48, 88, 90, 65, 39, 9,219, 27,155,113, 24, 9,
+232,216, 50,149,231,105,160,228,211, 36, 12,109, 49,181, 74, 86,129, 18, 70, 59,219,120, 60,203,171, 75, 44,173, 44, 49, 30,141,
+ 66, 95,120,116, 14,198,248, 70,140, 86,215, 80, 18,165, 98,251, 91, 80,232,215,103, 52,140,134, 13, 20,244,108, 26,178,224, 98,
+ 86, 53,153,208,246,214, 24,239, 44, 85, 25, 70,160, 6,186, 94,230, 34,144,152,213, 41, 29, 90,230,130,122, 56,212,179,195,194,
+182,244, 7,121, 51, 63,223,213, 45,101, 38,244, 78,154,122,132,174,119,148,165,109,232,178,205,181, 13,246, 31,218, 71,146,165,
+140,119,198, 60,116,252, 33, 14, 95,124, 8,165,117,168,165,215, 98, 38, 7, 89,150, 5, 49, 99,156,216, 6, 48,157,206, 90,109,
+ 63, 65,152, 83,255,205, 86,193,241,214,186,137,170, 44, 99,109, 20, 14, 94,124,136,149,125,171, 60,252,224, 67, 20,211,130, 52,
+207, 72,179,140,254,112,129,233,169, 41,152,176,168,170,202,146, 24, 69, 21, 3,139,217,116,214, 56,168,178, 40,231,199, 24,233,
+208,122, 30,130,107, 70,185,198,209,165, 58,180, 44, 13, 23, 6,161, 68, 2,108,159, 62, 77, 89, 22,177,219,162, 14, 22, 85,220,
+ 71, 69, 37,129,246,203,123, 41,167,215,202, 70, 74, 90, 85, 21,139,203,139,124,237,235, 94,205,237,159,248, 27,122,195, 5,138,
+233,148,170, 40,209, 38,225,225,251,142,197, 58,161,208, 31, 46,131,210, 20,147, 29,242,193, 18,121,127,200,214,218,131, 77, 27,
+ 91, 24, 76, 17,196, 89,218, 24, 94,252,170, 35,120, 20,199,239,250, 36,171, 23, 61, 19, 17, 97,235,196,157, 28,190,226, 5,148,
+165,101,178,245, 48,135, 94,114, 53,167, 62,119, 23,189,126,142, 73,116,164, 9, 61,217,240, 48, 59,167,183,216, 62,117, 31, 34,
+ 33, 32, 74,251, 67,242,254, 48,234, 74, 74,102,227, 17, 59,155,167, 40,139, 9, 74,234, 28, 58,172,185,213,195, 79,103,123,237,
+193,102,118,183,243,101, 51, 40, 68,137,111, 4, 76,170,110, 87,146, 80,115,204, 23, 15,146,164,125,240, 21,147,157,141,224,132,
+189, 39,142,152, 10, 83,187,156,109,209,170,170,105,235, 10,123, 16,187, 77,234, 81,157, 45,197,114,111,184, 76,214, 27,146,102,
+189,160,137, 80, 38,172, 35, 28,101, 57,139,179, 20,122, 88,103, 81, 62,140,205,121,238, 40, 0, 0, 32, 0, 73, 68, 65, 84,241,
+165,233,239, 13,140,139,173,202, 70,161,174, 98, 73, 38,168,137,107,125,175,111,169,193,125,116,176,117, 11,149, 71, 5, 78, 54,
+222,143,122, 62, 85,189,165,210,158,211,169, 13, 9, 16,133,158,177,115,197,250,152, 81,250,185, 51,143,157,123,222,187,192,122,
+212, 37, 0, 45,205,253,169,212,124, 4,105, 67,187, 70, 13, 73, 96, 53,124,171, 52, 62, 31, 55, 91, 11,233, 66,144, 84, 53,157,
+ 6,170, 25,125, 28,218,200, 92, 28,166, 68, 51,231,190, 37,153,174,149,215,222,199,118, 43, 21, 59, 55,124,211, 38, 38,187,104,
+244, 57,208,134,172,155, 22, 64, 7, 49, 90, 45,174, 12,101, 17,213, 8, 20, 85, 92, 79,245,190,181,167,171,213,162, 48,165, 37,
+100,245,113,226,158,167, 30, 74,164, 80, 26, 52, 6, 43, 14,113, 65,183,211, 48, 41,141,200,207,205,131,131,230,103, 21,129,180,
+158,253,238,155, 26,186, 49, 73, 51,100,198, 91,223,244,121, 55,251,163,234,222,114, 63, 23, 64,170, 57, 19,237,156,199,232, 80,
+122, 82, 18,124, 88, 45, 84,116, 98, 99, 23,150, 14,207,201,160,214, 47,184, 56,176, 38, 96,167,179, 85,195, 76,183,199, 70,215,
+ 9, 76, 51,214,182, 6,239, 61,153,120,131, 77,126,215,133,221, 85, 75, 15, 34, 4,118,181, 80, 54,195,148,108,101, 81, 49, 59,
+244,117,141, 57, 77,154, 40,160, 42,138,102, 34,145, 68,119, 18, 68, 2,241, 36,216, 32,166,170, 23,105, 89, 86,177,159, 59,105,
+196,105,225,166, 84,173, 33, 13, 97, 94,184, 73, 76,163,142,156, 77,103,108,109,110,179,189,121, 26, 87, 76,233,245, 7,172, 28,
+ 58, 68,150,247,154,186,126,154,154, 88,119,109,215,145,106,103, 18, 22, 69,146,132,135, 18,172,159, 92, 99, 86, 88,134,139,139,
+244,250,189,144,237, 84, 33,106,206,178,148,188,151,145,229, 41,105,154,144,229, 73,168, 49,231,105, 84,110, 75,156, 29,158,227,
+156,163, 40, 10, 70, 59,161,102,172, 77, 88,212,227,209, 52,170,164,101, 87, 93,176,158,251, 94,103,197,181, 80,194, 36, 10,157,
+168, 38,202, 52, 70, 51, 24,230,205,108,253, 80, 59, 79, 67,230,220,170,103, 87,205,152,217,154,234, 47,216, 92, 91,103,103,123,
+194,254,131,251,113,206,177,185,182,206,198,218,105, 14, 28, 58, 24,149,238,113, 28,170,146, 86, 22, 19,104,165,205,141,211,108,
+172,111,178,179,181,205,120, 52,162, 44, 10,198,163, 17,163,157, 17, 91,155,219,140,118,254,127,182,222,235, 73,146, 44,205,238,
+ 59, 87,184, 12,145,145,162,116,181, 22,211, 35,129, 21, 92, 5, 35,214,104, 52,130, 70, 60,144,255, 42,159,104, 52, 35,204, 96,
+ 32,184,160,129,139,197,206, 46,118, 71, 79,119, 87,151,206,170,204,200, 12,233,226,250,189,124,248,132,123,246,238,140,141,245,
+204,148,200, 8, 15, 15,191,159, 56,231,119,246,184,189,185,197,203,231,175,241,246,213, 91, 60,255,246, 57,158,125,253, 29, 94,
+191,120,133, 24, 19,242,162,196,131, 71,143,152,191, 78,239,253,228,244,140, 11,184, 65, 5, 37,164, 28,117, 74,190, 58, 30, 27,
+ 56, 71, 98, 63, 35,136, 80, 55,162, 42,135, 48,240, 68,134,144,190,214, 57, 10,148, 72, 73,233,131,205,225,128,155,235, 53,107,
+ 59, 12,119,202, 94, 31,210, 4,235, 73,240,158, 20,229,237,241, 48, 98, 56, 97,113,125,121,133,162, 42,241, 39,127,249,103, 48,
+ 38, 34,134, 30,171,139,115, 92,189,125,131,208,183,248, 31,255,183,255, 21, 62,203, 81,206,150,116,120,119, 7,164, 24,240,217,
+143,127,140,217,242,148,187, 13,206, 41,224,208,157, 15,190,248, 17,238,127,240, 1,186,221, 26, 85,189,196,227, 47,126,138,183,
+191,251, 27,156,156,127,128, 98,126, 31,239,190,253, 91, 60,250,228, 71,112, 54,161,217,109,238,232, 20,242,217, 57,218, 54,224,
+250,213,175,145,241,244,162,168,231, 40, 42,218,183,199, 24,208,236,110,113,251,254, 5,250,238, 64, 86,166, 20,148,255, 93, 47,
+ 47,224,108, 66,232, 54, 35,221, 77,239, 59, 22, 53, 33,242, 53,130, 94,247,114,126,129,106,182,128, 53, 3,218,253,154,114, 25,
+ 88,188, 68, 29,214, 8,108,209, 93,247, 68,197,172,208, 22, 86,186,203, 8,208,250, 2,229,236, 20,245,252, 12, 69, 57,227, 80,
+ 13, 79,225, 70, 67, 68,115, 60,176, 6,129, 10, 11,162,219, 85, 40,202, 57,178,188, 70,150,229,234, 63,166,238,201, 79, 24,225,
+ 18,158, 50, 1,210, 88, 81, 87,143,226,182, 41,251,221, 89,135, 44, 47,117,244, 58, 70,222, 72, 91,197, 2, 63,238, 58, 13,171,
+219,199, 9, 64,198, 35,103, 40, 72, 74,133,104,105,220,171, 79, 89,220, 35,192, 38,170,194,125,228,128,147,165, 77,247,241,102,
+250,186,160, 34, 51,234, 24, 71, 58, 90,156,232, 25, 98,250,158, 56,237,123,255, 53,169, 32, 45,233, 56, 62, 37,242,131, 83, 97,
+ 52,168, 64,117, 8, 65,247,187, 52,146, 30,197,147, 2,110, 73, 60,245, 75,162, 76,215,125, 56,161, 96,199,107, 50,117, 12, 88,
+ 21, 37, 14, 17, 19,119, 0,116,183,174, 88, 88, 70,125, 67, 80,174, 92,112, 36,121,112,218,241,222,163, 17,243,116,173,233, 89,
+208, 54,226,134,201,198, 54, 17, 27,242, 58, 69, 66,178, 70, 93,137, 27, 97, 68,211, 17, 62,235, 30, 98,164, 85,158, 76,173,232,
+204,163,103, 12,225,171,211, 68,247,193,133, 14, 70,141,129, 56, 41,244,108,224, 41,192,200,110, 72,119,225, 51,105,186, 91, 55,
+248,231,246, 43,186, 74,249,222,162, 61,165,187,211, 26, 43, 41, 77,130, 20, 21,182,179,207, 70,236,170,168, 43,197, 50, 97, 21,
+ 98, 31, 21,170, 96, 89,205,105,173,225,132,178, 17,225,104,153, 24,103,140,165,238,131, 71, 57,162,128, 6,139,156,128,136,227,
+126,143,205,205, 45,154,253, 14,121,158, 97,190, 58, 69, 89,207,216, 70,230,149,236,165,106,123, 55,126, 72,116,224, 10,159,122,
+192, 97,187,193,110,123, 64, 89, 87,154,224,230,249, 48, 41, 75,234, 96,139, 50,199,124, 49, 67, 81,230, 4,152, 97,118,253,124,
+ 73,232,208,190,235,208, 30, 91,190,183,104,109,208, 28, 26, 14,126, 25,198,113, 49,219,184,178,194,179, 56,111, 84,223, 11,125,
+ 47,244, 52,138,201,203, 28,245,188, 98,139, 85,166,162,185, 60,207,239,116,232, 10, 64, 96, 64, 67,123,108,249,115, 50,120,255,
+246, 61, 96, 60, 39,158, 13,120,253,226, 37,156,207,113,118,126, 78,225, 53, 5,137, 63,132,186, 38, 28,252, 60,207, 80,112, 2,
+ 88, 8, 3,118,219,131, 90,127, 8,246, 66, 52,184,158,177,175,132,166, 61,224,213,243, 23,120,247,102,141,247,151,239, 16,134,
+136,162, 44,177, 92,173, 16,194,128,249,201, 74, 15, 1, 74,207,139, 44,154, 27, 52, 44,230,184, 59, 96,185, 90,226,176,223, 35,
+ 47,115,228,185,103,209,147, 84,207,244,160, 12,253,192,225, 62,100, 31, 36, 98, 28, 5,235,208,107,217,179,254, 33,142, 4, 58,
+ 3, 62,100, 73,255, 96,172,135,115, 6, 79, 63,254, 20,143,159,126, 12, 48, 30,182, 57,236,241,183,255,233,231, 56,123,120, 15,
+125, 75, 54,188,106,190,192,118,125, 3,107, 29,222,188,188,196, 95,254,219,255, 25,245,124,129,237,205, 6,161,111,209,181, 13,
+158,255,246,119,248,248,135, 63,161,245,145,247,122,207,221,123,242, 33, 62,248,242,115,124,247,219,111, 80,205,107, 60,249,234,
+143,240,254,197,215, 0,128,139, 15,127,136,247,223,253, 2,101, 85,227,195, 47,191,196,246,234, 45,178,124, 20, 36,186, 98,129,
+126,240,184,126,249,107,253,110,185,156,130, 87,202, 50, 67,232, 90,236,110,174,176,189,126, 77, 96, 27, 69,181,210,104,117,182,
+ 88, 97,117,239, 17,182,239,159,235,148,194, 57,199,215, 45,169,254,133,166, 74, 81,201,113,197,236, 12,203,243,251,168,170, 28,
+ 22, 68, 51, 44,103, 11,100,249, 12,245,236, 4,121, 89,195,231, 21,124, 86,194,250,130, 31,196, 78,197,102,226, 55, 38,149,183,
+135,203, 74, 24,151,195,186, 10, 89, 62,195,114,117, 14,155,149, 8,201, 34, 12, 6,125,160,220,136,227,126, 79, 22,203,104,144,
+140, 87,133,114, 2,249,242,125, 86,194,101, 53,124, 94,194,249,156, 45, 86, 99,103,125,215, 18,102, 56,204,198,168, 18,218,232,
+104,158,214, 72,214,121,221,223,210,200,181,132,243,133,134,136, 76, 5,115, 70, 14,117, 99,245,160, 72,178,123,213,229,247,100,
+ 34,193,247,245,196, 72, 54,225,125, 70, 86,198, 59,157, 58,165, 9, 1,109,228,201,143,226, 59, 65,143,138,208,212,240,245,142,
+140, 46, 37,235,220,104,207, 75,105, 60, 18,210,247, 65, 37,122,200,203,180,110,228,245, 71, 57,156, 13,238, 64,132, 52,244,133,
+ 39, 95,152, 16,209, 4,169, 74,135,254, 8, 94,129,185,235, 52, 48,242,190,210, 52,236, 38,221,229,163, 79,236,117,102,162,129,
+ 72, 48,147,240, 23,167, 97, 96,227,234,131, 41,121,188, 30,182,198, 50,213,145,127, 63,139,251,196,189, 48, 61,226, 68, 16, 39,
+118,229,209,138, 38, 89, 2,238,206, 25, 68,169,156,152,100,132,140,170,109,209, 70,196, 72, 28, 1, 51,129, 28,201,143,140, 92,
+ 64,141, 46, 4, 51, 73,216,251,167, 7,241,212,190,118,135, 36,243,125,149, 28, 79,223,116,245, 1,189, 44,119,128, 55, 64,130,
+205,178, 92, 11,162,204, 59,102,113, 59,120,111,149, 41,142, 56,101, 59,243,173,204,128,150,178,204,248, 2, 36, 77, 33,242, 57,
+169,201, 59, 70,147,138,154,150,246,205,227,141,100, 57, 25,106,244,166,146,130,244,120, 32, 49,212, 97,179, 69,150, 57, 44, 79,
+ 87, 56,127,112,143,186,156,239, 37, 11, 1,196, 50,247,153,211,144, 16,217,145,164, 20,113,216,110,177,189,221,161, 40, 43,156,
+223, 63, 83,187,152,140,186, 37,100,164, 40,115,246,221, 59, 84, 53, 29,248, 93, 23,212,159, 40,160,148,174, 11,232,251,128,182,
+105,201,119,159,128, 44,151,164, 52,175, 54,182,148,198, 14, 84,128, 25, 96, 98, 81,150,101,232,251, 65,121,234,116,232,228,202,
+162, 79, 49,170, 26, 62,165,136,190, 11,234,133, 31, 2, 89,252, 14,187, 13,186,182,195,234,252, 20,113,136, 56,236, 15,120,249,
+221, 43, 60,253,248, 41,234,186,198, 16, 56,177, 46,129, 25, 2, 94,255, 19, 36,137,142,175, 83, 8, 3,134, 48,160,107,123, 13,
+195, 33,208, 78, 67, 96,162,221, 30, 49, 70,236,182,123, 28,246, 59,188,120,246, 13,110,215,107,148, 85,137,122, 86, 97, 54,159,
+ 99, 54,155,211, 52, 32, 4,253, 18, 80,172, 43,189,191,253,110,139,217, 98,129,195,118,207,122,140, 74,175,105,226, 80,142,129,
+ 69,150,164,190,103, 5,126,238,149,226,183,190,186, 86,255,173, 4, 85, 8,178, 81,104, 77,214, 0, 85, 93, 3, 72,120,246,187,
+223,224,147,175,190,194, 71,159,126,137,139, 7, 15,176,187,189,133,113, 57, 82, 76, 88,174,230, 48,198,226,230,106,141,174,165,
+213,199, 47,254,230,175, 49, 95,157, 97,113,186, 66,123,220, 48, 98, 56,195,237,245, 27, 0,192,253, 39, 31,234,151,172,154, 47,
+241,213, 31,253, 33,222,189,126,135,183,223,252, 14,243,213, 25,202,122,134,155, 55, 95,227,241,231, 63,195,110,253, 14,222,246,
+184,255,225, 15, 81,214, 25, 16, 3,170,249, 28,229,172,130, 47,230, 72,254, 4, 87,207,255, 17,206, 12,200,139, 2, 89, 62, 67,
+ 53, 91,162,172,115, 12,161,193,126,115,131,246,112, 67, 34, 27,166,213, 73,231, 69,158,247,159, 98,251,254, 25,163,123, 39,156,
+124, 38, 48, 10,245,206, 26, 81, 53, 71, 84,243, 51,156, 61,120,138,197,114, 6,147, 58,248,204,162,154,213,152, 45, 22,152, 45,
+230,200,171, 26,245,252, 4,245,108,137,162, 94,194,103, 37,178,172,210, 14, 25,106,205,177, 48,174, 32, 2,157,113,112,190, 64,
+ 86, 84,168, 22,167,128, 43,144,140, 71, 74, 52, 34,141, 97, 64,232, 90,244, 66,246,211,180, 51, 70,161,106,105,102,225, 92, 14,
+235,114,248,124,134, 44,175, 96, 12, 59,104, 24,225,105,212,135,110,245,144,167,162, 49, 83,229,153,157,142,179,185, 91,148,180,
+ 54,245,107, 59,199, 29,160, 85, 71, 10,253, 30,171, 98, 52, 96, 36, 66,170, 34,154,187,219,164,180, 55,166,193, 49, 36,103,136,
+114,232, 49,212, 74,224, 36,214,194,186, 12,214,229,112,158,138, 31,159,207, 96, 93, 9,227, 10, 85,116,143,168,219,105, 23, 47,
+ 74,125, 34,169, 77, 69,119,233,142, 36,123, 82,160,164,187,220,123, 17,222, 25,214, 75,141,142, 17,233,138,237,168,120,183,164,
+ 70,143,156,219,145, 18, 93,123, 65,168, 10,179, 95,126,198, 52,222, 85,197,205, 19,119,132,172, 50,132,227, 46,148,182, 52,225,
+238, 75,103, 46,207,127,125, 94,138, 69,141, 11, 36,241,210, 39, 22,155, 25, 51,117, 49, 24,181, 89,139,123, 70,138, 79,128, 96,
+106,170,214, 55, 86,167,205, 52,157,224,144, 24, 22,135, 12,236,208,208,169,180,238,252, 19,239,246,169, 88, 10, 33,208,223, 43,
+147, 66, 22,211, 77,187,238, 24,199, 67,126, 42,126,251,103, 52,236,147,252, 84,243,207,254, 14, 1, 12,141, 5, 93, 82,145,241,
+ 8,183, 1,108, 94,144, 39,187, 40, 50,164, 52,162, 82,201, 51,105, 21, 11,155, 34,189, 17,171,118, 25,250, 42, 14,129,189,192,
+ 41,114,124,169,228, 6, 27, 20,101, 49, 34, 18,121, 44, 38,227,125,231, 61,251,171, 35, 83,194,162, 86,170,214,209,135,176,189,
+189,197,238,102,141, 24, 58,248, 44,199,201,249, 57, 22, 39, 11,250,243, 19,175, 57,237,202,157,238,141,221, 36,129,140, 2, 77,
+246, 88, 95,221, 32, 37,139,211,243, 21,202,178,196,108, 81, 97,177,172, 53,240,101, 68, 7,210,129,127, 60, 52,108, 11, 35,180,
+ 41,140,193,241,208,162, 57,146, 88,174,109,136,197, 45,106,111,192,234,251,146,209,158, 60,104,219,166,215,100,180,140, 15, 41,
+239,157,190,126, 9,158,145, 36, 56,241, 92,183, 71,217,143,199,201,104,218,168,215,255,197,179,151,240, 62, 71, 61,155, 33,132,
+ 1,235,235, 43,220,222, 28,240,224,241, 67,221,137, 11,227, 88,252,244,178, 34,232,218, 30, 93,215, 83, 30, 61, 71,174,246, 93,
+143,227,161,197,225,208,162,109, 90,180,109,139,166,105,121,170, 18,177,185,217, 96,117,186, 66,215,182,120,253,226, 57,190,249,
+237,215,164, 11, 88,204,113,114,186, 66, 8,129,191,108, 81,195,125, 36,195,249,176,219,163,172,107, 28, 15,123, 94, 99,176, 35,
+ 65,210,205,100, 55,101,160,209,166,121,150,147,208,207,123,120,103,176,219,108, 38,123,200,145,213, 45, 64, 12,231, 12, 3, 97,
+114,116, 77,139,188, 40,240,245,175,127,139,199, 31,125,140,175,126,246, 35,236,110, 55, 56,127,248, 0,151,175, 46,241,224,201,
+125, 20,117,133,215,207, 95, 78,178,146, 19,254,191,255,240,215,248,232,139,143, 17,187,195,152, 14,150, 18,190,251,213, 63,226,
+233,231,159, 35,207, 11, 20,101,129,159,253,197,159,227,242,249,115,180,199, 6,251,205, 53,230,167,167,120,251,245, 47,113,254,
+248, 51,116,125,196,241,246, 53,150,231,143,241,209, 87, 95, 33,245,123,210, 31,148, 57,117,140,245,125,172, 95,252, 18, 38,245,
+ 28, 62, 84,163, 94,158, 98, 54,207,225,204,128,253,102,131,102,127,203,156,118, 9,238, 24,128,212,195, 58,139, 7, 31,253, 4,
+135,155, 75,116,205,150, 39, 72, 73, 39,104,227, 14, 60,233,186,204,152,132,114,182,194,234,193, 71, 88,156,204,145,134, 14, 6,
+145,156, 15,121, 1,235, 61,140, 99, 16,146,245,176,220, 41, 75,183, 46, 62,124,234,110,232, 61, 88,151, 97, 24, 12,146,201,224,
+139, 25,170,217, 9,178,162, 64,215,247,172,155, 33, 93, 77,232,143,104, 14,183, 36,184, 75, 3,189, 46, 59,142, 31, 35, 12,217,
+ 98,157, 83,193, 26, 21,251, 57,242,162,254,231,109, 63, 60,230,165,142, 94,186,114, 9, 13,241,106, 43,213, 61, 47, 67, 75,192,
+222, 99, 25, 82,170,194, 61, 77,187, 71,234,220, 92,150,113,103, 74, 43, 48, 24,233,116,199, 3,147,194, 72,210,100, 41, 31, 53,
+ 54,152, 18,190, 50,184,108, 6,235,106,184,108, 6, 95, 44,224,124,141,100, 11, 88, 87,193,216, 2,198, 22,112,190,134,243, 21,
+172, 47, 97, 93,174, 7,156,140,253,199,104,228,120, 7,254, 35, 7,185,142,188, 89, 71, 51,122,156, 89,176,197, 8,105,202, 77,
+183,250,217, 8,213, 76, 86,115,114, 0,202,232,154, 18,202, 48,194, 93,100, 21,145,104,196,141,196, 5, 18,143,219, 97,100,236,
+205,193, 45, 12, 4,139,105,202, 11,176, 99,145,104,204,157, 72, 86,153,194, 90, 55, 6, 51,201,217,161,226, 65,123,119, 76, 31,
+ 83, 34, 82,161,209,236, 87, 22, 7,210,123, 18,106,166,132, 11,137,206, 33,207, 51,125,142, 56, 94, 81,138, 75,233,142,103, 92,
+139, 51,250,108,133, 83, 33, 22, 90,209, 79,221,225, 3, 76,130,207,135, 97,152, 28,228,230, 14,235, 93,239,209, 73, 65,247,207,
+255,115, 2, 52, 26,221,206,250,236, 76,233,110, 83,111,169, 18,179, 58,122, 32,171, 80,212,110,220,177, 42,122,140, 39, 37,187,
+145, 84, 53,137, 13,254,212,161, 58,141,227, 27,194,128,190, 31,198, 17,123, 98, 98, 24,135,120,200,104, 73, 50,204,227, 48,112,
+ 38, 56, 7,218, 51,241,168,107, 90,108,214,107,236, 55, 91,100,222, 98,126,114,130,106,190, 68, 53,171,245, 93, 80,228,231, 64,
+112, 23, 47, 55,194, 8,131, 32,161,219, 17,219,219, 91,196, 4,156,221, 63,195,108, 94, 3, 48,152, 47,102,186,118,144, 3, 62,
+165,196,244,187,136,162, 36,111,112,232,130,170, 45,250,182, 39, 91, 19,143,136,133,239,158, 82,130,227,137,129,207,156, 86,158,
+ 52,174, 49, 42,162,147, 95, 55,220, 17,139,162,218,121,199,211, 2, 67,221, 35, 39, 84, 77, 41,254,161, 15,232, 58,178,189,109,
+ 55, 55,120,251,230, 10, 23, 15,239,147,231,220, 57,188,121,245, 10,167, 23,103,168,231, 51,238,156, 7,132, 46, 48,119, 30, 35,
+139,153, 63,203,190,235,177,223,239,245, 75, 45, 0, 29, 37,134, 25,104,113,119,115,189,198,233,249, 57, 93,159,174,197,203,103,
+223,194,154,132,213,217, 10, 15,158, 60,225,135, 67,208, 47,130,238,180, 44,225,129,235,249, 12,205,225,128,148, 34, 19,217, 56,
+ 63, 96, 96, 66, 97, 24, 3, 97,172,115,240,121,206,133,146, 67,115, 56, 98,183,185,157, 12, 60,205, 8,201,152, 40, 76,140, 73,
+ 40,203, 10,137,153,204,247, 31,220,195,239,126,241, 75,228, 85,133, 15,191,248, 20,101,149,227,213,179, 87,200,203, 2,155,245,
+ 26,187,205, 86,199,175,224,142, 37, 14, 17, 95,254,228, 43,165,196, 25,107,209,119, 13,222,126,247, 2,159,252,232,199,248,241,
+159,252, 9,182,215,239,209,118,192,205,155,239,112,239,195,207,177, 93,223,224,222,227, 71,152,157, 62,192,237,155,111,176, 56,
+189,135,211, 7,143,177, 60,157, 51,102, 55,167,142,193,173,112,243,234,183,176, 38, 32, 70, 3,207, 7,122, 85,121,164,161,197,
+110,179, 70,104, 54,148, 65,206,234,122,154, 64,210, 61,112,250,224, 83,120,111,177,187,126, 65, 25,232,146,119, 16, 7,142,180,
+165,215,108, 13,237,211, 13, 6, 20,213, 18,167, 15, 62,193, 98, 89, 35,246, 13,186,246, 8,227, 50, 24, 62,196,157,203,136,110,
+152,229,100,196,178, 14, 96, 16,136,115, 57,237,191,179, 18, 46,171,224,124, 1, 88, 25,155,231,168,102, 11,204, 22, 75,248, 60,
+227, 80, 34,135,204, 91, 32,246, 8,205, 6,237, 97,141, 52,116,112, 54, 1,177,167, 85, 66, 12, 28, 62, 34, 43, 52, 94, 89,249,
+140, 45,150, 57, 63,220, 51,248,188,100,110,248,216, 89, 98, 50, 53,208,238,118,194,114, 31, 83,186, 44, 79,131, 70, 42,220,120,
+224,115,135, 47,193, 31,220, 85,201, 24,153, 81, 22,163, 16, 48, 70, 12,241,110, 23, 37,222,116, 57,232, 70,161,158,131,207,231,
+176,190,162,105,134, 47, 0,155,147,173,207,120, 56, 87, 32, 25,199,147, 14,203,208,149, 2,201,228,128, 45, 96,125, 5,227,114,
+ 62, 24,121,175, 29,122,237, 80, 19, 19,214,244,240,143, 99,168,201,116, 29, 43,141,216, 93,223,124,210,224, 40,176,224,140, 72,
+110,126,114,152, 73, 81, 33,187,229,164, 19, 9,185,126, 67, 24, 40,236, 40, 26,101, 5,168,229,111, 18, 19, 42,145,166,244, 8,
+ 51,250,204,211,164, 52,254,251, 28,255,124, 35, 49,168, 28, 35, 43, 94,119,249,124,113,135,251, 79,110,170,105, 52,173,252,119,
+167,251,127,163, 83, 28, 13,136,193,216,192,165, 9,230, 77,154, 44,107,238, 10,139,165, 75,151, 53, 40,144,116, 42, 51,134,123,
+197, 73,240,209,228, 94,152, 58, 20,204, 93, 39,133,193,221,215, 44, 69,168, 21,184, 15, 31,246, 86,113,222,102, 18,251,251, 79,
+119,238,134,139, 11,235,189,229, 40,196,113, 95,227,120, 31, 39, 99,189,162,204,244, 48, 10, 93, 79, 42, 63,107, 52, 43,216, 78,
+118,156, 25,119,160,224, 49,105,158,123, 56, 75, 68,180,190,239,168, 56,224,110, 44,207,115, 62,248,104,231, 36,130, 26, 39,251,
+ 48,190,161,134, 48,224,176,223,226,118,189, 65,232, 58, 20,101,129,122,113,130,147,179, 83,148, 85, 73, 20,187,204,107,229, 53,
+ 4,134,227,176,101,204,178,255, 57,197,136,221,237, 22,113,136, 56,189, 56,197,189,135, 23,164,114,229, 67, 51, 14, 52,234, 78,
+145,170,195,122, 49,131,243, 14, 93,215,163,235, 58,180, 13,253,147,162, 82, 61,202,178, 68, 94, 82, 33, 18,135,136,178, 42,120,
+180,147,208,182,129,187,126, 16,206, 51,141,235,130,209,182,101, 20, 17, 43, 54, 46,103, 45, 77, 8, 88,144, 49,132, 65, 65, 55,
+116,160,247,180, 95,111, 91, 28,118, 7, 92,190,126,131,178,170,113,113,255,156, 86, 6, 77,139,231,223,190,194, 71,159,126, 56,
+190, 55,134,164,116, 93, 64,215,145,186,157,168,112, 3,218,230,136,174,105,113, 60, 54,104,142,157, 38, 20,229, 98, 99,180, 35,
+135, 96,187,185,193,233,197,153, 38, 13,246, 93,131,183,175,222, 32, 38,131,199, 31, 61, 69, 89,150, 10, 23, 25, 87, 81,244,101,
+ 12,221,145, 96, 16,161, 71,232,123, 2,159,100, 94,215, 48,194, 74,150,107, 2, 0, 85, 85,106, 26,223,126,183, 67,223,181,218,
+157,219, 73, 78, 1,197, 63,142, 57,218,101, 93, 97,191,219, 97,119,251, 30,235,171, 53,206,238,221, 71,138, 3,242,106,142,147,
+147, 26,195, 64, 28,254,223,253,195, 47,185,139,225,181, 72, 94,163,168,231,248,197,127,249, 57,126,242,199, 63,155,196, 80, 90,
+ 56,151,225,250,242, 53,206, 30, 62,196,124, 57,195,155,239, 94, 32,203, 61,169,255,151, 43,236,174,222,226,225, 39, 95,224,253,
+243,223,227,228,236, 20,245, 98,129, 7, 31,125, 12,103, 2,242,156, 84,242, 61,150,216,189,127, 9,239,122, 12, 33,194,101, 5,
+ 22, 39,167,168,234, 28,113,232,176,187,189,193,113,119,171, 2, 76,239,189, 38,127, 1, 3,234,249, 57, 86,247, 63,192,229,179,
+255,166,247,189, 0,153, 8,249, 74, 78, 6,195,161, 29,116,104, 58,172,238,125,136,229,233, 9, 98,104,208,119, 71,197,203,250,
+ 44,131,147,104, 96, 7, 78,161,115, 10,212,160, 14,216,113,103, 94,194,250,146,242,174,163,129,113, 25,230,139, 37,225, 95, 13,
+209, 18,173, 51, 72, 49,160, 61,238,113,220, 94, 99,119,115,137,238,184, 65,232, 15,232,154, 29,186,246,128,230,112,131,174,217,
+ 33,198, 14, 67,104, 53, 99, 93,196,112,145, 69, 87,196,166,231, 20,188,172,212, 66, 63,106, 94,183,229,174,124, 20, 76, 9,106,
+ 84,124,197, 98, 93, 26,195, 81,160, 99,101,141,232,116, 30,198,121,190,110,110, 12, 27, 73, 24, 19,238,144, 84, 45, 77,207,148,
+129, 5, 96,147, 3, 93,247,239, 25,165,220,101,164, 75, 72, 24,119,189,198,121,248, 60, 31, 31,208,214, 33, 25, 71, 92, 49, 51,
+134,229,200,107, 52,214, 43,255, 34,114,230, 65, 24,194, 8,170,249,126, 52,167, 76, 51, 20,158, 50,194,101, 20, 78, 50,233, 27,
+137, 95, 78, 26, 1, 42,232,205, 40,186, 98, 32, 14, 1,181, 60, 89,112, 49, 58, 86,198,201, 0,249,217,147, 76, 63, 32, 98,182,
+239,117,154,176,236, 93, 79,227,250,130,127,134, 78, 86,153, 5,111,120, 10, 67,148, 61, 22,181, 9,180, 6,105, 18,207,107,198,
+159,195, 26, 11, 90,131,102, 58, 89,138, 28,245, 43,154, 18,105, 98, 37,101, 83, 20,244,146, 58, 72, 77, 5, 1,217, 66,223,211,
+234, 75,149,243, 78, 57, 9,113, 24, 65, 91,130,171, 86,209,164,168,220,133,209, 46, 25,239,186, 34,113,119, 15,115,216,137, 0,
+209,170, 6,203,232, 97,239, 88,248,236,249,208, 55,255,196,179, 62,221,196, 88,164, 68,177,171,118,220,109, 11,119, 93,236, 88,
+102, 2, 87,200, 11, 30, 75, 73,146,150, 10,114,172,226, 37, 29,167, 89, 13, 33, 16,139,156,225, 16,121,158,161,239,122, 85,227,
+ 58,111, 73,208, 37, 10, 69, 79, 74,198, 65, 41, 81, 73, 81, 10,206, 90,244, 93,135,205,122,131,195,110,135,208,119,240, 89,129,
+217,201, 10, 37,191,254, 44,247, 58,190,137, 42,118,136,122,163, 58,103, 81,205, 10,244, 93,139,174,235, 81,214, 21,170, 89,141,
+ 44,203,148, 83, 31, 99,164,224, 17, 86, 35, 27, 24, 18,142,117,129,133, 35,134, 11, 8,222, 81, 69,186,241,229, 64, 23, 86,185,
+181, 22, 93,219, 35,203, 28,103,196,123,148,101, 78, 35,116,217, 9, 59,163, 54, 56, 17, 30,138, 79, 85, 34, 18,199, 66, 32,160,
+109,105, 28,223, 28, 91, 28,143, 45,117,248, 6,120,247,246, 26,231,247,239,179, 10,212,224,230,250, 26,109, 27,240,228,131,199,
+172, 94,141,202,144, 86, 46,124,215, 49,217,171, 69,115, 60,162, 57,182,176,214,240, 90,192,106,248,204,152, 73, 28,208, 53, 71,
+228, 5,209,232, 72, 83, 1, 92, 93, 94,226,234,237,123,156,156,157,226,236,226,130, 70,192,186,239,146,244, 44, 78, 52, 10, 1,
+153,119, 56,236, 14, 40,171, 28,121,153, 79,210,183,136, 32, 39,233,121,206, 89,148,117,173,163,174,155,247,215, 92, 56,210, 61,
+ 7,246,237, 71, 22,229,121,239, 84,181, 92,148, 5, 98,160,244,175,245,213, 37,125,238, 53, 65, 80, 54, 55, 91, 60,249,244, 3,
+154, 16,132,110,228, 55, 15, 3,170,249, 18, 9,192,245,219, 55,184,189,217,225,236,254, 3, 62, 72,168, 83, 88,157, 95, 96,121,
+182,194, 55,191,252, 21, 22,231,143,176,185,124,129,139, 15, 63,199,229,215,191, 66,178, 5,118, 55,215,168,170, 12, 69, 85,227,
+244,222,125,156,221, 59,197,113,183, 69,215,118, 56,116, 5,250,227, 22, 38, 30,176,189,217, 32,165,136,211,243,115,204, 79,230,
+ 24,250, 30,187,219, 27,242,111,115,158,130, 70,133,114,151,238,156,199,147, 47,255, 16,111,190,254, 57,135,184, 48,127, 32,209,
+ 30, 47, 14,228,217, 55,198, 34, 43, 42,222, 79,123,212,171, 15,176,186,184,128, 77, 29,186,195,142, 11, 34,135,188, 40, 20,186,
+100,144,144,134,128,161,111, 97, 18, 21, 86, 89,158,243, 3,178, 0, 76,166,157,166,203, 10,248, 44,195,108,126,194, 46, 25,234,
+222,178,140, 30,120,161, 61, 98,119,123,137,221,230, 45, 66,191, 69,140, 29, 98,236, 49,196,158, 99, 92, 35, 98,236,209,183, 7,
+132,190, 65,215, 30, 48, 12, 61,226, 16,116,135, 25,120, 37,228,157,211,201, 94, 86,212,176,206,243,190,148, 0, 65, 81,125,215,
+ 96,109, 8,219,144, 66, 15,231,243, 81,140,102,238,118,232, 18, 26, 66,234,118, 81, 20,155, 81,200, 6,139, 40,187,242, 59, 20,
+ 57, 14,236, 16, 0, 74, 28,197, 80,116,160,123,248,188,134,117, 57,133,229, 88,210,100,168,154, 95, 50,201, 13,168,136, 48, 73,
+227,116, 37,124, 36, 74,186, 90,154, 76, 65, 85,108, 53, 76, 50,198,211,157, 61,181, 28,148, 41, 78, 85,248,230,142,197, 76, 96,
+ 39,145, 21,231, 70,199,219, 78,133,149,138,116, 29, 2,195,200, 28,226, 16, 88, 60,152,184,224, 20,165,248,168, 40, 31, 99, 80,
+141, 30,152,114,141,192, 68, 57,113, 54, 56,231,190, 55, 61,241, 42, 94, 27,113,171, 35, 43, 64,166, 10,100, 87,131,226, 93,237,
+100,146,102,184, 72, 85, 66, 46, 79,251,100,242, 70,241,194, 20, 58,214,117,129,167,133, 14,211,122,202,186,145, 99, 34, 25, 22,
+ 49,113,215,143,201, 58, 99,204,229,229,207,100, 60, 99,172, 76, 43, 39, 54, 58, 57,199,244, 32,159,216,169,197,105,112,135,132,
+ 40,136,103,126,118,170, 85,205,140,147, 13, 37, 69, 78, 51, 87, 37, 27,136,132, 31, 19,252, 96, 26, 5,111, 72,212,241,166, 72,
+190, 92, 58,180,248,129,157, 6,164, 24, 52,212, 64,152,230,113, 24, 16,195,128,188, 16, 34,221, 64,225, 46, 44, 76, 40,203,156,
+198,220,153,215, 55, 64, 1, 31, 30,158,133, 92,114, 96, 2, 84, 93,249,140, 16,128,210, 69, 14, 33,160,217,239,209, 29,247,136,
+ 67,192,226,100,137,197,234,148,226, 43,237, 24,170, 16, 99, 66,158,231,188,179,206, 49, 91,212,152,205, 43,238,156,105, 71,156,
+ 23, 57, 19,218, 60,142,135,150,200,111,121, 70, 66,191,182, 67,115, 56,234,184, 93,246, 82,206,123, 21,211,137,136, 46,113,128,
+139,168,213, 83, 28, 80, 20,217,196,107,106, 39, 20, 41,154, 74,116,109, 96, 95, 56,173, 15,132, 77, 95, 85, 5, 23, 70,164, 45,
+ 24,134,129,173, 64, 64,215,117,228,255,230, 49,107, 8, 1,215,239,222,193, 88,143,123, 15,239,177, 98,191,199,183,191,127,134,
+147,179, 51,148,117, 73, 30,247,152, 24,153, 8,218,165,247, 61,246,187, 61,154,134,246,230,202,199,215, 47,137,213, 85, 74,226,
+ 93, 82, 74,195, 29,145,144, 1,208, 28,182,184,124,245, 6,109,211,225,193,147,199, 12,154, 8,228, 51, 6, 56,146, 20, 44, 50,
+164, 16,152,195,118, 7,231, 61,178, 44,215,241, 59, 56, 36, 70,174,167, 49, 22, 85, 77,249,224,161,239,113,179, 94,223, 17, 71,
+ 10, 95, 91, 83,237, 88, 36,231,125,198,222,248, 35,133,201,108,111,112, 60,182, 40,170, 26,222, 39, 92,191,187,166, 95, 63,144,
+ 26,159, 30, 96,116,144,214,243, 19,130,130, 96,192,175,127,254, 75,124,254,227, 31,234,248,171,172,103,248,217, 95,252, 25,190,
+249,135,127,192,234,254, 35,248,204,227,228,222, 3,236,111,174,145, 85, 21,251,169, 41, 65,109,182,152,225,226,233,135, 72, 67,
+139,246,112, 64, 19, 10, 28,118, 71,196,110,131,219,245, 45,250,174,199,236,228, 20,213,108,134, 33, 4,236, 55,107,116,205,142,
+ 59,148,140,194, 54, 44, 61, 88, 8,156, 18,241,244, 7,127,138,155, 55,207,208,236, 46,201,230,153, 57,205, 12, 39, 27, 31,237,
+103,179, 98, 78,226,181,172,194,108,245, 49, 78,239, 63, 2, 98,192,238,246, 10, 41, 5, 21, 13, 9, 42,185,111, 41,201,175, 57,
+ 28,145,210,160,214,157,161,239,128,100, 48, 36,135,152, 40, 37,206, 88, 7,159,229,152, 45, 78,244,251,158, 21, 5,107, 76,142,
+ 56,238,214,216,221,190, 69,215,220,234, 62,255,206,252,209, 90, 13,188, 24,239,171, 30, 93,123, 64,232, 91,205, 85,151, 83, 72,
+ 58, 76, 57,216,197,139, 12, 67,216,230, 49,115, 28,227,193,233, 61,172,203,117, 36, 79, 48,155,168,221,177, 28, 20, 50,197, 74,
+176,128, 40,237,173,163, 61, 61,255, 94, 64, 82, 22, 3, 6, 9,237, 0, 52, 58, 89, 34, 83,197,142,102, 93, 9,235, 72, 97, 47,
+ 5,129, 4,205, 24,195,214, 43,231,244,224, 67, 26,115, 42, 68, 40, 74,205,209,160, 66, 54,249,185, 49, 37,141,106, 78,147,241,
+ 54,237,172,205,104,187, 27, 99,177, 20,255, 42,232, 85,121, 14, 73,160,207,104,223, 98,108,233, 36, 80, 68,178,206, 97,173,134,
+176,200, 72, 94, 68,142,146,136, 22,185,113, 96, 96, 40, 95,247,187, 33, 42, 73, 45,122, 24, 33, 43, 19, 81,163,238,208,133,195,
+206,159,115, 76,162,108, 55, 60,133,201, 52, 69,146,118,235,118, 50,242, 7, 71,132, 91, 13,197,113,206, 82, 1,155,198, 68, 55,
+217,133,247, 93, 79,211, 37,190, 78,116, 29, 6, 18,187, 41,162,151,252,254,131, 10, 11,217, 78,171,180,198,105,192, 79, 82,132,
+186,157, 8, 58,133,127,161,215, 67,249, 0,162,137,136, 99,194,154, 53,218,161, 79, 27,237,239,227,129,245,223, 26,238, 51,238,
+217,173, 49, 81, 31,160, 69,145,241,184,211,142, 62, 71, 46, 65, 6,222, 37,200,131, 94,188,125,222, 75,218,205, 72,219,161, 46,
+136,198,207,242,133, 52,214,178,122,157, 46, 64,198,172,120,173, 84,140,101,241,205, 72,244,201, 11, 47, 32, 64,133,148,136,234,
+158,246,228, 13,246,219, 29,142,135, 35,202,178,192,108,177,196,201,233,138,210,183,152,147, 45,187, 14,231, 44,199,126, 38, 85,
+ 71, 38, 22,127, 29,246, 45,202,186, 70,201,150, 54,239,105,237, 64, 1, 40,253,152, 17, 47,192,127, 79, 15, 84,217,247,122,239,
+ 84, 96, 17,194,228, 6,229,221,142,168, 65, 73,232,146,152, 38,197,251, 49,238, 52,133, 73, 79, 5, 76, 36,125,131, 76, 29,216,
+163,126, 56, 52, 52,214, 55,156, 18,198,215, 36,165, 1,175, 95,188,197,114,181,226, 68,161,128,190,109,240,234,249,107,124,240,
+ 49,117,165, 83,133,123,223, 81,135,174,157, 3,160, 95, 74,218,253,147, 24,197, 77,252,237,242,175,230,216,106,174,121, 2,208,
+245, 13,214,239,223,225,234,237, 53,197,136,242, 67,222,104,108,231,248, 96,238,219, 22, 69, 85, 81, 6,187,181, 40,171, 66,251,
+164,200, 90, 2,217, 13, 57,231, 48, 91,206, 73,156,210,245, 8,125,171, 98, 27, 99, 45,165,216, 9,125, 43, 4,181,229, 56,159,
+ 17,248,166,111,117, 90, 32,104, 87,196, 1, 69, 61, 67,123,216,163, 57, 54, 56,189, 56,163, 46,105, 32,110,120,189, 88, 98,127,
+187, 65,140, 3, 46, 95,190,192,236,100, 73,133,135,181,248,233,159,253, 41,214,111,222,224,250,205, 43,216,124,134,161,223,163,
+ 90,158,161,217,188, 71, 86,159, 98,127,243, 14,179,229, 2,179, 69,141,147,139, 7,168,102, 21, 54, 87, 87,104, 67,142,182, 77,
+ 24,154,107,108,111,119,136, 67,194,217,253, 7, 88,157,159, 1, 6,184,121,255, 30,237, 97, 75,157,201,200,101, 3,192,186,131,
+ 20,112,246,240, 75,164, 24,113,243,246, 87,240, 89,129,188,170,120,101, 6, 94,119,116,140, 66,206,145, 23, 21,202,217, 9,150,
+ 23, 31, 99,117,239, 9,138,220, 97,115,245, 26,161,107,232, 62,212,113, 37, 49, 40,182, 55, 87,216,221, 94,163,107,246,104,246,
+ 91,244,237, 30, 93,123, 68, 31, 18,218, 46, 32, 38,203,182, 35, 32,203,201,233, 80, 86, 37,121,202,173, 35, 20,111,104, 17,186,
+ 29,218,195, 13, 66,183,103,143,238, 36, 63, 44, 37, 85, 76,139,154, 89, 66, 96,160,185,223, 29,186,238,136,148, 8,243,203, 78,
+ 52, 30,115, 78,211,216, 44,167,249,121, 18,248, 89,167, 15, 74,249,187,105, 87,202,100,204, 62, 16, 57,142, 15,158,196,147,133,
+196, 4,185, 36,153, 7,252, 12,138,137,138,223, 24, 73, 5, 45, 74,244,148,164, 99,114,220,129,141,123,222, 24,147,142,219, 37,
+221, 79,108,121, 17,102, 60,120,172, 99,254, 61, 70,255, 57, 23,244,218, 33,114,147, 53,196,132,158,217, 13,137,237,104, 67,164,
+232,209,200, 35,108, 57, 64,233,215,227,232,195, 79,211, 29,187,157, 36,132,241,243, 16, 78,191,239,163,165,111, 50, 97,147,192,
+ 18, 41, 26,162,216, 26,253,100,130,106,198,168, 83, 88, 61,176, 41, 45, 19,186,143, 23,145,157,124, 63,163,210,251, 8,108, 51,
+134, 3,217,209,153,160,247,134, 28,192, 78, 29, 14, 66,218,163,195,221,112, 3,224,148,161, 32, 19,229,190,235,181, 96,145, 51,
+101,154, 14,151, 56,143,158,174,111, 28, 83, 71, 21, 69, 30, 57,242, 85,138,129,200,248, 88, 66, 29, 27, 41,142,227,192,186,132,
+120, 55,172,197,140,234,159, 52,213,183, 11, 89,212,140, 66, 57, 61,166,229,245, 79, 38,230, 90, 60,136,232, 88, 14,248,105, 2,
+ 31,238,134, 10,217,253,118, 71, 7, 75,178,122, 33, 44, 91, 67,164, 19, 29, 66, 15,199,163, 89, 49,222, 75, 52,226,192,240,153,
+208,135, 49,227, 24,156, 70, 6, 25,163, 68,164, 33,242,190,124, 76, 29,114,146,244,198,100, 46, 24,138, 70, 53,119, 60,121, 22,
+ 62,119,200, 10,178,215, 89,217, 63,243,174,213, 32,225,184,219,227,230,154,236, 63, 62,207, 81, 47, 23,168,231, 51, 61,156,172,
+179,204, 61, 55,234,177,148,139,211,183, 29, 54, 55,183, 56, 30, 90,204,151, 75,204,151,115,142, 28, 13,104,142,173,170,242,187,
+142,246,224,244, 64,243, 99,128, 8,239,118, 68, 0,226, 61, 77, 25, 4,206,226, 29, 89, 5, 19, 8,153, 75,234,245,168,241,142,
+194, 14,142, 98,157, 99,237,130,242,173,249,131, 47,120,119, 73, 49,182, 57,199,128, 58,100, 89,142, 56, 68, 52,199, 29,188,207,
+240,228,131, 71, 40,248, 90,221, 92, 93,161,239, 6, 60,122,250, 80, 21,253,161,239,153, 52,149, 70,180, 47,167,213, 89,249, 2,
+ 25, 51,106, 1,120, 71,228, 88,125,187,190,186,193,234,108,197,171,149, 0,147, 18,246,219, 27, 92,190,122, 75,104,211,122,166,
+ 7, 13, 56,174,214,176,224,232,184, 63, 98,182, 88,168, 56,141, 16,182, 99, 82,148, 99,215,131, 84,225, 69, 89,194, 57,139,195,
+254,192,175,153,190, 34, 86,209,142,142,239, 75,175, 24, 80,242,175, 2, 93,219,168,192,101,177, 58,195,238,118,131,208,247, 88,
+172, 78,240,245, 63,254, 26,255,238,127,255,119,248,224,243, 79,121,149, 2,100,229, 12,229,172, 66,119,220, 97, 8, 1, 93,215,
+224,230,253, 53,206,238,223,199,211,207,191,196,234,108,133,175,127,249, 11,184, 44,199,226,100,134,243, 71, 31,224,230,205,105,
+ 79, 91, 20, 0, 0, 32, 0, 73, 68, 65, 84,183, 88,222,127,130,195,250,146, 92, 13,222,225,228,236, 12,203,139,251,104,247, 27,
+172,215, 71,244, 49,199,241,246, 45,110,215,132, 44, 94, 93, 92, 96,113,122, 14,107,128,205,250, 6, 93,115,224,107,238,244, 97,
+ 41,163, 66, 99, 12,102,203, 7, 56,123,252, 49,222,126,253, 95,128, 20, 81,205, 78, 80,215,149,222, 23,125, 71,247,168,245,148,
+232,230,179, 18,213,226, 30,206, 31,125,140,170,174,112,220,222,234,104, 27, 41,162,111, 27,196,208,163, 59, 30,209,182, 13,175,
+149, 70, 91,161,116,159, 98, 49, 35,133,177,101,171,219,140,199,242, 57,239, 91,123, 26,161, 55,123, 52,251, 53,237,200,229,129,
+149, 70, 74,150,115,153,118, 62, 50,174,150,206, 38,113,128, 81, 98,182,121,215, 82, 8,143,181,208, 68,193,209,234, 52,142,119,
+101,239, 45,193, 34,210, 33, 81,151, 60,238,166,105,194,150,116, 74,166,222,105,177,199, 1, 24, 88,161, 45,248,107, 76, 34, 89,
+ 99, 74,176, 54, 39, 33,153,201,238,210,213,141,213, 8, 80, 99, 51, 22, 16,242,193, 26,185, 80,230, 12,239, 33, 70,180, 13,113,
+ 38,186,190, 67,215,117,180, 10, 11,100,155, 37,155, 41, 93,143, 97,160,253,182, 40,199, 41,218,115,224, 17,247,221,142,119,186,
+ 27,150,195,125,252,181, 56, 10,183,184, 43,159,166,196,129, 53, 6, 41, 6, 45, 22, 8, 47,157,233, 84, 65,227, 70,195, 72,184,
+ 35,241, 92,212,105,192, 84,160, 40,184, 93, 41,182,232,247, 74,167,110,217, 97, 97,238, 8,202, 98,148,215,102, 38, 22, 67,167,
+ 66,190, 81, 33,207,214,232, 44,231,191, 99,124, 78, 73, 55, 43, 29,173,132,113,137, 94, 76,193, 73,102, 18,151, 58,121,230, 26,
+ 3,100,158,119,246,102,146,115, 63, 1,207, 64, 83, 15,157,174,199, 36, 9, 81, 86,165, 42,220,140,152, 60,191, 39,171, 6,221,
+169,143, 14, 30, 43,175,141, 39, 24,110, 18, 54, 35, 13, 45,237,210,199,224, 24, 59, 41, 14, 68,224, 39,207, 64, 27,251, 30,206,
+146, 50, 61,231,195,128, 42,115, 26, 59, 65,192, 30,102,140, 94,204,242, 81,145, 56,142,164, 29, 83,139, 44, 41, 53, 57, 68, 1,
+147,152, 63,201, 60,151,125, 1,209,181,204,228, 3,177, 19, 95, 32,231, 41,195, 32,244, 81, 59,117, 51,217,111,201,239, 5,119,
+147,155,155, 13,186,166,161, 73, 64, 81,162,154, 47, 80,148, 37,234,121,173, 7, 60,237,184, 39, 20, 50, 86,241, 55,135, 35, 14,
+187, 61,178,130, 44, 75, 4, 96,161,131, 11,140, 59,148,155, 39,227,213, 66, 8,145, 99,101,163, 22, 60, 50, 14,177, 50,226,233,
+ 3,218,182,225,174,131,174, 69, 94,228, 12, 94, 25,101,219, 33,144,165,172,239, 58, 28,143,237, 24,219,103,104,191,153, 23, 5,
+ 22,203, 37,138, 34,135,247,142, 38, 19,243, 25,156,183,168,103, 53,242,204,225,246,230, 22,247, 30,222,199,201,233,146,248,234,
+185,199,229,235, 75,172, 88, 80, 72,239,103, 80,241, 33,197,170,210,151,109, 96, 26, 27, 89, 2, 69, 48,101, 71, 17, 36, 87,243,
+251,237, 22,171,211, 51,221,111,211,196,100,143,227, 97,135,188,200,113,241,224, 33, 23,101,137,109,116,137,163,104, 29,246,219,
+ 45,165,181,109,183,196,250, 47, 75,101, 82,203, 8, 76,236, 33, 68, 37, 36, 52,108,115,108, 53,119, 94, 50,166,101, 85,227,179,
+ 76, 83,146,196,195,109, 77, 68,232, 26, 13, 61,168,102, 11, 92,191,121,131, 97, 72, 88,157, 45,241,205,175,127,131,155,171,107,
+184, 60,199,167, 63,248, 20, 49, 70,204, 87,231,100,233,219,221,114, 17, 58,224,245,179, 23,248,224,243, 79,241,227, 63,249, 67,
+252,221, 95,253, 39,164, 24,113,114,239, 17,246,183, 27,236,111,215,200,235, 37,182,215,107, 84,149, 39,221, 68, 89, 34,171, 22,
+200,114,135,235,203,107, 4, 84,216, 93,191,194,250,253, 26, 67, 8,168, 23,115, 84,243, 19, 24, 3,236,119,123,180,135,221, 24,
+148, 1,139, 44,203,225,189, 81,252,164,207, 10, 60,254,226, 95,224,229,175,254, 51, 98,108, 73, 41, 63,155,241, 62,150, 2, 35,
+250,190,165,233,138,179,176,222,193,231, 5,150,231,143, 96,173,193,238,118,141,174,107,224,153,170, 54,198,134,210,222,154,114,
+236,229, 80, 76,188, 7, 38,175, 56,201, 90, 28,103,217,159, 32,243, 14, 62,167, 61, 49, 57, 37, 2, 98,232, 17, 58, 18,191, 13,
+129, 44,107,130, 33,149,221,180, 68,160, 26, 41, 90,248,193, 29,153,252, 53,210,195, 70,124,107,215, 30,168, 40,100, 5,180, 49,
+208, 17,244,157, 24, 82,201,242,150,208, 26, 62,136, 52,155, 91,132,116, 60, 53, 27, 98,212, 93,251,192, 7,169,170,214, 37,154,
+115, 32,193,236, 16, 5,243,156,235,190,157,158,139, 28, 47,106,198, 98, 33,175, 22, 28, 25,234,184,168,100,174, 56,123,223, 67,
+ 8,232,218, 14,109,115,196,126,183, 65,115,220,163, 61, 30,176,189, 93,227,176,223, 81,113,213, 7,116,125,207,135, 60, 61,115,
+194, 16,180, 99, 36, 33,155, 88,172,160,221,240,247,119,236,162, 35, 16, 61,140, 50,139, 34,121,236,105,194, 38,147,140,129, 74,
+118, 67, 83, 44,162, 60,122, 42,164, 18,107,161, 32, 86, 51,175,215, 72, 86, 30, 73,247,246, 36,234, 75,162, 67,144, 36, 63, 73,
+102, 99,110,187, 40,237,169, 43,183, 74, 11,116,124,157, 40,110,122,132, 27, 89, 3,118, 95,184, 9,136,136,166,142,214,102, 26,
+ 87, 43,170,118, 17, 15, 78, 83, 2, 9,253,237, 88,177, 62,242, 85, 70,192,205, 24, 43, 60,240,212, 68, 34,156, 49,205, 75,103,
+244,185,136, 37,167, 10,119,113, 20,105,186,156,172, 7, 49,229,179,143,163,123,197, 97,167,169,192,109,156, 24, 37, 13,134,153,
+140,225,217,114, 43,108, 17, 5,187, 25,123,103, 23,207,247,187, 65, 28,122,142,224,172, 56,123,121, 80, 15,156, 68,157, 74,192,
+134,136,188,140, 1, 98, 8, 35, 5,140,171, 12,129,143, 16,240,128,254,153,101, 78, 1, 13,134,147,223,136,149, 27, 21,205,106,
+172, 65, 81,120,100,153,213,232, 79,177,121,249,140,246,234,224, 49,177,153, 78, 17,216,191, 77,187,147, 12,109,211,226,184,223,
+ 35,116, 29,178,204, 99,121,122,130,197,201, 9,170, 57,237, 33, 19, 70, 17,199, 48, 16, 49, 79,130,108,226,208, 99,253,254, 26,
+ 41, 25, 44, 79, 79, 80, 86, 5,135,200, 36, 37,209, 21,101, 6, 3,203,194, 56, 76,132, 28,244,224,145, 15,192,106, 36,165, 80,
+157, 70,123,131, 36, 16,201,158,170,239, 8,186,210, 54, 13, 17,224, 98, 68,203, 74,245,190,167,255,100, 89,134,170,174, 49,155,
+ 47, 52,163,157,136,120, 37,140, 33, 60,239,250,234, 26,128,197,189, 7,247,248,115, 50,104,219, 6, 47,158,189,198,135,159,126,
+168,175,217,178,226,158, 98, 89, 51,238,116, 5,110, 48,230,204,123,239, 24,174, 0,173,104,223, 95, 94, 98,121,186,226,130,104,
+224,162,166,199,250,253, 59,180,199, 22,159,254,224, 83, 24,174,110, 69,188,150,152,115,217, 28, 15,168,234, 26,161,107,208,247,
+ 61, 81, 2,141,213,116, 43,242, 1, 71,117, 18,212,243, 26, 41, 69,181, 23, 90,182, 16, 10, 3, 64, 4, 55,214, 57,173,150,243,
+178,226,221, 60, 85,180, 69,185,192,195, 39,231,232,142,123,216,172, 64,223,182,188,159, 12,216,111,118,152, 45,151,152, 45,102,
+168,230,115, 28,119,155, 73,106, 20,197,250,254,228, 79,255, 16,191,253,249,223,161,107, 91,248,188,192,124,117,134, 98,182,100,
+ 1,166, 69,230, 3,170, 89, 73,247,105,158, 97,121,118,134,245,187,119,104, 99,137,227,205, 37,174, 47,223, 35,166,136,162,240,
+152,175,206, 49, 95,212,136, 41,226,184,219,170,191,120,244,245,122, 26,175,115, 55,252,232,243, 63,192,155,223,255, 61, 97, 96,
+173,199,242,244, 2,121, 81,114, 84,114,196,126,115,139,161,239,224, 88, 93, 93,148, 21, 78,238, 63,165,233,198,230, 22,125,215,
+232,158,216,231,149,146,212, 52, 88, 36,142,241,153,214,149,136,200, 16, 6, 32, 38, 58,184,242,188, 64, 61, 63, 65, 85, 87, 40,
+103, 51, 62,140, 7, 74,190, 75, 3, 66,119, 68,215,236, 32,234, 36,101,172, 39, 14, 85,241,126,226,193, 5,143,198,253, 68, 36,
+ 52,142,103, 5,171, 41,120,213,174, 59,162,235, 26, 94, 25,181,228,113,103,162,157,160,162,133,185, 50, 76, 56,235,194, 9,215,
+ 7,249, 16,116,189, 5, 99,209,115,163, 34,163,207,190, 15,128,241,186,231,164,115,209,115,119,157,116, 63,174, 94,109,101,143,
+243,238,216,230,164, 12,103, 11, 32, 21, 79, 60,202,103,171, 89,223,245,104,154, 3,218,166,225, 53, 29,123,169,141,231, 46, 54,
+241,193,223,146,232, 49, 70, 14, 17, 1, 31,242, 29,239,171,105,228, 30,181, 91, 78, 58,202, 7,143,214, 85, 64,167, 71,138,168,
+177,167,182, 43,126, 97,201,232, 20, 13,204,241, 55, 83,166, 45,192,236,115,232,123,178,206,179,160,208,241,251,247,204,204,103,
+123, 95, 28,113,182,186,131,215, 16, 45,167, 62,121,213, 95,241,159, 51, 18,212,103, 51,205, 13, 17,220,170,172,111,100,100,237,
+188,215, 2, 65, 16,176, 36, 72,148,213,225,168,188, 39, 65,101, 82,183,145,138,247,120,125, 16,239, 88,211,146,134,186, 76, 5,
+104, 73,161, 51,172,151,210, 81,251,228,207, 73,240, 86,156, 0, 96,205,100,231,109, 70,199,130,153,146, 18,229,240,214, 48,161,
+ 72, 86, 90,235,120,202, 57,177,240,106, 92, 45,199, 16,203,238,221,140, 60, 25, 86,191, 3, 93,211,208,167, 96,188,238, 53,169,
+123,151,196,158, 65, 73, 94,100, 87,227, 64, 1,102, 75,167, 56, 32,116, 61,139, 50, 0,239, 28,239,216,233,193,219,235, 14,130,
+118,186,146,213,237, 89,197, 8, 67, 63,139,212,243,134,197, 83, 17,158,247,226,196,136,151, 61,114,186, 99,101,202, 25, 28, 35,
+158,241, 44,231,236,245,216, 99,191,221,146, 74,222, 59,204,230,115,212,243,153, 90,129, 66,224,221,191, 78, 14, 12, 41,193, 15,
+ 7, 92,189,125,143,208, 71, 44, 79, 87,196, 29,103,225,140, 87,139, 12, 70,127, 42,135,204, 20, 37,197,153, 58, 79,126,127, 25,
+243,123,111,225, 50, 74,158,138,145,119,230, 34, 82,234,169,130,183, 22,216,239, 14,232,218,158, 38, 6,251, 3,218, 35, 85,239,
+212, 85,211,107, 93,174, 22, 56,189, 88, 81,146, 24,119,170,146,207, 76,100, 61,135,215, 47,223,226,244,226,140,130, 67,120,122,
+176,189,185,193,225,208,225,201,135,143, 40, 90, 52,243,204, 30,240,252,160, 76, 10,163,160, 52, 62,190, 46, 24, 87, 12,146, 76,
+213, 53, 71,212,243, 90,247, 83, 98, 37,219,111,214,216,220,220,226,193,211, 39,152, 45,150, 28,208, 50,140, 42,120,231,209, 30,
+143,168,102, 53, 98, 12,232,154,150, 83,228, 10, 5, 87, 59, 79, 83, 30,107, 13,234, 89, 77,187,173,129, 51, 2,238,220,216,137,
+191,176, 92,165, 99,236,242,138,178,164,251, 57, 69,196, 20,113,255,233,231, 56, 61,155,195,101, 25,150,167, 43,188,125,254, 18,
+ 85, 61, 67,150,101,168,103, 21,190,249,245,215,120,250,217, 39,180,235,223,109, 38,108,115,224,179,159,254, 12,135,221, 30, 55,
+239,222,113,120,202, 19,212,203, 19,236,214,239, 16, 81, 96,104,183, 40, 74,226,245,231,101,137,188,204, 41,166,246, 54, 96,119,
+245, 22,183, 87,239, 16,250,128,178,112, 40,231, 39, 40, 10,143,174,235,176,189,217,168, 38, 35, 38, 32,194, 97,148, 45,208,131,
+250,241,231,255, 2,251,245, 37, 14,155, 55,148,239, 62, 95,161,168,102,108,211, 2,218,230,128,246,184, 87,177,170,207, 75,204,
+207, 30,147,173, 48,208, 97, 75,110, 8,207,227,200, 28,214,151, 52,222,101,205, 5,233, 92, 42,164,228, 1,203, 35,100,230,190,
+ 23, 69,133,162, 44,233,243,177,185,250,115,169,232,234,112,220,173,209,183, 7, 46,106, 49,114,189,149,252, 54, 66,172, 18,119,
+253,218,113,137,114,151,150, 41, 19, 95,115,186, 27, 56,153, 6, 12,172,156, 55,130,231,228,177,189,168,168,233,123,153,141,221,
+100, 2,123,158,141,134,126, 36, 36,244,125,224, 14, 12,188, 94,233,212,149,163, 84, 53,246, 54,247, 97,224,245,151,101,112,138,
+103, 0,140,103,235,154, 25,105,107, 89,201,228, 59, 62, 76,120,167, 44, 19, 72, 24,131,166,105,184,120,144,189, 61, 16, 19,199,
+209, 2,108, 19,164, 29,239, 48, 80, 96,139,176, 59, 20, 57,170,129, 53,134,199,240,163, 72, 45, 37,153,112, 90,181, 4,210,175,
+ 25, 85,209, 79,187, 76, 89,141,196, 68,147, 10, 57,216,229,208,164,252, 3, 74,216,171,231, 75, 98, 5, 88, 18, 37,210,225, 13,
+221,163, 15,195, 64,178,113, 14, 82, 18,151,129, 20, 24,164,141,152, 8, 7,157, 27, 21,220, 60,102,167,194,105,146, 83,142,187,
+133,129,172,227, 36,123, 94, 61,234,142,236,196,211,196, 64,106,250, 44,131,188,232,231,122, 70, 59, 43,102,214, 10,151,197, 41,
+116,106,154, 63, 65, 13,108,210, 98,203, 72,132,239, 16, 85,216, 39,233,166, 35,227,128, 15,118, 17,186, 73,144,139,228, 34, 76,
+ 68,115,150, 93, 43,162, 39,155,102,135, 88,142,255,133, 25, 71,245,162,142, 31, 87,227, 86, 27, 81, 76, 3, 97,216,238,102,105,
+180,154,248,240,243, 44,240,192,157,240,247,129,197, 95, 41, 14,136,161, 31,115,176,185, 83, 22, 11,220, 16, 6,218,139,246,129,
+ 25,222,145, 59,118,163, 9, 61,163,109, 14, 52, 46,244,158, 80,160,206,168, 34,158, 44, 59,153, 90,229,228,203, 43, 54, 53, 10,
+ 23, 16, 2, 80, 82, 69,163, 84, 74,214,144, 13, 41,203, 8, 94,179,223,237,176,219,238, 73,113,157, 23, 40,138, 18, 89,238,137,
+100,101,140,142,227,135, 48, 32,244, 3, 66,223,227,118,189,198, 97,223,224,228,108,133,197,106,206,126, 93,186, 33, 41,219,122,
+180, 28, 89,222,129,203, 94,195,103,142, 67, 98,200, 86, 84, 20,197, 29,241,157,140,119, 68,240,119,216, 55, 12,235,233,121,151,
+223,160,107, 91,116, 13, 69,117,250,204,161,235, 3,154, 99, 7,239,115, 44, 87, 75,228, 5, 85,180, 3, 91,192,242, 34,195, 97,
+223,224,246,154,194, 94,206,238,221,211,235,157,144,240,242,187, 23, 56,187,184,135,135,143,239,163, 40, 75,204,231, 51,170,110,
+ 57,165, 8,124, 3, 91, 51,221,113,165, 49,197,137,217,223, 41, 18,191,155,120, 0, 65,199, 73,125,215,224,253,219, 75,148,117,
+141,135, 79,159,144, 37,134, 71, 90,194,181,238,187,142,217,220, 22,251,221,129,189,225,153,170, 70,105,183, 75, 95,226,162, 42,
+ 96,121,159, 62,142,166,172,142,178, 4,108, 33,116, 62,239, 51, 85, 99, 15,125,171,209,158, 95,252,244, 71,136,125, 11,155,149,
+168,231, 21,190,249,205,215,152,205,106,148,243, 57,178, 60, 67,215, 30, 97,125,137,204, 59, 52,135,157,186, 63, 62,248,252, 7,
+120,252,209, 19,188,126,246, 2,139,213, 9,156,115,120,244,201,103, 24,218, 45, 81,191,250, 29,178,140,238,199,114, 54,163,160,
+ 23,147,227,118,189, 71, 56,110,113,245,230, 13,154,195, 17,222, 14,168, 23, 43, 84,179, 25,250,126,192,237,213,181, 82,239, 0,
+ 34,161,165, 72, 65, 68, 82,205, 95, 60,253, 12, 62,243,216,188,251, 22,214,102,164,100, 63, 57,167,117, 5, 44,134,208, 97,127,
+251,158,114,174,121,181,177, 60,125,192,171,141, 13,182,235, 43, 86, 81,211,119,114,204,108, 38,127,185, 28,164,195, 96, 48, 68,
+242, 79, 15,145,118,231, 9, 14,179, 57, 9,254,202,122, 14,151, 21,250, 16, 11,109,139,238,176,193, 97,187, 70, 8,157, 78,118,
+188,207,225, 92, 14,231, 50,100,121,133,178, 62,161,177,169,203,148, 48,230, 20,164,145,233, 78,122,220,151, 26,221, 1, 79, 31,
+248,195, 16,104, 42,128,136,132, 65,187,159, 36,106, 99,182,194,142,190,106, 94,197,113, 7, 59, 42,134,141, 78, 59, 99,138,232,
+250, 94, 5,191,150, 9,116,114,128,139,248, 50,193,192,176, 8,139, 86, 19,126,228,158,115, 82, 27, 49,235, 11, 88,159, 81, 18,
+ 25, 44,239, 82,169,168,105,142, 13, 14,251, 3,113, 41,108,198,254,254, 2,128, 87, 47,119, 76, 86, 59,238, 16,162,114, 44, 36,
+110, 54,178, 56, 78,199,236, 2,158,225,127, 2, 14, 49, 69, 68,217,111,167,113,188, 27, 53,191,211,142, 10,119,141, 33,141,119,
+ 2,122, 44, 91, 33,171,249, 2, 69, 53,131,247, 5,242,178,130,243, 37,178,178, 70, 86,206,144,229, 51,100, 69,205,160, 26,154,
+ 68,200, 58, 6,102, 12,111,193, 29,160,138, 97, 93,130, 99,208, 88,210, 67, 74,224, 57,244,225,176,111,159,209,178, 0,137, 97,
+189,207,120,229, 48,113, 45,196,168, 41,141,134, 59,119, 33,103,122, 22, 96, 59,235, 39,142,135,187, 20, 74, 99, 70,111,188, 26,
+ 2, 37,230,212,178, 64,114,194,229, 23,188, 46,245,179, 65, 11,160,196, 69,205, 24,229,157,120,242,104, 70,109, 1,140,240,114,
+248,126, 31, 1, 96, 90,160, 78,149,236,198,222,201, 72,151, 51, 98,228,200,196,187,192,119,195,128, 56, 77,205, 51,176, 62,115,
+136,125, 15,131,129,187,226, 2,121, 81,178, 85, 38,194,130,186,246, 20, 57,156, 4, 9, 67, 31, 88,185, 61, 48,185, 43,142,230,
+251, 52,166,197,165, 9,226, 52,165,136,140,197,109, 18,191, 71,126,217, 92,111, 44, 25,165, 58, 55, 86, 90, 46,115,250,224,202,
+178, 17,214, 31,195,192, 99, 54,218,113, 59,239, 85,176, 86,176,109, 78,196, 95,206, 89, 56, 11, 28,182, 59, 28,246, 71,102,100,
+ 83,144, 11, 5,155, 68,180,109,135,190, 39, 15,183,140, 55,104,239,181,195,108,190,192,201,233, 9,237,207,138,140,247, 82, 52,
+ 71,161, 3,219,115,113,146,169,239,124, 8,244,197,242,153, 71,215,243, 14,147,133, 51, 49, 38,116, 93,135,190, 35,124, 44,237,
+240,232, 1,220,182, 45,134, 97,192, 97,223,160,109, 26,181,117,196,129,213,152, 6,196,233,206, 11, 58,132,157, 81,155,154, 49,
+ 6, 33,244,120,241,237, 75,156, 94,156, 97,177,172,145,229,158, 39, 10, 1,111, 94, 93,226,147, 47, 63, 71, 61, 95,160,172,103,
+ 88,174, 86,168,217,167, 47,227,216,190, 31, 16, 89,213, 73, 46,133,156, 43,222, 65,247,177,135,253, 17,139,197,114, 12, 67,224,
+ 27,114,253,238, 18,251,205, 30, 31,126,246,137, 86,163,113,136,252,153,122,229, 78,123, 79, 89,247, 89,158, 97, 54,159,179,160,
+114,204, 68, 39,145, 92,129,162,200,177, 89,111, 52,137,205, 50,156, 71, 51,175,217,105, 17, 24,214, 98,173, 67, 81,148, 56,238,
+119, 0, 18,230,171,135, 56,189, 88,225,120, 56, 98,113,118,134,102,183,195,205,213, 59, 24,107,177, 60, 61,213, 81,217,230,118,
+ 7,159, 89, 12, 61,141,230, 23, 39,167,248,131,127,253,231,248,155,255,240,255,160,217,237, 81,214, 21, 86, 15,159,194,231, 25,
+154, 99,139,174,235, 80,228, 64,158,121, 44, 86,167,240,222,162, 15, 6,109, 27,112,216,109,241,254,213,115,132,174,129,119,137,
+ 58,244,154, 38, 27,219,155, 27,116, 93,175, 66, 44,231,233, 32,116,188, 27, 76,113, 64, 57, 63,195,236,244, 30, 94,254,246,191,
+ 1,198, 33, 43,103, 88, 93, 60, 70, 53,155,243,222, 50,162,217,111,208,119, 71, 12, 67,143, 52, 12,152,173, 46, 80,212, 21,154,
+253, 22,205,110, 77, 64,140, 24,185,195,100, 68, 42,172,118,179,198,229,112,121, 13,235,100, 82, 96,117, 39, 57, 95,204,144,151,
+ 4,155,161,221, 51,237,117,211, 16,208, 30,183,232,219,195,196,162,149,177,141, 43,167, 32,154,217, 9,202,122, 1,159, 21, 40,
+235, 57,178,188,226,253,191, 81,123, 87,210, 24, 88,163,251,195, 17,254, 52, 6,142,104, 32,201, 68, 59, 44, 7,184,192, 67,198,
+135,238,152,249,240,253, 20,172, 33, 70,218,157,243,152, 53, 14, 3,140,117,188,183, 54, 42,146,211,177, 53,187, 33, 84, 16,150,
+162, 22,237, 67, 4,147,230, 56, 67,158, 83,200, 98,156,164,191, 97, 66,122,227,233,164,116,157,162, 37, 16, 27, 93,156,240,211,
+ 71, 70,157,101, 88, 84,224, 93, 58, 84,100, 6, 8, 51,223,234, 94, 60,178, 88, 76,187,115, 86,189,235,152, 95,130, 98,166,218,
+ 1, 1,192,112,110,130,207,114,212,243, 5,138,178,230,226,204, 79,158,191,153,102,150, 39, 24, 88,159,147, 23,223,231,122,192,
+ 26,166, 49,194, 88,186,151,210,212, 25, 64,207,193,190,235,117,237, 66, 19, 72, 40, 48, 72,124,220, 98, 41,139,201,232,184, 59,
+113,234, 25,193,123,168,248,242,124,223, 14,113, 44, 90,172, 27,173, 98,214,209,239,149, 35, 59,203, 29,237,225,121,101, 39,231,
+148,166, 88,178,238, 33, 73, 86, 7, 12,188,179,122,224,199, 97,184,227,187, 55,186, 50, 74,255,132,102,151, 52,151,100, 82, 84,
+106,168,155,157, 36,184,152, 59, 64,178,113, 69,245,253,131,221, 40,155, 67, 67,154,116,236, 78,197,152,104,175,140,132,170,129,
+161, 7, 41, 14, 64, 28,224,243, 98, 18,155,234, 89, 40, 53,138, 10, 72,165, 55, 0, 60,246, 75,137, 2, 27,200,190, 68, 49,165,
+ 98, 53,232,187,142, 31,190,131,226, 96, 13, 11,131, 2, 43, 61, 37,226,116,190,156,195,103, 25,178, 44,227,174,152,136,114,218,
+ 77,242,135, 36, 88, 76, 76,240,121,130, 79,165,145, 12,141, 55, 40,152,132, 97, 42, 24, 73, 73, 49,244, 56,236,142,104,142, 13,
+ 98, 2,138,138,124,235,113, 96, 70, 50,103,240, 22, 21, 29,214, 45,171,227,125,158,225,244,226,148, 51,198,105, 52,151,101,158,
+173,115, 70,177,175, 50, 94,177, 19, 98,163,101, 29,129,166, 46,177,210, 56,242,204,213, 24,242, 11,183, 77,199,138,230, 65,189,
+235,125,215, 77,132, 59,132,175,141, 67,196,226,100,129,178, 40,248,186, 10, 65,143, 4,123,135,253, 6, 55,215, 91, 60,120,252,
+144, 85,235,116, 0,110,214, 55,136, 49,225,195, 79, 62, 96,240,206, 12,243,197, 18,203, 19,210, 29, 20, 69,161,176,161, 44,227,
+108, 97, 63,146,250, 4,244,114,123,125,131,179,139,123,147,241, 17, 61,100, 15,187, 91,188,248,230, 37, 78,206,239, 81,122, 92,
+ 8,148, 64,135, 17, 94, 20,135,136,162,172,112,216,237, 72, 44, 87, 85, 92, 16, 70,205,169, 47,171,146, 59,181,136,205,237,134,
+ 17,188, 81,173,117,198,144,176,147,130, 51, 34, 28, 79,104,140,245, 40,202, 28,135,221, 14,128,193, 71, 95,126, 5,203,233, 90,
+203,211, 21, 46, 95,188, 66,232, 73,176, 84,148, 21,209,212, 18, 96, 82,194,233,249, 18,198, 36,100,222,227, 95,253,219,127,131,
+175,255,225,151,136,161, 67,223, 53, 40,103, 53, 30,126,252, 41,118,235,107,116, 77, 75,157,227, 16, 80,206, 23, 48, 32, 74, 97,
+ 62, 63,195,126,179,195,139,223,254, 6,205,126, 15,139, 30, 85, 61, 67,189, 88,194, 34,225,230,253, 21,229, 6,232, 67,192,179,
+216, 10,106, 15,204,171, 5, 30,127,246, 67,188,249,253,223,211, 94,209,103,152,159,156, 99,190, 58,229,221, 37,197,183, 54, 7,
+ 18, 26, 58,239,113,114,255, 41,234,197, 10,205,126,139,235, 87,191,199, 97, 71,106,119,153,146,145,247, 60,114, 23, 40,136, 85,
+ 79,157,165,245,176, 62,131, 49,132,131,173,102, 21,124, 78,129, 44, 68,120,164,207,165,111,143,104,246, 91,132,174,153, 88, 68,
+ 61,143,128, 19,139, 71, 43,212,179, 57,242,178, 66, 81,214,200,138, 10, 89, 94, 81, 39,235, 28, 63,124,204,100,189,225,148,118,
+102,140,120,146,133,206, 53, 73, 19, 75,228,159,206,178,252, 78,204,232, 29,223, 46, 79,163,156, 38,110,165,137, 42, 28,170,159,
+ 25,115,191, 49,142,124,245,181,140,157,163,181,226,135,183, 42,202,149,172,117,186, 87,217,104,107,233, 26, 8,253,140,176,124,
+158,163, 63,193,251,226,164,234,239,196,142,130,152,198,162,196,218,169, 0,205,221, 73,248,146,149,135, 20, 31,178,243,191,227,
+ 25, 23, 15,184,138,229, 24,221, 58, 69,200,106,156, 41,113, 35, 18, 4,162, 67,110, 17,159, 21,240, 57,125, 78, 62,243,112, 89,
+174, 26, 15,133,190,176, 56, 48, 37,199,161, 59, 20, 70,227,124, 62, 25,241,219,113, 4,143, 49,112,103, 8,131,210,227,134, 48,
+144,229,207, 57, 37,101,202,158,152, 38,161, 78,247,235,208,137, 18, 77, 74,172, 33, 33,226,192,207,165, 60, 47,180,152, 27, 2,
+ 33,194,115,110,178, 28, 55,135,198,138, 11,194, 78, 84,250,106, 65,103,209,157,209,113,182,230,160,243,129, 33, 98,223, 41,187,
+ 37, 77,160, 96,227,164,105,116,123,164,201,121, 35,129, 68,134, 29,101,212,149,143, 35,247,201,226,126, 18,103, 12, 37,140, 78,
+233,113,163,218,157,239, 24,193, 29,171, 91,205,193,152, 4,111,157, 81, 49, 74, 86,148,240, 62, 67, 94,205,216,139,199,201, 79,
+133, 69,232,123, 13, 26,137, 19, 36,158,132,111,128, 59, 39,128,189,150, 60, 18,143, 33,192, 88,135,122, 49,195,249,195,135, 44,
+218,201, 38, 95,152, 49, 82,146, 58,191,136,190,105,208,247, 45,113,201,119,205,104, 77, 19,200,183,145,221,158, 81, 79, 59,238,
+100, 26, 39, 37,214,137, 74,218, 58,163, 21,184, 69,226, 49, 56,189,206, 44,243, 88,156, 44, 41,130, 54,108,185,227,141,227,152,
+198, 0,205,225,128,178,170, 49, 91, 46, 96,221, 1,237,177, 69, 53, 43, 9,172,195,138,113,162, 18, 89, 78, 64, 35,180,161, 55,
+ 6, 49, 24,116, 45,117,149,125, 23,244, 75, 73,249,243,212,173, 7, 78, 40, 19, 33,143,227,221, 59,141,234, 91, 84,117,197,161,
+ 43,129,190,120,206,161,158,207, 8, 91,155,100,122,146,244,207,188,123,115,137,207,190,250,140,108, 77, 7, 18,224, 56,231,240,
+252,155,231,248,242, 39, 95,162, 57, 28,177,185,221, 33, 47,115,202,170, 47, 50, 45,140, 72,112,120,164,247, 18,199,112, 28,129,
+221,172,175,214,120,240,240, 1,158,125,253,245,168,113,112,196, 71,127,245,221, 11, 60,252,240, 9, 86,103, 23,184,124,245,138,
+ 71,101,252,165, 49,180,115, 94,172, 78,208, 28,142,128, 1,234,121,205,157,247,200, 51, 46, 74,210, 3,132,190,199,241,112,128,
+177,231, 8,161,135,247,163,165, 67,231,169,178, 38, 64, 2,165, 70, 38,132,190,129,243, 37, 30, 60,121,128,162,204,112,140, 3,
+202, 50,195,243,223,127,131,148, 18,118,219, 61, 30,242,248,213,103, 57,226, 16,176,227,137,204, 87,127,240, 47,113,220,237,241,
+254,245, 75,228,185, 71,138, 3,150, 15, 30,161,154,149, 56,108, 54,112,166, 67, 86, 44,144, 59, 10, 3,218,111,110,209, 5,143,
+174, 79,120,255,226, 57,154,253, 22, 38,181,200,235, 25,138,249, 18,121,110,177,185,185,193,113,191, 99,225, 39,137,178,134, 52,
+ 58, 33,172,165,168,213, 39, 95,252, 20,175,127,255, 11,206, 65,200, 81,205, 79, 48, 63,153,147,242, 53, 38,154, 28,173, 47, 49,
+176,255,127,113,250, 24,171,139,135,216,111,118,184,125,247, 12,125,123,228,132,173,136, 44, 43, 56,125,139,166, 52, 33,208, 97,
+ 99,156, 7,236, 64,228, 58,231, 97,189,197,172, 20, 53,112,198,221,222,160,169,119,221,113,143,174, 61,160,107, 26,202,160,143,
+ 9,214, 59, 34, 41,198,129,189,217, 6,203,211, 83,109, 14,186,230,168,221, 67,140, 3,239, 93,239,100, 75,178,200, 82,196, 61,
+142,223, 83, 98, 4,245,152,170, 70, 65, 45,108, 45,115, 94,193, 47,142,211,184, 36,171,192, 89,210,238,164, 4, 56,107,244,251,
+ 78, 52,192,209,139,108,184, 75,146,135,186,115,110, 2,147,185,155, 29, 47, 35, 83,162,190, 25, 32, 24, 45, 18,156, 47,180,177,
+136, 41,193,194, 32,207,114, 22,230,145,210, 58, 12,145,109,163, 78, 1, 46,178,242,163,233, 73,194, 16,233,144,147,117, 21, 96,
+ 38,250, 2,246,159, 79,146,226, 82, 28, 4, 20, 7, 39, 43, 8,101, 54, 24,221,145, 79,193, 63,234, 94, 17, 63,190,230,175,211,
+243,145,236,178,180, 75, 31,113,178, 70,237,186,114, 13, 66, 52,244, 92,234, 7, 0, 22,121, 89,163,239, 90,120, 24,132,190,209,
+226, 61,166, 72, 72, 83,144, 85,211,120, 42,146, 68,208, 37, 28, 0,231, 61,250, 62, 32, 49,147, 65,174,141,138,212, 98,100,117,
+125, 26,167, 29, 44, 40,243, 89,174,164, 71,121,255,142, 59,120, 1,207, 36, 36,216, 72,122, 10, 17, 82, 10,120, 70,132,188,228,
+ 98,234,249,126, 79,250,158,165,128,203,115, 63,126,166, 97,208,233,202, 24, 6,148,180,168,148, 67,219,154, 52,201, 69, 55,234,
+114,138,170, 7,195,228, 32, 31,115, 10,229,200, 87, 13, 19, 79,132, 41, 28, 43, 42,112, 38,242, 42,192,114, 49,108, 82, 28, 87,
+ 4, 48,240,113, 24, 20, 93,216,236,247,168,173,135,245,100,207,105,247,123,186, 49,134,129,247, 69, 20, 26, 33,157,123,100,161,
+ 9, 89,128, 2, 7,145, 4, 21,194,136, 98,220,152,132,227,126,135, 87,223, 62,131,243, 57, 39, 66, 89, 49, 19,168, 72, 74, 84,
+156,206,103,168,102, 21, 78, 46,238,225,228, 60, 81,106, 85,211,106, 87, 48, 70, 19,146, 48,142, 42, 78,195, 55, 10,171,186,121,
+199, 78,160, 24,131,190, 27, 80,148,153, 10,207,140, 49,122,176,111,219, 14,195, 0,148, 85,137,243, 7, 23,232,218, 22,155,245,
+102,220, 73,115,149, 28,250, 14,206, 91, 44, 78, 22, 26, 75, 43,186, 3,249,128, 83, 76,188,247, 7,239,147, 71,207, 35,217,198,
+162,198, 15, 54, 77, 7,168,255,150, 62,244,182,237, 53, 27,123, 8, 45, 3, 51, 12,110,174,111, 80, 84, 37,138, 34,199,246,118,
+135,197,201,156,170,210, 44,199,230,118,173, 59,122,105, 96,118,219, 45,222, 95, 94,227,226,193,125,172,175,110,128, 68,190,223,
+190,239,241,221,239,159,225,193,227, 7,184,190, 90, 35,197,196, 90, 6,163,201,110,243,197,140,132,118,155, 29, 54, 55,183,228,
+133, 23, 75,140, 49,120,127,249, 22, 95,254,240, 99,178, 81,201, 13,205,163,212,205,205, 45, 66, 31,241,244,211, 79,240,246,229,
+243,137,169,145, 30,202,125,215, 99,117,126,142, 55, 47,223, 97, 8, 17,179,197,130,173,105,212, 53,103,153, 71, 61, 39,120,208,
+113,187, 85,218, 27,217,222, 6, 30,219, 17, 85, 48,175,172,198, 38,134,148,144,229, 5, 50, 14,214,121,244,241, 87,200,108,194,
+108, 49, 67, 31,128,253,102,131,155,245, 53, 23,134,228,152,104,155, 22, 69, 61, 67,115,216, 99,191,185,198, 71, 95,253, 0, 31,
+253,224, 19,252,231,255,235,223,211, 53, 49, 68,193, 59,123,244, 24,111,159,191,134, 77, 7,248, 44,199,124, 94,192, 91,135,237,
+122,141,230,216, 99,249,232, 19,108, 46, 95,225,184,223,193,196, 6,198, 36, 84,139, 83,212,117,142,246,120,196, 97,183,213,110,
+172,235,200,135, 79, 41,199,145, 11,217, 1,143, 63,255, 9,182, 87,111,200, 82,135,136,122,190,192,114,117, 66,224,148,161,199,
+ 16,122,236, 55,107,133,114,204, 79, 31,227,236,225, 7, 8, 93,135,155,203,103, 8,221, 1,214, 57,132,208,195,218, 12, 49,246,
+ 44, 44,204, 85,235, 49, 68,240,231,101,233,224, 6, 48, 91, 44,128, 72, 14, 7, 66,244,210,168,122,232,123,116,205, 30,161,107,
+ 0, 68,184,204, 35, 13, 1, 62, 19,168, 8,193,104, 96, 12,242,178, 70, 89,215,148, 83, 16, 45,224, 2,140,139, 48,218,213, 72,
+112,198,152,146,229,188,167, 3, 79, 80,208,147, 0,140,200, 10, 96, 9,216, 25,119,222,113, 84, 58, 99,124,160,170, 70,199,202,
+ 3,155, 10,220,192,164,194, 49,211, 99,180, 62,202, 23, 37,176, 48, 74,172,114,195, 16,120,101,153,216,245,194,110, 29,201, 36,
+231,142,148, 32, 53,128, 77, 6, 57, 11,245, 2,139,235, 82, 28,184, 80,181,164,172,215,191, 43, 27, 71,210, 18,129,202, 33, 68,
+244, 28, 13,116,143, 79, 86,153,146, 68,166,122, 40,158,112,200, 65, 39,163, 99, 25, 35, 11,170, 91, 85, 79,198,170,195, 68,176,
+ 70, 33, 4,100, 89,129,146, 39, 42,106,107, 13, 3,178,162,160,123, 68,133, 92,210, 48, 64,167,165,201, 24, 32,145,184,211,185,
+ 12,112,226, 73, 15, 42, 90, 21, 23,130, 8, 7,101,250, 26, 69, 16, 59, 4,222,159, 91,116,157, 20, 46,227,244,134,206, 68,207,
+153, 16, 1,214,103,202,248,112,222, 83,135,237, 51,213,235,200,228, 37, 47, 50,116, 93, 84, 72, 81,207,233,152, 96, 80, 78, 52,
+ 73, 35,128,233,140,141,119, 38, 62,113, 72, 58,245, 20, 27,153, 76, 40,101, 39,110, 96,105,122,158,100, 58, 20, 85, 20, 39,120,
+219,169,135, 60,241,235, 27,217, 36,134,239,123,115, 39,145, 69,137,173, 98, 27, 76,140,140, 78, 99,180,170,100,173,208,253, 56,
+176,175,158,233,154,188,242,176, 10, 79, 97, 17, 64,223,181,172,221,227, 15, 97, 8,170, 90,149,234,130,162, 56, 25, 89, 24,131,
+166,178,117,109,167, 35, 51,217, 9,133,158, 2, 82,192, 86,152, 24, 58,164, 72,161, 30,226,221, 22,138, 15,141,172, 6, 12,125,
+139,221,237, 45,222, 62,127,137,219,235, 13, 78,239,223,199,234,236, 84,147,115,196,167, 39,227, 29,231,236, 56,162,151, 74, 93,
+176,172, 50,238,179, 80, 15,165,177,208, 81,238,192, 49,164,199,253, 1,183,215, 55,104, 57,178,243,244,222, 25,202,170,226,157,
+140,231,209, 16,216,111,218, 97,182,152, 99,190,156,141,236,112,182,105, 88,231, 88, 37, 9,181,154,181, 77,135,208,247,106,169,
+115,126,132,101,132,129,246,216,194,189,206, 50, 18,225,201,190,135, 44,111,228,153,111, 14, 71,116,109,135,142,217,245,125, 79,
+228, 57,201,146, 15, 33, 96,183, 59,226,112,104,208, 52, 45,158,127,243, 29, 66, 72, 56, 57, 91, 33, 4, 26, 35,101,222, 97,125,
+117,141,182,233,240,244,195, 71, 56,236,247,104,142, 7, 82,220,183,157, 90, 18,151, 39,115,156,156, 46,177, 56, 89, 0, 2,247,
+144,252,245,238,136,162,158,233,129,237,196, 14, 99, 12,195, 80, 2, 30,126,240, 4, 89, 94,106,208, 79, 94,176, 61, 48,244,168,
+230, 11,181,158, 84, 51,162,163, 81,232, 79,134, 44,207,201,161,224, 44,174,223,223,144, 26,149, 87, 44,145,161, 57, 50, 25, 32,
+ 58, 87,212, 47, 87, 57,155, 33,207, 29,178,188,196, 39, 63,248, 28, 49,116,200,138, 2, 85, 93, 96,183, 38, 47,181,207, 60, 67,
+ 84, 36,132,167,198,237,213, 59,244, 93,135,159,253,217, 31,227,239,254,234,175,117,109,227,156,195,226,252, 62,229,217, 31, 55,
+176, 41, 32,153, 28,121,102,112,216,110,113, 60,180,176,213, 5,156, 29,240,254,245, 43, 24, 16, 58,121,190,186,192,108, 94,163,
+107, 26, 92,189,125,131,246,112, 64, 26,122, 22, 14, 38,124,240,217, 71,248,240,139, 79, 57, 73, 47,225,222,211, 79, 17,135, 30,
+155,119, 47, 16,227,128,170,174,177, 60, 61,165,212,180, 8,244, 93,135,195,150,236,118, 48, 14,179,147,135,184,120,252, 49,154,
+ 99,139,119,175,126,135,208, 29,244, 94,166,177, 38,167,242, 25, 98, 83,135,126,208, 61,176,114,180,243, 18,101, 85,209,238,212,
+ 23,236,169, 38,200, 72,232, 26,180,199,237,152,158, 55, 1,154,140,160, 19,234, 38, 92, 70,130, 42,192,193,250, 12, 69, 89,192,
+ 90, 66, 0,123,231,213, 31, 15,102, 90,168,117, 44, 25,141,236,148, 67, 74,187, 25,118,219,104,183,110,141,194,135,156,134,177,
+136,212,202,104,220,175,104, 62,232,192, 29,152, 23, 49,142,129,213,154,150,198,209,181,146,200, 48,134,189, 36,110, 18,105, 18,
+ 64, 7,121, 31,200,190, 25,153,125,110,140, 87,229,246, 8,171,113, 76,109, 35,190,120, 24, 34,134,100, 0, 75, 35,238, 41, 80,
+ 70, 84,226, 2,176, 81,148,234,244, 16, 55, 6, 73,131, 64,248, 53, 42, 79, 92,160, 57,100,167, 75,108,113, 35, 75,216,232,167,
+ 31,201,110, 86,237,101, 72,137, 24,254,121, 9,159,229,176,140,167, 54,206,242,254, 56,242,153, 64, 19,205, 56, 33,205, 65, 0,
+ 91, 44, 82,142,201,105,199, 44, 80, 34,241,241, 11, 74,214, 90,171,222,122, 89,103, 88,206, 89,151, 40, 86,121, 96, 90,137, 0,
+102, 71, 1, 96,104, 29, 0, 10, 13, 18,139,164, 0,184,100,229,153,101,158, 27, 58,232, 20, 71, 58,116,195,174, 40,199, 16,176,
+177, 9, 27, 87,122, 99, 13,100, 70, 14,254, 36,117, 77,247,217, 60, 85,146, 34, 18, 19,186,170, 20,143,162,111, 24,249, 53,118,
+146,201,142, 59,247,111,226, 2, 79,130,100, 68, 79, 98,152,201, 79, 5,200, 93, 46,188,168,235, 5, 63, 43, 90, 55,221,171,127,
+249, 7,127,132, 39,159,125,202,169, 48, 64,232, 90, 52,251, 35,141,189,124,198,201, 90,131, 90,151,236, 36,143, 24, 44,243, 39,
+ 49,205, 48, 9, 2, 8,119, 50,105,133,195,158,248,129, 16,122,238, 12, 58,178,115,105,226,150, 21,220,163,101, 26,144, 71,140,
+ 61,222,190,124,131,162,170,112,254,240,190,126,137,100,175, 22,133, 57,204, 22, 51, 39,196, 54, 22, 91,229, 69,198, 95, 70, 30,
+101,179, 98,124,224, 3,161,239, 7,221,211, 91, 11, 28,247, 7,220, 92,221,224,120,104, 81,206,106,156, 94,172, 80, 84, 5,114,
+ 94, 25,100,185, 67, 81, 50,133, 44,207,177, 88,206, 56,173, 43,215, 46, 36, 43,104, 34, 32,254,234,208,247,234,203,247,222,145,
+173,143,171,182,162,204,152, 50, 69,100,175,208,211, 67,105,191, 59,162, 57, 52,104,155, 86,175, 77,140, 17,199,195, 1,251,221,
+ 17,187, 13,113,239,243,130, 30,206,100,191,136,227,218,193, 57,244, 93,131,239,190,126,129,139, 7, 23, 92,101,143,252,231,103,
+191,127,134,229,233, 41,238,221, 63,199, 16, 35,250,190,197,246,118,131,227,225,136,162,240, 88, 44,107, 58,216, 87, 75,148, 37,
+173, 25,198,117, 11,221,180,121, 94,192,223,177,215, 57, 32, 13,204,212, 47,177, 58,191,224,105,137,215, 47, 98,219,180,124, 8,
+ 0, 93,219,147,232,175, 40, 89,188,232,120, 9,253,234, 19, 0, 0, 32, 0, 73, 68, 65, 84, 28, 88, 32,198,132,253,110,143,132,
+ 68,123,121, 30, 73,201, 78,150, 88, 7,134,115,236, 41,115,189,154,205, 17, 67, 64,181, 60,197,124, 81,193,122,143,190,167,209,
+235,187, 55,151,188, 55, 35,191,191,243, 25,250, 62,194, 57,131,227,238, 6, 95,252,228,135,120,247,242, 37, 9,193,248, 28,154,
+157,156,161, 62,123,132,195,237, 26, 46, 53, 72,198, 34,175, 74,236, 55, 55, 56,236, 14, 64, 54, 71,189, 60,193,219,111,191,134,
+ 53, 1,105, 8, 40,234, 57,202,249, 2,214, 12,184,122,251, 26,125,219, 82, 80, 17,219, 33,255,251,255,229, 47,241, 23,255,230,
+ 47,112,255,201, 67,156,156,157, 96,117,255, 17,138,186,196,245,235,111,225,178, 28,179,249, 28,171,139,251,200,203,146,133,149,
+116,160, 31,247, 91,164,100, 48, 95,221,195,197,227, 79, 16,194,128,155,183, 95,143,176,156,137,181, 37,113, 24,147, 60,108,135,
+ 40,133, 35, 21,190,213,124,134,162, 40,144, 21, 5,163,142,233, 97,208,119, 29,142,251, 13,218,227,158,129, 47,116, 47, 58, 47,
+209,168,126,178,199, 5,172,207, 81,207,230, 40,171, 10,188,129, 67,140,100,253,138, 41,177, 64,109,208, 52,180,209,163,238,212,
+ 77, 51,205, 39, 31,163, 55,211, 24,143,170, 93,248, 40,146, 37, 45, 13,139,254,236,232,255,181, 58,130,228,241,168,142, 81, 7,
+ 45,186,167,251,208, 24,131,118,235, 74,100,211,194, 95, 58,106,168,178,153, 86, 6,152,236, 88, 41,176, 69,108, 91,146,145, 32,
+135,118,226, 84, 51,177,182,137,178,127,202, 87, 55, 19,177, 24, 5, 52,241, 94, 89,112,186,130, 66,150, 98, 64,230, 94,154,253,
+ 30, 25, 22, 3,238,146,221,196,238,102,238,104, 5,164, 80,112, 89,137, 44, 43,105, 92, 29, 39, 64, 32, 70, 93, 15, 67,224, 85,
+ 95,139,182,105,208, 53, 13,175, 95, 19, 51,127, 12,133,188,120,158,210,242, 33, 77, 43,213,145, 36, 7,195,127,167,165,176, 46,
+ 5, 2, 65,176,179,118,130, 74,149, 56, 92, 90,181, 38,213,122,141,112, 22,231, 61, 23,106, 78, 69,137,228,160,241,147,152, 82,
+171,120,109,129,133, 57, 93,137,142,156,118,185,175, 50,118,207,216, 59,251,235,209,230, 76,231,246, 40,138, 27, 15,120,123,103,
+202,132,127, 18,163,106,198,247, 36,254,121, 69,217,198, 59, 74,124,106,243,105,138, 43, 19, 73,250, 62,196, 59,135,185,238,206,
+205, 36,224, 69,253,233,102,100,191,255,230,111,255, 22,239, 94, 95,227,195, 31,253, 20,159,252,232, 43,228, 69, 70,185,232, 76,
+101, 35,249,189,129,207,189,242,130,229,208, 20, 17,128,149, 47,104,164,195,114,140, 5,138, 58, 42,151,156,118, 48,116, 37,240,
+ 14, 88,246,196,129, 15, 90,169,108,172,247, 35,124,223, 36, 92, 95,190,199, 97,223, 98,126,178,164, 3,138,173, 99,121,153,105,
+ 23,153,231,158, 21,190,172,148,231,220, 95,193,236, 73,199, 55,142,250,153, 45, 45, 41,102,144, 74,122, 96, 46,246, 6,161, 31,
+176, 88, 46,176, 92, 45,177, 92,205,144, 23, 5,202,178, 64,150, 89,130, 98,192, 98,190, 92, 40,254, 86,132,105,211,232,156,130,
+209,183, 50,130,151,247, 73,232,200,142,189,144, 70, 57,239,152,216, 8,179, 60, 83,136,197, 48, 68,116, 93,143,230,120,192,118,
+179,197, 16, 19, 28, 71,192,150, 85, 5,239, 29,138, 34, 67,150,145,250,191, 44, 11,108,110,111,176,223,182,184,255,240,190, 50,
+168,169, 58, 29,240,226,219,151,248,244, 7,159,177,255,158, 10,162,195,254, 0,107,105,175, 94,213, 5,202,138,220, 16, 36,118,
+162, 7,144,247, 30,219,219, 61, 78,207,207,249,225, 7,120,142,191,140,113,192, 97,187,195,113,223,224,241, 71, 31,208,231,170,
+185,196,212,113,149, 53,137, 19,135, 16,144, 21, 5,234,249, 2, 62, 35, 8,206,108, 49, 71, 86,228, 8,125, 64,219,180, 74,166,
+210, 7,188,164, 3, 50,202,178,172, 74,166,231,229,152, 47,230, 24,134,128, 71, 31,127,138,118,191, 69, 53, 95, 0, 41,162,107,
+104,242, 99,141,193,124,185,212, 93,172,207, 11, 28,182, 91, 60,120,250, 1,158,124,252, 20,251,205, 22,206,142,232,226,135,159,
+127, 5,147, 2,170,146,127,126,177,132, 9,123, 28,118,123,180,189, 69, 55,148,200,125,196,229,119,191, 69,158, 83,183,177,186,
+255, 8,117, 93, 96,253,254, 10, 93,219,168,255,181,235, 35, 62,251,209, 23,248,244,135,159,224, 63,254, 31,255, 30,255,245, 63,
+254,191, 56, 30, 58,212, 39,103,120,243,205,175, 49,132,128,178,174,113,114,126,129,172, 40,104,196, 59, 12, 56,108, 55,232,187,
+ 6, 48, 14,229,108,133,139,199,159, 0,214, 99,253,246, 57,154,253,173,142,229, 96,196, 15, 12, 6,128, 24,206, 62,207, 8, 1,
+221, 83, 30,119, 89,213,228, 46,201,105,117, 35, 20,193,190,235, 48,244, 45, 7,171, 48,210,153, 69, 95, 20, 21,236,212, 82, 68,
+133, 43,121,152,229, 97, 30, 35,173,167, 14,251, 61, 91, 45, 3,142,251,157,118,101,162,146, 78, 83,252,169,238, 75,211, 36, 1,
+ 11,122,144,137,141, 85, 44, 88,100, 91, 28, 59, 45,233, 42, 33, 24,227, 36,194,192, 48, 18,212, 48, 62,248, 36, 61,139, 84,219,
+ 3, 98, 52,119, 58, 69,163,177,191, 73, 39, 12,162, 9, 16,129, 28, 96, 20, 22, 36,224, 32,231,172,218,232,164, 3,149, 2,198,
+ 58, 58,244,195, 32, 89,228,142, 59, 81,199,133,176,159, 64, 69,172,238,132,189, 47,232,255,179, 36,190, 27, 73,117, 52, 73, 38,
+ 6,189,209, 34, 74, 92, 14,129,237,101,202, 99, 23, 70,189,170,231, 35,188, 47,120,239,156,244,185, 36, 22,208,192,232,212,246,
+120,196,230,102,141,221,237, 26,219,205, 45,118,155, 27,180, 77,131,208,245, 52,210,230,233,174,168,212,245, 61, 88,186, 38, 4,
+237, 26,148, 46,103, 96,117,115,108,120,178, 39,122, 1,203, 36, 59,186, 79,104,215,111,156,191, 19,208, 66,110,145, 76, 53, 41,
+114,200, 75, 8,140,192,168,202, 50, 87,181,185, 70,161,166, 49,131,160, 44,243, 81, 68,103, 70,148, 47, 20, 74,147, 38, 14, 12,
+114, 41,137, 2, 93,136,151,114,160,203, 20, 88,181, 94,119,242,139,204, 29,109,131,153, 20,131,163,200, 51,142,197,172,181,227,
+159, 72, 99,142,138,228,131, 72,163, 33,133,149, 76,196,193,250, 7, 59, 9,150,177,113, 8, 56,220, 94,225,235,191,255, 57,214,
+239,110,240,241,143,126,130, 39,159,125, 76,222,241, 44,135,207, 41, 4,133, 84,128,228, 45, 55,214, 41,167,120, 10, 3, 32, 12,
+161, 69, 26,198,189,129,177,134,192, 15, 60, 26, 52,188,235, 16, 49,155,124,145,197, 10, 70,222,238,209,187, 73,138, 81,122, 8,
+ 55,135,195,248,101, 50,227,120,122, 58, 21, 48,204, 16, 55,214, 42,133,142, 58, 5, 78,214, 1,112, 60,180, 58, 90,146, 34, 64,
+ 14, 97,159, 57, 13,115,112,142, 42,210,195,238,160, 9, 99,171,179, 37,138,170, 24,201,107,145,200,111, 5,119,203, 67, 24,208,
+119,129,199,216,180,167,156, 66,100,218,166,159,164,185, 81,224, 4, 77, 36,162,126, 40, 33, 12,200, 11,207,156,109,175,227, 96,
+200, 40, 52, 14, 56,114, 40, 73,215, 82,228,102, 94,208,161,150,229,185, 6,229,192, 88, 56,155,240,252,219, 23,120,240,248, 17,
+170,186, 64,219,118,154,121,191, 89,175,113,179,222,224,243, 31,124,130, 20, 35,242, 34,199,233,217, 9,242, 60, 67,150,123, 84,
+117,137,170, 46,148, 49, 63, 13,123,217,109,183, 88,157,159,177, 29,203,232,193, 29, 66,143,230,120,196,213,229,123,220,123,252,
+ 72, 31,184, 66,111, 34,107, 11,221,149,205,177, 67, 81, 21, 52, 14, 47, 74, 36, 24,228,101, 65,215, 35, 4,186,199, 56,145, 41,
+ 33,113, 96, 73,137,162,100, 48, 74, 89,192,121,135, 60,207,185,240, 44,208,181, 29, 46, 30,220, 67,215, 28,177, 56, 91,113,154,
+ 95,195,130, 59,139,106, 86, 35, 25,131,195,190, 65,223, 15,232,154, 3,254,252,127,250,215,248,213,127,253, 57,119,128,244,218,
+ 78, 31,127,132,114,182,132, 9, 59,132,190, 71, 86, 47,136,244,213, 28,112,108, 34,144, 45, 48,155,231,120,255,226, 91,196,161,
+129,245, 57,138,106,134,178, 42,176,189, 89, 99,183,185,213,164,169,148, 12, 22,203, 5,254,229,191,250, 99,252,213,255,249,127,
+227,197,239,191, 1, 82,194,233,195, 15,240,252, 87,127, 71,140,136,188,160, 64,156,154,172,107,161,239,177,189,185,198,113,191,
+ 71,130, 65, 81,205,112,241,244, 19, 12,209, 96,253,230, 59,116,199, 13, 92,150, 99,156,138, 10,163,154,191, 3, 62, 3,108, 6,
+152, 12,214,121, 84,179, 37,138,170,166,209, 59,179,179,187,166,193,113,191, 71,223, 54,104, 15,123,206, 36,200,238,116,183,212,
+225,114,160, 69,164,239,187,207,114,204,151, 75, 29,223, 43,202,148,187,194,182,105,209, 53,141, 6, 25,169, 45,139,195,120,198,
+ 17,232,212, 35, 60, 10, 96,101,170, 4, 30,173,219, 9,248, 73,184,217, 49,138,232,201,176, 24,112, 24,239,123, 46,116,162,100,
+ 90,167,120,135, 14, 22,135, 65,129, 57, 10,122,137, 99,114,220,152, 15, 14, 69,232,142, 86, 57, 9, 40,177,147, 46,152,161, 49,
+ 48, 58, 49, 28, 56,177, 76,224, 53,110, 50, 98, 78,172, 27,162,113,178,189,211, 69, 11,147, 62,166,177,155, 85,245,190,100,200,
+243, 40,126,144,117, 10,135,200, 8,118, 85, 66, 86, 6,205, 46, 55,147, 85,101,129, 44, 47,212, 2, 12,227, 16, 6,154, 38, 18,
+143, 62,162,109, 26, 28, 15,123,181,229, 38,158,132,118, 93,139, 33, 14,148, 44, 25, 35,235, 47,216,234, 37,193, 59,118,140, 88,
+149, 73, 68, 76, 96,228,184,153, 56, 27,104,132, 79,148, 57,163,236,119,235, 60,188,207, 53,111, 30, 19,187,165,160,114, 37,201,
+ 77,108,190, 2,177,242,158, 44,134, 52,102, 39, 13,135,172, 27,166,209,204,244, 94,122, 14, 21,147, 80, 33,202, 19,145,169,137,
+248,196,245,248, 77, 99,208,152,134,252,240,106, 17,152,142,198, 5,225, 58,174, 73,226, 16,121,133,113, 55, 9,117,154,113,162,
+168,185, 9,215,125, 20, 57,114, 65,161, 59,253,201,207,211, 3,126,100,208,219, 16, 6, 85,108, 95,191,125,141, 95,255,205,223,
+ 96,253,110,141,199,159,127,134,178,170, 80,204,230, 84, 69,240,195,124, 24, 70,175,158, 84,117,242,191,173, 49,176, 24, 84, 68,
+ 23,250,128, 24, 6,173, 48,104,223,156,216,174,227,212,147, 71,201, 97, 1, 73, 70,239, 60,166,176, 76,150, 19, 21,168, 84,205,
+178,235, 6, 64, 29, 18,191,193,190, 31, 88, 97,156,177,207,210,222, 65,203,146,186,156,148,189, 93, 75,113,122, 41, 69, 69,204,
+250,204,145,186,220,143,204, 96, 26,237,208,131,138,162,250, 28,143,127,198, 80,138,208,117, 56,236, 14,168,231, 51,138,145,245,
+227, 56, 80, 42, 66,233,194,141,165,245, 67,115,108, 16,250, 1,109,195,239, 61, 37, 58,240,141, 33,213,117, 50, 90,108,164, 4,
+116, 60,150,151, 81, 91, 8, 1, 55,215,107, 85,191,139,104,112, 54,167,131,197,179,248, 45, 1,232,219, 61,214, 87, 91, 60,253,
+232, 9, 98, 28,176,103, 32,198, 16, 7, 60,255,230, 25,202,122,134,139,251, 23,168,103, 21,238, 61, 56,199,124, 73,228,178,188,
+204,225, 51,218,147, 58,173,166,169, 40,187,185,186,198,197,253,123,119, 99, 7,185,235, 75, 9,120,245,221, 75,212,243, 57,170,
+186,166,107,193, 95,232,230,120, 84, 81, 30,169,149, 13,119,166, 64, 81,228,152, 45,102,112,206,226,120, 56,242,231, 75,226,162,
+170, 94,160,172,201, 50,229,179,156, 68,113, 76, 19,164,181,134, 71, 81, 21, 40,234, 25,156, 25, 48, 63, 89,226,228,236, 4,135,
+221, 1,251,205, 45, 66,215,162, 40,107,228, 69,129,227, 97, 15, 24,139,238,216,224,127,248,243, 63,192,205,229, 59,116, 77,131,
+190,235, 16,250,128,249,234, 20,103,143, 63, 68,236, 14, 24,250, 14, 62,207,112,236, 12, 98,187,197,118,115,128,201, 87,216, 92,
+ 95, 99, 57,207,241,230,219,223,192, 57,143,106,190,194,226,100,134,161,111,113,123,189,102, 43,234,104,109,249,217,159,255,119,
+120,246,171,223,226,187,223,252, 6,206,123,124,240,213,207,240,236, 23, 63,167,189, 63,227,101, 13, 39, 79, 33, 6,236,110,174,
+169,211,231, 14,229,226,241, 71,128,241,184,185,124,142,227,254,134, 15,183, 73,202, 21, 11,102,200,135, 94, 34,153,130, 8,145,
+ 62,195,226,244,140,252,198,236, 23, 15,161, 67,123, 60,208,174,126,183, 69,123, 60,106,154, 88, 76, 20, 44, 45, 54, 74, 43,239,
+129,139, 19,227, 50, 84,243, 5,242,178, 98, 59,145,227,251,146,133, 95,145,138,239,208,247, 19, 12,174,209,195, 75, 20,192,164,
+ 47, 8,186,155,135,225,133,158,216,253, 68,175,193, 2, 54,217, 81, 70, 94,243, 25,200,222, 28, 42,226, 26,152,175, 32,226, 37,
+207, 58,152,105,216, 71,210, 20,182,168, 29,179,102, 64, 76,187,180, 56,140,204,117, 46, 88,123, 70,184, 10, 2,215, 50,130,116,
+138,239, 28,134, 4,227, 50,210,123,128,104,119, 10,138,225,209,186,216,117, 5, 10, 35,150, 70,217,245, 83, 71, 13, 61, 24, 1,
+135, 40, 24, 94,235,152,153,207, 8,213,105, 90, 92,154, 4,222, 24,167,135,226,184,215, 53, 28, 45,235,117, 79, 63,200,243, 25,
+146,104, 22, 88, 80,219, 17,212, 70, 14, 51,118,249,132,174, 85,181,248,116,220, 45,158,114, 42, 24,173,254,154,248,227,165, 1,
+179,214,114,240, 13,148,249, 46,233,100,150, 63,235, 48, 12,148,141, 46, 83, 94, 65,211,194, 32,207,115,229,150, 72, 10,168,120,
+253,197,138,109,140, 65,158,101,186,218,165,105,103, 36,250,168,157,234, 52,134,137, 74, 29,163,253, 6,105,116, 75,176, 11,194,
+ 59,167,228,203,105,182,121,156,252,127,224, 76,121, 35, 90, 13, 35, 92, 13, 78,126, 75,227, 84,202,240,150, 73, 28, 25,170,128,
+ 23,247,133, 4,189, 24,171,223, 91, 76, 60,240,246,206,142,125,186,115, 7,172,230, 5,135,128,208,247,136, 49,225,253,235, 87,
+248,237,223,253, 2, 23, 79,159, 96,117,239, 2,174,168,244,133, 15, 2,109, 24, 48,217,109, 11,238,207,170, 82,217,241,188, 32,
+240,223,155, 18,237, 80, 9,239,200,135,117,226, 52, 55, 5,236, 59, 22,206, 57, 61,244, 53,138,153, 69,112, 93,211, 2,198,161,
+168, 74, 88,107,209,117,189, 42,196,203, 42,103, 26, 89,134, 33, 8,122,212,161,172,242, 17,194,194,212,184,255,159,173,247,234,
+177, 44,201,178,244,150,169, 35,174,114, 45, 67,101,100, 70,164, 46,209,138, 61, 67,206,144, 47, 3,240,141, 0,255,209,252,167,
+ 1,248, 64,144, 28, 2,100,163, 85,117, 87, 87,117,102,167, 12,149, 33, 60,194,181,251, 21, 71,152,154,135,189,205,206,245, 34,
+251,165, 26, 89, 89, 17,238,247,158, 99,182,197, 90,223, 74,162, 32,165, 6, 95, 98,100,155, 69,190,208,141,206, 66,184,122, 84,
+ 98, 52,169,208, 49,237,173, 40, 13,198,211, 49, 89, 49,172,131,237,122, 92, 93,220, 16, 46,180, 44,104, 21, 32, 68, 22, 71, 57,
+ 75, 99,232,224, 9, 68,211, 91, 55,120,212,215, 40,115,158,109, 48, 97,205,147,154,166, 30,142,213,231,201,162, 18, 60,225, 86,
+187,182,103, 79, 35, 61,228, 69, 89,241,195,128, 28,237,122,242,246, 45, 70,147, 25,118,246,182, 32,133, 32,241, 93,223, 99,181,
+ 88,226,197, 79, 47,241,235,191,250, 53, 30, 61,190,143,237,189, 45,108,110,207,242, 88, 39,230, 16,159,114,152, 20, 32,162, 89,
+206, 49,219,218,204,149,173,228,240,143,209,168,134,210, 10,205,114,142,174,105,177,127,239, 40,199, 28, 18,181,207, 82, 26, 87,
+111, 73, 20,233, 3,202,170,132,102,209, 81, 85, 87, 89,119, 80,150, 5,148, 54, 12, 19,170,134,130,173, 40,242,232, 75,177, 98,
+ 63, 68,138,119,221,220,219,195,234,246, 6,179,157, 93,194, 61, 74,129, 15,111,223, 35,132,128,209,100,130,174,235, 49,191,190,
+198,100, 99,134,178,210,144,251, 59,120,243,236, 25,138,122,132,174,109, 80,141,199, 56,252,228,115, 74,255,187, 57,135, 41, 43,
+116,173,135,136, 22,139,219, 91,152,241, 14,206,222,189,197,227,207, 30,227,244,245, 79,144, 74, 97,247,222, 71,168,103,155, 40,
+ 75,131,249,237,146, 59, 20, 77,248, 85,161,176,181,191,135,157,253,109,252,241,239,254, 17, 0,240,248,235, 63,195,201,243, 31,
+208,173,110,161,180,193,230,238, 62, 74,190, 36, 17, 61,174, 47,174,208, 54, 43, 4,239,160,181,193,254,253,143, 81,212, 35, 92,
+159,190,197,106,113,189,150, 58,198, 16,146, 60,186, 38, 11,162,169,102, 80,166,192,104, 58,195,100, 99,147,187, 90,141, 16, 60,
+133,239,204, 23,232,219, 21, 86,139,249, 16,108,196,151,184, 50, 21, 83,202,134,149, 79, 96, 11,210,104, 50, 65, 61,158,193,152,
+138,220, 32, 44, 50,237,251,192, 32, 37,139,197, 13, 9, 18,215,129, 46,136,107,249,218,252, 12, 57,231,178, 16, 8,107,148,242,
+ 97,215,202, 76,107, 69,137,117,169, 75,202,214, 44, 53, 0,103,178,211,117, 8, 87,200, 43, 37,178, 0,249,236,251, 22, 24, 96,
+ 47,113, 45, 98, 84,200,180, 91,231,177,106,194,216,242, 8,215,242,187, 71, 93,180,200,123,238,228,125,102,127, 17,217,238, 50,
+ 49,146,241,169, 90,223,233,192,157,143,107,133, 78, 96, 49,153,206,108,124, 90, 7,208,200, 93, 72, 34,254,229,213, 74, 28,210,
+225, 72, 84, 86, 12, 78,155, 20,231,153,196,123, 57,124,134,233,111, 72,241,214,100, 21, 75, 26,130,245,196, 50,234,216, 59,230,
+ 26, 8,166,215, 5, 88,107,243,196,212, 59,151,195,161, 8,202, 19, 50,207,162,107,187,188, 54,137, 49, 50,216, 74,228, 34, 35,
+ 97,106, 99, 96,253, 65,138, 67,229,162, 43, 89,144,147, 91, 32,253,239,180,150,217,133,180,110,127, 5, 51, 19, 12,219,241,214,
+191,147,180, 51,167,245, 17, 77,155, 83,102,121,138,255, 70, 12,153,133, 79,157,124,200,187,245,132,238,213, 74,229, 93,122, 90,
+ 3,202,181,194,101, 24,157,199, 44,186, 20,195, 78,236, 14, 68, 38, 93,207,201,178, 56, 4,193,172,141,236,227, 16,205,157,239,
+ 63, 49, 8, 67,177,166, 63, 17,235, 34,191, 20,115, 77,151, 90,204,194,163,224,201, 30,129,208,227,229, 15,207,240,224,201, 71,
+112,125,143,247,175, 94,193,247, 93,190,140,177,198,178, 37, 33, 24, 97, 89,109,111,105, 31,206, 74, 85, 33, 73,184, 22, 84,128,
+ 50,124,153,115, 5, 29,179, 87,215,100, 85,160, 54, 26, 33, 10,174,112, 98,190,212,210,232, 62,176,239, 16, 66, 13,118, 56, 86,
+191,211, 78,139,254,127, 93,168, 33, 96,128,115,206,165, 32, 12,160,203,249,219,130,193, 6, 50, 67,253, 6, 96, 65,200, 2, 13,
+ 83, 24,152,194,192,246, 84,244, 8, 15,116, 33,160,231,221,213,214,238, 38,110,174,110,209, 53, 61,230,215,115, 20, 85,141,162,
+ 42, 17, 86, 52, 30,119, 28, 67, 74, 49,151, 92, 84, 68, 74, 31, 11,126,224,173,139,232, 51, 90, 85,105,147,117, 7,182,183,156,
+124, 23, 56,100,197, 15,226, 29, 79, 5,138,245,142, 97, 12, 10,198,136, 97,100,173,168,104, 64,116,248,240,238, 28,247, 63,122,
+128,155,171, 27,244,109, 15,169, 4,182,182,103,168, 42, 34,135,125,244,233, 71,184,185,188, 30, 58, 41, 94, 29, 88,235,242,170,
+ 69, 73, 58, 4,187,174,205,180, 48,186,136,147,106, 93,229,191,251,228,245, 9,182,246,246,241,238,213, 27, 72,182, 74,218,206,
+102,180,112, 26,129, 87,163, 17,148, 49, 40,138, 2,179,173, 25,148,146,104,155,150,254, 89, 36, 59, 72, 89, 86, 44, 72,162,104,
+ 66,201,121,243, 33,198,172,140,174,235, 10,163,113,137,110, 14,152,170,102, 80,143,195,252,230, 6, 85, 77,138,247,229,146,192,
+ 52, 91, 59,155, 56,186,183,133,239,254,241,119, 84,180,141,199,240,221, 2, 7, 31, 61, 33, 71,129, 6,100, 77, 52,189,182,245,
+152, 95,156, 66, 22, 51, 52, 77,135,253,163, 67, 28,221,219, 66,119, 59,193,195, 79,191,192,120,115, 15,245,116,130,155,211,119,
+ 24,207, 54, 81, 84, 99,138,211,100, 1,233,159,253,135,127,143,111,254,225,247,232,219, 21, 30,126,241,103,184, 62,125,143,249,
+213, 25,234,209, 24,219,251, 7,208,166, 36,138, 88,223,224,234,252,130, 5,164, 84, 92,238, 28,221,135,212, 5,206,223,189, 65,
+179,184,226,192,165,152, 15, 71, 41, 53,188,239,249, 66, 23, 48,229, 8,186, 40, 49,154,110, 16,228,201, 5,140, 38, 99, 4,158,
+146,216,174,129,237,104, 58, 0, 49,164,121,105, 99,136,106,152, 64, 31,222,193,121,222, 73, 11,160,172, 71, 48, 76,154, 84,154,
+194, 78,164, 50,112,222,193, 59, 11,219,183,232,218, 21, 49,229,185,115, 21,107, 1, 30,217, 22, 20, 40, 76, 71, 74,205,227,212,
+176, 38, 28, 26,162, 42,115, 7,186,182, 67,244, 33,237,246, 61, 4,244,157, 2, 55,230,115,130, 71,243,146,196, 86, 1, 52,189,
+179,182,207, 63, 3, 33,122, 99,102,101, 40, 14, 52, 18, 12, 58, 25, 98, 53, 3,239,233,233,159, 57,239, 33,133,102,239,118,186,
+216,233, 52, 85, 76,130, 75, 89,235, 57,130,118, 13, 83,138,181,242,197, 59,207,158,124,153,131,140,104,253,103, 96,251, 30, 82,
+166,188,110,182,150, 41,195, 26,160, 97, 37,146, 62,152,148,193,144,206,229,116, 81,122, 31,233, 66, 74,209,198,140, 1,167,209,
+191,135,224,239,146,138,175,192,225, 73, 61,188,117,153,218, 72,226,101,166,231,249,176,150,216, 73,176, 49,114, 72,197, 44,114,
+214,166, 96,239,116,204,122,155,236, 64, 98,250, 89, 76,250,161,152,172,209,200, 48,165, 20, 60, 67, 43,189,193, 51, 15, 80,152,
+ 86,136,130, 68,192,214,195, 20, 5,179, 24,210, 4,134, 46,241,158, 87,197,137, 5,175,181,162, 85,130, 34,183, 69, 81,104,216,
+158, 82,241,214,121,248,113, 45,141, 45, 70,122,134,146, 61, 82,172, 33, 93, 37, 35,140,101, 22,242,197, 76, 75, 76,216,237,124,
+201,175, 37, 13, 82,162,169,200,249,236, 67,104,218,176,170, 78,126,247, 4,177, 17,107, 69, 99,250,167,128, 92,139,122, 5, 11,
+234, 6,122,172,166,224,117,178,129, 37,234, 82,250,144,186,213, 2, 39, 47, 94, 99,255,225,125,244,109,139,247, 47, 95,229,145,
+ 8, 34, 65, 40,188,179,121,204,221,247,164,146, 23,201, 82, 34, 34, 98,224,138, 50, 49,219, 5, 67,239,163,204,152, 63,250, 69,
+ 35, 63, 36, 18,129, 35, 77, 37, 51,230, 29, 71,155, 18,225,135, 82,149,138, 82,163,239, 58,218, 55, 27,149, 47,116,242, 78,175,
+115,117,217, 39, 27, 34,154,174,207, 69, 2,253, 12, 17,166, 80,121,239,145,202,158, 16, 34,138,162, 64, 81, 25,174,198,214, 14,
+139,148, 6,215,244,112,158,148,233,151,139, 64, 57,235, 69,137,118,213, 98,181,152, 67,233, 18,213,168, 70,195,145,174,105,156,
+ 99,173, 37,254,116, 71,121,202,130,133,123,206,250, 60,177, 48,172, 99,144, 66,240,131,135, 97,132, 31,227, 90,212, 40, 61, 40,
+ 10,196, 72,143, 81,228,139,213, 24,170,232,150,139, 62,143,148,174, 46,206,112,112,188,139,131,227, 67,204,175,175,161,141,194,
+104, 84, 97, 60,169,113,121,118,142,195,251, 7,180, 19, 95, 54,104,155, 30, 55,215,139, 12, 93, 16, 82, 66, 25,131, 64, 11,182,
+108, 39, 57,126,112,156, 19,143, 98, 32, 91, 99, 26, 41,189,121,249, 26,127,245, 31,255, 26,101, 93, 1, 81, 2,188,103,236,154,
+142, 70,250,108,195,171,234,154,173, 80,138,118,222,124,105, 81,200, 15,137, 54,149, 46,160,248, 37, 77, 93, 17,191, 41, 60, 89,
+209,152,108,109,226,246,244, 29,182,247,119, 81, 20, 5,108,111, 73,236,232, 61, 54,102, 83,132,232,177,184,190,194,253,167, 95,
+224,248,225, 1, 22, 23, 31,176,154,207, 1, 8, 34,219,105,129,237,195, 67,248,118, 5, 4, 1,101, 52, 60, 12, 16,110,177,177,
+127,132, 85, 35,176, 61,113,120,244,228, 33, 94,255,244, 3,108,223, 99, 52,219,130, 82, 2, 55,151, 87,184, 62,191, 96,224, 9,
+216, 41, 81, 96,255,248, 0,218, 40, 44,110,174,241,248,235,191, 64, 8,192,242,230, 18,155, 59,187, 24,111,108,240, 5, 3,248,
+190,197,237,213, 21, 93,138, 76,220,218, 57, 60, 66, 57, 26,227,244,205, 47,104, 87, 55,236, 93,229,125, 98,112,185,200, 85,186,
+132,247, 2, 82,143, 49,154,110, 96,182,189, 13,231,105,159, 88, 79, 70, 8,222,194,182, 13, 86,243, 27,180,203, 57, 31, 64, 99,
+ 84,163, 17, 98, 20,176, 61, 49,255,169, 75, 4,188, 35, 92,106,138, 27, 29, 77, 24, 11, 42,152,154, 40,201,234,218, 55, 29,229,
+128,219,158, 46,244,190, 31, 50,198,243,232, 61, 34,250,245,125,181,229,110, 38,102, 24, 74,136,233,224, 84,108, 25,162, 75, 66,
+ 43,189, 6, 35,145, 80, 66, 66, 40,149, 59,167, 36,186, 74,150, 56,107, 45,121,193,163, 37,216,146,214, 16, 30,249, 61, 67,162,
+206, 5, 34,156, 73, 17,115,236, 48,217, 96,197,154,184,139, 24,219,217,187,207,171,249, 32, 35, 95,252,236, 89, 15, 33,135,173,
+ 36,189, 9,130,224, 49,121, 24,172, 79,105,180,207, 92, 5,239,237, 16, 14,194, 93,125, 12, 1, 93,103,239,236,239,137, 60, 72,
+190,115, 18,125,101,185,217,176,131,167, 50, 33,239,167, 67, 0,162, 15,140, 21,142,121,178, 76,207,154,100,241,160, 26,136,106,
+ 66, 16,252, 39, 82, 6,136, 72, 5, 10,167,176,145,247,157, 3,107, 4, 24, 44, 19, 51, 63, 61,239,153, 25, 69,156,224, 49,235,
+252,128,117, 94,127,250,204, 16,147,107,192,221,217,153, 43,169,192, 30,134,220,229, 82, 83, 38, 17,125,128, 7, 5, 99, 73,153,
+158, 71,149,207, 11,228,139, 48,228, 46, 54,248,144,155,178,190,119,148, 96,153, 59,102,106,246, 60, 23, 18, 84, 67, 9, 40, 33,
+ 97,109,127, 39, 51,157,210, 0, 49, 20, 90, 25,111,158,178, 82,116, 14,106, 73,123,161,245, 48, 29,121, 71, 79,194, 20,204,204,
+ 91, 88, 23,215,197,187,154, 19,196,187, 49,173,217,226,150,126, 7,113,135, 7,175,211,136,118,253,162,240,206, 33, 68,129,162,
+170,208,119, 13,206,223,189, 71,189,177,139,209,236, 10,203,155, 27,230, 39,139,156,234,149,196, 50, 80, 68, 15,242, 28,201, 26,
+229, 96, 63,176,157,131,169,146, 48, 65,172,249,187,105,108,164, 37,241,211,251,206, 18,190,147,187, 69,173,117,174,238, 18, 78,
+ 50,129,101, 36, 43,214,109,239, 81,177,160, 75, 41, 69, 86,139,128, 44,184,147, 82, 34,136, 0, 33,129,190,181, 76, 63,115, 40,
+ 75,205, 23, 8,131, 55, 0, 98,254,114,104,139, 0,169,246, 43,238,216, 84, 36, 33, 93,219,244,172,220,167,241,147,237, 41,245,
+ 74,155, 2, 69, 85,161,170, 43, 92, 93,220,160,109, 90,140,167, 83,180, 77,131,155,203,219,188, 79,143,107,228,164,224,147,122,
+ 87, 48,247, 92,102,117,105,215, 90,104, 77, 29,253,112, 40,200,204,178,214,236,109, 87,129,128,254, 93,215,101,150,190, 82, 10,
+245,168, 2, 16,176,152,207,233,223, 87, 1, 87,231,151,248,252,215,159,226,249,119, 63,194, 57,143,146, 73,114, 69,105,240,238,
+213, 91, 60,248,248, 1,158,159, 63,195,135,119,103, 88,204, 87,240, 94,162,170, 43, 52,141,165, 42, 60,120,148, 85,129,170,170,
+209, 54, 61,118, 15,246,113,125,121, 13,192, 82,104,102, 4, 41,250,189,195,106,113, 3,219, 91, 76, 54, 54,176,184,153,211,247,
+ 99,106, 0, 17,227,217,140,124,250,206, 99,186, 49,133,179, 30,101, 77,208,161,174,233,120, 39, 43, 50, 61, 76, 27, 26, 97, 42,
+102, 25, 40,185, 22,191, 26, 3,164, 54, 24,141, 42,188,191,189,197,189,199,143,104,149, 20,129,179,147,247, 24,141,198, 80, 70,
+ 97,126,115,139,237,221, 29,220,123,244, 0,193,245,120,251,252, 21,192, 10,219,122, 50,198,116,251, 33,154,235, 51,148,147, 77,
+196,208,194, 7,133,241,230, 20,101, 1, 44,155,136,224, 46,176,185,183,131,179,215, 47,241,226,187,111, 48,217,220, 69, 57,158,
+ 97,113,115,131,219,155, 21,174,206,222,115, 50,150,132, 49,164,141,120,240,228,175,241,237, 63,252, 35,198,155,123,208, 69,141,
+211, 87, 63, 97,107,111, 23,245,120,194,187,205,128,118,113,139,171,179, 83,216,190, 99,130, 97,196,246,193, 17,170,201, 6, 46,
+ 79, 94, 99,117,115, 65,239, 0,175,137,146,253,207, 89, 71,221,178, 11, 16,186,194,100, 99, 11,211,205,109,248, 64, 69,109, 81,
+ 27, 4,215,161,111, 86, 88, 45,110,209,173,150,104,155,134, 46, 30,105,200,163,204, 32,168,156,140,197,201, 83,186, 40, 17, 3,
+165,222,145,234,152, 15, 80,165,209,245, 36, 98,116, 46,160,109, 86,204,157,224,213, 16,200,161, 16, 17, 6,158,181, 12, 28,202,
+ 17,214,124,218, 60,250,245,158,161, 86, 18, 2, 58,175, 21,180, 46,243,222, 53, 35, 51,213,176, 35, 38, 65,169, 99, 16,145, 29,
+108, 70,136,156, 59, 48,160, 86,179, 56,139,145,215,224,213, 20,237,179, 99,222,207, 15, 34, 41,220, 21, 41, 37, 69,254, 90,162,
+ 87, 58,116,135,172,107, 22, 89,113, 66, 27, 57,106,232,217, 76,197, 87,226, 6, 80,147, 96,224,189,165,137,194,154, 86,128, 72,
+138, 52,157, 32,194, 31,216, 79, 77,103,234,224,239,142,119,216,225, 57, 87, 33,167,153, 9,214, 5,112,209,107,200, 43,159, 34,
+101,149, 24,252,215, 89, 20,201, 84, 59,173,210,184, 30, 16, 50,230,116, 76, 34,110, 90, 8, 17, 6,160,163, 84, 89,164,152, 58,
+215,176, 6,252,201, 98,230,212, 17,175, 9,156, 83,247,171,180, 25,156, 79,224, 2,131,163,100,137, 98,233, 89, 72, 45, 33,139,
+193,251, 78,122, 40,195,122,133,244,252,250, 33, 58,186,208,232,186, 46,115, 65, 4, 64, 49,224,158,213,228,136,208, 74, 2,145,
+244, 61,224, 66, 32,237,232, 83,180,179,227,117, 67,246, 69, 8,153,185, 8,119,215, 62,169,195, 23,121, 18,164,148,228,149,227,
+176, 51, 72,163,120, 40,149, 3,207,210,119, 40,214,198,245,105, 18, 77,223,247,240,238, 15, 84,205,136,152, 56,243,224,137, 0,
+ 0,173,180,132,128,202,152, 82,170,156, 3, 20,251,230,218, 85, 67,157,175, 46,177,115,124,143, 5, 69, 54,143,117,165,214,156,
+ 95, 45,152,209,141,129,241,156, 1,251,226, 78,186,209,160, 30, 92, 31,175, 12, 41, 54,222, 81, 24, 69,226,245, 14,123,191, 65,
+241, 71,187, 84, 98,188, 67,200, 1,216, 34,233,207,245, 33, 16,226,207, 13,182,151,244,225, 41, 37,161,234,130, 68, 45,130,129,
+ 21,129,186,118, 99, 76,190,104,165, 26,128,255,244,176,243,223, 23, 57, 81, 12,233,203,167,221,126,223, 45,113,123,189,132, 80,
+ 26,179,141, 9,132,240, 56,125,119,129,241,108, 19, 82, 74, 92,156, 94,230, 3,195, 90,155,127,174, 52,110,162,203, 92,177, 61,
+200,179, 7, 53,102,209, 80, 74, 76, 83, 28, 82, 19, 2, 5,119,244, 29,127, 15,206,163,107, 91,232,201, 36, 87,201, 85, 93,177,
+205, 35, 97, 39,123,196, 40,113,120,255, 16, 31,222,126,200,123,124,219, 83, 24,201,203,159,223, 96, 52,153, 96,181,248, 5,203,
+249, 18,101, 61,230, 44,247, 10, 82,148,144, 98,140,186, 38,171, 99,179, 92, 97, 60,157,224,242,236,146,130, 78,218, 6,109,211,
+ 96,107,159,217,224,193,227,252,195, 57,142, 31,222,199,203, 31,159, 81,172, 32,187, 14,198,147, 9,122, 75, 69,214,120, 58,130,
+210,196, 21, 48, 69,129,197,205,156, 14,168,130,180, 16, 82,202,236,111,149, 50,146,255,151, 87, 63,218, 40,216,182, 69, 81,214,
+232, 87,115, 76, 54,102, 16, 82,162,109, 58, 68, 14, 98,216,222,221,192,106,213, 96, 52, 42,177,115,112,136,163, 71,247, 96,219,
+134, 8, 96, 82, 32,170, 10,219, 7, 7,232, 87, 11, 52,171, 30,147, 45, 1,219, 68,108,238,237,145,198,228,186,195,235,103,207,
+225,251, 21,118, 15,119,241,111,191,251, 71, 72,173, 49,222,220, 69,116, 61, 86,141, 71,179, 88,176, 26,151,158, 41,215, 6, 28,
+222,251, 24,203,171,115, 44,231, 75,140, 55,247,241,226,155,223, 97,107,119, 23,229,104,130,200, 7,175,237, 45,154,101, 3, 93,
+140, 72,205, 30, 61, 54,246, 14, 48,154,109,225,252,228, 45,230,215, 23,217, 37, 34, 57,170, 56,132,158, 31, 6,137, 40, 12,138,
+209, 8, 91,187, 59, 48,229, 40, 95, 46, 85,101,208, 53, 45,154,197, 45, 86,243,107,178,141,242, 26,136,152, 13,150,108,147, 50,
+ 32,138, 20, 43,201,227,111, 37, 80, 23, 99,212,163, 17,119,127, 76,190, 19, 10,125,239,209,247,196,162,104,155, 37,162, 31,252,
+203, 66, 26, 14, 90, 18, 67, 78,182, 92,203, 93,224, 67, 93,164, 46, 44, 6,242,231, 34, 81,238, 2,239, 79, 75, 58, 80,243, 14,
+ 83,173, 37,244,197, 28,182, 34,153,235, 45,214, 25,218,105,192,157, 34,162,227, 48,125, 36,234,104,204,177,154,116,113, 71, 8,
+ 21,215, 44, 75, 88,219,191,179, 11,134, 47,179,116, 70,105, 41, 88,160,197, 72,212, 72,144,155,176, 14, 36, 97,124,103,228, 11,
+ 62,179,237,215,236, 73,233,172, 77,222,123,103,187, 76, 95,203,197,133, 0,130, 11,208, 60,209, 33, 98,160, 26, 4, 93,204, 78,
+149,140,202, 14,124, 70, 12, 43,186, 84, 24, 23,131,151, 92,144, 91, 37,101,247,209, 25, 73,208, 33, 41, 37,156, 31, 4,138, 33,
+196, 44, 70, 12,158, 86,171, 84,172,196,140, 13,167,248,211,181,212, 48,165,224,172,103,216,150, 96,170, 40, 53, 35,133, 41, 24,
+141, 75, 2,215,188,234,228,239, 43,237,223,147,171, 41, 35,124, 35, 53, 0, 90, 83, 3, 41,148,206, 83, 21, 41, 5, 4,139,212,
+ 72,155, 37,216,240, 48,140,178,165, 0,132,150, 8,189,207, 69,153,214, 10,203, 37,145, 74, 53, 79, 65,165,212,232,251,142,167,
+204, 88,155, 40,201,172,187, 66, 28,246,226,226,142, 47,125,125,106, 33,178, 94, 43, 61,187,105,100,159, 38, 4,145, 1,100, 73,
+ 9, 47, 98,190,170,241,167,255,151,196,198, 67, 17, 17,239,168,230,215, 39, 19,218, 24,234,142, 13,239,212,140, 81,104,219,142,
+246, 80, 61, 7,140, 88, 11,204,175, 49,219, 59,192,198,206, 14,110, 47, 47,184, 2,228,202, 67, 27,126, 17,192,187, 97,222,191,
+240,200,221,251, 0,197,163, 59,197,220,104,150,236, 13, 47,134,247,208,236, 67,244, 62,174, 37,119, 37,165, 34,117, 17,101, 93,
+228, 63, 51, 61,252, 69, 97,214, 66,104,232, 3, 44,149,225,228, 50, 2,198,216,222,194, 90, 63,132, 49, 8,129, 24, 44,179,146,
+ 5,234,186, 96, 59, 28,141,215,211, 11, 81,148,100,191, 35,210, 27, 9, 70,172,165,128,154,190,163, 60,116,193, 92,107,122,169,
+129,213, 98,137,158, 67, 67,118, 14,118,112,123,117,131,106, 52,193,209,253, 2,175, 95,188, 65,219,246, 89,109,155, 46,246,166,
+233, 88,176, 67, 49,180, 54,120, 8,132,188,155,213, 58, 37, 15, 81, 70,187,247,158, 34,100, 13,137, 73,108,239, 97, 76,193,227,
+ 55, 26, 55,105, 67, 2, 19, 74,141,115,153,177,127,250,238, 3, 30, 63,125,128,211,147, 83, 44,110,151,156,187, 30,176,152,175,
+ 0, 92,224,254,227,199,152,109,206,112,117,121, 13,101, 45,202,170,196,214,206, 54,180, 2,154,229, 60,179,193, 47,207,207,241,
+233,151, 31,227,246,230,134,227, 68, 53, 97, 95,149, 66, 61, 26,193,118, 45,174,207,207,113,252,232, 55,152,204, 78,225,122, 7,
+207,160,148,122, 50, 66,127,185, 66,136, 1,101, 61,202, 83,136,228, 52, 0,235, 40,146,103, 88, 27,178, 4, 57,235, 32, 69,200,
+ 14, 7,178, 90,134,156,149,190,119,239, 8,182,107, 17,163,196,106,177,192,198,230, 12,182,239,128, 24, 49,219,156, 97,255,193,
+ 67,196,224, 72, 1, 31, 35,172,243, 56,254,232, 35, 0,192,242,234, 28,147,173, 61,136, 96, 49,219,221,133,136, 22,203, 38,226,
+231,111,127,192,252,226, 45,254,242,127,250, 15,120,243,211,247,112,206, 97,247,240, 17,234,138,216,239,171,142, 98, 91,173,243,
+208, 74, 65, 10,194,208,126,242,245,151,248,233, 15,127,192,193,163, 39,248,249,247,255, 47,102,155,219, 16, 74,161, 93, 46, 32,
+165,192,245,114,201,122, 0, 58,248,140, 25, 97, 99,119, 15,229,104,140,139,247, 39, 88, 92,157, 83,247,203, 93, 8,214, 34, 84,
+163, 16,144,166, 64, 53,222,194,246,193, 94,230,231, 39, 11,208,106, 62,199,106,126,141,190, 93,162,103,139,101,207, 73, 89,206,
+245, 16,210, 64, 23,150, 56,238, 9, 78,194, 24,214,228,253,143,222,195, 57, 75, 69, 38,139, 81, 73,248,218,195,245, 45,108,215,
+178, 98,153, 14, 42,207,226, 55,239, 66,246,151,131,211,196,136,159,237,249,231, 27, 38,116, 67,118,180,228, 14, 51,121,178, 19,
+ 96,104, 45, 95, 34, 29,174, 33, 14,190,252, 96, 51, 24,134,206, 15,153, 45, 87,137, 37,158, 70,252,220,204,220,241,191,167,203,
+ 92,170,100, 85, 75, 93,186, 67,100,245,177, 15, 97, 16,102,101,207,119, 74, 15,211,185,232, 72, 19,132,100,237,114, 54, 12,129,
+ 74,113,200, 88,143,108, 11, 75,251,220, 92, 76, 9, 18,125,210,207, 35, 25, 75,203, 33, 52, 60, 69, 72,106,250,132, 55,141, 34,
+230, 41, 66,186, 52,188,227, 9, 0, 79, 9,124, 10,169, 9,228, 58,162,207,113,176,235, 73,206, 34,160,253, 49,119,249, 50, 65,
+102, 72,151,148,121, 25, 33, 32, 4,153, 3, 89,180, 81, 96,247,216,157, 2,204, 20,154,173,172,158, 21,249,124, 33,199,144,127,
+150,129, 89, 79,239,185, 46, 43, 22, 13,115,241,195, 66,202, 32,134,156,114, 68, 34,124, 2, 34,195,101, 82,145,146,172,113,138,
+225, 53, 33,143,212,125, 14,248,162,203, 22, 8,158, 27, 63,163,208,117, 61,148, 18,128, 7,143, 95, 0,151, 0, 0, 32, 0, 73,
+ 68, 65, 84, 44, 55,183,129,215, 47, 49,172,161,201,105,100, 67,129, 57, 73,181,206, 63,151, 92,239,166,211,165,155,199,236, 33,
+ 79, 53, 82,209,152,213,254, 97, 16,234, 65,252,127, 39, 65,105, 98,189,206,139,143, 57, 63,253,255,255,242,215,193,147, 63, 57,
+ 9,229,210,184, 38,184,158,191, 56, 15, 21, 60,164,136,232,219, 6,227,157, 67,172,230,115,120,215,242, 11, 76,156, 99,193,130,
+ 15,109, 20, 44, 36,148, 24,224,247, 66,166,189,146,204,138, 75, 83,168, 65,253,201,190, 78, 18,111,200,172, 8, 36,204,108, 64,
+ 81,146,111,218,148,134,153,201, 36,247,247,184,155,144, 3,182,181,145, 39,209,231,106,214,246,142,237,110, 98,205,102,150, 72,
+103,195,190, 35, 77, 5,138, 82, 15,105, 78, 28,234, 66,172,246, 14,182,247,195,139, 31, 61, 31, 34, 44, 40,235, 93,222,231,216,
+222, 99,113,187,192,251,183, 30, 91, 59,219,152,110, 84,104, 91,137,163, 7,199,120,249,211,115, 2,171, 36,166,111, 14, 88,160,
+159, 95,165, 12, 93, 41,160,162,128, 44,139, 28, 29, 40,249, 69,204, 94, 80, 22,159,152,194,228,212,184,241,100, 4, 41,129,170,
+ 46, 81, 85, 5, 7,161, 4,172, 22, 13,250,190,195,252,250, 10, 31, 78,198,216,216,218,194,245,229, 13, 86,203,134, 62,107,231,
+ 48, 26,143,240,226,199,231,120,250,213, 19,188,123,125,130,209,184,196,246,238, 54,135,188,180, 16,240,184,189,190,198,252,230,
+ 54, 11,120,138,162,192,104, 92,101,165,116, 85,151,112,147, 49,186,102,133,102,181, 66, 8, 17,227,233, 4,139,155, 69,182,113,
+212,227, 17,110,174, 26,216,206, 81,165, 47, 64,157,186,214,232,218,158, 31,122, 58, 4,138,138,126,127,205,185,247, 96, 81, 74,
+ 34,232, 5, 8,168,178, 70,215,222, 98,188, 49,197,226,250, 6,213,100,131,198,244, 90, 34, 4,133,201,184,194,108,123, 11,213,
+100,138,110,213, 32,186, 22, 77,211, 96,178,189,143,217,206, 14,154,235,115,168,178,198,100, 86, 67, 0, 88,221, 92,226,242,114,
+133,213,202, 97, 53,191,194,238,193, 30, 38,147, 18,223,253,253,207,216,216, 61,198,230,206, 54,209,215, 58,135,222,146,192, 84,
+ 75, 64,203, 0, 1,143,227,143, 62, 67,223,182,216,185,247, 24,207,255,248,247,216, 57, 56, 68, 53,222,160,139,204,247,184, 58,
+ 59,227,142, 64, 18,221,203,148,216,216,217, 67, 61,219,194,242,234, 2,209,247, 40,235,113,198,238, 10,145, 92, 16, 18, 8, 17,
+101,189,129,241,198, 46,198, 27, 91,119, 16,177, 2, 17,139,155, 43,180,171, 91,116,109,203,108, 4,178,235, 81,167, 73,130, 58,
+199, 23,182, 9,140,239, 13,180,143,174,199, 35, 20,101, 65,130, 85, 79,222,226,166,105,208,181, 14, 33,244,240,174,135,119,150,
+ 39,123, 26, 62,114, 8,168, 20,136,142,199,229,190, 31,114,188, 19, 98,118,109, 26,151, 58,153,224, 29,123,200,117,182,199,105,
+ 83, 12,170, 98, 86, 47,103, 4,103,126,163, 1, 1, 14,107,201, 72, 83,121, 39,190, 53, 53, 3,153, 86, 23, 83,182, 53,103, 68,
+228,201,161, 95,203,221, 14, 92, 20,251,187,221,153,243,119, 40,114, 67,188, 42,101, 78,104, 99,232, 89, 75, 28,240,161,103,201,
+221,164, 54, 10,174,119, 67,106,152,146, 28,203, 26, 89,216, 55,208, 58,147, 77,147, 28, 45, 10,208, 34, 3, 73,132,212, 64,240,
+ 16,130,247,229, 84,237, 33, 4,199,162, 53,154,232, 56,231,169,251,244, 14, 69, 81, 65, 72, 74, 95, 75,197, 81, 76,217,223,108,
+241,243,150,138, 62,173, 5,140,161, 9,134,227,142, 90,112,144, 83,138,185, 77, 98, 70, 74, 71, 11,128, 78, 23,172, 90,243,109,
+135,193,107, 15, 64,200, 34,127,135,206,186,140,114,133,143, 57,245,207, 89, 71, 33, 53, 84, 39,144, 11,166,183, 28,154, 21,115,
+ 1, 73, 44,134,200,244,188,152,163, 82, 93,202,244, 96,235, 33,101, 90, 4,210,108,177, 80, 77,138,225,217,112, 46,240, 90, 97,
+200,233, 80,235,119, 96,134,191,196,172,179, 32,171, 26,141,189,233,125, 27, 86, 53, 50, 39,153,138, 12,170, 1, 23, 49, 41,122,
+ 46, 77,128,242, 8,254, 79,167, 76, 2,195,152, 63,135,166,137,204,196, 87,114,125, 21,148, 70,244, 98,141, 31, 15,232,152, 57,
+195,128, 18,244,229,105, 99,224,250, 62,123,116,189,115,104,219, 14,144, 11,148,245, 62,182, 14,143,112,250,234, 37, 95,228,100,
+201, 72, 40,201,196, 76,246, 66, 66, 1,107, 15,131,200, 35, 23,165, 21,172, 13,208, 70,176,128, 67,101,108, 43, 85, 64, 52, 70,
+ 18, 49,162,170, 11,174,104,193,123, 58, 74, 10, 10,107, 97, 14, 41,214,111, 29,255,167, 20,129, 0,160, 35,188, 27,188,245, 69,
+105,178,194,213, 24, 5,165, 37,250,158,147,209, 24,102, 17, 3,160, 10, 94,166,177,151,212,177,237, 44, 41,100, 7,107,159,227,
+238,133,188,182,150,173,106, 84, 53, 3,182,109,112,118,114,130,235, 75,186, 24,202,209, 8,159,253,250, 11, 60,251,238, 39,156,
+159, 94,230, 61, 76, 96,109, 66, 26,245, 71, 36,123, 27,161, 76,169, 59, 79,227, 59,130,244,132, 32,201,147,174, 13,148,162,202,
+175, 44, 75,148,149,225, 85,130,166,128, 19,158, 76, 40,173,113,123,122,129,174,109,241,252,135,231,248,252, 87,159,161, 89,117,
+ 56, 59, 61, 71,201,152, 91,219, 59,152,162,197,171,103, 53,126,251,215,191,197,237,245, 77, 78, 23,147, 82, 97,181,106,112,125,
+117,205,118, 64,122,201,118,246,183,243, 62,208,246, 84, 84, 77, 55,166, 88,220,220, 66, 74, 96,113, 59,199,206,225, 1, 86,139,
+ 22, 69, 89, 64,105,133,122, 84,147, 72, 17, 17, 69, 85, 66, 8, 42, 66,132, 4, 22,243, 21,121, 81,181, 68, 12, 36, 34, 76,123,
+184,144,198,109,188,238,233, 91, 11, 93,141,177,177, 57, 65, 35,123,242, 73, 55, 13,234,233, 6,148,164, 98, 7,193,161, 40, 70,
+ 56,250,248, 19,172,110,151,152,110, 77,240,238,249, 91,152,178,198,241,227,143, 81,153,128, 27,215,161,154,236,192, 20, 6, 23,
+111,223,224,228,205, 41,246, 30, 62,193,242,228, 5,170, 82,226,243, 63,251, 45,158,127,251, 7,168,162,194,222,241, 49, 68,232,
+112,123,117, 13,168, 49,250,118, 5,239,123, 24, 21, 32, 88, 17,252,241,175,126,133,118,213,226,205, 15,255,128,157,253, 61,148,
+163, 9, 89, 71,251, 6,215,103,239,233, 66,151, 10, 34, 58,120, 68,204,182,119, 48,222,216,192,213,251,247, 88,221, 94, 33, 10,
+242,239,123,239,160,117, 65, 5, 35, 11,165,198,179,125,212, 27, 59,168,199, 27,121, 58, 4, 4,216,190, 67, 51,191, 66,223, 46,
+ 96, 45,141,215,251,190,135,117, 30,214,246, 40,202, 26, 34, 10, 8, 86,160,123,103, 9,194, 81,128,153,251, 53,170, 81,157, 11,
+223, 16, 20, 92, 0, 11,104, 61,156,237,224,108,207, 29, 91, 68,144, 50, 31, 56, 8,113,109,108, 76,214, 46,107,187, 44,134, 26,
+120,228, 76,210, 74,126,115,105,114, 42,155,214, 5, 95,154,195,101,155, 80,160, 96, 13, 13,117, 92,220,237, 59,203,211,181,225,
+239, 77,148,174,192,232,215,164,203,241, 28, 67, 27, 19, 43,158, 59,230, 20,162, 65,120,211,116,198, 32,171,191, 19,188,132, 10,
+121,149,189,216, 42, 91,120, 85,198,224,166,125, 39,216, 2,150,118,214,136, 49,195,168,164, 16, 89,123, 34,185, 8, 35,180,108,
+ 28,192, 57, 0, 77, 78,125,160,110, 44, 14, 28,130,248, 39, 1, 56,228,251, 6, 36,116,142,114,150, 82, 19,112,142, 47,130,100,
+ 1,165,149, 5, 6,212,106, 36,171, 94,112,142, 45,107, 58,123,180,125, 96,106,155, 72, 25,224, 67, 14,121,154, 50,166, 56,238,
+ 52, 97, 21,144,107,193, 86, 50,127,103,233, 76, 78,214,183, 36,255,114, 46, 48,224, 75, 12, 99,118, 73,225, 43,228,170,114, 40,
+202,130, 38, 30,140,154, 78, 34, 7,197,196, 62,191, 38, 68,211,134, 9,162,220,197,219,174,203,164,204,224, 83,102,132, 96,154,
+157,131, 86,130,182, 63,116, 83, 18,171, 33,241, 24,146, 74, 95, 82, 97,164,164,128,245,131,207, 92,138,181,196,190,108,181, 76,
+186, 13, 22,155, 99, 0, 30, 37,119,198,154,174,157, 93, 12, 73, 32, 23,215,168,115,131, 22, 56,174,161,129,169, 51, 23,119,172,
+222,105,242, 37, 56,194, 71, 32, 66,251, 8,136, 16,208,247, 46, 87,151, 49, 6,130,252,243,200, 47, 70, 7, 89, 80, 55,213,220,
+222,160,156,110, 96,115,111, 23, 87,167,103,144,154, 82,147,188,247,208, 69, 65, 35,238,112,151, 10, 69, 94,248, 0, 93,208, 11,
+152, 98,246, 28,127, 1,206, 57, 20,165,102, 75, 3, 95,114,145, 46, 7,239, 67,254,133,138,210, 12,133,129, 81, 40, 74,131,224,
+169, 96, 72,160,137,244, 82, 36, 15,100,170,206, 83,117, 20, 98,164,145, 58, 87,190,214,122, 20,133,206,161, 50,233, 63, 9,144,
+ 66,191, 67,215, 17, 44,198, 24, 77, 48,127, 46, 16,218,142, 44,105,182,119,217, 95,158,241,126, 60, 33,160,238,138, 72,100,207,
+191,255, 17,163,233, 12,251, 71, 7,248,252, 55, 95,227,197, 15, 63,227,245,203, 55, 89,156, 68, 47,249, 32, 64, 12,153, 34, 52,
+132, 19,148, 5, 33, 96,149, 82,156, 9,110, 80, 85, 21, 66,112, 12,138, 49,180, 67, 23, 20, 16,208,181,116,104, 8, 14, 40, 48,
+ 69,129,197,237, 28,183, 55, 87,248,249,135, 26,247, 63,122,136,139,243, 75, 34,219,105,178,131, 20, 85,137,241, 88,195, 20, 21,
+ 54, 54, 3, 62,156, 92,161,240, 17, 93, 71,107,153,162, 44, 17, 53, 29,180, 93,211, 97,123,111,103,224, 70, 59, 15,105, 42,184,
+ 62, 96, 50,155,194,217, 30,183, 87,215,116,105,205,102,228, 79,143, 73,204,196, 35, 86, 37,161, 11,131,201,198, 20, 93,107,209,
+ 53, 29, 87,202,200, 33, 28, 66, 41,120,235, 88, 71,225, 16,225, 17,133, 69, 12, 17, 7, 15, 31,194,118, 29, 54,118,182,105, 71,
+ 43, 13,116,138,140,148, 64,189, 49,198,116,103,143, 39, 9,204,225, 15, 17,123,247, 30,162,170, 75, 52,183,103, 40,234, 49,234,
+113,141,235,211,247,248,254,143,223, 99,247,193, 19,216,174,129,239,230, 56,122,244, 8, 34,116,184, 60, 61,197,222,131,167, 64,
+116,184,185,188,198,124,222, 96,188,181,129,232,174, 33,130,165,110,183, 52, 56,254,228, 51, 76, 55,183,240,237,223,253,111,216,
+216,218, 70, 49, 26, 67, 32,192, 54,115, 92,188,127,199,214,150, 8, 83,210,115,183,185,119,136,237,163,123, 56,123,243, 26,171,
+155, 83,132, 0,152,178,130, 79,164,198, 16,121, 44, 45, 49,221,218,197,104,186, 13, 83, 22,176,150,170,126, 66,188,182,184,189,
+ 58, 71, 12, 62, 63,143, 93,215,161, 93,173,114,135,103, 93,200, 94,127,250,239,123,152,210, 67,235, 17,170,209,152, 66, 50, 64,
+164, 47,231, 19, 48,132,132,137,237,106,145, 11, 86,109, 10,244,206,145, 26,217,210,232,218,135,152,173, 82, 16, 67,252,242, 58,
+ 23, 59, 93,160, 57,204, 34,217,189, 98,132, 49,101, 70,255,146, 50, 92,241,193,157, 18,171, 34,139,207, 56,115, 58, 14,216,224,
+129,198,152, 66, 67, 88,221, 29,104,186,229,115,244,168, 92,243, 0, 71,246,134, 99,136, 64, 77, 16, 31,200,129, 62,151,244, 63,
+ 44,198, 74,227,248, 16, 34, 10, 38,146, 9,222,147, 74, 30, 3,123,230,204,135,148,105,159, 97, 37,200,204,134, 44,146,145,146,
+213,223,200,205, 75, 26,217,166, 44,121,145,109,113,248, 19, 6,185,202,151,120, 20, 4,211,233,251, 46,175,178, 36,251,222,139,
+162,204,211, 15,239, 2, 76, 65, 69,206,112, 49,113,190,124,246,141, 71,136, 56,232,144,168,192, 72, 25, 25,122,200,231, 72,238,
+ 4, 46, 24, 10,230,122, 80,129, 55,136,194, 98, 76,252,129,180,235,151, 57, 45, 16,136, 16, 74,128,148, 27, 49, 83, 8, 41, 31,
+ 39, 77,130,213,157, 0, 31,178, 84, 82,152,149, 76, 90,140,100,246,146,146,121,237,180,106, 72,197,171, 82, 50, 23, 90, 9, 11,
+107,109,191, 54,251, 9, 72, 63,145, 96, 17,170,144, 18, 50,143,240,105, 4, 30,114,238, 73,164,169, 99,162, 33,176, 70, 34,198,
+136, 32,249, 41,226, 6,109, 8, 91, 17,107,250,168, 20,200, 66, 43, 20,228,154, 78,220, 25,171,139,245,125,250,128,143, 27, 80,
+180,156, 58, 71,246, 81, 46, 56, 50, 57,106, 77,158,239,172,207,216,191, 16, 28,148, 2,188,237,225,122, 78, 88,235, 41, 52, 99,
+ 52,157,210,216, 69,137,252, 97, 9, 1,138,105,228,202, 60,225, 11,201, 83,136, 76,159,114,172,118, 20, 28, 76, 79,162,139,144,
+ 5, 54, 49,146,189, 99, 64, 1,166,152, 77,172, 81,215,232, 23,166,203, 94,176,184, 44, 49,221, 99,142,119, 77,151, 90,218, 31,
+101, 64,190,162, 81, 59, 21, 4, 50,143, 52,164, 38, 33, 90,219, 90,180,109,143,182,233,136,223,205,135, 37, 89,208, 92, 78,166,
+ 91, 71,246, 5,246, 57,230, 14, 60,146, 7,221, 89, 18, 23,157,159,188,195,183,255,252, 71,188,124,246, 22, 79,191,254, 18,127,
+254,239,126, 59, 84,157,124, 49, 38,114,158,115,204,170, 22, 2,227,201, 8, 91,219, 27, 24, 79, 71,140,109,165, 16,153,178, 42,
+ 33, 21,113,239,139,194,240,239,197,222,125,246,147,123,103,115,180, 38,133,218,144,207,242,245,139,231,168,199, 83,220,123,112,
+ 12, 99,168, 40, 26, 79,106, 60,253,252, 49,219,220, 78,135, 14,211, 57, 24, 99, 80,141,106,212,227, 49,202,154, 84,254, 93,215,
+ 98,182, 57,227, 21,137,129, 46, 76,222, 73, 17,165,143,198,246, 74, 73,236, 29,237, 96, 52,169,115,247,166,180,132, 97,107,202,
+104, 60, 66, 61,161,221,186, 50, 67, 64, 67,162, 77,133, 16,161,211,239,199,168, 97, 93, 24, 84,227, 49,182,182,103, 0, 34,166,
+155, 83,132,224,177,127,124, 8, 41, 3,138,130, 88,248, 17, 18,219, 7,123, 44,192,163,169,204,206,225, 33, 70,179, 25,140, 38,
+ 16, 78, 61,221,132,109,110,240,199,191,255,103, 76,119,143,113,246,238, 29, 16, 3,170, 74,225,147, 47, 63,197,247,191,255, 61,
+198,155,135,168, 71, 5,108,187,194,229,217, 25, 76, 89,211,229,101, 23, 64,236,104, 90, 34, 37,238,127,250, 21,190,249,219,191,
+193,120, 58, 70, 61,157, 66,138,128,155,243,247,184, 56,121, 67,148,184, 24,178, 64,115,115,247, 8,219,199, 15,113,121,242, 22,
+183,103,111, 97,187, 14, 2, 30,205,226, 6,182, 89,192,219, 6, 2, 17,163,233, 6,182, 15, 31, 96, 99,247,152,211,219,104, 42,
+214,181, 13,250,102,142,213,237, 85,214,104, 56, 31,176, 90, 46,208, 53, 43,222,133, 15, 28, 7,154,246,248,220, 97, 43,173, 24,
+205,107, 96,202, 2,210, 16,193, 76, 42,197, 92, 5, 7,103, 59, 90,141,241, 69,213,119, 61,171,210,177,230,195, 78,153, 2, 34,
+143, 74, 37, 95,202, 41, 26, 51,249,194,147,231, 91, 96,192,206, 38, 85,119,100,248,139, 41, 6, 70,119,238, 85,248,123, 15,108,
+159, 36,220,107,204,161, 29,193,199, 59,227,208,129,226, 62,248,223,115,154,162,144, 60,225, 72,145,151, 17, 62,184, 33,130,147,
+ 87, 6, 41,230,149,254, 29, 78, 13,147,195,184, 94, 74,197, 23, 20, 50, 14,122, 29,113,235,152, 67, 31,217,147, 79,222,243,248,
+ 39,194, 87,149, 49,210,169, 41,176, 46,228,117,165,231,209, 62,214, 58,116,173,239,238,242, 5,227, 96, 9,219, 76,140,125,231,
+ 61,217,216,216,250,149, 66, 99, 4,227,116, 29,231, 98, 68,112,241,193,154, 12, 58,119, 4,115, 40,100,230,102, 36,238, 65, 34,
+214,133, 20, 4, 19,169,176, 72,164, 62,210, 5,164,103,130,240,182,166, 48,208,218,100,142, 72,224,110, 56,137, 21,210, 89, 25,
+153,170, 55,196,228,138,252, 28, 40,142,242,150,107,211, 25,109, 24, 36,195, 58, 40, 99, 82,209, 23,178,160, 77,107,210, 22, 41,
+153,224, 46,158,169,161, 60, 46,231, 41,237,250,189,169, 20, 89, 30,211, 26,118, 61,218, 90,166, 0, 21,158, 66, 32, 23, 88,244,
+189,148, 69,137,170, 44, 9,164,147,161, 73,114, 96,188,139,132,146,101,166,189, 84, 80,202,228, 66, 86, 74,157,237,157, 41,240,
+135,231, 43, 67, 70,123, 18, 75,166, 52,188,164,243, 16, 26, 90, 72, 9,215,219, 92,217,248,100,237,210,212,205,118,150,198,115,
+ 69,201, 31,150, 16, 80, 50, 0,162,192,104, 58,165, 78,193, 58, 72,197, 36, 56,164, 17,116,230,217,229, 17,125, 2, 38, 72,173,
+ 80,104, 5,231, 57,184,132,105, 75,166, 52,136, 33,102,158,175,247,196, 70, 79,162, 19, 41, 35, 32, 34,137,120, 66, 96,133,165,
+204, 35, 16,165,249,197,230,234, 60,216,100,121,138,185, 66, 78,176, 5,109,210, 62, 95,176, 69, 2,136,158, 20,239, 67,134,122,
+132,179,150,128, 58, 82,230, 78,223,246,238, 79,196, 9,100,111,203,123, 56, 68,182,224, 16,237, 42,117, 44,148,192, 6, 88,219,
+225,213,207, 63,227,195,219,247,248,226, 55, 95,225, 63,253, 47,255, 9,223,252,211, 55, 56, 59,189,228,169, 3,249, 29,203,106,
+204,194,189,146, 46,213,130, 68,134,213,184,226,253, 35,137,197, 52,115,243,211,216,191,239, 98, 14,195, 81,146, 42,212,219,171,
+ 57,186,206,162,105, 58, 20,133,193,120, 50,193,106,185,196,171,103,175,240,244,139,167,184,190,186,134, 82, 10, 95,253,230, 51,
+108,238,108,226,250,226, 6,215,151,215,104, 27,139,167, 95,126,140,179,247, 23,252,251, 68,120,219, 99,181, 32,101,121,179, 92,
+225,225,227,163, 44,248,162,196, 57,129,122, 92,195,118, 29,165,141,185,128,182,105,177,185,189,129,197,237,138,200,115,147, 10,
+101, 93,178, 88, 42, 66, 23, 5, 20,231,173,147,243,129,158, 67,234, 58, 61, 11, 44, 89,248,164, 21,170,186,134, 84, 26,163,233,
+ 6,156,237, 49,154, 76, 32, 16, 81, 86, 37,198,155, 19,220,158,159,194,104, 9, 17, 11,220,251,228, 49, 78,222,156,162, 40, 12,
+186,198,162, 30,213,112, 14,152,110,140,112,253,225, 45,198,179, 13, 24, 35,241,187,255,243,111, 81, 78,118,112,113,122,137, 66,
+ 3,182,153,227,248,241,199, 88, 94, 95,193,121,129,227,135, 7,240,221, 10, 39,175,223,161,235,122,140,183,106, 52,203, 5,224,
+ 87, 52,213,137, 17,159,254,229,127,196,234,234, 3,148,150, 40,138, 9,162,239,241,225,237, 47,152,223, 92, 33, 6,207,123, 62,
+170,220,183,247, 15,113,240,209, 39, 56,123,251, 11, 46, 63,188, 38,123, 14, 71, 22, 39,157,139, 54, 6,163,233, 6,166,219,251,
+ 80,166,204,137,131,205,178, 69,112, 84,176,217,110, 5, 31,124,166,186, 17, 8,166, 33, 29,137,210,236,116,149,204,254, 86,108,
+247, 41, 81,141, 70, 25,179, 25,185,168,140,105,212, 11,192,123,139,190,235, 50,221,203,121,143,200,187,222,222, 58,154,216,192,
+231, 68,173,108,183, 97, 56, 71,138,181,164,105,109, 96, 31,179,230,188,241,130,242,160,133,132, 84,132, 35,206, 78, 93,230,187,
+ 43, 69,241,166, 50,147,231, 72,204, 69,239,176,231,145,172,200,182, 44,193,187,209, 20,226, 18,216, 6, 6, 17,179, 77, 73,102,
+181, 53,178,205, 76, 10, 22, 30,242, 62, 85,112, 7,148, 46, 52, 41, 21,188, 72, 62,116,157,247,160, 73, 20,247,167, 59,124,234,
+208,124, 30, 31,251, 28, 60,179,206,249, 30,192,226,142, 71,243,224,203,196,218, 62, 91,182, 2, 79, 54, 60,103,181, 39, 12,110,
+200, 66,178,193,151, 13, 17, 73, 5,158,124,226, 66,115, 22,132,186,227,171, 87, 24,176,174, 49, 56,110,134, 6, 62, 63,120,127,
+108, 45, 9,168, 83,145, 46,184,155, 22, 94, 32, 40,154,130,169, 28, 92,163,178,159,155,208,207, 5,159,207, 58, 79, 8,164, 34,
+206,188, 90,195,119, 83, 40, 13, 83,229, 98,162,235, 13,192, 30,193, 5, 73,240,196, 63, 73,160,160,244,119,122, 79, 59,241,212,
+225,165,162, 72, 41,106, 24,250,142, 10, 83,195,147,230,100, 31, 78,235, 44, 26,179, 7, 40, 41, 16, 83,115,233, 35,221, 37, 61,
+161,201,147, 0, 47,248, 8,153, 62,131,136,188, 63,215, 90,103, 18, 94, 18,203, 73,165, 40,110,155,131,115,156,179,121, 58,146,
+214,200, 89,119,225,104, 2,169,146,222,193,243,106, 51,242, 52,133,191,219,244, 14,164,172,122, 90, 91, 13,236,119, 2,178, 1,
+186,172,106, 68,239,208,179,144, 70,241,254,105, 32,170, 9, 38,237, 68,232, 20, 88,210,117, 16,186, 64, 49,154, 80, 71,185,108,
+ 96,228, 16, 60, 64,227,117,159, 81,128, 9, 78, 34, 36,137,158, 82, 70,182,214, 18, 93,227, 32,184, 19, 91, 45, 59,218, 17,151,
+ 37, 26,142,127, 13, 1, 40, 11,197, 63,147,202, 29,119, 96,197,106, 98,238,210,136,110,136, 76,244, 46, 64,105,193,255, 59, 58,
+116,232,126,143, 67, 88,189, 36,255,107, 8, 68, 94, 82, 37,211,149, 66, 64,111, 61, 71,164,130,225, 39,138, 49,134, 50,147,225,
+144,130, 22, 98,200, 99, 37,170,170, 69,182,138, 40, 38,192,121,134,250,123, 55, 84,144,171,229, 45,254,229,239,254, 1,247, 31,
+127,140, 95,253,213,111,177,188,189,193,179,239,159, 97, 49, 95, 0,145, 56,197,101, 97,104, 47, 54,170,214,126,223, 72,105,113,
+117,205,244, 61, 42,164,156,117, 40, 75,138, 63, 44, 74, 3,215,211,190,191,239, 45, 22,243, 5, 63,172, 84,217, 77, 55,103, 40,
+171, 2,125,183, 68,211, 56,124,241,171,207,224,108,143,195,251,135,232,218, 22,215,151,215,152,223,206, 97,123,139,219,155, 93,
+204, 54,103, 88,204,151,208,133, 70, 81,149,232,251,130,145,187, 61, 70,147, 49, 62,188,121,159,139, 66,193,161, 33,105,157,162,
+107, 3,215,181,144,106, 7,211,141, 9,250,174,103,198,190,230, 0, 31, 13, 83,210, 37,223, 44, 26,116, 29, 51,246,165, 64, 89,
+167,138, 87, 3, 50,100,129, 75,194, 18,111,237,237,160, 93, 46,176,177,179,141,122, 84, 96,113,235, 81,150, 5,124,223,195,246,
+ 22,211,205,141, 28,106,113,123,117,141,141,237, 77, 78,214, 27,195,182, 11,148,117,141,201,214, 54, 94,124,251, 45, 2, 74, 72,
+ 83,225,234,195,115,124,242,197,231,144, 34, 96,239,248, 0,191,255,127,254, 22,219,135,247,160, 68,196,229,229, 53,154,166, 69,
+ 81, 20,136, 81, 34,118, 87, 64,116,136,193,224,147,223,254,123,220,127,250, 41,126,249,183,127,129,214, 6,221,242, 22, 31,222,
+188, 98,245,125,184,147,230,180,123,252, 16,123, 15,158,224,195, 47, 47,112,123,254, 14,136,150, 59, 45, 13,111,123, 4, 41, 80,
+143,167,152,110,239, 96,188,177,141, 32, 74,184,190,131,181, 14, 61,119,231, 49,116,153, 48, 70,182,196, 30,125,215,163,109,150,
+ 57,250, 50,197,127, 66, 12, 30,238,178, 26,161,170,107, 42,142,211,127, 39, 36, 44,243,219, 5, 8,255, 42,224, 6, 12,166,210,
+ 28, 15, 38, 96,249, 89,167,119,155,109,157,201,208,189,182,103,164,144, 23, 63, 8,227,114,142, 53,239, 11, 33, 81, 20, 21, 31,
+124,195, 37,153, 14,200,152,119,221, 3, 68,138, 6,160, 49, 3, 83,136,168,231, 51,242,117,184, 56,195,208, 53,199, 1,254,146,
+152,229,193, 15, 69, 65,196, 32,214, 74, 48,154,184,230, 15, 30, 48,187,129,227,123, 85,222,241,166,127,150,138, 6,210,223,244,
+121, 95,186,206,163,207, 88, 83,173, 50,139,194,123,151, 39,144, 57, 15, 62,117,188,233,240, 22,226, 14, 89, 51,217, 3, 99, 76,
+ 23,188, 31, 40,108, 60,237, 83, 74, 67, 41, 74,108, 76, 22, 52, 98,144, 15,241,178,217, 2,151, 59,229, 0, 4,129,162, 48, 84,
+ 0,230, 93, 56,205,122,140, 97,242,158, 88, 15, 89,137,121,109,160,185, 96,204, 35,105,102, 11, 4,206,102, 72,224,172,116, 79,
+101, 45, 68, 72,255, 27,234,198,147, 24, 89, 41,149, 5,137, 67,116,116, 2,245, 80,169,154,152,244, 3,152, 37, 77,113, 67, 62,
+191, 3,175,131, 36,187,148, 92, 31,120, 92, 46,178,110, 33, 9,235,250,222, 66, 73,158,114,112,172,111,223, 91,210,128,112, 1,
+144,224, 53,233, 57, 37,146,167, 88,227, 21,208,180,195, 20, 37,103, 94,184,252,157,144,248, 84,178,224,155,222,155, 52, 37, 39,
+190,125, 88, 35, 61,242,190, 60,229, 26,179, 88, 51, 66, 64,172, 5,129, 70, 36, 33,105,132, 20, 17,218, 7,192, 20, 37,198,101,
+137, 16, 2,218,213,138, 40,110,236, 61,167, 47, 64, 66, 72,234, 2,148, 54,204,118, 39,142,177,212, 5,180,182,136,145, 46, 47,
+ 17,169, 99, 80, 74,195,139,136, 66, 42,194,196,114, 37,104, 45,231, 26,243, 15,175, 12, 85, 57,130,129, 41, 66, 8, 22, 70, 81,
+215,166,140,129, 9,128, 54, 50,195, 35, 8, 84, 66, 2,138,132, 2, 84, 33, 32, 74,145,163, 95,181,161,195, 95,115, 85, 43,152,
+ 44, 68,126,104, 26,221,219,222, 35, 32,217,227, 72,160, 17,124,228, 47, 49, 50,162, 53,220,137,106,181, 61, 85,224, 57, 2, 84,
+ 2,109,235,242,225, 64,145,175,130,145,178, 30,158, 5,116,116,241,115, 90,143, 36, 62,212,184, 46, 33,165,196,205,229,123,124,
+255,199,136, 39, 95,126,130, 63,255,239,255, 2, 87,231,103,120,245,211, 75, 88, 22,146,164, 66, 36, 41,129,137,158,100, 56, 92,
+ 39, 32,136, 1,183, 27, 65, 85,239,114,209,112,172, 45, 33, 39,235, 81,153,171, 80,109, 10,196, 24, 48, 30, 87, 88, 46, 86,184,
+ 56,125,143, 79,191,250, 12,136, 29,234, 81,137,139,211, 11, 98,152, 3,232,187, 30,111, 95,253,130, 79, 62,255, 12,101, 85, 34,
+ 6,186,140, 77, 81, 32, 40,207,151,108,204, 65, 54,206, 57,192, 35,239, 8,181,209,217,210,226,125,128, 41, 10,222,183, 70,138,
+ 95,245, 49,119, 52,218,104, 52,171,150, 1, 60,150, 70, 82,156,157, 93,148,134,149,206, 18,101,173, 32, 85, 1,169, 13,170, 90,
+163, 89, 74, 24, 45, 49,153,141, 96,109,100, 13, 67, 11, 83, 22,216,189,119,132,159,190,249, 25,186,168, 80,215, 5, 54,247,247,
+224,173, 69, 61, 46,225,187,136,143,191,124,138,151, 63,189,198,243, 31,158, 97,239,193, 19,188,248,238, 91,200,216, 98, 60,157,
+224,248,227, 7, 56,125,253, 22,197,104,134,201,164,192,252,234, 10,103, 31, 62, 64, 68, 15, 37, 43, 82,148,135, 6,136, 1,143,
+190,250, 11, 60,252,252, 43,220,158,189,131,136, 30,243,139,247,184, 60, 61, 97, 48,138,202,246,188, 24, 35,118, 14, 31, 98,255,
+193, 19,124,248,229, 57,174,207, 94, 67, 42,147, 99,107,165, 4,170, 81,141,241,108, 3,179,237, 61, 20,147, 77,120, 79, 7, 67,
+111, 61,230, 87, 87, 48, 58, 0,209, 34,184,142, 98, 61,237,144,127,221,247, 45, 95,154, 10, 92,231,210,238, 91, 72, 24,173, 48,
+ 30, 79, 96, 10, 42,160, 82,241,222,119, 22, 33,118,116,217,112,212, 36, 21, 32,138,223,191, 10,161,109, 0, 73,196, 57,169,136,
+179,160, 25, 18, 37, 89,230, 35, 32,114,192,137, 75,120, 77, 33,115, 55, 79,217,227,116, 17,211,133, 68,216, 82,114,162, 80, 17,
+ 96, 10,147,243,167,105,111, 46,214,132,110, 33, 43,220, 83, 39,159, 58,151,164,189,161,113, 50, 51,221, 65, 23,174,231, 16,167,
+116,232,167, 49,104, 42, 62,192, 59,229,117,156,107,222,107,243,254, 58, 5,192, 40, 73,107,174,161,120,145, 25,218,147,128, 33,
+233,239,167, 2, 95,102, 1, 47, 21, 65, 1,209, 49,131,222,135,124,224,167,253,123,162,177, 9,222,207, 43,169,178,165, 78,222,
+137,134, 93,179, 59,201,245, 52, 74,197,251, 87,228,204,134, 84, 96,173,255,254,185, 48,224, 96, 29,191,246,231, 56,134,179,200,
+245,177,189, 34, 7, 74,102,185, 67,228,144,149,148,151,145,196,126,169,211, 38,191,250, 58, 45,110,208, 3,144,211, 64,229,127,
+ 63,196,200, 59,244,192, 19,193,181, 53, 78, 90,203, 96, 16,159,165,247, 41, 21,103, 52,253,145, 16,156,216, 23, 67,128, 49, 18,
+ 93,155, 44,106, 4, 57, 2,167, 0, 58,206,160,160, 14, 92,112,222, 68, 63,100, 16, 68, 90, 75, 39, 55, 3, 61, 71, 22, 76,105,
+134,214, 20,116, 37, 4,177, 77,164, 90,123,158, 82,194, 28, 63, 23,180,170,226,159,129,113,188, 73, 59, 33,132,192,218, 12, 39,
+143,233, 9, 36, 35, 6, 77, 10, 63,179, 50,125,181,136,119, 28, 90,233,131, 9, 16,208,193,118, 8,122, 68,106,116, 45, 80, 86,
+ 21, 7,176, 36,218, 16,243,125,215,176,164,125,219,210,158,164,174, 81,212, 99,184,222,114,101,162,160,184, 75, 78,158, 77,107,
+125, 6, 53,152, 66,163,235,232, 0,191,163,226, 19,131,221,197,249,196, 55, 15, 40, 42,195,161, 6,244,210, 22,212,148,163,172,
+139, 33,114,149, 85,152,214,210,151,106, 10,197,122, 0, 30,171,173, 81,124,214,125,243,182,231, 23, 78, 9,230,108, 75, 74,110,
+227,206, 62,219, 30,108,132,228, 84, 60, 2,120,208,165,158, 14,147, 36, 30,162,240, 2, 53,216, 13, 25,108,161,180, 68,215,217,
+ 28,235, 10, 68,148,101,193,255,254,144,122, 22,125,135, 23, 63, 60,199,253,199, 15,176,185,179,139,221,131, 61,188,121,254, 18,
+103, 31, 46,201, 67,201, 5, 22,237,228,136,210, 37, 49,236,133,210,170,192, 57, 71, 93, 22, 67, 32,202,210,240,197, 74,135,200,
+252,118, 9,173, 53,138,162,128, 98,184, 78,179, 92,225,226,236, 10,159,125,245, 17, 98,180,184, 60,191,166,201, 77, 4, 70,147,
+ 26, 49, 16,152,230,248,225, 61,124,120,251,142, 4, 35,252, 28, 0,164, 86,175, 70, 21, 81,250,170, 10,171,149,135,102, 94, 62,
+237, 5,233,103,187,189,186,197,116,115,132,243,211, 11, 76, 54,122, 6, 60, 68,190,236, 13,170,186,162, 23, 75, 72,130,221,240,
+ 62, 73, 42,137,122, 84,175, 81, 6, 13,148, 41, 49,217,220, 66,183, 92, 97,107,111, 27, 27, 91, 99, 72,165, 81,141, 71,232,154,
+ 37,180,209,152,110,111, 97,126,115,139, 85, 99, 97,172,199,211,175,159, 80, 49, 18, 35,108,215, 98,247,232, 16, 93,211,226,197,
+247, 63,227,224,209, 83,188,255,229, 53,124,191,194,108,115, 3, 27, 59,219, 40, 10,141,197,124,137,173,221, 45,244,203, 91,188,
+127,253, 6,193, 89,148, 69, 68, 49,154,160,109,110, 32,162,195,163, 47,255, 18, 71,143,159, 64, 9,143,235, 15,111,113,242,242,
+ 25,110, 46, 47, 88, 33,173,242, 4, 71, 10, 96,247,222, 35,236, 61,120,130,211, 95,158,225,226,228,121,238, 64,133,210, 64,244,
+ 24, 77, 54,176,181,183,143,241,108, 3,194,140,208,117,148,166,119,123,117, 13,111,123,128,139,102,239,122,138,202,116,148,249,
+ 76, 99,114,166,162, 41,149,189,237, 29,115, 20,170,170,194,120, 58, 33,101,112, 89, 80,168, 8,135,125,208,191, 67, 66, 38,173,
+ 37,234,209, 56,219,198, 98,136,104,181, 70, 89, 87, 20, 35,220,247,104,150,171,220,109, 11, 80, 39, 36,214,210, 16,147, 55, 89,
+240, 37,161, 85, 68,231, 59,166, 0, 42, 22, 88,233, 97,116,155,178, 34,148,202,151, 70,242,142, 75, 41,137,180,151,186,234, 48,
+172, 9, 37,147,180,172,181,119,118,219,142, 69,122, 82, 12, 30,241,144, 89,217,156,123,158, 58, 73, 46,166,210,229,146, 84,224,
+169,235, 78,228,176, 68,143,139,172, 86, 55,133,200, 5,118,178, 27,230,128, 24,206, 10, 23, 98, 16,111,209,207,200, 33, 43, 96,
+198,120, 34,120,250,161, 73, 32,161,161,204,135,182,103, 91, 97,242, 55, 99, 13, 43, 42, 88, 40,152, 16,161,169, 43, 78,233,229,
+ 69, 81,146,208,145,139, 69,250,188, 67,238, 10, 35,168, 35, 77,186, 29,154, 72,168, 60, 53, 32,146,155,134, 20, 42, 91, 74, 83,
+ 65, 36,181,102, 49,239,186, 16, 50,102,198, 64,228, 21, 7, 77, 53, 56,145, 51,130, 59,222, 8,159, 18,237,210, 90,211,179, 53,
+205, 72, 38,210,201,156,180,151,154, 46,210, 68,173, 41,200, 64,201,148,105,101, 44, 57, 42, 91,128, 38, 72,116, 78,135, 12, 41,
+ 74, 65, 40, 73,128,172, 53, 53,144, 4,137,241, 67,247,238, 98,158,170,133, 32,200,194, 6, 32,166,252,116,165,120,194,164,115,
+ 48, 79, 90,137, 8,230, 40, 24,109,184, 96,147,153,151, 32,132,164,102,215, 57,130,104,113,163, 75,147, 15, 46, 80, 84,202, 13,
+ 96, 83,104, 18, 21,134,225, 25, 75, 54,236, 52, 13,137,172, 19,201,137,114, 49, 88,216,213, 45, 34, 20,140, 25, 81, 69, 95, 20,
+ 80,146, 67, 53,248,133,115,214, 67,245,150, 71,117,158, 60,162,144,168,199, 53,132, 54,176,140, 50, 21, 66,192, 84, 21, 98, 8,
+140, 55, 77,123,236,228, 79, 47, 16,133, 92,171,236,144, 97, 41, 97, 45,234, 81, 39, 44, 37,127,121, 85, 85,228, 2,195,246, 14,
+ 69,161,179, 42,147, 46,104,129, 32, 4,250,206,195,176,181,129,212,143, 33,171,225,211,184, 69, 58,228,241,123, 42, 0,136,206,
+196,217,202,158, 70, 77, 62,210,206, 94, 96, 77,100, 22,134,240,137,190,239, 81,148,134, 11, 10,126,248,210, 62,159,247,192, 36,
+158, 32,134,121, 93,151,192,136,216,236, 5,199, 1,198,181,211, 49,120,139, 55,207, 95,226,240,254, 49,198,211, 26, 71,143, 30,
+225,232,225, 49,126,252,230, 39,172,150, 43, 8, 65, 73,119, 85, 61,226, 64, 14,218,240, 36, 15,254,250,202,132, 20,242, 50,123,
+124, 83,145, 17, 99, 68,219,118, 40, 37,189,240,198, 24, 96, 84,227,230,242, 28,109,251, 0,219, 59, 99,104, 45, 49,219,152,194,
+ 24,205,238, 0,131,102,185,196,252,102,137,201,108,130,235, 11, 66,198, 6, 31,208,119, 29,218, 85,131,217,108,132,190,187,225,
+ 0,155, 0,111, 36,250,222, 35,248, 62,119, 7,229,168, 67, 8, 99, 24, 35,176,156, 47,233,165, 98,204,238,120, 50,202,130,168,
+178, 42, 56,118,181, 36, 48,145,184,203, 89, 78, 99,189,241,116,140,219,243, 83, 28,108,207, 48,219, 24,243,129, 76,127,166, 41,
+ 75,108,238,110,227, 15,127,247, 47,168,234, 9,142,238,109, 67,168, 2,163,105,141,110,213,192, 69,141,217, 70,141,111,255,240,
+ 2,202,148,184,185, 90,160, 89,222,194,200, 30,123,247,191,196,222,209, 46, 78,158,255, 12, 85,142, 32, 5,240,250,197, 43,180,
+171, 57, 36, 58,152, 98, 3, 54, 40,192,222,226,225,231,127,142,135,159,127, 5, 41,129, 15, 47,126,196,243,111,254,136,190,107,
+160,180,204, 2,168, 84,183,238, 28, 61,192,225,227,207,240,238,217,143,184,124,255,156,125,179, 2,193, 91, 40, 93, 96,247,232,
+ 16, 59, 7, 71, 48,229, 24, 62, 10,172, 22, 45,250,174,199,106,185,132, 82, 32,138, 99,136,236, 63,119,104,150, 13,250,182,201,
+188,117,197,137,129,145, 57,221,222,121,148, 85,141,241,100,138,162,164,142,205, 20, 5,132,210,208, 50,165,102,121, 78,131,147,
+ 57, 98,183, 40, 74,164,249,158,237,123, 20, 53,241,227, 37,119, 93,180, 51,173,168,176,235, 58, 4,132, 12,216,240, 44,178,202,
+110,242,224, 0, 57,128,132, 72,212, 86,242, 84,203,100, 37,177, 76,118, 37,214,243,120,111, 51,104,133,138, 34,151, 69,174,132,
+ 11,101,193, 85, 82,219,243,127, 58, 22,133,166, 66, 42,161, 55, 37,119,150,206, 58,154, 84, 33,194, 40,205,246, 35,149, 17,163,
+ 3,220, 37,230,105,147,228, 98, 36, 9,210,210,207,147,253,218,220, 21, 39,143,188,231,130,196,187,200,147, 50, 57,236,189,121,
+196,238,108,207,251,122,172, 81,196,100,118, 28,100,142,100, 22,193,145,158, 8,121,143, 79, 19,147, 64,140,235,220,188,100, 91,
+154, 80, 57,202, 52,135, 44, 5,127,135,224, 41, 88, 48,155,108,130, 41,143, 62, 51,234,249,220, 3, 8,240,229,157,131, 42, 10,
+206, 11,240,204,130, 23, 57, 30, 58, 1,106,210,100, 84,240, 51, 9, 68, 18, 87,106, 18,129, 57,219,147,146, 94, 15,222,242,180,
+230, 76, 80, 49,154, 40,234, 76, 0, 77, 50,240, 0, 1, 37,210, 69, 42,115,103, 79, 80,150,192,200,223,192,223, 15,187, 14,192,
+232, 86,163, 56,209, 82, 32,114,183,206, 28, 58,166,187, 33,175,114,144, 47, 79,228, 61, 57, 57,120,169, 24,213, 70, 17,235,128,
+145,226,146, 3,111,164, 20,240, 98, 88,243,172, 23,124,105,125, 18, 66, 64, 76,147, 19, 49, 76,135, 36,107,169,148, 20,185,163,
+207,171,101,201,174,130,228,248, 72,228,188,204,243, 32, 65,162, 64,128,250, 95,255,221,151,255, 25, 28,190,210, 55, 13, 43,142,
+ 53,116, 89, 82, 44,106,170, 30,217, 79,158, 42,188,100, 89, 81,166,100, 21, 40, 43,194,189,207, 21, 88,206, 10, 14, 41,144,132,
+189,157, 28,188,146,246, 75,235,135,117, 82,132, 70, 38,167,165, 17,156, 41, 56, 13, 72,145,160,206, 51, 22, 54,253,114,130, 61,
+179,148, 10,231,225, 92,128, 41, 82,178,208, 16,249,152, 24,247,195, 37,145,170,229,228, 73,101,133,163, 98,224,190, 24, 8, 64,
+233, 75, 75,179, 18,219, 19,253,136,112,165,180, 31,206, 94, 85, 12,222,115, 41, 73,157,174,148, 68, 89, 21, 48, 70,231,204,245,
+ 52,190,211, 70, 51,201, 14, 88,220,222,210,193, 89,104, 92,158,221,226,241,167,143,161,181,196,245,229, 13,164,162,208, 19, 64,
+101,253, 64, 96, 47,187, 82, 18,117, 85, 65, 27,153,247,103,121, 55, 21,239,230, 74,175,150, 43, 20, 69,145, 71,228, 52, 14,140,
+ 56,184,119, 8,103, 59, 2,210, 88,246, 91, 50, 45, 46,196,136,253,227, 3,172, 22, 11,234, 12,217,223, 42,149,196,246,222, 54,
+110,175,111, 41,206,117,105, 81,143, 42,220, 92, 93,195,246,125, 46,172,250,214,162,158, 76, 33, 4,133, 51, 20,165, 65, 8, 2,
+166, 80,144, 74, 96,186, 57,193,219,151,239, 0, 86,205, 86,117, 5, 33, 5,166,155, 83,156,190, 61,201,105,118, 49, 0, 69, 85,
+ 97,182, 69,244,186,135, 31,223, 67, 89, 42, 44, 23, 45,177,167,109,139,122,182,129,247,175, 79,176, 92, 58,236, 29,238, 98,247,
+112, 15,136,132,225,237, 86, 11, 22,209, 88,188,251,229, 20,214, 70, 92,188, 63, 65,236,231, 48, 69,137,207,255,226,191, 67,183,
+184,194,124,194, 95,203,230, 0, 0, 32, 0, 73, 68, 65, 84,222, 96,107,119, 19, 31, 94,191,193,201,203,159, 33,209, 67,138,128,
+241,230, 61,116,109,139, 39, 95,125,134, 71, 95,124,141,118,126,137, 24,128,127,253,155,255, 3,182,111,120, 5, 28,134,112, 36,
+ 68,236, 30, 61,192,209, 39, 95,226,195,171,159,113,245,254,101,142,186, 20, 66, 96, 60,219,194,246,193, 17,118, 14,143, 81,142,
+166, 8, 80,152,223,174,176,156, 47,176, 90, 46, 96,180, 34,194, 89,116,232,218, 14,182,235,209,174, 86,104,155, 57, 11,164, 20,
+ 36,219,212, 34, 20, 76, 81, 33, 70, 5, 93, 84,152,206, 54, 81, 86, 53,234, 81,141,122, 50, 70, 61,158,160, 30,141,249, 80, 20,
+124,168, 59, 62,112, 76, 46,226, 35,119, 95,158,157, 35,214,122,230, 89,176,237, 50,210, 62,214,100, 52,180,202,157,164, 88,139,
+ 53, 77,239,209, 96,183,165,191, 71,240,168, 81,105,197, 29,154,225,241,169,228, 81, 61,231, 87,139,200, 90, 18,145, 93, 48,138,
+243,222, 83, 72, 82, 12, 3,239,253,110, 6,186,200,227, 99, 26,137, 91, 14,141, 42, 88,137,205,148, 75,165,249, 60, 81, 67,164,
+ 42, 68,126,231, 5, 79, 17,232, 48, 47,242,152,149, 20,232,242,142,133, 54,169,169,251,174, 91,203,114, 7, 39, 46,130, 5, 83,
+142,189,244,110,141, 64,150, 82, 35, 7, 6,248,250,229, 10,129,156, 24,150, 89,239,108, 43,148, 60,113, 24,138, 7,193,211,184,
+ 50,239, 99, 53, 95,174,169,208, 36,100, 52,137,200, 82,103, 44, 48, 92, 16,105, 82, 33, 57,121,141,206, 42, 82,101, 27,147,184,
+ 2,169,115,231, 17, 57,239,254, 11,190,248,179,115, 33,112, 51, 23,227, 26, 40,140,249, 19, 82,102, 61, 69, 74,181, 11, 65,100,
+162,158,100, 34,159, 82,114, 8,215,210,138,187, 88,106, 12, 13,223, 83,136,137,127, 16,185,123, 13,204, 8,240,249,179,142, 49,
+ 18,139,221,219,181,104,108,159,195, 81,144, 45,140,126, 45, 91,157,125,240,218,100, 87, 70,202,117, 47,202,146,159,155, 20,216,
+ 66,206,138, 36,142, 86, 74,174, 9,170,195,157, 81,121,130, 27, 73, 12,157,248,192,162,137, 67,252, 56, 63, 11,201,117, 33,114,
+145, 44,114, 49, 60, 20,158, 17,154,210,141, 60,208, 19, 50,210,245, 45, 91,176, 8, 32, 33,181, 64, 33, 21,154, 85,131,190,235,
+ 81,141, 8,114, 32,148, 70,187, 90,161, 26,143, 33,148, 65,223,175,178,197, 65,178, 42,144,246,222, 68, 91,211,236,163, 83,114,
+216, 17, 75,169,209, 91,199,185,182,100,117,171,106,195,227, 11,149, 71,230, 73, 80,145, 68,114,206,133,129,252,163, 9,128,163,
+139, 33, 70, 50,141,250,155, 85,143,122, 84,160,239, 28,137,171,164,224, 67,102, 77, 45,201, 16, 4,103, 73, 33, 25,121, 76,238,
+ 24,134,147,130, 9,232, 75, 85,252,162,210,180, 96, 52,174, 97,173,227,220,239,132, 60,180,100,203, 83, 30,179,205,146, 53, 2,
+142, 87, 4, 14,136,180,179, 79, 41, 70, 41,125,174,168,104,124, 45,165, 70,215,182,184, 56,253,128,190,235,112,255,241, 61,188,
+127,123,130,233,230, 22,254,250,127, 60,194,139, 31, 95, 98,181,234,179,146, 85, 74,137,209, 88,175, 9,129, 18,167,217,103, 61,
+ 68,218,131, 59, 22, 18,165,223,101,181, 92, 98, 52,153, 64, 10,133,217,230, 12,182, 91,225,246,102,137,251, 31, 63,194,251,183,
+103,164,214,103, 65,206,252,102,142, 8,133,103,223,191,196,209,253, 93,156,188,254, 0,128,166, 49, 55,151,183,240, 46,162,107,
+ 58, 98,224,247, 14, 93,219,163,109, 90,226, 23,104, 13,229, 28,138,138,170, 76, 83,148, 88,221, 46, 81, 86, 69, 22,242,213,149,
+201,137,112, 33,112,140,175, 37,184, 72, 10,126,145, 2,112,150, 84,212,213,120, 12,215,117,216,222,223,195,116, 99,140,102, 62,
+207, 69,100,111, 61, 74, 3,188,250,249, 23, 28, 60,252, 8, 7, 15,246, 97, 20, 0, 89, 34,184, 14, 87,167,231,120,250,171, 79,
+241,203,203,115,248, 40,112,254,225, 61,130,107, 80,213, 21, 54, 15,238,163,172, 52, 94,126,247, 14,187,199, 71,232,155, 6,239,
+ 94, 60,131, 8, 43,132,232, 81, 77,183, 17,100,133,207,190,126,132,199, 95,126,142,179,151, 63, 96,180,185,143,239,255,241,111,
+232,160, 64, 68, 12, 22,144,164, 61, 9, 66, 96,239,248, 35, 28,126,242, 5,222, 61,251, 1, 87, 31, 94,178, 40,199, 64, 42,141,
+122,186,137,205,221,125,108,237,237, 67,232,146, 98, 94,111, 22,104, 22,115, 74,129, 27, 23,176, 93, 15,192, 99,185, 88,161,235,
+122,116,109, 11, 4, 75,116, 49,190,212,133, 80,144, 90,195,176, 5,107, 60,157, 96, 52, 38,117,187, 41, 52,138,170,206,133,179,
+179, 14,190,245,232,154,134,195, 51, 40,230,210,135, 0, 21,129,224, 60,164, 74, 35,216,196, 59,160,116, 65, 41, 53, 7,104, 36,
+ 81, 83,207,157,149,187, 51,125, 3,191,187,129, 5, 70, 50, 45,227,133, 96, 7,128,201,135,165,224, 93,177, 74,172,137, 4, 86,
+201, 10,113,234,248, 53,239,221, 35, 43,129, 93,186,212,152, 93,225,172,205,163,244, 28,169,137, 33, 79,130,254, 46,250,220, 41,
+ 79, 60,230,203,147,236,175,252,115,112, 1,145, 14, 79,191,182,191, 78,118,178,192,150, 83,250, 93, 68, 38, 79, 38,157, 11,141,
+230, 61, 95,232,150,167, 1,100, 17, 78,133, 20,145,232,104,146,225,108,128, 80,106, 45,130,150, 16,184,105,186,182, 30,128, 66,
+169,114,138, 87, 7,195,170,115,216,151,199,236,153,166,207,108, 8, 40, 9,193,231, 9, 0, 31, 33,217,169,148,206,185,200, 23,
+ 53, 5,194, 68, 8,107,185,216,163,207,167,183, 14, 90, 83, 87, 78, 19,211,130,223, 83,133,200, 12,117,145, 2,119,148,202,238,
+131,244, 25,248, 56,140,142,133, 76,169,156, 67, 30,121, 18, 61, 75,254,190,211, 94, 93,240, 24,156,118,253,224,240,146, 36,130,
+ 19,185,168, 74,221,174,227, 49,186,227, 17,188,179, 14, 8, 52,250,246,108,109, 91, 23, 94,130,239, 20,210,123, 36,203, 31,113,
+225, 37, 11, 15, 83, 22, 72,166, 91, 98,232,202,105,161, 31, 50,240,102, 8,167, 73, 43, 16,153,113,221,137,217,160,185, 24, 77,
+ 22,211, 12,167, 17, 18, 2, 41,180, 70,241,247,193,120,228, 44,236, 84, 3,127, 37,144,192, 85, 72, 9,221,183, 45, 87,207, 58,
+251, 56,219,229, 2,202, 84,144,154,201, 73, 34,162, 30,141,177, 92, 44,209,182, 61, 76, 81,102, 32,189,237,122,168,162, 32,132,
+157,214,180, 71,144,146, 51,184, 35,103,236,154,252,210,100,145, 6,239, 65,162,143,232, 92,207,228, 56, 78,162,194,176,107, 87,
+185,154, 86,140, 6,148, 52,118,207,153,232,220,189,229,221,124, 28,198,236,138, 70,192, 34,221,204, 16, 89,125, 14, 33, 32,194,
+176, 11,215, 70,101,159,104, 26,249, 8,164, 75, 6,168, 71, 69, 70, 5,146,237,138, 42,250,201,116,196, 42, 77,112,124,170, 66,
+ 81,146,205, 66,105,218,151, 59, 99,209,119,150, 31, 4,112,226, 21,141,235, 72,109, 73, 66, 19, 24,112, 87, 82, 96,164, 42, 64,
+ 56,188,125,241, 26,199, 31,221,199,252,234, 18,167,239, 78,241,248,179, 39,176,125,139,147, 95,222,179,207,152,108,107, 82,130,
+ 68,136, 0,218,182, 69,215,244, 48,165, 97,124,162,231, 49,182, 68,219,119, 84,109,106, 5,215, 91, 72, 17, 80, 20, 37,180,210,
+232,125,192,201,235,183,120,244,228, 99, 28,222, 63,194,247,127,248, 14, 93,215,193, 57,135,178,170, 81, 84, 21,218, 85,139,186,
+ 46,177,119,184,139,243, 15,231, 28,105,216,145, 85, 69, 43,132,166,163,189, 86,162,251, 97,240,128, 42, 37,208,183, 45,198,179,
+ 17,172,189,165,162, 81, 18, 94,247,240,222, 46,141,215, 82,117,206, 99,247,164, 75,144, 9, 32,196, 10,211,241,116, 12, 37, 34,
+202, 81, 77, 80,164,166,207,150,149,241,108,134,111,127,247,175, 40,199, 19, 28,220,219, 71, 89, 26,132,224, 49, 42, 13,158,127,
+251, 51,102, 91, 91,184,185,188, 65,215, 5, 92,157,158, 33,218, 6,211, 73,133,241,108,138,143,127,253, 27,188,251,249, 39,232,
+106,132,186, 54,248,238,159,126, 7,219,220,144,154, 95, 2,155, 7, 15,177,125,252, 16,143, 62,123,132, 87,255,250,207,184,190,
+186,193,126, 44,112,125,246,150,119,190,169, 83, 32, 14,250,254,253,143,112,239,233, 87,120,243,227,119,184, 62,123, 77,122,129,
+241,152,253,254, 51, 76,183,246, 80,140,198,136, 82,225,242,236,134, 46,237,213, 18, 70, 43, 24,163,208, 53, 45,101,160, 91, 75,
+144, 25,246, 44,247,158, 16,189, 36,222,145,128, 32, 8,148, 49, 5,166,155,155, 40,170, 17,202,170,164,105, 12, 79,205,156, 15,
+112,182,199,252,150,236,141, 49,112,182,128,117,112,118,137,182,105,217,230,166,249,189,167,195,189, 89,181,196,123,119, 30, 82,
+218, 12, 30,233,154,150, 69,144,228,118,232,186,150, 15,110,143,232,135,224, 21,193,150,209,144, 48,155,137,194, 38,239, 18,185,
+214, 53, 48,169, 59,141,129, 2,103,210,128, 58, 9,145,172,237, 57, 43,124, 8, 29, 25,114,198, 19,201,114,152, 14,164,238,151,
+226, 49,145,113,177, 90,203,204, 33, 23,217,214,199,194,152, 48,228, 78,164, 66, 33, 83,191,132,160,203, 90,136, 53, 27, 22, 93,
+ 14,129,111, 28,173,117,142, 45,246,193,211, 52, 44, 4,238, 34,211,126,153,127,126,169, 32,133,100, 91, 94,204,157,158,231,247,
+150, 56,228,142,181, 10,116, 89,164,213,157,214, 50, 67, 95, 66,182,247,234, 53,117,250,208,236, 36, 94, 65,136,116,142,197, 53,
+209,224, 0, 58, 26,160, 71,145, 27, 31,136,245,245, 30, 53, 35, 82, 41,152,178,204, 34,201, 44,116, 76, 29,168, 44,184,120, 41,
+ 96,123,230,171, 39,112,139,144,252,115, 11, 40, 61,100,207, 19, 95, 68,231, 85, 69,114, 18, 37,160,142, 86, 42,219, 91,147, 67,
+ 65, 10,192,246,221,192, 38,136, 64,136, 62, 67, 92,148,146,112,125,207,202,114,138, 2, 22, 8, 8, 8, 16,209, 35,101,240,144,
+ 16, 55, 2, 97,136, 53, 77,147, 78,154,236,232,204,206,144,140, 38,150,236,211, 31,124,236, 84, 96, 66, 8, 8,170,103, 51, 23,
+ 34, 5, 28,137, 72,192, 33,164,244, 63, 38,205,173, 23, 9,108,136, 24,248, 10,158,210,243, 82,227,150,206,193,152, 50,217,215,
+ 20,244, 58,237, 88,104,180,206,177,150, 70,163,111, 87, 16,202,162,168, 70, 80,198, 32,122,159, 61,173, 96,117, 39, 98, 68,223,
+181,208,130, 4, 95,203,155, 57,191, 4, 60, 86,103,128, 64, 85, 21, 76,102, 98, 94, 57, 63, 48,105, 36, 81,148, 6,206, 7, 14,
+ 48,136, 57, 82, 53, 56, 82,249, 86,163,138,247,198, 68, 15,138, 38,100, 94,111, 8,128, 41, 20,251,216, 69,198,149, 6, 71,204,
+121,219,211,151,102, 74, 3,219, 57, 72, 53,228,175,139,181, 49,122,224, 15, 43,219, 44,248,131, 83, 90,163, 46, 52,139,226,124,
+ 78, 28, 10,222,163, 40, 77,174, 56,201,222, 16, 1,209,161,111, 3,202, 42,117, 4, 36,140,211, 76, 41, 10, 33, 18, 1, 46, 6,
+ 86,125,151, 8, 33,162, 30,215,148,252, 22, 3, 95,208, 14,174,179,232,186, 30, 63,125,243, 61,238, 63,254, 8,251, 71, 19,252,
+242,236, 21,182,118,119,241,213,159,127,129,179,147, 15,152,223,204, 89, 28,131,108,201,208, 90, 33, 50,246, 85, 42,133, 98,205,
+ 6,179,177, 53,205,107, 4,107, 29,130,243,104,154, 6,189, 53, 48, 90,226,234,236, 18, 49, 42, 60,250,228, 30, 46,207, 46,240,
+234,217, 47,100, 99,100,139,152, 16, 2,111,127,121,141, 7,143, 63, 66, 89, 85, 88, 46, 87,144, 34, 98,126,179, 32,155, 88,239,
+ 16,110, 27, 24,163,184,115, 10, 57, 15,216,249, 6,166, 90, 96,107,127, 27, 74,179,200,101, 78,147,139,122, 92,163, 89,172, 16,
+188,135,239, 57, 67,192, 59, 8,153, 70,155, 67,117,106,202, 10,245,168,100, 15, 45, 49,248,151,139, 14, 82, 6,212,147, 49, 46,
+ 46,174,112,121,126,129, 79,126,253, 91,140,167, 35,148,165, 70,211, 10, 92,159,159,227,236,253, 5,158,124,249, 20,207,126,250,
+128,147,215, 39,240,125,131,157,221, 41,170,186,194,222,131, 71, 8,206,195, 71, 96,119,127, 11,207,190,249, 22, 55,103, 39, 52,
+222,147, 2, 7, 15,159, 96,118,248, 9, 30,125,124,132,239,254,246,255,198,135, 55,175,240,213,255,240, 63,227,167,223,253, 87,
+128,213,253, 66,106,182,177, 4, 28, 61,120,138,227,167, 95,225,151,239,254, 21, 23,239, 95,163,172, 42, 76, 54, 54, 80,141, 39,
+168, 70, 99,140, 55,182,160,203, 10,203, 69,139,249,205, 21,150,243, 37, 34, 4,170, 82, 67, 10,160, 89,182,104,150,215,132,187,
+100,206, 67,228,164, 49,178, 94, 37, 40,136, 66, 81,141, 48,154,204,136,221, 94, 85,128,160,195,198, 5, 1,219, 81, 7,219, 44,
+ 87,104, 87, 43,172,150, 43,120,103, 9,253,234,108, 22, 60,201, 68,225,140, 21,130, 50,168,106,147, 35, 39,243,247,152,157, 49,
+242, 14, 12, 37,117, 80,150, 19,174,148, 78,217,210,145,113,155, 2,202, 80, 1, 26,185,147, 81, 82,194, 7,199, 99, 69, 12,105,
+111,121, 43, 38,216, 33,225, 73, 41,157,188, 80, 89,157,158,210, 30, 61, 81,227,228, 48,130, 79,107, 45,234,142, 7,171, 27,161,
+230, 19, 86, 58,193,172,100, 78,151, 20, 89,152,148, 70,181, 46,179,199,227, 90, 18, 88, 12, 1, 85, 89,101, 75, 85,234,150, 98,
+230,122,243,197,203,204,138,224, 61,156,103, 71, 76, 74,128, 75,145,176,130,166, 24,222,246,156,120, 38, 73,139, 16,147,159,222,
+103,189, 2, 69,157,174,169,164,249,207, 17,156, 17, 63, 16,222, 6,178,102, 86,133,179,245,113,157, 70,135,100,151, 98,215,140,
+128,128, 34,248,251, 64,247, 12,180,226,136,146,236,109, 74,129,214,155, 82, 83, 35, 35, 40, 63, 36, 5,244, 36, 39,130,148,180,
+218, 75, 94,255,212,171, 41,182,130,229, 44,119,182,188,185, 52,121, 13,195,218, 65, 51,199,222, 20, 58, 95,236,137,221, 47,147,
+157,143,197,213, 82, 1,222,122, 40, 25, 33,160,178,179, 9, 89, 36,137,129,252, 7,186, 36,109,144,128,167,188, 13,199, 12,254,
+168, 98, 94,105,106,105,184, 72, 50,195,103,198,235,134,100,234, 79, 76,248,180,246,137, 49, 34, 56,186,192,101, 66,231,230, 33,
+ 66,204,107,170,196,247,207,142,139,212,245, 43,126,206,179,176, 47, 50,228, 39,174,129,211, 84,158, 10,136, 20,222,195, 69,136,
+ 38,118,176,228, 47, 27, 25,223,233,125,132,140,228,137,173,148,134,245,128, 46, 43, 4,230, 69,135, 72,213, 90,187,106, 49, 50,
+ 21,164, 50,136,130,246, 42,214, 54,240, 94,210,195, 1,129,182, 35, 40,127, 4,189,120,101, 69,118, 26,107, 29, 87,221,142,120,
+190,102, 80,167,199, 96,201,211,206,241,126, 16,148, 81, 29, 50,122,146,141,255, 38,137, 37, 56, 96, 65, 9, 98,185,131, 64, 12,
+ 89,101, 24,104, 55, 71,127,118, 24, 34, 93,185,211, 15,150,232,109, 62,120, 72,198, 73,166,113,189,229,209, 61,217,226,168, 26,
+214, 70,177,199,154,246, 43, 33,103, 81,243,232, 37, 14,135,130,247, 97,240,230, 27,137,209,120, 4, 83,106, 74, 35,242, 36,192,
+243, 62,162, 44,201, 86,209,181,224,157, 33, 41,228, 99,140, 56,125,119,130,221,195, 35, 60,252,248, 1, 46,207, 46,241,211,191,
+189,192,241,131, 67, 76, 55,166,120,251,234, 29,143,136, 56,147, 93, 72,196,160, 88,173,108,185,232, 32, 37, 60, 21, 42,134,113,
+145, 6,171,206,178,117,175,131,209, 52,117,152, 95, 95,226,230,122, 11,159,255,230,115,216,222,226,226,244,156, 69,104, 52,234,
+236, 59,139,235,203,107, 28,222, 63, 66,215,117,240,206,162,107, 91,108,223,219,197,205,229,156,127,102,160,107, 91, 56, 71, 32,
+ 21,197,159,241,252,230, 6,171, 69,203,251, 69,143,190,181,136,158,246,117,109,211, 17,247, 93, 42, 88,171, 96,138,146, 57,229,
+ 28, 41,107, 72,113,187,119,111,135,139,166, 2, 69,161,178, 7,117,113,187,192,100,115,134,127,251,167, 63, 98,231,224, 0, 59,
+251, 59,216,216,172, 96, 93,196,106, 62,199, 79,223,252,136, 79,191,254, 20,167,239, 47,120, 92,212, 97, 54, 51, 24, 79,198, 24,
+ 77,102,152,108,110,227,197,247, 63, 99,239,112, 15,190, 91,224,252,221, 11,120,215,161, 28, 79,112,239,227, 79,177,125,252, 17,
+ 84, 89,227,159,254,247,255,130,235,211, 95,112,244,228,207, 48,191,248,128,213,252, 42,131, 73,210,129,126,252,201,231,184,255,
+244, 75,252,244,251,127,128,109,111,177,185,179,131,201,198, 38, 76, 89,195, 84, 35,140,102, 27, 80, 74,225,246,250, 6,151,103,
+ 87, 88,173,104,140,173, 24, 90,209,183, 43,244,171, 57,156,235,216,231, 92,242, 20, 67, 32, 66,113, 26, 33,185, 4, 38,179, 45,
+ 76, 54, 54,161,139,146, 46,127,126,159,173,165,245,200,114,190,192,114,126,141,102,181,204,182,169,236,115,102,155,153, 96, 86,
+117, 58,152,148, 22, 28, 56,194, 34,199,170, 98,113, 23, 80, 20, 5,218,182, 67,219,246,212,149,135,144,195, 72,214,119,190,105,
+ 34, 38,121, 84,159,160,214, 42,163, 67,233,208,166, 49, 61,237,200,169, 27,241,185,251, 13,140, 75, 13, 49, 64, 75, 13, 31, 1,
+111, 45,139,201, 34, 36, 6, 10, 27, 97, 85,185,168, 15, 49,239, 74,215,173, 70, 82,146,126, 36, 41,243, 7,210, 92,204,187,115,
+235,124,158, 28,120,102,116,211,138,158, 67, 96,188, 35, 82, 27,159, 93,138, 39, 75,217,206,149,226, 96,185,227,115, 12,226, 73,
+ 16, 25,242,135,179,162, 94, 25,102,202, 71, 22,126,177,127,221,245, 44,208, 26,172, 79,196,100, 71,142,245, 76,227,247,116,193,
+ 36,145,113, 2,113,101, 38, 0, 51, 51,242, 78,251, 14,198,151, 67,162,214,206,255, 20,178,149,246,235, 73, 67,161,197,160, 51,
+ 80, 58, 21, 9,116, 14,230,120, 93, 22,186,165, 84,203,212,100,209, 10,128, 26, 65,145, 83,218, 36, 11, 98, 11,132, 53, 37,123,
+226,139, 36,178, 95, 82,122, 15, 9,159, 41,152,199,243,231, 32,224, 29,232, 12,207, 32, 32,100, 7,148, 15, 46, 59, 57,232,169,
+185,235,160,128, 20,185,200, 35,254, 72,210, 78, 81, 39,158,246,232,164,211, 42, 56,234,155, 51,229,249,254, 32, 61,130, 97,122,
+167,128,133,205, 93,116,188,147, 83, 34, 51,163, 63,229,212, 39,126,129,200,239, 77,200,223, 93,210, 55,104,222,205, 75,214,174,
+ 12,223,157,200,132,217, 4, 71,211,224, 89,189, 79, 35,167,100,247, 98,190,110,116,116,177,235,178,134, 84, 42, 99, 81, 83,202,
+ 16,124,128, 92,181, 40,170, 34,251, 33, 5,143,166,132, 0, 66, 20, 40,100,193, 20, 39,201,221,125,207,227, 33,133,162,160, 14,
+ 22,140,220,115,142,170,174,192,187,231, 52,170, 19, 34,162,107,237, 90,136, 2,141,179,156, 5, 76,169,184, 35, 87, 3,232, 70,
+ 96, 16,197,113,222,185, 41, 12,161, 44,178,234, 62,162, 44, 73,225, 77, 54,154,152, 99, 84,165,162, 23,167,239, 60,202,146, 58,
+224,224, 99, 22,232, 8,118, 9, 72,165, 80,214, 37,217,221, 92, 92,143,184,205, 73,112,169, 90, 53,102, 8,156, 17, 66,162,170,
+ 13,199, 84, 18, 29,111,181,108,208,181,100, 37,211,172, 14, 77,197, 5,132,198,114, 62, 71, 8, 1,251,135,123,184,189,190,196,
+201,235,183,152,110,110,224,233,215, 79,113,117,118,129,211,147, 51, 56,107,209, 54,109,126, 64, 35,232, 97, 15,158,211,174, 66,
+ 98,218,211, 83, 81, 86, 5,116,160,221,104,211,180,168,170, 10,245,184,192,213,233, 41, 54, 54, 31,225,171,191,248, 26,175,126,
+122,142, 23, 63,189,162,207,171, 42,208,119, 61,150,243, 57,220,222, 14,238, 63,186,135,247,111, 78, 16,131,199,104, 58,198,104,
+ 90,163,109,105,186, 50,153, 77,208,247,150, 0, 28,145, 34, 28,131,119,104, 86, 45,102, 91,179,204, 40,183,182, 71, 81,149,131,
+103, 55, 6,218, 39,177,224, 37,143,150, 66, 68, 57, 42,113,244,224, 16, 90, 11, 78,132, 51,184, 60,189, 6,221, 41, 18,191,252,
+248, 28, 82, 41, 60,253,245, 23, 56,186,191,131,162,212, 88,126, 56,135,235, 59,104,173,112,239,241, 61,188,248,249, 20,243,171,
+ 83, 40,225,115,116,237,214,209, 49,174,206, 46,161, 53, 80, 21,192,183,127,252,158,197, 70, 83, 60,254,242,215,216, 57, 56,192,
+237, 66,224,245,239,255, 47, 44,175,222,194, 84, 19,220,127,250, 41,254,240, 95,255, 75,166,165,165,124,235,251,159,254, 26,199,
+159,124,134,103,127,252, 29,162,239, 48,221,220,198,230,222, 30,132, 42, 32,149,193,120, 54,131,247, 1,151,167,167,184,190,188,
+197,114,213,211,174, 58, 68,184,126,137,198,245,100,165, 98,225,146,179,150,187, 7, 64,177,184,108, 52, 25,163, 40, 43,148,117,
+141,233,230, 6,237,252,140, 65,215,210, 97,237,251, 22,205,106,137,249,213, 53,218,102, 65, 43, 18,107, 9,100,164,147,118,164,
+ 32,119, 70, 81,102, 33, 87, 58,176,104, 52,108, 32, 4, 51,224, 99, 96,228, 51, 3,108, 0,116,109, 15,107,195, 90,126, 55,238,
+ 80,207,146,165, 71,107,157,163, 82, 83,113,156,118,211, 96, 56, 13, 97, 94,193,217, 10,158,247,133, 34,143,174,181,210,112, 41,
+143, 90, 8, 0, 84,188,166, 76,132,129, 22,135,124,161, 43,222,181, 39,220,170,100,113, 87,140, 84,120, 17,199, 28,252,217,115,
+184, 6, 59, 74, 72,137, 61,136,100,135,221, 41, 29,222,105,178,153,199,238,236,225,167,151,219,231,142, 62,217, 95,243, 46, 59,
+195,191,215,132,193,220,169, 57,182,195,145, 45,174,207, 5,135,207, 68, 78, 49,172, 27, 89,116,151, 84,249,116, 97,123, 70,243,
+ 38, 34, 40, 77, 37,227, 26,150,150,252,216, 22, 62,144, 74,156,214, 17, 97,136,125, 69, 18, 11,167,220,111, 90,167,138,236,215,
+143, 48,122, 56,199, 2,187,143,180, 1,199, 35,203, 76,175,139,105,125, 38, 21, 32,124,234, 69,121,205,192, 13,136,210, 16, 74,
+ 66,229,192,159,200,154, 38,159, 97, 55, 80,131,182,130,100, 25,130,109,207, 92,204, 33,228,201,130, 20,128,139,241, 79, 20,236,
+130, 84,243, 18,204,125,119,100, 57, 68,224,120,121, 5,231, 44, 23, 28,128,201,110, 18, 3, 33,117,206, 15, 49, 12,181,145,153,
+227, 32, 0,153, 64, 64,244, 89,101, 81,157, 49, 25,243, 45, 5,152, 57, 34,243,133,157, 98,105,165,144, 60,221,137,185,128, 34,
+ 37,189,203,162, 71, 33, 4,156,119,220, 24, 15,197,229,157, 96, 23, 33,115, 76,175,238,219, 30,138, 5, 27, 66, 72, 88, 86,100,
+251, 64, 99,179, 16, 41,245,170,132,132, 52, 37,117, 3,145, 66, 76,162,144,240, 44, 62, 8,193,160,172, 10,172, 22, 43, 40,182,
+154, 45,110,151,208, 69,193,127,153, 98,254, 47, 77, 2,172,245, 89,221, 71,176,170,128,182,233,121,164, 77,123,231, 84,142, 80,
+ 87, 73,169, 93, 33, 50,118, 22, 33, 39,251, 8,250, 62,160, 84,100, 47, 32, 21, 28,100, 39, 0,171,105,101,102,110,167, 42, 71,
+ 41,201,140,101,218,127, 11, 31,179,224, 36,240,200, 40,137, 95, 82,227, 65,236, 97,197,176, 21,170,226,124,136,232,173,131,237,
+ 44, 89,102,248, 50, 46, 42, 82, 36,107,222,249,167, 21, 31,113,227, 29,218,166,203,135,148,115, 30,101, 89,146, 74, 28, 49,127,
+153,137,215, 76,118, 85,202, 74,254,112,242, 1,187,251,187, 40,171, 10, 55,151, 55,255,141,171, 55,253,177,236, 56,211,252,158,
+136, 56,235, 93,115,207,202,202,218,201, 98, 21,119,145, 90, 90,234,150,166,183,105, 55,166, 1, 3,246, 7,255, 63,250, 99,108,
+ 3,254, 98, 24,240, 96, 96,140,167, 61,221,211,238, 77, 82,107, 33,197, 18, 89,100,237, 91,238,121,247,179,196,230, 15,239, 27,
+113,110, 89,128, 32,138, 44,102,230,205,123, 79,196,187, 60,207,239,193,119, 15, 22,216,187,186,143,219,119,111,225,187, 63,124,
+199,209,175,107,248, 74,222,105, 55,117, 67,254,127,198,241, 66, 8,164, 65,168,199, 43,130, 96,103, 20, 41, 48,185,152,161, 63,
+ 40,112,237,246, 77, 24,227,113,242,230, 28, 16,136,118,188,211, 55, 71,120,231,222, 29,204, 38,147, 16,167,192,106, 89, 21,199,
+157,105,170,232,189, 98, 21,181,247, 30,245,106,133,157,189, 3,194,161, 22, 53,230, 19, 66,199, 86,171,134,220, 13, 25,225, 99,
+179, 60,163, 66, 72, 9,244, 6, 61, 8, 41,113,239,227,123, 24,140, 74, 52,181,198,214,246,128, 67,118,128,233,197, 20, 27, 59,
+219,248,250,183, 47,241,163, 63,251, 49,118, 14,246,209, 27, 20,168,150, 21,102, 23,151,176,214,225,227, 31,125,140,197,162,133,
+209, 6,203,249, 28,112, 30,109, 99,209,223,232,163,174, 13, 94, 61,125,129, 27, 55,182,240,252,225, 67,212,203, 37,198, 59, 87,
+112,235,222,187,216,220, 26,225, 98, 42,240,244,193,175,176,186,120, 3, 41, 4,110,127,242, 99, 60,255,195,151,176,166, 37,244,
+169,167, 81,219,181,247, 62,194,141,251, 31,224,197, 31,190,128,146, 30,155, 87,174, 96,184,181, 67,130, 35,149, 32, 47,251, 88,
+205,103,152, 93, 94, 98, 49,175,209,180,244, 96,215,213, 10,158, 61,182, 73,194, 30,111,169, 32,189,224, 3,220, 96, 48,218, 68,
+ 86,246,184, 91, 72, 81, 14,135,108,247, 73, 80,215, 6,122, 86,147, 38,102, 85,161,105, 42,232,166, 37,247, 1,191,215,144,148,
+186, 21, 16,147,225,179,110, 57,188,133, 14, 82,178,203, 4, 68,175, 88,251,243, 73, 34,162,115,132,124,203, 10,109, 75,187, 72,
+ 99,153,228,103, 45, 43,226, 93,228,147, 59,238, 98,211, 44,141,100, 46,197,151, 8,133,172,116,162, 84, 90,211,216,152,205, 16,
+166, 0, 70,107,206,108,183, 81, 72, 22, 26,136,208,157, 82,175, 99,163, 15, 57,100,117, 43, 37, 98, 83, 65,142,148,148,145,181,
+235,224, 24, 48,197,142,178, 43,140,214,188,183,117, 29,251,157, 99,179, 20, 59, 48, 56,216,141,245, 66, 30, 82, 40, 88, 71,226,
+ 61,218, 73,187,136,245, 21, 44,146, 10, 30,115, 26,195,202,152, 80, 23, 70,196,206, 27, 34, 5, 58, 27,187,229,128,207, 13, 22,
+ 68,203, 66,198, 64,224, 51,166, 75,200, 19,252,251,114,156,116, 22, 34,181,105,103,237,215, 20,223,230,173, 11, 33, 20, 39, 65,
+189,110, 12,137,225, 18,149,197,179, 66,172,161,178, 45,175, 75,211,148,166,127,225, 53, 72, 25,236,148,107,223,151, 11,242, 96,
+219, 10, 86,227, 16, 98,101, 45,193,197,242, 44, 69,211,208, 58,133, 40,146, 34,158, 87, 81,180,236,124, 92, 63,133, 4, 56,203,
+ 2,100,185, 46,246, 11,224, 35,103, 67, 8, 48,140, 15, 90, 41, 42,220, 32, 82,178, 52,243, 94, 61, 20,114,130,155,168,144,154,
+ 25, 45,199,236,227,239,252,249,136,211, 94, 33, 68,116,180,144, 45,218,162,213,154,137,143,158, 5,180, 33, 38,152,184, 29, 97,
+ 58, 22, 86, 73, 34, 94,206,157,216, 83,112, 62, 65,152,158,120,248,183,248, 46, 62, 40, 30, 41, 1,135, 58,117, 47, 4,234,170,
+137,161, 42,212, 85, 10, 56,163,153, 21, 77,213,210,114,177, 64,217, 7, 20,199, 14,166, 60, 42,150, 82,146,111,214,203, 40,106,
+112,108,129, 18, 74,195, 57,131,182,182, 4,253,176, 52,174,234,245, 83, 88,215,249, 18, 85,154, 64, 88,199,214, 42, 17,109, 36,
+ 36, 54,145,104,219,182,195, 49, 66, 66, 42, 11,107, 13,242, 44,137,227,247, 52, 75, 72,172, 39,120,223,147, 42,180,173,225, 93,
+ 11,121, 70,137,167, 30, 0, 12,140,224,243, 68, 80,202,178,132,118,239, 89, 18,225, 57,142, 83,215,232,162,225,104, 89, 86,144,
+135,144,145, 0,186, 80, 74,194, 41, 9, 41,211, 88,221, 11, 33,145, 23, 52, 82,146, 0,145,234,188,135,110, 45,172, 49,140,143,
+ 37,173, 2, 5,148, 36,232,245, 89,248,197,190,116,170,218,200, 3,106, 12, 21, 83,240, 22,175,158,190,196,254,225, 30,182,247,
+182,113,113,122,134,151,143,159, 66,165, 5,110,223,187,139,179, 55,175,241,236,241,139, 72, 33, 50,198,162,169, 91,222,163, 91,
+180, 53, 21, 88, 66, 10,152,150, 98, 55,203, 94, 17, 63, 68, 69, 47, 71,154, 37,128,112,200,138, 18,211,139, 11,220,124,247, 22,
+ 84,146, 98, 54, 89, 0,222, 98, 49,155,195, 57,224,252,108,130,195,155,135,120,241,248, 57, 22,243, 21,122,131, 18,243,233, 34,
+ 34,117,219,150, 82,240,106, 75,239, 69, 94,100,112,166,133,243, 18,195,113,129,201,197,156,191, 23,231, 44,199, 0, 4,122,239,
+133, 32,133,109, 94,100,184,118,235, 26,198,219,155,104,235, 26,101,127,128,162,204, 96,116,139,186,106,201,133, 33, 5,174,221,
+186,134,209,214, 22,242, 50, 35, 23,193,241, 41,140,241,104,170, 10,131,241,109,188,124,113,142, 55,207, 95, 64, 55, 21,117, 51,
+ 82, 97,188,179,141,199,223, 60,197,230, 70,134,201,201, 27,204, 47,207,177,127,253, 58,110,221,123, 15,194, 53,104,108,129,111,
+ 31,124,137,122,250, 18, 66, 8,244,198,251, 40,122,125,124,247,226,219,184, 6, 18, 82,225,218,123,159,224,238,167,159,226,241,
+151,191, 6, 0, 92,185,113, 27,229, 96,128,106,213,192, 11,129,188,200,177,184, 60,193,124,186,192,116,178,130, 23, 18,206,104,
+ 52, 77,197,170,126,135, 68,121,104,175,144,164, 34,142,135, 71, 91, 59, 40,202, 30,146,188, 7, 15,133,162,223, 67,154,151,104,
+ 27,141,186, 54, 48,139, 58,218,118,172, 53,168, 86, 21,140,110,249, 0,118, 81,120, 20,216, 85,244, 44,122,246,183,211,129,170,
+ 91,222,239,242,239, 63, 16,253,178, 92,118, 59, 60,136, 8,101, 82, 82,178, 0,182,129,118, 38,226, 48, 73,196,229,226, 90, 43,
+ 20, 4,193, 74, 21,138,216,208,233,136,181, 81, 52, 93, 20, 84, 12,132,112, 36,218,187,187,104,113,242,140,215,140,132, 57, 65,
+140,247,132,197,179, 93,164, 43,171,217,185,107,148,107, 93, 49,229, 40, 20, 93,183, 25, 71,193,116,120,251,112,254,160, 99,155,
+135,160,145,160,196,118, 14,111, 69,145, 38,172,130,247, 28, 35,234,227, 56, 21, 17,158,133,117,250, 87,100,219, 39,124,177, 16,
+219,194,217, 22,214, 52, 29,131, 29, 93,154, 28,209, 40, 69, 12,201,161, 2, 42,139, 42,255,112, 73,202, 88,188,136, 24,225, 44,
+ 61, 53, 59, 20, 51,205,144, 22,246,247,203, 8, 79,177,209,190, 22,118,246,142,237,104,225,194, 14,247, 4, 17, 44,147, 40,250,
+ 13,207, 0, 77, 73, 12,114,230,138, 68,177,108,162,232, 44,224, 64, 19, 23,126, 63,142, 97, 92,144, 12, 68,146,112,130, 83,222,
+132,100,253, 83, 23,217,170, 50,201,168, 86,254, 12,121, 7, 47, 37, 44, 58, 75, 97,154, 42, 52,181,101,110, 59, 56,103,158,226,
+ 83,157,227,169,141, 84,252, 59, 0,148, 32,198, 9,216, 70, 45, 84, 22,243, 6, 98,230, 7,175, 60,188, 23,240, 74,112,178, 90,
+135, 47, 22,204,155, 8,152, 92,163, 27,184,176,198,145,226, 45,124,113, 40, 32, 73, 56,137, 40, 0,246,126,253,107, 98,141, 41,
+192, 69, 3,115,232,201,101, 2,218,255, 7,174, 0, 55,111,214, 58,168,255,238,227, 59, 63,239,178,208, 73,120, 99,152, 8, 21,
+ 30,164,182,165,125,170,209,134,121,210, 33,120, 65,160,213,186, 19,195, 40,178, 44,101,121,142,162,223, 7, 98, 76,169, 92,179,
+163,177,133,198, 24,228,101, 22,253,135,158, 61,148, 34,170, 10, 59,175,159,224,139, 90,188, 69, 40,242,232, 68,242,244, 11, 23,
+107,213,164, 20, 96,187, 73, 96,183, 75,174,216,193, 35,254,142, 91, 44,214,194, 28,194,195, 29,254,126,160,177, 5,192, 5, 89,
+227, 36,131, 60, 18,142,139,164,192,129,176, 23, 11,194, 9,176,122,222, 59,135,186, 38,161, 89,181,106,216,207,239,226,247, 15,
+127, 38,178,208,249,225, 12,104,217, 36, 77, 57, 11,185,203,236, 85, 74, 96, 49, 95,192, 67, 98,231,202, 46,234,213, 10,243,233,
+ 4,199, 47,143, 48,218,218,193,245, 91, 7, 56, 61, 58,129,110, 27, 34,144, 89,170,102, 45, 7,212,232, 86,195,106, 98,172,143,
+198,253,232,115, 15,221, 74, 96, 51,215, 28,128,242,252,209, 11, 28, 92, 63, 32,141, 65,211, 96, 57,159,193, 90,129,225,168,143,
+254,112,132, 52, 21,104,106,141,141,173, 1, 38,231, 19, 36, 89,129,249,228,156,119,180, 29,167, 64, 74,170,128, 7,227, 13, 12,
+134, 61,172,230, 75,232,182,197,173,119,174,227,232,197,107, 92,158,207, 99,210, 91, 86,228, 72, 18,129,241,230, 24,109,221,224,
+131,207,238,163,109, 61,137,228,242, 12,214,106,204, 47,151,112,206,160, 55, 32, 72,204,198,238, 54,154,214, 35, 77, 8, 14,244,
+229,191,254, 14,155, 59,219,232, 13,250,152,205, 26, 92,158, 93,224,245,227, 71,132, 68,174, 91, 92,191,251, 46, 78,143, 46,144,
+ 39, 22,189,204,226,201, 31,254,128,107,119,239,225,206,251,119,177,154, 76, 32,139, 13, 60,127,252, 26,171,179,167,144, 32, 32,
+202,189, 31,253, 12, 79,126,247, 11,180,245, 50,138, 41,223,249,228, 71,184,247,249,103,120,246,224, 11, 40,165,176,123,120, 13,
+121,175,143,229,124,201, 12,135, 6,243,139, 83, 76,207, 47, 49,155, 46, 81, 55, 6,109, 85,197,108,113,103, 26,250, 12,242,251,
+156,102, 57,134, 27, 27, 24,109,108,160,236,143, 72, 16, 39, 83,100,101, 15, 66, 16, 66,121,185,172,176, 90,172, 80, 87, 21,146,
+ 68, 98,181, 92,162,173,170, 72, 39,243,188, 59, 14, 66,195, 36, 80,217,120,244, 27, 49,175,146,194,149, 28, 83,195,194,161, 27,
+ 88,232,193,218,149,114,232,138, 99,177,207,106, 89,113, 2,162,140,121,225, 97, 12,166,216,195, 29,158, 87,143,110,135, 74, 86,
+ 78,217, 89,177,162,114,157,189,216,108, 65, 90,207,172,118,188,211, 50,214, 67, 72, 58,163,224, 29,100, 12,246,176,112,206,112,
+ 34, 29, 56,225,138,185, 12,232,136,107, 50, 38, 98,137,181, 24, 86,196,162, 37,194,170, 44,117,111,193,130,228, 29, 98,242,156,
+ 84, 10,137,234, 40,120,116, 94,209, 25,170, 56,136,133, 28, 33,221, 24, 62, 48,250,169, 8, 48, 72, 84,202,158,127,196,125,185,
+115, 13,253,215,191,157,244,230,187, 96,238,232,185,239,254,185,143,202,113,242,163,103, 17, 50, 20,184, 14, 33, 85,204,152,110,
+ 53, 26,214, 2, 65, 11, 17,206,187, 48, 18, 14, 13,150, 16, 10, 9,159, 11,129,247, 30, 2,181,162,176,142,221, 63,235,226,184,
+184, 71, 86, 18,150,225, 88, 97, 93, 41, 24, 62, 70,127,173,162,181, 45, 0,199, 44,139,251,194,170, 34,124, 78,163,194,156, 11,
+ 75,201,163,111,199, 7,204, 58, 24,140,175, 59,242,167,115,250, 94,244,174,139, 0,114,233,112,192,221,207,148, 32, 77, 20, 79,
+ 55, 85, 44,226,194,101,179, 78,117,147,129,164,232,232,251,208,159,243, 44, 66,237,182, 45, 2,235,105,187, 29, 74, 55,128, 93,
+169,224,246,107, 86, 78,185,166,127, 8, 96, 28,177, 70,210,235,108,214,241,125, 8, 22, 78,239,161,254,230,243,123, 63,119, 14,
+ 16,124,185, 82, 88, 67,120, 81, 34,218,202,172,115,220, 93, 26, 40,153,176,165,139,195,238,153,209,174,141, 67,145, 43, 52,181,
+198,120,107, 27,123, 87,247,161, 91,141,186,170, 24,172,224, 98,119,238,128,152,208, 22, 66, 8, 66,213,155,102, 73,204, 56, 79,
+ 18,197,190,110,242, 29,210, 78,221, 71, 49,154,148,212, 69, 19, 28, 71,118,126, 82,116, 2, 11,231,232,123,133, 3, 41,116,172,
+214, 56,126, 64, 68,164, 69, 57, 30,213,123,142,169, 12, 29,134,179, 62,142,123,214, 67, 39,164,146,209,194, 17, 46,113,240,142,
+196,104, 11,221,104, 26,123,183, 38,230,173, 19,241, 45,137,235,141,162,200,248,161,167,175, 91,148, 57, 71,205,242,229,238, 56,
+162, 86,144,234, 51, 77, 85, 20, 91,172, 22, 43, 84,203, 26, 59, 87,246,224,140,198,106,177,192,197,233, 41,154,198,225,163,239,
+127, 4,107, 53, 86,139, 85,247, 51,146,247,133, 80,178, 82,144,221,139, 49,134,180, 30,161, 98,167,170, 26, 76, 47, 23,104,170,
+ 10,144, 25,122,165,196,139,167, 47,113,112,227, 26,122,253, 18,147,179,115, 90, 45,100, 5,140, 54,216,189,178,143,197,116,138,
+221, 43, 59,152, 93, 78, 96,140,160, 12,238, 86, 71, 27,144, 49, 97,215,234,145, 21, 61,236,236,109, 98,114, 62, 69,181, 92,225,
+250,237,171,120,245,236, 21, 22,179, 5,211,166,232, 18,241,222, 99,123,119, 19, 91, 59, 99,228,101, 9, 15, 79,234,110,239, 80,
+ 45, 87,104, 27,210, 74,204, 39, 83,140, 54,199,112, 62,193, 96, 88, 64,183, 53,190,250,197, 23, 88, 45, 87, 24,109,140, 0,149,
+227,226,244, 18, 47,190,251, 22,213,124,134,106, 89, 99,107,111, 31,101, 47,199,106,213, 96,103, 51,195,171, 39,143,113,120,247,
+ 30,246,174,236,224,248,249, 51,244,183, 15,112,121,122,137,201,217, 57,164,157,193, 89,141,131,119, 63,130,109, 91,156, 60,255,
+ 22,240, 30,195,241, 22,222,249,228,135,184,253,193,251,120,250,224,247, 40,251,125,236, 28, 92,133,115, 36,220,115,166, 69,189,
+156, 99,122,118,130,203,179,115, 44, 87, 6, 77,107,225,116, 75,227,108,103, 96, 77, 27,227, 73,243,162,192,112,188,129,254,112,
+140,178, 63,128, 80,212,197,120, 86,191, 11,198,186, 86,171, 58, 70,125, 54, 77,139,106, 73, 34,184,182,105, 33, 19, 5,168, 52,
+218,153,200, 11,108, 33,147, 16,184, 33,184,123,113,112,158, 5, 87,150, 70,232, 49,249, 47, 77,249,210,162, 75,126, 48, 28,112,
+103, 41,163,200,149,242, 13,124,116,109, 68,215, 8,119,161,129,239, 79,194,174,128, 17, 37, 17,149,231,238, 56,116, 92,186,109,
+105, 95, 25,237,143,170, 99,189, 59,207, 59, 79, 5,169,114, 62, 68,109,188,144, 98, 39, 99,130,165, 77, 70,171,103,188, 4,189,
+131, 74, 56, 87, 60,248,158,101,200,187,150,220,109,170,181,172,190,198,229, 0, 0, 32, 0, 73, 68, 65, 84,130,200, 69,219, 44,
+ 47, 94,249,245,228,113,191, 29,138, 36, 64, 69,192,147,247,228,151,175,235,154, 95, 35,249,163, 29,191, 22,107, 53, 18,149, 34,
+205, 10, 90, 3,176,242,220,152, 6,186, 93,145, 86,136,153,222, 42,234,111,186, 8, 89,110,159, 34,126, 54,140,123, 37,127, 54,
+210, 44, 67,154,102,111, 1, 91,162,163,151, 69,131,148,232,215,240,153,199,174, 36, 15,116, 91, 26,201,103, 84, 78,226, 88, 46,
+244, 67,204,104, 0,134, 37,105, 26,197,196,105,146,118,196,180, 53,139, 21,233,205, 72, 81,239, 57, 46,184, 43,134,232,126, 9,
+ 5,149,224, 98, 47,224,126,195,229,253, 54,217,111, 77, 40,103, 76, 92,221, 80, 50, 27,243, 9, 44,211, 67, 89,215, 69,157,172,
+103, 46,188, 99, 4,111,232,188, 93,188,235,168,169, 73, 25,172,163,162,112,149,196,162, 29, 80, 77, 37, 50,218, 12,131,242, 60,
+176,225, 3,181, 47, 92,240,225,247, 64,192, 28, 78,239, 20, 62, 70,184,146,194, 95,118, 65, 99,113, 13,229,209,173,204, 69,215,
+193,179,109, 77,188,197,192, 23,111, 33,132,213,223,124,126,255,231,209,182, 16,186,237,240,129, 89, 99,178,211,159,233,124,117,
+214, 1,131,113, 31,166, 53, 12,165, 80, 8,233,130, 2, 30,203,197, 2,179,233, 18,229, 96,136,253,195, 43,176,124,224,132,138,
+ 48,196,249, 81,236,159,139, 66,157, 32,142, 8, 59,139, 16, 63, 25, 46,227,132,149,213, 97, 60,187,230,106,141, 54, 57,201,151,
+185,209,102, 45, 76,190,235, 10, 2, 39, 55, 88,228,156,113, 93, 56,138,113,209,150, 17,130, 36, 66,197, 25,118, 25,132,104, 37,
+225, 68, 0, 37, 80,183, 78,222,207,166,106, 57, 31,222,172, 1, 46,168,232, 8, 31,232, 80,105,173,255, 76, 68,205,163,241, 34,
+ 29,172, 9,172,161, 17,127, 0, 33,132,170, 63, 88, 53,156,117, 48,186,193,229,249, 4,219,251,251,232, 15, 10,172,230, 75,212,
+213, 2,199,175, 79,113,112,227, 38,174, 94,223,199,249,241,121, 12, 82, 8,149,127,150, 37,196,178,214, 52, 69, 0,128,186,226,
+157,243, 98,197,163, 59, 58,136, 54,119,118, 49,189, 56,199,217,201, 37,118, 15,246, 48, 24,245,112,118,116, 2,231, 37,250,131,
+ 30,154,198, 96,107,103,136, 44, 47,176,156,205,161, 53,160,155, 21,116, 75, 89,244,180,163, 83, 48,218,146,170, 93,166,216, 61,
+216, 65,189,170,161,155, 26, 87,174,237,225,197,163, 23, 56, 59, 57,143,163,197, 32,226,185,249,206, 33, 70, 27, 3, 92,156,205,
+ 24, 93,235, 0,111, 49,189, 92,208,248,210,181, 80, 73,138,254,104,128,182, 53,144,176,120,242,205, 51,252,254,151,191,198,193,
+205,235, 72,139, 18,167,175, 79, 97,173,197,235, 39, 79,200,114,153, 21,248,232, 7, 31,227,233,183, 79,113,120,109, 27,182, 93,
+225,224,214, 45,100, 10,120,240,171, 95,225,230, 7,159,226,244,205, 49, 46, 47, 43, 36,152, 35,145, 10, 69,127,128,171,119,238,
+227,201, 23,255,202, 24,218, 61,220,249,228,251,184,254,206, 29,188,121,252, 29,198,219,219, 24,108,108,161,174,106,204, 47, 47,
+176,154, 78, 48,187, 60,195,244,252, 4,243,217, 2,181, 86,108,199, 1,148,240,240, 86,195,123,218, 91,247,135, 35,108,110,111,
+ 99,184,185, 9,149,150, 80, 73, 22,243,207,165,162, 75,217, 26, 11,109, 61,211,221, 2,231,160, 37,145,226, 96,136,222,112,140,
+254,198, 54,242,222, 8, 66,165,112, 70,243, 88, 84,210,251,187, 86, 52, 59,215, 93,188, 97,183, 76,251, 80, 65, 28, 8,246, 43,
+ 43,149, 96, 48,236,211, 1,206,207, 64, 93, 53, 88,204, 22,145,103,238, 61, 61,163,186,109, 72, 96,154,132, 56, 96,234,196, 2,
+159, 33, 32, 86, 67,232, 72,240,165,119, 34, 50,183,102,243, 66,236,224,233, 2, 79, 1,208,228,128,246,179, 14, 64, 23, 26, 19,
+ 68, 99,193, 58, 37,184,128,143, 52, 46,165, 32,101,218, 49,179, 89,132, 20,120,236,225,194,164, 84, 50, 18,225,218, 72, 33, 35,
+171,162,146, 10,105,154, 33, 81,148,156, 24, 83,212,194,193,202,206, 1,231, 60,180,110,187,231,148, 37, 98,134,153, 2, 73,154,
+ 83,134,124,156, 94,182,176,182,133, 53, 93,228,106,119,110,137,216,235, 69,184, 84,180,159,117, 23,100,216,237,167,105,198, 22,
+ 60, 23,131, 76,194,104, 87, 5,240,144,209,107,136, 82, 22,205,114,215, 25, 38,117, 89,150, 69,101,125,196,183,134, 16,175,181,
+240,173, 44,207,120, 18,154,196, 34, 34, 9,172,247, 64,157, 11,189,132,144,164,226,142, 28,125,106, 36,194,138, 36, 20,123, 88,
+ 31, 41,135,137,146, 39, 87, 81, 32, 13,134,230,131, 10, 58, 31,147,236, 8, 84,197, 41,154,108, 41,148,188,147,150, 17,112,131,
+184,122, 13, 52, 56,114, 12,100,145,114, 24,168,124, 33, 98, 55,236,210, 73, 15, 96, 58,244,182,119,172,244,183, 81, 32, 26,132,
+210, 97,141, 20,252,231, 42,192,207,248,210, 15,175, 49, 18,129,227,223,119,111,209, 76,197, 26,109,181, 19,138, 50,108,200,135,
+ 0, 29, 17,233,138,234,175,191,247,222,207,195, 33,159, 50, 54, 84, 8, 9,190, 51,200, 95,169, 13,143,151, 17, 1, 4,121,145,
+147,141, 45,170,205,187, 12,227,144, 83,110,140,193,106,185,192,244,146, 44, 61,251,135,251, 28, 3,186,138, 56,200, 32,186,176,
+142,246,204, 20, 85,216, 61, 28, 89,158,196,135,178, 40, 11,238,100, 51,246, 93, 50,194,145, 63, 32, 42,236,107,172,139,251, 89,
+ 18,106,173,193, 5, 68, 7,160,161,106,207,161, 40, 67,192, 74, 26,225,251,228,179, 94,247,187, 34,238,134,194, 88, 47, 97,155,
+131,181,142,240,157,173,102,150,188,125,203,195, 75,214, 61,172,165,253,216,168,109,112,214, 70,212, 97, 83, 53,145,157,236, 61,
+208, 31,148,124, 96, 25,172, 22, 43,142,148, 37,111,113, 16, 96, 4,171,131,110, 91, 92,156, 93, 64,169, 28, 87, 14,247,112,121,
+118,129,197,108,134,163,151,175,208,106,137,251,159,220, 71, 83, 45, 49,155,204, 32, 0,148,189,156,252,236,222,193,180, 6, 77,
+211, 98,181,168,176, 92,172, 80, 85,117,196,204, 38,105, 18,187,200,157,253,109, 28,189,124,131,229, 98,133,205,157, 45, 12,199,
+ 3,188,124,246, 10, 89, 94,192, 91,131,114, 48,160,175,233, 52, 22,139, 22,186, 93, 97, 62,153,118, 92,110, 77, 64,150, 36,203,
+ 33, 85,130,173,221, 45,232,182,197,228,124,130,189, 43, 59,120,246,232, 25,166, 23,211,136,250, 36, 1,154,195,247,126,252, 1,
+206,142,207,209,212, 36,116, 20, 82, 98,181, 88,160,170, 12,202, 94,134,233,249, 57, 84, 90,162, 63, 44,225,172,193,244,114,138,
+ 95,252,215,127, 64, 85,213,248,232, 71,159,163,173, 45, 22,139, 10,179,179, 83, 44,231, 43,120, 41,241,217, 79, 62,199,235,199,
+143,177,123,245, 26,110,222,218,197,112, 99,132, 87,223, 61,194, 31,254,237,215,248,248,167,127,138, 55, 79,159,161,110, 20,164,
+157, 33, 81, 30, 42,205,112,253,254,199, 56,122,244, 0, 74, 41,108,237, 95,193,173, 15, 63,193,104,107, 19,179,179, 99,108,238,
+239, 35, 45, 74, 76,206, 47,112,252,236, 25,166,103, 39,152, 93,156, 97,181,152,163,213, 30,173,205, 34,224,137,114,125, 40, 23,
+188, 28,140,176,177,179,143,225,230, 22,100,146, 3,130, 66,143,218,150,236, 98,253, 65, 15,105, 86,160, 24,140, 32,147, 2, 42,
+ 45,144,247, 70,128, 76,225,124, 2,235,147,152,144,216,214, 75,172,230, 83, 52,171, 41,218,122,201,105,135, 50,142,223,227,152,
+ 50,164, 47,198,157, 97, 39,214, 36, 49, 83,202, 4, 45,133,225,120,128,222,112, 16, 17,204,100,185, 36,140,112,216,111, 7,149,
+121,240, 63,211,168, 53,141,160,148,176,139,149,188,135, 15,137, 97, 82,201,181,241, 54,141,207, 3,139,187, 3,177,112,192,137,
+204,227,179,225,156,129,247, 58, 62,103,214,248,184, 14,148, 66,118, 7,124, 72,100, 99, 69,177,103, 64, 86,184,112, 2,250, 51,
+230,136,115, 83, 78, 60,137, 96,145, 99,128, 73, 0,230,168,132, 69,131, 10,130,139, 19, 1, 25, 15, 99,173,153, 24,199,211,132,
+160, 82,247,156,208, 37,164, 64,150,151,244, 51, 50,175,220,232, 6, 70, 87,111,173, 19,215, 17,214,235,227,241, 40,144,242,126,
+205, 50, 5, 22, 38,166,132, 47, 13, 40, 87,190, 20,173, 49, 72,148,138, 77,134,181,250, 45,194, 91,154,166,112, 76,126,164,105,
+161,138,159, 9, 26,227,119,145,179,105,154,208,185,144,165, 76,251,148,113,114, 17, 68,101, 49, 73, 45,224, 92, 67, 17, 23, 19,
+ 51,101, 36,176,169,128, 13,231, 41,128,136, 36, 24,250,247,146, 68,114,177,193,223, 43,172,107,172,139, 23,171,209,134,154,209,
+ 48,241,101,182,186,247, 54, 22,101,235,132,191,216,125,243,248, 61, 88, 29, 3,180,135, 62,251, 50,174,104,128,128,123,117,156,
+147,160,162,179, 42, 10, 16,215,198,243, 42,104, 15,156,225,189,191, 71,192,228, 19, 4,108,109, 30,207,133, 1,173, 21,124,252,
+126, 33, 35,190, 35,198, 5,148, 45,253, 30, 3,102, 57, 38, 43, 5, 12,173,148, 72,194,155,224, 29,141,212,194,152, 39,176,217,
+121, 76,207,246, 7,122, 48,154, 86, 35,105, 53,188,108,145,229, 25,178, 60, 35, 91,152,117,208,198, 34, 97, 98,158, 74,168,171,
+ 18,176,120,241,248, 9,164,202,112,245,198, 33, 54,183, 55,113,122,116, 74,233,101,193,203,152, 38,176,142, 70, 87,109,211, 34,
+ 73,105, 47,164, 91,205, 5,132,231,194, 35,137,132,178, 48, 57,114, 33,103,214, 3,186, 49,200,178,224,211,228,168, 84, 14, 44,
+ 80,137,236, 34, 8, 5,229,162,135, 3, 73,113,126,119,168, 6, 3,127, 58, 48,218,165, 16,104, 26, 3, 41,124,156,155, 52,117,
+139, 36, 75, 99, 32,130, 19, 54,126,152,171, 21, 17,142, 90,246,129,135,110, 31,232, 24,242, 89,158, 80,132,165,146,168,150, 76,
+ 24,242, 6,222, 73, 24, 3, 12,199,212,189,247,250, 5,230,211,121, 76, 95,211,186,229, 42,156,130, 22,218,166,141, 86,152,147,
+ 87,207,177,156,111,226,206,251,247,241,234,233, 99,188,121,113,132,151,143,191,197,233,155, 55,248,224,179, 79,176,177, 53,198,
+183,191,127,200, 15,134, 97,132, 46,117,124,117,221,196,228,181,237,221, 45,244,250, 61,148,174, 7,153,150,152, 77,102, 72,146,
+ 29,108,108,142,112,113, 62,195, 87,255,246, 5,110,190,123, 27, 31,125,254, 62,254,240,229, 99, 92, 61,220,199,155,231,175,209,
+255,240, 61,100,121,142,106,113, 2,103, 52, 38, 23, 23, 44,168, 34,174,184,169, 43, 64,164,208, 6,120,253,252, 20, 69,161,176,
+ 90,174, 80, 87, 13, 86,179, 25, 46,207, 79, 81,148, 3,200, 36, 69, 94,246,112,237,230,117,212,171, 26,151,103, 19,140,182, 54,
+ 96,180,195,246,118, 15, 47,190,123,138,114,184,129, 44, 19,232, 13,123, 40,250, 5, 86,139, 26, 2, 22,223,126,249, 13, 38, 23,
+ 23,184,125,239, 62,146,172,196, 98,122,142, 44,207,241,250,226, 18, 42, 77,112,229,218, 1, 36, 12,146, 98,136, 79,127,116, 15,
+237,114,142,127,250,191,254, 22, 71,207,159,224,135,127,245, 55, 56,122,250, 12,218, 42,212,245, 12,131, 92, 35, 47,123,232,111,
+238, 34, 77, 36, 70, 27, 35,136,237, 77, 92,189,115,151,118,229,109,133,225,214, 46,172,213, 56,126,246, 24,199, 47, 95,160, 94,
+ 46, 96,218,154,182,122, 34,135,151,228, 44,144,240,144,194, 66, 41,135,254,112,140,254,120, 19,105, 65,162, 55, 10, 72, 34, 5,
+119, 62, 8,118, 43, 82,255, 46,170, 6,122, 66,216,216,197,108, 10,219,214,144,138, 46, 88,235, 40, 25, 43,203, 19,142,149, 12,
+ 41,133,164,138, 38, 59,140,141,105,130, 84, 40, 43,134,153, 56,230,102,139,104,103,163, 75,139,152,214,101,175, 92, 75,237,162,
+ 34, 53, 20,229,225,114, 9,201,101, 16, 64,146,101, 16, 96,244, 37,186,216,212, 46, 93,143, 38, 6,100, 71,210, 16, 49, 86, 82,
+ 68,101, 51,224,226,232,221,180,150,213,225,105,164,172,145,100, 73,199,110,149, 70,163, 84, 36, 43, 25,188,245, 96, 31,178,137,
+ 23,161,243,221, 97,174,164,128, 76, 18, 18,148,113, 91,165, 20,173,180, 40, 26,154, 14, 95, 66,197,202,200,237, 8,148, 54, 33,
+ 2, 28,139, 52, 8,172, 27,163, 66, 66,209,179,219,241,239, 77,252,122,222, 59,100,217, 32,138,239,192, 29, 37,145,226, 92,156,
+ 40, 70,168, 73,156,242,185,152, 24, 22,109,109, 66,197,208,156, 32,214,234,244, 64,157, 21, 79,241, 10,211,114,243,224,226,247,
+ 10,151,137,138, 98, 96,199,238, 32, 25,168,105, 28,136, 34, 3, 99, 0, 29,179, 92,196,156,119,143, 44,149, 49,143, 93, 73,209,
+ 89,241,140,133, 72, 21, 60, 67,101, 84,146, 64, 59, 48, 33,178,139,196,142,124,124, 19,108,192, 50,250,211,131, 37,205,179,123,
+ 65,128,126, 86,203,163,104,103,233,236,215,173,142,161, 44, 33,119, 97,125,231, 28, 58,106,173, 91,178, 82,231, 42,174,167, 58,
+240,144,138,220,255,240,255, 45, 76,220,133,211,221, 64, 32, 53,239, 16,161, 68, 36,250,211, 76,129,163, 75, 94, 90,194,254,122,
+ 96, 77, 88, 29,194, 90,120,204,174,130, 40, 92,172,241, 29, 2, 78,214,114, 39,206,200,239,183,130,118, 68, 23, 65, 44,197,154,
+163,130,232,139, 9,120,252, 98,172,129,144, 52,134, 14, 16,128,245,220, 97, 10, 79,113,108,237,242,168,150, 43,130, 19,100, 36,
+248,128,183,236, 49, 76,209, 86, 75,228,101, 1,107, 13,227, 87,233, 23,215,214, 21, 94, 60,126,130,178, 63,194,245, 59,215,177,
+154,207,113,126,122, 14,107, 61,169,186, 25,254,146,112, 5, 31, 72, 77, 90,183,124,177,211,248,173,236,147, 66,147,216,225, 65,
+ 96,227,185,226,108,187, 17, 60, 87, 66,121,158, 50, 27,218,241,254, 67,178,114, 52, 89,243,215, 34, 70,128,134,191,159,231,164,
+ 56, 15, 62,245,162, 76,121,106,225,216,206,166, 98,116,104,128, 70,144, 96,131,194, 74,170,101,133,166,161, 49, 92,146, 38,112,
+181, 91,219, 91, 9, 44,102, 75,138,187, 76, 21,119,228, 52, 98, 47,122,189, 24, 59, 89,148, 25, 91, 60,136,197,236,172, 69,150,
+166, 92, 29,174,161, 12, 25,224, 1, 8,172,230, 19, 60,252,253, 28,119,238,189,139,254, 96,128,151, 79,158, 67, 74,135, 7,255,
+246, 43, 92,187,115, 23, 63,254,139,159,226,193,175,191, 64, 93, 53,164,110,150,134, 68, 61, 86,199,196,174,201,249, 57,135,182,
+ 88,244,134, 4, 93, 56, 61, 58,195,193,181, 67,204,103, 43, 8,175,240,219,127,254, 39,188,255,217,103,248,228,243,247,241,250,
+229, 49,178, 84,226,252,248, 12,239,189,127,136,239,190,126,129,172, 40, 8,151, 10,178,167, 20,101, 14,107,233,103,205, 50,133,
+179,147, 11, 92,187,121,192,211, 11,131,186,170,120,191,108,225,173,196,214,206, 38,238,127,122, 23,231, 39,103,104, 27, 67, 41,
+101, 90, 66,194,225,242, 98,142, 43, 55,174,193,154, 26,229, 96,132,209,120,128,249,116,142,201,229, 4,223,124,249, 37,156,115,
+ 56,184,125, 11,105, 2, 44, 87, 45,154,229, 28,198, 2, 89,145,225,222,199,239,224,193,191,125,129,143,254,232,135, 88, 92,156,
+225,191,253,199,255,140,229,124,134,207,255,226, 63,224,245,147,167, 16, 66, 98,177, 52,216,236,183, 40,202, 30,202,225, 24, 59,
+135, 55,176,188, 60,193, 96,107, 23, 59,135,215, 32,188, 67,219,212,144,105,129,213,124,134,231, 15, 31,226,236,205, 43, 34, 49,
+178,192,198,203, 28,214,167,240,198, 35,203, 60,138, 50,195,120,139, 88,239, 89,111,136, 86,211,186, 99,190,170,176,154, 77,224,
+109,139, 52, 75,145,151, 37, 7, 19, 81,145,235, 33, 97,181, 70, 53,159,161,173,150,144, 66, 64, 91,130,113, 36,114,109,146,228,
+ 28,107, 98, 36, 11, 29, 69,244,250,135,201, 87, 0,129,132,233,151,243, 64,154, 40, 56,109, 98, 14, 65,175,223,195,104, 99, 28,
+167,105,225,130,208,218, 80, 33, 97, 45, 95, 82,157, 26, 40, 73,168,131,211,186,133,177, 14, 57,175,174,136,253,175,226, 24, 55,
+164, 76, 5,135,131, 4,217, 91, 37,139, 82,219,166, 1, 64,116, 52,165, 50, 14,138,161,130, 92,183, 53,188,111,187,236,241,120,
+137,201,183, 50, 26, 66, 7, 39,215, 70,150, 30,226,237, 11,217,122, 56, 56, 46, 98,200, 98,100, 3, 59,156,207, 15,195,213, 0,
+253, 44, 10,134, 1, 45, 97, 42,232,215,162, 60,165, 19,107,108,111,209, 37,149,113, 92, 50,188, 67,158,151,132, 27,230,209, 53,
+ 65,109, 52,193, 81,214, 66, 64,240,214, 82, 17, 49,168, 35,230, 59, 64,192, 11,199,239,113,208,243, 56,166,120,242,207,195, 54,
+ 53,112,247,166,148, 88, 91, 7,116,109, 98,224, 89,132,226, 43, 4,132, 40,158,172, 64,116,254,126,163, 53,178, 44,141,121,233,
+ 97,180,236,248, 44,117,206,147,111,219,218,168,152, 23, 16, 16,220, 56, 57,103,226,190,154,214, 64, 41,103,119,248,120,214, 83,
+ 33,196,171, 2, 67,121, 28,138,249, 7,164,159, 73, 56,166, 21,113,173,167,184,187,183, 12,251,114, 1, 48,230, 77, 92, 95,208,
+ 36,192,113, 2,161,136,186,167, 0, 36, 11,171, 14,149,210, 51, 65, 27, 9, 15,145,136,200, 66, 88, 31,173, 27,126,207,164,232,
+ 38,179,244,108,241, 74,136, 5,211, 33, 46,214,161, 19,230,209,244,201, 67,248, 48,101,246,172,225,178,140,124, 70, 55,134, 15,
+ 77,168, 20,240,150,197,175,107, 48, 27,191,150,116, 42,248,223, 81,127,254,225,221,159, 83,158, 47,143,182, 2, 97, 40,216, 53,
+ 66, 21,195, 16,132, 80,217, 82, 40, 1,117, 9,126,141,145,171,141,131,227,144,142,144,248, 20, 44, 31, 70, 27,120, 16,189,236,
+226,236, 2,189,209, 24,215,111, 31,194, 26,141,197,124, 25, 37,253,158,199, 94,129,197,174, 4, 98, 36,106, 24,217, 9,182,106,
+ 56,222,245, 36,108,173, 72, 82, 21, 71,128, 20,249,103,214, 34,232, 17, 63,148,244, 48,119, 98,186,144,138,230,172, 71,150,167,
+204, 11,247, 17, 79, 24, 4, 27, 74,169,152,180,230, 92,247,243, 88, 99, 59,224, 76, 84,210,139,184, 79,215,173,137,175, 47,140,
+209,129, 46, 23,183, 94,145,103, 61,205, 83,100,121,142,173,157, 13,140, 54,250,196,104, 55, 6,139,217,146, 15, 1,215,129,255,
+185, 18, 77, 83, 69, 92, 1,238,116,156,243, 16,222, 97, 62,155,162, 28,108,226,234,141, 3,204,103, 51,234,234,171, 37, 38,151,
+ 43,220,251,244, 35,228, 69,134,201,197,132,108,137, 85, 69,241,132,225, 97,149, 18,166,213, 48, 28,212,145, 38, 2, 73, 86, 64,
+ 27,224,224,112, 23,203,197, 28,205,106,137,227, 23,207, 49,220,220,198,246,222, 46,102,147, 57, 18,101,145,230,125,180,245, 18,
+ 42, 73,113,244,226, 57,237, 85,147, 20,101,175,135,188, 40, 33,211, 28, 89,158, 17, 38,183, 55, 64, 91,205,177,115,101, 23,175,
+159, 61,195, 98,182, 68, 94, 20, 40,202, 18, 63,248,233,247, 81,148, 25, 46,143, 79,145,247,250, 72, 19,137, 36, 43, 48, 57, 59,
+131,117, 18, 87,175,239,192,121, 2, 22, 25,163,177, 90,212,248,226, 95,126,133,201,249, 57,174,221,126, 7,159,252,232, 19, 60,
+254,230, 57,210, 44,195,203, 71, 79,225,225,240,147,191,248, 17, 38, 39,199,184,122,231, 46,124, 51,199,255,251,159,254, 11,180,
+ 49,248,236,223,253, 25,222, 60,121, 2, 37, 61,106, 55,192,168,172,177,185,189,129,241,246, 22, 54,174,222, 2,108, 3,165, 20,
+174,220,190, 13,225, 12,180,110,225,173,197,209,179,151,120,244,229, 23, 56,125,253, 28,186,169,233, 0, 73, 82,228,131, 77, 20,
+163, 61,236, 94, 61,192,193,205, 91,216,185,122, 3,219, 7,135, 72,178, 30,230,139, 26,151,103,231,184, 60, 61,193,228,228, 53,
+170,233, 41, 18, 5, 12, 70,125,228,101, 1,231, 58,251,163,181, 14,213,114,137,106,185,160, 93,168,247,107,217,224,180,255, 14,
+112, 35, 15, 31,247,114, 65, 68, 71,105, 88,102, 45,143, 91, 70,187, 18, 89, 88, 83, 62, 32,104,212,222, 31, 12,208, 31, 14, 40,
+141,139,241,200,173, 54,104, 26,141,249,108,129,106, 85,175, 5,150, 16, 43, 34, 97, 37,179,214, 26, 41,123,211, 61, 79,223, 98,
+ 66,160,144,209,119,222,141, 67, 93,156, 42,184, 64, 90,179,150, 65, 46, 41,164, 76,217,109, 35,136, 61,175, 87,113, 60,233,215,
+ 94,135,115,126, 77,120,239,187,102,196,117,190,236, 52,205, 35,162,154, 88, 12,138,137,105,174,179, 18,121,234,148, 44,175,208,
+ 58,252,109,216,173, 42, 22, 18,118,251,230,120,201,250,208,124,107,166, 68, 26,238,252, 53,129,114,164, 68, 94,148, 40,202,146,
+181, 13, 14,186,109,209, 54,171, 72, 33,131,192,218, 37,164,186,221,255,218, 8,222,175,169,229,101, 4,253, 36, 72, 84,130, 44,
+ 47, 88,124, 72, 69,144, 95,163,182,133,223,145,229,148, 56,202,159, 71, 71, 89,243, 64,194,182, 54, 74,111,100,230,121, 12,211,
+146, 88, 27, 34, 16,139, 0, 34, 22,130,130,153, 30,193, 85, 33, 99,154,152,140, 59,255,176,182,164,236,137,132,247,226,136,169,
+157,146,113,219, 93, 40, 77,103, 91, 3,139, 59,105,133,234,201,114,205,211, 73, 17,211,212,104,173,234, 29, 97, 95, 85,194, 74,
+118, 25, 18,227,232,119,172,184, 0, 13, 9,154, 73,154,208,132, 65,210, 84, 74,138, 80,236, 80,163, 70,171,140, 14,224, 35,163,
+192, 50, 88, 48,101, 20,234,201, 32,228,139,153, 23, 93, 30,201,250, 14,189,219,165,119,197,154, 20,162, 11,103, 17,235, 2,185,
+110, 37,211, 33,149, 69, 20, 36,250, 24, 31, 75, 95, 39, 9, 92, 97,194,224, 17,206, 85, 27,131, 52, 33,223,119,240, 90,134,145,
+117,216,169, 27,235,224,234, 26, 89, 93, 65,165, 84,253,228, 57,219,161, 32,185, 99, 33, 5,165,243, 30, 86,115,132, 99,107,152,
+ 31,236,240,230,249, 75, 92,156,158,227,198,157, 27, 24,140, 6,120,252,240, 25,171, 63,195,155, 36, 80,150, 57,141,101,156, 71,
+154,121,142,215,163, 24, 79, 98, 40,147,176,161,232, 21,200,101,134,166,214, 49,114, 21,144, 72, 50,245,255,123, 13,244, 11, 33,
+ 31,173, 66, 94, 4,132,161,103,173, 64,134, 52,227, 14, 94,113, 22, 47,171,234,193,194, 18, 99, 60,219,116, 64, 59,127,134, 10,
+ 40, 41,208, 52,154, 70, 77,150, 30,134,178, 95, 66, 8,234, 82, 41,188, 69,196,145, 73,168,112, 33,128,225,184,223, 29, 26, 25,
+ 89,253,234,138, 18,243, 22,179, 10,186,181, 12, 63, 16, 0,123, 91,163, 26,159,193, 31,244, 64, 16,168, 97,181,168, 97,141,198,
+233,235, 23, 88, 14, 55,112,247,163, 15,113,254,230, 53, 86,171, 10,206, 52,120,244,213, 55,216, 62, 56,196,247,126,242,125,124,
+249,139,223, 32, 73, 18,164,101, 22, 63,132, 90, 27, 24,163, 81, 45,151, 92,245,122,236,245, 7,200, 82, 1, 47, 83,220,185,247,
+ 46,234,197, 20,103, 77,141,135,191,251, 13,222,251,244, 71,184,241,206, 13, 76,207, 78,241,230,213, 25,174,222,188,134,227, 87,
+199,140,140,181,177,154,117,214,162, 24,100, 40,202,146,194,129, 18,201,171, 22, 58,100,210,140, 98, 49,239,127,124, 15,155,219,
+ 99, 76,206, 39,152, 77, 23,184,241,238, 14,230,211, 21,242, 66,227,228,205, 5, 9,224,178,148,214, 59,173,197,236,114,129,217,
+229, 5,158,125,251, 29,250,195, 33, 62,252,225,103,168, 87, 45, 22,243, 26,171,249, 20,198,106,124,255,143, 63,197,104,220,195,
+120,235, 46,154,101,133, 95,254,237,191,194, 58,135,207,254,221,207,240,228,171,175,209,214, 11,244,118,110, 99,148, 52, 56,188,
+126, 3,229,160, 7,153, 13, 88,131,225,112,112,251, 54,154,170, 66,219,106, 76,207, 47,113,244,236, 25,142,158, 61,129,110, 42,
+164,121, 15, 59, 7, 7, 24,109, 31, 64,230, 3, 44, 23, 13, 86,243, 25,170,249, 28, 48, 43,100,121,134,138,133,106,213,114,137,
+201,197, 37,164, 20, 40,122, 61, 12, 70, 27,228,155,206,114,180,117,131,182,165, 14,196,104,141,122,181, 36,207, 56,143,126,173,
+235,162,134, 11,238,232,227,120,207, 75,120,173, 97, 76, 23,108,208,212, 13,141, 9,189, 71,146,164, 81,241, 29,176,182,101,175,
+100, 59,160, 88,139,138,164,195,180,169, 53,140, 49,168,171,154, 64, 52,188, 43, 20,130,212,234, 66, 10, 20,105, 6,173, 13, 36,
+ 4,178, 44,235, 28, 38,194,115,192, 71, 70,157, 5,103, 13, 40, 41,216, 73,210, 93, 40,130, 47, 5,163, 53, 36, 43,195,157, 23,
+236,221,183, 92, 64,181,124,169,249,184, 55, 15,151,155,128,143,238,149,117,212,117,236,212,217,126, 22,138,151,232,151,103,159,
+116,216,181,122,111,187,110,157,155,154, 48, 5, 64,220,203, 19,140,138,108, 94, 76,195,228,157,170,143,123, 78, 42, 10,180,110,
+ 57,105,205,160, 63,218, 64, 89,246, 34, 82,212, 57, 11, 99, 90,104,163,185, 0,233, 44,187,129, 25, 31, 46,219,104, 87, 18, 88,
+ 27,199, 11,134,166, 40, 56,111,145,167,148, 29,145, 40,193,107, 70,135, 60,235, 44,136, 36,110,166,255, 77,147,132,121,242,146,
+ 59,125,186,140,156, 11,132,197,110, 63, 28,176,175,130,155,185, 14, 46, 21, 68,205, 68, 79,147,188, 94,244,140,245,150, 41,103,
+156, 59, 15,227, 40, 79, 36, 77,211, 46,128, 71, 10,202,179, 23,142, 93, 71,100,127,118, 28,132, 99,140, 1,156, 99,107,181,232,
+178,197, 5,133,128, 37,105, 2,237, 56, 80,199, 91, 88,109,160,164, 71,107,117, 12,124, 33,124, 44, 77,139,117,107, 88, 32,202,
+ 64, 33,129,142,149, 32, 37, 28, 36,132,243,148, 81,207, 14, 33,169, 58, 43,155, 74, 82, 72, 31,104,127, 54,166,141, 58, 31,216,
+239, 22, 16,116,249, 75,120,120, 25,132,107,156,144,105, 52, 43,222, 37, 0,194,130,203, 64, 18,134,224,224, 45, 29,167, 10,244,
+185, 52,111,249,213, 3,142,216,123, 25,227,171,237, 90, 46,187, 15,128,156, 63,123,255,157,159,167,105, 2, 47, 58, 83,187,115,
+158,149,228,164,120,215, 81,216, 37, 40, 1,172,105,153,129,238, 96,157, 71,158, 23, 49,147, 55,136, 54,170,170,238,222,112, 70,
+ 2,194,139, 40, 30,241, 8, 41, 70, 6,151,231,151, 72,210, 2,119,238,222,192,229,217, 37, 85,183,107, 99,106,199, 98, 28,169,
+136, 72, 71,150, 12,226,125, 27, 22,218,232, 86,163,174, 27, 14, 53, 49, 60, 98,235,124,231,138,247,228, 70, 91,190,136, 61,171,
+220, 61,235, 7,232,114,145,188, 91, 15, 85,143,228, 49, 40,188,103,165, 62,162,218, 61,236,236,131,119, 18,126,221,247, 78, 15,
+ 76,208, 28,132,238, 95, 8,129,188,200, 80,148, 57,137,160,210, 20,189,126, 73, 99,215, 34,135, 82, 73, 36, 40, 89,107, 81, 87,
+ 45,150,139, 42, 90, 92, 2, 44,194,240, 88, 51,140,133, 36, 91, 73, 4, 64, 74,103,129,120,225, 59,219,162,109, 53,118, 15, 15,
+145,101, 9,218,166, 69,221,104,212,243, 41,102,211, 26, 31,124,254, 49,132,119,168,171,154,208,136,236, 78,160, 7,131,162, 19,
+ 87,203, 21,188,179,216,220,217, 38,168, 78,111,128,126, 63,195,209,139,151,176, 70,227,236,248, 24,219,251,135,216, 63,220,131,
+183, 45,138,193, 8,222,123, 28, 63,127, 76,182, 54, 31, 60,254,164, 32, 54,142,166, 38,135, 55, 15, 80, 47,230,216,222,223,198,
+155,231, 47,209, 84, 53,222,251,232, 62, 62,254,193,135,152, 92,206,136,231, 62, 26, 96,188,217,199,114,105,104,175,149,102, 56,
+188,117, 5,139,249, 10, 27, 91,125, 28,191,186, 64,146, 9,252,227,127,254,175,104,234, 37, 62,251,147, 63,193,254,181, 67, 60,
+121,248, 20, 89,150,226,249,163, 39,184,121,235, 0, 63,249,203, 31,195, 91,135,243,211, 57,190,251,221,111, 49,155, 76,241,131,
+ 63,255, 83,124,251,197, 3,204,206, 79, 48,216,189,131,225, 32,197, 59,247,175, 49,204, 38, 67,211, 2,182, 93,226,224,157,119,
+ 48, 57,155, 96,126, 49,193,209,179,231,120,253,232, 59,120,239,113,245,206, 61, 92,185,115, 31,253,141,125,172, 42,135,215,207,
+ 95,225,244,245,107,184,102,134, 50, 7, 70, 27,125, 36, 89,138,166,110, 49,187,184,192,217,209,107, 84,203, 5,210, 60,199,230,
+206, 14,134,227, 49, 32, 82, 64, 38, 4,147,105, 52,116, 83, 81, 65,176, 88, 68,186,161,103,228, 39,161,107, 51,244,250, 37, 11,
+143,104, 71,105, 76, 8,137, 48,107,220,232,176,231, 77, 98,234, 86,146, 40,100,121,142,254,112,136,225,104,128,209,120,136, 60,
+207,186, 24, 76,134,164, 88,235,208, 52, 13,163,139, 27,222,253,209,148,201, 88, 27,229, 80,212, 41, 74, 78,124,115,220,221,203,
+110, 10, 22,146,205, 66, 65, 26, 5,164,142, 5,100,156,238,231, 45,210,180, 64,154, 21, 76,213, 18, 48,186,134,179, 13,116, 91,
+117,138,120,102,182, 75,149,196,157,174,181, 38,226, 54, 37,199,187,190,149,103, 45, 4, 18,182,179,165,105,182,214, 0,117, 99,
+110,247, 22, 48,198,199,208, 21,120, 25,137,117,244,250,242,136,127,166, 51,196, 67,201, 36,234,122,180,209,208,186, 69,219, 52,
+112,206,192, 57,131,178,215, 71,127, 48,140,128, 26,103, 29,218,182, 70,181,154,115,113, 34, 35, 6,245, 45,194, 88,232,210, 61,
+ 98,144, 84,248,143,146,114, 77, 64, 7, 74, 90, 76, 18,158,188, 72,238,154, 69,103,235, 11, 97, 37,174, 91,107, 70,205, 3, 43,
+227,133, 16, 49,213, 79, 73,196,233, 39,233, 42,232,146, 83, 44,122, 3, 11,182,140, 54,113, 12,111,173, 99,206,198, 90, 12, 54,
+119,172,193,190, 28,196,104,105,154,196, 21,104, 88, 27, 90,227, 98,132,117, 96,186,171, 68, 69,219,163, 35,172, 38,233,191, 90,
+ 29, 45, 96, 96, 1, 98, 32,126,146,235,163,179, 46,166, 89,194,231,177, 96,202, 28, 5,105,137, 56,213,232,196,147, 97, 39, 79,
+103,106,167, 79, 8,159,113, 68, 11,180,165,241,126,244,205,175, 9,248,194,234, 34, 80, 2,215, 34,175, 61, 3,160,186,162,179,
+ 3,205, 36,172, 37, 9, 5,222, 26,178, 38,138, 92,165, 72, 24,190, 35, 99,242, 81,151,209,206, 58,138,191,250,244,222,207, 67,
+ 46,113,144,243, 91,103, 35,114, 15,162, 27,137, 88,235,208,182,148, 25,109,157,231, 64, 18, 98, 66, 39,172,118, 5,128,182,165,
+234,190,105, 26, 78, 54, 18,209,167, 76, 20, 53, 19, 31,148, 32, 32,171,171, 21,154,198,224,189,143,222,195,124, 50, 99, 62,188,
+140,251, 49,218,245,231,108, 21, 32,138, 93,240,248, 89, 30,125,132,224, 2,218,123,119,227,109,185,198,128,167,145,160, 68,171,
+187,176,135, 32, 12, 12, 34,158, 80,120, 0,158,249,214,134,217,239, 20, 66,226,217, 27,218,212, 45,217,225,140,161, 67,128, 71,
+ 78, 49, 88,129, 71, 63, 73,150,162,236, 23, 72, 57,219, 58, 60, 84, 70, 91,198, 72,130, 15,220, 36,142,168, 0,143,213,178,166,
+177,187,181,204, 67,166,170,175,105, 90, 54,224,128, 31,228, 36,238,151,116,211,114, 92,172,139,175,175, 44, 11, 56,107, 48,187,
+156,162, 63,222,196,214,238, 38,170,197, 2, 70,183, 88,206,166, 56, 59,190,192,246,193, 33,110,222, 57,196,197,233, 5,163, 34,
+ 83,228,236, 54, 8, 48,145,166,170, 80,215, 26,163,241, 8, 73,154,226,240,214, 1, 22,147, 9,166,231,151,240,182,198,100,178,
+196,230,238, 62,174, 92,219,133,119, 30,147,139, 37, 38,199, 47,161,155,138,149,164, 22,214, 1, 66,229, 40,251, 37,138, 34,199,
+246,254, 46,202, 66,162, 63, 28,226,244,213, 43,100,121,142,159,253,245,207,208,182, 6, 79, 30,190, 64,150, 37,216, 61,216,131,
+105, 91, 88, 43, 81,246,115, 0, 10, 82, 2,101,153,227,242,244, 18,109,107,240,244,155,111,241,237,239,191,192,237,247,222,199,
+157, 15,223, 71,219,104, 92,158, 77,112,126,116,130, 44,245,248, 15,255,211, 95,227,226,232, 4,175, 94, 92, 98, 53, 57,193,171,
+ 39, 79,241,233, 31,255, 49, 30,253,254,107,204, 46, 78, 48,218,189,141,209,214, 8,239,188,119,128, 0, 99, 66,210, 67,191, 84,
+216,191,117, 11,207,191,125,142,217,197, 4,203,217, 2,121, 89,162, 28,239,162,109, 29, 94, 63,254, 14,111, 30, 61,192,236,236,
+136, 52, 10, 69,129,157,221, 13,108,108,111, 34,239,245,160,219, 22,151,199,199,184, 60, 61, 66,189, 92, 0, 34,193,112,115, 7,
+ 27,219, 59, 40,251, 61,180,154, 4, 64,214, 81, 38,194,114,122,137,102, 69,163,118,201,194, 47,201, 46,142,178, 63, 32,242,159,
+ 12, 23, 85, 26,237,151,193, 67, 75, 98,182,150,221, 39,154, 71,207, 25,146, 52,193,104, 60,194,104, 99, 3,131,225, 0,253, 97,
+ 63,218, 99, 2,117, 48, 68, 1,207,102, 75,180,173, 70, 83,119, 2,204,112,248, 74,118,151,208,202,206,241,116, 73,173,141, 51,
+213, 91,118,172,144,193, 16, 14, 46,207,123,195, 40,146, 82, 20,220, 67,151,165,130,214, 52,213,169, 86, 11, 88, 83,195,232, 38,
+178,174, 3,218, 54, 60,179,214,146, 29, 44,142, 47, 37,251,169, 5,214, 14, 75, 64,202,148,133,178, 89, 44, 50,194,121, 22, 58,
+ 98,183,134, 87, 37,245,187,125,139,203, 30,132,118,105,146,178, 98, 62,116,191,142, 67, 67,248, 28,224, 66, 69,183, 13,156,163,
+117, 68,175, 55,164,181,159, 74,226,216,189,169, 43,104,221,242,104,223,199, 2,129,205,120, 76,196, 67,140,123,117,145, 1,176,
+ 54,162,231,137,133,146, 9,178,172,224,212,194, 36,122,201, 37, 67,189,104,247, 43,161,117, 27, 71,150,138, 47,235,224,217, 22,
+188,131,151, 2,113,255, 28, 4,194,193, 69, 32,197,250, 72, 57, 96, 83, 37,175, 51, 4,210, 60,143, 83, 5,106,116,194, 94, 94,
+ 70,168, 17,157,193,235,191,191,142,135,223,217,189,214,232,110, 66, 34,225,181, 77,224,237,119,156,119, 2, 38,121, 22, 97, 2,
+ 36,148,203,178,148,166, 2,252,243, 73,142,166, 38,221, 9,133, 24, 17,194, 88, 68,181, 58,216,203,174, 98,247, 46,214,130,116,
+ 34,234, 39, 6,174, 56,214,126, 5, 91, 36, 21, 11, 62, 42,254, 59,193, 99,199, 81,232,120,239,161, 1,166, 51, 58,156,177, 16,
+190,179,182,133,116,190,168,222,239,148,248,240, 93, 32, 82,224, 42, 4,199, 20,224,145,208,129,160,216,159,232,227,152, 73,107,
+ 67,111,132, 20,252,129, 34,191,180,148,114, 13,106, 17,248,198, 46,190, 65,121,158, 65,240, 62,189, 93, 53,104,155, 26, 66,130,
+115,112, 37,140,145,172,234, 37,120, 69,194,236, 96,231, 4,166, 23, 23,248,253,175,151,248,248, 7, 31,226,197,163,199, 56,122,
+117, 2,159, 18,132, 36,236, 87,156,163,142, 82,176, 31, 62, 84,216, 90,211,133,103,195,190, 90, 8, 20, 69,134,214,121,254, 62,
+ 4,123,161, 93,185, 68,150, 37,107,108,117, 21, 45, 20,212,245,155,248, 65, 51,198, 68,107, 90,107, 52,211,182, 26,194,109,166,
+ 60, 38,226,106, 84, 70, 10, 18, 21, 61, 65,252, 35, 4,225, 93,179, 60, 35, 69,121, 47, 71, 83, 53, 88, 46, 42, 30, 5,185, 88,
+ 48, 72, 9, 52, 77, 75,254,237,182,141, 29,191,146, 68,111, 11, 97, 53, 77, 93, 83,120, 1,167,192,209,184,150, 3, 47, 82, 5,
+173, 61, 63,144,146,173, 97,244,187, 58, 63,122,131,172, 28,226,198,221, 59,120,253,228, 49, 39, 21, 89,188,126,242, 8,211,241,
+ 14, 62,253,241, 15,240,251, 95,254,154,226, 53,185, 66, 77, 18,138,133,244, 0,172,174,113,250,230,152, 1, 62, 35,188,255,217,
+247, 80, 45,230,120,253,236, 25, 76, 61,195,147,111, 30, 98, 56,254, 28, 59, 87, 54,112,126,124,142, 79,126,248, 61,252,227,255,
+253,183,212, 1, 58, 11,143, 4,206,232,184,159, 19, 2,216,187,186,135,172,200, 49, 28, 15,240,254,247, 62,196,238,213, 93,252,
+211,127,249, 37,154,166, 1,196, 0, 89,150,224,244,104,130,131, 27, 87, 49,189,152, 67, 72, 2, 28, 37,194,224,205,203, 51, 12,
+199, 37,126,249,247,127,135, 94,127,128,155,247,238,161,105, 28,142, 95,188, 66, 81, 22,104, 86, 51,252,213,255,240, 23,248,234,
+151, 95, 96, 62,175,177,119,176,139,175, 31,124,131,143,254,232,143,240,240,139,175,208,174,102,184,118,247, 3,136,116,128,187,
+247,118,169,200,114, 30, 50, 31, 96,123,123,132,180, 40,113,118,116, 10,149,230,176,190,197,217,241, 37,206, 95, 61,130,109,102,
+113, 79,221, 27,237, 96,180,189, 7,149, 80,241,150,101, 41,166,231,231,152, 95,158, 97, 57,187, 36, 91,147, 21, 24,108,108, 97,
+ 99,123, 7, 73, 94,192, 26,139,166, 49,208,218,193, 57, 13,221,172,208, 86, 43, 22, 67,178,245, 47, 85,200,203,140,159, 79,197,
+249, 82, 93, 7, 98,121, 52,106,184, 19, 8,148,194, 64, 4, 27, 12,169, 59, 84, 73,138,140, 73,133,161,240,180,142,166,108, 82,
+ 73,212,117,131,166,110, 40,203,189,169, 33, 32,248, 89, 87, 8,124, 23,203,187,239, 16,195,170,148,130, 89, 3,200, 4,159, 78,
+ 56,244, 73, 12, 69,207, 56, 77,104,152,197, 13, 27, 19,255,138,178,207,187, 90, 18, 69,105,173,209,182, 45,172,174, 88, 17,206,
+186, 30,107,162, 29, 48, 48,191, 29,143,205, 41,132, 73,178,162, 92,112,114, 24,251,168,249,107, 11,149,240,107, 15,135,122, 18,
+161, 45, 97, 39,171, 34, 96,133,192, 91,218,120, 30,149,130,199,238, 4,177, 10,235, 11,250, 26,157, 38,198, 59,178,179,133, 67,
+ 24,220,225,229, 69, 31, 69,175, 68,202, 54, 49,195,200,235,186, 94,242,101, 67,194, 90, 47,125,196,224,134,137,103,128,225,184,
+ 53,222,119, 92, 35,132, 92,122,120,158,134, 74,214, 18, 73, 4,203,146,181, 38,218,212,130, 10,223, 58, 19,255, 92,152,116,168,
+ 36,141, 25,222,206, 57, 4,205,182,226, 80, 43,193,221, 96, 56,115,165, 96, 95,123,196,222, 58,200, 36,227, 54,212,137, 20, 0,
+ 0, 32, 0, 73, 68, 65, 84,132,179, 48,153, 9, 43, 32, 25,109,196,105,158,116,162,184, 64,145,227,104,101,176,210,221,123,250,
+158, 68,221,244,200, 50,210,132,196, 88, 81, 5, 88, 72, 72,203,193, 46,169,130, 1,119,199, 94,198, 66,210, 26,139,172, 72, 89,
+216,109, 1, 39,161,148,103,109,133, 90,179, 8,242,142, 89, 3, 70,251,152,214,230,121, 85, 40,164, 66,154, 10, 82,215, 71, 24,
+146, 65,154,210, 26, 70, 41, 17,103,223,222,185, 24, 29, 30,120, 11,158, 19,214, 52, 55, 90, 74,137,206,229, 33,101,164,222, 1,
+ 30, 54, 76, 61,224, 99, 83,234,215,162,171, 59,170,157,231,226,166,187,216,195,107,161, 78,253,179,251, 63,119,220,250, 75,165,
+128, 53, 27, 74,164,169, 57, 31, 85,240,214,145, 66, 62, 50,125,165,228,176,150, 28,105,158, 34, 77, 51,174,182, 29,172,209,208,
+218,196,232, 58,197,226, 15,165, 36, 7, 77,128,209,178,158, 15, 41, 11,107, 53,222,188, 56,194, 59,239,223,195,106, 49,163,135,
+220, 6, 86, 59,141,174,210,148,186,234, 0,176, 65,136, 52,140, 70,124,207, 16, 40,201,182, 20, 17,217,216, 93,210, 93,103,101,
+ 17, 12,232, 8,222,206,132, 59,108, 58,144, 12, 7, 26,208,179,162,181,137, 59,241, 36,149,100,107, 99,191,119, 40, 48,140, 89,
+ 31, 79,186, 46,160, 70,116, 21, 92,209, 43,137, 83,156,165,221,206,139,193, 34,186,105,249,112,119,208,198, 64, 8, 31,109,115,
+129, 56,151,176,218, 52, 73,187,239, 45, 98,199, 96,217,142,151, 32,205, 11, 86,210, 19,238,209, 90, 15,221,172,112,113, 58,193,
+193,205,155,200,243, 4,245,138, 48,163,109,189,196, 98, 78,227,120, 88,141,229,108, 1, 33,169, 0,138, 1, 16,158, 70,193, 77,
+181,130,247, 18, 59, 87,246,176,181,187,137,217,229, 57,170,197, 12, 42, 45, 88, 39,144, 35,203, 37,246,174, 29,224,217,215, 15,
+ 99,129,146, 23, 61, 36,105,129,114, 56, 68, 81,228,216,216,222,194,198,230,128,210,226, 36,112,243,189, 91,104,107,131,135, 15,
+158, 33, 77, 19,148,189, 30,198, 27, 61, 76, 39, 21, 54,183,199, 56, 59,153, 32,205, 82,140,199, 57, 30,252,230,107,236, 93,187,
+138, 95,253,221, 63,224,226,244, 8,127,244,151,255, 30, 16,196, 28,104,170, 6,171,217, 5,254,234,127,252,115,124,245,203,223,
+227,233,183, 79,240,238,199, 31,226,249, 55, 95,227,206,135, 31,224,219, 47, 30, 64, 9,135,155,247, 62,128, 21, 61,220,186,181,
+ 73,218,140, 34, 67, 90,150,216,189,186, 7, 33,115,188,120,242, 26,143,190,122,136,175,127,243, 5,142,158, 62, 66, 53, 61,129,
+211, 43,210, 8, 8,137,225,214, 1,246,111,220,134, 76, 83, 12,198, 99,140, 54, 7,152,157,159,226,232,217,183,152, 93,158,195,
+ 56,137,180, 24,226,234,205,155, 24,109,109,195, 11,137,166,110, 88,192,214, 98,122,126,142,213,108, 26,249, 14, 89,145, 33,205,
+ 82,100, 25, 9, 38, 3,221, 13, 60, 38,148,124, 89, 17, 1,204,243,123,157, 32,205, 72,136, 88,246,123, 40,202, 2,101,175,135,
+193,104, 64,132,177, 60,237,116, 36,137, 66, 83,183,252,223, 26,171, 85,133,197,108, 73, 17,186,214,194,104, 13,173, 45,175,130,
+212, 91, 0, 18,240,243, 79, 43,174, 54,118, 59,145,104, 38, 3,125, 75,198,103,147, 62,183, 34,138,195,104,252, 95,160,236, 15,
+160, 84,202,221,182, 70, 93, 87,168,171, 37,116,187,130,179, 6,218,104, 14,126,210, 72,146,140,120,245,174,243, 49,203, 53, 43,
+143,228,115, 42,244, 69, 9, 39, 64,134, 41,163,224,110,177,139,190,244,113,138, 17,166,147,142,139,255,160,253, 96,150,110, 76,
+125, 11,157,155, 82, 20, 85, 27,166,140,134,207, 3,186,120,232, 34, 13,151,104,146, 36,216,216,220,142,161, 39,214, 26,198,251,
+206, 98,209,132,152, 35, 47, 98,199, 28,208,182,235, 64,216, 32,156,147, 82, 34, 77, 50,222,111, 43,162, 16,230, 57,148, 10,221,
+ 41, 23, 28, 60, 82, 15,190,237, 16, 25, 27, 46,111, 17, 38, 31,220,201, 10,129,216, 96, 73,238,146, 3,170, 85,112,148,233,186,
+222, 34, 52, 67,137, 82,113, 90, 24,145,220, 74,197,176,171,160, 75,144, 74,198,207,148, 7, 11,144,215, 44,101, 73,188,236,192,
+ 64,154, 46,192, 37, 32,190,131,203,200, 51,163, 35,136,232, 18, 14,136, 81, 28,227, 27, 40,118, 0,117,249,130, 61,224,244,236,
+168, 14,108,198,211, 34,103, 44, 28,199,119,119, 25, 55,226,173,207, 25,193,176, 4,167, 70,118,239,147,228,105, 71,180,197, 5,
+ 15, 62, 23, 53,225, 57, 16,107,112,156, 88,160,189,229, 32,241, 29, 74,214,117,126,123,210,123, 8,158,164,119, 92, 2, 90,169,
+ 81,215, 46,217, 58, 23,154,114,245,151, 31,191,247,243,144,172, 19,196, 56,142, 67, 8, 8,191,199, 30, 70,134, 75, 68, 38, 45,
+ 13, 59, 98,114, 77, 94,228, 16, 50,137, 17,170, 84,113,235,168,116,165,209, 92,231,181,107, 27, 13,163, 45,199,245,117, 73, 52,
+129, 96,246,250,229, 17, 62,250,252, 19,156,188, 57,226, 29, 49,209,173,130,153, 31,222,198, 12,224, 64,125, 11,222,109,242,226,
+166,145, 54, 21, 73,108, 65, 1,202,190,221, 48,106, 11,200,215,240,161,164, 48, 2,102,112,115,170, 16, 21, 5,238,109,127,174,
+243, 81, 89, 76, 20, 41, 77,217,232,188,102, 48,173,137,241,123, 70,155,136,141, 36, 59,134,129,115,130, 59, 8,137,170,106,217,
+135,142,232,157, 79,178, 4, 9,143, 46, 35,144,197,119, 99,119,126,239, 33, 3,221,142,127, 7, 89,150,240,200, 43,101,191,163,
+140,170,232,182,213, 52,178,242, 14,147,243, 11, 12,183,182,177,181, 61,198, 98, 58,229,223,173,197,233,209, 57,246,111,220,198,
+214,206, 8,147,179, 11, 38, 85,209, 69,227,173,142,175,127, 62,153,160, 24,110, 96,255, 96, 23,253,225, 0, 23,199,199,104,235,
+ 6,253,209, 24,189, 94,129,171,183, 14,113,122,116,137,221,253, 77, 28,191,124,137, 52,205,144,230, 5,178,178,143,178,236, 99,
+ 56, 30,160, 28,244,177,185, 61, 66,209, 43,177,179, 55,194,112,123,140, 63,252,250, 27, 44,230, 53,146, 68, 98,255,112, 15, 74,
+210, 8,121,114, 62,129, 67,138,225, 48,131,105,150,152, 76,106, 56,221,224, 23,127,255,223,112,239,211,239,161, 28,108,162, 63,
+218,192,233,235,215,184,125,247, 58,126,242, 23,159,227,241,131,239,240, 47,255,207, 63,224,179,159,253, 12,245,236, 2,227,221,
+ 61,188,248,238, 49,198, 27,125, 92,123,247, 46,102, 43,129,237, 13,133,141,173, 1,146, 52,161,228,179,172,143,227,151,167,248,
+195,175,126,131,239,190,248, 18,147,179,115,138,194,116, 45,224, 90, 8, 1,140,119,246,112,251,195, 79,177,177,127, 21, 69,175,
+132,146, 10,109,181,196,197,209, 49,166,147, 25, 21,190, 73,142,157,131,107,216,222,191, 2,161, 82,180,154,156, 24,198, 58, 44,
+ 39, 23, 88,205, 39, 16,222, 65, 42, 32,205, 51,148,172,173, 8, 43,162,136,230,148, 29, 35,155, 28, 18, 57, 79,124, 74,244, 6,
+125,244, 6, 67, 66,122, 38,157,229,134,124,182,116,112, 6,161, 91, 85,213,168, 86, 53,150,139, 37,218,150, 62,111,142,253,188,
+ 66, 72,180, 60,233,113, 28, 91, 42,100, 39,152, 10,221,177,110,219,183,192, 31,164,248,237, 86, 70, 73,150, 70,198, 69,228,119,
+115,131, 80,244, 74,148,189,126, 92,189, 57,103,209,182, 13, 86,203, 57,150,179, 41, 44,219, 81, 67,244, 46, 9,133,152,183, 46,
+ 21,137,149,100,200,244,102,235,152,239,186, 88,186,120, 85,156, 72,120,116,207, 87,244, 61,115,128, 76,236,202, 89,252, 27,248,
+223,206, 59, 74,253, 90,227,170, 7,191,179,247,130,249,247,244,191, 65, 44, 72,151,185, 69,221, 52,244,215,134,120,227,101,217,
+ 71, 89,150,200,242, 12,150, 29, 65,213,106,133,138,109,137, 65, 85, 30, 83,216, 56, 35, 35, 73, 82, 30, 99, 73, 30,139,171,248,
+ 26, 67,234, 93, 71,145, 83,200,243, 2, 9,243, 5,194, 94, 56, 52, 15,193,118,103, 35, 3,157,116, 82,235,255,190,231,117,155,
+148,130, 5,128, 29, 7, 36,184,136,194,254,154,233,167,252,254,178,226, 61,114, 77, 4,239,161, 69, 44,138, 60, 11,146, 19,166,
+112, 26, 75,141, 76,128, 22,133,140,145,112,223,208,185,106,163,126, 34,122,212,215,114,198,233,226,103,183, 19,175, 86, 83,214,
+ 76,209,159, 67,167, 11, 34, 91, 87, 20,134, 6,219, 30, 53,153,178, 19,107,242, 62, 59,144,241, 98,248, 25,251,245, 41,163,193,
+133,212, 19, 64,120,182,214,137,104, 39, 77, 88,157, 31,236,126,240, 29,254,188,163, 24,250, 14,159, 27,214, 14, 2,111, 21, 25,
+ 1,158, 20, 98, 94, 41,205, 77,198,105,140, 16,201,218,103,231,237, 61, 61, 0,168,127,255,189,123, 63,199, 26,140, 31,108, 83,
+ 8, 86,136,240, 67,173,135,144, 88,235, 57, 37, 38,196, 29, 10, 56, 47,162,208,139,160, 51, 76, 47, 98,184,125,224,164, 19,176,
+223,197,108,218,136,109,236,214, 87, 52,246,214, 45, 46,206, 38,248,252, 39,159,225,248,245, 17,140, 37,208, 10, 89, 36, 4,218,
+166,129,224, 72, 69,165,100, 4,222,199,196, 37, 17, 34, 34, 13,117,242,198,194,114,156, 97,168,120,194, 1,145, 36, 50,142, 23,
+157,247,240,150,160, 49, 97,213,224,215, 42,229, 16, 74,211, 54,154, 14, 56,126, 88,155,186,161, 67,210, 57,190,208,201, 14, 6,
+143,248,207, 40,235,156,124,190, 77,163,185, 75, 97,241, 88, 78,151,166, 99,161, 4,141, 93, 68,215,161, 51, 66,209,178,205, 66,
+183, 6,101,191,232, 48,142, 28, 82,227, 25,163,153,102, 41,137,239,242,140,198,184, 28,105, 27,198,247,214, 16,249,106, 62,185,
+132,245, 9, 14,111,221,128,110, 27,202,183,118, 6,243,203, 75,164,229, 24,239,125,244, 46, 46,207, 46,224,217,166, 67,156,125,
+ 7,235, 20, 18,233,225,156, 64, 90,148,216,218, 25,163, 55,232,227,236,245, 75,168,180,196, 96, 52,194,104,107,147,247,123, 41,
+102,231,103, 76,126, 74, 33,100,138,188, 71,107,136,225,198, 8,227,205, 17,250,195, 30, 18,229,225,173,199,111,254,249, 43, 8,
+149,161, 63,200,176,119,176, 3,173, 29,246, 15,183,112,126,182,132,181, 14, 7,135, 27,248,250,183,223,224,240,206, 77,124,245,
+203,127, 67,219,180,120,255,179,207, 80, 55, 2,195, 81,142, 44,203,240,241,231,239,224,252,232, 12,255,231,255,252,191,225,253,
+ 31,252, 16, 91, 59, 27, 72,211, 28,167,175, 94, 97,255,234, 46, 6,155,187, 56, 57,173, 80,164, 26,251, 87,119, 80, 14,199, 48,
+ 46,193,217,217, 10,213,228, 18,175, 30, 61,194,201,155, 83,212, 53,197, 96, 38,146, 32, 74,189, 65, 15,215,222,189,143,119, 62,
+249, 30, 54,247,247,208, 31, 14, 80, 47,231,120,254,245, 3,188,121,254, 20,117, 99,145,100, 57,198, 91,219,216, 63,188,138,162,
+ 63,132,245, 2,121, 73, 66, 45,167,107, 84,179, 11,152,182, 33,247, 69,153, 33,205,115,190,204, 21,243,197,179, 40,112, 75,210,
+140, 58,240, 94, 15,253,193, 0,189, 65, 15,227,141, 49,146, 52, 67, 94, 20, 49, 50, 85,107,205,162, 54,214,128, 52, 13,234,170,
+198, 98,190,192, 98,190,192,124, 54, 39, 72, 81,204,225,150, 49, 60,137, 66, 41, 92,100, 62, 52,220,133,147,239,150,159, 47,185,
+246,112,138,181, 98,217,117, 74, 98, 33, 9,100, 19,172, 81,222,131,114, 12, 84, 66, 41,115, 44, 46, 19, 18,168, 43, 42, 46, 86,
+139, 41,234,106,249, 22,225, 44,140,197,169,227,167,174, 59,240,198,131,131,130, 16,206, 6, 82, 38,177,112, 13, 99,101, 33,232,
+ 34,207,152,144,153,132,131, 26, 29,150, 57, 64, 87,130,127, 63, 8,173, 92,164, 92, 82,244, 40,173,223, 28,143,253, 85,236,208,
+ 35,159,157,247,240, 36,112,162, 68,194,209,198, 24,195,209, 8,189,126,159,166, 36,108, 55,213,218, 96,181,154,195,152,150,187,
+116, 25, 87, 26, 88, 11, 60, 10,205,136, 74,210, 24,152, 18, 19,227,184, 32, 10, 62,116, 41,201, 46, 26,172,137,225,207, 6,145,
+ 91, 72,105, 19,204,157,151, 81, 96, 23,194,118, 4,217,251,164,228,125, 50,226, 74, 35,101, 54, 6, 21,117,116,193, 5,134,121,
+152,230,166,108, 11,139, 22, 70,182, 49,135, 88,109,239, 61, 57,160, 2, 60,134,187,246, 0,247, 10, 14, 43, 56,191,198, 95,231,
+207, 29, 59,133, 20,211, 67,193, 0, 24, 21, 73,129,157, 72, 76,112,240, 9,229, 87, 36,107,220,116,178,105,147,245, 90,196, 53,
+169, 15, 43, 82, 41,223,186, 15, 16,217, 3,134, 87, 90, 54, 22, 67,129,244, 38, 85,128,147, 37,107,107, 9,172, 9, 84, 93, 12,
+ 97, 9,194, 83,193, 95,179,203,169,247, 81,247, 68, 77,167,141,240, 25, 31,138,169,184, 14,151,107,137,127, 60,149,224, 6, 60,
+ 60, 55, 65,191,224, 1, 36, 97,143, 76, 23, 51, 85,222,150, 5, 48, 66, 42,120,211, 81,210,188, 1,224,108,180,112,208, 78, 78,
+ 49,238,208,243,168, 61,143, 99,136, 80, 37,183,124,128, 5,118,123,128,219,228,121,138,182,181,252, 11,202,226,139,247, 44, 68,
+168, 87,115, 60,248,221,183,184,255,241,251,120,240,197,195,184, 14,168,235, 22,222, 58,184,186, 69, 89,230, 81,101, 24,114,124,
+243, 60,225, 75,151,128, 26,228, 21, 5,127, 16, 61,146,132,118,248, 33,109, 39,218, 90, 18,234, 18,180, 51,104, 27,141,182, 17,
+156, 78,231,226,197,158, 21, 25, 18,235,121, 52,175, 97,195, 46,138, 71,122,186,109,163,250,215,121,162,206,101, 44,142,131, 79,
+161,148,131,214,154,236, 72, 10, 40, 10,234,176,116, 75, 86,140, 81, 49,132,209, 26,139,249, 2,166,213,113,236,231,215, 18,165,
+ 76, 75,233,106,245,170,134, 74, 9,107,216, 27, 80,114, 87,154, 1, 90, 39,236,149,183,157,110,128,187,166,178,228,176, 25, 67,
+147,140,182,110,177,156,156,225,121, 93, 97,239,240, 16,205,242, 18,211,203, 9,146, 4, 88, 92,158,224,241, 98,137, 15,127,248,
+125,124,243,155,223,162, 94, 46,209,212,164,103, 72, 83,234,132,230,151,231,152,158, 21, 72,147, 93, 92,189,121, 3,203,233, 12,
+143,190,126, 12,113,231, 38, 22,211, 57,180,118,216,216,222,196,251,159,127, 15,255,250,183,127, 31, 47,130, 94,175,196,120,163,
+143, 44, 85,209,167,122,113, 50,229, 93,189, 65,191, 55, 64,209, 43,176,177, 53,192,108, 90,209, 7, 91, 41,228, 9, 96,218, 10,
+ 50, 43, 33, 4,101,186,127,254,211,159,224,226,108,134,235,239,222, 70, 53,155,224,240,250, 14, 38,103,151,248,143,255,235,255,
+129,253,107, 55,241,206, 7,239,193,180, 45,206,207,222,224,224,250, 1,156, 87,184,156, 25,236,239,245, 48,222,222,132,245, 2,
+203, 69,131,186,177,176,245, 2,199,111,142, 81,173, 26,234, 6,157,129, 18, 22,105, 34,177,127,235, 14,250, 91,123,200, 7, 99,
+100,101, 15,186,105,112,244,236, 25,158, 61,124,136,182,174, 33,100,130,225,120, 3,123,135, 7, 40, 7,189,152, 92,166, 26,131,
+106, 49,199, 98,114, 1,163, 27, 40, 37,209, 27,246, 98, 80, 4, 29,132, 2,121, 89,210, 52, 35, 75, 33,147,148, 87, 67, 9, 83,
+170, 2,186,217,163,105, 73,164,105,180, 70, 83,215,104,234, 6, 85, 85, 97,181,172,208, 54, 13,235, 97, 36,143,196, 19, 70,136,
+210,133,209,237, 30, 73, 80, 68, 19, 38, 27, 15, 5,173,117,236,186,105,164, 41,214,242, 26,152,210,230,201,202, 89, 85,134,159,
+ 41, 23,161, 37, 65,253,222, 47,250,145,194, 38, 5,120,221,230, 24, 50,180, 66, 91,175,208,182, 13, 5,139,240,165, 70, 69,183,
+103, 65,156,139,118, 35,201,156,118, 26,115,202, 40, 14,164, 75, 95,177,210, 94,198,104,102, 82,167,103,176,204, 88,232, 60,190,
+ 12,218,114, 93,202,153,144, 18,112,150,162,153,215,186, 24, 41, 84, 76,148, 4,119,226,196, 6, 95,183,199, 10,142,122,165,203,
+101, 52, 30, 97,123,119, 59, 82,210,170, 85,133,166,174,163, 99,160, 90, 45, 81,215, 21,251,239, 17,109, 74, 88, 19, 86, 9, 65,
+156, 3,203, 13, 65,135, 49, 85,241,194, 94, 7,228,164, 89,142,162, 40, 34,165,142,132, 95,221,159,243, 76,203,164,156,136,183,
+131, 83, 66, 81, 34,208,117,247,244,125, 68,164,124,250, 32, 50,230,182, 82, 55, 84,240, 89, 4, 66,160, 65,209, 75,227, 94, 95,
+196,236, 13, 68,123,161,230,192, 47, 99, 44,178, 76,198, 29,176,103,191,187,140, 14, 15,207, 83, 81,221,121,195, 57,204, 42,161,
+192, 4, 10,113,225,215,104, 13, 17, 6,147,132,166, 38, 42,205, 35,138,151,214, 66,136,209,225,142, 83,247,188, 99,151, 23, 73,
+213,161, 50, 82,240,211,180, 94, 1,158, 84,229,164, 98,167,207,175,110,216, 39,175,212, 90,116,111,202,202,127, 74,103,247, 96,
+ 32, 18,211, 89,101,128,204,128,172,120,193,229,224,157,141,214, 60,138,130,181,177,232, 2,243, 71,226,215, 18,146,223, 11, 9,
+ 48,216, 6, 80, 72, 56, 35, 36,120,238,125,200,228,241, 14,176, 64,146,164,105,103, 33,123, 43,252,132, 66,215,141,145, 12,141,
+ 65, 84,136, 74,239,121,199,173,162,133,204, 89,131,213,146,252,184, 25,143,227,225, 45,154,138,144,151,186,109,209, 31,244, 96,
+141,229, 44,111, 10, 82, 0,108,167, 48,101,113,153,136, 33, 2, 22,151,167, 71,216,220,217,193,104, 60, 68,211,180, 40,138,140,
+ 59, 86,139, 44, 73, 99,106,148, 99,133,160, 74, 84,236, 72,228,218,248, 48, 91,131,200,180,141, 65,146,102,113,188,232,156, 67,
+ 94,228,188, 11, 39,202, 87,216,187, 47,231,154,223, 60, 25,247,154, 1,170,161,188,143,182, 50,147,104, 26,239,120, 27, 71,157,
+ 33, 20, 38,120, 38, 61,175, 5, 72,136,168, 1, 77,111,120,238, 67, 68, 34,197,133, 74, 73, 56, 82, 82,201, 54,104,235,102,109,
+245, 1,120,225,209,212, 13,178, 60,131,240, 14,121, 89,196,202,158,128, 25, 13,113,135,185,144, 18, 0,178, 60,141,171, 6,107,
+ 45,178, 34,135, 53, 6,131, 97, 31,214, 88, 44, 23, 21, 38,167, 71, 24,110,237,224,206,253, 29,188,122,242,130,185,255, 19, 60,
+252,178,193,237, 15, 63,198,229,209, 43,188,126,246,130,185,225, 18, 89, 57,128, 51, 26,213,114,133,211,215, 39,104, 55,199,184,
+253,193,125,204,167,115, 28,191, 58, 70, 57, 28, 97, 48, 30,194,122,137,221,107, 55,112,237,246, 13, 76, 39, 43,140, 54,183,176,
+177, 61,130, 82,138,236, 82,134, 24,229,163,173, 49,126,251, 79,191,139,187,175,162,215, 99, 27, 23, 48,155, 17,247, 96,115,187,
+143, 71, 15, 30, 97,103,111, 27,147,211, 83, 92,189,117, 3, 77,109, 48,216,216,194,181,155,187,104, 86, 3, 56, 83,227, 95,254,
+246,159,209,182, 26,127,250,103, 63, 69,154, 38, 88, 92,156, 98,115,103, 19, 85,101,224, 85,142, 59,239,238, 98, 54, 89, 96,181,
+172,113,245,230, 21, 44,230, 45,218,203, 83,232,122,129, 52,241, 56,157, 92,194,182, 21,242, 76, 98,247,224, 0,219, 7, 7,112,
+ 72, 96, 29,137,126, 22,211, 25, 46,142,142,112,246,230, 13,138, 94, 15, 27,219, 91,232, 15,134,216,218,219,133,151,105, 92, 39,
+173,230,115,218,153,155, 22, 89,166,144,164, 5,171,127, 5,185, 11,210, 20,189, 65,159,139,221,140,152,225, 12,159,161,144, 29,
+139,229,178,134, 49, 22, 77, 85,195, 24, 67,169,127,198,193, 90,205, 59, 95, 62, 24,216, 27, 78,147, 24, 7,175,136, 51,175, 84,
+178,214,141, 18,191, 60,144,229, 8, 48, 18,128, 82, 34, 30,178,161,107,141, 93, 42,251,171,233,121, 51,168,170, 38, 78,215,194,
+215,206,139, 2, 66, 40,244,250, 37,255, 60,134,159, 99, 13,221, 54,104, 27, 18,206,134,184, 73,163,117,204,121,160,221,183,136,
+194, 84,178, 76,165,145,136, 22,187, 32,103, 32, 5, 11,196,162,246, 39,229, 91, 86,241, 69,201, 96, 41, 36,209,199, 31, 58,125,
+218,141,170,152, 87,225,152, 38, 22,162,151,201,239, 31,118,182, 10,102, 45,135, 34,201, 72, 12, 71, 94,238,238,172, 12,214,212,
+254,160, 71,218, 16,110, 30,136,223,223,237,111,155,166,130, 82,105, 36,244,117,148, 50,214,247,112,192, 84,244,187,175,229,185,
+ 99,109,205,208,141,197, 57,215, 62, 73, 72, 16,200, 69, 11,237,212, 45,159,175, 20,181,234,124, 23, 93, 26,134,176, 1, 45,154,
+102, 93, 20,109,112, 42,132, 88, 81,143,144,112,166,162,224, 43,232,143,132, 36,123,100,152,218, 4,142, 1,130,191,159, 53, 12,
+150, 49,177,224,120,106,107, 67, 99,229,160, 88,131,225,215,178, 50,194,251, 18, 18,217, 58, 49,164,132,204, 83,180,117,179,246,
+251, 96,182, 61, 91,228,194, 36, 39,176, 18, 72,114, 37, 33,184,206, 17,158,197,108, 0, 84,145,145,163, 40,203, 34,184,198, 69,
+126,136,138, 19, 27,165,100,180, 72, 67, 72,214,130,152,168, 57, 9, 59,243,208,177,135,226, 23, 76,140, 11,246,228, 68, 41, 88,
+ 62, 23, 4,200,147, 79,194, 87, 17, 87, 14, 60,217,231,176,165, 0, 14,226,137,144,103,147, 27,239,209,109,176,150, 70, 37,189,
+132,148, 14, 73,194,185,199,224, 95, 54,249, 46, 85,252,101,102,121,142, 52,203,208, 54,196, 96,119,150,230,215, 52,134, 7, 95,
+164,244, 3, 40, 37,226, 88, 33,100,130, 75,149,192,235,144, 0, 86, 33, 43, 10,134,176,240,155,190, 62,250,224,253, 70,162, 36,
+124, 66, 92,116,107, 29, 94, 60,121,130, 79,126,240, 9,190,125,240,144,199,209,116,184,180,141,166, 46, 63, 37,161, 16, 97, 79,
+243, 40,242,160, 85, 12, 43, 22, 61,199,167, 42,129, 44,167, 46,200,104, 7,149,208, 97,209,182,134,217,209, 44, 82,115,136,212,
+ 32,242,212, 90, 22,197, 72,222,173, 81, 5,152,229, 84,165,102, 69,142,188, 40,162,234, 49,205, 51, 88,163,177,156, 87,104,185,
+ 99,203,243, 20, 43, 94, 35,164,144,144,138, 58,249, 0,191, 8, 35,246,188, 8,113,168, 18,253,193, 0,121, 81,160,169, 43, 52,
+ 85, 77,147, 20, 67, 31,162,128,236, 52,134, 70,181,244,186, 36,202, 94,193,106,202, 54,146,237, 60,127, 16, 72,152,199, 0, 33,
+ 29, 40,124, 41,210, 60,135,213, 6,205,114,138,137, 29,224,230,123,239, 97,118,113,130,102,181,130,243,192,201,203, 23,216, 62,
+ 56,196,222,225, 21, 60,255,246, 41, 85,221,101, 31, 82, 0,171, 85,131, 52,149, 88, 44, 27, 12,198,125,252,224,207,127,134,135,
+191,251, 10,105, 74,193, 30,205,106,133,141,157, 77,124,242,147, 31,226,193,175,190, 68,222, 27,112,150,178,224,152,202, 22,179,
+203, 57, 70, 59, 3, 28,191, 58,129,177, 41,178, 44, 65,127,212,195,235, 23,103,216,218, 25,226,242, 98,137,188, 32, 34,158, 19,
+ 41, 86,243, 41, 38,103,151, 56,188,125, 19, 47,159, 95,224,243, 79, 14, 49, 59, 59,195, 96, 99,136,111,191,126,142, 39,223, 60,
+196,191,251,239,255, 6,163,205, 17, 46,222,188,193,120,115,140, 55,175, 47,161, 93,129, 60,111,241,232,235,103,184,118,251, 0,
+ 87,111, 94, 65, 93, 25,204, 47, 46, 32, 92,131,182, 90,225,228,245, 17,140,174,177,119,120,128,157,131, 3, 8,149,226,252,108,
+134, 36, 77, 48,222, 28,162,215, 75,177,154, 78,224, 76,139,253,195, 43, 68, 42,204,115,148,131, 1, 32,105,245,180,156, 47,176,
+156, 92,192,182, 21,210, 44, 67,185,177,133,178, 44,144,100, 25, 31, 34,136, 22,207,186,106,177, 92,173,176, 90,158, 71, 84,176,
+209,154, 45,161,212,173,212,117, 3, 99, 93, 76, 46,164, 60,121,206,195,118,224, 81,166,135,148, 38,122,214, 67, 81, 75,151,152,
+142,212,170,206, 54, 36, 72, 80,186, 22,118, 65,251, 98,230,114,203,176,127,228,245, 22, 31, 58, 41, 19,236,116,171, 73,107, 81,
+ 12, 80,150, 37,156,167,201, 83, 44, 44,172,103,207,118, 13,107, 53,172,213,113, 55, 25,198,218,221,216,157,138,147, 48,150, 94,
+107,245, 24,188,226,248,226, 74, 58, 53, 48,143,160,195, 8,156,162, 76,201, 30, 42, 65,175, 89, 34,129, 74, 68,180, 95, 97,109,
+175, 25, 52, 52,129,251, 32,101, 71,174,116,222,147,115, 39, 0, 61,120,117,160, 98,182, 60,141,154,243, 34,103,161, 90,224,151,
+ 91,148,189,146,116, 11,220, 92, 56,231,177, 90, 46,153,191,207, 64,153,192,240, 94,203,255, 14,246,184, 78,231,208,237,197,229,
+ 26,120, 7,107,233,106,161, 96,203, 50,181,134,198,117, 17,134, 67,218,154, 12,186,173, 99, 76,167,146,178,163,172,241,138, 52,
+229,177,121, 24,221, 59,211, 21, 30, 1,172,165, 91, 29,179, 1,156, 37,146, 32,161,136, 17,133, 93,173,182,200,242,188,139,121,
+ 53, 62,158,181,130, 11, 16, 10,240,242, 72, 21,253,158,195, 20,192,121,143, 60, 85,112,150,132,135, 33,130,217,219, 54,174,106,
+ 99,250,156, 49, 28,222,101,162,227,130,120,234, 18,206,120, 8, 56, 86,210,119, 14, 6, 90,173, 72,250,103, 82, 2,222,174, 5,
+209,240, 10,196, 91, 8, 72, 88, 39, 32,133,139,221, 62,173,153, 77,196, 0,135,139, 62,124, 78,195,115, 27,147,232,188,130,148,
+ 62,238,216, 3, 86, 88, 8,188,197,247, 87, 82,174,165,230,137,104, 9,244,111,193,147,216, 22,168, 40, 29, 53, 56, 45,131,251,
+193,175, 81,231,148, 74,144, 56, 38,192, 9,176,220,158,113,124, 20,210, 98,226,190, 77,169,132, 71, 80,129, 8, 69,244, 29,120,
+ 17,121,190, 33,254, 45,120,239, 22,154, 42,112,195, 59, 54, 82,172,115, 32, 75,162,224,180,231,206, 90,163,169, 53, 84, 42, 25,
+176,210,137, 13, 72,225,219, 98, 54, 93, 97,103,119, 11,179,201,140, 39, 11,157,112,143, 58,202, 0,136, 48,200,178,156,247, 11,
+172, 4, 79, 19, 88,227, 88,236, 99,225, 28,125,184,179, 34,133,209, 54, 10,129,140, 49, 28,218, 66, 80,126,239, 29, 67,110,104,
+ 44,233, 61, 96, 53,121,118,235,170,226,174,191,142, 94, 95,239, 8, 44, 67,169,107, 36,238,217,222, 43,209, 54, 58, 38, 36, 25,
+ 75,254,126, 99, 91, 0,130, 39, 4,196,134,150,140,185, 93, 45,150,200,242, 12,121,145, 17,117, 45, 85, 72,179, 2,121, 94, 64,
+183, 13,234, 21,141, 89,133,148,104,235, 22,173,104,121,111,101,227, 97, 35,149, 68,154, 23, 48,203, 21,179, 3, 90, 56,107,104,
+ 61, 81,116, 0, 14,193,158, 76, 56,135, 52, 79, 33,141,131, 20, 45,206,143,143,176,177,187,143,141,109,139,203,179, 75, 56,231,
+ 49, 61, 59, 69, 59,220,192,187, 31,127,128, 55, 79,159,195, 24, 67,248,214, 84,161, 28,244, 81,207,231,168, 42,139,254,160,192,
+221,143,223,199, 98, 78, 57,238, 69,191,135,163,103,175,112,227,238, 77,108,238,190,134,214,142, 47, 53,131, 86,107, 84, 75, 10,
+191, 25,244, 19, 76, 39,115, 20,195, 45, 72, 37,145,101, 10, 23,167,115,140, 54,122,204,246,151, 56,126,122,140, 52,207,224,189,
+193,120,123, 19,175, 95, 94,226,214,123, 55,241,230,201, 19,108, 95,217,197,252, 98,130, 95,252,221, 63,226, 71,127,254,167,184,
+117,247, 22,230, 23,167, 72,210, 4, 23, 23, 53, 22,149, 66,181, 56,199,104,220,195,181,219, 87,113,120,115, 31,198,120,156,190,
+124, 13,216, 10,139,233, 20,231,167, 19, 12,183,182,113,247,250,199, 16, 82, 97, 49,175, 97,150, 21,178, 60,193,112,212,199,238,
+254, 6, 46,143, 79,176, 90, 44,176,185,179,133, 36,203,128, 96, 9,229, 64, 34,219, 54,232, 21, 9, 54,110, 94,141, 74,224,166,
+105,161,181,197,124, 81,161,174,102,168,150, 21,103,110,147, 86, 33,192, 52,168,195,167,203, 94, 37, 9,154,186,165,221, 43,103,
+159,219,224, 85,214, 52,134,164,194, 90, 5, 36, 70,180,161, 5,109,135, 84,138,120,240, 12, 14, 9, 26, 18, 99, 44,138,178, 32,
+224, 7,239,229,169, 80,102,255,185, 34, 61, 71, 86,230, 81,253, 75,107,151, 20,206, 26,244, 6,125,128,133, 99,193, 58, 20,242,
+ 22,156, 53,168, 86, 43,178,237,213, 77, 20,200,134,142, 23,222,161,109, 26, 38,104,201,248,186, 67,179, 32, 21,189, 38,163,117,
+ 12, 84, 2,186, 84,172, 0, 13,161,195,152,187, 39, 14, 12,161,144,154,206,126,166,216, 74, 70,122,152,110, 39,239,177,150,120,
+198,251,218, 96, 77,179,140, 99, 14,132, 47, 26,155, 34,166,151,245,250, 61,214, 8, 40,206, 51,112, 76,205,108,145,166, 25,166,
+151, 51,172,150, 43, 98,114, 4,136, 84, 93,189,149,163,225,157, 3, 36, 40, 9, 50, 81,156, 88,198, 28,114, 15,186,156, 24,170,
+163,184, 43, 91,199,136, 66,120, 62, 75, 85,244,178, 7,187, 91,232,168,215,113,166,148,110, 40, 98,142,184,227,240,143, 32,116,
+ 12, 90, 29, 37,137,211,193,115,100,238,230, 5,180, 53,220,200, 72, 78,225,203,216,162, 40,226,110,220, 57, 27,221, 56,158,221,
+ 74, 41,175,215,130,235,192,177,151,155,238, 63,186, 76, 77, 75,103, 97, 81,228,244,179,120,139,162,204,136,131, 98, 44, 23, 83,
+ 65, 72,230,227,179, 70,190,249, 52, 54, 82, 73,146,194, 90,205,147,138, 46,205, 14,222,194, 5,113, 89,152, 6, 72, 1,153,100,
+ 16,214,172,133,226,144, 70, 72, 40, 5, 8,187, 38,100, 22,252,217,180,220,140, 0,222,201, 40,214, 4,115, 0,156, 12, 43, 43,
+ 5, 33, 44,132, 80,104,181,137,252,123, 99,108,244,196,147,246,201,112, 17, 69,177,197,225,247, 73,207,175,136, 57,247,222, 3,
+206, 4,248, 12, 89, 17,130,115,128,116, 6, 4,164, 33, 71,140,163,148, 54,149, 8,154,213, 39,221,232, 13, 97,231,230, 61,164,
+ 15, 42,111, 17,247, 71,222,123, 8,235,129, 64,161, 10,249,220,206, 34,168,233,179, 44,133, 51,170,163, 37,113,122,142,135,236,
+198, 43,236, 45,180,206, 66, 88, 48, 27,221, 71, 27, 76,194, 30,242,231,143,159,227,238,251,239, 96,122, 57,101, 15,166,141, 95,
+ 67,200, 20, 42,138, 51,168,235,166, 49,132, 66,198, 97, 46, 89,158, 98,181, 88,161, 63,236,147,152,135, 71,119, 97,164, 13,239,
+217, 62,195, 0,138,150,162,251, 66,190,185,148, 2, 22, 20,145,218,182,148,150, 70,149, 61,117, 69,205,146,108, 97,117,181,138,
+ 62,214,160, 66,238, 15,122, 16, 42, 65,206,226, 53,207,227,149,106,213,196,162,164,109, 53,148, 2,234, 21,193, 55, 22, 51,138,
+183,205,242, 12,240,217, 91, 28,128,254, 40, 69,214, 50,152,134, 1,253,206,104, 24,103, 33,144,211,123, 40, 4,188,162,241,152,
+247, 22,153, 32, 31, 38,249,252,155, 40, 80, 76, 51, 5,109, 57, 39,216, 9,180,173, 65, 46,232,161, 59,125,253,134,163, 65,119,
+112,246,230, 13,132,243,168,231,231, 56,106, 43, 92,185,121, 19,211,179, 35,204,231,148, 24, 87,175, 42, 36, 89,138,233,217, 9,
+202,222, 53,244, 7, 5,198, 89, 14,163, 61,132,202, 32, 96, 49,157, 44,112,243,254, 93, 60,248,245, 31,144, 42,131, 52, 81, 88,
+204, 87, 24,173,106, 24,221,226, 69, 75,221, 77, 82, 90,228,101, 1,239, 29, 54,182, 70, 12, 57,242,104, 86, 11,228,253, 18,199,
+207, 95,226,221,143,222,195,249,233, 20, 91,123,219, 24,143, 82,124,247,124,142, 27,119,111,225, 63,253, 47,255, 59,190,255, 39,
+127,132,207,126,250, 3,232,213, 28, 16, 9, 12, 36,142, 79, 39,184, 56, 57,193,253, 15,111,225,224,112, 7,227,173, 17, 86,243,
+ 21,102,151, 51,152,118, 73,100,192,164,192,157, 15,238, 99, 99,123, 12,163, 45, 46, 47,230, 48,198, 34, 77, 5,182,118,182,176,
+189,183,129,233,249, 5,178,162,192,245,119,182,162,162, 58,205,211,255,143,171,247, 90,146, 44, 75,179,243,214,150,231, 28,151,
+ 33, 82, 87, 86,101,169,238,153, 22,104, 12, 6, 52, 26,134,164, 25, 73,227, 21,223,135, 79,192, 55,162, 25, 13,102,184, 0,134,
+128, 17, 36, 48,152, 65,115, 68,203,170,169,233, 18, 41, 34, 67,135,187, 31,177, 37, 47,254,127,239,227,217, 87,101, 93,157,149,
+ 17,238,126,124,239, 95,172,245, 45, 72, 1,184,113, 68,140, 45,140,109,208,247, 35,118,251, 1,135,221, 30,253,126,143,105, 28,
+225,167,129,199,114,137, 39, 44, 97,190, 48,145, 41,225,144,215, 35,212, 93, 57, 62,236, 21,146, 32, 50,150,138,153, 9,143, 12,
+ 35,161, 13,220,108,133, 82, 10,146, 49,206,154, 47,191,130,239,164, 3, 85, 48,157, 78,207, 4,174,148,209,117, 13,198, 97,224,
+191,131, 70,154,182,105,224, 61, 29,212, 77,219, 97,177,108,121, 2, 0,134,219, 68, 40,190,152,202,101,120,240,129,105, 91, 84,
+224,212, 16, 18, 46, 0, 98, 8, 53,138,152, 70,243,185,170,131, 73,156, 70,152,224,162, 5, 17, 0,148,225,248,229,234, 80,153,
+199,229, 69, 41,126,108, 65,154, 87,136,242,104, 13, 71, 23, 90, 96,134, 70, 8,137,247,225,243, 25,144,145,224, 60, 51,197, 3,
+ 31,198, 60,153,107,154, 6,221, 98, 69, 52,190,213,154,119,200,168,220,120,239, 29,250,195, 1,198, 6, 6,245, 68,182,238, 2,
+253,161,167,166,160, 80,235,152, 14, 87,214, 25,180,126, 48,236,112,225,125,108,136, 48,198,242,132,101,102,126, 23,254, 55,157,
+175,150,242,235,149, 98,139,155,172,160,156,146, 32, 38,165,160, 70,132,119,213, 69,253, 78, 59, 93,226,164,199, 20, 89, 11, 65,
+235, 13, 90, 85,204,148,204, 98,165,205, 5,159, 42, 52,133,201,104,214, 0, 40, 10, 27,209, 90,145,186, 93, 11,126, 93,156,162,
+ 25, 35, 36, 68,101,255, 39,240, 5, 28, 34,218,206, 16, 83, 67, 42, 72,173,234,148,151, 56, 13,116,113, 42,118, 26, 72, 41,160,
+ 68,177,223,209,232, 92,208,104,134, 68,194, 69, 64, 89,187,105,162, 97,230, 72,122, 49,205, 5,169, 96, 72,145,214, 2, 62,203,
+138,222, 77, 33, 67,105, 75, 58,143, 84,200,161,186, 78,107,138,112,178, 52,104, 41, 81, 39,174,164, 68,150, 26, 50, 39, 58,139,
+ 83,166, 16,158,148,106, 67, 89,115, 63,114,162,133, 70,138,208,122,158,154, 86,234, 99, 76,200,130, 24, 21, 41, 1, 9,128, 98,
+ 65, 92,206, 71,216, 96, 33,230,245, 66,113,164,241,138, 74,131,171,239,242, 38, 80,116, 96,248, 32, 23,183, 8,174,138,237,128,
+118,250,164, 10, 87, 66, 64,113,252,104, 76,164,226,115,211, 4, 99, 69,245,241, 89,107, 48,241, 94,120,232, 71, 44, 86, 93, 5,
+253, 39, 49,251, 94,179,226, 67,136, 71,226,130,191,184, 49,122, 64,140,216,239, 39, 88,107,248,226,156,147,157,192,185,208,222,
+ 5,246, 84,199,202,142,143,145,138,141,178,119,161,177, 9, 21, 38,110,242,213, 62, 64, 44, 94, 1, 63,121, 74,155,211, 18,158,
+ 39, 9, 37, 56, 70,243, 84,129,198,147,116,225, 19, 27, 89,114,215,238,171, 87,125, 26, 70,126,160, 51,198,190, 71,211,117,112,
+166, 40,157, 45,140,149,104,186,134, 33, 29,116, 8, 78, 28,125, 74, 59, 83, 78, 45,243,212,177,173, 54, 43, 44,150, 29,130, 44,
+137,116, 13, 78, 31,119,240,147,195,216,247,232, 15,125, 77, 63, 34,174,125, 32, 27, 73,221,233, 1,214, 90, 24, 99, 48,244, 67,
+ 85, 53,187,201, 85,186, 81,241,237, 78, 83,100,112, 71,134,235,239,113, 57,246, 56,127,250, 28,211,225, 30,253,238, 1, 72, 17,
+223,126,221,227,163,207, 94,193, 52,123,236,247, 35,194, 52,160, 93,172, 49, 13, 87,248,254,155, 31,240,242,179, 23,120,250,226,
+ 28,206, 69,220, 92,247, 88,158,108,241,246, 15,223,227,229, 23,159, 98,181, 89,227,230,102, 15,239, 52,250,221,136,221,253, 30,
+ 90, 43, 28, 48, 32,103,144, 26,126,213,225,176, 27,240,248,217, 25,222,190,190, 69,219, 53, 8, 83,198,176, 63, 64, 91, 13,101,
+ 45, 32, 45, 94,126,186,197,215,127,251, 43,252,233,159,255, 20,127,243,127,253,191,248,111,255,167,191,192, 39, 63,254, 18,211,
+ 97,143,119,111,238,113,191,243,120,253,135, 31,160,224,241, 63,252,207,127, 6,129,132,110,217, 98,247, 48,224,254,118, 15,153,
+ 39,172, 54, 27,216,182,173, 99,241,235,247,183,216, 63, 80,167,181,217,116,248,228,243, 23,117, 42,243,232,249, 83,116,203, 14,
+227,232,209, 31, 70,184,209,225,230,242, 30,187,251, 7,244,251, 3,134,253, 0,239, 60,166,113, 64, 78, 30,195,225, 1, 57, 6,
+158, 56, 77, 53, 2,181,140,162,132, 44,156, 1,154, 52, 57,239, 97, 12,169,133, 41, 56, 36,215,231,149,116, 29,244, 28, 78,227,
+ 4,109,169, 96,211,204,224, 78, 41,161,177, 22, 67, 63,144,253, 48,151,238,151, 44,129,213, 34,199,150, 74,173,116,141, 35,142,
+ 33, 30,197,118,210, 74,171,109, 91, 52,109,139,197,178, 67,219,181,213,238, 38, 4, 71, 10,167,128,187,251,253, 17, 38,116, 78,
+100,243,204, 74, 40,177,160, 33,149,174, 55,179, 8, 44, 51,141,107, 22,129, 42,221,212,215,130, 42,180, 69, 77,151,211, 60, 34,
+166, 34,136, 41,117,188, 94,192, 31, 89,184, 50,139,120,149, 54, 85, 8, 92,132,139,117,119, 91, 44, 65, 49, 32,242,196, 36,114,
+ 32,139, 98, 93,135, 84,196,222, 88,173,215,244,189, 53,182, 38,210,165, 24,145, 66,198, 52, 77,184,191,187,163, 85,101, 37,161,
+ 25,140,195, 72, 65, 67,253,129, 35, 63, 69, 37,143,165, 28,171,152,184,124, 30, 37,243,162,140,112,201, 14, 76,141, 82,133,222,
+240,186, 32,241,228,164,240,241, 82, 34, 71,145,146,146, 24,250,154, 50, 23,104, 31, 78,136, 85,142,193,129, 64,164, 66, 49, 49,
+172,138,159, 47,210, 33,208, 77, 82,206, 61,173, 52,119,248,244,204,106,166, 19,166, 44,184, 35, 38, 11, 96,113, 97, 28,179, 67,
+138, 82, 30,252,243,149, 52,252,249,104, 30, 27, 39, 76, 35, 21, 17,218, 40, 70,115,163,114, 3,102,192, 24,145, 67,193,197, 14,
+137, 4, 75,193,146, 56,243, 61, 34, 75, 32, 50,255,132,138, 86, 82,179,155,198,206,186, 4,105,233, 48,228, 98, 84, 32, 33,167,
+130,234,157,121, 32, 66, 17, 11,210, 92,209, 0, 0, 32, 0, 73, 68, 65, 84, 40,168,116,197,200,169,126, 70, 74,155, 58, 97,211,
+182,129,159,166,163, 2, 17, 31, 62, 99, 60,185,150, 66, 66,104,126,118,153, 49,193,162,129, 35,148,179, 68,202, 17,170, 0, 98,
+ 69,230,201,120,170,218,132, 98, 47,167,207,111,246,204,211, 84,157,238, 84,109, 45,161, 38, 67, 8, 60,134, 5,231,206,134,163,
+202, 64,242,200,196,179, 73,128,130, 3,188, 39,235, 73,102,192, 68, 78, 9,210,170, 15, 10, 1,173, 53,188,208, 80,138,108, 54,
+ 25, 2, 67, 47,224,117, 64,203,163,189,196, 22, 14, 34,162,137,202, 56,255,160,160, 16, 25,187,251, 61,150,139,134, 47,161,128,
+ 16, 19,220,228, 96,173,229, 47, 74,169,146,168, 26, 78,137,126, 79,169, 36, 2,199, 59,122,231, 57, 22, 54, 31,101,169,139, 26,
+202, 98, 44, 21, 9,129,115,149,181,150, 92,105,129,129, 54,165, 58,231, 56,188, 80,166, 24,185,174, 30,202,174, 91, 73, 81, 83,
+239, 98,136, 80, 42, 98,228,148,171,195,174,135, 54,148,149, 94, 94, 95,129,141,108, 78,183,240,147,163, 64,149,126, 64,191,239,
+113,127,123,139,135,219, 59,172,182, 43, 40,109,176, 88, 46,234,231,178, 88,175,177, 92,175, 48, 49,154,119,154, 8, 7,217, 68,
+139,204, 65, 27,198,218, 58,166, 90,174, 55, 8,193, 49,221, 74,214, 81,184,109, 26, 76, 35, 59, 5, 4,117, 78, 57, 38,196,112,
+192,119,247, 55,216, 62,126,142,229,201, 41,174,222,188,134,214, 10,255,244,235,223,224,228,201, 11,172, 54, 27, 12,123,192,141,
+ 14, 39,143, 30,225,187,175,254, 17,111,190,211,144, 34,227,197,167, 31,225,250,106, 15,219, 44,176,187,189,197,111,126, 57, 96,
+123,186,193,238,110,135,110,189,198,106,187,196,254,126,143,237,217, 26, 55,151,183,208, 90,225,197, 39,207,160, 20,192,250, 77,
+ 0, 2,251,135, 30, 93,103,240,237,111,191,194,207,255,213,191, 68,127, 8, 88,111, 23,112,253, 1,219, 71,231,184,121,119,129,
+ 63,251,239,254, 28,186, 93,227,221,155,107, 92, 95,238,240,240, 48,225,225,230, 26,175, 62,123,140, 23, 31, 63,197,197, 15,239,
+240,248,163, 39,184,185, 62,160,237, 26,156,157,117,216,156, 62,165,177,109,204,184,190,184,198,229,197, 29,114, 22, 88,174, 23,
+ 88,173, 58,124,241,211, 79,177, 92, 47,113,115,121, 11,239, 19,190,255,246, 2,183, 87,119,216,221,221,243,151, 57, 96,234, 7,
+238, 78, 9, 98,145, 64,150,203,232, 7,120, 55,206, 94,100, 41,107,215, 88,114, 9, 50,128,166, 93, 48, 62, 57, 33,231,192,145,
+197,182,142,207,137, 52, 72,226,155, 12, 1, 31, 18,101,151,139,162,204, 38, 42,100, 1,107, 40,163,107, 87, 72,194, 84,205,227,
+ 73, 13, 31, 34,218,150,132,122,162, 82, 26, 21,180, 46,105, 84, 29,132, 36,177,155,146,170,138, 90, 37,239,254,156,115, 24, 14,
+ 7,196, 64, 98, 80,228, 8,165,200, 91, 79,221, 92,226,238,133,214, 89, 5, 0,165,181,134,115, 99,181, 96,249, 92, 34, 36,105,
+109, 37,143, 18,173,128,121, 63, 92, 19,197, 56, 57, 82, 74, 73,140,108,100,142,247,172, 58,246,185,227,230,192,147,152, 18,192,
+ 63,187,172, 52,170,247,158, 47,198,156,104, 98, 34,133,128, 79, 9, 74, 25, 72,101,171, 47,222, 48,114, 84,107, 11,165, 12, 63,
+ 43,116, 54, 4, 63,193, 57,138,163,165, 48,168,150,132,188,156, 19,225,125, 96, 82,223,200,187,111,218,187,166,163,216,211,154,
+170, 8, 90,189,137, 36,185,243, 47, 69, 81, 98, 87, 15,135,206,240, 57,163, 53,185, 94,170,128,140,197,106, 37, 99, 27, 72, 85,
+232,150, 99,168,224,153, 44, 50,148, 50, 16,130,173, 84,145,156, 52, 57,122,218, 55,179, 32, 50,184, 80, 89, 2, 50, 39,100, 97,
+170, 53, 45,231, 50, 14, 39,245,119,228, 11,204, 52,244, 76,210,234,136,220, 97,193, 83,129, 8,134,239,216,198,242,103,153,234,
+ 68, 88, 84, 93, 86,174,122,141, 66, 83,203, 41, 67, 25, 5, 1,134, 14,153,130, 41,201,176,141,133,131,175, 64,150, 26,199,155,
+ 18,197,129,131,117, 24, 92, 36, 70, 70, 33, 43,163,144, 56,232,133, 86,198, 9,137, 39, 70,199,208,164, 82, 72, 21,192, 16,253,
+222,168,105,137, 82, 42, 4,231,232,189,151,100,195, 46, 80,153, 20, 8,186,230,189,175, 74,248,153,149, 34,234, 58,123, 14, 11,
+162,201,138, 49,134,248, 47, 49, 66, 49,251,159, 88, 10,153, 39, 33,137,155, 93,207, 80, 52, 1,165,242, 7, 22, 77,237,216, 74,
+165, 89,174,111,172,161,180, 31, 99,216,155, 78, 74, 64,239, 2,135, 22,160,254,114, 52,174,214,140, 89,101,108, 99, 54,213,163,
+170,141,194, 48, 36,216,198, 34,165, 0,197,196,170, 20, 35, 4,203,242, 37,239, 26,180, 38,225,219, 52, 57, 6, 33, 72, 14, 80,
+201,117,108,239,198, 30,167,167,231, 53,240,126, 14,150, 79,117,140, 81, 70,229,227, 48,161,233, 26,116, 11,226,197,155, 70,195,
+ 79, 84, 81,250, 41, 64, 45,216,223,202,123, 11, 74,161, 42,169, 77, 51, 24, 97,134, 36,228, 15,176,173, 82,203,218,117, 37,126,
+ 8, 83,244, 8, 62, 85,255, 33,253, 46,138,119,117, 84,113, 66, 0,211,224, 56,103,222, 99,232, 73,165,233, 28,145,227,172, 49,
+188, 87,164, 11,123,181,217, 98,181,217,176, 45,131,184,209,253,161,135,159, 28,129, 39,186, 6,198, 88,180,203, 14,221,122,133,
+197,122, 5,129,132,135,187, 29, 0,192, 79, 19,220,228, 56,253,140,132, 45,125, 63, 17, 61, 73,208, 62,116,236, 71, 76, 99, 64,
+240,229,119, 6,144, 3,220, 56, 85,177,135, 64,198,237,219,239,112,111, 23,120,254,201, 43,220,188,249, 30, 41, 12,184,252,254,
+ 27,220, 47,206,240,252,213, 11, 12,247,215, 24,199,132,213,102,133,239,126,247, 43, 56,247,167,232,247, 3,158,127,250, 18, 63,
+124,123,133,229,102,139,203, 55,239,176,220,110,177, 88, 46,106, 40, 71,100,142, 0, 50,251,124,207,182, 24, 15,123,156, 61,218,
+226,230,114,135,229,170,197,254,254,128,171,215,111,160,173,129,233, 22,232, 15, 19, 94,125,118,142,175,254,238,247,120,252,226,
+ 41,214,219, 53,238,119, 1,253,253, 1,111,191,191,192, 56,102,216, 70,225, 95,254,197,207, 48,246, 61,222,189,126,143, 71,207,
+159,226,176,119,208, 90,226,228,164, 97,170,159,192,197,235,247,120,184,221, 35,102,137,205,217, 41, 22,203, 22,235,245, 2,143,
+158,159,227,176, 59,224,219, 95,254, 14,247,183, 15,216,221, 61,224,246,253,123,236,239,110,233,128,230,232, 81,201,112, 15, 90,
+201,104,100,112,158,122,182, 80, 12, 74,145,162, 8,101,216,154, 34,230,110,145, 10,106, 5, 68,202,123, 46, 16, 35,197,188,117,
+109, 40, 36,163,116, 71, 74,167,154,137, 94, 38,106,249,232,153, 1, 91,200, 74, 33, 90,104, 84,164, 90, 38,221, 76,140, 9,157,
+ 49,104,154, 6,107,107, 42,179,186, 8,216,220,228,144, 83,198, 52,141,149, 80,152, 18, 77,225,202, 40,209, 90,141,105,138, 85,
+ 1, 76, 69, 1,191, 30,246, 28, 11, 8,208, 93, 70,239,141,177,162,142,153,173, 53,224,218,189, 42,210,101,205, 72, 23, 71,145,
+153,220,189,234,178,175, 21,208,138, 58,177, 34, 40,203,220,249, 10,222,205,231, 35,232, 7,241,235, 19,119,159, 37, 88, 72,214,
+179, 76, 27,203, 66, 59, 0, 66,207, 94,119, 89,224, 47, 69, 68,150, 17,188,171,104, 79,199, 54,189,146, 65,223, 52,246, 8,231,
+ 74,231,200,225,112,168, 12,111,121,196,188, 7,168,161,192, 81,252,169,136, 51,130,183,232, 16,102,107,161, 98,133, 54,152,250,
+105,171,119,158, 34, 67,233,156, 52,214, 84, 33, 34,216, 94,149, 18,143,169, 69,174,169,102, 36, 58, 20,144, 66, 85,161, 52,162,
+231, 78,182,132,180,144,216,139,248,254, 52, 49, 40,246,184,156, 34, 79, 16, 20,180,149, 60,254, 78, 16,138,108,209,200,128,182,
+ 10,193,211,153, 47,165,132, 50, 22,193,121,100, 4, 72,173, 88, 65, 63,175, 66,105,218, 26, 25,191,157, 16,249,252, 87, 42,215,
+ 46, 93,107,158, 68, 40,197,141, 26,224,125, 68, 46, 0, 50,246,236,135, 16,121,202, 32,235,164,166, 12,116, 18, 23,193, 53,237,
+ 46,230,202,189,143,172,163, 40,147,232, 66,232, 11,172, 97, 41, 43,158, 24,242, 81, 6, 65,172,108,129,148, 2, 39,197, 50, 75,
+ 5,224, 21,158,134,247,145,237,123,243,119,151,220, 10,166, 18,233, 50,138, 11,193, 80, 1, 17, 73, 59,144, 69, 98, 91,158,172,
+ 19, 85,169,115, 45,154,115, 74,140,182, 13,208,197,158, 85, 60,222,206, 49,249, 76,113,104,201, 52, 33,248, 63, 34,146,165, 34,
+ 32, 83, 20, 15, 90, 63,116, 64,107, 38,159,177, 48,129,186, 96,170,114,232, 75, 28, 17,130,135,156, 36,251, 41,231, 36,180, 25,
+230, 64, 15, 76,230,160, 3,197, 23,168,119, 35, 98,146, 21, 60, 81, 0,246,137, 1, 24,222,147,213,166,120, 28, 41, 14,214, 64,
+ 52,134, 69, 43, 17, 50, 68, 34,173, 69, 18, 18, 25,203,161,244, 85,185, 31,107, 97, 80,184,213,130, 89,245, 36,196,137, 71, 41,
+110,168,144,142,161, 31,129, 76, 21, 84,138, 12,144,129,128,144,134, 49,180,220,157,241,106, 97, 28, 28,165,177,197, 4,200,132,
+ 24,136,212,229,198,137,132,127,252,165, 44, 35,186,197,106,193, 74,123,139,211, 71,139,186,207, 87,146, 82,217,250, 7, 18, 29,
+153,134,210,222, 54,167,167, 16, 34,195, 79, 35,134, 67,143, 20, 61, 70,231, 42,220, 33, 5,178, 37,122, 71,220,230,205, 73, 11,
+207, 93, 88,191, 31, 32, 16,121,204, 51, 63,220,180,143,186,199,254,238, 22,143, 95,190,130, 10, 7, 92, 95, 92, 32, 76, 19,190,
+233, 7,124,242,229, 39,120,184,122,143,118,185,133,209,223,227,135,175,191, 66,206, 95,242, 14, 75,225,244,233, 99,220, 94,221,
+225,230,226, 10,219,243, 83,244,135,177,226, 49, 11,199,251, 71,255,236,199,152, 70, 71,201, 74,138,130, 78,250,155,123, 52,173,
+193, 87,127,255, 91,252,248, 95,252, 2,247,119, 61, 62,250,120,139,225,208,227,147, 31,127, 6,109, 44,174,175, 15, 80, 2,248,
+238,171, 63, 32,201, 22, 79,158,111,113,254,228, 4, 15, 55,183,212,117, 51, 55,255,229,167, 79,177, 61, 89,224,250,253, 45,118,
+119,123, 42,234,164,129,180, 11, 60, 92,221,225,250,226, 26, 79,158,159, 98,185,252, 8,215, 23, 87,120,253,135,215,184,187,188,
+197,221,205, 45,134, 67, 79, 36, 66, 86,174,131,199, 95,137,225, 17, 21,123,156, 5,132, 50, 80, 85,201, 74,207,162,150, 26, 41,
+199, 35, 31,172, 34,215, 1,219,171, 20, 43,131, 75, 84,104,211,118, 71,208, 21,193, 98, 36,218,243,133,224,106, 94, 58, 93, 14,
+169, 6,209,144,203,129, 39, 51, 41, 87,107, 81, 25,161,119,139, 14, 90,179, 99,163,177, 85,121,238, 38,178, 80, 14,253, 1,253,
+190,231,221,190,130,181, 22, 94, 42, 58,184,185,144,214, 86,177,230, 69,215, 52,169, 24,249,162, 46, 69, 0,243,185,173,108,216,
+ 18,102, 48, 13, 3,239, 25,105,231, 90,220, 55, 37, 1,173,168,156,107,152, 13,135,215,148, 32,151, 84,245, 31,212, 52, 80,119,
+ 26,102, 81, 20,251,136, 99, 76, 20, 5,203,149,141,168,148, 46, 48, 23, 34, 49,173,142,241,171, 42, 67, 66,162, 81,115, 70,115,
+ 17,133,121,239,160,179, 66,138, 84,232, 96,185,224, 44, 11,234,172, 41, 89,209,162,105,104,207, 75,199,145,192, 56,244,216, 31,
+ 30,102, 7, 78, 58,142,176,206, 71, 8, 87,238, 2,203, 8, 55, 69,222,187,131, 59,184, 80,109,112, 5,124, 82, 4,135,130, 51,
+210, 13, 79, 73,162,247,220,169,231,122,142, 74,145,171,133,173,228,124,231, 28,161,164,174,192,147, 50,166,207, 57, 64, 10,205,
+ 23, 91,100, 17,104, 65,175, 22, 53,182,168,201,106, 74, 0,201, 71, 36,161,144, 65, 83, 27,234,142, 34,166,222, 67, 40, 93, 95,
+159,119,174, 66, 96,104,237, 9, 52,204,118, 87,140, 28, 78,124, 22, 32, 39,216, 70,147,202, 93,146,218,157,130,191, 60, 12,199,
+186,166,148,224, 39, 79,186, 2, 6,136,101, 46, 14,140, 85, 85,243,144, 51, 7,191,240,132, 6, 49, 31, 45,151,115,109,204,106,
+238,130, 80,140, 29, 47,133,119, 89, 57, 71, 94,163, 49,219,132,161, 67,168,251,110, 6,134, 37, 58, 27, 4,143,214,139, 48,181,
+236,250, 9, 48, 83,224,110,199,244, 67,210,152, 20, 97, 94, 12, 97,142,161, 45, 23, 62, 74,158,123, 96,125, 66,154,129, 55,244,
+169, 67,151,125,178,102,145, 66, 8, 52,166, 70,152, 57,202,211, 56,161,109, 45, 66, 72, 20,146, 50,121, 68,149,142, 18, 98, 34,
+229,125,115,197, 67,234,121,122, 96,218,182,129,155, 38, 40, 77,138,241,226,203, 12,129,224, 46, 21, 48,161, 36,178,144, 76,139,
+ 82, 53, 73, 40, 8,218,149,175, 54,180, 63,116, 46, 64, 42, 13,239, 93,237,240, 1, 93,105, 88,101,196,162,149, 68,110, 8, 18,
+ 35,164, 96, 70, 59, 29,154,182,149, 21,209,167, 25, 1, 43,165,168,130, 31, 89, 2,103,184,178,170,164, 33, 14, 27,144,146, 70,
+ 78,245, 50,202,100, 87, 35,106,147, 70, 10, 35,124, 8,104,187,150, 15,101, 89,233, 81,136,116, 88, 53,141,101,214, 48,141,119,
+ 34,119, 55, 33, 4,142, 75,141, 21,121, 11, 0,211, 52,212,160,142,166,165,195,121,185, 94, 64, 89, 11,203,255,155,186, 49,202,
+240,141,137,178,201, 55,103,103, 88,109,183, 0, 18, 14, 15,123,244,135,129,248,222, 46, 50,134, 86,241, 4,129,188,188,221,162,
+133,146,148, 50, 53,197,192,106,253, 80, 61,173, 57, 0, 70,143,120,247,135,223, 99,177,125,134,103,159,126,142,135,171, 11,164,
+176,195,213,219,247,120,250,241,115, 76,135, 61, 94,253,201,143,241,219, 95,254, 29,222,124,247, 26, 74, 73,188,252,252, 37, 14,
+251, 17,155,211, 45, 30,238, 30, 96,187, 14,125,239,232,253, 73,212, 86, 45,214, 29, 62,251,147, 87,184,188, 60, 32, 37,218,219,
+110,182, 11,188,185, 63,224,205, 63,254, 30,175,254,228, 75, 8,179,192,201, 73,139,237,201, 18, 15,247, 3,156, 23,244, 94, 55,
+ 26,127,248,253, 15,128, 94,226,227, 79, 30, 97,177,176,232,239,111,241,232,201, 25, 67, 36, 44,158,190,120,132,118,209,224,230,
+242, 14,211, 24,113,241,230, 26, 23,111,111, 49, 77, 30, 34, 7,156,159,175,240,211, 63,251, 2, 82, 41, 92,188,126,143,171,183,
+151,184,191,185, 33, 69,123,160, 47,141, 49, 10, 57,105,136, 64,196,192, 2, 59, 17, 82, 81,167, 34, 5,140,182,136, 9, 64, 18,
+149, 17,159,217, 62, 35, 25, 41,153,145, 89, 37, 91,200, 96,146,211,185, 72,220,216, 46, 90, 22,106,169,122,252,208,133,205,150,
+160,152, 48,185, 0,114,236,168, 90, 8, 10, 33, 97, 27, 34,145,117, 93, 7,219, 90,116,139, 14,203,213,146, 99,117,153, 32,199,
+138,237,254, 48,192, 57, 7, 63, 57,236,247,123,210,116, 48,238, 52,103,160, 91, 16,237,206, 54, 13, 57, 43, 20,101, 20,216,198,
+206,138,246, 72,235,129, 98,151, 44,201, 88, 37,125, 12, 16,236, 30, 73,112,139, 9,193, 59,140,195, 88,105,116,133,182, 22,131,
+ 3, 96,184,176,142,245,112, 35,171,172,224,224, 21, 85,249,226,244,157, 39,221, 14, 65,115,240, 65, 30,117,228,223,139,205,107,
+148,248,101, 4,139,255,116,253,206,148, 84, 67,133,204, 59, 91,250, 14,145, 53,144,166, 87,198, 26, 40, 41,171,254,136,210,222,
+ 10, 3,162,161,244,188,178,110, 12, 30, 25, 25,187,135,125, 61, 35, 75, 76,105,153, 44,146,154, 63, 85,225, 97,233,202, 9, 6,
+ 83,176,177, 37, 47, 94,214,112,151,204,120, 86, 99,168,153,160, 61, 57, 49,242,219,214, 84,139, 26,137,184, 34, 82,244,148,248,
+199,160, 18,154, 0,240,133,149, 2,227, 93,105, 18, 39, 50,137,205,146,146,140,157,165, 66,174, 96,173, 73,227, 17, 88, 4,150,
+235, 26, 73, 40,193,240, 44,202, 53, 80,122,118,131, 16,194, 20,240,172,118,167, 11, 76, 1, 40,148, 63,137,110, 97,217,105, 52,
+223,179, 41,206,202,247, 24, 73,193,174,141,174,147, 93, 33, 5, 68, 46,211,147, 84, 99,195, 37,128, 16, 18,223, 33,162,190,103,
+ 37,241, 62,213, 2, 43,147,202, 60, 82, 33, 30,156,255, 96,125, 83, 45,101, 49,113,108, 44, 5,239,240,156,171,134,156, 33,139,
+170,175,226, 33, 19, 51, 94,138, 8, 52, 33, 71, 65,147,132, 18, 98, 37, 45, 21,167, 74, 81,198,189, 84, 16,108, 97,206, 50, 33,
+ 39, 28, 37, 46,250,234,208,160, 20,193,192, 97,109,185, 78,232, 74,128, 16,167,215,208,248,189,235,186,250, 70,229,156, 16, 51,
+137,170, 10,200,101,177,236,120,150, 21,171,245,165,105, 12,239, 95,243, 7, 9, 81, 67,223,163, 91, 46,225,189, 71,199,241,119,
+ 66, 72, 52, 77,131,177,239,107, 7, 58, 12, 3,195,240, 5, 90,171, 25,127,135, 57,198,128,173,168,244,128, 48,211, 61, 70,140,
+195, 4, 99, 12,250, 3, 93,232,178,236,126, 43,184,128,245, 1, 98, 14, 58, 9, 62,212, 46,220, 88,139,224, 2,132,149,100,135,
+101,138,145,144,128,231,221, 88,137,192,179,141, 70, 12,153,247,251,162,138, 81,114,202,180,115,210,234, 40,138,111,134, 16, 64,
+144, 85, 45,103, 89, 67, 47, 10,156, 33,198,132,182,109, 8,231,167, 36,119,168,145, 5, 65,137,237,121,190, 86,157, 72,168, 4,
+161,152,231,228, 31, 0, 24, 15,135,154, 87, 76,204,250, 6,182,105,208,116, 45,186,101, 87, 15, 46, 90,127,100,194,151,158,103,
+184,113, 66,191, 39,113,221, 56,240, 1,158, 20,191, 14,192,182, 11,104, 99,177, 92,175,112,120,216,161, 63,120,140,253, 80,249,
+226,137, 99, 10,199,135,183,120, 51,236,241,236,147,143, 17,134, 59, 12, 15, 87,184,122,171,240,226,179,143, 49, 29, 90, 60,123,
+249, 18,175,191,253, 30,215,151,107,172,182, 43, 52,139, 37, 54,103, 91,220, 94,223,227,246,242, 22,139,245, 18, 72, 36, 76, 20,
+ 82,224,249,171,143, 48,142,158,109,137,180, 71, 63, 57, 91,195, 79, 35,164, 20, 88, 63,122, 10,239, 60,206, 31,175,224,124,198,
+ 97, 31,107, 16,206,205,213, 3,148,237,240,179,159, 62, 67,107,105,180,216, 46, 90,244, 15, 7, 72, 99,113,182, 93,225,250,234,
+ 1,119,215, 15,184,248,225, 61, 14,251,129,253,245, 10,167,231, 91,156,158,173,241,244,163, 39,208, 90,226, 31,254,250, 31,112,
+115,121,141,161,159, 96,173,132,214,150, 58, 57,238,128,134, 97, 36,104,132,182,180,115, 68,217, 79,107,254,119,244,204, 79, 62,
+ 65, 72, 77, 29, 37, 88, 13, 46, 20,132,204, 16, 50, 67,155,134,145,205, 25, 41,147,114,189,227, 66, 80, 41, 93, 67,123, 10,170,
+ 88,228,196, 93, 57,199, 87, 98, 14, 53,105,219,134,130, 92,150, 75,180, 29, 49, 19,202,115, 17, 88,200, 52, 14, 19,145,251,174,
+239,234, 97,183, 88, 46,234,232,111,123,178, 5,242,134, 64, 78, 66, 85,157,135,226,105, 20,209, 21,195,220,221, 9, 90, 91, 69,
+ 31,145,114,132,159,202,184, 88,112,151,146,171,248,171,120,134, 23,139, 5, 82,106,177, 88,174,106,225, 58, 7,170,144, 96,173,
+223,239,225,166, 17,146,167, 80, 4,238, 96, 37, 87,241, 8, 87,194, 98,230,162, 66,124, 96,121, 35, 63, 59, 93, 32, 41,207,232,
+ 81,194,240, 42, 62, 56,227,220,201,165,136,224, 39, 42,240, 16,103, 87, 12, 39,184,153, 2,156,210, 51, 12, 6,204, 60, 95, 44,
+ 90, 40, 45,107,167, 21, 66,194,112,232,225,188,171,187,251,200,107,141,121,205,128, 15, 80,220,115,106,216, 12,226, 58,118, 0,
+120,239, 96,180,230, 75,149,211,220, 80,108,103,146, 29, 76,185, 78, 58, 88, 83, 9, 32, 81, 88, 74, 46, 74,247, 84,243,209, 1,
+218,165,139,218,133,179, 29,139, 47,249,227,134, 70, 41,131, 88, 82, 42,131,103,117, 58,173, 10,163,247,176,141,169, 17,205,137,
+ 19, 35,115, 22,160, 56, 53, 5,109,104, 15, 46,149,132,109, 45,119,178,244,223,120, 23,208,180,166, 78,150, 38, 23, 16, 60,119,
+228, 71,221,116,233,202,133,148,136,222,215,159, 7,182,123,149, 49, 62,253, 23, 18,211,228,200,223,159, 2,211,226,248, 61, 77,
+ 84, 52,208,253,158, 72, 28, 88, 99,111, 69,205, 51,153,198,169, 58, 14,114,204,204, 87,225, 38, 52, 83, 49, 93, 46,118, 48,158,
+187,124, 31,201, 97, 64,187,243,196,175, 27, 34,215,231,220, 24,131, 44,100,157,122,100, 70,130, 67,170,242,193, 85,215, 10,233,
+197,136, 4, 58,243, 21,136,163, 79, 23, 58,253,192,146,140,167,141, 49, 76, 49,163, 20,181,204,135,128,231,113, 69, 9, 9,200,
+108,209, 8, 33,214, 64, 6,165, 34, 98,154,253,163,101,125, 81,190,248,222, 27,180, 12,100,137,137,170,165,178,111,179,214, 32,
+120,143,166,109,107,206,114,137,243, 43, 24, 65,130,218, 73,196, 40,120,138, 16,200,230,163,233,133,134, 20,184, 42,162, 15,142,
+144,150,115,212, 95, 25,183,145, 37, 99, 14,165,208, 70,206,163, 40,158, 80,224, 40, 77, 45,134, 84,247,249,229, 67, 40,241,170,
+133,135,109,172, 33,117, 98, 38,112,133,115,108, 89, 73,212,133,211,254,147, 99,101, 51,160,121,151,222, 46, 90, 22,224,105, 70,
+212,198,186,130,136, 33, 48,250,211, 85,129,152, 16, 2, 40, 97, 48, 85, 89, 74,234, 98,163,233,139, 24, 28, 83,178,252,136,251,
+155,200,116, 58, 9,109, 27,172, 54, 43, 40, 99,209, 45, 87, 88,109,150,176,141,133,110, 21, 54, 77,135,245,233, 9,130,155, 48,
+236,239,113,119,117, 83,243,157,233,181, 73,132, 0,180,171, 13,186,229, 18,110, 28, 48,246, 7,140,227, 52,163, 40, 5, 16,198,
+ 59,188,253,167, 1,203,211, 23, 56,123,250, 12,251,219, 27,252,240, 13,240,244,227,151,120,254,249, 23,232, 15, 61,118,183,239,
+112,117,177,198,179,151, 6, 49, 83,234,216,238,238, 30,139,237, 6, 82, 36,228, 24, 96, 27,131,205,217, 22, 23,111,110, 49, 77,
+ 17, 57, 42,108,207, 86,120,247,230, 6,135,251, 7,188,252,241,231,184,189,233,113,126,102,113,123, 51, 97,191,223,211,151, 49,
+ 3,206, 39, 18, 16, 42,133,177,119,232,247, 25,167,143,182,144, 50,194,116, 75,196,224,241,246,187,215,152, 6,135,235,171, 29,
+250,131, 67,244, 35, 30, 61, 90,225,228,124,139,118,209, 98,123,186,197, 56,140,248,155,255,240,119,184,191,185, 37,229,177,162,
+ 29, 31,144,209,118, 84, 36, 13,135, 30,214, 90,140, 33, 32, 51,246, 49, 73, 16,122, 85,146, 42, 88,242, 51,210, 45, 59, 68,239,
+ 43,227, 64, 86, 37, 54, 72,225,202,202,203,210,125,118,139, 69,245, 0, 23,210,163,210, 68,112,140, 12, 87, 25, 6, 7, 37, 37,
+ 86,235, 21,108, 75, 60,134,213,122, 5, 41,185, 8,200, 96, 20,235,132,222,123,162,191, 29, 70,190, 15, 37, 22,139, 14,155,205,
+170,114,227, 75,212,104,138,101,143, 30, 49,244, 61, 59, 48, 60, 26,182, 18, 21,229,122, 74,145, 47, 25, 95, 45, 59,110, 28,137,
+ 72, 23, 18,243,191,143,248,227, 0,129, 93,152, 53, 95, 58, 26, 33, 4,246,187, 3,211,217,136, 30, 71,105,142, 22,106,179, 69,
+140, 43, 72, 37,224,157,131,119, 14,110, 28,234,168,179,154,119,249, 59, 25,242, 60,146,167, 29,227,124, 97, 42, 77,122,129, 84,
+207, 23,218,201, 10, 81, 94, 3, 77,201, 2, 59, 19,138,206,167,208, 51, 99, 72, 48, 37,161, 50, 38,222, 49,203,154,121,177, 88,
+118,208,214,144,199, 60,132,202,164,232,251, 1,193, 59,178,162, 85,205,133,168,211,131,227,128, 41,173,143,245, 65,116, 78,170,
+163, 34,165,120,178,115,230, 73,162, 17, 12, 17, 74,144, 44, 42,172,187, 98,190,240, 51,143,147,145, 99,141, 12,173, 9,107, 41,
+ 48, 50,149, 94, 99,217,199, 75, 62,231, 5,219, 4, 37,167, 1,150,160, 39, 26, 83,123, 74,192, 99, 75,163, 86, 18, 66,203,170,
+ 55, 42,187, 93,201,251,237,152, 40,176, 36,133, 4,109, 37,131,149, 2, 22,171, 69,189,164,164,204, 24, 7, 87, 17,188, 69,213,
+ 29,125,224,198, 75, 84, 87, 15, 25,155,210,124,121, 23, 75,100, 6, 33,187, 57, 59,157, 44,137,156,101,174, 52,173, 34, 50, 79,
+200,164, 64,202, 18, 82,144,160, 49,213,152,212, 92, 39, 28, 36,218, 35,139, 94,113, 26,148,172,245,232,153, 41,193,248, 95,106,
+148,169, 25, 77,145,242,218,131,159,234,138,162, 20,109,224, 59, 82,107, 81,109,221,164, 3, 99, 24, 81, 13, 28, 74, 92, 40,240,
+231,207,235,225,130,210,157,145,238, 10, 73,228,202, 57, 41,207,138, 38,216, 65, 70,204,161,238,245,154,182,169, 10,192,182,107,
+ 42, 8, 99,246,147,198,250,208,171, 72,111,148,143,129,194, 78,124, 96,177, 12, 5, 91,132, 16,185,163, 16,232,186, 22,206, 57,
+ 14, 4, 80,240, 62,210,255,102, 91, 93,140, 9,109, 71,150, 28, 26,243, 1, 49,145, 96,163,236,135,134,126,128, 92,154,234,151,
+ 7, 15, 86, 76, 67, 30, 66,173, 24, 90, 97, 84,197, 48, 18, 2,145, 70, 94, 77, 99,171, 18, 82,178,165,203, 24, 85, 43, 35, 82,
+178, 18,108, 70, 43,205, 15, 71,102,145,160,172, 33, 47, 49,205,213,124, 42, 79, 21, 43,227,203,232, 91, 41,226,220, 11,169,102,
+191,111, 99,200, 67, 44,104,172, 3,166,213,105,173, 42, 16,134, 32, 3,162,230, 43,199,144,103,138,147,214,228,147, 71,198,216,
+ 79,213,155, 79,157, 0, 39,192,121,135, 41, 68,136,190,199,120,216, 81,209,160, 52,164, 50,176,237, 2,139,213, 10,155,211, 13,
+132, 16,104, 23, 13, 78, 30, 63,195,217,147, 39, 24, 15,123,220,223,220, 98,127,119, 79, 22, 57,107,209,118, 13,132,182,104, 86,
+ 91,116,171, 13,252, 52,194, 77, 3,134,253,158,198, 75, 41, 34,248, 3,166,225,107,220, 95,111,240,226,179, 79, 33,211,132,171,
+215,111,113,250,244, 49, 62,255,249,207,240,253,239,191,194,238,234, 29, 78,206, 55,136, 41,225,236,233, 35, 28,246,223, 33,133,
+128,182, 83,220,157,211, 20,228,230,122, 7,219, 54, 48,134, 14,201,219,203,123,124,244,217, 11, 12, 83,132, 81, 25,163,151,112,
+135, 1,154, 71,174,182,109,176, 57, 89,162,105, 52,218, 86,227,225,190,135, 82, 2,251,135, 3, 85,174,137, 2, 78, 14, 15, 61,
+110,111,246,240,147,195,147,199,107,156,158, 63, 37,109,135,200,216,108, 90,124,247,245, 55,248,229,255,243, 55,184,191,185, 37,
+196,177, 96,210,158,181,136,222, 34,133, 0,219, 54, 16, 57, 50, 21, 45, 98, 28,134,186, 19, 46, 88,202, 92,246,222,198, 32,199,
+ 0,169, 53, 26,173,169, 11, 13,156, 90,168, 5,178, 8, 72,153, 18,185, 12,115,179, 51, 4,180,109,232,146,208, 10,224, 41,139,
+ 54, 6, 90, 27,116,203, 14, 57,211,191, 35,162, 91,168,226, 82,138, 45,245,240, 33,192, 90, 58,148, 23,171, 5,186, 69,139,229,
+114, 69, 94,235,214,144, 63, 59,211,184,219, 29, 70,118,101, 8,238,136, 3,166,129, 46, 79,242,172, 3,222,145,248,139,212,240,
+243,222, 87,136,121,130, 84,246,223, 37, 71, 93, 41, 9,101,200,187,159,114, 70,107,116, 85, 16, 91,107,225, 70,135,156,139, 0,
+151, 86,115,222,121,238,148, 29,107,116, 44,218,174, 69,219,182, 48,198, 96,181, 94, 35, 84, 58, 29,141,198,141,144,212,121, 66,
+213, 48, 24,154,186,229, 74,125,204, 53,150,153, 40, 99, 3,163,118, 75,136, 6, 9,153, 60,163, 61, 35,114,205,106, 39, 91, 43,
+ 84, 29,134,179, 62,129,166,146,214, 24, 40, 43,209,182,109,229,223, 71,142,202,236, 15, 3,166,105,172,130, 57,218,229, 42,148,
+ 70, 43,179, 5, 23,249, 8, 28,196, 93,186,148, 68, 31, 11, 49, 0, 76,176,155,237,166,122,206, 82, 87,178,238,113, 11,129,172,
+252, 89, 81, 45,111, 52, 98,207,165,187,231,224, 39,186,244,202,234,209,145, 23,187, 78,125, 36, 19,218, 88, 63,193, 81,203,145,
+247,186,179, 74,187,104, 30,120, 30, 34, 41,103, 60, 68,218,143, 39, 33,145,156,131, 80, 36,122, 35, 61, 82, 97, 36, 52, 8, 62,
+194, 88, 26, 39, 79, 17,117,124, 14,144,174,200,104,186, 12,163, 75,188,242,162, 12,242,200,217,235, 53,194, 84, 8,120,126,134,
+115, 6,172,201,152,124,132, 18,128,210,156,197, 46,230, 24, 83,169, 36, 34,159,215, 33,208,115, 20, 38, 7,211, 88, 10, 58, 42,
+ 94,241,156, 56, 64,135, 25, 37, 33,206, 54, 59,126, 70,138,214, 35,101, 22,174,114, 81, 89,237,134,130,244, 53,137,245, 54,101,
+229, 82, 84,245, 82,106,210,121,169,162, 7, 40, 49,175, 20,122, 84, 10, 25,193,194,205, 50,189, 41,127, 55,137, 97, 57,172,135,
+191,151, 41, 37,104,197,132,156, 50,162,118,147,131,109,108, 85, 96,150, 20,161, 68,190,250, 35, 80,190,226,206, 60, 99, 24,166,
+ 90, 53,123, 71, 25,224, 90, 43, 76,195, 4, 41,103,234, 81, 74,168,136, 66,122,211,230, 40,215, 50,226,158,166, 80, 47,213, 20,
+ 35,108,211, 18,119, 55, 21, 5,161, 71,206,102,150,239,115,149, 59, 43, 3, 99, 5, 67, 72, 41, 43, 69,169,132,134,164, 68, 32,
+154,177, 31,160,179,230,116, 41, 82,203,227, 72,145, 88,246,219,206, 57, 22,254, 24, 36,153, 56,228, 97,174,170, 75,236, 98, 97,
+231,211, 69,208, 80,218,157, 49, 85, 8, 38, 5,216, 47, 41, 42, 1,138,136, 68,185, 42, 74, 75,192, 67,241,162,122, 95,252,226,
+243,126,109, 28, 70, 88,163,120, 98, 18,145, 92,172,156,230, 84,114,158, 37, 37,101,121,231,145,120,122, 49,142, 30, 74, 50,130,
+212,245,232,239,175,208,180, 22,235,147, 21, 6,211, 97,115,118,138,211,167,207,240,228,227,143, 17,189,195,176,223,225,250,221,
+ 5,110, 46,175,225,134,123, 8,169,209,116, 29,132, 50, 88,110, 23, 88,159,156, 97, 26,122,140,135, 61,130,119, 24,250, 1, 98,
+186,199,119,191,249,123,156, 62,123,133,199,207, 55,184,191,190,197,114,179,194,199, 63,254, 17,254,240,155,223,225,112,255,128,
+ 71, 47,158,224,176, 31,241,232,217, 35,140,125,143, 39,207,158,225,208, 79, 80, 90,224,225,110,199, 66,160, 8,165, 52, 46,222,
+ 94,163, 91,182, 24, 93,130,155, 18,164,238,144,146, 66,219, 50, 94, 88,208, 36,226,249, 71,103,200, 57,227,246,234, 14, 82, 68,
+ 0, 10,195,110,135,174, 51,232,251, 9,247,119,196,141,127,242,244, 4, 77,171, 49,236,118,248,234, 31,126,139, 79,190,120,137,
+211,231, 79,240,183,255,249,111,241,205,239,190,193, 52,142,228,221,119, 19,117,115,197,134,166, 20,154,182, 69,211,117,148,134,
+133,196,236,103, 81,249, 4,166,105, 16, 83, 66,246, 1,202, 8, 36, 71, 29, 95, 97, 7,104,195,135,104,140,244,185, 75, 93, 89,
+ 13, 90, 27, 52, 29, 9,173,186,101,135,211,243, 83,202, 80,104, 90,152,198,194,185, 0,239, 2,118,247, 59,236, 30,246, 56,236,
+175,121, 7, 73,222,103,203, 81,172,246,204,178, 16,135,186,208,113,112, 8,142,153, 7,227, 88,211,161,202,184, 59, 67,240,119,
+ 42,213,248, 84,193,150, 49,138, 6,166,113,168,109, 77, 5,101, 16,147, 58,113,124, 38,127, 39, 29,161, 89,149, 84,124,233,101,
+ 40,157, 16,216, 54, 90,214,143,141,181, 44,150, 34,123, 87,211,210, 26,193,187,192,187,110, 95,213,217, 41, 58,236, 31, 38,206,
+ 34, 87,176,182,133,210, 13, 54,139, 53,229,192,239,247,200, 72,196,201,214,178,102, 51,148, 53,150, 16,180,226, 11, 62, 64,177,
+232,183, 58,105, 10, 32,139,109,130, 82,210,231, 66,234,225, 92,119,246, 31,250,142, 81,247,232, 74,209, 65,190,236, 22,180, 42,
+145,229,220,202,152, 70, 7, 55, 57, 34,197, 41, 18,244, 26,109,152, 53,192,113,205,199,251,213, 35, 44,108, 57,179, 34, 39, 52,
+ 66,204, 57,222,101, 14, 92, 86, 0,177, 20,111, 25,149,231,158,145, 56, 18,148,196,152,193,123,228, 28,249,156, 78,236, 21, 23,
+200,177,208,200, 68, 77,123,203, 60, 98,167,179, 72,208,138, 8, 84,148, 9,182, 79, 73,221,208,154,168,164, 66, 42, 65, 62,239,
+ 72,223,135, 88,108, 87, 62,243, 93, 97, 32, 57,161, 51,167, 4,219, 72, 70,135,163,218,188, 74,206,121,129,155,145,245, 46, 97,
+ 28, 74,152, 16,125, 38,211, 68,191, 59, 4,237,167, 21, 59, 13, 74,252,118, 57,143, 61,167, 85,198,144,144,120, 31, 29, 67,164,
+245, 8, 3,224, 75, 24, 74,100, 13, 24,164, 32,122, 32, 59, 83,200,185, 34,143,162,186,211, 7,235,221,156, 18,251,194,233, 34,
+ 14,126,170,153, 10,168, 5,144,172, 84, 70,193, 96,154,242,187,150, 53,109, 46,204,151, 50,169, 45,209,179,197, 46,157,168, 75,
+ 47, 43, 87,114,156,147,238,131, 58,118, 18, 88,227, 8, 47, 11, 74,105,155, 15,158,224,105, 87, 18,188, 7,178,174,162, 54,207,
+ 65, 39,197,135, 90, 42, 52, 18,219,204,187,173,242, 48,119, 28, 29, 57, 77, 30, 74, 59,116,139,142, 58,110, 85,246, 48,177, 70,
+ 8, 30, 95,234,134, 51,215,165,164,206, 6, 5, 19, 27,169,170, 35,239,119,170, 94,191,116,180,195,192, 17, 15, 87,114, 37, 99,
+ 57,168, 64, 72, 73, 0,127,165, 42, 39,186, 80,239,230,176, 4,122, 29,206,121,178, 28, 48,210,210,187, 0,173,100, 21,140, 8,
+ 38, 54, 21,113,196,252,144, 16,104, 95,155, 6, 74, 27, 62,200, 53,220, 20,168,144,104, 27, 78,149,146,208,134,193, 6,121, 30,
+245, 21, 71, 65, 57, 60,136, 48,167,102,223,101, 78, 21,151, 72, 65, 31,116,208,104, 37,170,248,166, 84,128, 2,204, 78, 86,138,
+210,166,152,129, 47, 13,237,195, 36,128, 97,152, 48,236, 18,118,183, 87, 80, 74,227,234,109,139,110,177,132,237,150, 88,157,156,
+194, 52, 11, 60,126,245, 37, 62,254,147,159, 32,184, 17,253,195, 61,238, 46, 47,177,187,223, 33,186, 8,187, 92, 66, 44, 55,104,
+ 87, 27,164,224,225,199, 30,251,187, 91, 28,246, 61, 30, 46,190,193,238,246, 26, 79, 94,125, 1,219, 6, 52,235, 14, 95,252,179,
+159,224,245, 55,223, 97,236,183,136, 49, 97,177, 94,163,223, 95, 98,185, 89, 32,191,190, 4,114, 70,127,152, 88,197,156, 24, 86,
+ 68, 7,192,213,229, 1,182,105,209, 88, 64, 36, 18,146, 72,173,233,210,190,191,199,119,195, 1,109,215,146,207, 87, 40, 24, 13,
+120, 37,113,232, 3,148,182,120,244,180,197,212, 31,112,243,254, 10, 55,151,215, 88,174, 22,248,179,191,248, 5,134,195,132,127,
+247,127,252, 91,220, 94,223,204,234,106, 30,127,106, 83,132, 96, 36, 92,116, 99, 79, 97, 36,156,152,165,141,170,246, 18,211, 24,
+ 18,103, 26, 61, 95, 26,154,186,216,192, 2,161, 66,112, 35, 82, 30, 93,172,155,147, 53,214,219, 53, 22,203, 5, 22,171, 69,165,
+190, 77,163,195, 56,121,188,191,184,192,208,247,216,221,239, 40, 95,192,106,104,107,113,122,182,129,144, 26, 96, 33,205, 56, 76,
+184,187,121,128,115, 30, 33, 56,186,148,121,245,164,181,228, 11,119, 78, 91, 19, 0,140,213, 8, 33,179,173, 83, 64,106,129, 24,
+102, 94,188,109, 8, 95, 76, 23, 13, 29,174,198,106,178, 19, 49,236, 34, 86,171,149,172, 0,144, 20,203,193, 87,128, 52,244,103,
+154,182, 97, 74,154, 97,187,153,226, 46, 40,213, 44,131,134, 11,248, 18,105, 73,110, 28, 15, 9,210,234, 40,109, 8,188,100, 13,
+150,155, 18,120, 52,112, 67,146,144,162,167, 51, 40, 6,178, 59, 49, 88, 37,167, 57,121, 43,242,190, 20, 71,157,105, 81, 5,215,
+ 40, 76,254,179,199,151, 5,101, 82,232,153,220,199, 83, 77,173, 9, 77, 29, 99,164,149, 29,127, 23,189,119,181, 96, 39, 72, 87,
+233,202, 20, 20, 23,244,169,166,210, 73,114, 75, 48, 14, 86,113, 48, 20,117,121,185,162,101, 83, 74,200, 74,113, 17, 95,160, 61,
+197,242, 43, 42,191,188,132,229,228,228,128,228, 17,203,174, 92,228,218,164, 73, 33,105,148,174, 8,149,109, 77, 83, 47,134, 2,
+154, 33,209, 93,161,255,177, 86, 68, 50, 14,150, 87, 54,200,146, 33, 60,196, 80, 72, 60, 42,166,164,182,200, 94,117, 64,105,166,
+211,177, 21, 77,136, 8, 45,136, 46, 90,214,155,211,232,120, 55, 28,185, 59,167, 99,117, 26,139, 86,137, 58,123,194, 39,143,172,
+ 12, 39, 81,156,119,161, 58,173, 98, 34,141, 10, 56,156,135, 64, 99,129, 38, 47,153,238, 44, 36, 62,123,195,220, 24,146,102,160,
+140,201, 5,105,152,152,202,231, 67,100,205, 81,209,119,249,154, 28, 72,152,216,204,154, 25, 57, 95,220,114,158, 62,148,233, 93,
+154, 8,137, 27, 66,100,215, 21,115, 1, 56,144,137,186,122,182, 46, 34, 49,209, 78, 32, 70, 1, 63, 77,179, 70,133, 53, 32,101,
+162,146,170,232, 52, 66, 7,222, 35,145,233,158, 20,184, 49,230, 58, 82,108, 90, 11, 37, 43,225,129, 20,227, 70,147,218, 61,209,
+104, 36,120, 42, 12, 28, 43,205,189,247, 12,132,161,135,221,243,126, 26, 89,240, 62, 94, 32,129,132,106,110,162,241,104,129,242,
+107, 45,107, 54,114, 8,148,144,102,155, 22, 37,159,209,179,119,190,118,188, 53,248,128, 14, 1,105, 56, 77,141,211,219,234,159,
+ 97, 69,172,155,124,253, 57, 37, 91,183,120,207,139,218, 82,178,157,196,243,197, 75, 80,143,196,214,181,161, 10,223, 34, 43,213,
+ 5, 31, 4, 33, 2,109, 67, 59, 69, 93, 57,214, 36, 98,145,149,105, 79,254,203, 24, 60,141,218,142,196, 71, 82, 10, 76, 35, 85,
+252,101,215, 24,120,175, 68, 99, 33, 95, 4,142, 31, 4, 72,104, 93, 4, 21,105, 78,249,209, 4, 4,129,144, 8,211, 68,161, 19,
+ 34, 3,201, 99, 26, 60, 43, 65, 3, 82, 0,134,224,177,191,167,247,183,233, 90,216,166, 69,183, 92,161, 91,109,208,174,214, 48,
+237, 2,139,213, 18,143, 95,157,224, 49, 18,146,159,208,239,246,136,110, 66,202, 9,211,100,208, 46, 86, 88,157, 62,130, 27,122,
+244,187, 59, 28, 30, 30,240,238,171,191,195,254,201,167,120,252,226, 41,158, 34,237,237,155, 0, 0, 32, 0, 73, 68, 65, 84, 62,
+ 63,161,104,212,195,136,105, 18, 80,198, 98,185,110,113,123,189,135,182, 68,191,146,236,197,213, 6,188, 79,141,152, 92,134,181,
+ 22,109, 67,246,199, 47,126,252, 2, 41,101,124,247,205, 59,236, 14, 7,108, 79,183,216,158,174,209,247, 3,220,142, 70,185,144,
+ 13,158,125,114,138,126,119,192,229,155, 75, 92,190,185,192,221,245, 13,172,213,248,217,159,255, 20,155,211, 13,190,254,213,215,
+248,246,235,111, 49, 77, 36,150,155,198,137,227, 71, 57, 50,145,191,216, 66,154,106,127, 73, 5,251,152, 18,172, 32,111,105,204,
+153,247,122, 28, 97, 42, 40, 20,168,211, 26,203,213, 2,203,245, 18,235,237, 26,109,215, 97,181, 89, 84,190,115,206,192, 48,140,
+152,134, 9,151,239,239, 49,254,225, 29,239,241,201,134,105,172,197,114,213, 97,177,236,112,254,228, 49, 98,136,216,221,239,225,
+156,199,219,215,239, 49,244, 3, 29,248, 37, 83, 65,203,122, 89,185,113,226, 34,135,148,242,166,184, 73, 74,215, 92, 98,136,115,
+172,106, 98, 41, 36,178,204, 48,172,112,206, 37, 0,133, 83,191,100,153, 24,241,212, 12,133,249,157,136,105, 65, 25, 8, 37,210,
+147, 58,199,224, 19,140, 85, 71, 76,119,186,224, 10,115, 62,229, 12,149, 51, 32, 88,181, 29,231,203, 41, 48, 67,162,105, 27,238,
+ 2, 35,188, 27, 17,252,132, 24, 27, 98,206, 91,131,224, 38,140,158,254,125,153,238, 37, 30,107,131,153,219,130,131, 83, 40, 38,
+ 58,214, 11,189,168,210,139, 93,183, 56, 79, 10,228, 71, 1,181,208, 42, 48, 27,205,112,157,118, 65,190,244, 99,145, 91,140,145,
+246,255,156, 71, 95,108, 70, 18, 52, 78,151,236, 41, 46,217,224, 82, 72,100, 81,210,226, 34, 50, 99,125,139,255,185, 28,224, 41,
+ 70, 8,165, 25, 45,186,160,223, 93,138,186,131, 46,133, 68,101,232,231,196,150,212, 9, 57,115,119,158, 60,147,205, 4,167,235,
+177, 0, 42, 71,206,112, 79,156,216,214,208,249, 98, 44,130,119,124, 97, 8,216,150,186, 95, 32, 85,190,123,138,129,167, 14, 5,
+ 36, 35,153, 19,239,235,200, 88, 40,194,105, 27, 67,208,176,224, 2,148,209, 64, 10,164,118,231,177,114,244,196, 64, 32, 54,129,
+128,247,185,102,164,151, 4,203,196, 48,154, 88,156, 65,124, 15,184,224,209,118,182,118,243, 51, 82,149, 20,238,153, 93, 75,197,
+207,157, 82,230, 59, 45,115, 30, 7,105,170, 42, 57,212,168, 15, 38,178,180,227, 7, 93,232,117,245, 92,246,244,236, 76,201, 51,
+217,175, 60,203,178,102,161,204, 77, 47,221, 73,170,142,241, 75,252,183, 64,137,100,229,169,108, 49,168, 49, 52, 40,149,245, 67,
+164,247,189, 4, 52, 81,224, 88,174,220,139,140, 4, 77, 85, 12,197,120, 22,123,151,243,129, 85,211, 13, 31, 24,186, 2, 39,114,
+ 6, 9,169,216,206, 80,184,234,222, 11,230,180,103, 86,117, 39, 86,239, 18, 94, 79, 41,137,172, 40, 0, 33,184, 17, 17,236,247,
+ 99, 91,130,119, 52,166,138, 49, 64, 75,186,144,130,151,252,179,192, 24, 65, 82,229,106, 37, 33,172, 97,181, 60, 42,240,161, 88,
+131,200,167, 78,163,240,162,150,117, 19,137,149,154,150, 99, 6,197,156,135, 28, 60,170,165, 65,112,181,227,125,228, 64, 7,212,
+ 75, 31, 12,231,192, 81, 40, 67,206,229, 61,104, 24, 62,194, 92,103, 14,155, 16,108, 37, 33, 76,101,130, 23, 52, 14, 44, 52, 47,
+129,249, 50, 46, 25,243, 49, 37,182,116,208, 62,200,141, 19, 97, 50, 21,117, 72, 5, 91, 88, 38, 30,200,242, 8, 35, 73, 29, 68,
+202,160,177,170,204,104,187, 22, 34, 51, 61,203,187,218,237,147,127,210, 83, 70,113,166,177,176, 31,247,144, 82,226, 94,105, 24,
+219,194, 52, 13,150,235, 13,214, 39,167,208,205, 2,221,122,141,118,185,196,250,252, 17, 71,185, 42, 68,239, 17,188,131,214, 51,
+222, 51,248, 9,119,151,151,184,125,127,133,183,223, 28,144,226,167,248,232,147,199, 88,110,150, 56, 9, 2,239, 47,238,176, 61,
+ 63,197,221,245, 61, 76,163, 97, 27,129,105,114, 48, 6, 16,136, 56,236,129, 97,162,189,166,181, 2,198, 10,252,233,207, 63,197,
+237,205, 30,191,254,255,254, 17,155,237, 18,159,124,241, 17,188,243,216,221, 61,160, 93,180,104,187, 37,214,219, 5,118, 55,183,
+248,235,191,252, 79,184,190,184,196, 56, 78, 88,174,150,248,242,167,159,227,179,159,124,142,239,191,254, 1,127,245,151,255,133,
+118,185, 82,162,109, 59,246, 66, 75, 76,195, 80, 29, 8,169,138,110, 36,239, 68,139, 85,138, 86, 72,145, 47,169,213,154,240,189,
+ 39,231,167,216,156,108,176, 98, 17,154, 16, 84,228, 78,163,199, 48,140, 56, 28, 6, 92,190,191,163, 14,141, 49,198, 49, 70,172,
+ 56,174,243,236,227,167,124,129, 81, 40, 67,127, 24,112,216, 83, 30,247,126,119,192,208,247,200, 41,240,148, 40,179, 22,196, 2,
+160,194, 59,149, 32, 16, 9, 6,212,112,129,196,163,238, 50, 13,107,187,150, 15,196, 84,185,239,134,191,167,133,151, 94,186,131,
+156, 56,251,186,160, 44,235,234, 76, 84, 33, 85,153,210, 53,109,131,224,124,197,223, 2, 18,221,210,146, 3,196,146,197,174, 4,
+121,104, 99, 32, 36,173,251,166,209,241, 1, 73,218,156,154,179, 34,105, 90, 69,124,235, 0,239, 38,164,200,207, 42,201,157,176,
+ 88, 46,161,140, 65,211,182, 8,126,164,139, 44,209,184, 83, 8, 1,109, 77, 77,146, 75, 12,110, 81,108,225, 44, 86, 55, 33, 0,
+213, 88,226,109,112,240, 11,141, 96, 53,255, 57, 98,172,207, 98, 54,154,212, 52, 44, 82,244,206,147,110, 6,212,160,128,119,248,
+225,232,192, 15,145, 84,240,145,191,175, 82, 10, 4,254,187, 83,200,188,183, 47,171, 1,250,255,139,171, 37, 21, 26, 90,156,195,
+ 64,164,152, 69,108,197,193, 83, 58,116, 32, 33, 4, 7, 37, 50, 34, 18,239,158, 49,239,239,211, 44,166, 43,175,151,188,216,138,
+166, 63,108,163, 12, 12,214, 41, 49,200,222,209, 88,154, 82, 34, 3,132,230,108,112,182,172, 85, 60,111,189, 39,200,243,142,164,
+160, 23,134, 35, 96, 3,164,166,201,227, 52,122, 22, 18,131,245, 20,142,186,250,144,145,148,172, 66, 62, 82,184,211,251, 64,204,
+ 30,202, 37,160, 2, 81, 86, 29,194,208,143,164, 62,151, 92, 16,242,181, 8,163, 33, 20,113, 57,102, 26,104,172, 65, 58,153, 85,
+227,197, 13, 2, 68,158,132,138, 90, 0,148,213,140,228,201,147,100, 48, 79, 18, 5, 49,203,175, 95,240,132, 5, 76, 10,100,203,
+ 34,233, 58, 48, 11,223, 50,133, 51,201,156, 72,252, 40,102,149,127,138,244,185,148,243,135,214, 96, 28,175,154, 34,162, 15,148,
+ 36,202,207, 65,140,158, 89,242, 84,248,102, 0, 58,243,242,189,236,210,133, 20,104, 26, 59, 67, 98,142,186, 84,231,104,204,133,
+ 48, 71, 22, 74,201, 62,196, 34,211,103,145, 73,211, 18,129, 74, 73,234,138, 33, 4,140, 84,240, 73,178,239,112, 6,199,120, 79,
+ 72,189, 84, 72, 71,188,195, 55,214,192,251,128,110, 97, 9, 13,169,228, 60,146,130,168,177,125, 37,153, 73, 72,197,157, 80,233,
+ 68,128,166,177,108, 15,202,213,114,160,217,126, 82,115,167,107,130, 20, 42,251,183,120,199,173, 53,196, 29,230,203, 87, 43,137,
+161,239, 73, 68,199, 56, 44, 99, 40, 77,171, 91,118, 20,173,105, 12,252, 68, 94, 81,194,206, 82, 81,225,189,167, 78,136, 65, 10,
+101,183, 89, 34,111, 11, 86, 80, 21,190, 47, 23, 71, 5, 22,225,125,134,150, 36,244,200, 41, 66,100,218, 93, 57,231, 56, 67, 90,
+ 86,245, 47,111,131, 32,133,134, 64, 68,244,142,121,249, 25,211, 88, 84,191,168, 35, 57, 57,167, 64,210, 3,233, 71,184, 56,193,
+245,192,238,250, 2,151,166,129,177, 13,218,197, 18,237,114, 5,221,110,112,242,248, 49,150,155, 13,150, 43,226,166,215, 64,156,
+ 4, 52,203, 22, 31,157,156,225,229,151, 95,162,223,237,240,112,251,128,254, 48,226,241,243, 51,108, 58,138,201, 61,244,142,179,
+224, 19,144, 35,189, 71,110,130, 75, 18,195, 68,159, 77, 99, 13,140,150, 88, 46, 59,252,254,215,223,163,223, 29,240,249,143, 62,
+194,106,221,194, 77, 30,219,147, 21,242,233, 22,135,135, 3, 46,190,251, 22,255,254,191,254, 3,238,174,175, 49, 77, 14,139,213,
+ 2, 63,253, 23, 63,195, 47,254,213, 47,240,246,187, 75,252,135,255,243,223,163, 63, 12,228, 37, 55, 6,237,146,118,125,235,147,
+ 53, 37,217, 77, 19, 0,138,198,181, 45,117, 22,221,146,130, 76,186,197, 2,135,253,200,222, 83,138,239, 61,125,116,130,110,217,
+241, 56, 45, 97,236, 29, 14,135, 1,253,205,136,200, 83,166, 34,234,105,187, 37,182,167,167,196, 46, 80, 10, 67, 63,225,176, 31,
+160,141,192,122,179,132, 16, 18,195,224,216,206, 72,153,225,221,130, 69,141, 39,167,149, 92, 86,184,230, 49, 38, 72,205, 93,104,
+189, 72,243, 7,128, 21,197,211,142, 18,171, 90,186,196, 57,106, 82,212,221, 94,138,177,218,199, 82,140,104, 91,133,105,242,144,
+ 70, 85,244, 41,219, 97, 96, 20,131,163,216, 19,159, 98, 34, 14,132,165,181, 68,112,133, 5, 78,239, 83,206,242, 8, 24,163,121,
+159,207,201,135,200, 92,168,134,122,144,122,231,232,178, 8, 30,147,163, 20,196, 28, 61,139,190, 56, 19, 34,120,236,238, 71,180,
+221, 26,182,109, 96,109, 7, 63,141, 60,238, 22,243, 46,149, 5,101, 74, 41,248, 20,217,199, 79, 35,224,194, 27,143, 33, 64,105,
+195,138,121,137, 12, 87,249, 18,162,114,184,231,174,139,196,120,130,131, 69, 72,187,210, 31, 40, 79,129, 52, 63,153, 39,112,190,
+238,231,227, 17,211,163, 76, 84,152,143,133,152, 2,140,110,136, 14,167, 36,143,124, 81, 65, 40,206, 79,212,129,114,107, 94, 98,
+123,161, 18,180, 80,204,187, 96,209, 28,239,235,227, 7, 97, 53,133, 16, 63,143,123, 51,127,150,197, 29, 68,225, 47, 12,164,242,
+129, 86, 72, 74, 67,170,166, 2,111, 52,227,135, 37,199,150,166, 24,200,232,205,123,103,193, 17,186, 82, 73,128,131, 70, 76, 99,
+152,126, 71,128, 24, 31, 28,209,210, 34,144,146, 71,138, 35,101,102, 20,229, 62, 50,100, 40,246, 58,138, 27,157,122,199, 40, 89,
+ 85, 27, 56,231, 99, 73,230,173, 73,106,193, 57, 8,165,170, 31,221, 88, 75,231, 96, 85,190, 3, 57, 56,166,196,209,119,163, 48,
+221, 41,100,201, 87,168, 13,216, 65, 85, 92,135, 57, 70,164, 50, 17, 78,168, 84, 62,169,152, 58,167, 24, 18,196, 34,241, 34, 40,
+204, 16, 85,148, 73,211, 20, 14,223,201, 37, 21, 14, 21,182, 68,133, 51, 29,196,217, 5,100,169, 43,150, 55,197,192, 5, 89,170,
+ 46,148, 88, 94, 23, 55,120,153,173,144,186,120,132, 37,251,228, 34, 47,241,181,214,220, 13, 24, 8, 67,151,107,219, 90,178,110,
+229, 4,163, 53,167, 45,205, 42, 83,147, 20,131, 49, 2, 87, 66,186,142,206,140,177,204,147,167, 42,212, 7,186,240,173,229, 61,
+189, 15,136, 70,195, 24,170, 78, 76,211,240, 23, 56,207,226, 23, 41, 63, 56,132, 82, 76,156,252,202, 23, 60,239,196, 20,255,185,
+166,181,136, 41,161,209, 18,110,154, 5, 48,164,108,253, 16,195, 72, 30, 72, 26,193,135, 92,200, 66,115,216, 68, 97, 28, 15,253,
+ 64, 63, 95,196, 10,116,112,158,132, 67,218, 24,130,185,196,116,228, 65, 37,191,164,159, 28,143,193, 98, 61,152,221,228,224, 29,
+ 67,110,254,136, 79,159,139,239,157,190, 29,117,220,228, 16,235,223, 17,185,155, 39, 42, 32,211,146, 36, 19,186, 92,137, 32,140,
+ 8, 83, 68, 10,244,197,136,169,236,110, 82,181, 14, 38, 6, 24, 20,190, 54,249,230,115,237, 58,168,123,160,177,125, 78, 30,227,
+225, 30, 25,111,112,245,253, 87,144,186,129,237, 54, 56,125,242, 12,235,179, 51, 44,215, 11, 10,195,113,190,122,170, 87,235, 21,
+206,219, 5,118, 15, 35,134, 62, 96, 28, 3,158,126,116,142,175,126,253, 61,114,166,105,129, 81, 17, 15,187, 30,214, 40, 60,236,
+ 73, 4,216,182, 22,221,162, 65, 74,192, 52,121, 32, 69,188,252,244, 9, 91, 58,200,167,249,213,175,254, 9,187,235,107,228, 52,
+ 34,184,128,199,207, 78,241,236,229, 35,124,241,147,207,241,163,255,230,231,136,131,195,175,254,250,215,232, 15, 3,190,252,249,
+143,208,118, 45,173,131,120,210, 84,198,109, 57,103,130,182,112,103,100,216,227,239, 38,143,177, 31,113,121,113,141,215,223,190,
+193,187,215, 23,144, 34,214, 36,178, 57, 4,137, 16,183,133,181,191, 92, 45,177, 92, 47,113,122,126,138,172,104,188,124,127,251,
+128,155,171, 91,244,135, 1, 41, 69, 76,227, 88, 87, 48,132,103,142,213,110, 53,241, 90, 42, 48,193,174,116, 84,179,216, 38, 34,
+ 67,162,227, 29,125, 41, 46,203, 33, 77,222,106, 67,150, 37, 30,139, 23,141,134,214,154, 65, 30,138, 87, 14, 20, 83, 76, 42,238,
+ 92,247,234,180,223,101, 45,137, 20, 21,161, 92, 4, 57, 84, 8, 4,100,157,144,179,162,204,247,144, 33, 11, 53, 76, 75, 22, 46,
+ 9, 42, 16, 20, 77, 99,202,179, 21,188, 71, 74, 1, 90,102,248, 24,201,123, 12,162, 36,210, 52, 35, 50, 28,133,232, 92, 82, 40,
+ 64,229,202, 6, 79, 33,160,223,223, 66,200, 83,242,219, 35, 99,191,123, 96, 97, 89,201,209,214, 85,255, 67, 43,185, 60,115,212,
+249,249, 87, 74,193, 88,250,253,181,197,156,120,197, 87,122, 81,198,151, 20,203,197,178,227,115,132, 69,196,153, 98, 90, 73,111,
+ 20,120,122,134, 74, 27, 44,156,112, 58,155,230,139,105,206,193,166,241, 50,209,249, 4,124, 14,148,106,103, 27,196,224, 97,155,
+ 14, 41,120, 74,175, 99,181,124, 9,124, 41,251, 87,114, 71,102, 62,216, 73, 95, 64,223,227,217, 26, 87,252,252, 36,248,227,105,
+170, 50,128, 80,144, 82, 83,247,201,191,147,109, 23,204,244, 39, 81,178,110, 13,143,192, 35,119,241,164, 53, 10, 41,212,179, 88,
+ 73,138,139,165, 98, 78,176, 72, 90,127,136,187, 69,170, 14, 35,169, 20,118,119, 59, 18, 17,178,254, 35,103, 1,104,112,199,155,
+ 72, 15,148, 51,144,128, 20,248, 28, 76, 9,218,146, 24,154,178, 22,152,235, 15,192,176,112, 85, 25,197,186,165,121, 58, 1,145,
+ 17,125,224, 98, 55,205, 66,112,102, 93,208,244, 57, 86,221, 88, 17, 4,210,243, 46,103, 56, 13, 63,255, 66, 10,164, 16,217,161,
+ 69,174, 39, 42, 94, 12,162,247, 92, 28,204, 69,101, 6, 5, 40,209,254, 95, 86,225,105,228,207,176,172, 24,200, 90,152, 17,146,
+171,118,187, 34,176, 45,107,143, 66,191, 75,108,137, 78, 44,184,203, 41, 66, 23, 59, 4,253,135,129, 59, 53, 98, 68,147,112,204,
+ 85, 81, 8,142,210,162, 68,141,227, 35,177,142, 54, 18,193, 43,116, 93, 3,231, 40,254,148, 8, 77, 30, 66,116,149,242,150,132,
+134,246,134, 24,202, 28,147, 74,214, 49,170,146, 10, 77,174,192,234,141, 81,117, 68, 79, 20,157,204,254, 72,133, 24, 80,119,133,
+101, 31,122, 44,128, 75, 57,163,181,134, 60,129,153, 18,138,168,155,205,117,247, 81,114,172, 51, 43, 87, 75,194, 84, 56,218,243,
+ 75,254, 2,185,105, 98,212, 95,102,177,145,169,160,253,218,245,148, 81, 37,239,240,156, 11,112, 35,117, 96,221,162,225, 49, 79,
+132, 68, 73,199, 10, 85, 48, 72,130, 15, 87,147,242, 4, 7,203,144, 10, 57,209,239, 42,114, 21, 65, 9, 8,158,174,148, 24, 71,
+138,249, 75,130, 46, 42, 41, 18,130,155,120,132, 25, 33,129,138,151, 36,251,143,228,181, 7, 79, 79, 4,169, 89, 73,181,235,235,
+107,163,131, 60,192, 52,221, 7, 96, 31, 32, 64,120, 7, 55,238, 49,238, 46,241,238, 27,129,152, 52,186,245, 22,139,237, 25, 86,
+219, 83, 74, 52, 59,140, 76, 78, 18,232,191,127,135,152,128,245,118,133,237,249, 6,151,239,110, 17,188,199,192,200,199,224, 41,
+126,182, 91,118,176, 86,227,238,102,143,245,166, 69,138,100,161,122,184, 31,177, 94, 91,184,126,135,174, 81,248,201, 47, 62,129,
+ 50, 95, 32,134, 76, 33, 14, 2,216,223,237,240,112,187,195,127,252,215,255, 9, 99, 63, 96, 26, 61, 54,167, 39,216,158,159,225,
+201,243, 71,208, 90,225,225,126,135,221,221,129, 56, 9,200,120,184,125,192,187, 31,222,227,230,234, 6, 55,239, 47,113,127,123,
+ 71,137, 93,193,215, 49, 93, 25,135,249, 20, 89, 44,103, 96,155, 22,171,245, 10,219,211, 45,186,197, 2,237, 98,129,148, 5,250,
+195,136,161,239,241,250,251,247, 24,107, 98, 31,143,184,185, 83,179,214, 64, 25,195, 99,233,204,106, 95,195,157,114,195,154, 10,
+207, 41,111, 36, 0,178,156,194, 86,242, 22, 66,240,213,194,164, 20,248,243,242,232, 15, 61,154,166,229,130, 79, 99, 28,124,117,
+158,152,166,161, 44,110,214,109,144,130, 61,212, 64, 9, 99,168, 75,167,221, 98,134, 53,170,118,174, 90, 43, 40,163,235,168,190,
+ 93,144,232, 75, 55, 30,221,154,186,124,207,151,115,228, 78,220, 24,130, 88, 73, 33,161, 12,231,132,115,135, 67, 74,101,138,112,
+205, 52, 93,174,151,110, 1,131, 8, 41, 17,121,119,152,120, 37, 70,212, 52, 18,149,141,253, 30, 98,181, 65,211,116, 8,158,196,
+130, 5, 89, 82,136,153, 74,235, 15, 46, 83,218,147,234, 82,119,243,116,177,169,153,223,228, 44,144,204,107,136, 28,133,153,248,
+242,148, 21, 69,237,157,175,194, 85,128,206,179,178,211,151, 74, 1, 49,147,245, 47,229,163, 36, 54,240,120,159,190,147,101, 84,
+235,125, 64,219, 52, 53,102, 53,231,146, 8,150, 0, 73, 14, 28, 98,110,112, 88, 9,143,225,165, 32,148, 90,113,192,100, 30,235,
+214,249, 63, 47, 44, 68, 25,239, 74,138, 36,149, 82,215,117, 89, 25,193,107, 99,232,217,224, 8,220,162, 11, 2,171,244,105,170,
+ 33,129, 36,145, 65, 98, 47,161, 36, 4, 7,157, 20, 5,184, 16,162,118,202,197,253,160,216,106, 40, 65,159,249,110,183,167,207,
+145, 11, 85,239, 36, 71, 83,115, 51, 83,109,105,148,131, 80,162,124,165, 86,180,234, 65,129,188,164,138,243,142,145, 45, 98,222,
+147, 61, 49,211,218,162, 92,134,180, 94, 97,215, 82,240, 92, 52,230,186,167,102,198, 47,175, 75, 35,211,254, 68,229, 51, 20, 33,
+ 47,217,206, 88, 55, 32,242, 7,252,129, 24, 35, 69, 95, 11, 81,109,173,101, 58, 18, 75, 28, 49,243, 5,104,154,205,188,139, 52,
+ 83, 74,117,177,123,170,146,254,201, 43,187, 48,113, 56,145,155, 45,141, 57,213, 59, 60, 35, 19, 38,182,166,177, 85,166,121,192,
+195,189, 67,211,146,109,192,115,213, 65,132, 42, 85, 35, 72,149,150,148,150, 99, 45, 95,254,137,119,207, 98,142, 19, 84,244, 97,
+216,134, 18,102,192, 99,230,200,191, 84,211, 8,254,187, 81,197, 70,203,101,203,226, 6,141,148, 51,133,179,180,134,213,246, 52,
+142, 79,129,114,139,231,252,245,204, 44,119,122,243, 12,251,212, 11,163, 87,114, 97, 82, 66, 91,180, 86, 56, 60, 28,160, 12,147,
+166, 82,230,144, 21,234, 24, 50,147,154,172,213, 85,132, 23,188,231, 78, 74,144, 32,143, 67, 25,178,160,240, 16, 64, 84, 37,167,
+100,193, 80,244, 97,134, 41,132,128,192,201, 70, 19,219,106,142, 5,110,153,153,199,161,142,131, 82, 21,176, 20,223,105,136,137,
+133, 46,162,198,225,106, 69,252,242, 16, 18,144,168,163,200, 49,112, 8,128,103, 66, 24, 42, 72,161,120, 27,179, 16,104, 26,205,
+147, 1, 58, 24,148, 42, 15,179, 98,196, 36,103,134, 27,195,182,187,242,103, 80,237,130,185,242,183, 37,130, 27,112, 8, 61,198,
+221, 21,238,222, 89, 58, 56,100,131,197,246, 20, 66,183, 80,218,146,135, 59, 1,166,161, 64, 15,231,128,221, 48,194,143, 35,116,
+ 75, 62,108, 37,129,221,125, 15,107, 37,218,206, 96,181,238,176, 94,183, 56, 57, 95, 66, 10, 5,231, 34, 39, 99, 53,136,145,158,
+ 17,109, 12,100, 78,152, 52,165,140, 45, 86, 43,174,178, 41, 10,247,221,247, 23,248,237, 47,127,131,155,203, 27, 76,227,132,152,
+ 34, 78, 30,157,227,233,243, 39, 88,109, 86, 56,127,124,130,147,211, 37,182,219, 14,111,190,215, 56, 60,236, 49,142, 83, 21, 67,
+117,203, 14, 93,183,224,189,121,199,211, 36,178,116,246,135, 30,215,215, 23,152,198,145,139,129,192, 19, 36,208,229,173, 21,175,
+152, 10,244,136,240,152, 4, 71,145,136, 37,146,149,167, 63,222,135, 42,208, 2,119,147, 50,129,213,191, 12,138,202, 96,187,151,
+ 2,178,230,216, 82,137,166, 51, 88,174,216,183,219, 16,189,112,161,215, 53, 44,101,142, 42,101,139,145, 36, 94,181, 86,154,138,
+ 47, 46,168, 41,156, 40,224, 48, 13, 92, 60, 11, 76,163,135, 49,179,134,165,172, 2,104,178,197, 35, 87, 67,107, 60,219, 52,244,
+ 89, 26,131,213,118, 22, 1, 81, 33, 75, 43, 63,226,180, 7, 76,125,143,137, 33, 82, 2,148,120, 69,214,172, 92, 3, 79,192,170,
+241,156, 19,239,151, 37,251,199, 61,166,126,143,229,230, 20,203,245, 6,119, 55,215, 12, 11,161,201, 68,158, 1, 16, 16, 50,151,
+ 53, 48,159, 63,228,249, 15,133,191,175,112,132,150, 5, 98, 74,232, 44,229, 90, 72, 37,209,216,134,215, 23,162,194,170, 8, 39,
+ 77, 58,146, 34, 70,115, 44,230, 42,103, 66,161,251,149,131,183,160, 89,185,233,227, 44,121, 77, 62,111,198, 7,211,161, 31,184,
+ 32,153, 61,202,180, 70, 35, 55, 17,152,161, 33,114, 17,105,137,186,198, 40, 1, 55,243, 68,160, 0,143, 20, 55, 63,124,121, 27,
+139,110,177,172,130, 96,197, 19,129,192, 5, 64,202, 25,201, 71, 2, 69,177,224, 75, 30, 5, 18, 81,240, 10, 19,218, 16, 96,219,
+ 14,198, 54, 20, 52,195,127,167,140, 14, 1, 10, 16,116, 31,140,195,136,254, 48, 16, 37, 47, 70, 30,221,147,130, 92, 73, 90,171,
+130,253,244,166,105, 16,217,114, 45,181,230,168, 87, 77,211,145,226, 60, 98, 92,112,226,231, 67, 42,250,142,144,214, 36,177, 48,
+121, 38,248, 21,177,103, 57,159, 83, 12, 72,209, 51,136,169,160,191, 36,124, 76,149, 8, 71,120,243, 2,240,103,134,124,221,126,
+169,249,251,203, 77,165,146, 18, 1, 69,133,159, 42, 78, 90,213, 16,178,200,154,170, 34,158, 76, 53,241,174,196, 8,187,201,213,
+181, 74,170, 94,244,192,171, 54, 70,219,214,158,151,158, 39, 93, 60,141, 37,108, 29, 57, 51, 74, 80, 86, 95,100,217,117, 16, 95,
+184, 97,126, 58,165,185, 25,171,234, 3,206, 58, 6, 76,147,132,146,164, 84, 87, 0,119,189,196, 14,166,253,177,168, 86,174, 28,
+121,108, 88, 68, 17,197, 82, 99, 21, 66,160,138,214, 88, 86,219, 26,133,148, 88,180,150,100,165,198, 73, 41,170,216, 39,215,177,
+178,172,176, 28,239, 60, 23, 9,108, 7,209,108,159, 64,174, 25,203, 49, 37, 88,109, 16,193, 24, 78,109, 88, 65,108, 57,216, 62,
+215,209, 38, 5,180,104, 30,227,210,216,168,237, 90,122,248, 35, 71, 93, 66,192,141, 14, 62,196,154, 46, 36, 56,116, 49,215, 61,
+ 73,170,222,196,178,195,175,116,163, 60, 31,102, 41,145,181,167, 68,173, 22,107, 16,133, 16, 0, 40, 99,214, 24, 33,141,226,140,
+224, 68, 5, 68,177,232,164,217,215, 92,148,151,244,176, 23,228, 96,128,119,153,105, 95,236, 36, 96,221, 1,216, 39, 73, 93,202,
+124,153,212,216, 79, 80,138, 16,197,100, 10,254, 61, 13, 31,112, 17, 49,236,241,240,254, 1,222, 17,175,223, 7,129, 96,159, 65,
+ 43,131, 47,127,242, 9,180,181,184,191,189, 37,128,208,148,208, 95,221, 99,179,182,120,249,233, 25, 94,125,241, 4,219,147, 37,
+ 14, 59, 7,239, 19,110, 46,123,158, 26,209, 30,240,226,237,129, 64, 42,163,167,192,149,137,242,232,165, 0,218,174,193,106, 77,
+ 86, 55,173, 21,206, 30,173,177, 61, 93,224,229,167,207, 48,244,244,231,250,195,128,221,253, 29, 30,110,111, 25, 30, 2,180,139,
+ 14, 63,251,243,127,142,229,170,195,237,245, 29,167,129, 73,236,238, 15,216,239, 15,216,221, 61,224,221,219, 27,140,125,207,214,
+ 22,170,152, 53,251,134,143,149,173, 0,112,146, 50, 94,172, 45, 46,161, 49,102,154,174,116,139,142,131, 50, 4, 91, 54, 13,171,
+193,233,162, 48, 77,130,105, 90, 44,215,169, 22,152, 5,108, 83, 84,219,101,100,104, 27,195, 35,215, 84, 11, 90, 8,138,207, 44,
+201,110,180, 91,167, 85, 77, 65, 61,151,144, 13,234,102, 35,166,129,108, 63,110, 20,117, 42,167,148, 64,112, 19,180,166,144,154,
+174, 83, 85, 44, 10, 70,191, 18,160, 41,241, 56, 61,243, 78, 60,227,176, 3,147,235,116, 77, 86, 36,207, 50, 96, 27,138, 53, 85,
+ 77, 3,129, 6,235,237, 22,126, 26,105,229,192, 86,181,105,232,225,198, 1,110,114,164,228,230,213,128, 16,134,237,118,226, 40,
+121,205,225,176,219, 65, 42, 93, 59,204,178, 7, 87, 74, 86, 0, 84,226, 98,186, 76, 3,169, 11,164,131,150,124,235, 17,182,105,
+152, 50, 23, 89,225, 78,103,143,146,146,227, 88,117, 13,167, 34,193,169,194, 52, 6,242,217, 75,142,168,230, 73, 90,249,157, 73,
+253, 46,184,139,166, 73, 1, 77, 73, 99,133, 99, 5, 63, 65,138, 22,224,209,126,177,174,149,104,106, 89, 83,227, 84,229,220, 19,
+170, 86, 80,241, 94, 44,121, 57, 86, 98,102, 1,221, 72,148,221, 45,141,248,165,210, 80,202,194, 88, 66,246, 22,119, 14, 41,214,
+109, 29, 49, 83,116, 43, 21, 17,132,220,158,170,245, 19, 71,175,165, 76, 64, 41, 14, 86,193,251, 0,153, 4,164, 81, 48, 58, 33,
+103,186,252,189,155, 16, 99,196,112,160, 66,113, 28,136, 91,144, 35, 61,220,166,153,207, 91, 40,137, 12,133,105, 28,217, 59, 47,
+145, 67,224, 73,142,231,139,146, 50, 23,164,226,238, 93, 74, 8, 86,189,151,145,124, 46, 8,238, 52, 19, 9,139, 55,191, 50, 82,
+104,215, 75,147,209, 92, 66,147,184, 80,133, 66, 76, 64, 42, 25, 33,113, 22, 51, 22,254,124,217,103,151, 34,170,172,110,137,194,
+234,235, 24, 62,113,232, 75,224, 34,163,232, 46,144, 83,181,170,129,157, 78,145, 39, 78, 37,208,135,254, 89, 88, 42,146,247,246,
+179,250,189,248,156, 53,125,193,197,188, 7,226, 81, 11,177,127, 81, 71, 13,134,227,236, 92, 25,203,121,242,139,210, 27,156, 43,
+ 72,195,113,150,119, 17,159, 41,174, 32, 11, 24, 70, 74,133, 44, 19,101, 42,187,169, 70, 62, 54,109, 51,163, 6, 51,143,216,181,
+129,212,154, 97, 17, 64, 74,179,234,179,188, 56, 34,209, 17, 36, 70,114,117, 43, 56,166, 81, 41, 89, 89,200, 77,107, 43, 31,186,
+ 64, 99,102, 79,162,172, 2, 6,207, 2,140,166,109,170,221, 37, 56, 15, 55, 18, 96,197, 26, 77,162, 26, 69, 9,117,166,177, 53,
+ 34,211, 51, 15, 94,176, 74,186,140, 17,173,165, 32,140, 20,200, 74, 22, 98,172,106,252, 92, 70,249, 70,177, 13,136,109,120,152,
+ 63,168, 2,181, 41,105,211,218,144,223, 94, 73,170,186,203, 88, 71,130, 98, 25,115,142,200,165,115, 98, 85,189,119, 19,237, 81,
+ 57, 64,131, 42,254,204,153,195,243,206, 45, 29, 17,237, 10, 3, 89,105,222,181, 87,254,112, 62,226, 12, 83, 90, 87, 40, 14,135,
+242,144,179, 23,155, 44, 28,146,119,246, 0, 88,160,103,154, 9,187,171,247,248, 47,255,247,128,255,254,127,249, 57,126,244,211,
+ 87,184,190,218, 67, 43,129,243,117,135,207, 94,157,226,110, 8,248,230,171,107, 24,115,207, 99,198, 50,177, 16,213, 82, 89,126,
+102, 8,180,223,214,182,133, 93,172,107,248,136, 16, 64, 63,140,200,217, 99, 26, 70,184,201,161,237, 12, 78,207,182,216, 72,137,
+118,209,178,141,135, 0, 23,169, 70,116, 18, 29,113,115,118,142,229,170, 69,219,145,120,116,255,176,199,238,126, 15,239,105,236,
+154, 98,194, 56, 76, 8,129,114, 9, 74, 86,183,102,244,171, 16, 18,191, 88, 89,124,242,106,139,209,174,241,126,239,240, 48, 56,
+ 76, 62, 96,242, 17,147, 39,118,122,165, 74,101,218,167,199, 20, 72, 77, 43, 19,180, 20,117,199, 14, 22,150,129, 1, 51,145, 41,
+131, 74,137, 58, 98,165,247,170, 60, 45,153,225, 42, 25, 66, 36, 68, 79,240, 18,109, 52,192,140,121,106, 67, 51,160,192,192, 39,
+ 93, 45,107, 49, 38, 52,173,173, 69, 59,173,186, 84, 29,191,187, 34,114,229,231, 33,248, 80, 99, 74,203, 10, 12,137, 86, 3, 49,
+120, 98,186, 43, 13, 32, 96, 56,236,121, 21, 86,162, 47,103,246,132,181, 13, 86,235, 21, 97, 98,189,195,238,238, 30,253,254, 1,
+ 3, 39, 93, 21,219,106,157,102,100, 32,134, 9,222,187, 90,204, 83, 55,171,171,200, 85,114,251, 71,100, 70,186,228,149,214, 80,
+ 82,147, 88, 19, 64,100, 98, 27,202,100, 79, 72,178,226,166, 4,221, 52, 53, 95,158,127, 4, 31,210,140, 41,173,104,106, 70,134,
+178, 15, 61, 51,241, 49,178,218,190,164,182,205, 77, 20,105,105, 74,132, 51,142,108, 80,197,125,163,149,161,247,136,109,134,162,
+136,230,152,147, 33, 89, 25,159,114,168, 74,116,250,188,116,181,100, 10,169, 25,215,171, 96,108,139,110,177,226,157, 55,224, 3,
+ 51,228,153,158,150,217, 83,158,121,173, 67,213, 36,117,147, 34,211, 52,215, 59, 95, 47,246,136, 12, 99, 91,104,219,113,190,129,
+132,212, 10, 18, 30, 66,144, 11, 33,101,129,105,156,224,221, 84,217,240, 66,170, 26, 74,162, 21, 72,251,163, 4,175, 43, 34,132,
+164,174, 92, 8, 1,164,204,182, 58,130,176,208,249, 36,104,213,171,115,205,241,144,146, 84,244,133,179,159, 93, 41,156,202,133,
+ 45, 48, 14,142, 21,246,177, 90,199, 34, 3,204, 66, 72, 85,248, 39, 65,107,233, 50,241,201, 66, 67, 42, 84, 61, 69,224,169,111,
+121, 13,145,157, 45,213,110,200,150,232,210,156,149,233,177, 86,244,247, 17,194,152,180,105, 37,138,183,172, 59,143,147,223, 88,
+217,200, 5,106,134, 72, 5, 60,131, 58, 33,163,164,189, 12, 29,130,135, 76,138,194, 75,202,120,220, 16,177,136,170, 80, 93, 71,
+ 29,150,171,168,105, 34, 76,162,224,135, 52,132,116, 52,230, 17,245, 80,115,206,147,153, 62,250,122,184, 19,180, 67, 64,183, 13,
+164, 72, 53,129,230, 3,226, 83, 5,206, 80,197, 88, 72,114, 74, 73,100, 65,194, 36,149,100,237, 20,200, 86, 32, 42,102, 85, 41,
+ 18,132,197,152,160, 89, 84, 82, 48,180,162,136, 43,138,111,150, 69, 49, 5,154, 97,140,129,177,196,242, 85,140, 34,165, 34, 35,
+ 16,211,253, 40,139,151,246, 70, 13,137, 78, 98,174,220,107,239, 34, 19,223,184,202, 85,196, 63,142,188,131, 11, 76, 56,138,165,
+146, 76, 9,222, 39, 4,199, 49,130, 5,199,201, 42, 87, 42,138,232,139, 82,124,237,214, 90, 4,222,235, 80,177,192,135, 76, 8,
+ 85, 29, 41, 89,112, 69, 94, 84, 42,134, 66, 76,176,134,120,245,154,133, 67,202,208,168, 93, 27,205, 2,165, 57, 34, 82,240,110,
+ 48,199, 48, 3, 46,202,248, 41,167, 26, 29,121,108, 43,180,109,203, 29,229, 60, 50, 77,145, 25,219,222, 1,162, 65,215, 72,236,
+187, 51, 12, 59,224,175,255,227,239,112,122,190, 66,112, 17, 79, 94,156,226,229,103, 79,112,113,231,241,230,135, 43,104, 99,177,
+ 88, 90,172,214, 29, 5,113,100,170,204, 33, 21,175, 4,202,200,154,132, 89, 77, 67,163,195,182,109,104, 61,148, 51,148, 49,184,
+186,120,192,237,109,132,146, 6, 39,143,207,208,172,214, 24,135, 9,215,215, 19, 4, 28, 95,142,212,117, 14,195,132,105, 32, 22,
+120,211,104, 44,150, 13, 63,159,130, 5,109,138,115,194, 19, 14,187, 17, 49, 36, 76,206, 3,153,200, 98, 49, 70, 40, 77,202,220,
+ 6, 9,159,252,143, 63, 1, 78, 86,104,149,198, 39,136, 52,206,122,216, 3,247, 3,222,252,112,141,215,183, 14, 23,119,119,232,
+167,128,161, 31, 89,116, 53, 91, 92,202, 62,190, 20,202,249, 72,228, 24, 66, 68,244,138,158,205,148, 57,174,146,246,184, 36,192,
+212, 8, 1,104,172,168,217,229,197,206, 89,245, 37,153, 86, 79,218,176,101, 79, 73,222,251,147, 7,189, 8, 51, 67, 17, 24, 50,
+146,148, 86, 65,178,130,144, 72, 23,164, 88, 64,168, 89,117, 47,248, 57,161,241,168,228,223,125,232, 71,158,202,177, 87,152,117,
+ 35,253,225, 80,131, 58,180,209,176,214,194, 88,131,205,201,150, 83,230, 4, 14,251, 61,180,210, 8, 49, 86, 96, 75, 77,150,175,
+105,138,134, 71,161,172, 50,151, 52,161, 64, 6,132, 42,150, 49, 85,161, 29,138, 11,176,148,136, 96,102,140,193, 56,186, 25,137,
+203, 57,221,116, 8, 51, 26,215, 19,194, 57,132,200,217,234,164, 41,160,213, 25, 79,221,144,234,247, 55,179, 66,153,224, 54, 44,
+ 98,227,162,186,188, 87,162,198,176,102,142,166,158,191, 95,146, 11, 41, 84,104, 14,179, 4,138, 2,154,223,231, 99,241, 93, 17,
+116,201,218,233, 11, 24,219,113,172, 47, 19, 8, 57, 14, 84, 41,133, 84, 88,242, 12,171,201, 57, 34,133, 68, 62,247, 82,164,228,
+192,221, 59, 77,111,165,210,176, 77, 7,109, 91,176,117,156,139,191,200,133, 14, 77,248,166,190,199, 52, 14,212,197, 43,154,206,
+150,205, 10, 57,126,232,183,241,108,223, 35, 46, 61,234, 42,171, 52,152,138, 35,153, 5,175, 8,137, 45,207, 41,125, 44, 78, 75,
+129, 26,155, 82,208,101, 94,139,144,208,175,172, 67, 83,133, 22, 21, 17,104, 0,189, 15,153, 61,241, 33,151,226,160, 4,171,164,
+ 90,108,149,166,199,243, 74, 86,105,253,193, 52, 38,231, 88,173,104,153,195,184,100,153,172, 36,193,192, 30,112,160, 11,234,127,
+ 71,218,129, 25,168, 22,121,138, 32, 24,198, 86,164, 18,196,208,224,148, 61,214,213, 32, 39,104, 99,103, 27, 26, 9,182, 72,245,
+ 42, 36,197,240,149,203, 86,105, 67, 56, 76,107,160,164,134,243, 44,208, 41,104, 64,166, 42, 89,107, 32,101, 70,127,160,152,214,
+ 84,236, 29, 33, 96,177, 92,240,131,171,129,204, 74,248, 60,135, 51, 52,141,169,138, 98,202, 41,151, 72,153, 46,158,166, 49,180,
+143, 9,220,173,107, 5, 1, 93, 41, 64, 4,224, 97, 24, 63, 68,125, 40,114, 4,160, 68, 5,202, 68,222,193,100,160, 90,111, 36,
+199,229,149,152,214, 2,160,241, 62,178,112,134, 70, 97,144, 10, 82, 25, 22,184, 69, 24,206, 80, 6,163, 12,203, 37, 89,131, 38,
+124,160, 14, 54, 1,202, 42, 6, 91,208,193, 18,125, 17,212,128,187,180, 34,192,147,213, 39, 93, 56, 0,180,130, 48, 85, 16,103,
+140, 33, 32, 68,163, 16, 61, 93, 72,202, 72,100, 22,123, 20,240, 78, 60,178, 66,216,198,242,200, 46,145,149, 67, 0,137, 71,116,
+228,251, 20,117,114, 64, 5, 78, 70,211, 45,106, 14,181,177, 12, 1,137, 17, 41, 80, 65, 52, 95,228,224,176, 11, 5,219, 82,202,
+ 88,114,177, 90, 8,203, 62, 47, 70, 2, 76, 64,129, 70,240, 98,137,132, 30,151,183, 35, 46, 46,118, 80,136,232, 31, 14, 88, 88,
+137,118, 33, 17,250, 91,236,247, 15,184, 85, 11,108,206,207,241,228,249, 57, 86,235,150,196, 98,135, 30,251,187, 61,121, 95, 43,
+ 14, 24, 60,254,165, 46,122, 28, 38, 76,195, 64,251,243, 64,200,200,166,177,184,187,160,139, 95,219, 6, 39,231, 39,120,246,226,
+ 49,206, 30,111,217,158,197, 30, 87,214, 33, 16,175,157,254,206,232, 3,137, 20,147, 36,166,123,123,138, 20, 35, 14, 15, 59, 92,
+ 95,222,176, 72, 75,241,197, 75, 57,220,159,156,156, 2,255,252,231, 76, 45,115,252, 79, 13,188,216, 2,135, 61, 94,252,232, 12,
+ 47,110,110,129, 93,194, 95,253,229,175,240,111,127,243, 14,235, 45, 77, 6,180,209, 72,178,196, 46,210,164,202, 24,162,104, 37,
+198, 89, 22,176, 82, 41, 82,199,209,163,109, 45, 93,174, 66, 34, 69, 1,219,128, 71,163, 52, 89, 41, 60,121,165,105, 45,161,117,
+170, 19,178,226,121, 22, 71,222, 89,161,168, 3,215, 37, 79,129, 87,100, 90,139, 10,132,130, 40,233, 89,129,196,123,124, 1, 21,
+120, 72,206,148,130, 88,246,247,213,100,149, 73,197, 94,244, 35,229,103,250,105,196,176,247,244,123,107,139,245,118, 75,221,180,
+144,213, 23, 77,177,193,212,229, 74,205,120, 83, 81, 68,104,153,114,177, 3,229,170, 23,158,133,228,255,134, 2, 79, 18,148,161,
+ 81,186,103,172,171, 82, 25,217,100,196, 3,135,149, 48, 8, 68,105, 5,107, 13,140,161, 60,135, 34,200, 45, 36,202,105,114, 92,
+200, 83,145, 80, 46,234, 92,188,201, 44, 96, 43, 10,103,252, 81,215, 94,152,238,101,111,170, 89, 76,153, 18,193,136,168, 40, 8,
+ 60, 69, 40, 43, 24,134,250,212, 40, 49,212,223, 7, 40, 41,148,168, 23, 55,165,251, 53,104,187, 21, 55, 32,186,170,201,133,144,
+136,137,180, 30,137, 89,249, 49, 80, 55, 27,253, 0, 63,141, 8,110,100,136, 13,185, 10, 50, 7,230,216,166,133,182, 13, 21,218,
+218,212,144, 34,154, 48, 90,164, 68,209,215,161,138, 27, 37, 23, 98,146,201,116,129, 85,146, 20,113,170, 10,127, 63,135, 58, 53,
+ 41,211, 31,138,198,213,117, 61, 89, 52, 82,101,237,151, 83, 34,110,126,121,213,114,206,114,159,153, 13,169,238,205, 75,232,202,
+156,117,158,234,247, 64, 8,114, 19, 81, 60, 10, 63,123, 41, 2,146,126, 62,173,178, 2,233,134,242,156,196, 87,254,222, 50,249,
+240, 49, 84, 55, 4,253,108, 70,207,114,177, 33,164,230,194,130,155, 91, 16, 71,158, 50, 74, 18,164, 50,156,110,202, 77, 51, 3,
+172,132, 36,167,126,202, 28,244, 37, 40, 3, 65,183, 45,133,172,148,106, 67,235, 98,139, 17,204,199, 37,144,130,229, 43, 39, 79,
+192, 98,169,145,125,174,144,255,156, 85,133, 88,120, 71, 94,210, 50,146, 32,181,106,170, 97, 3, 4,133,209,136, 62,178, 15,221,
+ 49,218, 85,192, 31,237,193, 72, 81,152,176, 88, 46,224, 92,224, 12, 91, 69, 65, 31,145,170,241, 66,140, 43, 35,117,201, 95, 90,
+ 41, 69,245,169,131,191,144,153, 85,143,180, 3,244,245,139,112,156,142, 36,120,135,236,217,103,120, 28, 2, 80,118,116,226, 18,
+ 36,142, 71, 0, 0, 32, 0, 73, 68, 65, 84, 8, 33,217,118, 77, 21, 52, 17, 9,207, 0, 49,177,117,143,118,139, 82,240,158, 37,
+ 9, 22,224,144, 8,207, 26,205, 93,180,132,243,190, 38, 0, 21,142,125, 25, 73,106, 86, 40,151,195, 84, 41,137,144,200,191,153,
+107,232,142,193, 52,142, 52,186, 2,117, 61,145,215, 42,244, 96,138, 57,100,160,178, 36,103, 61, 66,221,254,229, 92,247, 59,165,
+107,209, 90,178,152,144, 71,132, 92, 49,230, 68,135, 61,169,176,169, 82,172,136,196,200,171, 27,126, 95, 67,160, 61,169, 27, 71,
+214, 81, 12,240,185,169, 15,118,219, 26,108,159,108,176,222, 44,209,152,140,175,255,254,111,144, 99, 15,187,126,142, 87, 63,122,
+ 5,183,123,143,195,237,119,248,250,226, 15,216, 31, 18, 78, 30, 63,197,179,143,159,225,217,139,115, 8, 4, 28,238,239,113,253,
+238, 61,222,191,185,196,238, 97, 95,109,153,138,159, 1, 99, 53,220, 68, 46, 7, 55,112,133,205, 54,167,171,215, 10,191,255, 91,
+192, 52, 29, 86,219, 19, 60,121,254, 20, 39,231,167, 88,111, 22,128, 72,216,221,221,227,234,221, 21, 66, 8,100, 91,212,138,255,
+ 73, 34, 45, 42,182, 52,150,155, 83,244,187, 61, 78,207, 91,172,182, 43, 72, 37,113,241,195, 53,254,236,203,103, 0,152, 78, 21,
+ 70, 64, 91,190,216, 37,176,220, 0, 75, 0, 75, 9,124,253, 21,254,234,223,252, 87,252,155,255,252, 29, 86, 11,139,255,253,127,
+251, 95,177, 62, 95,226,155,119,183,120,127,127,192, 20, 34,147,247, 50,154, 70, 33, 70,197, 49,162,164,109, 33,229,178,134,146,
+132, 90, 85,202, 98,221, 26, 40,157,142, 58, 54, 58,147,104,181,164,171, 63, 86, 26, 89, 19, 25, 9,118, 81,124,238, 84,140,199,
+ 16,208,180, 13,117, 81,206, 35,241,207,173, 99,110,142,242,204, 57, 99,255,176,167, 98, 60,150,209,168, 67,138,162,178,212, 67,
+ 96,193,147,144,224,166,142, 83,220,202,254, 91,179, 45,202,241,232, 62, 33,165, 17,247, 55,100,131, 10,126,162,233,220, 31, 61,
+179, 52, 85, 2, 68,230,103, 82,234, 57,178,146,113,177,165,107, 43, 99, 90, 64,160,105, 26, 88,107, 1,204, 66,170,192,128,167,
+114, 30, 18,230,215,160, 91,116, 52,201,211, 4,196,114,163,103, 61, 66,152, 93, 49,236,143,207, 12,169,201, 28, 28, 82,253,206,
+ 71, 72,106,160,140,120,203,132, 3,188, 86,208, 44,118,163,137,133, 82,166, 78,199,228,209,148,176,194, 76, 56, 42,182,224, 79,
+ 75, 98, 23,193,168,230, 61,188,210, 6, 77,187,168, 48,172, 84, 38, 63,124, 33,136,226,142, 65,134, 68, 68, 74,164, 83,113,211,
+ 30, 57, 56,158, 30,122,222, 63, 43, 52,221,154,254, 62,211, 66,219, 5, 23,118,170, 50,236, 51, 55, 40,222, 7, 76,211,192,238,
+ 1,125,148, 66, 87,226, 73, 57, 30,152,147,207,200,136,195, 34, 98, 85, 18,208,138,128, 87,240,228,151,207,170,196,171,202, 44,
+ 32, 34,144,165, 56,122,143,129, 28,192,180, 53, 96, 26,135,202, 45,160,230, 53,176,150, 32,212, 98, 54,165, 8,145,232,189,242,
+ 33, 66,170,196,250, 32,174,194,196,172,119, 8,222,115,146,223,255,207,213,155, 60,219,150,158,103, 94,207,215,173,102,239,125,
+218,123,110,147,153,247,102, 74,153,146,108,185, 85, 25,219,184,170, 2, 71, 85, 65,208, 4, 38,130,128,128, 33, 67,130, 1, 17,
+ 48, 97,192,204, 83,102, 4, 35,248, 19, 32, 32,160, 32,168,192,101,187,108,151,195, 14, 35,149,101,149,101,164, 82,102, 42,155,
+155,169,188,153,183, 61,221,222,123,173,175,101,240, 54,107, 95, 75, 3, 73, 41, 41,207,185,123,175,245,125,111,243, 60,191,135,
+238, 65,199, 73,136,133, 89, 1,181,100,228,180, 64,111, 14, 47,111,217,196,211,116, 60,107, 40, 15, 21,132, 14,181,241, 25,193,
+ 1,106, 42,136, 99, 11,165,222, 21,124,249, 27,217,203, 55,192, 15, 99,207,106,204,134,148, 19,143,140,150,241,220, 18,180, 50,
+179,165,130,246, 34, 33,208, 31, 58,132,160, 57,188, 77, 70, 89,222,161, 20,139,113, 53,192,236,105,228, 27,231,153,237, 18,134,
+ 71,213,142,149,213,124, 73,176,125, 77, 80,125, 49,102,144,224, 90, 84,159, 30,182, 17,132,191,235, 3,166,109,212,120,199,253,
+126,210,180, 35,129,226,148, 74,184, 60, 31, 60,179,164, 57, 99,152, 95, 84, 57, 92,164, 99,200,133,132, 60,113, 34, 75, 25, 1,
+ 93, 12,239, 9,139,254,185,114,170,154,110, 38,120, 69, 97, 73,236,119, 81, 99,101, 75, 46,152, 91, 85, 81, 83,228,238,145,176,
+183, 52,218,179,206,106,101, 90, 88,161,191,116, 74, 7,170,103,206,180, 37, 70,116,135, 96, 27,123,132, 35, 31,180, 68,144,202,
+165,232,136,150, 72,182,158, 45, 23,108, 17,226,248,192,156,121,212, 86, 50,124,215,107,231, 96, 29,249,109, 73,173,237, 17,250,
+142, 5,114,140, 4,106, 85, 89,211,242, 2, 19,177,210,145,219,192,114,247,199, 33, 29,150,109, 73,150, 21,207, 42, 86, 49, 30,
+251,220,161,228, 9, 93,231,112,116, 52,224,206,221, 99,188,251,205, 55,241,252,241,251,184,105, 19,206, 46,206,177,218, 56, 92,
+ 63,127,138,139,183, 30,193,117,207,240,233, 79,222,167,116,184,253,115, 60,123,252, 99,252,244,232, 12,247, 31, 61,194,197,253,
+187,184,255,181,111,226,238,163,111, 32,167, 8,107, 43,226,126,143,105,191,195,126,187,197,246,230, 22, 87,175,174, 41,223, 32,
+243,222,188,239,180, 88, 51,214, 96,222,223, 34,206,123,220, 92, 18, 11,127,125,116, 4,223, 13,184,115,247, 2,247, 31, 62, 68,
+ 8, 22,183, 87,215,120,245,242, 37, 94,189,120,133,148, 50,186,190, 35,140, 50,135,108,228, 84,112,125,115,139,147, 93,196,122,
+179,194,171,167,215, 40,239,189, 1,119,123, 3,108, 54,128, 63, 3, 48,243, 37,207,121,204,168, 64,127, 4,188, 0,254,233,247,
+ 30, 99,218, 71,124,237, 98,131, 95,251,143,255, 46,176,234,240,205,109, 4,126,252, 62,190,252,155,143,241,185, 89,227,133,239,
+144,184, 59,110,141,222, 19,154, 84, 88,158,224,200, 62,209, 98, 28,131,182,111,244,189,103,216,222,178,200,102,193,188,182, 86,
+104, 95,103, 45, 26, 63,147,150, 11,200, 20, 27,179, 19, 50, 66, 32,161,102, 48, 78, 69,155, 41, 87, 21,197,154, 86, 94,195,114,
+230,196,136,203,182, 40,183, 73, 12, 75,112, 20,219,220, 65,148,100, 85, 82, 99,173, 70, 59,177,192,118, 48,234, 90, 88,240,202,
+ 12,120,178,254,116,140,177,117,250,115, 96, 40, 36,167, 49,152, 73,248,220,222, 27,196, 10, 14, 46, 33,231, 71,215,119,122,198,
+200,180,177,176, 18,190, 10, 45,210, 59,172, 86, 3,233,116, 60, 21, 58, 4, 25, 73, 42, 48,171,234, 96,161,139, 56,231, 3, 1,
+165,179, 10, 0, 18, 0, 73,227,212, 72,175,233,151,203, 90,164,240,206,223,242, 26, 68, 88, 8,196, 70,169, 7,222,115,104,113,
+ 78, 26,130, 70,163, 90,213, 16, 64, 45,101,222,119,232,251,113, 41,230,100,252, 93,193, 13, 25,233,115,136, 33, 80,145,230, 25,
+105,218, 98,222,223,162,230,153, 11,249, 4, 52, 34,152,117, 97, 68, 55,108, 96,195,128,208,175, 40,160,136,243,204, 41,200,132,
+138,188,105, 46,152,247,123, 6,178, 88,248, 78,220, 2,225, 64, 48,204,136,217, 86,153,223,222,212,194,149, 75,102, 97,174, 20,
+ 92, 85,215,184,146,191, 78, 89, 26,105,209,242,184, 37, 14, 92,138, 23,203,247,147,132,173,136,136, 48,206,145,113,202, 73,193,
+100,181, 25,222,171, 51,205,142,148,113,220, 73, 87, 78,148, 59, 16, 98,114, 74, 31,233,175,162,174,104,228,126, 2,128,220, 10,
+219, 48,235, 65,186, 30,137, 87, 13, 39,189, 25, 41,167, 10,231,170, 75,186, 95,181, 48,166,168,213,174, 73,209,192,130,101,154,
+ 62,112, 94,169,181,240,180,123,113,154, 43, 30, 35, 33, 13, 73, 69,235, 25, 64, 66,163,190,148,104,132, 98, 29, 93,228,125,223,
+ 83,124, 34,135, 39,144, 39,214,105,152, 65,138, 73,187,217,156, 43,166,105,198, 56,246, 40,220,201, 27, 70,186,210, 14,210,243,
+200,106, 94, 18,214, 12, 29, 22,214, 58, 30,145, 17, 2, 81, 16,151, 37,145,122,181,239, 59,254, 29,204, 66,186, 99, 91,136, 68,
+163,154, 82, 57, 90,177,233, 5,147,115,133, 67, 33,180, 38, 63, 8, 93,239,105,151,102,248, 65,227,200, 87, 99, 40, 96,160,212,
+202, 25,202, 29,225, 66,115,225,100, 36, 6,110, 57,226, 6,199,105,210,142,214, 89,139,221,156,152,221,236, 16, 39, 14, 46,169,
+237, 32,217, 40,195,119, 30,211, 52,107,244,167,236,155,100,215,223,224,116, 47, 84,115, 38, 72, 7,239,132,114,169, 58,230,174,
+ 57,195,120,218, 55,145, 16,138, 19,246, 28, 9, 1,189,183,250, 66, 21, 33, 57,241, 75,228,120,135, 46,187,116, 88,163, 93, 17,
+ 81,172,205,146, 26,196,123,156,106, 13, 66, 63,234,197, 86, 88,180,102,172, 97, 69,244, 97,202,145,129, 63,126, 27,123,158, 38,
+173, 87, 61,142,143, 87,184,255,198, 25,142,143, 60,158,236, 94,225,237,119, 31,161,235, 59,218,129,206, 17, 79, 62,250, 9, 76,
+127,134,175,255,226, 47,225,131,127,249, 3,236,182, 91,212, 90,113,115,249, 2,207,191,248,148,160, 63,221,136,163,179,115,108,
+ 78,206,225,251, 21,206, 47,206,112,126,255, 45,140,171,192,120,220,172, 2,150,156, 51,186,224,176,219, 77,136,211,140, 24, 35,
+ 9,120,230, 8,199,211, 38, 58, 64,102, 60,121,252, 83, 60,254,176,162, 27, 55,184,115,239, 14,238,220,123,128,119,190,177, 66,
+205, 17,151, 47, 94,225,217, 87,207, 49,177, 77, 48, 4,234,228, 47, 95,190,196,231,159,124,129, 23,159,221,226, 15, 34,240,198,
+143,159,224,205,251,199,184,255,232, 14,240,230, 49,112,210, 1,227,200,251,210, 6,192,225,179,159,222,224,233,237,132, 6,224,
+ 27, 71, 14, 72, 91,224,244, 12, 56, 30,128,175,122,124,240, 23,239,163, 25,135,247,126,235, 87,240,189, 39, 59,164, 97,192,131,
+135,231,216, 28,143,168,149,194,112, 90, 51,252,125, 86,214, 81,208,200, 53,197,164, 97, 36,162,148, 37, 62, 3, 3, 48, 88,240,
+ 21, 99, 60,152,214, 88, 37, 34,214, 82, 17, 44, 67,157, 88,208,102,216, 30,103, 44,141,205,125, 35,141, 75,215, 5,118,106,136,
+229,137, 84,195, 21, 52,174, 52, 86,242,163,157,186, 73, 2,243,246, 75,109, 10, 10,145, 11,130,108,119,141, 47,115, 15,107,121,
+143,107, 23, 33,159, 28,104, 50,169, 11, 61,225,118,157,138,110,147,238,221,189,163,137, 70,232,250, 37,150,249,192, 75,221,120,
+135, 75,118, 61,139, 16,156, 66,124,200, 49, 66, 59,234,221,118,226,241,120,225,209,114,214, 61,104,230, 49,108,107, 34,188, 74,
+139, 70,133, 71,164,181, 46, 22, 63, 17, 80,153,131,203, 88,127,167,218, 22,151,132,138, 92,205,114,161,243,136,121,209, 92, 36,
+250,238, 37, 29,210, 58,116,221,136,192, 43,151,192,201,145, 82,132, 56,111, 17,140, 71,131,165,221,116, 73, 40,105,194,180,187,
+ 69,142,123,212, 60,233,206,190, 85, 90,171,116,253, 26,227,230, 28,161,167, 46,189,192,193,177,167,159, 87,254,108,247, 37,188,
+ 47, 56,104,171, 54,131,154, 5, 8,100,145,107,211, 51,179, 86,210, 19, 20, 22,160,129,237,120,133,189,229,141, 5,104,244,247,
+ 38,157,150,116,167,113, 90,116, 9,173, 22, 84,231,217,161,228,184,152,178, 26,191, 43,182, 70, 89,115, 80,144,204,164,141, 83,
+202, 34, 6,174,124, 33,179, 82,157,155, 43,103,205,146, 5,193,162,218, 90,210, 1,255,160,161,177,206, 64, 92, 2, 50,161,168,
+ 53,190,246, 93,137,168,211,178, 5,177, 52,163, 29,187,101,145,105,225,187, 7,150,180, 68,212,128, 19, 27,192, 54, 32,151,164,
+118, 64,240,123,224,137,102, 69,212,165,105, 74, 88,173, 87,152,246, 19,239, 63,170, 66,243, 69,172, 64,118,167,136,156,105, 76,
+100, 83,162,202,151,119,224,104, 64,215,123,220,222, 52,149,248,231, 76, 31,182,120, 27, 67, 71,213, 80,223,247,122,232,103, 38,
+204,201,135,107, 88, 4, 34, 44,247, 38, 49,128,188, 55, 17, 97,155,177, 70,211,205,108,112,170,136, 53, 88, 50,158,199,149, 85,
+133,183,140,217,193,251,140,194, 22,180, 16, 2,163, 3, 51,141, 14, 61,237,218, 83,165,138,186,235,137,127, 60,140, 61, 66,215,
+113, 81, 65,154, 3,218, 53,210,158,149,196,104,153,252,150,206,192, 5,143, 24,103,229,223,203, 36, 68,198, 79, 20,161, 73,190,
+204, 24, 19,197,179,242, 30, 41, 56, 81,241, 59,228, 2, 37, 30,165, 73,168, 92,132,127,149,132, 33, 2,246, 16,154, 81,184,197,
+173,146, 0, 78, 84,244,206, 5,173,236, 66,215,147,191,152,247, 81,180, 66,112,252,226,118,180,223,135, 96, 16, 73, 99, 80,234,
+226,195, 36, 17, 23,217,124, 72,143, 65,121,224,141, 71,128, 4,206,161,135, 90,128, 57,214,247,176,227,125,228,235,136, 16, 44,
+ 54,155, 30,231,119,142,240,230,163, 11,108,159,125,130,187, 15, 46, 52,175, 56,165, 61, 74,109,120,254,229, 19, 76,251,143,240,
+242,252,109,252,194,111,254, 93,124,242,163, 31,226,201,103,159,169,168, 47,198, 25,102,191,199,238,246, 10, 95,126,246, 9, 71,
+239, 6,116,227, 6, 71,167,103,120,240,214, 61,220,185,119,138,243,139, 99, 12, 67,192,238,118,143,235,171, 91,236,182,147,170,
+173,189, 31,208,245, 43,116, 67, 71,104,223,102, 52,184,135, 96, 47, 22, 41, 82, 90,219,228, 13,134,113,196,221, 55,223,196,241,
+233, 57, 90,203,216, 28,141,168,181,226,242,229, 21,118,219, 61,158,253,236, 10, 67,232,241,234,114,135,237,118,198,103, 63,123,
+133,245,143,159,224,120,237,113,113, 50,224,237,135,167,112,111,157, 1, 23, 27,160,183,248,127,191,251, 1, 42, 12,110,211, 14,
+ 62,238,129,159,252, 24, 24, 45,112,239, 1,112,247, 4,255,198,127,242,171,120,255,123, 79,241,239,254, 55,255, 35,182,200,136,
+104,120,100,239,224, 63,248,183,126, 13,255,245,127,245, 59,248, 12, 6, 87,115, 66, 9,142,179,165,185, 96,179,180, 34,104,181,
+161,235, 45,166,253,204,157, 56,244,192,107,236,182,232,122,207,107,151,166, 22, 46,112, 54,132, 92,144,164,190, 61, 84,158, 55,
+180,230,200,155, 95,178,238, 25,227,156,248,146,106,203,197,201,226, 38, 42, 58, 36, 99,251,111, 69, 25, 91, 58,172,104,188,207,
+ 25,245, 48,140,134,165,125,185,231, 81,172, 4,158, 88, 3, 5,231,144, 19, 5, 58,189,232,135, 30,109,162,244,171,190, 39,160,
+207, 48, 44,113,206,148, 56, 71,100,187,148, 50,226, 60,169,133,208, 89, 58,111,134,177,167, 38,132, 47,195, 28, 51,219,116,137,
+ 79, 31,231,153,157, 63, 9,153, 93, 39,214,154, 69,159,196, 30,102, 25,245, 74,225, 36,226, 66,103, 9, 35, 43,108,124,154,110,
+155,131, 8, 88,171,249,222, 49,103,181, 86,137, 19, 5, 26, 96, 82,232,191,115,130,224, 38,186,161,239, 2, 66,232,153,211, 97,
+ 53, 9, 47,114,234, 87, 3, 21, 18, 41, 39,228,121,135, 52,237,144,211,132,154, 39, 30, 21,179, 0,203,123,116,195, 17,250,241,
+152, 46,244,110, 5,235,123,142,152,134,226,180, 35,139, 69,247,187,253, 50,193,224, 21, 0, 49, 63,154,134, 38,201, 26, 1,166,
+234, 84, 80,196,101, 57,165, 3, 7,128, 99, 97, 49, 59,119, 26,208,210,196,190,242,194, 34, 65, 42, 0,172, 76, 59,185,144,106,
+172, 49, 0, 7,207,104,195, 87, 43, 1, 98, 88,152,109,125,167,103, 29,173, 89, 51, 59, 1,120,128,234, 73,147, 84,170,225,243,
+174,162, 36,246,156, 84,182, 75, 58,199, 90, 14,137,112, 53, 92, 84,100,133,216,208, 58,198, 82,115,204,100,198,170, 43,135, 69,
+105,159, 19, 33,117,155,104, 79, 80,152, 39, 98,153, 32, 71, 19,236, 37,233,148, 62, 63, 47,218,123, 98,190,211, 75, 86, 89,129,
+103, 76, 62, 0,203, 88, 30, 84, 83,146, 80,201, 5,232, 73,184, 16,124,224,202,208, 50,196,194, 97, 28, 71, 26,219,165,196, 35,
+ 38, 30,255, 57, 15,107, 11,194, 24,248,101, 44, 64, 58,140, 65,132, 42,229,115,110,176,174,160,121,167,185,236, 34,188,241,222,
+161,194,243, 65,226,216,234, 32,209,153,164, 26,239,122,143, 97, 53, 48,254, 53,243,184,177, 32,167,170,180, 56,176, 53,194, 48,
+ 34, 54,165,138, 97,236, 73,208,229,157,142,126,228, 3,147,209, 52,169, 95,179,242,123, 67,231, 49, 79,116,176, 17, 24,135,232,
+112,173, 26,246,190, 50,188,197, 27,152, 44, 2,193,202, 65, 6, 77, 81,161,100,115,240, 76, 8,163, 9, 74,230,252,250, 28,137,
+112,150,115, 98, 72, 71, 81,241,154,236,226,187, 46, 80,161,147, 73,253, 78,145,144, 28,225,231, 3,251, 33,229, 65,171, 7, 30,
+226, 78,133, 59,174, 11, 60, 46,171, 58,233,168,188, 55,247,146, 28,197, 66,145,214, 40,166,212,178, 53,166,178,117, 45,167,229,
+192,161,200, 64,234,236,252,250, 1, 82,113,240, 78,112,170, 35,222,120,120, 7,182, 77,120,241,236, 57, 11, 84, 12,226, 52, 97,
+119,187,195,229,243,151,200, 49,162,213,130,155,103, 31,227,175,254,252, 18,191,248,235,127, 7,239,124,243, 61,252,245,119,255,
+ 18,183, 55, 55,154, 76, 85, 10,116,122,208,106,197,188,203,152,119,151,120,249,213,231,148,146,118,114,138, 71, 95,127,132,135,
+ 95,123, 11,239,254,252,123, 40,185, 96,191,221,225,230,250, 26,215,175,110, 40,202,115,159,176,187,161, 34, 51,231,130,253,110,
+135, 56,207,136, 49,241,243, 65, 35,224,126, 92,227,244,252,140, 3, 82, 10,118,183, 59,132, 16,240,240,157, 55, 48, 14,107,228,
+203, 25,171,163, 99,212,210,144, 80,104, 87,152, 11,182,219,134,103,207,111,240,225,167, 47, 48, 4,139,139,179, 17,155,206,224,
+207,191,255, 41, 86, 99,143, 82, 11,142, 6, 15,220,220, 0,223,253, 43,224,235,239, 0,131, 1, 30,222,193,201,119, 31,227, 25,
+246, 40, 0,254,145, 61,195,186,171,248,232, 7, 31,226,206,119, 30,226,206,186, 7,174,182,248,228, 47, 63,197, 39,151,147,134,
+ 32, 25, 67, 69,123,225,245,210,106,179,214,203, 70,196,152, 33, 56,181, 63,209, 74, 8,188, 19, 23,220,114,143, 56,205, 8,220,
+105,139, 43,195, 7, 7,195, 9,119,253,208, 33,205, 13,153,247,178,214,121,196, 52, 49,149, 77,108, 87,141,242, 10, 88,203, 33,
+145,197, 6,139,253,147, 52, 47, 52,233,233,186,142, 2, 63,102,178,130, 58,177,224, 97,137,109,166, 52, 45,192,241,106, 13,156,
+223, 77, 10,126,218,223,110,216,249,162, 26, 0,107,120,143, 79,251, 86, 89, 11, 73,138,150, 20, 24, 34, 38,116, 28, 56, 83,114,
+ 89,248,108,173, 34, 39,234,234,231, 57,170,208,213, 26,131, 92, 23,148,173,116,203,130, 91, 54,102,217,147,162, 73,151, 90, 15,
+152, 25, 70,145,205,170, 87, 64,211,142,159,238, 60,142, 16, 45, 69,197,114,149, 29, 38,100,133,162,104,226,208,245, 12, 97,241,
+ 68, 26, 11,157,126, 55,250,185,137,214, 33,206, 72,243,158,186,243,146, 22, 75, 21,200, 82,229,187, 17,227,234, 24,214,119,176,
+ 97,128, 13, 35, 90, 35,177, 96,232,188,134, 91,181, 70, 23,216, 60,199, 37, 49,142,227,176, 43,127, 95,206, 49,114,182,208, 20,
+ 5,173,194,153, 10, 27,130, 78, 81, 11,191,243, 68,168,147,166,165,232,154, 68, 32, 60, 37, 87, 22,247, 10, 60,198,211,197,104,
+ 28,103,154,211,157,101,140,132, 24, 57,181, 17, 54,206, 16, 81,123, 32, 11, 56, 73, 40,110,244,190, 49,198, 40, 81,208,123, 15,
+148,172, 13,175,225,240, 21, 21, 3,231, 66,171, 37,107,168, 80,225, 63,115,173,146,191, 46,235, 38,214, 27,241,243, 86, 36,147,
+225, 32,186,213,250,192,171, 30,163,247,107,147,248, 92, 6,138, 44,206, 24,168, 55,222,231, 68,213, 69,158, 35,179,218, 73, 92,
+ 81, 12, 48,207, 51,169,183,173, 69,232,189,166, 27, 9,142, 48,197, 8,191,162,139,178,115,157, 86,160,214, 57,244,131,209,125,
+ 60, 41,103, 3,128,172, 56,212,146, 11,108, 32,106,220, 48,200, 8,154,173, 60,124, 65, 53,199,201, 98,185,192, 27,242, 15, 82,
+134,184, 69,205, 70,121,202,251, 29,133,116,152,234, 88,213,184, 68,170, 74,154,220, 66, 61,195,130, 23,180, 22,222, 57, 86,192,
+ 27, 20,166,102,197,200,220,223, 66, 9, 88,165, 52,180,148,105,132,229, 73,197,158, 35, 87, 92,156, 17, 79, 10,235,194, 30, 98,
+ 14, 27, 56,168,246,112, 16,223,153, 18, 77, 37,170,238, 70, 42,217, 75,204,178, 4, 91,173, 6,238, 80, 28, 60,239,126, 42,243,
+127,173,105,136, 28, 76, 32, 2,184, 90,170,118, 55,168, 96,255,184,209,100,173, 90, 43,226, 52, 83, 65,196,137,119,134, 25,225,
+ 34,194,105,104, 8,189,231, 67, 67, 42, 63,222,157,242,206, 74,214, 20,214,123,206,137, 95,113,134, 60, 21, 9,193, 89, 76,251,
+ 73,149,154, 41, 70,181,103,133,174, 67, 56,121,136,219,151,145, 67, 90,122,156, 95, 28,225,236,124,141,191,252,103,191,135,235,
+ 87, 47,153, 53, 13, 76,251,137, 18,185,120,207, 24,186,158, 70,157,183,207,240,151,127,252,135,120,251, 91,191,132, 95,251,237,
+223,198,147,143, 63,194,199, 31,124,136,105,191,167, 93, 30, 11,115,186,161, 71, 73,180, 34,162,253, 91,198,237,245, 37,126,244,
+131, 75,252,171, 31,254, 24,155,163, 35,220,185,119,129,211,139,115,172, 55, 35,142,207, 78,145, 18,229,113, 75, 84,103,206, 25,
+199,233, 8,149, 35,132, 75,230,176, 17, 67,240,162,146,119,184,185,218, 99,125,116,132, 7, 15, 31,192,152,138, 23,207,158,225,
+233,251, 79,208, 95, 94, 82,231,181, 58,226,189,178, 81,184, 76,140, 25, 41, 27,220,222,102,188,124,181, 69,142, 9, 95,189,218,
+147, 87,181, 53,188,255,228, 26,248,224, 57,112,113, 4,164,199,192,233, 10, 24, 3,126,248,170, 96, 15, 96, 3,131,255,238,191,
+248,109,124,251, 63,252, 21,224,197, 22, 56,237,128,213, 6,240, 21, 95,251,133, 11,124,254,199, 31,163,244, 29,139, 25,161,221,
+158, 21,186, 26, 42,235, 91,232,157, 18, 32, 71,227,152, 79, 11, 79,108, 5,217, 7,102,131,205,113, 80,173, 80,140, 25, 61, 43,
+167, 91,171,234, 83, 39,234, 90,193,170, 54,122,214,152,120, 88,121,172, 46,235,151,208,117,234, 90, 16, 46, 56,173,225,178, 88,
+114,152,165,207, 24, 92, 99, 88, 27, 66,135,161,239,122,141, 62,166, 72, 79,154, 0, 52, 35,112,152,142, 59, 36,246,117, 55,154,
+230,228,152,216,210,190, 20, 21, 53, 23, 76,251, 9, 41, 37,236,110,119, 36,170,147,119,166, 16, 43,195, 49,187, 67,136,147, 49,
+102,125,159, 39, 78, 7, 51, 60, 73, 20,111,186,164,185,137,198, 69,240,159,220,235,105, 19, 35,254, 98,107,196,122,181, 88,222,
+156,243, 42, 32, 44,117,193,160,210, 36, 0, 58,105, 36,106,154,196,113,114,180, 39, 35,112,189,239,216, 61,211, 41,147, 35,231,
+ 12,240,154, 35, 83,254, 41,230,105,143,146, 39,181, 95,149, 60,115, 26,156, 67, 8, 61,134,205, 49,140, 9,176,174,131, 11,131,
+ 10, 81, 29, 35, 89,165,235, 78,145, 28, 39, 85,125, 87,178, 66,245,122, 41,138, 59, 68, 72,158,214, 54,216,208,163,230,196, 24,
+235,162,147, 89,177,209, 9,183, 62,151,172,107, 10, 42,222,185,144,169,145, 48,209,168, 0,220,107,218, 3,212,204, 73,104,102,
+241,159, 91,138,125,109, 57,163,177, 94, 74,114, 48,100,202,178, 36, 19, 90,250,123,212,134, 20,171,234,179, 40,114, 56,106,246,
+ 72,101,168, 19,216, 65, 84,138,225, 98,162,112,192, 78,123, 45,209,142,196,157,134,139, 21,175,174, 16,210,249,176,224,142,199,
+238,165, 45, 56,247, 74,131, 13, 42, 4, 89,111, 98,157, 69,102, 17,158, 87, 50, 19, 87,108,228, 75,173,203,216,155, 95,196,194,
+ 81,130,228,217,244,156,204, 54,147,197,234,216, 99,191,219, 83, 76,231,122,212, 15,174, 99,101,169, 8,122,156,117,228,202,108,
+132, 85,181,140, 56, 77,169,113, 80, 12,237,240, 36,164,196, 88,131,113, 53, 96,154, 18, 76,240,100, 25, 59,200, 71,151,181,136,
+252,238,172,240, 99,129, 79,193, 48, 24,166, 66,209, 88,177, 52,195, 98,181,162, 84, 40,177,233,165,148,149,207, 59, 12, 1,187,
+109, 81,161, 5,121,157,249,231,115, 48, 68,140, 76,124,178, 52,118,163, 42,191,106,119, 92, 57,225, 71, 98,253,140,133,126, 41,
+ 29,179,176, 11,119, 11,158,133, 62,242,121, 43,121,139,173, 35,187,219,157,198,166,150,156,144,227,196, 35,183,170,187, 55, 90,
+ 23, 80, 48,135,164,191,161, 86,205,131, 54,188,187, 34,127, 60, 17, 1,101, 52, 36,162,200, 90,201, 97,224,248,133,162, 46,161,
+106, 81, 4, 48, 46,177,210,103,236,124, 0,172,103,122, 26,125, 1,153, 73,116,137, 85,211,243,204, 35,238,218, 96,250,115,228,
+ 26,224, 92, 68, 8, 14,155,205,128,251,111,158,227,250,249, 19,124,249,248, 99,182, 11, 86, 30,225, 82,183,182,168,136,232, 69,
+233,250, 1, 57, 23,124,254,225,223,224,201,227, 79,240, 11,255,218,175,225, 55,223,124, 3, 31,255,228,125,124,254,233, 99,174,
+188, 41,174,182, 27, 71,178,117,213, 6,231,141,238,188,188,111,184,190,122,133,219,155,107,124,250,209, 39, 88,109,214, 56, 58,
+230,216,212,190,131, 15, 14,113,158,201,166,148, 18, 51, 18, 60,219,191,232,178,235,250, 97,217, 75, 58,143,105,183,197,209,201,
+ 49, 78,207,238,192,223,141,184,220,101,236,159, 62, 71,184,111,129,245,102,193,142,178,199,187, 85,113, 86, 87, 76, 49, 35, 38,
+234,220,188,181,248,103, 79,158,227,191,252, 31,254, 12,247,142, 71,124,237,222, 17,190,253,206, 57,142,143, 71,252,207,255,247,
+ 95,147, 77, 8, 6, 23,191,240, 30,240,157, 95, 5, 2,241,187,177,189, 6, 94, 93, 2, 87, 79,241,247, 47, 26,126,255,171, 45,
+127, 22,150,199,195,150, 15, 98,199,235, 37,175,105, 99, 68,120, 35, 45, 65, 97, 96, 84,138,137,169,111,172, 34,231, 76, 3,209,
+ 99,100, 6, 23, 9,143, 33,197,140, 56, 71,210, 84,112,144,143,239,122, 85,209,199, 57, 29, 88,146, 0,223, 81, 65,141, 3,190,
+129,116,156,198, 58, 12, 12,108,113,140, 76,150,208, 28,239, 45,166, 41,161, 11,142,119,213,228,223, 46, 18,230,196, 98, 65,239,
+140,198, 17,203, 58,143, 98, 62,163, 22, 55, 41, 38,164,148,105, 66, 35, 26,152, 6, 52,126,199,137,186,182, 48, 24,100, 77,216,
+ 88,212, 84,152,115, 95, 57,130,180,148,204,235, 38, 22, 69, 49,140, 68, 2,114,164, 35, 44, 69,244, 40,137,127,151, 69,111, 98,
+ 32,135,124, 80,113, 43, 57,137,200,162,122,152,196,183, 40,250,139,174,224,140, 76, 92,172, 71, 63,172,225, 67, 15, 31, 58, 10,
+107,169,226,222,225,241, 61, 72,160, 53,239,183,168,101, 98,228, 54,237,212, 5,200, 21,186, 1,227,250,132,222,115,227,121, 82,
+ 66,171, 70,231,173, 78, 14, 74, 46,216,239,103,196, 56, 83, 99,101,192,211, 62,234,152, 75,109,108,243,204,156, 25, 95, 25, 30,
+197, 35,100,246,128, 19,216,170,233,232,156, 58,225,170,212, 67, 97,163, 44,104,215,136, 90, 34, 39, 47,122,221, 47,211,191, 46,
+187,120,113, 69,229, 2, 22, 17, 51,207,221, 46, 58, 0,137, 42, 46,236,193, 39,232, 80, 83,154, 40, 90,227,198,161,170,143,125,
+ 89, 65,209, 51, 88, 90,101, 59,101, 85, 60,177, 4,146,121, 31, 56,171, 65,220, 34, 18,212,196,116, 58, 94,179,192,200,234,134,
+236,152, 41,237, 57,200,135,214,161,198, 84, 45, 32,205,129, 62,130, 2, 0, 12,188,204,226, 51,239,105,188,119,176,134,198, 94,
+212,141, 36, 89,241,210, 5,196, 54,151,142, 45, 45,165, 22,108,183, 59, 28, 29, 31,105,232, 72,224, 46,193,243, 23, 79, 63,124,
+166, 78,155, 43,149,146, 43,250,245,128,146, 35,239,156,132,160,100,121, 23,158,129, 92,113,117,121,203, 41, 90,157, 94,216,178,
+211, 67,245,168,166, 49,141,167, 80, 86, 47,172, 86,193,198, 58, 37, 36,249, 96,217,183,189, 92,122, 18, 98, 81,106, 99,180, 32,
+ 85,232, 57,147, 72,162, 54,195, 95, 36, 29, 64,149,191, 32, 33,135, 53, 99,104,175,206,138,106,217,237, 24,222, 81,213, 92, 84,
+ 33,235,188,211,208, 1, 41,164, 8, 40, 67,194, 29,217,177,117, 93, 80, 27, 77,201,141, 46,242, 68,213, 40,189,180,149,233,125,
+ 20,145,104,189,248,152,217,118,198, 49,137,144,253, 36,199, 45,202,129,186, 88,189,196,142,181, 8,133, 66,215, 43,133, 78,130,
+ 21, 4, 28,228,248,240, 49, 48, 48,206,194,119, 52, 89,112, 62,104, 10,145,178,139, 57,188, 98,218, 79,212, 53, 32,195,120,143,
+112,242, 8,219,125,132,119, 22,171, 85,143,243,139, 99,156,223, 89,227, 15,254,151,255,147,254, 44, 69, 80,141, 18,198, 33, 88,
+ 84, 74, 5,132,190, 28, 14, 49, 53,228,249, 22, 63,250,222, 95,224,193, 59,239,226,221, 95,252,101, 60,120,248, 22,126,250,175,
+222,199,246,118,187,196,101, 50,159, 91,194, 24,188, 55,186, 91, 20,119,199,126,123,131,105,191,195,229,203, 14,171,205, 6,231,
+ 23,119,176, 62, 26,209, 15, 3, 51,170,111,113,115,117,141,155,235,173, 98,125,133, 24, 23, 66, 32,135, 69, 8,216,111,119,120,
+245,233, 43,156,216,128,205,131,187, 24, 78,143,145,231, 25,213,189,206, 61,247, 65, 14,242,202,106,117,122, 94, 60,135, 75, 92,
+161,226,127,122,254, 57,218,243,134,240,145, 65,248, 11,122,101, 39, 52, 84, 0, 3, 60,198,205, 26,232, 70, 96, 53,128,232, 50,
+ 35,176,138, 64, 44, 48, 23, 3,222,189,186,198, 71, 51,225, 58,199,224,116,250,146, 34,219, 80,115,194, 60, 17,171,188, 31,123,
+220, 92, 77,164, 88,103, 98, 23,233, 9, 10,226,204,171,159, 92,244,114,115, 22, 58,126, 36, 62,117,102, 2,159, 20,254, 86, 33,
+ 80, 66,137, 35,175,246,146, 89, 64, 35,233,138,224, 45,195, 73, 72,180,229,189,125, 13,188, 65, 40,226, 5, 87, 13, 52, 12, 67,
+224,137,160, 81, 21,115,222,237, 57, 26,180, 48, 38,182, 2,178,207,231,162,151, 68, 84, 52,129,203,153,176,174,211,126,210,252,
+108,129,130, 72, 48, 19,141,207,169,144,239,123,203,156,123, 74, 80,243,157, 99,252, 52, 21, 11, 37, 31, 94,184,141, 47, 34, 97,
+ 30, 64,201,114, 58, 21,209, 96, 37,241,243,147, 3,193,184,165, 16, 17,229,180, 10, 98,154, 36, 55, 54,125,111,151,168,104, 86,
+111,135, 1, 62,244,228, 29, 15,129,221, 1, 65,149,211, 51,199, 11,183, 76,186,128, 20,103,234,202,173, 1, 74, 98,175, 53,141,
+234,251, 97,131,208,175, 96, 92, 96,208, 75, 37, 12,171,101, 90, 31,168,227,142,251,200,171,170, 61,159,153, 52,197,132, 49,216,
+239,147,194,189,248,170,166,243,194,210,231,233,250, 30,176, 6,133, 45,115, 34, 76,166,221, 54, 61,191, 53, 39, 22, 41,146,185,
+173,240, 56,187,164, 25,181, 70, 6,164, 5, 14, 73,225, 56, 89, 88, 93,135, 88, 71, 63, 3,198,193, 91,163, 83, 68,103, 27,119,
+249,230, 64,100,188, 36, 87,202,234,168, 52,206,194,104, 21, 45,211,101,157, 82, 97,150, 0, 79, 75,234, 98,153, 52,156,243,209,
+248,238, 16,118, 73,102, 29, 1,145,242, 12, 74,201,180, 51,111, 88,178, 51, 74, 93, 8,156,206, 33,229, 4,231, 59,246,222,155,
+ 37,167,133,145,191,185, 20, 21, 24, 54, 48,120,233,223,255,173, 95,253,221,156,104,196,238,236, 1,133,136, 91,122,107, 12, 18,
+251,186,105, 12,212, 56, 75,124,153,227, 23, 94,252, 11,188,198,170, 87, 81, 68, 8,237,181, 4, 53,207, 33, 22, 57, 87, 5, 57,
+164, 20, 53,234,211, 48,173,170,239, 59, 86,139,202, 56,221,243,197, 71,113,117,125,231, 15, 70,189, 22, 33,116,228,193,229,180,
+161,113,236, 57,141,140,236,114, 98, 99, 3, 11,111, 36, 46,211, 26,167, 98, 34,203,137, 62,173, 25,177,253,169, 74,150, 72, 70,
+ 84,184, 8,189, 46,167,140,105, 71, 41, 92,161,243, 26, 31,233,157,209,253,190, 4, 11,144, 15, 56, 49, 33, 47,171, 7,189, 31,
+ 6, 66,222,242, 69,145, 11, 17,172, 74,202,186, 71,175, 37,161, 11, 34, 88,108, 7,145,139, 75, 42,221,114, 24, 26,221, 57,170,
+ 74,211, 57, 93,141, 40,183, 24, 84, 68, 88,222,231, 75, 39, 87,106, 85,205,128,172, 50,104,186,210,241, 1,215,195,119,157,142,
+137, 28,199,205, 54, 14,190,153,167, 9, 41, 70,214, 98,240,197,236,143, 96,199, 55,200, 17, 49,120,156,223, 57,194, 59,239, 61,
+192,211, 79, 63,196, 7, 63,252, 1,143,235, 36,224,162,113,145, 34, 10, 93,210,122, 72,210, 86,227, 96, 25,176,226,117,218, 94,
+227,249,211, 87,184,120,240, 38,222,126,239, 29,172,120, 90, 20,186, 14,227, 72,176, 26, 26, 55, 59, 18, 34,242, 69,223,245, 29,
+ 12,131,142, 66, 8,186,183,220,239,119,184,189,222, 98,154, 34,237,161, 87, 43,172, 54,107,172,214, 35,101, 31,100, 42,228, 98,
+140,216,110,119,152,166, 25,183, 55,183,120,249,244, 18,223,253,227, 31,227,241,135, 95, 32,199,130,205,233, 6,171,187,231, 88,
+157, 29,115,156, 34, 19, 4,217,151, 45,135,163,183, 22,119,206, 54,120,239,209, 5,126,241,221, 7,248,185,187, 15,240,243,235,
+ 11,108,110, 44,108,105,216, 34, 33, 46,110,119,156,161,199, 55,223,120, 7,253, 87, 87, 56,125,122, 9,179, 57, 6,206, 31, 2,
+214, 98,254,243, 31,195,143, 43,124,249,254, 19,124,190,163, 98, 86, 84,212,212,137,115,103,157,178,242, 20,230, 41,106,200,133,
+168,214,169,115, 46, 10, 39, 34,129, 79, 98, 97, 39, 41,172, 73,131, 48,107,183,154, 18,137,155, 44,150,224, 32,177,168,102, 73,
+207,170,228, 69,119,236,150,145,239,130,224, 49,172,201,112, 94,197,150,149,243, 11,196,226, 36,118, 92, 73, 12, 91,160, 46,132,
+205, 53,252,108,203,248,221,176, 93, 85,198,233,148,218, 55,161, 20, 42, 58,229,240,173, 44,136,181,220,185, 81,151, 20, 48,114,
+204,106,232, 2,197,198, 98,129,105,197,148,232,239, 55,199,215,104,127,153, 67,106, 4, 62,179,136,189,140, 78, 65, 15, 65, 59,
+ 11, 47,130, 46,222,190,163, 51,108, 92,141,252, 46, 47, 98,174,156,242,223, 10, 82,226,207, 57, 83,180,179,247, 61,250, 97, 68,
+ 55,140,232,250,129,223,119,230,116, 48,119, 3, 45,179, 37, 54,233,174, 23,181,160, 22,218, 99,119,253,136,213,230, 4, 97, 88,
+195,186, 0,195, 98, 45,193,111, 11,179,160,129,196,179,243, 28,233,179,172,242, 59,114,230, 69,229,169,101,101, 92,111, 91,162,
+ 97, 37,131, 60,231,140, 86,146,230, 85,104,156, 45,103,102,148,156,208,176,144, 43,201, 62, 72, 99,119, 77,162,179,158,232,106,
+138,205,110, 75,224,149, 11,186,198, 52,188, 2, 32,218, 93, 85,161,168,172, 37, 12,167,117, 90,179, 48, 75, 52,246,186,102,245,
+151,107,184,150, 88,192,121, 74,130, 70, 77,152, 36,158,138, 85, 84,118,190,202,204, 87, 40,167,103, 91, 27,111, 93, 89,224, 41,
+ 52, 84,186,172,151,204, 17,192,168,125, 81,238,150,198,213,239, 2,139, 50,112,255,206,111,252,242,239, 90,222,167, 90,101,161,
+ 27,141,220, 52,172, 70, 39,161, 80,101,213, 37, 94, 3, 7, 56,103,181,187,236,250,160,240,151, 42, 9,105, 60, 90,243, 12, 61,
+144,164, 40,177, 14,177,163,158, 43,111,246,188,242, 31,160,235,123, 18,101, 57,143,194,225, 47,180, 47,174,138,142,205,137,201,
+112,206, 50,203,217, 97, 24,123, 12, 67, 7,107, 23, 37,173, 88,155,186, 46, 32,229,170,169, 59,196, 68,103, 31,187,165, 4, 0,
+171,128,139,229,207, 41, 7, 32,253, 89,168, 8,152,167,121,209, 18, 88,218, 81, 9,206, 81,148,147, 48,148, 72, 38, 15, 73,156,
+ 35,140,163,177,100,215,247,220,241,209, 40, 82, 98, 49, 83, 76,200,115, 66,232, 44,231,211, 71, 30,229,208,129,108,152,125, 13,
+ 22, 5,214, 3, 69,173,230,192,243, 69, 78,147, 19,192,119,244,114,202,133, 34, 18, 81,153, 36, 20,174, 18, 9,189, 91, 85,200,
+ 68, 89,192, 84,220,132,224, 52,178, 19, 44,234,147,201, 72,101, 42, 88,156,247,216,239,247, 68, 17, 75,244, 50, 12,103,223, 68,
+204,116,137, 29, 29, 15,184,255,224, 12,247,238, 31,225,159,255, 95,255,152, 68,137, 34, 26,145,232, 66, 46, 88,132,153,208, 56,
+ 63, 94, 30,106,231,105,114,226, 68, 48,130,130,151, 79,159,162,193,227,252,222, 61, 60,120,235, 62,186,190,211, 2, 76, 52, 22,
+150, 11,151, 16, 60, 50,251,129,229,207, 40,200, 80, 25,147,237,247,123,220, 94,223,224,242,242,154, 40,135,161, 67,223,247, 24,
+ 87, 35, 54, 71, 27,172, 55,107,138, 0, 46,130,128, 4,214,155, 1,102,232,240,249, 23, 47,240,163,159,252, 12, 83, 53,184,251,
+230, 29,172,143,214,240,206, 80,209,215, 26, 76,227, 49, 53,219,122, 86, 99,135,177,243, 88,175, 7,156, 28,175,112,255, 98,131,
+159,123,239, 77,124,231,189,183,241,203,119,223,194,119, 46,222,194,195,182,198,201, 28,240,246,241, 5, 30, 61,186,143,159,125,
+241, 18, 63,121,255, 43, 92,126,122, 5,251,248, 75, 60,253,222, 7,248,111,255,251,223,195,151,207,175,241,170, 24, 84, 75,113,
+181,153, 83,180,136,162,152,148, 63, 45, 33, 72, 18, 37,106, 84,111, 82,149,253, 14,254,220,165,187,150,220,121,201,208,206, 41,
+ 49,112,138,254,253, 60,209,142, 57,177, 30, 39,206, 51,119, 91,153, 47, 69,202, 81, 23, 97, 85,213,108, 0, 66, 42,247,195,160,
+160, 37,107, 27,139, 81,161,103, 14,157, 97, 77, 9, 91,181, 20,237,200,165,195,165, 63,175, 97, 49, 91, 86,166, 67,201,153,109,
+185,133, 39,107,139, 59, 7, 7,209,149,116, 74,226, 42, 45, 0, 0, 32, 0, 73, 68, 65, 84,160, 18,127, 62, 48, 69,206, 8,238,
+152,215, 38,214,145, 85,112,187,221,179,248,118,225, 48,104,162,150,210,201, 14, 73,111, 77,227,175,244,226,145,145, 50, 63,143,
+125,223, 99, 28, 7,158,126, 65,115,239, 41,100, 38, 31,132,194,200,250,173, 0, 53,163,235,105,186,212,179,189,212,251, 78,152,
+128,124, 25,209, 42,163,230,130,105,154,249, 98,100, 13, 80,161,245,136,239, 6, 12,171, 35,132,126, 77, 78, 21, 23,212,249,228,
+120,165, 65,164, 69,234, 78,167,253, 68, 65, 74, 73,114,213,137,148, 41,184, 89,192,242,232,222, 28, 8, 13,237, 65,182, 4, 41,
+190, 91, 43,186,170, 44, 60,225, 20,178, 41, 64,231, 64, 74, 51,235,149,178, 22, 80, 46,116, 48, 54,104,144,140, 97,111,183,117,
+ 94,115,226, 45,163,206,219, 1,108, 75,154, 82,171,128, 62,206,179,224,103, 95, 62,175,122,192,209, 95,198,220,141,197,202, 85,
+ 83,225,150,176,155,162,255, 31,195,238, 25, 17,166,138,138, 93, 10,178,156,179,106, 77,180, 40,228,203, 95, 65,171,198, 28, 68,
+163, 19,133, 79, 38,150,130, 56,167,213, 5, 89, 66,141, 49,240,214, 24,184,224, 56, 23, 61,195, 59,163,204,221, 97, 28,105,135,
+155, 50,198,149,197,180,223,107, 5,106,173,227, 17, 48,121,248,122,254, 82, 68,189,222, 56, 85,204, 58,143,121, 63,209, 8, 47,
+ 21,218,177,113,245, 50,174, 89, 53, 89, 11,124, 8,216,222, 78,100, 17, 99,156, 31,137, 13, 88,200,151,201, 78, 38, 21, 73, 63,
+244, 28,169,153,153,226,211, 16,122,199, 83, 2, 14,151,137, 9,195, 16, 20, 39, 72, 42,244,142,237, 47, 78, 87, 14,180, 63,163,
+ 75,121,158,146,162, 99,107,109,240, 93,143, 56, 71,205,180, 37, 29, 0, 93, 0,187,221,158,119, 88,150,128, 26, 76,134,179,150,
+172, 46, 80, 48,193,114, 49,213,214,208, 13, 29,127, 97, 86, 67, 7,172, 49,176,161,131, 49, 22,105,142,154, 69, 61, 79,244, 32,
+123,207,159,181, 49,172, 83,104,252,240, 23,125,120,114,206,236, 67,133,166, 58, 9,154, 80,210,221,172, 51, 11,183, 29, 11,162,
+183,230,194, 33, 3, 96,133, 55,184, 11, 7, 31,240,132,170,165, 49, 23,253,211, 50,226,177, 53, 42, 10,115,169, 72,243,132, 24,
+231,165, 75,171, 21,190, 63,129,237,143,128,219, 9, 93,231,177, 57, 26,241,224,173, 59,120,255, 7, 63,192,205,245, 37,239,243,
+101,204,203, 59,249,148,208, 82, 68,215, 15,136, 51, 11, 45, 13, 17,246, 42,195, 25,188, 55,156,146,199, 81,149,166,225,233, 23,
+159, 97,119,123,139,187,111, 60,192,157,251,247,113,126,247, 2, 87,175, 94,225,234,213, 53, 7,162, 48, 74, 54,101,126,217,100,
+138,195, 66,164, 90, 85, 79, 96,120, 90,145,226, 30,159,125,122, 13,239, 29,134,113,133,163,227, 99, 12, 67,135,174,119, 24,198,
+ 1,231,173, 97, 98, 28,237,184, 25,112,191, 53,160,189,129,219,203, 61,174,190,216,226,167,127,243, 49,238, 62,186,143,245,186,
+ 71, 42, 13,101, 63,163,243, 22,142, 5, 54,173, 22,100, 25,229,214,130,150, 35,208, 42,130, 3,186, 85,135,163,245, 8,103, 13,
+190,253,173,183, 80, 51, 29,154,174, 85,164,153,144,147,159,125,121,131,199, 95, 94,227,135, 63,252, 16,127,231,239,127, 11,143,
+126,254, 17,208, 34,230, 57, 51,131,157, 38, 98,164, 2, 54,188, 23,109,172,197, 96,236,108,107, 74,152, 67, 89, 2, 71, 28,143,
+238,101,114, 35,182, 76,209,181, 80,244,171,209,139, 50,120, 82,208, 35, 91,102, 2, 20,157, 49, 8,215,154, 58, 86,135, 52, 87,
+102, 27, 36, 42, 56,107, 69,219, 1,206,209,101, 29,167,137, 97, 65, 89,195,105,104, 31, 13,198, 55,103,237,164,136,125,222,150,
+103, 41, 12,200,160,213,159,100, 89, 72,183, 95,107,162, 41, 92,165,157,120, 8, 22, 41, 55,189,216,197,137,220,245,129,162, 99,
+197,207,222,160,193, 80, 41, 38, 76,211, 68, 5, 60, 23, 29, 60, 35, 96,157, 66,213,235, 84,148,211, 98,169,210,110,144, 89,142,
+ 50,245,211, 14,158, 59, 71,253, 87, 25,235,243,132,177, 85, 44, 81,157,188,255, 13,221,168,145,169, 4,172,225,224,153,218, 14,
+ 2,182, 10,169,220, 57, 80,197,218,198, 35,244,202, 49,204, 27, 66,200,118, 61,171,199, 73,112,230, 67, 80,187,150, 53,203,119,
+157, 51,165, 28,150,186,104, 2, 96,200,174, 76, 5,162,231,149, 6, 52,151,189, 85, 34,138, 82,254, 6,233,110,196,234, 44,157,
+168,134, 64,153,162,211,186, 90, 34,173,106,217, 22,215,216, 99,214,224, 56, 57,178,146,142,137,155, 37, 81,191,147,252,221,113,
+ 90, 97, 56, 8,243,178, 42,130,147,244, 54, 74,125, 91,152, 29,114,153,194,100, 93,201,180,146, 89,191, 33, 49,192, 80,215, 79,
+ 67, 85, 70,125,107, 13,166, 57,206,216,240,188,190, 40,154, 52, 39,147,128,156, 51,156, 15,168,185,105, 1, 45,174,137,202,147,
+ 15, 35, 19,116, 99,201,198,204,116,211, 37,118,220, 0,197,242, 68,171, 17,251, 93,118, 94, 29,139,211,148,167,205,137, 83,227,
+ 56,176, 53, 45,113,206,177, 36, 19,177, 85,202, 24, 78, 29,179,232, 82,135, 97, 28,149,192,214,106, 67, 55,208,197,232,184,147,
+ 38, 42, 92,207, 95, 32,133, 16,144,223, 59,176, 48,161, 32,206, 17,125,223,107,101, 85,217, 82,214,208,208,117, 65, 15, 7,235,
+ 28,243,152, 13,127,185, 13,214, 19,158,177,239, 3, 74,174, 8, 1, 58,118,201,185,170, 82,211, 0, 52, 50,202,133, 30, 52,222,
+ 77,147,106,214, 32, 32,104,215, 43,170, 83, 26,149, 80, 22, 52, 37,129, 81, 49,144,102,130,230, 52,102, 56, 31,142,187,133,226,
+ 6, 88,140,171, 21, 29,142, 60,122, 68,107, 92,160, 44, 59,178,148, 18,239, 87, 11,230, 56,211,193,228,173,114,163,157,147,233,
+ 73, 92,126,142,136,213, 4, 41,235,229, 33,242,104,153,194, 78, 68, 12, 66,154, 8,167,132, 36,235, 72,216, 88, 88,225, 31,188,
+103, 46, 61,237,250, 42, 91,222,156,247, 60, 62,165, 34,104, 98,113,164,105, 6,211, 52, 33,199,136,237,237, 13,210, 28, 85,160,
+214,106,197,120,246, 54,226, 76, 58,130,245,186,195,197,221, 19,120, 87,240,195,239,254, 5,227,123,105, 34, 36, 19,140,170, 2,
+191,130,105,191, 71,215,117,116, 32, 27,171,158,247,202, 33, 16, 66,222,107,188, 99,114,206, 98,123,123,133,233,163, 45,174, 94,
+158,225,238,131,251, 56, 58, 61,195,201,217, 41,174, 46,175,137, 6,183,155,153, 34, 69, 47, 97,140, 73,225, 69, 2, 20, 9, 28,
+ 19, 44,163, 78, 65,146, 78,251, 29,246,187, 45, 90, 51, 56,187,115,142, 97,160,110,174,239, 7,108,142,142,112,126, 81, 48, 79,
+ 51, 39,248, 5, 92, 62,185,198,179,199, 95, 98,119,187,199, 91,239,189,133, 97,213, 99,246, 30, 31,126,240, 57,108, 41, 56, 63,
+ 89, 97, 53,120,120,222,179,230,148, 48,239, 38,181, 90,122, 11,100, 46,120,140, 15, 48,104,240,166,161, 76, 59,228, 2,132,213,
+ 72,254,234,253,132,235, 28,241,235,111,159, 97,154, 18, 46,238,157,161,190,122, 69,160,149,224,217, 74, 99,117,119,188,196, 37,
+ 83,225,102,141,133,101, 17,101,232,131, 98, 41,107, 94, 52, 40,149,233, 93, 36, 68,148, 48, 23,250,255, 89,217, 91,183, 5,135,
+154, 98,212,131, 71, 46,117, 74,132,116, 42, 18, 85,173, 65, 74,232,134,129, 85,224,244,189,199,105,175, 29, 20,169,147, 43, 12,
+ 10,114,172, 76, 58, 46,234,106, 17,154,164,231,181, 94,201, 51, 92,232,121,125, 64,118, 40, 48, 74,218, 8,248,131, 21,196, 49,
+ 10,181,140,117, 36,149, 86, 77,130, 5,150,238, 95,224, 90,210,117,215, 82, 53, 96,131,138,243,124,176,143, 21,251,156,229,188,
+128,178, 68,177,170, 56,208, 30, 80, 45, 43, 39,243, 5, 70,187, 46, 32, 45,113, 38, 40, 43, 95, 2,125, 32, 33, 84, 29,199, 79,
+119,172, 77, 8,100, 9, 78,130,134,182, 40, 57, 34,197, 61, 74,140, 20, 3,203,209,203,181, 21, 56, 22,196,117,195, 26,174, 27,
+152,109,110,150, 68, 49,111,224, 44,101, 94, 68,222,225,206,243, 76,161, 60, 62,112,200, 79,227, 21,173, 81,219,156,211,120,224,
+166, 43, 77, 99,232,175,201,138, 71, 11, 53,179,196,199, 54, 14, 50,106, 48,156, 93,145, 56,109,212,145,242, 27, 64, 5, 65,211,
+228,204,175, 60, 53,180,206,115,215,238,121,164,238,148,149,160, 32, 32,195,232,240, 38,185,134, 12, 59,106,130, 62,247,220,244,
+212,197, 58,199,187,242,198,150, 96,152,166, 97, 61,218, 97,139, 29, 78, 86, 0,150,157,100,149,176,187,150, 11,236, 82, 10, 76,
+ 93, 68,206, 41, 38, 52,188, 54,180,214, 68, 57,153, 70, 21,182, 6, 22,221,185, 55,242,223, 55,106,166, 84,183,210, 26,124,140,
+137,237, 36,149,171,240,170,106,242, 82, 40, 52, 1,161, 49,108,162, 28, 36,206,144,184, 14,156, 63, 44,128,251, 24, 19,156,247,
+232, 24, 66, 98,140,213, 48,145,121, 79,138,226,190,239, 89,152, 21,208,230,132,152, 40, 1, 45,167,168, 59, 2,231, 60, 82,206,
+ 48, 49,161,235, 44, 60,227, 28,187, 62,168,245,206,240, 33,111, 88,169, 41,177,177,158,131, 42, 72,245, 76,187,187, 56,211,206,
+199, 7,135,148,120,183,116, 80, 17, 27,190, 24,134,177, 67, 76,153, 11, 18,246, 76,242,248, 41,165,162,220, 98,170, 8, 25, 58,
+ 32,121,195,134,148,167,133,237,101, 50,166, 35, 33,155,103, 50, 22,121, 72,201, 26,216, 72,112,198, 94,201,253,118,143,121,138,
+116, 48,181,130, 52, 79, 48, 7,169,121,178,155,163,174, 99, 17,246, 89, 35, 64, 24, 25,149, 51, 63,160, 35,152, 2, 88,133, 79,
+202,119,142, 10,108, 32,155,139,248,244,217,255, 47, 54, 14, 83,155,254,127, 58, 23, 16,148,218,103,217, 82, 65,133, 89, 99,196,
+103,206, 5,187,237, 45,166,221, 78, 71,230, 57, 87,116,227, 9,194,120,134,253,213, 14, 67,239,113,116,178,194, 27,143, 46,240,
+ 87,127,242, 71, 58, 17, 64, 99, 69,174, 15, 90, 60,201, 63, 90, 45,152,231,137, 85,180, 6, 37, 4, 56,235, 96, 28, 39,205,249,
+160,233,113,212,173,177, 98,213, 86,220, 94, 95, 98,191,221,226,228,252, 12,167,119,232, 98,223, 28, 29,225,250,234, 10, 47,159,
+191, 66,227,110, 65, 80,169,181, 90,189,196, 19,179,168, 37, 0, 72,246,250,161, 11, 72,153,192, 35, 87,175, 94,226, 18, 6,195,
+ 48,226,232,120,163,223,201,230,232, 8,235,205, 17, 0,224,233,227, 27, 60,127,252, 10,229,242, 22, 55,255,242, 35, 60,120,116,
+ 23,111, 60,186,192,183,127,229, 61,124,254,209, 23,248,232,147, 39,196,165, 7,217, 1, 79, 55, 61, 86,125,128,227,239, 37,115,
+242, 94,227,157,116,227,212, 65, 99, 44, 12, 3,146, 58,239,240,229,245, 30,223,249,173,159,195,241,233, 41, 63,219, 1,155,227,
+ 13, 29, 40,220,189, 90,103,104,157, 83,151,113,112,156, 51,227, 72,173,102,104,215,202, 43, 26, 44,121, 7, 18,206,147, 83, 89,
+248,217,192, 98,189, 49, 6,195, 56, 96,123,179, 39,107, 21,143, 81,197, 75, 75,108,139,204,151,118,164,131,211,121,228, 72,202,
+229,213,209, 17,199, 19,103, 18, 77, 21,194, 52,215,202, 48,165, 86, 20,104, 35, 90, 29,235, 44, 91,178,232, 16, 36,138, 37,209,
+187,208, 42,114,140, 60, 13, 99,114, 91,201, 0, 8,206, 34,145,175, 85, 70,234,134,166, 78,162, 69, 33, 61,143, 81, 70,124,107,
+139,109,171,150,162, 62,108, 10,105, 90,166, 0, 58,198,133,100,166,151,215, 58,112, 17,176,106,167,199,217, 18,194,164, 39,113,
+177,103,128,146, 57,208,144,152,133, 51,207,192,172,194,105,141,178, 34,164,181, 84,208, 36, 61,145,132,229, 20,129, 74,250,156,
+121,154,248,253,151,130, 96,128,247, 1,195,138,246,231,178, 30, 53,206, 1,149,199,245,213,177,181,152, 4,193,243, 68, 43,149,
+ 6,139,148,139,174, 85, 75,165, 73,143,236,175, 89,247, 74, 83,145,102,212,115, 46, 5,123,112, 52,169, 96,157, 26,253,253,101,
+111,221, 26, 95,242,156, 12,119, 0, 40,162,207,137, 52, 50, 50,149,244,161,231,239, 43,112,247, 42, 62,117, 7,227,137, 12, 10,
+ 99,248, 44,141, 76, 8,229,244, 54,235, 88,160, 6,158,157, 84, 6,214, 24, 6,117,149,133, 74, 41, 54, 57, 69,208, 22,190,131,
+ 2,101,138, 88, 94, 49,243, 14, 92, 28, 11,165, 2,165, 38, 61,199,170,228,138, 48,245, 78, 46,124,221,175,243, 36,215, 24, 10,
+ 60, 18, 39,135,177,242, 59, 25,133,111,169, 56, 85,146,227,254,189,127,253, 87,126, 87,186, 63, 25,169,211,225,209,180, 3, 52,
+127,235, 97, 92,198, 3, 85, 5, 70,244,224, 67, 69,106,210,121, 75,181,183, 40,247,136,199, 78, 23,189,213,252,233, 90,168,154,
+141,115, 84, 50, 90,227,135,156,176,130, 6, 48,158,133,118,158,199,227,162,192,165,203,211, 57,143, 97,236,209,117, 1, 93,231,
+209,143, 29,119,178, 70,147,124,164, 99,148,244,181,121,166,176, 10,199,248,200, 82, 26, 86,171, 81, 45, 5,153,247, 79, 50,166,
+241,206,115,248,141,140,221,219, 18, 18,193, 4, 33, 65,220, 54, 0,193, 59, 78, 76,178,146, 47, 67,107,128, 46,240,174,199, 81,
+103, 92, 42,246,219, 61,251, 83, 13,230,253,142,246, 61,156,150,103,140,140,201, 41, 18,151,118,102,158,199,226,157,250,255, 29,
+ 95,204, 4,200,129,198,187, 18,244, 65,254, 59, 42,120, 74,202, 44,144,179,140,194, 36,203, 10, 97,169,141,218,237,104,228,117,
+168,150, 55,252, 48,146,127, 54,206, 51,230,253, 14,243,180, 37,122, 94,202,170,248, 28,207,222, 67,179, 35,172, 5, 54, 71, 35,
+222,124,120,129,206, 37,252,217, 63,253,127,184, 91, 98,178, 95,173,236,229, 60,220, 23,113,246, 76, 91, 14,200, 86, 43, 18, 63,
+204, 98,195,163, 21, 71,211,238, 73,146,177, 36,252, 96,191,221,225,230,234,150,236,141, 67,143, 97,181,194,201,217, 49,125,230,
+187,137, 3, 56, 26, 11, 3,205,242,243,216, 14, 35, 89,199,150,133,140, 82,157,203,207, 40, 37, 97,123,123,139, 56, 39,101, 51,
+120, 79,120,209,219,235, 61, 46, 95, 76,176, 93, 7, 52, 96,119,187,199,180,139,232,214, 35,134,205, 10, 38, 71,204,215, 55,240,
+ 6,120,241,226, 6, 31,127,250, 12, 31,124,244, 37,174,110, 38,122,182,141, 65, 99,196,109,137,108, 89,146, 17, 55, 12, 92,232,
+ 97,187, 30,159,125,245, 2,191,244,155,223,192,201,217, 49, 86, 71, 27, 24, 99,112,241,224, 46, 95,104,150, 84,203, 50, 30, 45,
+133,198,234, 88,244, 5,137, 47,107,171, 22, 46,114,118, 52, 44, 86,204,229, 93,134,142,235, 51, 11,154, 68,131, 35,145,205,133,
+197, 98,120, 77, 24,181, 68,173, 86,182, 10,141,171, 17,227,106,212,181, 85,201, 17,211,110,143, 28, 35,217,210, 12, 40,191,187,
+ 86, 29, 21,139,232, 44,197, 89,125,192,153,193, 45,194, 87,207, 26,176,226, 56,126,149,247,247, 44,152,171, 12, 16,201, 41,113,
+ 60,187,213,103,223,121,139,129,117, 19, 36, 2,165,113,112,240, 12,131,202, 5,219,155, 91,204,243,172,236, 8, 42, 80,121, 39,
+204,129, 52,154,202,198, 92,123,163, 81,179,149, 69, 84,237, 64, 33, 79,135,127,215,141, 24,199, 21, 66,215, 29,228, 62, 64,145,
+171,133, 3,178,136, 88,201,241,195,128,250,255,201,193, 98, 85, 47, 99, 76,227,168,219, 91,196, 56, 75, 53, 7, 99, 42,186, 48,
+160, 31,214,232,134, 21,172, 13,108,155, 50, 10,235, 18, 64,116,173,141, 41,153, 5,243,156, 56,196,202, 48, 40, 43,208, 51, 10,
+199,247, 6, 91, 93,141, 89,132,101,173,177,119,158, 10,199, 28,105,229, 33,223, 9, 90,195, 60,207,124, 97, 85,166,172,241, 62,
+219, 88, 37,172, 21,222,163, 91,223, 45, 83, 80,223,193,119, 3, 96,232,223,135,142,137,159,214, 49,199,132,126, 15,239, 44, 91,
+217,202,129, 54,195,112,222, 57, 19,228,114,209,125, 53,173, 98,232,187, 37,254,124,230,149, 98, 36,155, 47,167,241, 73, 1, 68,
+ 66,222,142,167, 11,149,227,108,177, 48, 10,164, 48, 19,225, 29, 95,196, 57, 39, 14,255, 33,151,133,144,246,100, 79,111,140, 33,
+170, 39, 79, 8,170, 68,203,242, 4, 85,196,143, 44,221,160,169,209,239,252,189,239,252,174, 84,116, 98, 77, 18,239,178,136, 27,
+164, 50, 23, 92,159,140,129, 37,247,183,241, 95, 55,172,104,165, 0,129,133,149, 91,249, 34,151, 7, 87, 96, 39, 11, 0,131,233,
+ 74,214,146,120,131,171, 34,137,211, 51,150,168, 78, 52,238,246,232,250, 94, 31,108,169, 98, 59,246,196,246, 60, 14, 13,157,215,
+113, 25,101,148, 83,167, 45,194,184,166, 99, 65, 67, 85, 95,160, 80,142,213,122, 80, 17,197,126, 71,185,218,228,197,116, 72,185,
+ 48,145,173,177,245,175,105, 66, 27, 96,224,185, 59,111,135,187,116, 30,191, 72, 5, 79,135, 62, 61,252,161,239,249, 50,181,124,
+233, 68,164,121,194,238,230, 22,222, 45,148, 28,234,168, 34,219,236, 56,189,141,213,234,135, 69,151, 32, 79, 29,103, 33,107, 66,
+ 21, 11,253, 36,105, 14, 98,203, 10, 52, 98, 44,165,114,176,197,226,169,183, 34,228,145,244, 47,222, 71, 9, 66, 23, 77, 46,244,
+136,253,110,194, 60,147,226,157,118,252, 2,168, 89, 97,115,247, 91,200,169, 96, 24, 60, 78,207, 54,120,251,221,251,248,222, 31,
+253, 33,158, 62,249,130,255, 30,109,217,161,181, 37, 22, 87, 4, 66,242,176, 58, 31,120, 74,208,224,125,199, 47, 88, 57, 80, 21,
+ 47,202, 90,233,176,165,240, 76,124,112,223, 92,223,224,230,242, 86,211,239, 86,235, 53,142, 79,143, 80, 10,129,121, 50,171,218,
+ 15, 28,192, 26,190, 96, 14,196, 65,181,138,158, 33,243,200, 21,186,215,107,220, 33,238,119,100,225, 76, 83,193,237, 85,212,194,
+213, 56,139,253,110,194,246,122,135,147,243, 99,108, 78,143, 80,230,136, 23, 63,123,142, 15,191,120,133,175,110,174,145,114,198,
+202, 90, 92, 94,238,240,211,207,158,227,179, 39,175,112,115, 59,209, 25, 82, 89,147, 81,155,218,190,174, 47,111, 16, 7,224,222,
+195, 83,206, 5,160,103,220,119, 3, 41,149,173,135,239,104, 45,230,216, 27, 46,239,167, 76,228, 26,219, 61,233, 25, 99,164,112,
+112,200,145, 68,152, 68,121, 91, 34, 88,155,114,170,101,240,104, 88,148, 70,223, 11,133, 13, 65,247,225, 75,164, 37, 71, 84,194,
+226,248,228,132, 97, 82,134, 35, 62,103,236,119, 59,214,237, 84, 69, 33, 19,235,221,106,167, 42, 5,151, 38, 26, 22, 26,169, 74,
+246,120, 61, 60,179,216, 94, 71, 71, 35,184,224,163,201,195, 52, 69,104,237, 40,112, 18,198,205, 14,227, 72,107, 68,118,143, 88,
+231, 88,151, 0,196, 41, 98,154, 38, 22,201, 22,198,173, 46,227,216, 82, 18,249,189,153,204, 70,147, 19, 6,212,212,124,176,127,
+135,186,138, 26,159, 43,227,184,198,122,179, 65, 23,186, 3, 20, 47,148,180,150,242,172,238,150,174, 31,116,148,239, 24, 48, 99,
+173, 87,202,153, 36,137,205,211,158, 38,104,109, 9, 25, 9,221,136, 97,181,134, 11,129,187, 75, 40,107, 66, 26, 11,185,152, 40,
+ 47, 62,145,197,185, 54,180,102,225, 24, 18, 37,194, 92,137,186,133,125,125, 5, 67, 59, 98,171,232, 84,162,103,154,101,151, 47,
+ 10,126, 97,230,139,248, 81,138, 73,144,123,106, 33,187,117,148,109,223,117,234,193,247,161,135,247,157, 2,138, 52,241,207, 26,
+141,193,134, 89, 0, 72,162,164,215,169, 0,255,231,198, 76, 14, 58,171,179,146,245,208,202,193,119,153,244, 18,149,117, 96,229,
+145, 68, 83, 1, 94, 83, 82,167, 20, 14,144, 78,250, 32,189,135,116, 73, 4, 93,210, 48, 34, 88, 84, 86,205, 27,137,226,229,113,
+123,109,117, 17,116,182,198, 19,144,166, 58, 32,161,213,121, 34,125,121,196, 57, 46,201, 48,172,116, 53,198, 32,248,128,148, 19,
+167,177,129, 48,167,134, 14,220,253,110,167, 48,131,140,132, 16, 58,234, 42,217,238, 68, 93,152, 87,133, 33, 89,217,188, 94,216,
+100,143,242,232, 74, 69,148,192, 16, 22,142, 73, 69, 13,142, 0, 28, 6,138,234,236,248, 32,178,134, 58,118,121, 0,140, 53,232,
+250, 94,109, 23,170, 48,181, 11,190,182, 50, 69,169,176,253,202,200,104,142,225, 59, 62,120,238,202, 26,230,253,172,213,170, 11,
+129,246,110,181, 34, 55,122,233,187,158,166, 7, 53,147,224, 36, 59,199,240,141,196, 2,177,134, 97,236, 53, 77, 74, 44, 36,150,
+131, 98,250,224,209, 15, 61, 11,130,136,229, 78,241,164, 59,148, 20, 49, 53,234, 42,101, 76, 74, 1, 41, 22,195, 48, 80, 92,173,
+ 4,187, 20,192,240,248,187, 31,122,148, 92,105, 37,196, 68, 59, 25,143,214, 82,152, 12,151, 85, 29,106,212,147,239, 15,210,178,
+ 10,144,233,251,149, 81,160, 85, 52,103,160,232,219,156, 81,106,227, 75,156, 14,176, 90, 18,103, 3,243,244,197, 89,108, 46,222,
+225,196, 46,160,239, 3,238,191,121,134,155,151, 79,241,201, 7, 63,209, 72, 74,249,236, 11,239,225, 94,183, 21, 10, 58,184,242,
+ 51,215,193,112, 10,150,156,198,226, 29,150, 96, 26,226, 16, 4,254,158, 59, 61,112,196,114,183,223,237,113,117,249, 10, 71, 39,
+167,184,123,255, 2,195,106,192,201,217, 9, 86,235, 21,174,175,174,113,123,125,131,218, 10,166, 45, 1, 56,200,110,216, 84,248,
+104, 56,124, 36,167,204,162, 78,234,124, 67,215, 96, 77, 64, 45, 21,169, 69,212,153,128, 38,219,155,136,123,103, 35,166, 84,113,
+187, 39,235, 95,105,192,237,245, 30,159,190,255, 51,124,253,231, 31,226,205,247, 30, 34, 77, 17,255,252,195,207,240, 17, 94,226,
+172, 89,124,163,110, 16,188,195,233,233, 10,159,188,184,193,112,255, 4,143, 95,109,241,226,167, 95,225,226,244, 24, 15,238,108,
+112,113,186,198,177,113,120,126,181,195, 55,127,251, 91,232, 58,161, 62,103, 76,211, 30, 49, 87,220,123,112,161,187, 94, 99, 28,
+ 3, 97, 58,205,158, 55,166, 50, 63,130,198,229,165, 84,152, 86,120,191,207,187, 66,158,106,137,157,138, 34,131,177,100,162,163,
+ 33,206,121, 33,166, 21,201, 4, 7,246,115, 6,172,225, 9, 3,189,223,221,176, 98, 1, 26,189,139, 37,205,136, 19,119,246,162,
+110, 46, 5, 83, 76,176,142, 38, 70, 57,145,208, 76,237, 87, 92, 96,150, 76,150, 79,231, 45,140,115, 12,144,170, 72,137, 39,103,
+ 53,194,216, 78,149,241,114,156,210, 14,154,198,208,115, 76,240,129,138,116,103,169, 1, 1,219, 85, 67,231, 85, 12,188,168,150,
+ 41,146, 52,231,116, 96, 95,227, 78,142,255,115,140,123,110, 0,184,225, 97,204,182,181,139,245, 72,168,142,114,240, 91,182,101,
+ 73,134, 59,137, 2, 9, 0,229,188, 67,155, 10,175,120, 28,250,126,208, 61, 62,141,221, 59,101,137,103, 70, 76,203,254,118,158,
+103,164, 20,117,100, 61,172, 54, 8,161,163,208,149, 12, 84, 43,185,228,204, 36, 55,141, 48,207,198, 32,205,228,246, 73,185, 50,
+218,148,190, 5,211, 40,199,219,123,186,204,172, 39, 81,116,229,115,167,168, 24,204,146,127,188, 86,213, 3,213, 90, 97,106,214,
+213, 69, 19, 5, 63,255,255,148, 42,122,160, 6,183,134, 10,137,192,197,142,117, 65,167, 20,214, 46,113,181,134,181, 2,200,226,
+146,177, 76,245,204,154,186, 9, 43,247, 67, 61, 8,242, 17,183,130, 80,234, 10,255,247,153,215, 36, 73,197,112,180,238, 43,104,
+ 45,232,101, 46, 69, 39,105, 40, 22,183,137,156,171, 37, 39,182, 6, 47,110, 4,203, 29, 62,135,152,208,200,223, 52, 88, 27,180,
+208, 16, 50,160, 17, 81, 50,154,146, 7, 27, 22,125, 88,227, 21,166,177, 6,190,213,198, 10,208,192,196,164,172,169, 68, 2,109,
+240,172, 14,174, 21,218,181, 24, 99,128,213, 10,105,142,136, 28, 91,151, 51,145,183, 10, 39, 22,245, 67,207, 12,121,250,131,135,
+224,153,201,222, 33,197,130,213,138, 4, 30,162, 72,175, 70,176,134,204,120,247,180, 27, 26,198,142, 50,221, 61, 22, 67, 63, 31,
+ 64, 50, 25,176, 46,112, 37,231,149,153,188, 4, 34, 52, 29, 77,144,208,170,233,232,177,178,242,190,235,233,231,230, 84,212,118,
+ 70, 93,137,103, 42, 87,212,157,105, 63,144, 82,183,212,138, 52, 71,197,176, 46, 76,244,160, 42, 80,177, 45,204,251, 61,255,249,
+ 27,243,166, 23, 11, 97,138, 19,226, 52,193,123, 32,199,120, 32, 32, 41, 26,205,216,245, 29,171, 93, 51,255,236,178, 84,201,153,
+214, 32,170,180,101,133,176,248,203, 27, 31,234,105,142,232,134, 65,181, 8,206, 7,125, 16, 8,192, 33,207, 23,217,224,132, 61,
+ 95, 53,215,153, 32, 23,153,197,124,165, 84,228, 56,171, 55,147, 86, 47,196,157,119,190,199,120,252, 6, 82, 36,230,248,201,233,
+ 26,103,231, 27,252,254,255,246, 79,148,140,167,213,242,193,238, 80,192,128,196,196,110, 60,130,236,216,191, 95, 88,235, 80, 85,
+141,188,144, 57,160,133, 40,141,216, 12,230,121,210, 40, 75,153, 42, 9, 58,244,197,179,175,112,123,115,141,245,230, 8,231, 23,
+103, 44,118,235,209,221,237, 16,231,136,155,235, 91,196,152, 20, 83,106,141, 65,105,244,125,211, 40, 52,241,168,206,162,235, 58,
+122, 30,157,131, 45, 25, 37, 55, 70, 81,210,239,122,188, 89, 97,200, 13,222, 69, 92,223, 78,164,107,112, 6,113, 63,227,201,167,
+ 79,241,181,111, 60,192,197,215,222,196,187, 15, 31,226,167,159,191,196,215,176,193,217,134,211,180,208,240, 34,237,241,159,254,
+195,159,199,184, 26, 48,111, 35,158,127,117,139,199, 63,253, 10,223,255,248, 57,122,247, 18,103, 15,207,240, 91,247,142,185, 0,
+ 99,213, 47, 12,134,222, 33, 70, 18,120,205,115, 68,220,205,202,146,144,110,219, 7,199,126,121,143, 90, 19,198,193,171, 90,186,
+200,161, 91, 43, 21,131,134, 46,210, 44,220,114,211,216, 53,225,144,145, 22, 2, 90,224,245, 88, 41, 56, 58, 89, 35,231,198,239,
+ 23,217,192,186,174, 67,205, 9,177, 16,250,120, 42, 25,173,102, 29,207, 19, 36,169,170,208,140,214, 91,153, 58,113, 46,204, 43,
+255, 94,104,133, 60,199, 5, 12,142,138, 12, 60,162,139,155,208,155,149,119,146, 5,238, 32,151,192,121,139,188,139,220,217, 21,
+114,113,180,197,242, 41, 44, 11,225,230,147,166, 32, 47,177,153, 92, 44, 75,248, 71, 83, 76,108,229, 62,108,153,148,113,192, 27,
+ 4,151, 3, 99, 96, 57,232,197,200, 4,212, 58,116,221,160,106,123, 58,191,104, 87, 77, 19, 16, 97,226,147,150, 69,220, 51,128,
+208,243, 68, 47, 67,147, 18,128,152, 17,113,154, 40,230, 53, 4,140,171, 53, 66,232,185, 67, 44,220, 92,101,216, 38,120,211,172,
+ 35,122,162, 41, 22, 6,214,112, 35, 96, 0, 7,195, 6, 9,210,176,144, 20,111,121,191,196, 85, 84, 10, 83,210,106, 81,221,133,
+128,169, 40,124,165,234, 72, 93, 20,232,106,248, 99, 92, 47,106,165,228, 72,107,185,105, 51,212,153, 43,132,140,115, 63,248, 29,
+ 5,139,245, 40,178,151,215, 48, 60,170,110, 5,154,213,113,152, 80, 73, 43, 0,186,192,141, 78,149,168, 43, 39,173,205,124,112,
+ 54, 45, 63, 35,103, 42, 24,229,179, 47,181, 46,182,208,214,212,234, 44,205, 11,145,228,150, 6,131,152, 38,118, 89,151,192,162,
+212,164,251,122,185,248,133, 17, 47,211,204,162, 83, 89,168, 0,177, 84,154,126,121,227,224,169,250,118, 48, 40,106, 59,200,156,
+147, 94,100,183, 9,122,249,173, 29, 84,197,190,187,221,193, 59, 15,116, 80,149, 94,156,211, 18, 26, 80,201,211, 61,104,183, 73,
+157,193, 56,246,152,166,136,110, 32, 97,129,235,101,108,222, 33,206, 13,195,106, 64, 78, 17, 19,219,185,156,119,228, 71,175, 13,
+ 62,112, 8,131, 68,120, 6,238,250,157,213,220,244,174,239, 17, 60, 61,228, 41,209,133,157, 19,217,242,230, 57, 34,206, 25,199,
+167, 27,242,188,119, 1, 48, 9,125, 31,244,195,139, 49, 81,166,186, 53, 24,198,158, 21,207, 17,165,208,152,125, 24, 7, 29,163,
+151, 28,169, 51,182, 4,142,105, 13,216, 28,247,106,143,154,167, 72,190,117,176,133, 46,101,196, 84, 73, 28,215,104, 23, 93, 75,
+134,105, 13,222, 1,115, 42,228, 41, 47, 36,174,145,120, 76, 82, 18, 47,152, 86, 99, 14,224, 19, 28,237, 74, 89,189,150, 4,135,
+173, 32,103,192,176,221, 77, 42, 57, 17, 64, 26, 0,193, 19,125,203,241,254, 76,254,225,124, 64, 63,246, 60,178,178,186, 75,167,
+206, 45,243,119, 77,163,178, 28,103,196,121,210, 75, 64,162, 62,131,177, 88,157,189, 67, 99, 58,215,112,124, 50,226,238,131, 83,
+188,248,242,115,124,245,179, 79, 57,240,128, 57, 8, 56,200, 62, 86, 1, 74,211,204,111, 17,226, 89,179,140,139,237, 65,198,124,
+ 46, 11, 83, 92,198, 79,214, 58,141, 75,148,131,164,242, 33, 79,233, 76,164,194,158,246, 59, 34,201,189,122,133,243,139, 59,216,
+ 28,109,224,189,195,241,233, 49, 86,235, 53,177, 25, 74,198,246,118, 71,248,203,186, 68, 38,202, 14,215, 58, 11,103, 29,239, 94,
+ 19, 98,205, 8,190,227, 0, 6,102,222,123,139,110, 8,252,191,181,216,238,102,236,247, 51,114,105,184,190,220,226,203,207, 95,
+ 34,172, 2,190,243,235,223,194,243,231,151,120,119, 36, 84,177,239, 59, 92,237, 19,238,223, 57,199,241,233, 6,161,243, 56,187,
+123,138,251,111, 95,224, 87,255,222, 55, 49,109, 19,126,246,217,115,172, 55, 3, 86,235, 21,237, 56, 29,173,157,106, 51,136, 49,
+163,180, 45, 78,207, 79, 48,199, 12, 23, 2,233, 7,106, 37,160,148,181,184,189, 73, 4, 21,202, 5,185, 52,244,125,165,132, 54,
+182, 5, 81,162, 91, 89, 66, 77, 44,117,115,161,243,200,169, 98, 88,209,138,141,214, 51, 85, 5,117,210, 65,239,183, 91, 56, 95,
+152, 24, 72,162,159, 41,147, 71,122,158, 8, 33,220, 5,178, 39,194, 88, 13,125, 66, 51, 40,168,100,245,225,189,121,171, 36, 96,
+ 77,243,164, 99, 78, 33, 84, 86,186, 65,136, 84,199, 7, 92,100, 36, 44,101, 92,119,250,172, 59,103, 81,138,161,243, 75,216,236,
+252, 79, 24, 33, 4,210,154, 49,198,200, 44,131, 5, 20, 51, 79, 51,143, 69,229,103,231,131,140,243,133, 68,215, 26, 93, 72,178,
+206, 84,129, 21,175, 12,197,177,162, 57,243, 18,138, 84,155, 42,223, 75,149,105, 20, 77, 63, 66,232,120,138, 70, 1, 81, 41, 21,
+ 78, 73,244,175,121,157,141, 53,152,246, 51,246,251, 61, 10, 51,215,187,126, 68,215, 13,128, 37,187,175,156, 49, 64, 69, 99,206,
+ 6,157,155, 89, 45,206, 41, 37,238,200, 3, 53, 67,124,193,122, 7,148,108,212, 22,137,131,221,191,115,116,161,139,206,170, 72,
+144,151, 33,205,132,243, 22, 37, 25, 85,216,151,106, 52,208,164, 29, 96, 85, 41,249, 50,240,234, 53, 48,170, 57, 44, 52, 78,118,
+140, 80, 44,117, 83,127, 55,167,147,234,234,164,112, 52,170,192,173,218,193,196,128,138,200,164,133, 34,216, 97, 81, 75, 66,107,
+137,118,232,198,104, 99,104,140, 91, 10,143,118,216,237, 47,246, 56, 97,187,148,131, 41,114,227,132, 77,253,115, 41,131,195,106,
+227, 7, 84,205,187, 47,124,199, 8, 62,150, 16,176,141, 3,179, 2, 26, 68, 43,197, 19, 17, 44,214, 58,223, 24,154, 47, 92,224,
+ 86, 27,114,205, 74,211, 98,151, 20, 10,163, 83, 67, 71,201, 49,171,205,138,118,218, 0, 6,195, 15, 2,147,206,114, 38, 1, 86,
+225, 93, 76, 63,244,220, 93, 2,153, 33, 32,206, 82, 39, 75,222,105,167,151, 78, 2,117,137, 18,119,153, 83, 65, 48,158,199,254,
+ 6,187,221,132,110,232, 89, 82, 73, 23,175,196,216,117,189,231, 10,220,115,124,104, 96,127,109, 81, 80, 73, 63, 16,144, 97,181,
+ 25,144, 34, 85, 63,158, 5, 96,251,219, 25,251,221, 12,112,136, 76,215, 17,240, 38,165,204, 59, 72, 2, 98, 84, 30,169, 27,235,
+ 48,172, 2, 87,139, 69, 81,173,149,217,192,181, 36, 88, 67,251, 72, 18,155, 84,142,104,156, 17,131, 99, 99, 6,141,124,186, 62,
+144,240,134,211,170,100,124, 69,147, 14,131,220,170,170,224, 15, 71,156, 52,102,166,131,182,164,132, 61, 31,214, 66,154, 51, 10,
+152,161,181,130, 97, 42,151, 60, 48,181, 53, 85,201,122,239,208, 13,129,215, 16,150,193, 46,150, 69,131, 12,190,168,146, 80, 21,
+153, 65, 79,194,176, 16, 28, 82, 42,188, 19, 2,198,147, 55, 16,231,130,190,119, 24,199, 30, 71,199, 3,126,255,127,253, 19, 46,
+ 10,140,170, 78,155,238, 21, 13, 91, 72,172,238, 96,101,146, 32,202, 80, 17, 39,214,214, 16, 83, 84,123,209,225,216,191,177,248,
+ 72,160, 56, 20, 7, 27,144, 83, 70, 46, 21, 93, 32, 98, 94, 43,139,208, 45,198, 9, 79, 62,255, 12,195,106,141,211,243,115,108,
+142,142, 48,142, 61,198,177, 71, 46, 29,214,235, 53,182,219, 45,166,253,132,171,171, 43,134, 61, 52, 74, 6, 3, 80, 27,193, 50,
+196,167,236,157, 67, 78, 77,119,244,155, 85, 64,105, 22, 22, 1,166,208,243,220,121, 96,191, 79,136, 49,227,171,207,159,163, 6,
+131,227,179, 13,126,243, 55,126, 14,253,203, 23, 24,142, 54, 8, 93,192, 71, 31, 63,195,123,239,222, 87,215, 7, 96,121,122,230,
+113,116,214,225,219,119,142,121, 92, 76,221,112, 76,172,242,237, 60, 12, 35,151,135,177,199,229,203, 43,221,167,230,220,128,204,
+ 76, 6, 11, 76,211,164, 85,255,246, 54,234,225, 40, 64, 26,217, 69, 90,179, 64, 58,100,183,158, 98, 70,198, 18, 92, 33, 46, 4,
+242,222, 71,178,160,165, 9, 37,206,216,207, 9, 41,205,244, 57, 29,112, 18,138,237,233,185,170,228,177,110,133,118,152,133,115,
+216,169, 88,100, 21,127,206, 58,174, 46,220, 1,101,254,107,149,133,121, 48, 4,167, 18, 33,146,243,134,252,255, 28,167,107,148,
+208, 85,153, 41, 17,225, 59,122,126,134,161,215,194, 55,206, 51, 74, 41, 24, 87, 43, 37,210,149,156, 89, 91, 81,249, 32, 93,104,
+113,210,157,233,174,220, 28, 90, 7,249,103,131,254,250, 50,104, 90,252,208,222,119,232,250, 14,195, 56,240,138, 9,220,229, 50,
+ 3, 60,206, 58, 57, 20,189,136,236,152, 43,175, 67,100,194, 82,107,198,180,219,233,216,125,181, 62, 98,133,187,211,206, 88,126,
+ 87,131, 5, 21,157, 18,117,212,211, 52, 35,166,124,144,255,190,100,214, 55, 78,181, 36,192,139, 81,251, 42,125, 6, 21, 45, 91,
+142,182,109, 48,108,197,106,181,162,114,115,151, 82, 82,129,115, 41,245,181,116, 58, 73, 42,115,222, 48,222,217,176,181,153,132,
+220, 10, 69, 99,126, 59, 97,195,249,115,109,224, 11,154,188,241,165,144,160,173,182,165,171, 21, 93, 67,173, 52,157, 33, 91, 96,
+211, 85, 47, 90, 65, 46,145,168,123, 45,235, 56,157, 0, 87,140,119,174,162, 54, 23, 32,204, 18,162, 35,160, 46,153,170, 80,191,
+123, 96,231,145,221, 58,135,181,228,146, 89, 24,206,133,177,236,247,213,209, 99, 22,225,175,177,104, 16, 71,133,167,112, 27,235,
+233, 12,183, 30, 96,104,151,151, 12,227,156,146,230,132, 75, 5, 66, 95, 80, 67,232,130,114,120, 69, 37, 15, 24,184,218, 48, 12,
+ 84,237,245, 67,143,105,154, 69,174,204,187,205,131, 10, 85,105,104, 69, 69, 34, 82,117, 81,210,147, 71,201,212, 61,207, 19,229,
+ 32,239,110, 19,123,199,151,184, 61,199,214, 27,107,161,214, 41,192,240,161, 71, 15,143,216,112,230, 57, 97, 92,217, 37,134, 84,
+198,185,206,177,216, 46,163,235,185,227,205, 36,188, 51,173, 18,105,140,121,236,187, 29, 1, 38,154,166, 34,209, 3,213,117, 65,
+173, 53,173,150, 3,204, 35,237, 88,231, 24,209,245, 30,113,154,209, 0,220, 92,239, 40, 4,193,130,171, 75,218,145,116, 67, 64,
+ 73, 21,183,215,123,108,111,182,204, 3, 96,203, 73,173,168,150, 10,169, 90,133,116, 69, 68, 46, 26, 95, 47,137, 66, 70,220, 10,
+ 33,200,146,104, 33, 65,121,167,224, 16, 17,123, 89,231,152,119, 79,145,174,206,123,140,171, 1,150, 99,114,199,177,199, 60,179,
+165,133, 93, 0, 37, 37,222, 39,207,152,118, 91, 93, 55, 8,152,193, 58,226, 35, 31,157, 60, 68,107, 30,222, 23,172, 86, 61,238,
+191,121,142, 47, 62,254, 16, 47,158, 63, 85,133,125, 41,204,197,103, 7,132,192, 45,212,101, 33,137, 73, 62,104,208,144, 40, 63,
+209, 10,107, 60,232,165, 58,220, 45, 30,138, 61, 11, 91,152,196, 10,130,102, 16, 83, 84, 13,129,140,230,193,118,204,156, 34, 94,
+ 62,123,134,171,203, 43, 28,159, 28,227,248,228,152,129, 59,132,138, 29,198, 1,195,216,227,229,243,151,184,189,189, 85, 60,178,
+101,154, 94, 49, 84, 61,207,211, 4, 31,122, 88, 75, 23,127, 8,148, 1,238,157,129, 67,143, 91,103,225,124, 70,231, 44,182, 59,
+131, 23, 47,111,240,215,127,253, 24,255,224,223,254, 53,188,247,115, 15, 97,118,247,112,251,242, 26,190,101,204, 49,225,235,223,
+122,132,113,189, 86, 60,229,162,123,177,186,167, 35, 91, 78, 83,183,135, 76, 64, 66,176,216,109,103,205, 52, 72,145,166, 95, 52,
+ 38,231,157, 94, 51,106, 63, 77, 57,241, 33, 3, 88,215, 48, 79, 84,172, 80,122, 27, 37, 12,130, 89,216, 98,131,115,206, 18, 45,
+ 47, 39, 37, 82,166, 24, 17,167, 25, 37, 71,236,111,175,177,223,222,178,203,128,154, 58,129,175,192, 52,228,152,209,117, 61,199,
+ 39, 47, 65, 72,180,183, 4,106, 53, 42,222,146,206,170,112,241, 74, 99, 93, 90, 13,202,179, 43, 41, 95,234,235,206,145,221, 32,
+158,185,226, 76,211, 43, 92, 8,177, 94, 66, 46, 11,153,178,136, 32,201,168,152,173,169, 64,147,196,104, 89,133,106,114, 57,182,
+195,247,129, 71,234, 42, 58, 46,133, 17,165,130, 31,231,194,150,236, 38,220,113,203,116,137, 59, 58, 99,145, 27,157,131, 11,207,
+130,172,180,127,107,251,164,145,211,198, 16, 12,137, 86,169, 29,250, 97,133,110, 24, 17, 66, 98,208,139,186, 0, 0, 32, 0, 73,
+ 68, 65, 84, 71,248, 86,222,143, 27, 80,232,147,243, 66,166, 36,205,200, 60, 77,136,137,214, 17,198,122,242,132, 91,167,221,160,
+ 20,227, 48,162,143, 55, 7,205,133,227, 11, 19,250, 59,138,224,203, 52,114, 29,148, 34,141, 14, 3,121, 14, 11,124, 71,241,208,
+142,129, 82, 93,215,233, 4, 74, 66, 83, 12, 91,183, 66, 23, 84,105,174,187,121,254,124,114, 74, 74,219,164,160, 54, 17, 83,114,
+119, 93,203, 1,188,168,234,133, 78, 23,253, 2, 26,147,223,191, 45,189, 58,175, 86, 57, 9,131, 9,164, 70, 10,154, 3,198,125,
+213,152,107,163, 83, 37,117,210, 72,240,140,177,186,102, 38,221, 19, 33,196,233,146,239, 8, 78,195, 56, 93,210,128,121, 56, 71,
+ 69,156, 21,126, 11, 23,200,162, 43,240, 56, 80, 27, 10,238,114,217,111, 26,246,120, 71,202, 17,231,253,180,115,244,176,133, 16,
+ 16,231, 9,181,145,117, 75,200, 65,230, 32, 58,144, 16,138, 22,182,167, 11,222, 51,209,172,201, 14,194, 18,119, 60, 39, 34, 63,
+237,110, 8,198,146,230,153,132, 95,181,113,168, 7,141,247,123,235, 15,144,139,226, 81,244,154,139, 59,174, 7, 85,112, 90, 75,
+233, 80, 50,106, 25,198, 94,127, 71,241,227,203, 30,132,146,214, 18,156,165, 29,126,138, 5,211,180, 96,252, 28,171, 95, 69,184,
+ 35,149,123,102,239,118, 41,149, 89,202,149, 31, 56,194,115, 78, 83,194,126, 59, 41, 99, 60, 39, 26,247,199,121,134,119,134,168,
+ 96,153, 18,174,210, 28, 53,102, 80,186,101,240,165,231, 44,165,226,201, 24,178,164, 68,214, 65,138,237,209, 34, 67,106, 11,103,
+249,129, 70, 83, 27, 71,170,196, 67,111, 76,100,163,189, 89, 65,232,123,244, 67,135, 6,139,214,232,176,166,174,187,234,158, 80,
+153,214,204,161, 55, 92,208,104,120,134, 28, 43,198, 99, 60,125,139,132,123,157,195,217,157, 13, 86,107,143, 63,251,254,191,128,
+115, 65, 97, 19, 20, 93,104,151,195,212,242,190,219, 7,245,219, 23,126,200, 13,231, 13,163, 45,214,142, 82,234, 50, 78,231,221,
+149, 30,182, 60,186, 82,177, 9, 11,232,100,135,159,213,206, 66, 34, 59,195,138, 93,233,250,115,154,241,226,217, 51,196,105,198,
+230,248, 24,235,205, 74,173,148,227,106,196,233,217, 25,142, 78,142,145, 83,194,237,205,237, 1,234, 17, 26, 53, 26, 99, 68,223,
+ 19, 52,199,123,246,237, 50,230,113,227,248,251,247, 22, 22, 13, 47, 95, 84,252,228,229,103,248,229,167,239,225,237, 71,247, 48,
+220,177,200, 51,117, 28,183,219, 9,103,247, 78, 49,172, 70,252,233, 63,249, 23, 48, 63,123,138,119,190,126, 15, 71,111,222,197,
+120,247, 20,126, 51, 0, 33, 80,138, 32,139, 48,173,115,228,185, 14, 36, 82,157,247, 19,198,177,199,246,118, 15,120,199,136,212,
+202,191,103,134, 99,171,167, 76,129,114, 46,232, 6,143,221,237,130, 38,110,181,146,237,136,139, 74,235, 0,239, 60,117,194, 60,
+ 25,234,123, 71,187,110,249,249, 14,136, 51, 17,201, 66, 8,164,136,231,201, 14, 44,144, 11, 37,247,148, 68,121,222,171,245,138,
+124,234,170, 34, 94, 64, 46,206, 59,148, 20, 25, 44, 5, 30, 61, 38, 62, 28,249, 66, 41,158,138, 30, 35,133,206,146,174, 70,162,
+ 87,198,150, 56,154, 90,201, 52,202, 40,251,219,107,134,186,176,224, 9,229,188,184, 13, 8, 65, 75, 83,191,172,150,165,165, 67,
+167,180,182,178,164,178, 29,220,186,238,240, 57, 99,241, 87, 99, 30,193, 48,140,140,220,118,138,133,165,255,109,211, 34, 52, 69,
+217, 29, 91, 29, 87, 59, 62,119,157, 35,140,107, 44,153, 4,183, 51,209,215,134,113,141,113,181,194,176, 26,120, 10,118,192,231,
+224,203, 19, 7,153,224,251,237,142, 92, 62,112, 8,125, 79, 36, 54, 21, 80,179,163,128,173,105,198, 58, 56, 35,170,113,190, 60,
+217,170, 37,150, 65, 42,106,150,105, 47,185,165,100,170,193, 22, 53, 39, 1, 61, 94, 47, 54, 73,129,148,117, 67, 43,153, 11, 62,
+175, 86, 63,195,192, 36,113,190,136,141, 88,178, 13, 12, 42,129,135, 88, 3, 65,228,186,133,181,178, 64, 50, 50, 26, 50, 12, 95,
+236,149,139,205, 70, 65,109, 26,134,180, 56, 4,202, 18, 5, 92, 69,187,145,121, 74, 41,164, 69,191,228,125,212,194,231,144,123,
+ 77,123,165,201,141,218,157,147,187,197,113, 60, 45, 36,248, 72,154, 25, 13, 26, 90,224, 69,181, 37,214,183, 72, 97, 95,224,101,
+ 39, 44, 57,183, 6, 36, 8,146, 49, 71,142,153,147,102, 22,177,145, 0, 78,156,183,104,173,215, 23, 43,116,244, 35, 19,143,187,
+201, 91,108,225, 44,239,218,152,217, 76,149, 71,129,109, 88, 24,241,173,161,166,134,213,102,196,246,182, 96, 92,175, 56,145, 43,
+107, 55, 6, 35,252,227, 66, 62, 71, 22, 84,128, 21,239,210,181,144, 88, 76,108, 45, 85, 47, 88,234,248,104,100,100,249,239,215,
+210, 18, 95, 40,234,200, 82,232, 16, 33,203, 74,197,176, 26,232,207, 90, 42, 13, 96, 88, 1, 63,101,138,167,156,118, 19,192,100,
+ 50, 81,110,199,153,246,237,183, 55,123, 90, 55,152,197,251, 89, 56, 99,189, 11, 22,105, 38, 43,208, 60, 77,186, 58,176,156,150,
+ 69, 48,152,140, 86, 50, 98, 93,114,211,157, 51, 60,134,131, 6, 17,128, 41, 76,224,239,110,218,239, 9, 74, 19, 60, 43, 47, 29,
+ 17,152, 64,105, 81,210,189,134,142, 70,126,150,157, 9, 34, 32, 4, 91, 63, 50, 79, 48, 26,135,125,148, 28,213,167,175, 44,246,
+131,110,101, 60,190,143,218, 2, 12, 10,198, 85,143,139,123,167,248,217, 71,239, 99,123,115,163,201, 67,150, 71,115,130,199,116,
+222,195,155, 37, 33,206,123,170,192, 67,224,234,221, 26,120,222,147,203,238, 93,248,211,203,104,211, 45, 74, 86, 44,246, 54,233,
+198, 29,143, 29,193,132, 40,195,130, 23,210,147, 44,162, 20,185, 68,188,119,152,227,140,114,121,137,105, 63,161,235, 3,214, 71,
+107,210,148,132,128,222, 15, 40, 57, 99,189,217, 32,167,132,221,118, 71,180, 69,126,135, 52,192,161, 86, 14, 5,241,152,166, 8,
+ 99, 51,106, 75,112,166,163,136,207,163, 53, 74,254, 18, 91,204,248,252,211,175,240, 15,254,209,175,162,243, 1,253,106, 64,203,
+ 5,115, 42,232,122,135, 63,253,189, 31,224,127,255, 63,254, 8,111,218, 30,127,242,253,199, 8,206, 97,240, 30,111,223, 59,194,
+253,135,231,248,198,111,124, 19,221,209, 26,231,111,158, 99,191,155, 16,198,158,121,253, 30, 41, 77, 88,221, 57,193,213,171,235,
+ 37, 34, 82, 80,159,115, 70,228,105,147, 10,195,114,197,180, 37,164,176, 50,218,115,102, 65, 17,123,247,155,225, 44,233,134,102,
+ 42, 90, 49, 72,145,113,198,243, 12,231, 12, 82,161, 68,186, 92, 61,172,235, 48,142, 9,187,219, 43, 42,128, 44, 21,175, 52, 92,
+172,240,118, 68,138,179,242, 43, 40, 49,174, 49,221,143,223,231, 16, 88,132,229, 81, 76, 86, 65,169, 0, 94,106,171,176,144,206,
+152,213,197,220,217,165, 24,153,155,225, 20, 18,227,188,131,243, 1, 93,223,243,153, 66,157,190,144,241, 90,147, 70,128,227,150,
+ 69,225,175,214, 92, 18, 25, 31,218,193,156, 88,148,170,104, 95,172, 94,238,106,167,107,102,233, 26, 5,199,204, 60, 8,117,118,
+112,186,164, 49,116, 54, 83, 56,146,101, 49,239, 50, 17,209,247, 21,148,246, 87, 57, 14, 54,116, 20,123,221, 15, 35,134,213,112,
+ 0, 23, 98,165, 54,175, 11,149, 78,214, 42,230, 24,169, 67,103,174, 70,109,150, 11, 15,163,107, 49, 58, 71, 44,224, 15, 0, 58,
+173,176, 72,205,145, 42, 94,227,166,221,146, 97, 46,152,108,102, 3, 24,136, 7,221,243, 37, 70,205,155, 15, 29,163,183, 89, 55,
+128,134, 28, 39,110,170,122, 77, 87,132, 88,202, 56,147,221, 88,182,204,113,224, 80,171,153,193, 48,212,144,160,113,103,126,144,
+105, 78,236,131,130, 6, 38, 14, 34, 43,159, 69, 83,250,200, 98,195, 5,187, 83, 34,160, 78, 87,172, 65,213, 5, 38,251, 35,121,
+165,106,216, 23, 47,171, 79,152,170,103, 83,171, 50,237, 1, 63,147,180, 15, 7,251,212, 1, 3,203, 5, 66, 43,149, 39,103,225,
+181, 38,147,160, 97, 5,125,223,209, 89, 37,212, 71,122,128, 43,103, 21, 59,148, 42,145,114,188, 47,228, 67,187,106,186, 80, 91,
+104, 82,220, 33, 78,181,193,115, 40, 72,138, 9,158, 95, 12, 17, 54, 85,246, 58,122, 99, 48, 12, 29, 99, 98, 61,106,129,130, 43,
+100, 95,108,140,199,106,189,194,174, 85,244, 35,101, 86,199, 57, 34, 37,234, 36, 2, 3,109,148, 61, 45,233,105,153, 46,101,202,
+248,181, 76,100,106, 60, 82,178,232,122,186,240, 99,204, 8, 93,207, 15, 52, 80,139,197,180,159,121,244,199, 40,193, 84,144,102,
+ 18,116, 12,227,138, 70, 31, 0, 92, 16,187, 7,217,211,124,240,152,247, 51, 92,112,136,172, 65,200,153,200, 87, 57, 87,236,119,
+ 51,249, 64,209,244,192,175, 37,241,248,216,161, 36, 71,153,238, 7,149,181, 86,228,104,168, 37,242,136,122, 65,162,138,240,205,
+ 90,207,201, 74, 5, 40, 13,134,125,241, 21,192,180, 79,116, 16, 86,242, 76,135,174,227,221, 53,184,155,183,170,146, 30, 86, 3,
+ 77, 84,120,207,104,217, 90, 71,123,159, 37,109, 40,231, 72,204,104,246, 0,103,158,234, 72, 72, 65,163, 91, 17,195,209, 91,168,
+141,132,129, 39,167,107,120, 95,241,255,125,255, 47,137, 50, 40, 94,116, 20,182,232, 45, 17,135,130, 20,110, 92,185, 54, 52,160,
+178,162,185, 84,152, 66, 10,127, 1,121,148,156, 97,189,231, 32,160,101,252, 14, 86,104, 87,214, 25, 80, 83,104, 52, 10,178,177,
+127,183, 52, 40, 56,201, 57,191, 88,103,236, 34,254, 49,134, 62,211,253,126,143, 57,206,184,188,188, 66, 8, 30,125,223, 51,176,
+200,163, 99,239,242,230,232,136,137,102, 17, 41, 70, 76,251, 61,166,253, 76, 8,228, 74, 36,183,126,232, 80, 42, 16, 92, 70,174,
+ 13,190,101,160, 38,220,220,236,224, 65,135,210,217,201, 6, 46,120,172,143, 70,188,124,242, 12,187, 52,227, 79,127,255, 7,120,
+245,215,239,227, 63,251,198, 27, 56, 94, 15,136,197,226,102,151,241, 98,159,177,223,205,120,252,201, 83,252,248,243, 43, 92, 94,
+239,208,245, 30,103,235, 30,119,239,110,240,224,141, 51,188,241,238, 27, 56,126,112, 7, 39, 39, 27, 78, 19, 52,186, 78, 73,145,
+ 21,219,124,129, 89,222, 75,211,187,208, 80, 38, 16, 31,220,112, 14,122, 35, 42,153,247, 6, 69,173, 68,102, 1, 35,149,202,218,
+ 15,154,144, 25,182,136, 85,134, 3, 81, 26,158, 71, 73,123, 13,150,129,201,168, 5,200,206,193, 22,143,156,136, 33,208,228, 2,
+169,196,116,144,238, 86, 4,183, 18,231, 41, 44,123,101,112,163,194, 48,217, 76,162, 55,179,114,215,205, 65,182,185,165,174,136,
+ 47,139,218, 34,156, 11, 28,223, 90, 37,239,138, 4,195,188, 74,148, 60,117, 24,198,246,178, 7,154, 46,122,222,151,114,129, 97,
+ 96, 84, 64, 74,159,173, 93,194, 91, 44, 96,141,103,219,147,161,132, 76, 22,129,117,221,194,108, 87,103,143,149,162,115, 73,209,
+172,173,194, 91, 33,192, 73,150, 65,213,245,146,115,196, 97,160, 41,145,227,142, 49, 47,152, 90,158,182, 22,246, 89,167,148, 40,
+178,216, 8,205,206,113,212, 41,189, 11,173, 80,158,187,151, 11,175,113,164,115,161,253,117, 51, 11, 55, 95,248, 24, 20,170, 35,
+ 94,245,202, 96,177,162, 98, 50,195,231, 52,217,101,185,184,247,142,253,229,212,192,129, 85,227,161, 31,121,237,203,221,109,171,
+176, 77,152,255, 84,116,150, 82, 80, 82,228, 51, 32,171, 37,205,170, 69, 80, 82,254, 72,125, 79, 79, 49, 61,215,214,100,237,166,
+ 15,195,118, 68,117,224, 37, 88, 5,109,233,170,205, 18,242, 98,248, 66, 23, 10, 99,213,188,116, 0,112, 48,246,245, 64, 24,109,
+ 58,184,147, 23,152, 78, 45, 77,195,167,234,193,250,103,113, 43, 56,117,113,145,238,165, 59,136, 59,110,204,138,233,130,138, 49,
+ 14,149,135,242, 27,121,238,218,104, 39,235, 20,120, 34,226, 54,107,128,213,122,228,189,138,193,236,102, 37,227,180, 70, 23,136,
+ 96, 59, 91,173,116,169,134,192, 66, 38,161, 62,209,216,210,245,129,199,229,164,118,164,241, 54, 85,231,193,152,215, 32, 22,212,
+169, 46,217,216,186,135,182, 52,218,107,169,192,122, 26,199, 81,194, 82, 83,114,148, 49,175,143,230, 4,150, 67,182,188, 2, 99,
+129,113, 61,144,202,181, 53,132,206, 41,200, 33,140,129, 59,225,153, 5,134, 21,145,199,244,180, 87,161, 60,140,121,206, 52, 54,
+ 67,195,188,219, 19,115,152, 57,213,214, 52,250,162,141,193,126, 63,163,164,196,251, 55,234,218,115,206, 90, 29, 82, 88,137,196,
+ 30,210, 62,153,210,150,168, 48,244,204,235,174,149,198, 48,206, 56,250,107, 69,114,145,137,238,215,245, 61,143,236, 12,154,161,
+196,177, 48,244, 74,187,115, 7,233, 89,206,187,229, 37,225,234, 55,206, 51,143,103, 73, 23,145,152,189, 79,241,128, 52, 94,234,
+143,238,192,117, 35,218,156,176, 90, 15,184,184,127,130,143,127,252, 67,164, 24, 89, 4,211, 20,226, 99, 61, 85,252,198, 46, 94,
+ 81,203, 40, 86, 47,160, 27,177,253, 85,201, 31, 22,210, 92,227,188,249, 3,117,169,142, 66, 25,240, 97,205,235, 73, 86,178,253,
+ 51, 75,184, 68,101,145,168, 83,222,124, 59,216,131, 58, 86, 73, 83,183,148,226,140, 24, 35,110,174, 34,199, 98,174, 48,174, 86,
+ 56, 62,222,192,121, 79,154,144, 82, 49,140, 3,188,163,148, 64, 52,224,249,231,215,132, 65, 30,137,157,111,205, 76, 89, 0,219,
+ 27,248,235,151,200,187, 9,215, 79,159,193,195, 98, 61,116, 88,141, 1,206, 26,244,101,194,116,121,137,109,189, 65,253,232, 51,
+252,155,223,190, 7,164,130,218, 44,186,206,225, 4, 6, 71,235, 30,253,216,225,238,183, 30, 0, 71, 71, 84,132,111,111,113,245,
+242, 10,207, 31, 63,195,143,254,240, 99,252,193, 63,158,208, 13, 3,126,231, 63,255,143,240,253, 63,253, 1,198,163, 17,119,206,
+ 86, 56, 61, 93,209,244,107, 28, 88,108, 4, 52,107,224,123, 18,222,208, 58,169, 96,189,233,145, 82, 68, 41, 36,122,116,182, 98,
+222, 39, 56,103, 16,186,158, 53, 36,149,247,145,148, 87, 95, 12,185,105, 10,219,176, 80, 43,121,210,179, 69,215,143,136,141,148,
+197,173, 70, 77,228, 43,217, 34,115,215, 38,221,172, 53, 80,193, 35,137,194, 28, 39,178, 81,250, 86, 65, 62, 8, 18,225,131, 22,
+ 70,159,167,146, 11,235, 88, 44, 83,208, 50,208, 14,162,138,205, 18, 86, 84, 24, 48, 35,250, 14,192, 34,116, 28,201,220, 56, 39,
+130,215, 22, 96, 91,173, 42,239, 43,141,210, 77, 99,240, 82, 17, 70, 43, 53, 28,138,109,199,178,111,111, 7,123,248, 16,122, 30,
+ 53,251, 69,245,222,170, 78, 44, 32,221, 35,133,250, 81,209, 41,180,180,214,144,203, 82, 60,132,208,193,187,128, 97, 53,178, 37,
+213,235,115, 44, 68, 76,178, 15, 6, 78,127, 44,152,166,137,156, 56,205,162,227, 48, 23,233,226, 1,238,240,173, 67,207,147, 12,
+ 41, 52,104,242,102, 25,175, 76, 29,101,102,177,162, 82, 3,185,160,170, 2, 13,170, 50,117, 21, 26,158,209,243,219, 28, 80, 33,
+101,205,235,217,155, 46,211, 3,137,207, 22,123,173,166,111, 50,223,159, 4,148, 60, 9,104, 85,215, 33, 36,206, 44,186,190,164,
+ 66,180,192, 32,243, 56,221,170,207, 93, 46, 71, 57, 15, 32,177,201,198,192, 66,244, 18,208, 21, 2, 12,255,222, 52,118,209, 73,
+142,226, 94, 15,114,228,141, 56,101,242,130,195,150,123,181, 48, 73, 85, 68,221,134,155, 26,104,172,106,125, 45, 75, 93, 82, 37,
+ 91,109, 44, 42,174,156, 13, 33, 81,117, 86,188,232, 36, 60,145,236,234,204,158, 81, 99, 44,230, 73,130, 48, 22,139, 84,109, 64,
+224,174, 89, 58,190, 14, 64,140, 81,247, 79,180,195,170,186,207,241, 33, 48,161,138, 20,211, 49,102,172, 55,180,252, 87,111,187,
+163, 7,136,130, 95,232,195,219,239, 19, 54, 71,158, 71,110,128,243, 84,173,251,209,235,101,100,141,133,119, 22,177, 85, 98,106,
+ 51, 15,222,121,171,227,226,126,236,245, 18, 72,169,106, 21,220, 98,211, 23,139, 46, 32,160,168, 56,176,113,117, 13,182, 51, 65,
+131, 32,172, 53,244,251,194,160,236,103,250,157,120,242, 48,239,118,140,127, 12,132, 26,172, 65, 47, 17, 1,218, 84, 78, 93,170,
+149,180, 8,158, 63,123, 99,172, 62,136,206,129,187,124, 46,188,184,155,202,205,168,103,155,124,180,203, 14,210,121, 18,121,133,
+ 16,144, 75, 37,132, 98, 63,114, 53, 23, 84,176, 38, 23,183,236, 98,105,116,196, 15,174,105,216,239,118, 92,113, 39,221, 3, 74,
+ 23, 44, 7,183,177, 14,171,211, 71, 72,115,198, 48, 4,156, 95, 28,195,180,136, 15,126,244, 55,250,146, 84, 14,110,232,254,127,
+170,222,236,215,182,244,186,238, 27, 95,183,214,218,251,116,247,214,189,117,171, 35, 89, 36,139,173, 68,145,161, 8, 65,162, 77,
+ 88,138, 19, 3, 70, 2,219, 65,222,242,144, 39,191,230, 15,202, 91, 16,228,193, 48, 2, 4,137, 19, 36,113, 12,199,129,109, 82,
+164, 40, 82,148, 68, 81,165,106,216, 85,145,172, 42,214,109,207, 57,123,175,181,190, 46, 15,115,204,185,246, 37, 4,148, 88,188,
+205, 57,251,172,245,125,179, 25,227, 55,134,225, 36, 91, 32,145, 51, 16, 78,108, 34,206,128, 51,237,228, 5, 83,166,182,228,110,
+111, 59,169,156,139,133, 45,216,115, 73, 92,108, 37,126,216,112,159, 28,117,234,203,100,214, 18,142,170,229,165, 75,246,125,233,
+222,189,181,130,227,225,200, 29,121,194,179,167, 79,112, 60,220, 98, 62, 28,112,117,231, 18,206, 7,140,227,128,148, 18,246,231,
+137,122,142, 21,251,115,217, 43,230,181, 97,154, 34,246, 83, 68,184,126,132,240,236, 35, 20,231,145,107,199,135, 79,111,112,134,
+ 9, 95,248,220, 43,184, 28, 58, 14,143,175, 17,158, 62,193, 3, 20,252,243,255,228,203,120, 97, 2, 18, 26,234, 42, 25,213, 46,
+ 4,248, 36,251,222,118,117,142,178, 59,195, 68, 94,248,112,247, 10,211,157, 43,220, 45, 43, 94,191, 72,168, 93, 46,200, 79,156,
+ 71,220,121, 48,224,241,111, 31,226,248,236, 17,214,245, 37, 60,185,158,241,240,233, 1,183,115,193,179,195,130, 37, 55,124,235,
+ 31,127, 5,247, 94,186,162, 88,172, 97, 62, 10, 45, 45,175,114, 80,122, 22,103, 10, 82,146,110, 86,242,208,203,186,162,100,160,
+228,133,221, 17,187,120, 47,233,102,243,220,208, 91, 68,136, 35, 90,157, 81,248,185, 58, 4,148, 60,195,187, 32, 29,187, 3, 66,
+ 26, 76, 15, 1,120,194, 55, 4, 73,171,185,217,112,129, 7,185,236, 64, 53,143, 29,102, 61,234,166, 8,246, 74,244, 51,245, 52,
+ 3, 98,104,199, 27,152,165,158,168, 67,152,231,138, 52,130,225, 71,163,156,103,107,222,112,196, 69,114, 49,100, 37,185,121,151,
+213,153,233,221,134, 4, 53,108, 52,247,224,186,218,210,169,155, 66, 97,198,105, 34,219,160,219, 37, 47,227,100,125,190, 29,221,
+ 32, 50, 29,136, 20,225,229, 82,237, 29, 75,113, 32, 98, 54,218,138, 78,215,116,240,114, 37,117,159,144, 25, 98,116,156,103,220,
+ 92, 95, 11, 6,119,220,163,148, 46,202,115,120,187,128, 84, 95, 37,255,155,138,222,200,224,144, 17,221, 22,163,205, 9,138, 88,
+ 82,201, 60, 47,133, 68,182, 78,196, 43,211, 52,169,240,215,253,190,140,237, 69, 15,148,134,209, 38, 21,165,138,104, 83, 34,167,
+157,164,187,145, 36,216, 72,116, 68,111,210,165, 67,224, 73,218,173,251,176,173,104,132,117, 80, 24, 12,212,108, 76,174, 46, 33,
+237,202,213, 97, 35,103, 67, 39,107,110,203,104, 7, 39, 19,142, 77, 85, 33, 81, 78, 73,171,202, 96,151, 12,130,141, 19,111, 14,
+ 9, 77, 45,212,136,159,222, 4,208,227, 28,130,231, 61,210,100, 53, 45,137,120, 91, 67,173,233,163,186, 62,150,130, 86, 44,191,
+154,135, 18, 3,247,208,141, 42, 72,223,165,106, 90,230,213, 0,247,178, 71,151, 31,158,118, 46,138, 47, 84,251,148, 74,252,163,
+ 38,179, 13, 3,128,204,203, 59,158,116, 66,222, 84,160, 82,149,110,234,234,105, 26, 49, 47,153,157, 79,130,191, 56, 67, 45, 18,
+ 56,115,115,125,139,148,228,162,222,157,193, 46,189, 52, 4,203, 43, 78,220, 45,109, 35,106, 29,227, 52,219, 59, 13,100,112,203,
+191,215, 15, 76,132, 97,146,204, 36,221,226, 74,209, 90,136,204, 22, 55,102,122,227,136, 94, 58, 87, 21, 65, 29, 15, 43, 74,109,
+146, 83,204, 17,113,171, 5,105, 24,248,123, 58,234, 10, 75, 13, 66,127, 62,121, 78, 65, 10,133, 15,149,140,241, 58,177, 14,253,
+196, 3, 92, 44, 23, 88,109, 45,122,128,218, 75, 18,156,253,220, 92,237,200, 14,162, 58,143,194, 30, 72,156,178,232,101,238, 52,
+ 80,226, 36,144, 66, 29, 7,243,241, 40, 94,123,194,136, 42, 95, 62,245,245,251, 32, 5,222,238,234, 1, 66, 58,131,111, 13,231,
+231, 19,238, 63,184,196, 91,127,249, 61,162, 31, 55,181, 54,156, 90, 85, 0, 16, 48,162, 99,204,222, 29,170,211,253,183,135,103,
+188,108,173,133, 40, 70,230,212,115, 82,209, 56, 33,144, 28,251,186,101, 87, 83,125, 45,133, 82, 49,165, 41,156,131,111, 64,247,
+157,106,240,108, 59, 79,157,248,168, 48,197,242,213,169,129, 88,150,249,196, 10, 84,137,208,236, 56, 28,110, 80,139,172, 56,174,
+238,220,193, 56, 70,198,195, 54, 12,211, 0,239, 14,124, 73, 43,230,235, 25, 83,185,198,148,111, 17,119, 59,172,213,225,186,207,
+120,218, 10, 62,247,210, 43,248,202,151, 94, 3,142, 43,250,188, 96,125,122, 0,114,193,189,203, 17, 67,116,136, 45,227,208,129,
+247, 63, 62,224,221,135,207,240,184, 0,135,210,113,219, 62,194,189, 31,188,135,207,191,126, 31,127,240,181,215,241,234, 43,119,
+ 48,238,119,168,209,131, 10, 10,132, 49, 33,185,134, 59, 23, 59,236,242,130, 97, 63,226,226, 43,159, 64,129,199,237,188,162, 49,
+175,250,209,227, 27,124, 60,120,180,188, 10, 56,137,211, 46,143,138, 24,153, 76, 24, 4, 4,211,106, 70, 41,142,209,154, 44,254,
+ 25, 30,226,156, 94, 48, 34,226,170,101,229, 51, 41,154,150,188,122,164, 97, 66,171, 51,208, 35, 85,219, 13,165,102, 68,229,234,
+183,134, 52,142,114,128,114,108,190, 46,194,223, 87, 60,166,247, 17,185, 22, 30,199,116, 95,148, 45, 21,204,241,210,219,248,243,
+ 5,128, 96, 81, 69,239, 36, 93,127, 36, 13,173,119,113, 5,228, 53, 75,114, 89, 74, 2, 22, 98,110,124, 71, 55,212,234, 41, 44,
+201, 25,155, 91, 58,118,239,229, 34, 82,129,149, 83,119, 7, 69,156,234,167, 7,164,179, 78,195,184,133, 51,113,218,151,248,126,
+245,147,231, 92,225, 46, 58,106,205,165,108, 99,253,224, 49,142, 19, 82, 74,219,250,194, 68,200,153,130, 49,201,172,207,204,126,
+191,189, 57,224,246,112,195,100,190, 17,206,241, 29, 8,138, 1,230, 90,198, 38,179,221, 10,164, 76, 48, 87,101, 46,253,169, 19,
+ 73, 59,215, 90,132,223,222,154,232, 52, 68,211, 32,120,106,245,124, 55,238,227, 11, 17,220,146,219, 49, 42, 68,119, 59, 99,108,
+229, 82,184, 94,203, 39,121, 24,153, 19,159, 42,137,110, 0,245, 3,154,142, 82,196, 58,140, 74, 81, 99, 99,163,218, 54,248, 11,
+241,217,202,244,240,110,131, 4,193, 72,128,180,243,241, 66,119,222, 89,134,249,134, 63,151, 19, 45, 70,218,155, 37,234,144, 62,
+115,111,171, 31, 75,132,236, 98,137,141,180,166, 53,238,203,213,226, 39,211, 94,152, 6, 73,156, 89,201, 52, 31,170,113, 19, 38,
+131,156, 89, 17,206,195, 97, 35,179,233,216, 68,198, 78,253, 57, 85,124,107,221,246,236, 34,173,247, 54,106, 17,220,170, 23,175,
+ 58,119,112,242, 82,104,226,149,127,110,156,169, 35, 53,181,133,105,231, 54,142,131,141, 49, 23, 39, 29, 91,168, 17,227, 52, 9,
+ 12,164,169, 15,179,194,119,111,246,167,113, 28, 49, 76,201,162, 52,245, 18,137, 41,201,127,247,158,149,173,136, 19,214,121, 21,
+177, 21, 85,212,211,126, 20,237,138, 99,204, 42,154,249,187, 59,243,108,197, 75, 75,155,143,231,216,104, 24,140,243, 61,207,171,
+252, 80,104,167,242, 62, 88,222,113, 43, 89,138,130, 78, 32, 66,107, 50, 18,175, 5,205, 9,239,183,183, 77,128, 99, 35, 97, 11,
+ 50,145,145,188, 39,233,170, 17, 40,161,197, 81, 39,188, 66,237,106,146,202, 37,223,171,239, 25,189,201, 24, 83,243,174, 67,220,
+126, 6, 93,160,110,226,131,165,186,184,150, 38, 23, 99,149,213, 64,163,128, 67,172,116, 50,217,170,172, 74,125, 8,216, 93,125,
+ 2,189, 53, 12, 67,192,229,213, 25,202,114,131,159,190,249,183, 39,160, 28,108,197, 95,107,128,247, 76,119,210,110,187, 90, 71,
+ 97, 65, 6, 4,138,232,101,176,165, 97,193, 62, 35,121, 22,250, 9,241,169,161, 48,133,111,203,207,110,118,209,200,231,209, 68,
+229,111,200, 78,229, 48,104,119, 9,243, 62,231, 44,113,195,157, 97, 50, 96,222,188, 82,203,130,247,104, 77, 14,232,227, 65,248,
+253,103,231,103,216,237, 38,164, 52, 96, 72, 17,117, 93,209, 50, 16, 92,195, 24, 39,248,222, 16, 82, 66,244,128, 75, 17,175,222,
+127, 9,127,244,247,127, 23, 15,238, 95,160, 30,102,220,126,244, 4, 1,210,221, 58,239, 48, 47, 11,254,244,237, 71,248,139, 15,
+158,225, 73, 7,188, 11,136, 20, 48,117, 0, 31, 92, 47,120,239, 47,127,137,239,253,228,215,248,234, 27, 15,240,199, 95,123, 13,
+ 15, 82, 4,206, 70, 72,171,238, 48,207, 43,194,152,196, 29, 81, 42,234,211,103,240,247,239, 99,168, 13,240, 1,117, 93,241,242,
+139, 23,184,153,103,226, 88,133,207, 93,214,140,152, 28,218, 42,124,234,238,153, 26, 5,229,184,203,225, 42,142, 65, 71, 37,182,
+144, 17,129,193,200,134,181, 10,247, 97,153,143, 2,216,104, 3,134,233, 2,243,225,153, 89, 66,229,240, 47,168, 33, 34, 36,122,
+121,121,209,168, 96, 76, 66, 92,188,117, 42,161, 69,179, 67,170,102,179, 54,136, 46, 72,227,127,187,166,207,245, 77, 23,196, 3,
+ 53, 13,131,100, 83,248,128,188, 86,219,131,167, 33,145,164, 73, 85,119,109,124, 39,138,233, 46, 60,213,234, 37,175,252, 26,229,
+162, 85, 23,132,106, 77,132,105,225, 55, 6, 3,109, 92, 14,154,109, 47,197,254, 56, 77,162,255, 33, 40,199, 57, 65,213,110,150,
+ 58, 24,107,223,187, 0,120, 78,229,216, 81, 11,251,221,111,133, 47,121,252,242,123,154,129,135, 90,107,184,126,118,141,101, 89,
+ 4, 99,205, 11, 92,169,140,224,136, 57, 80,185,238,253,166, 48, 87, 27,169, 34,166,205,106,235, 3, 19,252,156, 89,216, 10,173,
+135, 82,224, 78, 38,104,221, 0, 54, 30,173, 10,141, 79,168,113,194,116,215,220,120,157,210,169,251, 69,166,136,205,118,244,173,
+ 84,184, 94,236, 50,215, 56, 90,130, 89,165, 1,170,155,104,205, 59,181, 76, 90,162,203, 70,248,235, 27,129, 83, 39, 61, 26, 38,
+165, 22,111, 89,251,184,147,127, 7,134,196,208, 1,208,182, 12, 1, 93, 41,107,175,191,201,119, 59, 11,166,102,169,117,222, 7,
+123, 34,244, 12,215,224, 44, 45, 80,172, 96, 34,215, 64,223, 7, 41, 28, 58, 82, 26, 40,180,115,136, 3, 47,239, 82,152, 94,214,
+ 56, 82,200,197,172, 20, 50, 14,146,145,102, 72, 81, 62, 40, 95, 81,138,183, 3,123, 93, 51,197, 30, 1, 49, 4,212, 32, 59,244,
+204, 63, 71, 59, 54,149, 60,231, 92,196,191, 75, 24, 70,171, 21,185, 3,227,228, 25, 9,200,189,106, 41, 8,177, 99,119,230, 76,
+113, 93,178,188,196,162, 4,109, 72,105, 27,117,233, 14,125, 24, 5,179,169, 15, 94,226,238,185,123, 81,238,245,214,112,115, 88,
+216,237, 15, 54, 38,113, 36,128, 45, 21, 8,154,165,205, 34, 69,210,209,182,136,215,228, 4,195,185,174, 5,199,227,194, 8, 86,
+ 41, 68, 96, 41,114,226, 59, 31,210, 36,213,104,109,112, 33,160,151,138,218, 36,245, 40, 69,143,222,156,141, 87,106, 41,224, 16,
+ 71, 46,244, 90,121,240, 9,185,200,161, 19, 58, 17,205, 18,161, 94,118, 40, 28, 2, 13, 30,244,215,247,128,224, 65,139,211,150,
+219, 94, 21, 39,203, 60,235,112,178,135,158, 73,162, 50, 21, 60,201,125,157, 1, 3,226,253,103, 97, 51, 93, 34,141,151, 40,185,
+ 96,191, 31,113,255,165, 43,252,232,219,255,175,237,137, 78,171, 82,112, 42, 17, 25,179,170,187, 38, 45, 38, 10,113,181,157,234,
+100, 17, 64, 6,123, 9, 61, 28, 74, 19,241, 75,169,133, 35,175,190, 93,182,232,194,249,167, 99,162,247,102,149,175,122, 76,245,
+ 50,151, 40,223, 73,246,194,196, 46, 6,231,144, 53, 2, 82, 39, 46,173, 89,170,152, 6,184,196,224, 16,131, 8,155,134,113,224,
+216, 86,138,158,154, 87, 60, 91, 22,140,211,132,188, 22, 73,249, 67,199,184,155,176, 60,123, 2,119, 43, 94,240,233,124,196,213,
+167, 94,193, 55,250, 25,238,222, 61,199,229,110,192,114,152,113,120,124,141,253,229, 30, 45, 23,188,255,241, 51,252, 31,223,251,
+ 25,126,177, 8, 86, 55,250,136,192,138,255,156,122,139,133,177,201,107,107,248,206,155,239,227,219,127,251, 11,124,235, 19,119,
+240, 39, 95,120, 17,247,239,236,177, 30, 87,140,209,195,223,153,176, 60,140, 40, 77,222,161,154,129,167, 55, 11,230,165, 98, 64,
+197,179,210,128,171,196,103,163, 19, 1, 42, 7,122,171, 2, 72, 10, 1,232, 77,190,199,170,185,212, 4,139,196, 20, 49, 76, 35,
+ 74, 94,140,193,221,155,183, 2,203,117,177, 91,201, 58,206,193,135, 1, 49, 77, 88,151,131, 60, 31, 28,199,171,234, 91, 70,202,
+224,142, 49,200,123,131, 83, 30,132,144,227, 74, 89,144,124, 56, 89,191, 48,203,224, 68,136, 38,118,204, 98, 33, 47,222,123, 73,
+ 71, 20, 0, 5, 73,152,171, 81,218,198, 29, 93, 17, 36,144, 85, 38,246, 9, 16, 43,219, 51,109,137,133,189,217, 58,107,203, 44,
+232, 6,168,145, 51, 83, 38,111,206,162, 99, 35,195,137, 58,166,105,226, 58, 40, 96, 24,100, 4,171, 42,119, 45, 92,101, 58, 23,
+ 72,118,108, 76, 80,148,239,101,226,232, 94,157, 48, 41, 12, 44, 80,212,106, 43,207,247,178,102,204,199, 3,150,117, 21,220, 47,
+188,129, 79, 26, 28, 2,223,167,148,252, 9, 41, 31,240, 49, 81, 33,142,231, 46,218, 74, 69,189,166, 24, 10,118,124,181,226,161,
+181,142,105,191,231,103, 28, 13,135,234,160, 59,247,237, 2,243,124, 79,185, 90, 70, 36,153, 77,178, 6,164, 17, 66, 35,167,158,
+104,225,222,116, 93,216,237,226,244,232,104, 77,226,140, 27,207, 77, 71, 59,155, 92,232, 10, 82,114,219,106, 15, 91,114, 27, 7,
+246, 66,253,115,202,206,102,110,123,219, 64, 67, 26, 83, 44,127,182, 51, 75,172,146, 6,205,214,216, 59,106, 19, 17,184,170,232,
+ 69,148, 46,188,128,224,189,137,221, 84,227,101,207,141, 6,167,245,110,169,148,186,165,108,154,173, 94, 27, 66,116,168, 69,138,
+217,168, 21,128,250,141, 67,144,135, 90,213,225, 2,118, 25, 25,222, 81,236, 11, 45,115, 69, 26, 68,200, 37, 23,180,216, 15,214,
+ 92, 76, 52, 7, 31, 48,140, 82,193,165, 97,144,189,156,151,135,193,195,193, 13, 30,235,202,138,178, 48,149,201,201,223, 39, 35,
+ 28,170,179, 87,217, 79,250, 16,108,164, 38, 16, 21,152,135,120, 24, 18,169, 90, 9,203,188,152, 85, 41,183,204, 9, 1,161, 50,
+172,222,197,183, 62, 48, 97,173,211, 54,163, 24,208,204,104,215, 46,221, 27,139, 26,239, 39, 57, 52, 26, 80,230,140, 82, 58, 14,
+183, 71,220,222, 28, 76,197,143, 19,144, 66,111,128, 31, 34,171, 65,174, 2,168,160,245,142,142, 0,126,109,114, 41,173, 38,244,
+ 82,219,150,166,101,245, 30,108,175,210,170,160,102, 45,128, 1, 82, 60,216,158,142,177,171,112,157, 23, 47,171,208,146, 1,238,
+143,148, 71,236, 25,197,169,165,167, 98, 35,101,188,165,197, 82,219,242,162,117, 92,125,210,249, 94,220,255, 12,122,239,216, 77,
+ 9, 87,119,207,176, 28,158,224,215,191,252, 57,197, 71,180,186, 40, 71,206, 44, 67,253, 57, 32, 71,173, 98,201, 27,198,193,124,
+190, 10, 43,145, 67,163,216,244,194,220, 15,112, 22,131,186,137,228,148, 18, 37,251, 85,199,203, 63,132,196, 16,143,196, 93,148,
+142,184,104,131,164, 56, 47,231,108, 14,138,101, 97, 74,211, 73,102,113, 34, 48,105,127,182,199, 52, 77, 38,218,217,184, 9, 34,
+126, 76, 49, 96,157,103,148,236,208,252, 96,244,185,249,209, 99,132, 82, 49,237, 71, 76, 23,123,212,167, 25,151,119,206, 49, 69,
+ 15, 44, 11, 14, 31, 61, 70,190,189,133,115, 30, 63,255,240, 41,254,229,119,223,198,195, 90, 16, 93,192, 62, 36,124,254,193, 37,
+190,112,111,143,215,238,157,225,206, 89, 66,227,187,144,115,197,135, 79,143,248,235, 95, 60,198,155, 31, 63,195,191,121,239, 67,
+252,249,123, 31,227,191,253,131, 55,240,149,215, 95, 64,239,192,254,238, 5, 30,167,143,209,154,195,252,240, 26, 45, 59,148, 39,
+ 79,241,232,216,112,225, 10,126, 81, 28,238,237, 31, 8, 46,211, 59, 30, 66, 85,148,250,209,137, 90, 62,116,203, 4,144,247, 57,
+ 32,157, 37,198,252,106,178, 26,139,198, 34,214, 42,181, 15,245, 46, 19,193, 70,187,147,236, 85, 51, 60,249, 7,138,224,245, 97,
+ 16,109, 78, 76,128, 19, 69,176,138,140,244, 82, 17,226, 96, 20, 59, 28,243, 17,100,140,170,221,164,138,156, 84,221, 47, 29,178,
+100,145, 39,211,180,248, 56, 96,156, 38,225,102,199,136,149,121, 1, 42,190,179, 73,101, 99,135,216,113,226, 73,119,182,238, 67,
+133,113,225,109,148,101,222,238,102,200,101, 83,241, 67, 26, 23,231, 69,156,230,189,128, 86, 66,218,146, 30, 85,151,161, 9,122,
+142, 54,183,202, 73,170,118,106, 41, 69,190,139, 13,209,109,234,232,192, 95,223,123, 37, 81,177,226,246,230, 86,220, 54,107, 97,
+182,128,219,248,241,142,170,125, 78, 63, 55,192, 81, 56, 41,192,183,162,165, 54,240,110,200,128, 33,148, 79, 10, 50,231, 17,162,
+ 4,199,196, 33,154, 75, 65,201,132,104, 21,153,107,205,168, 17,213, 18, 97,199,240, 44,250,204,185, 6,211, 41, 69,175, 20,222,
+149,153,235,141, 6, 23,156,136,110, 75,102,202,153, 76, 93,100,152, 92,121,158,118, 4,189,164,233,183,199, 9, 32, 6, 39,132,
+ 63,141,204, 85, 97,181,118,219,254, 52,154,149,116, 78, 1,193,128, 17,169, 32,252,136,103, 43,116,133, 65,242,155,163, 77, 25,
+129,137,122,142,113,171,158,159, 87,162, 77, 82,214,198,195, 56,242,107, 87,132,174, 36,117,246,202,175,205,123,132, 8, 75,239,
+172,165, 33,142, 99,162, 0,193,163, 54,207,128,134,110,138, 78,120,142,179,189, 99, 10, 88,165,157, 9,112, 57,163,142, 3, 58,
+ 42,247,164,241, 36,120,222,147, 31, 14,180, 37,195, 53,135,113, 26,204,247,220,188,216,127,198,105,148,151,139,233, 72,150,145,
+ 14,129,192, 44, 51, 48,140, 98,175, 26,134,122, 82,177, 80,192, 64,241,137,160, 20,101,100,162,118,186, 82,170,160, 44,179,130,
+ 71, 88,164, 12, 30, 43,194,137,237,197,155,178, 85, 16,163,158, 65, 4,221,198,239,106,163,200,107,150,241, 9,167, 19,243,156,
+ 77,165,174,226,171,117, 93, 17,124, 55,223,170, 90,226,106,227, 94,188, 53, 84,181,102,213, 66,112, 3, 51,151, 57, 86, 14, 30,
+140, 57, 60,169,146, 77,108, 3,116,238,148,204, 59,172, 40,216,146,101,231,233, 2, 66,148, 17,207, 52, 9, 41, 48,141, 82, 8,
+ 84, 86,131,178, 35,239, 91,128, 76, 17,158,125,201, 43, 71,237,205,200, 74,182, 58, 49,235,151, 92,176,195,254, 46,226,112, 9,
+244,134,253,249,136, 23, 95,186,194, 15,254,253,191,129,115, 18,124,163,137,127,176, 60,228, 45, 34,214,121,143,200,117, 7, 78,
+246, 80, 26,165,170, 10,227, 82,178,113, 20, 96,186,141,198,177, 46,177,181,204,175,134, 69,165, 58,235,192,132,122, 22, 69,208,
+ 2,207,168, 73,207, 11, 94, 46,163,202,159, 65,100,138, 96,103, 74,147,142, 50,199,113, 48,177,203, 48, 16, 80,210, 59,246,251,
+221,102, 55,164,245, 42, 70, 21, 91, 2,251, 81,224, 57, 75,115,136,107, 6,214,130,150, 87,140,103, 59,132, 56, 96, 46,133, 69,
+104,195,227,159,253, 10,183, 79,174,209, 59,240,183,239,252, 6,255,226,135,239,162,184,128,215, 46,239,226,143,191,249, 59,248,
+226,231, 95,198,221,201,163,253,242,151,168, 89, 38, 62,178, 43,140,112,232,120,229,254, 57,190,246,153, 23,240,244,217, 1, 63,
+252,233, 99,252,235,183, 63,192,127,255,253,119,241, 79, 31,207,248, 47, 63,245, 58, 66,233,104, 93,210,160,106,233,104, 79,158,
+ 97, 31, 28, 62,121, 21,177,222, 54,228, 15,158,225, 7,191,190,193,227,155, 5,127,248,173, 79,227,242, 42, 88,170,148,236, 81,
+ 87, 52, 47,254,217,166,225, 72, 37, 19,246, 35, 63,211,113, 28,144, 91,230,200,186,152, 22, 37,120,135,222,188,125, 46,181, 64,
+ 8,120,113, 68,136, 2, 8,169,173,159,172,132, 88,152,217,146,161, 91, 17, 81,153,105, 96, 59,206,144,108, 76,169,228, 60, 67,
+ 88,240,215,108,216,205,190, 5, 20, 85,153, 94,197, 24, 1, 62,207,229, 86, 56,229,195,152,158, 35, 38,154,139,162,119, 22, 52,
+164, 72,246,141, 83, 14,180,109,199,206, 11,191,182,138,224,195,182, 23, 55,191, 51, 12, 96, 18, 83,192,126,191,223, 60,216,236,
+101,155,135, 21,172,176, 49,120,195,110,191, 51,224, 85, 76, 9, 49,137,179,162,113, 20,171,251,224, 74,207,122,206, 5, 57, 23,
+220,222,222,160,148, 98,187, 91, 7, 79,107,169, 20, 79, 90,168,196,152, 78, 64, 46,206,220, 34, 18, 98,228,172,219, 78, 92, 79,
+ 56,175,251, 50,253,178, 83, 0, 0, 32, 0, 73, 68, 65, 84, 98,142,249,201, 52,177, 96, 46,218,245, 4, 64,148,141,213,175, 72,
+ 87,181,215,122,242, 79,116,237, 88,153, 81,239, 3, 25, 33,129,228, 56,166,166, 57,235,136, 27,201,106, 69,186,244,222, 76,157,
+207, 81,139,104,194,216, 2, 91, 1, 46, 57,103,198, 22,113, 92, 59,240,255,108,143,126, 2, 34,176, 78, 94,173,242, 93,201,110,
+104, 50,138,111,218,181,243,158,226,121,102, 24, 95, 78,170, 53,187,194,121,209,177, 41, 0, 72, 19, 21,149,141,160,161, 94,153,
+188, 24, 71,139,110,103,199, 39,235, 93,177,197,169,229, 57,170,224, 65, 83,186,224, 29, 82, 24, 12,242, 98, 85, 43,156,169,148,
+ 91,235,136, 73, 58, 28, 25, 69, 53, 59,184, 79,131, 13,212,135, 55,237, 70, 9, 0, 41, 34,132,144,130, 1, 27, 14, 47, 4,254,
+176,173, 95, 36,190,177, 74,244,225,218,153,186,147,196,227, 62, 13, 56, 30, 86,140,196,218, 74,210, 91, 98,247,219,204,166,149,
+ 6, 79,226, 27, 76, 21, 45, 47, 3, 48, 12, 17,183, 55, 11,134,193,195, 37,207, 76,101, 7, 87,229,240,145, 75,188,154, 31, 94,
+ 94,200, 2, 31, 2,230,121,193, 50,175, 56,220, 30, 77, 44, 23,163, 55, 59,220, 56, 10, 57, 78, 87, 22, 42, 22,170,117,235, 88,
+236,129,229, 88, 89, 84,224,188, 96, 89, 69, 6, 39, 49,147, 53, 47,182,203,113,208,181, 0, 44,247, 87,237, 98,218, 41, 36, 23,
+ 17,146, 71, 8, 66,109, 11, 60, 72,161,193, 23,212,133,200,133, 39,123,168,101, 89, 80, 75, 54,176,140,238, 29,117,252,172, 8,
+208,141,190, 41,240,146,233,234, 19, 40,185, 98,191, 75,184,119,255, 18,215,143, 63,194,199, 31,126,200,176,156,205,106,168,123,
+ 58,231, 20,221,216,201,165,142, 6,238, 0, 47, 69, 37,254,169,126, 37,132, 64,224,131, 50,236,197,215,217,105,253, 19,253,130,
+ 67,201,109, 19,228, 1,150,177, 28, 7, 81,180, 15,244,222,142,211, 72, 98, 30, 76,128,199, 6, 65, 18,228,106, 49, 77, 68, 8,
+ 1,187,105,226,115, 42,123,211,152, 18,198,113,176, 66, 78,112,163,137,207,118, 51,165,117,239, 14, 99,242,184, 56, 75,152, 51,
+ 4, 34, 17, 2,130, 19,177,230,186, 54, 60,124,248, 12,239,255,242, 9, 92, 95,240,169,207,222, 5, 98,194,175, 63,190,193,255,
+252, 23, 63,199, 16, 71,252,189,223,121, 29,127,242, 15,126, 15,247,238, 95,202,101,145, 23,228,228,225,181, 99,116, 50,169, 41,
+189,195, 51,111,249,236,124,135, 63,249,234, 30,159,121,241, 2,255,195,119,127,138,255,243,221, 15,241,217,247,159,224,235,159,
+126,193, 14, 44,160,195,119,177, 95, 13, 83,192,244,165, 55,240,143,191, 33,123,207,255,233,127,253,115,156,157,239, 49, 76,194,
+115,152,143,212,138,132,205,122,228,125, 68,136,242,185,231,156, 49,142, 34,126, 90,215,149,145,151, 17, 64,197, 50,207, 24,122,
+ 68,233, 14,195, 32, 41,114,121, 45,136,131,116, 32,121,105,136,113,148,226,177,117, 6,105, 52, 99,135,119, 10,155, 84,179,164,
+ 83,156,224, 68, 46, 32, 10,227,198,238, 7, 39,249,238,176, 73,147,118,215,122, 38,181, 6, 4,170,221,197,189, 38,103,151,231,
+115, 31,131,252,220,213,161,148,215,124,130,100,117, 50,129,243, 14, 57,235,206,215,139,149,203,109, 35, 92,229, 55, 24,220,133,
+192, 30,237,226, 53,255, 92,244, 64,194,122,215, 9,150,119,162,205,206,107,177,192, 14,253,121,167, 97,160,184, 83,138,136, 65,
+ 85,226, 39,185,235,157,223,167,142,237,115, 46,204,169, 23, 63,186, 88,167,248, 61, 19,219,108,188,113, 71, 11,151, 10,213, 88,
+ 44,233,229, 44,161, 79,226, 90,234,108,192, 84,227, 35, 86, 92,217,203, 7, 54,117, 46, 13,204,154,119,150,251,237, 85,183,228,
+ 61,198,113,164, 46, 71, 14,233, 82,171,116,240, 60, 31, 99,144, 85,176,119, 64,205, 34,118,172,101, 97, 0,153,140,221,157,171,
+ 70, 62, 84,204, 48,122, 67,240,178, 66,243,116, 47,137,141,248,121,180,174,174, 28,117, 23,174,188, 6, 93,197, 54,158, 93, 26,
+ 12,165,231,132, 61, 91,170,153,160, 86, 40,104,244, 42,188,184,133,124,180,113,250, 22, 26, 68,167, 14, 60,155,166,192,162,243,
+ 20, 72,228,204,166, 40,119,151,223, 2,107, 56,108, 40,122, 14,178, 49,149,233,120, 71, 84, 44, 41, 8,235,247, 81,252,149,126,
+ 24,208, 33,121,193,250,141,119, 10, 47,212, 23,172,135,218, 74,164,101,173, 69, 70, 72, 33, 2, 78,152,215,203,156, 49, 12,178,
+252, 31, 6,138,181, 6,121, 17,215, 53,163, 22,142,121, 2,199, 29,206,227,112, 59, 91,220,168,236,188,101,207, 55, 76, 19, 5,
+120, 17,216,251, 19, 92,160,116, 91,187, 75, 9,105, 81, 0,132,250,217,123,175, 76,108, 11,130,121, 13, 30,203,156,173,154,149,
+ 7, 3,198,150,159,215, 76,236,162,183, 96,133,101,201, 56,220, 10,124,229,120, 92, 48, 31, 87,198, 1, 38,171, 0, 85,109, 41,
+254, 73,121,114, 74,173, 76,117,106, 39,156, 97, 57,140, 2,199,197,129,208, 2,101, 78,203, 5, 61,195, 59, 71, 82, 30,199,213,
+157, 54, 51,134,171, 4, 29,213,163, 19, 18, 66,123,157,147,162, 43, 38,207,169, 95, 23, 46,182, 33, 8,229, 1,107, 20, 28,150,
+ 44,232, 87, 25,245, 53, 27, 55,169,149,240, 84,208, 88, 57,246,129,115, 24,207,238, 98,119,126, 15,181, 52,156, 93, 76,184,247,
+224, 18,127,250,255,252, 7,126,246,160,104,198,217,216, 81, 62,107, 25,197,139, 40, 37,114, 47,180,133,134,104,202,151,198,124,
+106,149,156,233,145,151, 84, 58, 71, 33,144, 18,199, 18,106,145,103, 79, 85,162,227,184,131,243,209,216,219, 10,174, 80,117,187,
+ 56,139,250,230,225,165,229, 70,166, 43,128,247,233,185,164, 58, 73,171, 19, 1,211, 52, 73, 78,187,194,107,210, 16,185,126,111,
+ 22, 97,108, 48,157,229,136,125, 2,198,208,176,252,246, 49, 48, 37,132, 48,161,149, 21,229,120,139, 95,189,247, 91,252,229,143,
+126,129,111,252,209,235, 64, 76,152,115,197,191,250,238,187, 24,134, 17,255,249, 87, 63,133, 63,249, 71,223, 64, 96,198,115,121,
+244, 16,158,208,155,226, 51,144, 43, 48, 12,232,181,195, 67,166, 22,174, 55,248, 46,251,236,207,188,122, 7,255,217,231, 95,198,
+255,242,119,191,198,247,223,253, 8,159,124,241,108, 43,142,164,217,194,184, 79, 24, 46,247, 24,238,221,197,184,159,100,199, 55,
+136,251, 36, 68,143, 82, 59,166,221, 36,133, 32, 54,118,186,163,224,169,148,138, 16,155,169,113, 99, 12, 2, 11,130, 19,215,132,
+119,152,143, 51,166,253, 14,165, 20,166, 61, 6, 91,255,192,123,184,144, 16,135, 73, 58,203,146,105,197,244, 39,158, 95, 25,231,
+235, 1,219,106, 69,117,155,200, 81, 4,187,202, 45,216, 92, 33,205, 14, 65, 61, 48,157,172, 22, 99,103,216,135,220,231,129,120,
+ 82,121,151,183,221,166,224, 73, 53,246,171,219, 59, 28, 8, 9,217, 78, 96,216,244, 80,119,201,218,213,115, 45,255,156,242,189,
+ 55, 96,156,118, 50,233, 26, 70,209,100,140,137,235,164,206, 14,125, 75,160, 3, 97, 72,137,171, 78,193, 56, 23,140,211,104, 10,
+244, 77,244,217, 13,146,210,154,184,113,150, 69,105, 99,141,211, 42,119, 18, 79, 29,236,189, 74,105, 16, 22, 0,119,205,218,105,
+ 62,175,108,223,194,105,154,178, 63,156, 55,231,136, 83,104,144,247,178, 62,116,206,118,253,157, 52,185,224, 29, 65, 58, 68,159,
+214,134,230,232, 55,103,216,139,162,137, 43, 54,156,172,216, 23,203, 70,108, 3,163,119,245, 75,211,162,138,118, 53,231,131,228,
+155,177, 81, 82, 87,148,254,216,186,219,236,179, 54,130,239,218, 65, 59,107, 62,187,238,234,249,239,192, 11, 25,252,217, 40,205,
+112,155,212,136, 40, 64,221, 74,112, 81,198,231, 39, 46, 1,189,176, 29,168, 73, 97,129,238,180,112,228,158, 63,156,228,180, 55,
+234, 9,116, 42, 21,163,156, 59, 33,122,201, 47, 80,125, 18, 24,111,168, 34, 6,195,108,106,134,247,201,194, 30, 76,110,106,220,
+ 47,121,250,129, 99, 10,188, 0, 42,106,208,252,225,196, 49,151, 23,161,131,122, 5,185,187, 57,205, 87, 79, 41, 82, 77,219,185,
+255,213, 61, 4, 76, 68, 53,216,154, 0,198, 46, 78, 99, 66,226,174,102,218, 37, 73,207, 33,250, 84, 89,223,149,192,255,141, 79,
+223,208,153,131,156,146, 99, 20, 35, 49,139,185, 96, 94,169,230,245, 73, 42,169,218, 81,136,123,173,181, 96,153, 87, 41, 48, 70,
+ 25,211, 74,192,133, 28, 98,195, 16,159,131,242, 31,110, 14, 76, 36,234,180,190,193,130, 14,188,135, 89,213,148, 20, 37, 15,188,
+172, 44,164,240,233, 36,168, 81,249,201,209,187,216,252, 60, 59,255, 98,197,132, 67, 23,132,233, 52, 24,224, 39, 14, 3,224,228,
+176,106, 16,139,155,101, 69,231, 85, 64, 12,189,161,149,149, 62, 78,233, 60,225,213, 3,188,133,216,224, 4,127, 90,115,198,229,
+ 43,175,163,213,142,221,110,192,253, 7, 87,120,248,193,251,184,126,250,196, 68, 68, 62, 60,239,115, 85,100,107, 26, 18,163, 76,
+171, 98,192,225,248, 44,136,125, 5, 44, 26,157,121, 83,189,183,102,222,198,248,162, 0, 21,204,237,186, 72,104,135,118, 44,250,
+244,123, 31, 13,165, 91,248,252,104, 17,161,135,190,140,144, 69,121, 61,237,119, 86, 13,199, 52,136,245,144,151,117, 74,145,140,
+125,207, 60,114, 66,108,106,231,138, 98,219,249,235, 68,170, 12, 30,104, 25, 67,136,240,247, 94, 64,197,125,249, 12,175,159, 0,
+189,224,225,227, 91,236, 81,241,202, 75, 87,136,231, 19,254,213,191,254, 9, 30,151,142,255,234, 15, 62,139,111,126,243, 11, 8,
+200,104, 23,151,162, 57, 88, 11,218,147, 39, 8, 14, 66, 36,116,178, 39, 14,209, 83, 57,235, 81, 22,201,143,238, 92,229,124,225,
+213, 43, 92,189,243, 17,254,242,175,126,138,254,219,143,241, 95,127,253, 53,249,249,140, 3, 46,223,248, 36, 66,138, 8, 67,194,
+238,234, 2,189, 55, 28,110,102,212,222, 49,237,146,237, 14,125,112, 12,212,113, 8, 44, 42,123,242, 88,142,210, 89, 87,126,230,
+142, 99,102, 61,240,125,136,112, 53,194,123,249,108,133, 79, 33, 5, 65, 76, 28, 49,198,132,238, 21,231,188,179, 46, 95,199,203,
+ 62,168,111, 88, 68,118,114,129, 69,142, 39,149,147, 14, 56, 47, 24, 78,181, 58,106,176, 77,107,234, 29,150,253,242, 56,120,179,
+131, 38, 22,129,242, 28,121,220,222, 30, 37,186,153, 35,121,213,222,168, 55, 94,255,188,206, 0,143,109,207,203,131, 90, 49,164,
+ 39, 23,135,172,221,212, 29,228, 24, 30, 52, 50,204,202, 99,183,159, 48,140,163,177, 41, 18, 45, 76, 61,103,238,195, 59, 39, 94,
+209,186,219, 82,178,172,232, 20,108,211, 65, 11,110,227, 72,182, 88,254,192,241, 56,155,142, 71, 93, 64,232,142,239,133, 20,102,
+173, 74,113,225,131, 71, 46,141, 64,171,138,224,187,157, 77, 74, 64,211,137, 98,215,179,137, 99, 99,125,207, 85,169, 45,199,152,
+ 20,188,173,138,107,160,243,125,151, 11,158, 8,107, 93,179,180,138,249,112,228,120,187,113,172, 12,212, 44,141, 70,231,202,177,
+181, 98, 42,118, 71,150, 5,161,233, 91,236,173, 38,117,202,226,136,119,201, 41,174,151,182,187,147,128, 26, 29,198,251, 19,136,
+145,102,140,200,133,173,122, 41,137,139,110,173,137, 21,212,176,201,125, 75,140,116, 39,247, 23,156,229, 85, 8, 95, 0,150,167,
+ 17,194,128, 82, 59, 87,202, 81, 38, 25,173,114, 34,210, 45,171,194, 10,135, 86,145,210, 96, 43, 20, 97, 15,104,163, 35, 98,205,
+ 24, 2,162, 2, 27,188,229,192,210, 39, 13,221, 73,178,243, 32, 74, 86,253,168,194, 7,167,108,223,109,241,112, 37, 75,230,177,
+ 8,219,188,169,185, 29,119,106, 18, 93, 39, 98,149,156, 59,243,110,133,118,148,156,199, 90,154, 65, 19,180,226,213,200, 87,253,
+ 6, 99,138, 72,137, 47,127,240,114,193, 50,195, 60, 4,143,188, 86,130,104,250,201,225, 47,157,147,119, 14,203,178,154, 71,113,
+ 24, 5,132,179, 16, 97,232, 0,120, 78, 32,116, 5,177, 46,162, 96,238,252,140, 98,234,198, 96,175, 85, 69,134,149,112, 27, 96,
+158, 37,156,165, 82, 13,239,212,103,201,209,144, 84,123, 10,202,144, 73, 73,109,204,138, 39,221,104, 93, 22,218, 54,138,125,198,
+ 42,190, 9,129,126, 96, 84,195, 30, 58,120,238, 2, 71, 97, 4, 3, 34,186,241,201,214, 17,142,197, 90,173, 13,174, 9,208,166,
+180,142,188, 46,100,207, 55, 30, 88, 82, 85, 22,250,216,107,219,116, 12,242, 79, 32,237,238, 96, 58,127, 17, 49,122, 92,222,217,
+227,238, 11,103,248,246,255,245,111,173,179,210,234,184, 85,209, 96, 40,112, 70, 19,251, 58, 45,121,194, 40, 40, 98, 89, 63, 25,
+147,106,202,145,134, 91,120,162,128, 19,195,121,116,186, 36,228, 61,161,114,105,110,116, 55, 76,229, 54,125,177,145,125, 43, 40,
+228,119, 59,141,211,164, 8, 47, 48,184, 99,156,118,214,145, 52,218, 44,135, 65,130, 37,134, 97, 64, 26,105, 85,171,149,161, 24,
+209,158,125, 41, 40,171,217, 56, 75, 41, 24, 2, 16, 47,206,225, 11,144,231, 89, 20,250, 87, 87,104, 15, 63,194,178, 44,248,212,
+131, 43,220,121,225, 28,223,125,235, 67,252,236,227, 27,252,147, 63,124, 3,223,250,195,207, 73,183, 50,238, 17,247,231, 72,189,
+193,191,250, 10,202,251,191, 4,214, 21, 46,122,116, 7, 44,199,130, 52,202,231,136, 74,222, 52, 19,248,186,243,120,249,238, 25,
+254,139, 47,191,138,127,249, 55,239,225, 71,191, 42,248,214,103, 95,192,107,175,221,195,229,231, 62,137,116,182,151,156,235,224,
+225, 52, 52,164,175, 38,126, 85,190,117,171, 21,197,109,171, 53, 31, 34,226, 40,238,139, 90, 86,198, 14, 71, 94,190,222, 18,178,
+212,161, 82,139, 98,122, 61,162,249,255, 55, 98, 90,119, 14, 45, 68, 36,239, 49,237,207,225, 67, 66, 41, 29,222,211, 22,202,238,
+168, 82,240, 88, 75, 59, 97,108, 51, 96, 42, 36, 32,111, 33, 34, 18,251,185,141, 85,149, 22, 38,231, 13,245, 26, 38,216, 19, 54,
+119, 8,145, 60, 7,233,126,197, 61, 83,236,178,146,116,177,106, 9,130,202,235,208, 67, 26,182, 34, 10,150,177,238,188,131,239,
+213, 58,110, 88,106,153,172,113,166,221,158, 19, 73, 71,176, 85,181, 73,131, 56,146,196,170,166,255, 41, 89,254,221, 48, 74,170,
+ 93, 24, 97, 84,206,156,183, 8,211,121,158,197,159,206, 6,108, 89,150,147, 75, 77,249, 34,186, 74, 29,136, 54, 5, 34,127, 77,
+140,145,159,177,127, 62, 92,132,207, 88, 61,129,250, 56, 56,211,101,133,232, 44,178, 87, 63, 39,205, 83,208,240,172, 82, 36,113,
+174,156,184, 76, 52,128,171, 50,194,184, 17,105, 11,198,163,202, 52, 77, 2,129,186,151,177,185,231, 26,210,187,206, 9, 32,207,
+111, 71, 43, 30,141, 98, 81, 5,198,234,121, 84,139,152,131,197,248,186,109,152,179,209,223,116,114, 10, 61, 59,187,233,154,108,
+ 77,170,171,122,239, 81,123,181,194, 74,246,236,122,102, 71,203,185, 16,222,125, 71, 64,218,210,218,218,115,128, 67,129,175,249,
+ 77, 24,173,182, 92,229,189,108, 19,102,103,250, 18,239, 3, 92,147,166, 41, 2, 21,193,179, 99, 30,252,201,101,186,153,240, 37,
+223,124, 65,140,130,108,213, 93,121, 87,186, 23, 43,245,134, 14,239, 26,242,218, 55, 38, 50,186,101,202, 46,203, 74, 36,101,176,
+188,102, 57,172,217,109,244,138, 86, 5,150,209, 90,195, 50,175,216,159, 77,102,129,145, 10, 95, 95,136,136,152, 2,237, 42, 13,
+227,200,234,157,200, 78, 85, 56,170, 77,111, 24,226, 9,107, 28,246,131, 6,247,201,199,219, 25,227,152, 88, 77, 49, 87, 26,192,
+124, 92,177, 44,133, 44,102, 41, 12,198, 49,225,120, 88, 12,216,163, 69, 73, 99, 53,220,106,145,131,141,213, 84,161, 63, 52, 68,
+217,111,107, 85, 29, 61, 44, 65, 40,120,143,117, 93, 88,125, 83,109,174, 59,125, 8,235, 28,138, 90,133,168, 58, 85, 24, 38, 34,
+195,132, 97,218, 97,152, 38,132,144, 4, 38,193,125,153,115,226, 50,136,145,126,115, 70, 16,172,115, 22,252,233,124, 48,122,155,
+ 38, 81,157,142, 15,189,223,104, 88,146,204, 4, 92,189,244, 57,160, 3, 67, 10,184,119,255, 18,143, 62,124, 31,203,186, 72,232,
+194,137, 64,166,214,134, 33,208,175,203,140,244,206, 28,104,153,164,136, 21, 82,193, 52, 58, 21,234, 0, 66, 15,102,181,236,189,
+ 35, 12, 65,212,209,238,196,154,230, 34,187,110,144,173, 0, 59,108, 27, 9,130, 78,195,110, 40,154, 1,119,243, 58, 41, 80, 21,
+187,190, 28,202,234, 22, 87,132, 96, 70, 53,165, 48,166,128,196,201, 81,111,242,178,198, 24,176, 46, 89,116, 4,124, 67, 5,146,
+ 33, 99,215,221, 11,247,165, 0, 40, 11,206, 46,206,208, 91,197,242,100, 70, 91, 87, 60,185, 89,112,247,114,143,135, 55, 25,255,
+223,143,127,131, 63,250,242,107,248,135,223,250, 18,252,221, 23,112,251,214, 91,146,163,112,118,134,158, 6,184,221, 14,225,254,
+139, 8, 79, 30,162,173,194,104,223, 13,222, 86, 24, 34,151, 16, 61, 70,206, 13, 62,116, 32,120,252,254, 27, 47,226, 71,239, 63,
+198,219, 79, 15,248,197,161,226,119,191,252, 89,196,200, 14,198, 73,104, 79,125,118,141,180,223, 9,105, 76, 87, 70,132,129,172,
+107,135,227,101,182,155,162, 93, 32,226, 23, 23,152,139, 15, 14,105, 72,178, 58,138, 18,160,228, 60,199,223,189, 99, 62,222,202,
+179, 23,131,140, 28,137, 1,149,212, 49, 1, 35, 57, 42,201,215,101, 17, 75,145, 75, 70,245,203,235, 98, 12, 3,197, 29, 43, 84,
+168,107, 86,249, 9, 57,210,200,132,110,131,183, 56,207,206, 94,247,189,164,193, 45,179,240,236, 83, 74, 24, 71,153,118, 73, 92,
+177,210,234, 28,187,167,108,228,195,110,133, 37, 71,235, 80, 56, 20,108, 90,100,170,117, 71, 68,113, 96,163, 20, 69, 56, 54,142,
+ 19,215,149,193, 86, 99,133, 77, 78,165, 77, 49, 70,225,209,207,199,217, 10, 37, 13, 92, 82, 8, 76, 56, 89,141,249, 32, 13,193,
+178, 44, 40, 12,214, 42,132,192,200,222, 53, 88,102,185,163, 11, 68, 63, 15,125,119, 20,198,162, 90, 0, 93,181,170, 59, 72, 66,
+117,220,137, 53, 20,132,118, 21,235,136,101,237,169,240,168,106, 69,128,172,172,156,249,255,117,234,167,239,140,198,136,162, 85,
+ 89,199,234, 5,223, 10, 98, 0,122,115, 42,206,103, 81, 95,120,214, 87,235,172,213,194,230,156,131,235, 10,235,169, 27,232, 42,
+ 50,139, 92, 19,213,220,137, 85, 76, 47, 94,108,235, 21,239,148,220,160,122, 9,122,197,149, 8,199,117, 0, 76,160,235,248,103,
+176,177,177, 70, 5,204,164, 72, 54,226,151, 38,154,197, 35, 2, 45,116,221,210, 54, 59,127,127,103, 3,167,201,148, 41,249, 19,
+111,189,125,225,128,235,136, 50,167,215,131,168, 18,130, 48, 96, 93,148, 4, 38,127,120, 74,114, 17, 79,211, 36, 17,138,204, 29,
+ 46, 85, 70,209,157, 62, 94,231,221,150,212, 3, 7,228, 98, 82,124,217,167,121,195, 28, 58, 31,144, 98,194, 82, 87,142, 65,101,
+204, 89, 91,181,131,254,120, 88,144,115,197,217,249,132, 16, 28, 90, 5,134,113,131,150,196, 20, 49, 78,145, 59,161,104, 34,149,
+ 90, 26, 3,220, 2,134, 36,149,120,163,223,122, 24,182, 52,174,101, 94,112,184,153,233,203,148,145,108, 94, 10,242, 42, 52,160,
+195, 97, 17,136,206, 20,216,101, 11,213, 78, 49,166,181, 20,180, 42, 99,248, 90, 42,150,121, 21,155,156,250, 29,117, 71,237,164,
+ 67, 93,151, 5, 67, 18,187,148,240,225, 37,213,170, 6, 39, 99,112,170,225,197,150, 37,135, 66,119, 91,231,171,188,117,231,129,
+224, 54,142,125, 26, 39, 76,251, 51,120,166, 78,249,144,108,167, 44, 42, 89, 17, 63, 90,236, 45,247,200,181,172,150,194, 20,188,
+136, 89, 82, 10, 20, 60,249,173,219,162, 69,200,133,128,180,187,194,249,221,151,209,123,199,197,229, 30,103,231, 3,126,248,195,
+159, 32,132,100,171,140,142, 46,138, 77, 10, 13, 85,165,233,189,108,158, 60,191,246, 20, 61, 33, 47,133, 35,164,110,163,175, 92,
+ 50,233,122,186, 87, 93, 77,191,160,113,186,250,146,118,242, 8,192,201, 66, 35, 84, 40,176, 27,215,110,202, 91, 33,229, 12,222,
+163, 30, 96, 61, 28,158, 83,200,186,110,157,135,198, 91, 74,232,132,116,202, 62, 72, 53, 94, 75, 17,126,182, 58, 28,184,247, 10,
+110,194,176,223, 33, 31,142,168,168, 8,174,163, 62,123,132,225,241,199,168, 49,162,199,132, 47,188,254, 0,239,252,230, 26,251,
+105,192, 63,248,250,235, 66, 53,123,244, 16,195,229, 5,220,186,162, 29,111, 17,199, 29,224, 61,202,249,185, 60, 83,183,183, 24,
+234, 13,202,218,224,209, 0,142,198, 93,136,242, 30, 81,157,223, 29,144,162,195, 55, 94,191,135,119,254,250,128, 95, 95, 47,130,
+ 74,245,226, 73,174, 77,190,231,117, 94, 49, 31,102,228,226, 25,245, 40, 19,181,249, 88, 0,178,192,135,113, 64,206,176,207,160,
+107,241, 15,241,247,107,216,143,136,190, 6,180, 90,176, 63, 15,152, 15,206,198,215,195, 56, 89,158,122, 94, 51,133, 95, 27,103,
+ 0,232,136,221,145,224, 6, 22,180, 43,173,143, 98,225,139, 41,162,172,197, 86, 58, 14,157, 23,182,240,204,141, 0,217, 27, 39,
+120, 42, 50,146,157,122, 72,210,189,166, 16,132,114,198,115,100, 93,165, 48,235,224,250,128, 95,115,233, 39, 30,102, 10, 57, 79,
+ 99,129, 45, 6,211,183, 19, 33,150, 55,102,134, 9,158,154,147,119, 36, 38,236,247,123, 92, 94, 93, 98,152, 70, 78,162, 68,139,
+ 0,163,110, 50,182,212,111, 90, 1,209, 36,200,207, 55, 40, 28,172, 11,234, 90, 11,187,227,225,136,101, 89,172,171,172,165, 72,
+106, 91, 20, 12,183, 78, 35, 60, 19,210, 68,143, 34,151,174,170,232, 85, 47, 82, 74,145,179,131, 83, 28,161,150,109, 80,175,206,
+ 12,112, 45,168,226, 36, 43,129, 86,183,181,197,178, 48,170, 25,242,174,116,238,208, 58,232,159,175, 91,183,222, 91,165,183,188,
+ 17,139, 93,209, 25,128, 37, 90,162,142,200,228, 77,113, 47, 54,222, 67, 50, 29,241,212, 35,105,196,170, 20, 39,253,185, 8,230,
+222, 53, 30,156, 19, 64, 54,125, 98,127,212, 44,144,246, 92,152,139, 9, 47,149, 47,224,228,235,175,106, 33,174, 42,160,147, 34,
+169,218,234, 69,120,240, 22,232, 3, 71, 87,147,124, 61,193, 11,119,161,148, 83, 33,168, 96,147,107,107,240,188,128,133,255, 18,
+ 45,133, 13,155,154,195,220, 28,141,211,209, 16, 2,162, 70, 18, 2, 74, 78,131,189,108,102, 45, 33, 1,104, 33,194,181,159, 0,
+ 57,134, 33, 17, 50, 82,237,129,200,172,228, 58,237, 51,250, 64, 26,238,143, 81,152, 1, 14,205,201,238,254,120,152, 81,138, 8,
+110,198,105, 32,117,108,195, 19, 46,180,142,233,126,214, 7,233,128,207, 83, 32,192,166,157,208,163,156, 29,250,154,168,212,122,
+133,235, 64, 26, 2,202,154,141, 93,189, 44, 5,227,148,248,195,109,152,143, 98, 83,211, 49,219,110, 39,197, 68,239, 13,243,113,
+101,120,128,100,245,230,117,181, 46,125,157, 87, 27, 9,174,139, 6,178,176, 66, 99, 71, 93,104,255, 89,151, 21,173, 8,169,172,
+ 22, 71,133,123, 49, 96,199, 48, 36,126,238,222, 94, 40,239, 60,124,226,247, 85, 43, 29, 36,146,143, 62, 76, 35,198,221, 30,227,
+ 52,241, 48, 9, 8,105,176, 8, 92, 5, 94,200,231,207, 40,221, 86, 81,170, 42,206, 59,119, 99,176, 48, 7,239, 35,121,218,222,
+176,134, 50, 18,138,184,124,241,211,200,107,195,217,217,128,123, 47, 94,226,241,135,239, 99, 57, 30,145,146, 40,155, 53, 62, 50,
+165, 96,222,101, 41,128, 86,192, 24,198,180,173,241,208,242, 42, 18, 81,236,107, 41,114,113, 82,160,178, 46,139, 5, 63,108,143,
+ 52,131, 92, 74,177,245, 68,237,210,225,120,183, 89, 62,128,182, 29, 62, 44, 40, 66, 18,225,145,247,193, 46, 19, 29,177, 41, 31,
+ 64,199,158,129, 86,154,113, 74, 4, 69,180,109,228,185, 10, 72,102, 93, 22,155, 42, 84,142, 21,157,247, 24,247, 13,126,185,193,
+248,240, 3,244,155, 5, 97,190,134, 95,103,248,139, 29, 50,130,140,177,167, 17,127,246,119,191,198,103, 63,243, 50,238, 62,184,
+131,224, 58,194, 75,175,160, 31,110,209, 30, 61, 68, 59, 30, 81,246,139, 20,138, 33,160, 93, 92, 34, 92,221, 65,125,251,109, 70,
+120, 74, 71, 14,146,207, 52,229,203, 19, 0,235, 6,143,171, 93, 66,116, 1,143,175,103,209,125,116, 15,172,183,232,113,194,202,
+160,144,156, 51,110,143, 29,227, 46,202, 65,234, 60, 42,170,104, 47, 86,113, 60,228,213, 97,156, 18,122, 79,178,106, 35, 3, 65,
+129, 34, 33,142,156,232, 56,161,246, 57,135,113,218, 11,192,137, 29, 91,140,130, 99, 14,180, 78, 57, 34,123, 37, 79,187, 33,132,
+198,245, 83, 65, 43,171,117, 70, 10,152,106, 93, 46, 7, 25, 85,119, 50, 53,220,182,103, 4, 76,212,100,105, 90, 28,139,139,118,
+ 8, 22,218,227,204,139,222,128, 46,227, 99,158,185, 82,168,215,142,113,154,176, 44,171,113,222, 55,209, 48,117, 69, 20,177, 58,
+183, 89, 35, 55,245, 59, 15,123,138,169,134, 97,100, 62,192, 30,211,110,162, 56,118, 91,109,149, 92, 54,252, 54,255, 89,114,161,
+ 48, 84,163,151,131, 81,244, 58,191,158, 92, 10,157, 27,138,148,173,182, 87,215, 34, 35,120,103,197, 38,232,100,104,198,160, 15,
+182,154,139, 73,244, 75, 10,128,210,229,179,142,131,197,122, 12,211, 53,152,159,221,116,116,130,133,173, 68, 42,131,235, 79,253,
+ 79,235, 13,203, 44, 83,201, 94,149,109, 32, 14,134,202,128,150, 86, 56,169, 68, 59, 25,181, 83,152,215, 27, 47,120,216, 68, 77,
+ 99, 78,213,134,104,137,110,253,212,180,227, 78, 52, 89,145,133, 70,132,243, 58, 53,168, 22,227,171,187,113,168,167,222,144,189,
+141, 83,140,106,231,181,114,223,183, 76,138, 13, 2,102,158,247,154,225,124, 66,213, 7,146,214, 59,177, 71,119, 91, 55,162, 3,
+181,101,196, 56,160,212,130,105,218,177, 24,149, 21,161, 22, 4, 90, 92,169,205, 88, 27, 39,160, 35,138,127, 84,204,242,174,122,
+123, 65,243,186,114, 52,230, 13, 17,106,244,185, 92, 49,237, 70, 30,212, 50, 38, 73,227, 32, 30,246,210,159,203, 17, 94,150,194,
+ 49,210,214, 77,203, 8,103, 11, 82,105,181, 98,156, 6, 19,214,213,218, 16,180,186,230, 72,169,208, 58, 22,210,102, 75,208,135,
+ 82,199,172, 41, 5, 19,186,182, 38, 54,163,202,188,221, 24, 60, 86,238,184,101,132, 38, 97, 47,170, 46, 92, 87,241, 11, 31, 15,
+ 2,123, 24,167, 68,241, 71,197,237,141,132, 90, 28, 15,179, 1,248,165, 32, 88, 36,154,243,246, 96, 85,109,175,109, 3,159,168,
+ 10,149, 95, 95, 45, 43, 59, 15,193, 26, 74, 72,140,131, 75, 17, 14,241,185, 29,138,142,177, 28,228,130,139,195, 32,225, 46,232,
+240, 81, 18,219,156, 3,198,105,194,180, 19,143,107,154,246, 38,102,107,204,149,247, 84, 40, 43,207,189,115,135,115, 92, 86, 3,
+121, 4,247,188,229,167,210,154,215,106,135,243, 29, 53, 87,248,152, 16,131,135, 75, 59, 12,251,123, 98,157,186,152,112,113, 57,
+224, 39,127,246, 38,149,202, 91,114, 92,171, 32,177,170,211,239,222,101, 15,152, 11, 74,213, 41,138,231,222,211, 33, 13,145,209,
+140,162, 28,151,112,182, 66,145,163, 82,225, 68, 12,165, 44,127,197,139,118,125,137, 84,161,170,249, 4,181,113,135, 11,140, 19,
+ 97, 39, 10, 46, 33, 63, 64,210,243, 26,253,229,210,181, 40, 99,161,181,138, 20,147,249,215, 85, 1,237,106,195,124, 56, 34, 13,
+ 50,102,214, 66, 47,175,235,137,122,181,162,151,134,155,242, 12,111,190,245, 19,124, 33, 14,120,112,231, 10, 45, 5, 92,135, 14,
+220,125, 9,183, 31, 63, 66,115, 14,239,252,234, 33, 30,221,174,248,227, 79,191,140,120,126, 6, 63,237, 68,213,142, 14,119,251,
+ 20,225,252, 28,213, 11,240,168,174, 25,136, 17,249,233, 51,148,121, 70,115, 30, 8, 17,174, 85, 75,144,234, 0,134,216, 49,157,
+ 37,212,181, 32,103,135,253,110,192,218, 42,150,165, 0,203,130, 94, 87,244,203, 59,242,235,215,140,101,205,240,113,192,211,199,
+ 31, 99,119, 22,141,206, 88, 74,145,116, 48,205, 74,112, 29,232,242,189,170,203,100,154, 6,160,123, 83,253,171, 27,193,105,150,
+182,247,240, 97, 64, 41, 71,225,251,119,135,158,169,222,101, 58, 70,136, 3, 74,158, 57, 46,174, 28,195, 31,205,218,104,214, 32,
+ 11, 47, 2, 45, 67,140, 68,205, 21,158, 44,241,231, 60, 75, 60, 92,209,221,150, 31,174, 20, 70, 42,188,101,183,235, 73,139,148,
+194,180, 50, 83,161, 18, 62,227,253, 38,186,117,206, 83, 48, 9, 54, 13,133,211,197,128,188, 30,105,237, 18,139,129,119,226, 85,
+239,173,210, 83,158,176, 63,219, 99,183,219, 75,183,219,186,105, 78,138,129,152,154,177, 14,150,101, 69, 46,121,211,135,152,150,
+201, 91,110,121, 37, 95, 99,165, 5, 78,199,189,243,124,220,166, 25,238,212,131, 46, 99,253,214,177, 21,210, 4,208, 12,195, 96,
+ 28, 11,109, 40, 24,148, 72,224, 13,185,242, 77,196, 99, 41, 5,227,147,119,178, 67,250,218, 45,107,221,185, 19,180,172,158,103,
+164, 61,138,210,189,161,243,231,168,147,135, 86, 87, 99, 19, 40,144, 76,133,212, 10, 98, 17,118,187, 59, 81,188,243,248, 33,191,
+ 66,187,114, 71, 47,184,218,209, 0,143,144, 6, 3, 87, 9,164,140,162, 96,120,132, 86, 12,252,163, 35,251,205, 53,195, 20, 62,
+213, 79,212,106, 96,173,126,234, 97,103, 17, 9,167,119,129,219, 80,213,240,155, 61,178, 59,251,124, 59,164, 48, 52,193,107, 41,
+116,107,100,106, 32, 2, 80, 65,219,163, 51,244,178, 57, 20, 12,122,212, 17,197, 95,205,174, 50, 54,162, 20,193,177,148,254,230,
+134, 86, 57,102, 11, 50,134,214,143, 82, 2, 31,100, 28,186,180,213, 64, 20,219, 15, 85,170,140,218,128, 97,216,196, 1, 49, 58,
+126, 65,221, 68,112,195, 32,157, 93, 28,156, 9, 96,212, 58, 34,255,191, 84,211,112, 13,174, 73, 36,170,238,146, 4,132,176, 81,
+171, 98, 10,100,239, 74, 87,218,122,195, 56, 38, 75,157,219,159, 77, 88,103,249,192,106,149, 46,124, 93,139, 89,145,228,114,163,
+138,116, 89,208, 90,177,203, 66, 71, 90,183, 55, 7,219,171,233,133, 84,233, 6,232,156,114,232, 4,192, 51,176,197,178,156,187,
+170, 41,183,177,186,170,105,123,111,244,150,203,222,112,140,145, 15,113,178,135,221, 71,143,253,217, 57,210,144, 48, 78, 59, 62,
+200,129,196, 39,103, 29,130,190, 56,178,195, 17,236,110, 94,102,180,186,152,136, 76, 70,252,167,124,129,106,149,185,143,201,192,
+ 16,206, 7,156,223,251, 52,214,181,226,252,124,196,221,123,151,120,255,221,119,176,206,179, 92,222, 44,202, 90,109,188,208,169,
+248,109,219,228,196, 66,139,224, 54,208,140, 78, 31, 32,118,181,117,153,181, 52,129, 66,169,117,207,174, 46, 10, 87,130,249,138,
+109,215, 90,164, 75, 23, 63,185, 28,188, 57,103,203,110, 87,171,165, 71, 20,209,162, 3, 39, 65,193,242,190, 55,143,121, 67,164,
+224, 9, 8,240, 67, 50,242,158, 67, 39, 14, 83,104, 87, 74, 91, 84, 76,176,254,188, 85,187,241,238,163,103,120,239,131,140,255,
+244,247,207,224, 99, 5,174, 46,225,206, 46,177, 62,155,177, 54,224,189,199, 71,164,224,241,210,213,132,233,222,125,209,158,112,
+ 61,213, 47,174,208,198,189, 80,222,196, 39,136,118,156, 81,127,243, 27,132, 96, 16, 79,192, 69, 17,136, 6,199,148, 43, 15, 71,
+251, 38,178,236,149,207,199, 17, 87, 83, 68,123,252, 16,241,222, 61,184,152,128, 34,127, 15,122, 70, 15, 9,207, 14, 43,206,206,
+ 34, 15, 84,210,196, 84, 27,211, 36,252,167,148,130,200,119,178,172, 11,174,215, 5,187,253,132, 24, 35,230,227,145, 43, 19,158,
+110,112,204,107, 16,144,137,226, 73,199,113, 68, 8, 35,137,126,213, 58, 40,237,114,212,194,214,186,120,202, 43, 97, 28,165, 84,
+203, 87, 47,185,129, 57,147, 39, 23,185, 51,117,118,224, 14,178, 80,101, 47,128,156,138, 33,116, 62, 39,193,212,218, 29, 27,177,
+ 78, 5,111, 34, 16, 13,178, 6,211, 41,160,141, 73,197,114, 41, 34,189, 17,190, 54,196, 88,177,142, 51, 74,185,230,249, 74,219,
+ 28,125,231, 49,142,152,166, 9,187,253,153, 97,176,213,117, 36,152,109, 25,107, 59, 47, 62,237,117, 37,110,181,202, 68,174, 51,
+ 20,166, 50,185, 81, 45,122,219, 74, 16,156,134, 20, 19,227,110,107,164,112,162, 93, 9,198, 45, 87, 17, 45,168, 73,201, 69,244,
+ 61,162,113, 58, 33,134, 14, 9,206, 5, 54, 78, 34,134,171, 44, 70,182, 60,143,102,123,245, 16, 3, 82, 79, 27, 98,183,107,158,
+130,156, 65, 64, 23,156,176,126,214,181,114,245,152,233, 49,119,155, 85,152,206, 29, 15, 57,219,108,225, 76,175,190,103, 99, 42,
+ 82,128,109, 34,224, 57, 45, 82, 65,164, 68,230, 10,171,194, 71,209,129, 24,114, 38,146,213,223, 6,212,186,210, 58,167, 94,117,
+177, 14,203, 93, 88, 72,105,151,245,133, 68,194,118,179, 32,154, 91, 76,119,238,142, 69, 0, 5,167, 27, 27,126,107, 46, 58,215,
+ 43,157, 2,197,101, 89, 57, 89,226, 29,160,228,205,225,164,216,206, 50, 25,215,203,255, 52, 48, 45, 90,154,153,177,211,171,236,
+ 99,205,255,185,165,199,117,133,130, 56,111,222, 72, 77,137,233, 93,132, 50,128,195,124, 92, 49,142, 9,243,178, 10,167,184, 73,
+ 88, 61,200, 52, 86, 66,145,122, 33,107,107,152,166,145, 20,177,102,222, 59,185,128, 61, 21,171, 2, 34, 8, 76,126,106,173,193,
+ 87, 25,129,245,190,229,103,167,129,112, 11, 66,114,164,218,238,232, 77,188, 83, 34, 68,147, 2, 64,193, 55,135,219,163, 76, 1,
+ 98,192, 58, 47,232, 97, 75, 48,107,173, 11, 97,173,111, 97, 30,189,119,204,199,213, 14,128,154, 11,161, 45,236, 26,213,226,193,
+ 67, 37,240,229,170,154, 78,232, 3,125,209,205, 42, 84,137,255,219,144,163,222,109,161, 16,162,125,138,104,165, 34, 80,151, 48,
+ 77,131,248, 84, 9,173,112,124, 75, 29, 54,178,157,128,119,188,141,143,123,235,162,136,173,197,252,168,189, 53,185,184,217,137,
+117, 84,243,158,106,133, 29,147,124, 61, 62,237,145,246, 47, 32,120,135,179,179, 17,251,157,195,223,188,245, 38, 97, 45,204, 64,
+142, 17,235,146, 81, 74,197, 48, 73,166,120, 8, 78,246,103, 93,189,252,234, 63,175, 40,153,234, 97, 86,245,121, 61, 73,148, 58,
+205, 37, 86,223, 48, 3,165,165, 67,231,200,189, 86, 50,179, 55, 76,175,162,109,119,187, 29,114, 41,228,124,147, 56,150, 43,188,
+ 69, 82,202,165, 21, 67, 64,227, 8, 56, 14,113,139,202,244,114,112, 28,111,111,205,238,148, 41,250,105,204,111, 86, 15,109,224,
+ 8, 76,196,126, 64, 28, 68,169,253,228,151,215,248,250,171, 47, 99,246, 1, 57, 78,112, 45, 96,184,185, 65, 15,226,133,159, 82,
+192,241,184,162,246,142,101,201,200,243,140, 86, 50, 14,207,110,112,221, 60, 94,124, 81,136,105,205,121,244,245,136,254,254, 47,
+224,123,177,213,150,186, 58,162, 87, 66, 96, 64,184,220,161, 92,223,152, 72,232,152, 27, 11,157,128,225,229, 87, 16,247,123, 75,
+223, 42,237, 8,112,130, 49,207, 25,227, 62,144,245, 79,101, 56,187,146,234,156, 36, 93,161, 97,173,171, 93, 72,206,117, 44,243,
+140, 54, 12,240, 14, 56, 30,212, 74, 40,251,194, 56, 4, 90, 17,121,126, 0, 70,169, 84,188,114,173,178, 2, 89,151,133, 77,128,
+ 88,191,114, 23,194, 91, 39, 9, 38,156,128,178, 90, 7, 90, 46,150,254,165,221,178, 42,192, 55,161, 90,160,173, 76,126,191,132,
+ 62, 21, 76,123, 15, 31,129, 50, 23,248, 24,249,253,116,172,235,102,229,148,149,141, 71, 41, 43,179, 38,202,115,152, 99, 64, 68,
+170,126, 12,200,235,140, 97,220, 83,164,182,156, 8,157, 26,134, 65,112,180,103,231, 23,194,105, 63,205, 35,128, 80,229,212, 22,
+ 38,239,106, 51,161,159,194, 93, 2,137,107,150,212, 70,171,220,225,150,159, 25, 19, 39,107,115, 88, 41, 44, 4, 9,120, 82,160,
+121,120,159,236, 66,145,117, 7,167,158, 67, 98,135, 46, 83,166, 49, 70,134,196, 4,140,211,200,181,134,112, 47,244,140, 26,167,
+209,254,252, 82, 10,208,168, 70, 15, 30,190,138,182,162,150,138,228, 3,121,240, 21,165, 22, 75,139,243,102,155,109, 40,235, 2,
+244, 98, 98, 55, 5,113,121,167, 43, 67,103,130,176,198,201,171,118,227,114,161,111,147, 25, 69,140,147,182, 33,207,182,134,189,
+116,106,100,168, 15,210,108,151,222, 10,124,100,156,244,113,165, 59,198,111,164, 79,234,167, 36, 30, 53,160,180,110, 60, 3,249,
+187,170,116,222,108,218,156, 89,184,101, 69,208,153,176,102,105,123, 44,250, 55,106,109,103, 3,188, 26,137,180,214,138,101,153,
+217, 4, 39, 11,233,241, 20,154,107,232,148,211,209, 0,179, 54, 34,200,254,245,220,235, 8,223, 90, 50, 98, 91,238, 20, 91,121,
+178,214,229, 33,146,196,159, 70, 90, 16,204,179, 30,200,207,214, 48,149,148, 18,188,243, 66, 49,170, 13,235,186, 98,208,248, 83,
+ 10, 4,206,206, 6,179, 61, 84,190,240, 58,234, 82,248, 76,136, 98, 83,147,138,180,216, 7,162,163, 51,231, 9,183,161,119, 60,
+ 4, 17,240, 69, 23,176,178, 74, 28, 70,185,248,114,145,252,220,186,200,165, 26, 83,192,157,187,151,112,174,227,201,227,107, 90,
+211, 10,213,193, 30,173,174, 8, 94, 60,203, 2,103, 1,179,220,101,151,191, 44, 11,122, 8, 72,105,176, 7, 60,132, 77,221, 47,
+187,121,152,186, 85, 59,237, 86,189, 21,156, 64, 35,141,200, 26,249,226, 88, 0, 0, 32, 0, 73, 68, 65, 84,109,227,225, 24,128,
+ 70,216,149,170, 48,185, 83, 30,167, 17,105, 72, 34,178,225, 47, 8,244,121, 91, 92,110,221,208,177, 90, 33,175,121,177,148, 53,
+199, 61, 79, 59, 69,115,118,241,133,138,218, 55, 81,212,232,204,247, 59, 93,125,130, 16,150,136,187,247,175,240,222,219,111,226,
+246,250,153,117, 28, 37, 23, 11,187, 8,222, 97,157, 15,178,155, 59,137, 77,236,246,119, 87,227, 36,195,121,234, 11, 50,139,174,
+ 98,118, 53, 61, 64, 85,146, 37, 35,210,184,209,149,188,116, 15, 10, 6, 81,230,127, 28, 71, 43, 58,199, 81, 52, 26,228,240,200,
+158, 46, 70, 68,230, 29, 59, 30,108, 91, 55,228,108, 63, 85, 9, 18,242,222, 97,237, 13,189, 70, 94,244,180, 24,149, 44,123,176,
+ 90,144,210,192,159, 97,160,123, 99,198,199,239, 31,240,245,215, 94,197,203,111,188, 6,255,226,203,192,178,202,232,219,121,185,
+ 8, 91,199,211,219, 5, 41,120,228,219, 3, 60, 83,174,150, 53,227, 47,223,254, 16,223,254,225,207,240,223,253,243,127, 36,130,
+194, 86,177,254,230, 3,248,227, 12,151, 0,248,200,208,137,142, 66,112, 78,109, 29,195,254, 28,238,193,171, 64,126, 31,235,245,
+ 17, 62, 38, 60,165, 35,229,165, 87, 94, 64, 79,137,147,153, 6, 31, 7,233, 54, 0, 44,115,198,245,237,130,179,125,183,239, 89,
+ 52, 26,213,224, 33,181,139,104, 22,168,134,243,212,189,182, 94, 80,243,113,193, 48, 80,208, 24, 35,214,121,181, 95,187, 28, 15,
+242,231,122,143,188, 74, 17,144,131,184, 9, 74, 94,140, 46,214, 90,160,163, 97, 36,104, 67, 68, 69,114,209,110, 98,218,198,174,
+212,135,190, 89,217,136, 25, 22,113,221, 32,221,103, 20,193,104, 72, 56,217,241,118,179, 49,169,110,165, 86,105, 16,114,150,231,
+ 32,165, 36,246, 92, 98, 71,117,237,163,234,229,245,184, 98, 10, 1,165,138,215,120,154,118,168, 53,227,233,227,153,123,126,121,
+184,134,113,135,253,254, 12,103, 23,231,212, 48,129,152,104,153, 44, 42,146, 84,199,173,173,111, 64, 44,121, 46,219, 38, 66, 85,
+146, 25,128,195,141,228,210,235, 8, 33,231,202,125,117,216,146,228, 98,226,101,189,193, 87, 20, 60, 35, 74,113, 2, 78, 92, 64,
+ 26, 7,158, 97, 81, 82, 2,121, 81, 6, 10,201,160,174, 5, 78, 75, 68, 64, 11, 19, 90,151,210,158, 11, 97, 10,222, 99,158, 23,
+ 34, 98, 87,163, 71, 10,191,188,160,215,138,146,103,123,142,184, 54,151,100, 75,134,165,200, 5,201,220,134, 46,169,151, 58, 9,
+113,180, 0, 75, 58,166,179,201, 85,239,155, 91, 71,211, 21, 85,175,238, 67,132,227,228, 49,196,136,178,102,248,148,184, 18, 85,
+ 30,129,183, 8, 95, 37, 28,202,138, 47,152,208, 78,179,228, 69,136,183,185,193,244,159,206, 5,254,247,102, 44, 7,241,175, 7,
+ 54, 43,167,170,251,126,130,218, 85,184,150,183,233,109,109, 21, 81, 39, 95, 85,177,236,218,120, 21,226,180, 43, 82,140, 28, 94,
+241,224, 23,146, 92, 18,197, 40,171,104, 31, 58,163, 37, 55, 85,166, 1,212,232, 53, 85,171,212,198,201, 15, 6,246,112,222,139,
+ 39, 49,203,203,151,215,204, 81,143,228, 78, 47,203,138,148, 18, 85,227, 17, 46,120,219, 73, 86,122,193,243, 90,120,240, 87,192,
+117, 12, 41,146,189, 94,177,219, 15, 38,218, 59,222, 46,136,105,203,189,213, 56,207,200,238, 94,242,212,163, 20, 6,206,225,252,
+226, 12,243, 44,233,106,243,241, 40,164, 48, 66,250, 59,197, 28, 25,157,170,223,108, 49,138, 58,154, 87,116, 32,152,199, 45, 5,
+205, 96, 69, 16, 76, 49, 41, 63, 47, 29, 41,201,248,100, 35, 81, 5, 31,208,181,146,118, 32,206,208, 33,142,193, 20,222,158, 23,
+244, 48, 37,140, 67, 18, 2,149, 35,213,200, 75,225,164,157,172,173, 35,214, 85,246,209,190, 99, 57, 30,101,236,222, 42, 71,202,
+219, 88, 91, 20,195,178,163,212,125, 77, 43,154,137, 44, 35, 65,132, 9,227,249,125,212,218,112,118, 62, 33,250,140,119,127,252,
+ 35, 99,198,151,117, 38,101,140, 59, 83,122,110, 37, 39,185,155,197, 69,242,170, 87,196,152,144,215, 89, 34, 3,153,182,134, 16,
+104,249, 32,185,137, 72,216,196, 78,204,249, 64,213,174, 50,145,189, 41,222,189,217,104,128,144, 6,235, 8,163, 30, 56, 44,137,
+ 69,232,179,219,172,155,220,165,107, 17,145, 43, 61,214,174,217,244, 5, 68,109,206,237, 22,227, 56, 89,215,163, 7,164, 56, 42,
+146,237, 16,215, 85, 58,158,103,143, 22,188,122,231,101,188,244, 59, 95, 2,246, 59,100,120,184, 16, 16,210, 30, 46, 38,204, 43,
+173,120, 73,220, 5, 79,110, 23,219, 9,250,105,194,107,159,124,128,223,207, 29, 88,142,232, 45,160, 35,192,173, 51,252,160,238,
+128, 66,237, 9,237, 54,228,153,247,204,169, 72,147,131,165,118,224,167,143, 14, 24,135,132, 23, 38,143,128, 14, 87, 51,194, 52,
+193, 59, 96, 72, 30,115, 76, 72,195,128,227,188,224,140,226,201,188,102, 84,118, 95,146, 52,213,205,142, 36,140,132,198,125,167,
+ 55, 38, 1,136, 87,213,181,157,121,112, 25,203,234, 67,192,202,136,223,117,145, 68, 68,231,129,117,174, 36,243, 9, 26, 86,133,
+ 85,165,108, 98, 52, 40,178,217,117,227,168,251, 32,130,167,198,115,137,170, 33,187,172,115,206, 86,244, 67,227, 78,163, 88,214,
+116, 10,217,185,203,244, 81, 70,170,135,195, 34,239, 55, 5, 99,222, 59, 44,115, 53,152, 85,240,219,184, 83, 44,177, 51,166,105,
+ 39, 9,151, 41, 98,191, 63,195,186, 28,113, 56, 60, 3, 0,140,227,132,253,254, 12, 23, 87,151, 38,136,211,181, 92, 12,209, 64,
+ 50,250,174,136,230, 70,211,191,152, 5,193,162, 61,166, 68,152, 75,198,241, 56, 91, 51,164,236,134, 82, 86,251,218,228,207,141,
+220,165, 71, 68,238,146,193,159,133,126, 45,206,123, 68, 42,172,135, 81, 8,119,167, 9,135, 33,198, 19,219,164, 92,112, 67, 10,
+108, 14, 69,196, 42, 93,172,186,158,154, 9,248, 42, 5,175,130,132, 22,197,124, 94,142,146,102, 88, 50, 58,177,192, 65,228,238,
+155,158, 8, 85, 66, 98, 56, 77,210, 29,178,212,142,142,140,130, 13,201,235, 44, 50, 74, 82,249,108,253, 81, 53,198,186, 24,158,
+213,199,128, 97,220, 25, 80,103,152, 38,251,181,158,216,214,231, 66,172,160, 54,181, 45, 70,186,107,116, 43,163, 87,181,104, 56,
+ 45, 0,236,130,199, 70, 28, 52,218,160, 66,188, 26,172, 0,232, 39,147, 6,243,204,119,157, 58, 57,158, 71,222,180, 63, 33,108,
+221,186,231,212,217, 57,143, 40, 66,133,110, 25,192,190, 87,172,185, 82, 21,232, 56,106,207, 39,182, 16, 37,217,176, 74, 96,119,
+229, 84,176,196,111,192,187, 96, 57,188, 74,134,242, 1, 54, 94, 81,175,186,238,129, 20, 16, 2, 42,163, 83, 74,194, 23,230, 94,
+ 71,132,117,219,174, 75, 85,224,122,129,245,222,108,181, 86,153,104, 20,130, 99,198,239,182, 70,104,205, 89, 58, 91,239, 29,169,
+ 5, 28,111, 86,226, 93, 11, 5, 48, 29, 55,215, 55,172, 4,133,103,157,115, 49,101,234,186, 40, 82,148, 34, 32, 22, 48, 30,120,
+ 46, 97,201, 57, 37,240,117,219, 55, 13, 41, 26, 72,192, 49, 69,173,179,115,180,232, 64, 3, 82, 53, 83,116,150,218,176,219,143,
+ 84, 13,115,103,143,198, 48, 4,221,211,115, 92,221, 42,150, 89,146,175,188,151, 11,233,246,217, 19,174, 16, 4, 41,219, 91,101,
+215,238, 76,149, 44,153,227,145, 2,168, 0,128, 47,116,235,216,221,253,180, 32, 67,199,136,123,247, 47,241,243,159,252, 0, 37,
+175,204,115,119,112, 49,241,231,209, 79,188,172,162, 10, 13,209, 91,138,154,230,190,235,136,169,247,198, 60,106,190,140,221,115,
+ 50, 32,138,220, 13, 64, 20,141,118,232,177, 41,212,141,217,239,165, 35,225, 60, 78, 52, 27,124,225, 84,249, 30,211,176,173, 9,
+194, 38,154, 3, 68, 65, 47, 22,194,194,139,200, 1,173,161, 48, 49,175, 80,172,116,172, 5,195, 48,162,205,178,227, 87, 27,229,
+178,244,147,110,160, 35, 23,143,158, 47,241,197,111,254, 14,252, 56,202, 1,218,128, 52, 77, 76,253,170,120,244,248, 86,138, 32,
+122,175,127,254,243,143,240,141,175, 61,129, 59,191,128,115, 14,175, 62,184,194,203, 47, 94, 97,157, 23,120, 39,121, 2,254,238,
+ 93,244,103,143,209, 15,139,224,115, 1,140,209, 51,116,168, 35, 57, 15,148,134,118,115,139, 94, 43,226,221, 11, 44,211, 5, 62,
+ 60,190,141, 16, 60, 94,185,119,142,246,244, 49,194,197, 21,106,172,104,222,163,187,128, 30, 28,110,142, 29,143,159,221,224, 69,
+ 92, 80,187, 0,142,198,155, 65, 93, 42,187,177, 20,165, 51, 27,166,145, 83, 18, 94,178,116, 74,172,171, 96,153,165, 91, 79,104,
+181, 32,141, 35,128, 70, 23,200, 22,239, 41,232,231,100,151, 12, 36,244,140,207, 96,181,142, 5,236, 96,251, 73,106, 94,169, 5,
+105,156,224, 3, 51, 5,216, 69,233,197, 37, 7, 57, 15, 99,238,247, 5,231,186, 57, 5, 34,167,110,189, 50, 84, 6, 27, 38, 57,
+ 37, 17,116,169, 32, 75,131, 60,204,121,209, 36,199,193,251, 64,175,189,140, 67,167,221, 25, 74, 94, 81,234,138, 97,148, 61,186,
+247,222, 48,194, 62, 68,218,113, 71, 22, 47,197, 46, 19,231, 61,208, 68,219,164,207,116,109,221, 62,163,170, 60, 12,102,150, 43,
+ 13,113, 93, 23, 35, 48,234,101,174,251,219, 16,146,137, 12, 1,135,105, 26, 40, 88, 21,254,250, 48,136, 5,118, 24, 73,227, 12,
+ 50,181, 21, 16,152, 55,173, 72, 96,206,133,144, 52, 59, 71,254,178, 90,148, 21,192, 54,233,210,168,234,214, 43, 27,183,133, 19,
+142, 32, 95,119,145,156,133,192,241, 56,168,124, 23,112, 76, 55, 18,164,196,255, 54,152,168,219, 57,106, 44,194,230, 25,247,155,
+172, 66,217, 20,170, 18,223,198,241,160,118, 38, 89,172,179,106, 38, 78, 69,107,122,246, 74,151,236, 45,119,189,243, 60,217,184,
+236,221,172,219, 22,211,234,157, 5,113,105,130,250,115,220,120,203, 35,104,112, 62, 73, 20, 12,207,237, 70, 78,139,247, 17, 13,
+197,186,120,231, 52,238, 87,108,225,170, 85,171,181, 91,252,118, 87, 3, 76,111,136,173,109, 29,118,175, 29, 69,129, 50, 53,195,
+117, 66, 17,152,182,182,174,217,184,190, 10, 32,208,180,170, 90, 26, 47,109, 7,201,126,103, 62, 53, 47,100,197,220,117,219, 47,
+ 87,184,193, 51, 68,192,243,101,237,182,167,108, 93,196, 54,109,229, 55,221,181,210,151, 15,168,201,111,147,140,116,150,232,145,
+ 29, 79, 94, 11,118,103,145,246, 42,111,168, 89,181, 75, 1,162, 92,175, 28, 85, 45,139, 18,224,138,249,219, 99, 10,204, 33,102,
+150, 56,111, 90, 85,230,162,117,219, 77, 57, 64,118, 60,158,182, 17, 45,144, 20, 11, 25, 37, 68, 6, 65, 80,126,138,137, 45,165,
+ 32, 48,154,181, 41,218,211, 65, 4, 78, 94,178,197, 83,146, 47, 56,141, 73,148,242,189,161,148, 5,193, 71, 98,122, 43, 2, 21,
+246,138, 92,172, 69,188,189,206,129,223,219, 1,228, 94,200,131,210, 96, 35, 68,157, 28,120,175,213, 34,137, 97,105,144,206,208,
+121,196,221, 11, 72,103, 47,194, 59,224,234,206, 25, 98,200,248,205,207,223,230, 67, 4, 94,204, 20,146,148, 66,143,184,208,219,
+164, 88,113,182, 98,144, 76,112,165,250, 17, 85,203,188,108, 9,193, 73,219, 10,161, 53,171, 76, 79,131,130,122,239,116, 98,200,
+190, 30, 78, 34, 32, 59, 39, 54,206,188,165,242,191,249,184, 97, 63,245,251,116, 54,114, 85,170,220, 74,201,170,188,112,226,102,
+ 40,180,178,116, 75,150,130,243, 88,151,102,221,253,178, 44,219,216,222,235, 5, 18,112,253, 40,224,239,127,243,247, 4,122, 20,
+ 2, 92,111,168,101, 97, 88,144,195,188, 44,248,179,239,191, 9,133,131,123,239,241,203,223, 94,227,248,236, 6,187,105,148, 92,
+119,186, 50,128,142,114,115,131,190,204,200, 31,124, 0,248, 0, 87, 42,133, 56, 29,107,237, 24, 61, 53, 8,154,152,117,156, 49,
+125,238, 13,248,221,132, 31,124,231, 77,212, 14, 12, 41,226, 19,191,251, 57,132,203, 61, 16,100,140, 92,214,140, 86, 37,194,248,
+250,120,131,181, 44,200,101,130,207, 78, 60,239,218, 1,195, 89, 55,182,121,177,229,179,179, 41,140, 33,211,194, 9,154,147,251,
+ 66,105, 43, 56,174,141, 92,115,201,217,146, 73, 73,243, 33, 26, 51,219, 57,111,133,161,115,162, 65, 9, 49,160,173,213, 84,217,
+185,213,109, 34,208,157,132,187, 48, 93,175,219,243, 35,121, 15,202,203,214,139, 77,237,110,195,176,237,232,157,247,104, 37, 83,
+217, 47,226,209,198, 88,100, 69, 19,215,162, 25, 18, 30, 61, 55, 19,105, 30, 15, 7, 92,221,185,195,181,219,128, 28, 87, 76,187,
+ 51,180, 54,224,236,252,130, 34,204, 96, 19,162,222,157,141,225,117, 84,172,211,192,117,201,156,222, 84,243,208, 55,142,233, 15,
+183, 51,214, 92, 12, 2, 86,171, 76,169, 50, 81,176,142,142, 37, 79, 22,123,136, 9,105, 72,240, 46,216, 69, 40,142,152, 38,226,
+198,148, 12, 89,235,131, 76, 74,210, 16,217,217, 11,199,161,228,138,204,203, 58, 70,209, 44,121, 47,228, 76,160, 97, 94, 51,224,
+ 58,230,227, 81,206,117,231, 44,227, 99,229,100, 86,222,167,106,239,145,186, 16,212,237,163, 88, 99,199,192,156,238, 28,156, 50,
+ 36, 66,223,210,245,200, 10,209, 40, 82,109, 46,123,231,165, 91, 79, 51, 48,164, 10,171, 6, 9,146,117,142,210, 38,211, 48, 80,
+ 4, 39,204, 14, 79,234,169, 93,226,132, 36,169,223, 92,160, 73,141,252,170,211,112,171,254, 92,247,173, 54, 32,239, 2,116,113,
+ 72, 58,199, 73,184, 21, 51,225,187,183, 4, 75, 45, 60,236, 50,167,243,199, 84,248,174, 99,158, 15, 76,188, 27,184,131,207, 54,
+105, 81,225, 93,244, 54,122, 23,251,202, 48,141, 84,160, 75,114, 82,140,226, 95,238,173, 81,177, 9,190,144,218,221,121,120, 38,
+ 31, 41, 10, 79,255,125,235, 64,173, 14,105, 8, 28,219,108, 1, 13,173,117,233, 64, 72,121, 26,134,168, 42,127,169,142,107, 39,
+ 45,174,218,139,172,135,166, 38,197,213, 69,254, 30, 87,156,253,125,178,215,246,198,107,214,177, 95,229, 74,161,243,146, 62,222,
+206,155, 32,171, 85, 6, 4,136,170, 28,189,161,172,178, 31, 86, 70,120, 91, 5, 46,163, 73,104,170, 18,239,167, 49,162, 58,246,
+161, 82, 18,157,176,149, 38,123, 32,233,194, 59, 74,151,188,114,129,199,109,228, 36,157,190, 8, 76, 78, 30,242,154,133,194, 20,
+131, 71, 26,130,140,154,233,217,172, 37, 19,119, 41,213, 95,240,226, 52, 80,254,118,205, 43,202, 50,147,227, 76, 0, 8,147,127,
+ 53,141,168,210,111,153, 56, 26,243, 33, 81,233,206,212,184, 56,226,234,229, 47,162, 54, 96,127, 57,226,238,253, 11,252,244,175,
+191, 71,165,106, 19,255, 63,161, 50,153,161, 2, 26,166,208,171, 80,246,132,134, 36,246, 53,101, 33, 58, 78, 20,164,171, 78,128,
+226, 42,153, 0,166,225, 47, 49,170, 81,203, 25,182, 52, 70,137,106,140, 62,108,168, 71, 34,126, 7, 83,169,107,148,163,179,130,
+204,161, 33, 70, 66,120,208,129, 70,129, 35, 9, 86,162,110, 46, 28,101,174,214,137,128, 49,162,202,224,246, 70,225, 74, 38,164,
+ 25,134, 36,194,163,214,241,232,227,138, 47,125,254,139,120,229,181, 7, 40,243, 44, 22, 30, 39, 71,132,226,110,255,226, 47,222,
+193,207,222,251,173,105,182, 99,111,120,122,155,241, 87,223,127, 11, 95,251,242,171,136, 47,221,151,200,221, 14,212,155, 3,240,
+155,247, 17,122, 67,109,128,207, 69, 62, 63,239, 17, 18,215, 17,206, 35, 6, 57,208,251, 56, 34,125,226, 21, 52,239,112,115, 61,
+227,207,127,252, 30, 98, 12,248,196,131, 43,156,159,203,216, 81, 97,250, 18,155,156, 16,207,207,112,243,211, 15, 48,164,104,103,
+129,135,176, 13, 74,165,136,150,142, 22, 9,176,144,203,168, 46,213,214, 46, 27, 39, 66, 45, 87,242, 46,170,127,222, 19,246, 34,
+ 7,124, 70,107, 43,166,221,132, 14, 41, 62,133,255, 30,237,157,146,115, 66, 46, 94,193, 59,207, 82, 36, 54, 78, 3,201, 23, 55,
+ 71,137,121, 19,156,112,181,243, 44,127,191,238, 63,157,183,164, 73,213,229, 52, 69,117,118,152,146,188,179,155, 15, 1, 8,209,
+ 33, 31,138,193,160,182,221,113, 53,103,128, 82, 16,151,229,136,221,254, 12,232, 30,251,253, 30,193,123,248, 0,236,246, 98, 95,
+243,126,115,101,140,187,105, 91, 93,114, 93,133, 34, 7,232, 56, 13, 40, 89, 64, 56,250,123,156, 83, 16, 87,182,207,106,158, 23,
+230, 81, 44, 38, 52, 21,218, 88,226, 5,226,204,137, 80, 93,181,142,125, 24,101,213, 34,151,249,198,200, 71,239,216,237, 71,211,
+ 67,233, 69,234,188, 52, 45,165, 52,228,163,116,219,215,207,142, 6,142,169,181, 72, 56, 23, 69,184,193, 98, 97, 35,167, 94, 91,
+156,106,111, 13,185,108, 34, 99, 43,114, 20,158,194, 70, 72, 5,103, 29,133,107, 10,143,214, 43,130, 11, 54, 33, 85,167, 15, 84,
+ 56,200, 34,221, 17,119, 13, 50,228, 37, 6, 91, 86,164,211,217, 37,179, 5, 28,163, 78, 43,139,127, 13,227,169,114, 95, 52, 90,
+110,241,252,100, 70, 39, 29,142, 23,177,174,150,106,237, 34, 92, 85,115,123,239,164,204, 61, 63,154,215,187, 79, 87, 62, 50,153,
+137, 0,167,185, 91, 1, 41,171, 37, 84,253,239, 13,142,103,144,234,190,148,208, 87, 74, 35,161, 81, 46,246,232,122, 19,225,129,
+ 99,215,205,195, 53,112,175, 42, 7, 93,197, 56, 73, 68, 94,201, 84,162, 71,226, 78,157, 67,173,126, 75,238,105,250,195,106, 4,
+ 70,200, 97, 63,142, 35,173,155,225,249, 49,189, 86,218, 76,128, 67,174,162, 94, 79, 1,153,130,180,224, 55,102,113,107, 2,140,
+145, 8, 64,143,227, 49, 99, 28,101, 44, 5,250,151,229,128,245, 70,147, 26, 71, 9, 88,105,185, 96, 89, 86, 28, 15, 7,217,241,
+179, 48,169, 57, 91,130, 84,201, 98, 81, 18, 76,102, 55, 53, 98, 39,191, 89, 70,201,110,203, 21,143,218,145, 83, 97,206,180,181,
+ 90, 42,134,193, 97, 93,178,140,186,155, 88,168,214,121,133,247,224,218, 66, 70, 41, 62,108,211, 4,101, 43,131,105, 71,195, 40,
+ 85,115, 26,162,225, 82,117,236, 23,130,162,111,165,184, 40,244,173,246, 38, 16,133,229,120, 96,199,228,184,131,118, 38,118,145,
+206,181, 98, 72,147, 85,156,162, 8,149, 49,156,129, 25,134,187,112,195, 29,248,218,112,118,190,131,111,183,248,224,231,239,152,
+ 56,175, 45,178,183, 55,146, 26, 59,180,154, 87, 50,180, 69, 89,110, 38,118,118, 59,232,149,110,135,184,225, 21,109, 69, 34,227,
+220, 24,189, 60,168,156,108,196, 52,112, 29,147,172,144, 82,246,186,217,246,156, 38,170, 37, 75,116,219,146,153, 40,214,227,184,
+ 82, 20,235, 84,220,215,188,101, 31,215, 76,221, 65, 55,171, 78, 34, 71,255,212,227,139,222, 48,142,227, 9,207,187, 97, 62,116,
+164,114,134,207,126,234, 5,212,117,209,250,156,153,210,210, 37, 62,126,122,139,255,248,189, 55,101, 76,215, 58,134,224,240,223,
+252,241, 23,240,191,125,231, 29,252,187, 31,255, 10,159,189,191,195,221,243, 61,112,117, 71,138,192,195, 13, 80, 42, 48,142, 24,
+175, 46,208,142, 51,218,113, 69, 28,165,200,139, 67, 64,175,194, 7,240, 99, 66,250,228,107,112,204,138,255,187, 55,127,129,135,
+ 79, 15, 40,181,225,139,159,125, 0, 23, 19,124,175, 6,240,112, 46, 96,184, 56, 71,237, 29, 31,252,230, 17, 62,251,233, 87, 81,
+251, 99,160, 74,135,164, 90, 24,225, 5, 84, 91,135,152,243,197,203,180,226,226,242,156,144, 20,254, 60,216, 69, 62,199,216,166,
+ 98, 61, 4,143, 74,148,112, 41,149, 23, 70,198,178,136, 39, 61,198,136,117, 93,105, 67,114,182,215, 86,224,139,163, 61, 84, 46,
+ 97,181,182, 58,218, 31,229, 18,247,209, 99,152,188,117, 66, 33, 6,212, 6,243,105, 59,174,233,210,232,133,128,217,229,235, 20,
+203, 28,125,195,126,179,103,174, 89, 82, 12, 29, 17,197, 49, 6, 1, 98, 81,144, 39,142,152,163, 92,150, 65,198,216,206,203, 4,
+ 41, 4,103, 46,151,148, 34, 71,218,142, 14, 32, 7, 84,153, 8,148,156,145,198,100, 93,185,106, 75, 66,144, 70,105,153, 23, 91,
+ 31,109,239,146, 20,241,181,201,229, 36, 2, 53, 79, 66,154, 60,171,203,154, 49, 12, 9,195, 48, 98,156, 38,164, 52,112, 21, 34,
+ 86,220,152, 18,198, 73,247,233, 73,156, 66,156,154,138,165,183, 88,174,251,186,172,116,178,208,249,193,159,161, 93,240,165,162,
+ 58, 25,149, 47,243,108,240, 21, 79, 12,182,216,219, 58, 3, 85,156,173, 82,117, 90, 37,218,130,245, 36,167,222,157,196,155,246,
+173, 97,169,213,166,162,114,142,202,132, 6,158, 57,232,100, 79,200, 58, 71,206,202,221,254,194, 70,240, 42,214,117, 0, 90,203,
+230, 38, 16, 24, 76,149,105, 18, 33, 66,178, 14,177, 91,203, 28, 57, 50, 74,167, 69,205,235,162,157,161, 48,206,211,218,173, 13,
+ 73, 55, 24,141,131, 19, 76,173, 11, 38,166, 83, 82,161,138,252,132, 7,179,110,182,186,214,224, 66,148,142, 28, 10,213,146, 41,
+151, 48, 52,152,149,225, 61, 98,229, 72, 81, 48,161, 30, 46,136,112,165,181,134,192, 12,110, 31,100,166,175, 30,116,221,179,234,
+ 56, 74, 8, 60, 14,109,110, 38,158,144,177,151,167,130,209,111,227,214, 78,101,164,146,148,186,238,173,202,137, 42,149,240, 26,
+223,183,124,116,215, 57,174, 11, 40, 69, 70,218,243,177, 96,127, 54,178, 74,115, 38,126,209, 67,118, 24,252,166,140,102,100,146,
+118,152,203,113, 62, 49,237,119,250,123, 29,230, 69,186,183, 82, 42, 43, 80,237, 72,155, 78, 64, 76, 36, 7,200,132, 66,172,126,
+234, 57,231,232,175, 22, 34, 18,219, 22,120, 95, 10,119,138,133, 4,165, 78, 49, 76, 51, 70,180,122, 97,161,252, 98,205, 66,231,
+223,229,221, 73, 82, 90,173,240,157,157, 16, 11, 10,181,169,101, 22, 92,157, 93,205, 48,122, 3,186,232,239,143, 12,243,208,203,
+212, 7, 73, 10, 50,128, 10, 60,206,238,191,129, 90, 26,246,103, 3,238,189,120,129,119,126,240,239,165, 35, 45,153,187, 68,111,
+ 59, 34, 81,166,242,226,236,186,167,118,220, 1,121, 11,229, 64, 55, 11, 51, 17,186,222,246, 96,202, 54, 22,177,161,124, 94, 33,
+ 68, 3,131,216, 56,215,235,136,204,219,244,194, 83,180,225,135,141,196,167,187, 97,199,112,136, 90, 86,142,215, 42, 74,209,103,
+160,146, 64,119,106, 67,113,246, 94, 32,240,197,118,222,184,241,137,151, 67,136,220,117, 51,174,245,246,105,197,183,190,254, 6,
+198,216, 81,111, 30, 3,113,196,120,126, 97,246, 30,180,140,111,127,231,111,240,219, 71,215,102, 57, 42,181,227,234,108,196,223,
+251,252, 3,252,139,255,248, 54,254,252,157,143,241, 15,239, 94, 74,145,229, 60, 92, 89, 49,220,189,196,238,149, 87,144, 99, 68,
+155, 23,244, 52, 0,143, 62, 6,142,183,232, 49,194,237, 6,184,251, 47,194,143, 3,192,209,220,237,237,130,239,254,213, 47,208,
+ 1,140, 67,196, 23, 63,255,170,124, 14, 33, 34, 12, 1,173,103,189,190,208,225,240,244,201, 53,190,244,149,215,240,214, 47, 31,
+113,212,183,200,196,134, 7,211,154, 89,144,214,138,222, 35,122, 43,232,193,145, 77,190, 96, 24, 7,138,185,154, 77,200, 58, 58,
+227, 75, 97,106,248,249,120,144,179,160,214,109, 77, 69, 59,155,115,128,219, 57,179,178,118, 66,148,224, 60, 82, 26,248,220,119,
+ 11, 24,233,144,206, 74,246,171,178,142,242,129, 22,192,238, 17,124,180,240,164, 97, 8,166,250,150,226, 3, 22, 19,220,114, 59,
+225, 40,248, 19,216,144,104, 82, 28, 96, 2, 52, 27,153, 86, 25,255,251,238, 25,226, 35, 14, 14, 9, 0, 74,184,184, 58, 63, 89,
+ 91,200,249, 52,140, 35,243, 41,146,101, 44,196, 24, 81,242, 44,151, 61,188, 9,199, 10,227,162,123,151,145,124,161,134, 72,197,
+153,226, 42,170,198,202, 16,226,163,114, 37,136,128,109, 98,167,219,237,247, 24, 39,241,201,135,152, 4, 84,147, 51,198,105, 36,
+ 51, 32,156,164,211, 53,148,220,120,161,175,146,235, 78,255,123,111,186,251,173, 12,103,145, 2, 57,175,153,225, 79, 2,124, 58,
+ 28,142, 8,222,203,116, 37, 8, 83,162,209,142, 90, 40,146,211,219,140,122, 85,227,156, 11,237,173, 89, 4,179, 34,111,225,188,
+129,166,100, 75,236, 24,186, 83, 41, 36,222,108,184,154,207, 46,226,229, 29,210,160,232,236, 77, 65,174, 2, 52, 93, 23,128, 26,
+141,118,162, 84,119, 94, 26, 6,237,214, 37, 47,194,155,232, 87,245,246, 50,197,225,180,248, 36,205, 82, 52,105, 39, 25, 40,236,
+206,133, 93,208,100, 91,228, 20,157,171, 97, 49,242,123,106, 43,136,113,148,203,157,231,126, 46, 43,134, 97,162, 11, 68,112,215,
+ 18,120, 84, 41, 8,236,136,211,126,111, 8, 70,169, 14, 68,241, 59,237, 70,212,186,193,251,117, 28,166,220,118, 37,199,137,224,
+204,157,240,131,163,197,176,250,230,249,226,117, 19, 72,169,208, 64, 5,108,178,255,109,150,175,155,213,111, 87,165, 26,143, 12,
+ 47,200,107,165,101,163, 73, 78,251, 34, 23,199,241,152,205, 62, 97, 99, 15,170, 84,199, 49,114, 95, 75, 6, 47, 36,148,101,156,
+ 18,106, 73,104,213,155, 31,178, 86,142,214,209, 33,192, 32,103, 56, 90,201,158,119,152,231,197,112,164,162, 92, 36,254,149,226,
+ 20,245, 54,107,138, 79,163,160, 67, 42,173, 76,143,181,140,222,165,138, 84,253, 2,184, 91, 92, 17,169,244,244, 65,198,116,145,
+194, 20, 29,173,201,231, 73, 50,104,136,176, 53,234, 56,200,215,223, 42,187, 13,142, 98,125, 55,204,173, 50,148, 45, 93, 73,145,
+154, 33, 48,217, 77, 60,245,181,118, 9,131,153,238,163,226, 12,206,117,156, 95,236,113,124,250, 17, 30,127,248, 43, 1, 76, 48,
+ 0,166,214,186, 97, 81, 21,196,172,176, 7,136, 31, 85,212,234,133,161, 52,167,153,238,196, 94,178,144, 83,177,164,248,248,171,
+ 8,210,204,103,235,140,126, 21,153, 34, 40, 23,188,252, 12, 67,140,132,201, 68,122, 82, 97,187, 85,215, 43, 65, 30,149,171,149,
+ 21,181,172, 40,153, 94,222,214, 81,212,227,172,151,118,154,136, 63,222,152,223, 29,206, 98, 26,149, 21,239, 29,217, 2,112,120,
+242, 48,227,171,159,123, 3,175,191,114, 9, 31,128, 60,238, 81,253,136, 56, 36,187,192, 62,250,232, 26,223,255,209,187, 82, 64,
+215,138, 94, 43, 14,185, 32, 31, 14,248,189,207,188,128,127,251,163, 17,255,238,239, 62,194, 11,251, 17,191,251,153, 35,250,197,
+ 30,253,206,125,196, 59,231,104, 44, 12,252,217,185, 36,178, 5, 7,196, 8,119,255, 1,194,249, 5,124,244, 72,193,163,176, 51,
+248,211, 31,188,139, 15, 63,190,134,243, 14,159,126,229, 46, 94,188,119,137, 94, 10, 48, 36,204,135,133, 29,144,140,215,231,249,
+136,103,207, 14,184,119,239, 14,218,207,219,134,163, 12,160,213,170, 24,193, 49,232, 74,137, 5,103, 45, 21,227,180,229, 41,228,
+156,177,219,237,182, 40,206,147, 9,147,228,207, 15, 88,230, 3, 61,225, 51, 66,216,157,228, 5,204, 22,198, 33,214, 81,141,103,
+246,204, 45,168, 20,222, 10,195, 28,212,150,168,251,196,249,184,157, 97,211,206,166, 5,165, 86,218,186,100,250,151,115,179, 8,
+103, 89,231,101,114, 28, 68, 36, 28, 57,120, 85, 92,168,178, 49, 84, 67,227, 24, 11,173,239, 66,229,249, 57, 31,143,152,118, 19,
+ 82,218,227,236,252, 92, 20,237, 76,213,146, 46, 61,217,243, 44,190,113, 9, 91,114,222, 99, 8,129, 56, 80, 89, 51,138,235,166,
+ 96, 62, 30, 45, 47, 91,221, 64,235, 42, 35,120,229,188,139,248, 75, 46,116, 13,113, 42,165, 98,127,182, 71, 76, 35,166,157, 92,
+232, 29, 78, 38, 14, 94,220, 63, 66, 0, 28,204,246, 53, 31, 23,115,148,172,107,198, 45, 25, 30,153,194, 60,205, 57,208,226,119,
+ 93, 87,148,188,178,147,150,162,119, 89,229,217,210,127,102,114, 62,180, 96,232, 22,207,123,130, 60,213,115,181,109,211, 29,157,
+236,168,184, 44,192, 61,135, 9,215,105,218,105,228,177, 94,218, 14, 64, 28, 39,122,237, 71, 22,229, 48, 11,176, 22, 71,186,138,
+172, 85,128, 63,121, 93,184, 51,239,128,219,154, 87, 89,225,200, 63, 79, 57, 30,138,105,214, 53,144,142,219,197, 89,227, 21,130,
+ 7,205,109,235,246,164, 59,115,109,169,165, 82, 58,240,141, 22,232,157, 76, 45,156,247,228,205,119,190,139, 43,156, 19,177, 97,
+ 74,129,186, 40,191, 69,161,119,120,227, 93,151, 70, 95,104,223,124,227,150,124,229,229, 5, 23, 91,153, 67, 74,130,128,117, 74,
+187, 9,178,227,170, 76, 68,242,188,112, 26, 65, 50,189, 59,100,142,195, 91,151, 95,191, 46,133, 98,187, 72, 28,106, 21, 97, 17,
+167,165,235, 90,224, 73,110, 18, 43, 82, 64,206,242,226, 13, 99,218,136, 59,140, 3, 45,165, 97, 28, 2,179,122,189, 21, 34,133,
+ 66, 26,169,192, 28,197, 32, 3,242,178,176, 67,117,100,184,139,226,114,152, 18,242,202,204,229, 20, 49, 31,229,161,157,166,145,
+248,220, 77, 89, 89,203,150,227,171, 80,148,218, 52,232, 3,132,156, 56, 11, 35, 80,155,148,176,207, 25,211, 23,228, 7, 38,185,
+242,114,232, 76,187, 9, 41,146, 85,205,189,115, 55,150,177, 55,143,101,181,108, 93,249, 26,242,154,229, 80,163,157, 78,188,242,
+ 5, 49,137,130, 84, 4, 38,222,226,101, 53,189, 74,217,221, 62, 70,132, 36,163,163,241,206,167,209,152,173,253,194,189, 51,188,
+245,189,239,152,144, 81,213,175, 10,143,240,126,115, 71,200, 51,145, 25,152,224,233,245,230, 14,191, 9,227, 89,198,138,209,178,
+205,245, 65,118,188,220,225,196, 71,154,232, 15,246,118,225,122, 30,222,180, 8,186, 45,215, 60,198, 72, 47,181,132,241,232, 36,
+166,183, 6, 71,174,115,111, 5,173, 74,142,124, 74,137, 19,162,141,222,148, 98, 2,188,130, 51, 50,162, 22, 20,250,156, 41,166,
+ 82, 45, 42, 85, 85,203, 1,231,195, 29,124,245, 83,151, 72,243, 45,250,221, 7,136,251, 51, 17,116,213, 46,120, 87,231,240,237,
+111,255, 24,183, 7, 57, 8,255,233,215, 94,197,211,103, 51,254,239, 55, 63,196,245,245,130, 59, 83,196, 63,251,250,107,248, 31,
+191,243,115,252,239, 63,254, 53,194,217,132, 47,125,234,147,162, 92,166,212,102,205, 21,111,189,249, 75,124,249,181, 61,166, 94,
+225, 94,125, 13, 97,218,163, 66,196,164,203,154,209, 93,192,159,254,217, 91,248, 15,223,127, 7,206, 75, 17,244,205,111,124, 78,
+ 60,196,168,240,124,159,186,115, 88,142, 11,144, 59,150, 34, 29,105,138,170,127,225,180,206,156, 26, 26,158, 34, 63, 67, 15, 57,
+180,208,186, 5,168,168, 11,193,169, 58,153, 7,105, 74, 17,199,227, 98,187,118,231,130,137, 11,107,150, 98, 58,141, 9, 46,175,
+ 18, 78,210,142,166,186,238,229,180, 83,151, 11, 62,151,133, 83, 18, 57,204, 53,139,188,163, 25, 24,165,201, 75,136,200, 78, 43,
+210,129, 33,249,214,206, 34, 47, 59,247,253,122,192,250, 32,221,154,142,190, 51, 51, 25, 26,173,117, 53, 55, 25,157, 86,153, 44,
+232,232, 93,180, 73, 29,203,124, 4,250, 29, 76,251, 9,251,179, 61,150, 69, 32, 61,121, 93,101,133, 73,145, 94,224, 94, 95,243,
+ 15, 44,160,200, 1,165, 74, 92,168,192, 71, 86,131,112, 9, 12, 75, 68,103, 57,103, 59, 75, 98, 76,180,123,146,151,193, 3,116,
+154,118, 56, 59,191,192, 56,141, 44,108,154,137, 88,135, 97, 16,171, 40,243,212, 3,133,121, 57, 23, 89, 25,242,239,138, 76,171,
+ 43,156,154,229, 53,139,221, 49, 23,155,252,105,167,156,115,182, 14, 62,115,132,110, 60,246, 86, 49,207, 43, 5,113,206,166,114,
+122, 73, 27, 92,135, 8,238, 83,225,165,103, 81, 45, 43,196, 96,107, 93,121,150, 54,251, 87,253,255,233,122,147,103, 91,178,243,
+186,111,237, 46, 51,207,185,247,190,174, 58, 20, 88, 68,161, 33, 1, 82, 12,137, 22, 41,202, 38,105,133, 7, 30, 40, 60,176, 35,
+ 60,245,208,255,155,103, 14,207, 28,242, 64,161,144,108, 90, 38, 77,147, 4, 9,130, 68,145, 42, 20, 0,162,250,238, 53,247,222,
+147,153,187,243,224, 91,223,183,243,210,225, 1, 2, 64,189, 87,175, 57, 39,115,239,175, 89,235,183, 88,184, 77,211,132,105,158,
+ 44,225,174, 59,200, 59,196,223, 79, 18,226, 26,249, 12,109,144,248,232, 36,176,110, 91,181, 83,125,136,249,164,176,108,104,189,
+176, 41, 26, 92,248,238,250,129, 40,231, 44, 17,210, 49,188, 74,215,147,206, 41,116, 7,195, 54, 71,221,135, 2,147, 70,228,173,
+116, 97,185,238,140, 94,237,214,145,135, 32, 43,141, 41,137, 24,184,100, 57,211,162,178,126, 69, 98,223, 45,208, 93,114,164,147,
+229,148, 59,218, 14, 60,247, 31, 98, 73, 83,235,138,228, 80,203,206,202,219, 72, 69,227, 21, 21, 90,163, 81,129,222,115,204,222,
+196,170, 85,155,140,172, 36, 60, 32,152, 48, 79, 41,103, 82,205,102,139,239, 3, 41,120,206, 7, 44, 41,202, 5,163,249,239,193,
+ 97, 62, 49,123, 59, 38, 10, 92, 60, 16, 58,106, 1,243,187, 69, 44, 87, 91, 55,225,219,216,179,192, 84,177,197, 59,134,219, 36,
+193,228,170, 8,200,201,174, 92,198,208,237, 1,167,221,123, 80,244,231,135,154, 19, 13,101,247,104,173, 24,156, 68, 72,110,145,
+161, 5,224,231, 47,224, 26, 13,125,240, 28, 77, 6, 79, 88, 72,235,140,185, 12,134, 27, 84, 46,126,201, 5,251,186, 49,108,198,
+141,209,189, 87,177, 82, 51, 81,204,176,149,193, 70,214,114, 81, 10, 1,173,163, 34, 93,189,141,238, 79,240,189,227,241,211,107,
+ 92,158,127,140,231, 95,124, 66,199,152,224, 91,107,173,210,203,180, 6,159, 4,134,160,208,155,224, 3,242,190,201,180,130,227,
+119,231, 28, 34,161, 24,145,244, 44,229, 64, 74,244,163,120,133,131,218, 52, 90,135,143,225,128,239, 4, 33, 28,222,108,145, 70,
+153, 67,103,220,109, 99, 55,145,109,173, 32,157,132,240,202,189,235,112,196,240, 74, 40,134,178,157,163, 5,214,168,218,125, 89,
+ 78,166,109, 80, 48,146, 99,130, 89,201,178, 47, 60, 93, 93, 33,165, 19,126,254,254, 5,255,250,247,222, 65, 42, 43,240,218,155,
+ 8,143, 30,115,124, 91,225, 90,199, 52, 69,188,248,228,115,252,229, 95,255, 12,235,190,227,119,127,245, 41,126,255,159,189,139,
+255,237,143,127,138,105, 74,120,121,183,161,191,126,198,175,190,113,131, 63,248,238,235,248,163,159, 63,199,255,252,127,255, 12,
+191,191, 59,252,225,239,253, 26,150,229, 10,190, 3, 95,127,117,135,255,229,223,254, 37,254,199,255,254,247,240,237,119,223,130,
+ 75,147, 20,125, 78, 86, 12, 47, 46, 5,255,230,223,254, 25,222,251,224, 51, 9,183,241, 30,191,249,189,183,240, 43,223,124,138,
+ 38, 97,235,104,165, 89,247, 85,107,197,253,203,231,184,253,252,115,220,221,175, 56,159,102, 89, 5,133,113, 0, 58,230, 37, 40,
+123,194, 4,157,173,195, 5,216,231,163,169,119,122, 48, 5, 47, 93,227,190,151, 17,211,217, 14,180,182, 16,225,107, 69,105, 13,
+177, 3, 62, 38,148,114,129,144,117,212, 79, 62, 33,196,201,118,242, 18,127, 43,142, 10,207,162, 81,109, 79,137,157,160, 11, 30,
+ 49, 58, 59, 71, 66,244,134, 84, 21, 91, 89,192,229, 66, 10, 37,134,173, 86,221, 45,242,190,203,143, 43,165, 45, 67, 41,147,221,
+214,145,165,102,138, 85,165,107, 10,244, 89,106,129,217, 58,112,253,232,138,206, 28, 78, 13,157, 51,191,123, 74, 9,219,101, 53,
+203,154,172, 56, 59, 59, 52,185, 96, 45,103,156, 0,158,187,187,141,241,206,156, 88,248,104, 19,188,209,169, 59,156, 78, 39, 44,
+167, 43, 78, 26, 61,182,109, 19, 31,250, 36, 34, 57,141,112,245,156, 50,237, 91,198,186,110,242, 14, 57,221, 85,123,177,198,214,
+202,127,222, 57,165, 45, 54,177, 48, 46,126,161,149, 77, 39,190,156,202,185,131, 24, 88,181, 24,181,140,244, 70,109,122,156, 93,
+156, 13,153,207,167,242, 43, 42,253,234,129,231, 84,107,157,124,134, 38, 46,168,224,140,107, 63, 77,147, 1,170, 4,113, 13,218,
+126, 29, 39, 53,195, 26,233, 32,127,174, 74,101,254,122,185,151,245, 32,241,185,253, 31,141,210,161, 78,248, 16, 6,190,186,107,
+163,218,216,173,247,193,203,111,221, 82, 49, 97, 74,127, 79, 69, 59, 56,241,109, 66, 83,116, 1,206, 41, 6, 54,142, 60, 11, 21,
+ 18,187,225,230,208,130, 71,185, 49,165, 85,248,220,141,217, 18,197, 70,162,251,139, 38,130, 11,163,225, 59, 42, 5, 37, 22, 48,
+164,196,241,172,136, 35,224,100, 87,187, 94, 54,104,199,175, 54,148,152,102,120,126,137, 41, 9, 35,215,123,143, 56, 37,115,190,
+116, 38,106,113,129, 76,168,130,164,209,120, 99,133,203, 14,102,223,170, 5, 26,104, 88,252,148,196,195, 41, 22, 12,143,137, 22,
+140, 24, 60, 64,171,204,188,200,143, 93,238,183,113,113, 83, 1,223,154, 60,172,178,183,146,191,239,188, 76, 12,177,232,164,212,
+ 77, 36, 74, 37,219,209,224,128,144,236, 61,153, 71,177,115, 84,236, 89,116,200,175, 81, 49,207, 39,236,105, 67, 43, 5,181, 38,
+120,215, 12,134,161,190,204, 64,178,211,188, 8,138, 52, 77,226,229,158,230,201,216,201, 2,158,144,142, 76,147,154, 4,204,211,
+121,151,137, 88, 13,222, 35, 38,201,169,167, 76,153,251,217,209,241,118, 19, 96, 84,132, 56,153,119, 58,120,143,210, 60,166, 39,
+223,198,158, 27,174,174,102,188,246,250, 25,127,245, 31,254,157, 84,251,101,248,182,197,182,230,232, 67,110,166, 2,110,252,140,
+ 28,228, 66, 85,132,109,239, 29,133,234, 99,249,254,229,223,117,222,141, 73, 4,139, 51,167,150,197,218,224,101,242,218,158, 0,
+ 0, 32, 0, 73, 68, 65, 84,217, 49,136,125, 18, 22,238, 18, 40,182,234,202,223, 5, 5,136,196,230,202, 97,180,171, 95, 83,242,
+152, 21,253,169,144, 31, 90,127, 60, 71,120,150, 87, 60,157, 72, 22, 12,182,147, 31,137,111, 34,144,115,206,227,116, 58,227,171,
+ 47, 51,190,245,198,155,120,237,236,208, 79,207, 80,211,130,169, 73,100,169, 10,126,252,237,115,252,249,127,252, 43,220,174, 25,
+ 79,174, 22,252,215,191,243, 46,166, 41,162, 57,135,101,158,112,187, 22,209,101,132,128,127,245, 91,223,196,167,119, 25, 31,188,
+216,240,199, 63,250, 5,254,238,103,159,225, 15,254,249,119,240,253,239,125, 3, 79,159,156,240, 63,252,119,255, 18,175,191,245,
+ 4, 13, 82, 48,191,120,117,193, 39, 31,127,133, 15, 63,121,142, 31,191,255, 41,110,137,156,141, 33,224, 59,223,120,130,255,234,
+ 15,254,137,116, 80,154,130,230, 52, 50,147,200, 79, 52,124,241,213, 45,166,232,209,246, 77, 8,121, 36, 47,182, 14,236,185, 32,
+ 17, 50,163,152,230,125,207, 12,103,146,142, 95, 97, 56,145, 1, 31,173, 85,116, 68,139, 40, 85, 45, 71,182, 80,138, 9,121, 95,
+ 57,209,171,156,210, 13, 17, 91,154,228, 80,142, 81,253,235,193,214,108,177, 70,130, 90, 64, 36,114, 28,124, 8,254, 29,189, 53,
+ 13,212,210,168, 0, 56, 70,166, 19,118, 11, 45,105, 20,123,201,251, 10, 76, 44, 56,203,182,217,251,165,218,147,214, 33, 46, 14,
+218, 72,119,166, 92, 10, 59,165, 96, 94, 78,164,150, 73,227, 50,207, 34, 48,214,115,196,178,200,117, 66, 26,101,157, 86,115,230,
+231,221,140, 80,184,239, 59, 53, 23,242,207, 50,193, 81,149,136,105,231,165, 51,247,212, 94, 72,176, 74,199,245,205, 13, 98,228,
+229,230, 3,246, 61,203, 46, 61,136,207, 89,187,121,157, 12,212, 42,130,224,206,223, 75, 21,243,235, 46, 25,238,121,223, 41,154,
+227, 78,159, 22,102,157,130, 85,106,142, 90,173, 84,182,119,187,188,245,125,243, 62,152, 9,172,249,118, 0,255, 16, 30, 21,184,
+182,195,200,159, 16,145, 93, 55,220,183, 11,222, 58,118, 79,145,156,231,152, 62,198,196,189,185,220, 49,106, 66, 83,148,112, 39,
+255,223,199, 40, 54, 96,142,239, 85, 73,190, 17,204,213, 15,227,126,221,161,119,232,148,174, 13,224,152,209, 97, 6,203,253, 24,
+139,170, 32, 28,253,105,173, 54, 70,210, 86, 3,202,232, 58, 71,113,228,210,148, 11, 92,169,243,204,214,108,146,166, 36, 58,155,
+ 56, 15,247, 89,212,117, 75,206, 50,157,240,129, 47,139, 3,246,117,195, 60, 79,216,214,157,204,221,145, 22,166, 2,182,198,241,
+176, 11, 9,161,202,229, 54,159, 2,189,214,157, 64,131,131, 16,174,117,250,167, 71,158,185,120,215,171,141, 82, 99,116, 6, 42,
+ 0, 24,148,177, 55, 83,168,202,248, 94, 70,190,177, 39, 9, 38,112,192, 60, 71,162, 3, 65,136,139,140,116, 36,196, 67,109, 86,
+ 5,121, 31,163,156,156,139, 28,166, 20,212, 4,138,175, 52,144, 67, 4,125,176, 93,115,222,229,210,191,220,175,216,182, 93,170,
+ 58, 69,191,242, 80,208,185,184,119,195,186,179,239, 5,137,156,246,245,178,138,142,160, 86,204, 36,143,165,192, 46, 32, 37,130,
+ 86,100,108,228,157,122,210, 41, 18,105,154, 24,196,106,148, 69, 81,107,205, 82,208,122,109, 88, 47, 23,228,204,145, 39,186, 88,
+201, 90, 69,243, 14, 49, 48,224,133, 25,194,181,169,138, 95,227, 30,243,232,216,209,177, 60,126, 23,240, 51,188, 47,120,250,250,
+ 13,190,250,240,167,184,127,249,149,236,218,181,171,233,242,123, 84,227,215,195, 46,245,206,120, 66,207,253,158,146,152,128,209,
+ 85, 57,231,225, 35,201, 90, 7, 27,100, 96,190,186,250,223,131, 55,189, 42,215, 65,147, 69, 13,230,109, 35,155,187, 91,170,150,
+166,254,229,125,227,239, 57,220, 4, 78,102,193,232, 85, 40,124,129,246, 45,231,186,129,100,132,179,204, 34,143, 17,174,181,237,
+198,171, 90,150,217,118,189,211,188,160,212,128, 47,126,241, 10,255,234,247,175, 16,106, 69, 63, 95, 35, 56,143,253,178, 34, 6,
+218,171,214, 11,190,254,240, 19,252, 31, 63,250, 16, 62, 4,124,247,141,107,188,249,248,132,146, 43, 46,165,201,100, 39, 4, 57,
+112,224,144, 92,197,127,251, 59,239,224,223,255,248, 99,252,217,135,175,240,213,203, 21,255,235,255,254,183,248, 55,127,244, 19,
+ 60,185, 57,225,124,154, 17,131,172,126, 46,123,198,139, 87, 43, 59,107,140,201,152,247,248,195,255,236, 91,248,207,255,197,175,
+ 73,162, 98, 19,187, 94, 79,178,210,136,201,163,230,130, 24, 38,224,217,130,207,111,127,138, 55,159,156,176,189,124, 53, 60,232,
+141,107, 55, 5,143, 4, 21, 42, 49,216,137, 86,212, 68, 27, 97,138,194,134,192,212, 45,110,185,121,119, 0,112, 84,219,149, 59,
+134,126,148,146,109,125, 53, 47,103, 56, 72, 92,104, 48, 11,171,248,180,125, 28, 57, 19, 34,138,147,253, 47,156,132, 67, 57,229,
+216,231,130,121,158,204, 87,110, 93,114, 19,209,109,140,137,202,117,165,220,141,140,234,118,152, 96, 57,115,231,200, 88, 93, 53,
+ 67, 71, 49,150, 2, 67,100,181,235,145,166,136,211,249,108,208, 46, 65, 57, 79, 54,221,144, 49,191,250,168,197,102, 91, 75, 29,
+ 35,104, 38, 74, 10, 82, 59,219,217,219, 90,145,105, 95, 25,254,244, 14,225,248,203,132,201,155,232,245,234,250,138,136,215,217,
+198,218, 41, 69,195, 87,123,254, 60, 37,206,137, 21,111,199,133,187,116, 7,103,104,211, 86, 27, 19,226,154,145, 52,109, 66,227,
+197,118,235,201,222,240,109,108,140,213, 34, 38, 28,122,197,204,202,208, 93, 38, 26,193,118,242,170, 91, 80,189,145, 35, 44,166,
+113,242, 3,162, 99,125,148,253,178, 22,112,141, 46,152,137, 23,121,240,206,216,253,149,118, 96, 56, 9,192,129,243, 50,100,111,
+ 29,158,190,111,213, 8, 8, 77,244, 86,112,207, 44, 52, 80, 85,169,220, 45, 86, 85, 35,106, 85,153, 62,194, 91,154, 49,223, 71,
+ 28,116, 55, 18,104,109, 85,226,122,219,112,230,232,154,178, 99, 8,244, 52,145, 84, 38,224,205, 84,240, 18,102,211, 44, 85,110,
+100,177,132,177,174, 41,133,232,117,208,254, 71,128,137, 98, 54,107,235, 12,162,144,145,153, 11,222,246,227,170,172, 30,192, 23,
+ 5, 1, 80, 64,183,151,129,231,107, 98,107,107,173, 35, 32, 72,202,142, 27,226,143,211,121,198,229,126,103, 21, 39, 86, 57, 65,
+ 11, 86,218, 36,138, 77, 12, 36,105, 71, 68, 26, 14,193,114,117, 99, 12, 28,119, 51, 17,139,197, 65,222,251, 17,163, 75, 91,147,
+100,169,123, 31,208, 88, 57,247,222,224, 23,177,210,197, 24,209, 56,202,211, 75,187, 49,134, 79, 57,238,251,182, 83,120, 49, 80,
+141, 71,214,186,163, 18, 83,199,147,121,207,182,175, 15,206,139,181,139, 28,101,231,135, 3,210,251,136,105,138,214,229,132,160,
+135,168,227,152, 88,213,222,158, 35, 36, 57, 12, 26, 67, 48,182,109,229,206,235,144,149, 66,136,138,163, 88, 67,170,118,103, 26,
+130, 78,161, 93, 35, 61,174,235, 10, 32,156, 16,174,190,137,188,101, 92, 63, 58,225,209, 77,196, 95,252,201,255,195,132,188,206,
+189,147,140,183,229,193, 82,208,141, 63,248,147, 27,179,184,187, 41,240,187,209,236,228,101, 81,191,188,116,127,196, 80,134,110,
+251, 79,129,240, 4,179,188,105,242,147, 35, 7, 64,177,149,199,138,183, 57,247, 96, 4,239,156, 67,160, 56,198,146, 9,225,224,
+168,142, 22, 97, 39,215, 28,116, 98,140, 56, 71,241,149,151,178,115,247, 72,253, 4,247,120,154,115,252,193,123, 95,226, 7,143,
+207, 56,213, 12,156, 94,199,180, 76,184, 92,118, 82,181, 0,151, 55,224,243,207,240,254,207,190,192,171,189,225, 60, 69,252,151,
+191,241, 22,210,156, 80,106,199,125,149, 53,130,139, 1,126,154, 80, 86, 57, 92,151, 57,226,191,249,157,111,225,215,222,126,137,
+ 63,254,233,151,248,232,213,134,117, 47,120,121,191,227,235,219,149,118,158,142,156,229,243,234, 89, 14,146,243,146,240,155,223,
+126, 29,127,248, 47,127, 13,223,251,238,219,118,145, 58,239, 81,247,140,238, 60,150, 37, 33, 56,160, 78, 19,226,249, 6,229,171,
+ 59,124,252,197, 43,252,254,111,191, 99,226, 45, 41, 56, 3,211,189, 24,142,161, 62,107,178,244, 91,111, 35,199,185,139,104, 42,
+165,132,208,130,196,165,114,180,170,147,149, 61,231,113, 56, 86,135, 52, 77,140, 61,149, 21, 30,156, 19,136,208,193,215,235, 3,
+ 44,164, 69, 69,184, 26,196, 17, 72, 25,204, 37,219, 20, 33, 68, 97, 92, 56,122,173,229, 61, 33,206, 86,155, 13,245,168,107,113,
+156,139,145,216,112,192, 9,195,138,145, 65, 53,212, 67, 84, 3, 53,100,106,181,195,135, 9,203,233,132,171,235, 51, 78,231, 19,
+ 78,231, 5,211, 44,123,235,202,203,188, 27,249,203, 97, 55, 24, 75,183,236,140, 90, 59, 71,250,197, 10, 29, 25,123,115,229,213,
+ 21, 93, 26,144,146, 51,161,108, 8, 17, 33, 69, 94,112,129,246, 99, 41, 18,150,147,216,212, 34,153, 13, 74,180,211,179,251,213,
+203,187,195, 57,116,136,105,173, 93,152,229, 12, 96,209,245,132,240,219, 59,207,222, 65,118,203,117,183, 73, 87,167,206,161,212,
+138,232, 15, 49,168, 26,237, 76,155,171,250,194,189, 27,156,141, 78,177,153, 50, 0, 36, 1,148,120,222, 64, 81,164, 79, 6,198,
+241,252, 78,116,178, 43,231, 36, 76,207,213,125,167,112,215,147,233, 47,236, 17, 61,143,238,239,238,144,243,202,226,222,153, 48,
+ 79,149,237,232, 93,122,126, 34, 91, 85, 80, 46,232,225, 54, 64, 50,102,251,236,212,149,133,129, 18,102, 20,183, 98, 98,149,249,
+ 32, 26,167,136,218,138,172, 46,237, 0,119,150, 95,160, 69,133, 8,126,251,131, 9,130,112,100,102, 43, 52, 2, 39, 25, 17,109,
+140, 50,116,190,148,184, 19,150,241, 48, 0, 47,226, 52,237, 4,130, 23,193,142, 10, 0,114,110,112, 85, 89,125,236,184, 14, 4,
+176,204,110, 68, 70,246,242,178, 94,238, 46,166, 96,188,220, 75,151, 46,234,115, 25, 93,245, 60, 10,135, 94,186,217, 27, 64, 54,
+251, 52, 5,164, 36, 95,212, 52, 69, 83, 97,247,214, 76, 25,218,106, 55,172, 97,100,146,144,197,167,214, 54,146,150,248, 31,169,
+ 12,157,165,208,205, 75, 96,222,113, 65,206,192,114, 58,161, 85, 57, 0, 0,201, 50,175,204, 81,143,204,144,158,231,201, 30,174,
+156, 11, 2,157, 5,101,221,141,235, 14,116,184, 54,184,249,129,123,100, 79,228,170,236,193, 70, 66,153,250,114, 53,112,167,215,
+110,182,174,188,113,114, 0, 71, 65, 9,197, 24,222,113, 44, 40, 52, 51,229,149,171,242, 83,168,125,221,146,226, 20,185, 20,111,
+222, 69,105, 2,205,120,246,250, 13, 62,124,239, 47,113,185,187,147, 49, 85,206, 38, 54,212,253,168,163, 95, 92, 9, 93, 45,175,
+114,217,243,192, 87, 91,146, 90,209,114, 21,139, 77,171,149,123,199, 46, 74,110,142,119,189,242,174, 99,178,195, 87,125,233,189,
+100, 84,116, 19,137,180,146, 77, 89, 47,170, 89,114,242,163,135, 43,180, 8,122,254,154, 65,148,199,246, 34,246, 42, 93,191,243,
+163,115,162,136, 40,239, 27, 71,211, 50, 21,170,173,194,117,103, 54,185,180,156,208, 91,197, 39, 31, 93,144, 94,117,188,243,235,
+ 11,106,239,168,206,193,191,186, 69,127,249, 2, 62, 70,244,109, 71,223,118,220,223,110,248,143,127,251,137,168,208,159,158,240,
+237,111,220, 32, 70, 47,147, 22, 7,156,150,132, 92, 59,178,218, 68, 41,144, 41,165,226,187,111, 92,227, 55,127,247,251,184,237,
+ 14,127,247,159, 62,193,223,127,240, 41,158,223,110,184,187,144,241, 29, 28, 30,157,103,188,245,218, 53,254,233,111,124, 19,223,
+255,245,119,240,214,235,215,136, 65,196,144,173, 86,226,129, 29,194,114,102, 1,235, 49, 79, 1,211,205, 35,148,238,241,245,135,
+ 31,227,203,207, 62,199,219,143,190,141,249,180,200, 94,150, 36, 64,203,174,225, 78,219, 59,111,172,235,192,172,122,153, 72,200,
+132, 78,196,108, 66, 28,171, 94,206,129,125,219,173, 83, 20,229, 46,187, 21,120,204,203, 34,240,158, 57,113,119, 31,113,190,190,
+ 70,222, 54, 78,163, 10, 66,104,164,160, 9, 47, 35,239, 69, 14,107,120,131,121, 56, 39,248,224,146, 43,210, 20, 14, 4, 66,111,
+151,152, 90, 94, 21, 25,171, 83,141, 74,143,120, 76, 51,225, 66, 14,217,196,115,205,120,196, 57,231,129,138,181,160, 15, 17, 59,
+ 37, 82,190, 98, 76,210, 37,235, 10,142, 68,184,245, 34, 83,208,162, 54,180,195,132, 32, 70,225,104,136,213,139,231, 9,153, 21,
+165, 10, 7,190,181,194, 8,105,241,190,235,217,230, 92,144,204, 10, 47,226, 90, 41,212,229,123, 59, 95,157, 48, 26, 72, 17,199,
+117, 94, 52,251,158,201, 15,247, 44, 14,139,173, 34,106,149, 61,243,195,198,170,211, 98, 10,130, 95, 58, 73,162,133,130,212, 67,
+175,234, 37, 21,207, 59,137,255,237, 68,106,111, 12,196, 82,155,151,238,163, 65, 76,107,101,206,122,103,158, 5, 71, 60, 50,141,
+ 73,178,118,149, 88,225,137,147, 76, 45, 66, 58,139, 2, 63, 34, 89,121,198,187,174,162,228, 42,239, 40,173,116,165, 20,236,219,
+ 61,202,190, 26, 48,166,243,206,147,201,114,163,248,216,217,133, 94, 45,181,241, 64,193,115,227,179,232, 7,104,142,142,242,123,
+131,173, 84,228,159, 13,212,185,126, 78,186, 39,215,181,131,248,226, 85, 61,223, 44, 42, 87, 47,116,163,178,214,102, 57,237, 10,
+235, 2,128, 40,223, 89, 21,129, 88,147, 7, 5,157, 22, 3, 7,238,112,155,141,136, 53,123, 61,120,233,138, 52,187, 91, 67, 41,
+116, 52,230,116,134, 69,101,228,122,127, 47, 29, 89,169,163, 66, 46,157, 54,162,142,109, 45,134, 70, 44,205,234, 31, 98, 19,119,
+ 75,106, 66,143,100,131,139,224,101, 90, 34,213,215, 96,215,186,225,114, 89,185, 47,150, 11,103, 89, 38, 42, 69, 69,196,118,127,
+183, 10, 8,100,156, 87,246,133,180, 90, 12, 27,153,183,102,152, 76, 85, 5,123,159, 70,222,179, 41,191,165,130,181,108,242,222,
+137, 43, 36, 57,136,151, 80,154, 40,144,227, 5,214,122, 71,156,162,237,139, 5,182, 50,128, 42, 58, 34, 3,237,105, 26, 24, 34,
+135, 83,197,190,101,174, 39, 18, 28,201, 77, 66,254, 99,118,176, 31,129, 16,106,195,208,174,202, 51,161,172,225,104, 87,188, 70,
+188,126, 11,251, 86,241,248,181, 27, 76, 97,199,199, 31,252, 68,252,200, 85,139,184,102, 80,138,110, 54, 22, 38, 46,117, 25,149,
+181,154,121,161, 43, 1,169,219,186,194,251,104,251, 83,125, 41,192, 61,187, 12, 50,130,225, 71, 3,156,237,226,213,179,142,222,
+109, 31, 38,123,125,162,120, 3, 65, 14,144, 23,151, 27, 45,219, 43, 58,146,220,228,179,243,136,113, 54, 1, 95, 63,248,236,161,
+161, 60, 44,244,250,145,199, 16,132,191,157, 98,196,221, 93,198,171, 15,119,252,206,183,158,192,123,135,151, 95,223, 33,189,248,
+123, 44, 87,147, 68,121,166, 8,191, 76,232, 62,224,167, 31,191,192, 47,190,190,224, 60, 79,248, 47,190,255, 6,124,154,144,171,
+ 80,205,155, 27,213,127,222,118,118, 72,164, 72, 65,132, 71,203,156,240,206,179, 71,248,173, 31,188,141,219,219, 13, 47, 94,109,
+184,172, 98, 19, 90,247,134,235,115,194,163,155, 19, 82,240,136,203,132,121, 73, 56,205, 19, 60, 58,194,105,145,174,188, 84,160,
+238,112, 93, 70,211, 55, 79, 30, 33,221, 60,198,254,209, 47,240,211,207, 62,196,228, 61,174,230,136,190,221,155, 54, 68, 4,111,
+ 29,206,119,146, 11, 27, 47,211, 78, 50,156,140,136,139,134, 57, 17,230, 36,142, 1,218,122,170, 20, 2,209,137,174, 38,196, 4,
+ 80, 81,223,209, 49, 47,139,185,111, 84,184,102, 73, 90,158, 98, 49, 90,100,211, 60,143, 17,182,151, 98, 88, 96, 52,132,183,236,
+ 93,126, 14,215, 63, 66,149, 4,106,174, 2,164, 57, 40,173,229, 50,239,214, 17,139,173, 44, 30, 34,127,137,113, 14, 30,165, 56,
+123,175, 99,164,135, 90,213,254,164, 4, 78,243,132,229,180,224,116, 94,144,104, 69,213,104,105, 17,125, 53, 90,245,104,213,226,
+129,172,201,108,121,207,114,209,114, 53, 86,184,230,139, 33,160,244, 98, 99,101,129,143, 72, 82, 98,173, 98,209,157,150,197, 80,
+202,154,248, 54, 47, 51, 90, 17,151,144,160, 96,101,183,222,187,224, 93,107, 46, 7, 7,135, 56,123,246,109,183,134, 68,216,237,
+187,173, 44,181, 91,111,236,210,215,109,167,189,176, 90,226,156,104, 5,226, 3,251, 98, 35,129, 80,185, 31, 7, 65, 21,155, 9,
+197,166, 54, 22, 89,149,205,137, 67,156,102,203,104, 72, 41, 90,168,149,169,102, 21,195,195, 92,130, 70, 58,153, 62, 67, 33, 70,
+138,209,228, 39,102,230,183,239,219, 42,161, 50,173, 28, 38,116,116,225, 56,111,147,186, 78,245,190,158, 43, 96,147, 2, 47,110,
+ 38,117,136,140,145,186,126,183,245, 96, 89,107,236,222, 31,254, 60,189,156,187,117,230,132,223, 80, 77, 15,106, 75, 36,176,136,
+ 85, 37, 27, 15, 33, 89,118, 75, 14, 20,237, 79, 20, 33,118, 72,136,218,185, 6,165,129,232, 47, 74, 50, 78,169, 69,126,177, 82,
+ 81,155, 8, 36, 44, 79,216,123,160,118,203,235, 86, 79,175, 4,159, 48, 66, 78,125,165,222, 97, 91,243, 65, 5, 40, 21,212,101,
+219,121,153, 55,203, 27, 23,210,152, 51, 36, 35, 84,197, 26,100,207,182,204, 9,211, 28,109,164,156, 98, 36,109,105, 88, 61,164,
+242,142,112,213,225,190, 86,217,203,183,138,203, 61,204, 87,142, 46,241,174,208, 2,192,233,143,193, 40, 73,219,186,155,189,165,
+ 17, 69,106,233, 64,125,236, 14,151,101,226,132,128,144,147, 58, 42,249,206, 68,161,188, 53, 17,212,208, 30, 53, 77,201, 46, 35,
+ 3, 30,176,242, 82, 27,155,121,249,107, 69, 43, 21, 62,176,138,133, 10,241,216,133,107,158,252, 28,196,105,224,186, 85,217, 33,
+ 58,134, 87, 4,116, 18,179,148,128,231,109,191,229,113,126,227, 7, 88, 55,153,170, 60,125,237, 10,191,248,241, 31, 97,187,220,
+113,239,199,152, 81, 10,124,140, 92,215, 57, 66,204,154,121,236,134,216, 77, 73, 80, 20,154,120, 31, 77, 60, 34, 54, 26,217,133,
+121,242, 8, 60, 11, 60,207,113,109,239, 77, 14,228, 30,208, 91, 49, 70,190,247,180,233, 69, 79,177, 94,165,192, 70,138, 50,137,
+ 7,142,182, 3,246,220,209, 47,167,133, 88, 73, 24, 56, 71,234,206,202,181, 71, 56, 8, 96,116,143, 90,104, 9, 20,180,167,168,
+233, 51, 62,254,249, 5,223,127,114, 5, 95,129,187, 59,209, 72,192, 7,108,117,135,107, 13,137, 22,214,189,118,252,233,223,125,
+138,243,245, 9,255,226, 91, 79,240,171,223,124, 6,106, 25, 81,107,195,186,107, 69,223,237, 29, 44,157,107, 61,105,141,177,175,
+ 43,214,251,132,103, 79, 22, 44, 87, 39,172,165, 33, 45, 19,124,175,200, 69,190,187,144, 38, 76,215, 87,184,190, 57, 97, 62,205,
+ 56,159, 38, 44,167,217, 44,121, 64, 67,219, 54,212,237, 30,249,178,225,252,228, 10,117,223,240,229, 47, 63,196,123, 31,124, 46,
+193, 67,165,163,126,246, 9, 69,159, 32,124,199,150,135,230, 10, 0, 68,107,226,252, 16,220,233,247,176, 94, 86,156,175, 78, 28,
+126, 17, 38, 20,228,217,113,156, 38, 21, 30,102, 82,204, 50,101,141,104,101,167,249,228,222,163,150,140, 52,113, 92,155,228, 98,
+108,174, 15,251,163,243,220,201,139,253,213,209, 64, 30,147,236,153,149,101, 32,129, 32,157, 63, 22,108,242,229, 14, 16,167,209,
+129,226,176,247,214,130,197,113,180, 57,146,249,116, 37, 17, 52,152,101, 94, 24,137, 60, 25, 60, 73,127,174,173,225,138, 20, 19,
+153, 13,193, 17,171,187,231, 76,191, 59,108,207,222,232,159,110,173, 89,184, 85,136,137,161, 51, 14,167,243,140,101, 57, 97,154,
+ 39,174, 53, 43,197,121, 11,210, 20, 80,188, 36, 44,182, 46, 58,133, 82, 68,136,220, 56,229,211, 56,108,157,130,240, 43,199, 70,
+ 23,141, 4,243,136,210,125,223,118, 67,185,214, 34,216,220,157,239,144, 22,114, 18,151, 61, 31, 80,187,205, 2,123, 70, 97, 80,
+144,162, 71,103,119,237,152,249, 33,107, 57,209, 21, 73,243, 53, 81,196, 9, 91, 85,154, 5, 78,221, 88, 18,101, 39,172, 10,158,
+195,158, 40,236,214, 10,122,174,102,245,213, 34, 42,239,171,185, 97,192,184, 32, 35, 96,112,186,162,184,113,157, 38,129,216, 89,
+167, 34,224,134,195, 37, 78,209, 27,255, 44,106, 71,235,173,137, 16, 79,129, 53, 93, 19, 37, 15,246, 56,112,165,122, 32,196,105,
+129,131, 38,231,137, 3, 40,146,139,240, 8,232,182,215,135, 77, 89, 85,175,166,249, 22, 81, 69, 0,250,226,154,117,141, 10, 89,
+231, 58,122,205,220,169, 58, 30,152,244,210, 57,145,206, 41,136, 70, 51,178,197,179, 88,205, 42, 85,246,157,216,206, 74,138,150,
+116, 39,154,145,222,155, 55,107,210,168,148, 7, 46, 79, 95, 30, 21,235,120, 47,246, 21, 25,223, 68,222, 33,157, 66,146,108,185,
+222,234, 3,175,181,227,124,158,209,170,166, 27, 21,214, 46,210,217,195,130,103,132, 91,236,188, 16,156,148,195,155,179,100, 99,
+107,176,130,142, 73, 20, 7, 43,228,164,108,214, 52, 29,217, 40, 57, 8,246,240,145,142, 7,177,254, 77,196,219,206,147, 39,120,
+161,195,209, 79, 46,105,105, 29, 46,114, 36, 84, 10, 92, 76,168,101,133,111, 94, 48,154,112,152,151,197,138, 40,231, 3, 2,119,
+153,129,254,118,249,189, 61,171,255,138,192,164, 45, 83,254, 82,193, 26, 78,111,160,250, 71,112, 46,227,230,209, 9,229,254, 11,
+124,250,243,255,196, 67, 69, 84,246,114,136,110, 70,141,211, 98,200, 98,119, 27,168, 62,174,220,185, 30,226, 9,155, 4, 46, 56,
+218,126, 36, 69, 47,216,238, 83,173,114, 26, 82, 35,255,142, 8, 89, 26,195,105,228,193, 13, 98, 35, 50,123,220, 24,167,187,230,
+ 76, 44,231,220,248,179,132, 52, 41, 29,119, 36,246, 89,234, 84,196,178, 44, 44,218,196, 66,163,123,204, 70,187, 18, 66,176,195,
+ 6, 0, 94, 62,175, 56,191,200,120,244,230, 25,123,110, 8,231, 25,253,234,140,116,117, 66, 57,159,209,190,248, 28,121,189,199,
+212, 29, 62,252,242, 30, 31,124,117,193,227,243,132,223,250,149,199,198, 18,104,165, 96,111, 50,203, 85, 33,106,205, 44,144, 74,
+ 67,131,199,118,217,112,158,129,237,178, 35, 78, 59,246,234,112,190, 62,225,126,111, 84,160, 23,212,178,163,182,142,251,187,130,
+ 37,223,225,235, 23,247, 50,110,228,184,115,154, 34,182,251, 21,181, 85,108,151, 13,183,183, 47,241, 15,255,240, 41,238,214, 13,
+119,151, 59,220,111,247,240,209,225,141,239, 77,248, 63,127,250,247,112,222, 99,219, 11, 66, 18, 1,156,116, 6,162, 1, 9, 90,
+ 32,181,110,162,164,198,221,122,221, 51,153,252,188, 20, 89,213,213,218,224,179,103,168,136, 92,216,209, 57, 20, 28, 98, 69,131,
+ 71,173,194,242,214,168,226,121, 89,176, 94, 58,156,227,184, 52, 23,212, 34,124,137,202,247, 87,119,184,235,186,217,249,144,115,
+198,180,204,210,169, 77, 82,140,251, 69,156, 32, 58, 69,204,123, 57, 76,230,154,217,101,101,154, 22,153, 45, 95,236, 44,210,145,
+184,231,190,182, 41,244,209, 7,164, 83,194, 52, 37,156,174,206,152,166, 25, 49, 37, 99,104,168,167, 58, 80,192,103,142,152,170,
+164, 76, 57,155, 54, 70,151, 74,250,176,231,116,162, 89,131,163,190,105, 31,100, 45, 26,130,104,124,230,121, 33, 92, 70, 58,183,
+ 20, 29, 93, 25, 48,198,136, 35,128, 68,130,174,100, 26, 16, 72, 71,204, 89, 57, 12,242,191,245,207,208, 8, 98,145,243,114,179,
+244, 71,231,100,106,170, 0, 50,237,254,181, 32,246, 10,107,105, 56, 36,112, 54, 42,246, 9,172,177, 96, 41, 41,234, 28, 11,133,
+ 24,147,176,242,185,215,247, 65,169,162,114,237, 5, 10,242, 84, 11,225, 8, 41, 83,177, 89,135, 0,168,108,221,114, 96,173,244,
+166,116, 80,225,213, 59, 77,147,112,221,162,104, 21, 50,164, 24,215,214,221, 97,138,235,108,218, 8,235,232,221, 72, 87, 99,135,
+109,207, 84, 19, 2, 95,211, 32,168,134, 65,251, 68,231,222,222, 63, 88,101,134,144, 40,124,230, 42,220, 53, 30,221,188, 47, 9,
+229,210,203, 60,165, 25,206,105, 76,236,241,222,172,136,101,223, 8, 47, 81, 16, 3, 44, 65,169,211,106,144,247, 17, 20,175,209,
+154,157,127, 67, 5, 58,232,125, 86,184, 95, 81,208,126,167, 87,119,223,154, 49,116, 27,191, 84,217,191, 17,155, 74, 53,188, 20,
+ 13,220,235,176, 75, 23,209, 50, 71, 89, 41, 98, 57,205, 72, 83,194, 60, 79,210, 97,176, 59,211,176, 22, 71,129, 86, 41,133, 15,
+ 78,199,122,217,108, 4,239,208,105, 47,145,151, 89, 14, 28, 90,155, 60,255, 14,117, 76, 11, 98, 12, 40,140,234, 83,216,142,116,
+244,242,208,184, 42,135,221,182, 83, 37,237,186, 49,173,213,174, 16, 24,235, 89,225,224, 19,153,237,181,216, 46, 94,186,206,110,
+162,156,222,186, 0, 33,184,191,143, 73, 46,179, 86, 27,106, 47, 68, 51, 22, 19,239, 28,119,195,222,192,110,149, 58, 7,122, 66,
+189,116, 89,193,123, 82,252,228,179,113,126,194,242,230, 15,176,174, 59, 78,167,132, 39, 79, 79,120,239,255,250,119,200, 59,243,
+154,115,181, 49,165,114,136,125,224,159,135,222, 93,176,139,233, 10,241, 9,142, 76,230,102,144, 6, 79, 5,116,156,102, 98,137,
+131, 88,122, 40, 4, 4,173, 61, 50, 5,145,169,139,119, 74, 21, 19, 11, 85,160,191, 86,214, 63, 59, 71,160, 71,238,123, 39, 85,
+174,218,243,162, 32, 9,209, 26,137,167, 63, 77,179,113,246, 27,131, 38, 92,239,226,101, 15, 76,246,234,146, 28, 55, 45,139,165,
+ 3,150,226,241,217,251,175,240, 27, 79,174,113,161, 74,214,157,175,144,207, 87,232, 81,168,124,238,245,183,224,190,250, 12, 47,
+110,239,241,167, 63,127, 1, 23, 60,126,235,237, 71,120,116, 53, 25,187, 92, 58, 73,177,139,229,204,226,165, 3,141,233, 85,117,
+ 47,152, 60,144,162,195, 79, 63,121,129,159,255,248,125,132, 63,237,120,237,217, 13, 82,114, 40, 77, 14,220,125,223,208,123,181,
+ 68,185,198,228, 50,207,176, 27, 69, 16, 87, 85,175,179, 51, 13, 49, 33,156, 59,206,179,183,207,251,235,124,135,214, 35, 98,156,
+244, 35,179, 29,167, 17,179, 28,108, 29, 49,114, 7,100,229,211,122, 19,229,255,190,137,184, 80,187, 25, 62,211,105,154,216,225,
+203, 5,149,152, 53,145, 38, 5, 33,201,129, 60, 77,193,224, 34, 49, 77,104,125,199,171, 23,119, 8, 49,113, 50,225, 12, 77,237,
+131, 20, 12,165,116, 78,221, 70, 74,162, 34,170, 53,176, 68, 61,219,221,117, 75,155,212, 72,101,153,250,201, 65,171, 44, 5,155,
+ 72,129,193, 62,236,208, 43, 5,127, 49, 70,164, 20,177,156, 78, 88, 78, 39, 76,203,108, 29,250,114, 94, 16,147, 48,224, 47,247,
+ 43,187,192, 96,157,221,182, 21, 76,115,228,152,189, 24,239,189, 85,105,168, 42,139,165,222,155,197, 78,171,232,110,154, 19,230,
+121,193,147,167,143,100,133, 25,229,157,150, 34,201,113,210,229, 13, 39,171, 59,242, 90, 71,194,157,228, 25,196,193, 0, 33, 21,
+ 50, 51,148,165,213, 42,216, 94,116,100, 42,253,229,252, 35, 89,175, 53,148,170,147, 78,207,181,236,112, 72,168,186, 93,162,122,
+243, 64, 59, 43,124, 39, 70,115,178,136, 75,198, 91,103, 46,123,229, 96, 57, 21,206,123,203,206,240,206, 83,227, 2, 54, 85,197,
+238, 0,242,134,184, 78,174, 38, 44,204,251, 69,196,140,204,232,104, 26,201,174, 52, 47, 22, 22, 48, 33,218, 64,211,154,142, 73,
+221, 77, 29,195,142,172,182,188, 67,102,133, 76, 87,250,131,231, 89, 47,112, 1,239, 4,244, 94,108,154,169,239, 71,119, 18, 87,
+222,221,192,229,154,251, 41,120,243,216, 71, 18, 22,181, 91, 55, 50, 94, 23,155,233,233,116, 66,108, 85,184,178,121, 19, 35,126,
+ 96,117,169, 93, 82, 45,172, 46, 26, 14, 50,126,205,176,245,244,237,118,180,174,212, 45, 33,187,237, 91,150,189, 48, 28,166, 73,
+ 4, 1, 58, 94, 86,219,155,144,145, 10,213,199, 64,111, 25, 13,193, 30,186,192, 49, 91, 41, 13,211,180,136, 47,115, 74,132, 11,
+ 56, 83, 60,106,183,216, 90,227,232,168,154,159,177, 85,221, 81, 53,126, 64,178,255,174, 53, 75, 84, 32, 31, 94,207, 81,149,140,
+121, 2, 87, 15,221, 14,125,253, 2,106,145, 80,152,148, 34, 95, 22,194, 23, 56,134,214, 7,190,247,134,189, 22, 9,171,200,153,
+171,133, 78, 5,103, 68,160, 42,216,187,110, 23,179,166,226,137,229, 75,162, 87,181,115,133, 27,188,226,237,178,241,159,201, 24,
+ 84, 35,112,149, 37,222, 29,108,100, 14,200, 56, 95,117, 2,158,158, 91,231, 61, 90,151,162,108,122,252, 46, 74, 75, 72, 9,120,
+250,218, 13, 94,124,242, 62, 94,124,241,169, 4, 67,184,142, 22, 96,106,115,122, 89,196,206,150,179, 37, 72, 53,170,115,171, 93,
+248, 21,221,139, 55,216, 81,184, 2, 45,156, 66, 28,192, 29, 72,168, 77, 0,197, 32,181,160,113,212,238, 57, 38, 69,175,210, 41,
+171,206,130, 47, 48,208, 76, 23, 33,177,138,147,133,178,184, 56,217,110, 78,172, 52, 82,160, 74,225, 22, 56,150,211, 9, 73,229,
+ 30,158, 48,159,125, 19, 81, 82, 45, 70, 43, 19,176,134,195, 47, 62,184,197, 91,105, 70,243, 30, 91,131,176,214, 91,135, 91, 87,
+ 52, 23, 80,154,136,190,250,227,103,248,232,139, 11,126,249, 98,197, 57, 6,124,247,173,107,249, 76, 90,131,139, 73, 4,100,247,
+ 43,182, 44, 99,207,141, 42,246, 92, 58, 82, 12,112,121, 71,156, 59,220,147,103,120,254,179,175, 17,230, 29,215,215, 1,107,126,
+142,220,152, 63,237,164,147,149,142,163,115, 76,237,120, 17, 20, 19,192,118, 30, 94,122, 17, 3,206,214, 61,129, 19,178,198, 73,
+145, 90, 10, 77,164,211, 61, 59,105,233,252,106,107, 72,233, 24,101,234,209,208, 68, 60,218, 59,122, 20, 65,150,162, 90,245, 63,
+161, 11, 81,177,146,106, 38,197, 65,176,117, 86,135, 67,175, 13, 33, 69,228, 34,100,172,105, 94,100,109,183,109,216,246, 21,125,
+221,177,156, 26,150,243, 21,193, 37, 20, 50,213, 14,239,155,145, 37,229, 51, 14, 72, 49,114,228,221,172, 11,211,209,176,238, 55,
+157,229,111,143,149,218,182,237,166, 76,151,179,165,217, 58, 77,173,147, 41, 5,184, 41,146,171,126,194,249,234, 76, 0,204, 8,
+ 70, 9,196,118,234,254, 83,253,240,194,170,119,216,214, 93,206, 64,186,104,244, 82,112, 22,138, 64,100, 51, 17,160,206, 59,204,
+ 81, 56,238,211, 60, 3, 78, 84,240,222, 59,211, 60,169, 0, 24,189, 90,218,151,188,251,157, 69,188, 27,120,235, 82,209,218,110,
+161, 44,162,108,151,240,154, 66, 81,160,136,177, 6, 53, 79, 87,162,130,181,141,140,210,117, 44,254,186,217,137, 37,252, 75,130,
+146, 68,175,227,224,125, 18, 49,172,119, 12,121,114,182,250,213,231,209,133, 1,237,114,182,194, 21, 17, 92,235,213,208,190,146,
+133,209, 25, 6, 84,121, 94, 87,128,188, 13, 41,116, 51, 74,222,134,178,189,105,200,133, 31,129, 92,124, 31, 70, 50,160,179,187,
+222,178, 35,104,157,209,233,179,194,102,116, 66,112, 76, 46, 29,194, 57, 28, 26, 95,141,111,165, 53,142,161, 67, 20, 66,177,208,
+179, 32,215,131, 32,110, 32,103,189,143,230, 28,208, 0,155, 16,146, 5,123,181,222, 16,168, 87,138,222, 49,137,204,201, 1, 46,
+249,214, 3, 70, 47,135, 69, 59, 48,156,199,126, 86,163, 54,165, 51,211,132, 49,103, 64, 24,221, 21,170,160, 78, 76,244, 26,169,
+ 87,141, 3, 44,171, 6,103,149, 71, 48, 91,141, 6, 30,120,170, 27, 3,230, 57,113, 92, 19,201, 72, 6,249,211, 5, 59,125,228,
+219,186,139, 55,151, 56,214,194, 29,149, 84,173,160, 48, 79, 66, 91,246,109, 29, 23,121,240,136,113,178,106, 86, 65, 52,181,200,
+142, 71, 58,212,136,211, 89,186,151,182,107,117, 93, 13,191, 88,154, 10,119, 58,202,158,129, 36, 10,239, 94, 11,166,137, 93, 41,
+134, 88, 70, 89,227,158,161, 45,181,116, 90,189, 96, 97, 36,186,127, 43,121,199,118, 89,249,185, 56, 19,175, 9,246, 50,154, 18,
+ 84, 45, 34,222, 7,134, 1, 4, 59,192,101,124,229,172,210,140,203, 35,248,243,219,216,247,134,171,235, 25,167,185,225, 71,127,
+252,103,112, 62,114,183,218, 16,208, 16,147, 27, 22, 62,215,137,250, 29,241,140,218,173,123, 66,113,100, 45, 34, 47,183,142,197,
+188, 83,124, 48,119, 66, 14,232, 57, 75, 49,213,187,224, 91, 77, 52, 37,180,169, 16, 28, 28,162, 89, 54,208,155,248, 57,131,236,
+112, 61,199,183, 33, 77, 86,252,104,252,164, 70, 61,182,222, 49, 45,179,113,232,237,185, 59, 88,135,188, 15,216,183,141,136, 93,
+185, 8,230,101,193,180,156,216, 89, 39,180,210,241,226,179,140,119,191,113,133,181, 59,224,124, 70,127,252, 24, 27,128,190,222,
+ 99,158, 42, 92,243, 40, 77, 68, 68,127,241,193, 87,104,189,227,183,191,121,131,171, 36, 48,142, 20, 3,218,158,209,168,166,174,
+188,236,246, 38, 34,195, 41,202, 52, 99,185,114,216, 78, 79,144,231, 5,207, 30,159,241,234,171,207,168,106,246, 3, 88,161,156,
+130, 62, 24,229,186,239,148, 75,127, 0,147, 60,113,160,106,151,145, 21,154,124,126,131, 80,229, 76,208,229, 31,168, 11,168,252,
+167,166, 68, 84,209,222,198,209,114, 48,123, 17, 86, 85,112,122, 32, 29,175,226, 63, 67, 12, 88,215, 77,138,242, 16, 24,191, 42,
+239,147, 2, 77,172,191,225,119, 20, 99,180,164,171,206,241,103,206, 5, 97,207,152,102,242,188, 33, 34,175,245,178,155, 22,163,
+182, 6, 87, 27, 66, 96,151, 3, 25,215,246,126,144, 12, 97, 60,183,141,207, 46, 14,120, 82, 85,137, 59,195,143,182, 17, 52, 68,
+ 20,105,107, 29,203,105,193,249,250,204, 9,226,194,120,217,104, 43,139, 20, 35,214,203,106,221,155,115,142,227,126, 25,231, 23,
+238,165,197,211, 61,212,212, 58,246,117, 62,194,209,159, 47, 80,170, 25,203,233,140,148,130,137,140, 67,244, 86,152, 52,138, 85,
+205,177,208, 52,239,193, 83, 20,214,236,188, 82, 50,156,172, 43,119,142,200, 9,148, 33,179, 94, 69,144,129, 25, 30, 58,205, 24,
+224, 21, 54, 49,236,202,245,187,149,221,180, 76,165, 18, 59, 77, 77,219,180,132, 58,221,151,107,156,180,146,100,148,224,118,192,
+111, 59,239,209,235,200,221,104, 96,212,116,169,112,104,168,112,212, 50, 21,244,154, 9,211,169,156,204,106,145,212,161,174, 69,
+160,219,217, 9, 28,149,235,135,117,244,112,152,141,231,164,203, 84, 75, 5,143,131, 87, 32, 99,172,162, 42,116, 54,166, 93,187,
+117,174,181,117,146,164, 58, 38, 17,125, 71, 43,192,132,182, 25,237, 98, 47, 53,203,101,221, 10,159,147,104,239,159,138, 13,117,
+234,221,200, 17,137,219,186, 82,213,190, 91, 12,170,115, 28,104,246, 66, 3,189, 92,136,224, 72,164,213,134, 94,253,193, 79,215,
+ 80, 89,106,212, 3, 95, 93, 89,188,173, 53,177, 56,112,103, 82,107,230, 37,212,185,119,106, 54,230,214,145,190,226,135,122,147,
+241,207,213, 44,251,174,214,192,156,225,161, 30, 84, 32,131,118,254,232,221, 62,192,198, 5,152,142, 0,143,162, 24,217, 69, 53,
+148,188,211, 99, 27, 81,115, 65, 33, 51,120,223,216,201, 78, 50,246,243,204, 13,151, 47, 3, 60,116,228,162, 16,255,164,116,130,
+138, 40,197,212,109,143,237,130, 88, 81,166, 20,169,202,148, 17, 85,154,100,215, 95, 90, 19, 43,142,143,195,247,223, 52, 61,205,
+163, 53,114,149,189, 3,202, 33,151,156, 66, 51, 29,189, 43,232,191,213,102, 59, 33, 71,161, 94,247, 99,135,163, 79,229,252,244,
+ 59,216,101,229,143,103,175,221,224,195,191,251, 83,166,142, 69,118,112, 1,193,171,141,172,243,239, 87, 16, 34,189,202,181,162,
+213,142,156, 55,179,206,132, 32,163, 53, 56,133, 16, 69,177,155, 81,148,167, 54, 31, 52,217, 27,229,245, 66,150,187, 55,159,180,
+236, 23, 35, 21,239,196,146,234,133,229,228, 66, 10, 49, 26,211, 89,252,211,201,240,187, 53,239, 98, 81, 76, 73,220, 4, 28,225,
+ 53,102,169, 15, 50, 96,225, 1,151, 37,232,165, 10,136, 39,166,132,229,124, 37, 36, 68, 39,221,253, 60,123,156,175, 23,124,122,
+ 39, 8,209, 19, 46,240,165, 34, 62,122,132,234, 38,180,220, 17, 80, 49, 37,143,247, 63,248, 12,159,125,117,139, 39,215, 11,190,
+255,235,223,128,219, 46,112,189,161, 87, 22,112,173, 97, 93,165,160,245, 14, 56, 77, 17, 41, 2,113,114, 40,197,161, 76, 55,136,
+215,143,228,114,242, 28,199,146,213, 32, 99,188, 97,183, 18,206, 4,115, 23,104, 85,148,119, 50, 51,235,220,143,164,169,131,245,
+200,135,177,143,115, 4, 59, 12,188,101,179,139, 46,248,192, 65,139, 55,140,166,138,233,212,230, 42, 17,197,244, 99, 55, 77,176,
+234, 84, 47, 75,177, 16,200, 33, 16, 88,148, 31,172, 6, 78,184, 66, 12,216, 55, 89,179, 56,238,202,115,150, 53,211,124, 18, 88,
+143,138,198, 66,172,214, 21, 43,111, 64,166, 14,117,116,215, 12,138, 50,113,174,237, 64,155,237,175,133, 77,126, 80, 33,115,244,
+173,241,166,165, 20, 91, 13,193,116, 0,162,198,214,142,124, 89, 68, 36, 39, 89, 11, 9,137, 43,159, 52, 37,131,106,197, 20,177,
+239,249,176, 91, 87,120, 20,108,114,230,117,111,157,139, 93, 6, 34,222,108, 92, 55,206, 88, 78, 39, 78,164,100,226,145,146, 31,
+211, 16,238,241, 47,247, 27, 65, 60,154,132, 22, 41, 52,172,182, 74,211,108,190,156, 11,246,125,195,182,110, 38,100, 19,209,115,
+179, 14,183,183,134,230, 7,183, 18,153, 40, 0, 0, 32, 0, 73, 68, 65, 84,100, 74, 46,150,106, 24,235, 76, 65,154,230,121,139,
+ 23,190, 48,215,189, 31,124,232,129,216, 83,174, 91, 44,198, 55, 88,241,233, 60, 76,107,211,122,229,153, 10,212, 74,141, 20,131,
+162, 36,241, 17, 70,181,147, 73,212,206,137,237,142,195, 2, 92,206,198,134,193,137,239,162, 96,215,189,184,194,174,228,249, 45,
+ 54,197,209,117,147,237,232,185,179, 86,205, 66,227,106,198,188, 90,221, 1, 8,230,152,106,221,153,230, 71,227,197, 71,247,221,
+249,122,141, 17,189,112,239, 3, 31,211,254, 48, 56,134, 69,168,247, 13, 83,154,237,222,169,181,153,176, 91, 28, 0, 29, 81, 42,
+196, 54, 84,174, 24,201,108,208, 49,194, 65, 13, 47, 35, 8,217,125,111, 12, 68,145,142,204, 89,228,169, 9,177, 66,192,101,205,
+ 70, 12,114, 33, 9,149,201, 57,219, 3,143,131,105, 68,206,193, 57, 52,114,154,247,178, 34,132,100,163,216,121, 78, 99, 68,194,
+ 67, 74,186,244,140,187,219,123,218, 46, 26,214,117,195,233,124,226,197,215,200,137, 14, 88,215, 66,133,181, 67, 45, 35,227,214,
+162, 81,157, 67,207,221, 32, 56,206,123,236, 59,173,122,220,133,214, 90, 56, 14, 18,139, 83,222,165, 3,217,214,237, 65, 23,158,
+210, 4, 7, 33, 23,165, 16, 57,162,146, 78, 36,114,247,164, 44, 97,169,151,188,169,214,251,131,160, 12, 88, 80,139, 88, 8, 61,
+ 5, 92, 84, 10, 7, 9,110, 41,123, 70,154, 68,116, 36, 81,160,206,180, 17,173,117,248, 22,132,146, 70, 63,167,155,158,162,135,
+ 71, 40,235,138, 39,207,174,209,243,115,124,249,209, 63,200,222,135,170, 75,221,227,244, 94, 1, 39,113,155, 33, 78,180,135, 37,
+ 56,223, 16, 98, 23, 44,112,240, 6,101, 16,224, 75, 61, 20,114,176,142,209, 57,135,188,101, 73,222,234, 28,229,145,172,103,236,
+ 0, 34,116,155,133,107,136,229,204,113,199, 46,207,132, 35, 74,119, 49,254, 0,232,211, 15, 49,218, 46, 62,120, 79, 92,109,231,
+122,168,154,191,118,223, 46, 76, 25, 44,134, 50,245, 33, 98, 62,223,208,149, 0,184,152,208,122,192,190, 53,228, 6,220, 6,143,
+215,207, 9,190, 3,113, 22,219, 90, 74, 65,224, 16,232,216,114,199,143,126,242, 75,180,214,240,187,255,244, 93, 44,111,190, 1,
+ 60,255, 26,254,197,115,187, 52, 83,244, 0,225, 66, 29, 29, 87,147, 92,232, 62, 56,196,215,222,146, 28,241, 82,112, 90, 34,238,
+ 95,222,179,120,242,240,209,217,232,112, 92,240,163,176,117,156,142,116,219,217,117,248, 3,123, 90, 47,113,207,176, 21,181, 34,
+ 41, 39,189,163, 24,165,236, 65, 22,122,215, 48,160,134, 86, 58, 60, 1, 76,129,129, 31,170,144,246,174,217,123,225,181,211,114,
+ 64,219, 55, 94,176,238, 65, 7, 36,130, 50, 41,150, 53, 66, 84, 2, 83,220,200,108,143, 9, 33, 87, 52, 63,156, 17,138, 26, 22,
+209, 80, 2,224, 13, 26, 37, 66,167, 17,163,234, 92, 27, 43,136, 58, 70,232,160,175, 61,239, 5,167,171,147,240, 57,218, 80, 74,
+ 43, 22,180, 20,217, 69,107,102,195,233,124,178, 32,170,211,105,193,180,204, 50, 14,231, 69,126, 58,159,100,252,238, 61, 90,136,
+ 88,203,134, 90, 68,168,216,121,145,110, 91, 54,240,147,167,245, 77,237,100,222,117,132, 52, 26,146,148, 18,210,188,224,116,117,
+ 30,254,123, 63,242, 34, 44,119, 34,120,138, 0, 97, 64,157,121,153,217, 93,118, 58,145,164, 72,242,228,218,239,219,134,117, 93,
+205,107,190,179, 16,160, 6, 91, 88,245, 33, 90, 97,163, 32,159,100,241,219, 64,138, 73, 64, 49,138,252,238, 13,181, 13,232,144,
+ 3,108,106,227,186,156,241, 41, 70, 84,200, 84, 65, 91,141,214, 26,187, 77,189,240,128, 86, 26,217, 40,254,176, 90, 24,251,251,
+188,239, 64,175, 76,130,171,230,172,210,162, 76,157, 47,253,216,241, 3,112,221,161,234,170,195,143,179,206, 25,229, 77, 53, 21,
+120, 48, 13, 51, 62,129,218, 35,209, 13,187,173,191, 79,135,190,131, 67, 20,168,212,184,214,184, 47,247, 3, 77, 46, 69, 73,179,
+ 40,114, 41, 46, 3, 84,185,166, 98, 56, 41, 76,135,151,253,104,121, 6,167,105,206,121,196, 90,170,161, 31, 77, 48,224,130,189,
+196,218,185,195,121,170,172,101,252,230,117, 68,113,176,188,168,218,207,192, 40, 57, 91,151,215,253, 8, 60,145,207,172, 35,171,
+ 5,129,135, 71,161,197, 74, 31,240, 14,134, 66,196, 32, 94, 87, 98, 60,245, 82,212, 48,150,156, 11,246,156,109, 23,111, 99,179,
+ 82, 40,148,210,209,136, 8,231, 52,221,168,240, 16,176,168, 60,139,234,237, 60,164, 86,248, 24,145, 8, 63,209, 17,118,224,158,
+252, 56,186,237,173, 91,101, 90, 75, 6,226,225,208, 33, 96, 70,171,114, 57, 68, 59,247,242, 21,145,187,102,177,219, 72, 69, 29,
+147,163,202, 18,216,183,213,200,105,141, 66,197,152, 38, 99,119,235,139, 51,205,146, 58, 38,190,244, 32, 59,202, 40, 8, 75,111,
+233,110, 26,225,151,176, 60,253, 14, 94,221,110, 56,157, 38, 60,126,178,224,103, 63,252, 19,218, 6,101,199,191,109,155, 76, 74,
+178,238, 28, 61, 60, 47, 83,225,189, 11,249, 76, 31, 90,101,204,171,106,210, 24,206,170, 90,175,197,178,237,153,168, 43,226, 55,
+ 30,236, 74, 35,236,228,198,235, 67,175, 20,187,224, 29, 69,118,210, 33, 76,167,133,119,134, 6, 7, 21,225, 32, 51, 75,185,146,
+ 46,167, 40,219, 66,129, 83,201,186, 71,204,128,210, 11,249,148,196, 52,227,124,243, 8, 33, 78, 40, 53,224,207,255,226,107,220,
+222, 61, 71, 41, 29,123,233,184, 90, 78, 56,167, 29,174, 3, 79,175, 38, 60,122,124,131,235, 39,215,104,181,225,114,191, 33,120,
+224,199, 63,249, 16,175,238, 55,124,239,157,103,120,247,157,215,132,202, 56, 37, 82,193,100,180,237, 99,192, 90,138,116,101,173,
+ 99, 78, 14,211,121, 70, 56,157,176,157, 22,132,109, 71, 93, 51,226, 20,112, 61,123,236, 95, 85,224,202,161,100, 48,228,199,161,
+218,152,184,217,139,173,159,221,113, 47,219,213,126,217,117,106,213, 1,223,141,178,167, 98, 32,104,160,145,111,230, 99,142, 73,
+ 52, 40,137,222,253,105,154,176,173, 42, 58,149,164, 69, 80, 4,138, 94,205, 30,232, 29,184, 79,141, 8, 93,138,228,125,221, 48,
+159, 70,174,132,171, 64, 11,221,222, 67, 79, 39,196,186,174,150,161,160,194,160,121,153, 81,234,133, 89,217,129,200,214,192, 92,
+ 9,118,123,209,161, 49,161,208,118,145, 65,118,169,226,171, 47,246,158, 15, 30,124, 52,160, 72, 43,131,250,229, 67, 64,203,242,
+ 1, 77, 76,135,243,206, 33,206, 19, 34, 83, 20, 99, 12,152,151, 9,243, 60,155, 55,252,116, 62,145,251,158,164,200, 45,213,236,
+ 98,149,217, 22,165, 8,147,163, 20,103,164, 68, 17,254, 73, 67, 19,210, 16,128,165,148,224, 67,194,188, 44,182,211,214,193,129,
+ 39, 44, 70,173,129, 98, 59,109,214,132,205, 44, 52,106,107, 40, 91,230,202, 67,132,173,247,247, 27,197,194,133,201,100, 21,219,
+186, 31, 80,192,206, 20,228, 58,141,213, 76, 14,179,246,213,193,211,152,195, 68,191,127,182, 85,208,128, 12,141,110,247,152,191,
+161,106,112,176,224,240,204,123,240, 78, 11, 3, 33,202, 73,198,185,140,235,213,250,215,123,149, 68,191,154,105,155,237,230,188,
+ 26, 43, 39,111, 20,118, 19,190, 81, 96, 55, 34, 93, 27, 80, 15,248, 86,189,192,155,198, 11,107,103, 61,212,236,120,208,157,143,
+203,187,107, 10, 32, 84, 80, 55,246,234,181, 61,244,167,123,174, 9, 11, 83, 77,187,218, 40,221, 96,204, 43,159,164, 19,187,171,
+236,151,218, 6, 24, 71,221,100,234,254, 10, 33, 32,194, 9,115,214, 7, 81, 19,235,174,163,247,134,170,149, 71, 3,122,205,150,
+ 12,134, 94, 37, 44,196,118,164,236,238,131,140,102,125,240,242,107, 58,238, 60, 88,149,212, 90,108, 4,219,154,103,247, 78,200,
+131,119, 84,203, 86, 27,155,169,176, 71, 73,111, 49, 37,204, 11,253,139, 76,237,217,182,140,245,178, 98,223, 50, 5,105,149,244,
+ 42,207, 10, 88,186, 99, 23,228, 98,221,214,141,212,176,140,105,138, 88, 87, 25, 53, 21,170, 67,231,121,178,253, 99,151,183, 4,
+205, 59,120, 23,108, 20, 34, 92,102, 32,239,170,112,167,112,208,113,197,224, 60,124,146,157,239,249,234, 44,169, 96,225, 97,186,
+149,118,159,141, 30, 92,249,177, 96,112, 25,173,194, 42, 99, 99, 75,150,142,197,251,202,142, 32, 90,172,173,247, 2,254,232, 24,
+ 65, 50, 90,145,170, 45,194, 57, 79,138,155,140,128, 78,175,125, 23,247,171, 20, 89,215,143, 78,184,124,245, 75,228,109,165,138,
+221,147,192,197, 65, 45, 99, 86,157,239,140,120,132,141,252,106,107,136,230,134, 24,158, 79, 56,245, 94, 71,138,223, 4,146,211,
+109, 55, 68,200, 78,144,146,188,236, 59,153,226,145,207, 74, 54,216,142,163,242, 55, 26,195, 90,232,112, 67,196, 40,216,198, 24,
+ 84,129,223,152,174,229,152,119,159, 81,157,132,189,168, 88, 77, 86, 20,153,160, 37,160, 54,135, 52, 79,184,126,244, 20, 29, 1,
+ 64,196, 15,255,234, 5, 62,251, 66, 40,129,243,146, 16, 75, 69, 90, 78,168,104,184,119, 19,214,219,138,187, 79,111,241,122, 6,
+222,124,227, 6,143,175, 34,238, 47, 25,239,189,255, 9,174,207, 19,126,239,159,127, 15, 33, 6, 76, 41,160,110, 27, 2,153,237,
+189,117,164, 8, 4,250,184,247, 82, 81,111, 30, 35,190,243,171,168,205, 97,170, 25, 29, 13,201,157, 16,131,195,107, 79,207,184,
+125,239,130, 39,143, 79, 38,190,106,165, 89,154,150,115,209,118,190, 15,105, 86, 50,114, 15, 12,187,108, 29,131,244,215, 20,164,
+197,176,112, 46, 98, 29, 39,116, 29,141, 83,172,128,152, 24,126,225,100,101, 22, 2, 59,138, 14,218,154,132,201, 93, 25,230,161,
+ 68, 57,121, 95, 68,119, 51, 77,211, 33,139, 92,157, 17,157, 69,168, 36,205, 21,211, 6,200,103,148,247,221,224, 68,160, 78, 66,
+ 70,171, 2,197,106, 97, 76,146,148,149,209, 90,160, 38, 69, 27,133,106, 74,249, 52, 77,116,173, 52, 67, 41,151, 44, 69,200, 60,
+ 51,231,188, 54,244, 24,237, 64,119,214, 69,139,253,107,154,147, 1,102,148, 72,231,131, 39, 7, 95, 64, 47,105, 74,152, 79, 51,
+208, 59,238,110, 47, 22, 83,188, 83,128,199,233,177, 48, 54, 88,148,128, 8,109,165, 26, 58, 42,237,125, 72,240,220,167,135, 32,
+116, 62, 13, 53,170, 44,118,228,172,148,233,164,124,102,206, 66, 94,138,177,219, 11, 66, 0,106,145, 98,125, 91, 55,108,219,102,
+171,167,109,207, 18,132,133, 49, 50, 14,196, 71, 71,186, 20, 52, 23, 65,133,107,157, 80, 28, 81,208,239,244, 75,215, 7,163,107,
+221,253, 2, 35, 20, 71,173,198, 90, 52, 4,181,177,113,122,160,126,120,121,214,139,113, 12,180, 65,168,125,252,111,189, 54, 77,
+255,209,117, 45, 9,158,177,149,193, 98, 92,243,246,142,230, 49,166,161,132,167,117,235,184, 49, 32, 48, 74,109,163, 53, 88, 69,
+113,253,240,123,142,139,189,143,232, 84,186,191,218,131,127,174,243,143,193,111, 25, 43, 2, 45,170,245, 99,243,182, 58,232,180,
+221,121, 22, 82,114,174, 37,101,218, 81,253,222,145,210, 66, 77, 67, 68, 84,111, 98,111,142,162,153,102, 59,166,166, 88,192, 48,
+ 56,191,186, 83,210, 17,123,171,133, 94, 99,207,177,142,140,209,244,146,143, 49, 80,188, 65,114, 22, 83,201, 74,145,125,159, 60,
+196, 96, 18,145, 84,126,182,199,160,127, 87,124,171, 51,199,127,170,186, 23,161,145, 8,134, 10,187,135,194, 88,196, 66,242,155,
+168, 49, 99,138, 6,116,112,222,163,108,187, 9,197, 90,131,169,198,209, 69, 9, 31, 56,110,210, 81, 76,219, 68,181,158,248,235,
+232,200,195,170, 80, 18,246,132,131, 46, 59, 41,181,103, 36, 50,138, 29,132,202,215, 14,188,103,225,209, 51, 57,107,138,188,196,
+162, 21, 38,146, 55,127,176,144,229,194,128, 20,201,164,158,151,161, 24,143, 73, 69,120, 30, 21, 69, 62,103, 47, 82, 22,209, 51,
+116, 35, 85,165,211, 51,180,248, 4,117, 93,113, 58, 77, 88,166,138,159,255,228,239,200, 92,158,197, 86, 81, 43,189,242, 77,224,
+ 53, 77, 98, 35,187,217, 63, 48,236,126,244,220,202, 69,237,132, 40,231, 2,224,153,234,228, 60,224,154, 88,216, 18, 89,205, 94,
+138,195,206,100, 38,169, 76,154,101, 26,171,224, 47, 16,158, 50, 77, 51,224, 58, 82,154,105,125,219, 31, 64,107,132, 20,181,161,
+213,140, 16,147,100,215,239,155,133, 54,228,125, 51, 33, 93,183,116, 36,126,247,112, 72,193,227,116,245, 8, 33, 45,240, 33,226,
+ 39, 63,121,133, 23, 47,129, 39, 79,174, 13, 54,228, 67, 68,156, 18, 5,148, 13,251,186,225,242,209,231,120,254,245, 45, 62,253,
+135, 79,240,108,114,120,177,101,132, 57,226,159,124,251, 77,252,202, 59,175, 65, 13, 3,113,142, 8, 97, 65,171, 29,209, 9, 36,
+232,101,121,129,155,235, 19,182, 61,227,141,183, 94,147,238,174, 3,185, 22, 41,156,162, 67,108, 5,201, 55,220,222,109,104,117,
+178,156, 6,141,223, 21, 6,255,176,144,170,136, 82,143, 57,111,169, 86,242, 25,121,117,151, 96,236, 75,189, 15,200, 69, 4,139,
+106, 89,148,216, 83,134, 3,213, 62,162, 67, 67, 64, 8,130, 57,206,165, 34, 32, 90, 98,160, 22, 28, 57,239,216,209, 69,204,229,
+ 2, 90, 43,216,247,142, 24, 19,182, 77,214, 98,210, 37, 7, 19, 13,133, 24, 17, 3,164, 91,140,222,236, 67,128, 4, 28,229,189,
+143, 41, 30, 15, 88, 97,218,187, 3, 2,185,195,149,138, 94, 69, 69,157,146,168,245,227, 36,106,227, 66,255,183,138,185, 74,238,
+230, 28, 17,139, 85,146, 64,154, 92,198, 84,173, 57, 20, 62,231, 51, 33, 47,105, 74, 76,168,131,216,107, 83, 66,140, 17,203, 89,
+176,172,167,243, 66,213,121,193,122, 33,238, 54,103,226,104, 5,198,212, 57,194,150,176, 42,216, 40, 91, 71,233,167,243, 66,205,
+ 3, 44,210,118,223, 55, 99,117, 0,130,129,213,116, 57,141, 71,213,164, 58, 31, 36,110,181, 86, 78,171,170,124,175,219,182, 97,
+189, 92,100,191,207, 70, 6, 93, 28, 23,160, 63, 60, 96,146,180,182, 24, 13, 97,171,250,161, 66,248, 88, 35, 78, 92, 46,115,102,
+ 93,208, 78,236,120, 22, 42, 34, 53,248,177,242, 83, 24,149,234,154,130,235, 72,105,146,119,150,113,171,114, 97,203,101,158,247,
+ 13, 37,175,104, 45, 83,196,221,172,163,149, 6,177,216,109, 78,186,137, 53, 23, 77,199,233, 84,148,107,161,167,112, 33, 17, 13,
+ 87,168,199,205,238,190,166, 34,183, 62,242,206,209, 31,184, 70,154,195, 96,100,112,159,110,214, 54,117, 89, 28,199,242, 38,198,
+ 28, 68, 60,131,152,113,212,239,237,199,187,225,110,181, 80, 47,228,133,200,132, 89,196,115,193, 38,200,210, 12, 70,229, 7,232,
+152,164,150,130, 56, 69,195,223,233, 94,163, 55, 94,220,222,163, 23,181, 86, 21, 38,152, 21,238,152, 59,186,243,135,216, 57,181,
+ 57,120, 99, 23, 23,138, 89, 40,209, 17, 97, 29, 59, 2,241, 44,139,130, 59,103,217, 23,136,218, 86, 62,160,243, 60,201,120,235,
+ 52,177,106, 13,204, 54,110,184,191,189,199,182,237,184,187,189,231,152, 8,244,245,137,130, 51, 77,137, 74,206,177, 43,144, 48,
+130,136,187,219, 59, 76,115,196,190, 9,130,210,103,200,129,180,115, 28,232, 37, 96, 37,121, 1,231,108,171,170,167, 11,124,149,
+142, 92,240,165, 14,123, 46, 12,156,168,182, 62,208,220,111,143, 78,159,115,163,248, 75, 14, 49,141,166,117,212, 20,132,200,189,
+ 17, 71,117, 62, 0,251, 42,144, 25,241,210, 70,230, 76, 75,106,149, 90, 50, 60,119,245,141,138, 90, 5, 88,152,125,195,195, 68,
+ 76,232, 1,243,211,239,224,213,237,138, 16, 60,158, 62, 59,227,211,159,254, 80, 84,211, 62,208, 34,232,105,151,216, 73, 53,138,
+240,161,115, 20, 52,224, 64, 10,226,136,169,155, 37,100, 8,226,154,105, 47,228, 2, 15,118,152,186, 94,204,182, 18,102,134,122,
+240, 32,237,135,170, 58, 77,145,251,243, 96,151, 59,200, 1,144,209, 59,171,105,122,107,189,138,159,106,198,186,238,134, 80,204,
+ 74, 27, 3,198,165, 24, 19, 2, 72,213,115, 30,167,235, 71,152, 79,103,192,121,124,244,241,142, 95,126,220,112,117,117,162,207,
+ 94, 94,230,249,180, 72, 81, 88, 41, 50,155,207,240,101,135,107, 25,119,155,195,165,122,124,246,245, 5,243, 60,225,219,223,121,
+219, 94,224,114,127,143, 41,120,224,234, 49, 22, 10,127,122,107, 40,203, 11,204,203, 29,224,132, 14, 22,137,247, 45,247,130, 70,
+141, 47,191,198,221, 47,126,137,242,245, 5,235, 37,155,218,213,244, 46, 60,144, 59,171,252,214,218,131, 32, 18,179,159,182,134,
+198,224,160,170,157,143,186,123, 56, 10,245,166,206, 29,152, 76,112, 61, 2, 78,128,100, 74, 34,157, 77,169, 21,145,207,159, 67,
+ 64,233, 13, 21,222, 70,131,210, 29,122,244, 86, 16,225, 48,165,201,206, 5, 73, 62, 4, 80,164,200,206,187,188,179,232,193,220,
+ 12,141,147, 62,231,105, 71,244, 1,112,162,122,207,185, 29,196, 77,142,104,107,233, 10, 67,240,104, 44, 76,198,168,190, 99,154,
+ 60,122, 8,104, 81, 28, 38,222,203,254, 91, 16,206, 48,101,251,216, 83,170,115,167,114,194, 37,221,178, 68,124, 78, 36, 66,242,
+249,140, 1, 87,143, 36,187, 92,216, 25, 19,139,155,138,187,219,149,154,152, 98, 13,129,126,238,106,171,148,119, 4, 8, 81, 58,
+236,204,213,135,167, 86,163,183, 42, 66,102, 39,197,202,196,216,223,225,129,110,194, 87,144, 74,144, 34,193,130, 90,119, 27,249,
+ 3,192,190,109,216,168,205,201,202,160, 87,161,175,230,155,251,200,136,214, 1,144,177,115,140, 58, 11,163,110,238,114,209, 20,
+ 10, 29, 5, 59,221,208,115,167, 67, 70,191,155,110,224,173, 99, 20,105, 71, 71,138, 9, 33, 38, 76,211,130,105, 74, 60,166,187,
+133, 71,249,184, 34,150, 25,235,253, 43,160,100,155, 64, 53, 84,139,115,181, 81,123, 31,152,215,163,210,220,222, 5, 12,103, 64,
+ 63,188, 43, 29, 35,180,167,211,226,170, 68, 63,103,176, 24,247,128,111,223, 91,183,100, 54,237,204,123,135,229,182,107,118,138,
+ 58, 5, 76, 36,215,135, 83, 72,139, 28,179,233,185, 49, 93,211,166,242, 65,150,187,115,135,196, 78, 24, 63, 66,159, 99,213, 1,
+ 68, 1, 48, 48,168, 35,203, 75,208, 74,102,116,166, 67,233,149, 9, 51, 85,236, 97,181, 73, 64, 70,101,104, 67, 27,129, 29,142,
+ 93,178,222,239,133, 15,103,167,120, 73,163, 11,101, 52, 2, 6, 30, 8, 62, 81,227, 17, 29,171,174, 66,149,102,154,102,120, 31,
+132,199,173,130, 36,166,174,181,189, 98,223,118,236,171,100,225,186,126,196, 9, 50, 69,137, 99,150,105,153,177,222,111, 34, 68,
+241, 1,189,107,152,193, 32, 62,169,143,186,247, 98, 36,164,188,239,216, 35, 19,144,104,197, 64, 15,168, 78, 30,138, 72,117,170,
+116,225,133,153,196, 50,150, 87, 30,179,165, 62, 89,118,140,192, 34,156,107,182,123,138, 41,152,117,198, 19,172,146,247, 13,141,
+ 24, 80,217, 45, 55,219,157,169, 42,222,216, 0, 57, 91,232,134, 22, 0,170,135, 80,128,133,115, 14,231,215,191,139, 92, 35, 90,
+ 91,241,228,233, 21, 46,207, 63,196,139, 47, 62,133, 15, 84,142,115,127,214, 88, 80,105, 72, 64,171, 21, 62,121, 84, 62, 35, 42,
+162,212, 74, 53,104,130, 22, 58, 16,104, 41,138,222, 44,123, 34,176,202,136,193, 1,144,188,227, 90, 50,234,222, 57,237,161,133,
+199, 73, 84,172, 15,147, 40,232, 53,136,131,110,129,137, 5,158,238,229, 26,249,239,162,177,216, 70,138,156,166, 75,105,122, 29,
+133,146, 50,133, 81,221, 70, 69, 76, 51,210,188, 96,185,186, 70,136, 19, 94,190,170,248,251,247, 87, 60,126,114,141,117,205,112,
+193,217,103, 14,231,209,186,199, 20, 61, 82,242,184,190,154,208,219, 2,108, 23, 76, 1,248,244,249, 5, 87, 55, 39, 60,121,242,
+ 8,183, 91,195, 39, 95,222,227,113,170, 88, 92, 67, 63, 95, 35,222, 92,195, 47,147, 48,200, 29,112,223, 63, 50,188,102,107, 18,
+176,216,247, 13,245,231, 63, 67,126,241, 18, 29, 5,174,137,133,175,213,145, 85, 96, 35, 95, 78,174,168, 14, 51, 43,140,138, 6,
+ 59,187, 10,207,131,191, 52, 30,138, 42, 38, 82,239,118,173, 50,205,170,170,244,110, 70,250, 66,111, 8,105, 34,129, 80, 28, 30,
+ 89,226, 29,237,189,209,137, 71,173, 99, 95,217,205,186, 33,133, 83,206, 59, 98, 18,129,165,159,188, 77, 15,192,149, 64,171, 29,
+ 46,241,204, 49,223,113,195,121,158,209,123, 65,103,161,223, 90,151,162,187, 55, 19,219,170,240, 46,166,128,142,132,245,190, 14,
+114, 96,107, 8, 41,216, 59, 24,188,135, 79,204,173, 38,151, 96, 73,129,127,127, 41,196,183,203, 58,240,177,189,113, 37, 39,225,
+ 51,167,243, 44, 34,177, 46,246,220,232,188, 97,109, 5,176, 35, 86,187, 86, 10,214,251,149,163,101,207, 92,118,142,148,173, 17,
+115,212, 13, 4,137, 2, 54,228,106,178,201, 67,171, 89,226,162,231, 40, 68, 79,254,152,231, 74, 45,239,178,126,244,193,155,192,
+ 56,231,221, 68,159, 42,140,188,220, 95,232,137,223, 13,121,173, 30,103, 33, 91,194, 44, 83,131,226, 57, 20,248,149, 35,243, 82,
+138,196,177,106,199,202, 95, 71, 33, 71,122,107, 10,213,146, 43, 50,237,146, 7,233,196,214,171,141,133,119,173, 25,219, 54,138,
+203,222,187,188, 99, 55, 55,112,104,240,175,191,134,219, 87, 47,241,226,171, 79,145,247,139,164,118, 66, 93, 22,222, 44,106,166,
+ 17,193, 0,215,244,166,192,162,192, 95,187, 62,192,124, 27,130, 70, 9,112,234, 65, 63,238,203,251,152,164,216,255, 7,198, 25,
+200, 21,164, 5, 91,245, 54,148,238,102,151,235,227, 28,209,162, 98, 40,212, 15,127,158, 14,239,104, 13,228, 20,210, 52,167, 6,
+196,145,115, 62,178,128,212,245, 65, 8,145,236,119, 56,187, 92, 44, 51,152, 68, 28,231, 27, 92,243, 18,107,154, 11,147,119,162,
+141,186,117,174,175,209,157,154,213, 43, 25,192, 14,109, 47, 72,211,100, 30,233, 78,222,111, 45, 21,149, 29,171,116,168,163,195,
+149,139,150, 10,119, 39, 93,209, 60,207,252, 53,228,162,200,123,198,229,238,130, 90, 50,238,239,238,169, 64,159, 88, 76, 80,137,
+121,248,144,246,205, 33, 68,122,214,213,122,115,240,115,202, 75, 66,230,244,165, 30,176,123,226, 15,111,220, 87,232,223, 35, 70,
+169,218, 11,187,149, 98,138, 90,144, 52, 21,184, 43,239,156, 60, 4, 0,193,162,102, 1, 73,183,242, 60, 68, 61, 93, 8, 2, 83,
+ 32,254,147, 10,237, 16, 39,249, 98,217,177,122, 50,240,117, 5,161,204,112, 9,224, 16, 59,140,250,123, 75,165,175,219, 57,196,
+229, 9, 48,191,129,203,171, 21,167,211,140,243,210,240,179,247,254,134,150,195, 93,194,123, 64,144, 4, 1, 39, 50,222, 10,172,
+208,235,225,161, 10,244,227, 15,161,135,142,183, 83,140,220,221,147,186,212, 14,233, 78,252,156, 74, 17, 20,174,100, 35, 69, 19,
+252,233,190, 61,132,128,144, 34, 21,159, 2,175,136, 41, 81,201,158,217,113, 75, 32, 77,171,162, 92,207,155,240,255, 69, 8, 39,
+159,131, 87,120,140, 15,162, 64,109,227,229,119, 78, 64, 64,203,249, 6, 64,192,190, 3, 63,250,235, 87,120,250,248,145, 92, 76,
+ 51, 25,211,236,226, 36,118, 55, 98,153, 35,166,228, 81,114, 5,220, 4, 92, 45,120,245,252, 5,154,115,136,222,227,245,215, 30,
+161,150,138, 23,159,126,142,118,138,184,121,227, 53,132,229,140, 72, 21,176,111, 50, 50,189,172,114, 96,183,218,224,110, 95,192,
+221,158,101, 31,212, 10,178, 11,200,151,130,237, 82, 17,231, 25,211,193, 1,162,160, 37,229,147,203, 5, 36,118, 27, 85, 76, 59,
+210, 16, 61,237,108, 14, 34, 56,132, 35, 99, 95,119,138,220,249,105,158,180,119,226,243, 14, 56, 0, 59, 74,193, 52,205, 44, 88,
+ 15,202,121,123,125,100, 44,235, 56, 50,212, 32,149, 82, 68,125,109,105,103,144, 80,141, 16, 3, 34,173, 73, 34,204, 82, 74,227,
+ 24, 97,150, 86,144,210,132,109, 43, 72, 83, 68,201,149, 40,216, 60,146,197,246,140,105, 94, 40, 80, 21,102,185,136,237,226, 80,
+ 74, 59,103, 99,251, 48,123,100,250,196,173, 17, 97,145, 45,250, 0,143,141,171,179,214, 28,138, 31, 5,249,188,204,114,185, 51,
+122, 89, 87,145,211, 36, 98, 54,116, 96, 89, 22,211,195,212, 90,113,185,187, 24, 49, 82,198,238, 94,194,113,104,231, 83,119, 77,
+156,146,173,129, 58,188, 16, 3,139,140,236,247,125,231,248, 61, 90,225, 16,104, 55,189,191, 95, 5,212,164,153, 1,165, 96,189,
+ 92,104,127,237, 44,240, 4, 23,188,109,235, 88,153,114,140,123, 58, 45, 38,182, 82, 60,171, 62, 51,129, 80, 23,101,183,131, 29,
+186, 8,213,156,217,186,148,252, 41,113,216,170, 30, 23, 91,233, 96,155,200, 57,100,145,198,100,205,139, 29,110, 71,222, 87,220,
+223,241,223,243, 65,226,123, 67,128,115,103,132,224,113,186, 58,225,116,154,112,117,181, 32,120,224,179,143,127,193, 9,175, 51,
+177,178,138,238,250,193,162,102, 5, 31,239,128,194, 51, 3, 7, 43,219,176, 57,214,131,178,253, 16, 97,221,221, 33,202,218,217,
+186, 85, 11,201,110,113,172,236,218, 31,160,125, 15,151, 62, 63,151,110, 54, 59, 21,175,194,208,200, 90,244,168, 46, 70, 87,108,
+ 77, 69,235,186, 30, 32,139, 94,254,190, 35,230, 85, 52, 20, 5, 81,113,140, 1,144, 4, 46,130, 61,212,207,217, 27,140,236,166,
+123, 21,221, 51,104,181, 22, 98, 96,152, 64,196, 94,154,133,145,212,218,224,226, 80,228,138, 20, 95,210,153, 2,189,153,186, 79,
+210,238, 66,246,223,205,254,144,232,206,190,228, 16, 3, 69,214,205,254,115,185,191, 96,219, 54, 70, 23, 54,170, 74, 37, 5, 44,
+ 37, 1,102,192, 1, 37,111, 40, 69, 21,236,131,251, 45,214, 53, 73,157,210,142, 81,193, 22,219,186, 90, 69,165, 35, 45,207,116,
+168,214,170,229, 71,171,130,223,133, 96, 73, 66,218,197, 40,138, 81,226, 89,195,131,184,192, 52, 79,246, 80,129,163, 40,171,178,
+ 41, 34,115, 0, 98,242,168, 85,198,234, 82, 40, 72,246,124, 99, 87, 15,227,244,219, 49, 11,117,162,122,231, 80,209,128, 48,225,
+234,205,223,192,243, 23, 27, 0,224,241,147, 19, 62,124,239, 79,176, 93, 46, 68,114, 70, 86,177,206, 44, 74, 33, 70, 57,128, 56,
+ 98,242,220,231, 75, 62,177, 80, 7, 3,161, 36,141, 97, 19, 18,156,211,185, 30, 25,127, 55, 85, 71, 43, 2, 83,243,173, 29, 58,
+ 15, 0,249,156,167, 57,241,215, 97,162, 93, 16,117,176, 42,147,113,112, 56, 40,165,176,228,130,188,175,244,157,179, 42, 15, 51,
+ 73,153,178,214, 9, 41, 1,221,193, 37,125,150, 19,186,115,152,151, 51,124,156, 0,159,240, 55, 63,252, 10, 87,144, 53, 79,111,
+ 29, 19,100,212, 30,146, 36,233,165,232,184,195,231,247, 66,129,212,190,109,120,121,187,138,127, 58, 4,196,224, 49, 77, 30,168,
+ 64,243, 17,219, 94,113,251,234,130,240,248, 10,173, 20,204, 75, 68,221, 11, 10,227, 47,239,239, 87,212,109,131, 43, 59, 28, 3,
+ 54,242, 94,113,119,233,112, 46, 33, 63,121, 12,239, 63,166, 72,168, 25,200, 71, 19,160, 58, 15,230, 82,186, 5,244, 88,222,124,
+ 27,135,150,172, 88,120,232, 49,238,210,124,186,196, 34, 27,144,134, 16, 18, 77,103, 43,181, 32, 52,178,209, 29,200, 50, 8, 20,
+157,241, 98, 8, 17,190,101,238,178, 51, 17,157, 59,166,121,226,158,180,154,176, 54, 80, 15,209, 49, 68, 75,219,150, 49, 47, 44,
+ 96, 41,236, 84,231,139,115,178,203, 85,192, 85, 41,149,128,171,110, 36,175,121,153,133, 55, 80, 42, 82, 8,104,149, 23, 84,140,
+242,115, 27,208, 98, 71,168, 13, 62, 57,219,103, 43, 44,166,247, 97,173,170, 69, 86, 27, 49, 6,158, 37,201, 4,184, 34,158,170,
+204, 47,151, 95,123,154, 23, 44,167, 5,128, 71,222, 43,110, 95,222,153,120,235,254,118,181, 6, 69, 14,108,201, 84, 79,243,108,
+135,184, 94, 64, 34,192, 45,140, 41,173,150, 54,166, 24,217, 16, 34,246,189, 48, 21,210,141, 40, 79, 22,181,189, 87, 22, 4,149,
+127,143,130, 92,118, 22,211,222,236, 84,145, 77,219, 60,207,163,248,161, 24, 43, 19, 12, 20,162, 7,138,164, 69, 11,184,171, 50,
+128,138, 16, 32,222, 19, 50,133,109,150,178, 25, 98, 36, 95,126,168,204,189,174,109, 52,210, 85, 61,242,219,206, 85,179, 56, 58,
+122, 43,104, 85,180, 3,151,251,151, 56,157,175,240,228,233,119,240,228,217, 19,113,227,160,225,246,213,215,184,125,249,181,156,
+ 73,212,122,106,174,251, 3,238, 0,207,148, 35,159,161,217, 52, 87,158, 47,229, 61,116,104, 60,234, 1, 58,115,252,111,149,166,
+181, 81,120, 90, 23,222,241, 64, 9,175, 54,240,222,199,229,174,147, 66,117,102, 29,108, 99, 44, 22, 88,164, 48,173,109, 88,222,
+134, 45, 47,240,159, 5,229, 5,144, 25, 2, 64, 86, 62,173, 99, 74, 19,162,133, 22, 48, 34, 79,125,223,208,108, 87, 50,212,199,
+ 37, 8,187, 76, 90,151, 11,223,194, 9, 52, 8,166,139, 13, 38, 78, 9,189, 57,162, 67,133, 8,164,137,103,145, 4, 28,253, 2,
+212, 26,161,202,123,193,203, 70, 44,103,166, 31,205, 42, 56,147, 16, 21, 57, 12, 47,216,182,221,200, 90, 18, 65, 39,145,172, 33,
+ 6,233,200,171,178,115, 97, 41, 63,154, 76,164,190, 65,209, 7,236,220, 25,171, 85, 6, 28,111, 73,193, 16,252,200,175, 85,116,
+163,115,170,224,142,156,110,116,204, 28, 57,229,156,197, 83,175, 65, 36,164, 42,169, 39, 93, 57,230,242,103, 22,255,126, 97,202,
+155,136,158, 34, 98,242,128, 8,131, 49, 77,193, 60,186,173,117,120, 39,251, 30, 13, 1, 57, 6,236,121, 47, 29,149, 83, 28,170,
+115,184,249,198, 15,112,119, 47,149,251,227,103,215,216, 95,126,136,151, 95,126, 98,235, 15,231, 27, 90, 21,235, 79, 76, 1,173,
+209,219,218,187,196,212,118, 24,109,172, 51, 40, 33,120,143,238, 10, 25,225,146,157,172,127,119,239, 37,215,124, 95, 55,233,254,
+ 56, 38,111,252, 67, 26, 26,152, 47,193,196,110, 37, 16, 8,164, 62,233, 16,163,105, 34, 98,208, 34, 77,116, 13,101,223, 80,246,
+203, 24, 51, 54,118, 67,132,251,128, 2, 42,231,147,236,223,188,106, 28,228, 37,153,150, 5,243,233,140,238, 60,126,250,254, 29,
+246,151, 13,207, 30, 45,232, 81, 8, 79,167,105,225,136, 20,232,251,138, 9, 29, 49,157, 1, 82,216, 82, 12,184, 92, 54,124,244,
+209, 23,114, 33,205,226,115, 14, 78,236, 81,126,185,150, 84,165,151, 47,208,251, 25,219,156, 68, 36,231, 37,170,120, 91, 51, 46,
+235,134, 90, 27, 78, 75,194, 60,121,236, 89,244, 10,107, 14, 88, 91,199,253,158,209, 47, 95, 99,191,100, 56, 55,219, 97,208, 40,
+230, 1, 1, 23,153,185, 4, 58, 45,129, 37, 57, 85, 59,128,164,136,174, 40,133,186, 5, 28,187, 8,189,236, 29, 28, 42,100,195,
+162,232,216,227,206,177,155,165,201, 57, 25,137,235,174,184, 86, 79,103, 73, 61,128, 57, 24,102, 18, 24, 32,210, 59,178, 83, 43,
+151,103,150,116, 51, 86, 68,201,217,198,210, 93, 3, 99,232,230,240, 60, 39,124,169,240,228, 56,236,219,142,121,158,113,190,230,
+161, 22, 38, 99,101, 52, 22,117, 26, 90,210, 65, 70,125,109, 38,138, 82,173,134,185, 81, 14,201,105, 34,204,140,152,151,249,129,
+174, 35, 38,209,153,104,247, 14, 4,220, 60,186,182, 92,247,109,221,144,247, 66,251,223,142, 76,182,123,103,134,131,171,157,133,
+ 78,103,195,226, 40,100, 99,144, 17, 26,188,107,135, 9,145,231,148, 48, 18, 58,195,174,178,201,143,175,151,213,206,169,146,171,
+ 65,132, 58, 21,227, 82,228, 6,198, 7, 59,164, 32,235,148,105, 74, 54, 10, 14,228,224, 75,196,169, 67,174, 21,165,116, 67,191,
+234,186,160,150, 54,232,131,116, 13,181,131,197, 74,109,191,141, 65, 34,186, 34,212, 34, 83,113,170,181,102, 4, 31,228,210, 34,
+150, 91,161, 56,158,223,127,107, 21,121,187, 71,154, 60, 78,231, 25, 29,205, 82,232,238,134, 55,218, 98,215, 53, 64, 75,149,235,
+ 99,216,127,216, 75,179,201, 16,114,167, 34, 96, 7,109,240,120,145,183,118,248,247, 15,226, 54,192, 61,236,214,255,127,254,123,
+ 48, 94,168, 84,111,132,205,244, 35, 23, 6,230,240,209,226, 86,239, 18,135,195,142,221,178,213,253,136,135,117, 64,244,209,214,
+ 76,145,161, 70, 81,129, 15,250, 71,239, 22, 10, 65, 53,117,224, 11,198,206,192, 57,102,102, 55, 65,224,117,102,155,119,227,107,
+123, 56,200,254,105,207, 98,117,241, 32,206,144, 73, 59,158,130, 41,133, 34,216, 62,214, 57,179, 96,169, 63, 47, 4,121,121,196,
+230,225, 44,178,114,223,119,212, 34,138,207,117,221, 41, 82,145,203,113, 91, 43, 98,170, 56,157, 38,230, 82,119, 67, 24,154,199,
+146,120, 68, 29, 25, 5, 67, 90,202, 5,189,173, 82,249, 53,241,117, 13,202, 86, 63,242,239, 11, 46, 23,241, 70,251, 16,112, 62,
+159,208, 93,226, 88,145,135, 5, 53, 2, 58, 74,118,102,219, 2, 63,175, 40,100, 41, 13,198, 49,193,219,225, 18,162, 88,201, 49,
+ 29, 45,112,180, 42,157,151, 23, 82,153,249, 20,157,137,222,208, 29, 90,169,152,111,222, 65, 11, 79,177,173,183, 72,115,194, 18,
+ 55,124,240,215, 63, 20, 85,188,227,195,205,138,175, 22, 81,156, 10,109, 79, 48,144, 37, 87,211, 34,104,101,238,204,238,193,231,
+163,119,212, 61, 91, 70,114,239,192,190, 74, 32,132, 10,141,228,207, 69, 77,193, 33, 22, 85, 84,159, 36,252, 57,135, 24, 39,249,
+ 57,209, 15,157, 1, 45,105,141, 73,124,173,100, 1,199,212,108,187, 81,165,241,193, 7, 19,150, 40,240, 6, 78, 46,119,141,107,
+ 92, 78,139,236,138, 93,192, 23, 95,238,248,240,103,119,120,251,230,132,214, 61, 92, 8, 88,150, 5,240, 30,190,101, 96,223,224,
+ 29, 1, 70,193,195, 39, 57,132,214,187, 11, 62,252,240,115,108,219,142,211,146,240,226,229, 61, 30,159,103,120,116, 76,179, 76,
+ 31, 82,244, 8,139,144,237, 90,105,104,185,224,246,174, 99, 74, 30,175, 94,221,227,229,139,123,204,115,194,180,221,227,244,242,
+107,248,173, 97,131, 71,116, 18,219, 90,187,195,118,159,197,107,110,221,200, 32,191, 73,103,226, 77,136,212, 9,166, 64, 31, 64,
+ 13, 41,194,178,141,192, 91,171,232, 33,201,207, 51,190,128,226,134,221, 16,122,226,184,203, 27,151, 93,140, 30,222, 69,155,148,
+ 72,250,153, 60,243,121, 31,112, 25, 67,208, 18,205, 89,107,166,114,122,128,157,142, 30,123,209,125,200, 69,170,171, 61,121, 79,
+234, 67,218, 37,115,219, 91, 3,166, 89, 14,241, 90,154,117,254,231,171, 9,235,101, 67,245,141,133,120,151,117,130,119, 64,103,
+ 0, 76,230, 94, 56,140,238,249,184,107,118, 94, 10, 4, 65, 82, 7,195,219, 58, 47, 86, 47,177, 87,138,104,238,234,230,108,207,
+219,182,237,216, 46,187, 20, 0,150, 69, 14,196, 41,209,149,227, 41,212,149,232,101,163,234,169, 30, 39,103,122,162, 71, 71, 57,
+ 77, 9, 62,242,249,233, 13,222,119, 97,129, 87,141, 6,222,185,122, 27,116, 49, 17,202, 30, 46, 26,126, 31,186,194,177,241,180,
+233, 43,156, 33,108,149, 72,168, 86,229,135, 20, 62,177, 17,235, 89, 84,235, 1, 84,198,243, 83,253,210,224,121, 94,155,172,196,
+ 96,193, 56, 14, 49, 36,228,146,205,118,172,197,203,128, 77,137,206,227,155,239,188,131,243,245, 25,240,146, 16,231,204,225, 65,
+193, 93, 31,103,114,240,162, 36, 87,144,217,209,201,245,144,243,223, 77, 69,175,227, 20,235,196,109,140,175, 32,171, 99,230,201,
+ 40, 16, 84, 93,255,176, 59,199,255,215,187,110, 81,221,180,240,161, 30, 46,115,111,161, 75, 29, 78, 82, 38,253,136, 53,215, 73,
+167,179, 98, 41, 18,206, 54,138,107,189,232, 85,188, 78,161,156,202,252, 61,189,231,157, 10,237,110, 10, 80,165, 74,153, 48,193,
+ 75,182,172, 19, 92,130,133,135,196,168,251, 49,169, 16, 3, 69,120,150, 80,212,187,141, 13,101, 60, 61, 4, 61,226, 87,100,229,
+198,189,121,140,163, 74,158,231,249, 65,108,159,120, 62,139, 88, 42,216,129,171, 77,140,147, 31, 27,167, 29,125,239,186,119,212,
+ 3,206,211,171, 43,108,225,106,201,107,178,191, 43,244,105, 38,243, 95,118,251,239,129,178, 45,200,146,109,157,197,246,214, 9,
+158, 41,165, 34, 76,114, 64, 53,141,176,180,207, 81, 96, 58,194, 83,239,134, 6,236,112,136,211, 68, 48, 75, 50, 79,187,142,217,
+188, 39,221,141,225, 48,162, 61,232, 20, 77, 56,212, 44,136, 68,193,196, 86,132,233, 26,215,111,253, 0, 95,124,126, 7, 31, 60,
+158, 61, 93,240,203, 31,255, 7,180,186,163,230, 77,136,179, 78,186, 23, 31,162,196,236, 54, 33,209,138,216,110,188, 96, 21,149,
+162,192, 72,189,133, 55, 74,151, 4, 57, 4, 98, 93,251,160, 16,106, 22,125,229, 40,157,251,163, 70, 1, 87,111, 21,241, 52,145,
+155, 47, 54, 40, 77, 36, 82,177, 98,111, 21,123,173,252, 46, 11,214,251, 59,160, 23,234, 12, 38,102,111, 23, 68, 85,207,154,221,
+201, 11, 99,129,227,225,202, 84, 60,239, 3,210,188,192,249,136,203,165,225, 39, 63,122,142,111, 61,185,146,203, 44, 4,248, 57,
+ 1, 81,138, 57,119,217,225, 60,163, 70,231, 51,194,114, 66,222, 51,182,117,199,103, 31,126,130,175,190,190,199, 91,175, 63,194,
+ 60, 69,124,249,229, 75, 60,125,250, 58,208, 59,214,203,110,158,216, 28, 2, 90, 46,112, 37,163,220, 53,204, 83,194,253,101,197,
+ 95,254,205, 7,184,180,142,215,174,174,240,116,142, 8,165, 1,181, 97,158, 49,198, 14,213, 0, 0, 32, 0, 73, 68, 65, 84, 3,
+158,221, 76,120,121,151,113, 1,112,183, 55, 52, 31,109,191, 38,133, 95,183, 3,185,210,113,161,188,238, 78,239,106,107, 35,116,
+ 66, 3,119,244,240,105, 53,195, 35,193, 71,111,160,150, 16,188, 92, 28,117,131, 11, 66,214, 19, 79,249,100, 35,243, 49,246, 31,
+ 10,116, 31, 2,182,117, 69,239,162, 40,223, 55,209,212, 56, 23, 1,106, 32, 58, 71,178,189, 85, 84, 22, 28,219,186, 98,158,103,
+179, 71, 85,218, 96, 51,173, 89, 50, 50,111,198, 30, 7, 65, 56,194, 93,223, 45, 65, 78, 15, 77,157,100,245, 46,161, 58,151,251,
+157,107, 1,127,152, 4, 84,235,200,163,242,211, 1,250,127,189,105, 94, 58, 99,124,231,121,162,162, 61, 97, 90,102,139,144, 13,
+ 49, 97, 57, 45, 88,206,139, 21, 4,121,207, 67, 72,218, 28,246, 77, 52, 19,122,177,164, 41, 89, 64,144,188, 63,206,132, 97,106,
+207, 29, 83, 24, 9, 49, 18,113,160,128, 94,228,172,131,128,144,246,140,222,138, 37, 71,230, 93,120, 27,189, 53, 91,145,198, 24,
+225, 88, 8,169,176, 78, 19,210,122,235, 12,214,114, 36,133,102, 43, 24,123, 29, 9,107,154,100, 40,133, 65,179,174, 60,231,108,
+ 29,126,225,164, 84, 55,216, 50,189, 85, 24, 88, 53, 62,186,179, 46, 94, 16,185, 41, 77, 22, 59,172,237,113, 76,137,130,216, 5,
+111,127,243, 27,248,198,219,111,193,251,136, 87, 47, 94, 81,223,148,113,185,220, 83,124, 7,203, 31, 23, 38,191, 20,222, 48,109,
+ 24,197,162,246,185, 10,149,242,144,157, 50, 38,224, 54,158,199,131, 98, 8,253,193, 79,131,238, 81,234,225, 18, 63,118,247, 15,
+152,241, 15,254,153,195, 1,210,205,179,190,202, 74,208, 15,253,151, 18, 67, 37,117,209,153, 11, 75,213,238,234,150, 2, 57, 4,
+ 66,104, 61,188,195, 62, 32,234,190, 65,253,226,194,174,173, 67, 89,202, 75,168,181,253, 1,135,214, 42, 32, 30, 46, 49,140, 36,
+ 54, 21,113, 85,166, 45,149,194,104, 72, 30, 66, 49, 37,236,140, 13, 85,146,144,247, 50,214,218,182, 34,234,122,118,233,145, 17,
+125, 90,181,106,119, 94,107, 21,116,106,201, 38, 54, 80,213,187,134,118,104, 42,146,247,142, 7,158, 51,149,184,122,208, 59,125,
+127, 58,195, 9,138, 63,228,229, 85, 25,250, 17,117,245,208, 8,185, 64, 29, 35, 35,114,141,117,188, 84, 72, 61, 82,104,142,143,
+145, 35, 64,170,187,167,201, 82,146,188, 37, 20,137,133, 48,250, 52,192, 6, 29,146,145, 78,133,116, 87,246,123,243,198,205,223,
+247,140,152,252, 24, 47,249,145, 77,239,188,195,163, 95,249,109, 60,127,190,162,183,134,155, 39,103, 60,255,240,199,184,127,249,
+229, 1, 59,216, 45,156, 64, 30,248, 96,127,182, 34, 55, 62,133, 57,213, 32, 54,242,107,119,179, 66,193,193,178,145,107, 25, 49,
+160,232, 21,205, 2, 27, 4, 72,212,123, 16, 5, 60,169,131, 49,141,204,238, 64, 28,162, 87,100,111, 87, 15,110, 33, 10,120, 19,
+ 1, 92, 43,182,254, 8, 65, 94, 68, 31, 35,224,130,113, 19, 2, 87, 26, 42,250,172, 21,166,225, 72,203, 9,189, 75,164,240, 15,
+255,252,115,188,123,115,194,213,121, 6,130, 71,117, 78,132, 95, 16, 60,102, 83, 43, 71,136,112,105,194,118, 17, 20,240,139,219,
+ 11,190,120,181, 97, 74, 1,111,191,253, 58, 62,250,240,115, 92, 46, 59,130, 15,216, 46,187,236,243,122, 71, 15, 30, 49, 84,192,
+ 3,209, 59, 4, 15,180, 2,124,242,233, 75,124, 81,238,176,162,224,229,171, 59,252,228,253,207,241,205, 71,239,224, 38,122,184,
+ 30,240,181,243,120,181, 55, 56, 70,248, 46,231,249,193,136,120,120,102,157,140,244,234,248, 62, 5, 28, 51,142, 19, 29, 55,247,
+ 17, 25,192,253, 96,177,189,179, 22,210,138, 29, 5,253,210, 42,166, 83,183,128,216, 20, 7, 45, 81,192, 36,100,148,187, 14,239,
+ 21,222, 36,151, 74, 46,217,158, 13,233, 4, 55,156,206, 87,134,132,149, 14, 48,144, 31, 14, 22,230, 99, 87, 43,131,132, 78, 26,
+100, 98, 23, 40,156,127,245, 76, 59, 78,122,212, 65, 17,163,136,188, 12, 14,227, 37, 85,109,223,171, 37,143,201, 88, 24,199, 83,
+ 29,121,207,184,191,187,136,111,155,160,163,121,158,144,166,153, 76,247,132,171,171,179,113, 50,180, 8,112,222, 35,103,238,178,
+171,126, 38, 14,247,119, 23,118,207,210,212,152, 5,142,144,151,105, 73,216, 46, 2,129,241, 14, 40,117,140,186, 3,211, 4, 67,
+140,130,180,102, 39,143, 38, 23, 86,240,178, 31,150, 96,160,102, 33, 52, 90,200,121,254,153,170, 61, 47,162,205,225,224, 81,220,
+ 70,185, 96,154, 18,246, 61, 91,166,186,196, 11, 23, 91, 77,206,179,124,230,114,222,139,253, 78,254,140,206,252,211, 38,120, 52,
+127,182,118,228, 35,253, 78,153, 9,114, 86, 70, 84,198,163, 46,167,197, 4,198,106,151, 60,159, 31,225,217,107,207,240,248,201,
+ 35,177,199,114,103,191,109, 59, 62,254,232, 99,249,188,124,176,245,176, 67,176, 38, 75,137,149, 96,241,169, 24,101, 5,207,140,
+201, 19,237,233,118,129, 59,155, 48,142,148, 54, 60, 16, 83,247,127, 52,114, 55,213,123, 31,151,126, 59,142,241, 77,248,134, 7,
+ 29,247,131,217, 59,116,237, 66,129,121, 5,130,166, 28,187, 17,254,162, 90, 20, 3,192, 41, 1, 51,138,216,183,213,198, 59,200,
+ 33, 42, 92, 66,247, 30, 33,170, 88, 68, 58, 45,253,162, 68,253,156, 77,180, 81,107,149,164, 44,122,150, 85,205,172,149,181, 50,
+220,139,198,115,122,111, 23,160,218,227,148,211,220, 85, 88, 87, 36,122, 84,196, 61, 30,105,154, 48,205,179, 41, 51,181,163, 45,
+165, 96, 91, 87,238,212,133, 85, 28, 16,237,114,212,194, 71, 95,222, 86, 15, 57,192,135, 46, 91,190,103,170,101, 75,195,190,102,
+194, 53, 34,186,111,198,216,213,240, 10, 73,254,138,168,156, 64,232, 72,103,154, 38, 76,147, 6, 74, 52,250, 74,189, 0, 29, 48,
+ 46, 91, 25,137,118, 19,251,216, 3, 65,136, 72,175, 98,141,211,131, 85,254,236, 90,149,131,121,235,253, 96, 33,226, 24,156, 81,
+179, 62, 36, 50,215,165, 10,124,252,214,111, 98,205, 51,182,203, 61,174,174, 23, 96,255, 18, 47,191,248, 7,132, 56,193,183,138,
+ 82,181,163, 82,236, 43, 67,112, 58,198,248,223,199, 17,214,192, 82,214,199, 64,106, 91, 69,115,213, 18,188,100, 95,214,200,124,
+231, 84,131, 43, 19,112,236, 45,206, 7,173, 93,163, 64,130,186, 40,159,133,160,229, 81,246, 85,114,218,153,175,222,106,182, 98,
+ 65,208,165,139,197,119,182, 46, 54, 37,121,142,101,218,160,171, 1, 64, 10, 77,110,103, 17,227,132,144, 38,234, 55, 28,222,251,
+219,175,240, 43,167, 19,190,241,244, 6,185,119,116,239,249, 82, 22, 76,222,163,247, 29,253, 36,194, 36,132,132,198, 11,246,238,
+238,130,143, 63,250, 28,247,247, 43,190,255,107,239,192,135,128, 79, 62,125, 46,150,201,222,176,174, 25, 30,157, 4,125, 15,135,
+ 0,212,138,187,187,138, 57, 56, 4,191,227,197,151, 47,177,162,160,161,225, 5,118,252, 79,255,254, 61,252,179,111, 63,195, 27,
+ 79,207, 88,150, 25,207,174,100,255,254, 55, 47,118,124,121,183,225,219,239, 46,136,177,218, 1, 62, 84,178,237, 97, 0,132, 90,
+130,208,108,236,168, 29,224,145,188,165, 40,223,222, 10,186, 75, 82, 72,115,135,238, 41, 96,108,173,195, 71, 41, 10, 34,121, 1,
+154,207,160,239,152, 38, 68,137,239,217, 25,234, 57,166,137, 98, 58, 47,234, 92,237,230,168, 95, 57, 90, 50,211,196, 21,128, 27,
+201,128,154,240,168, 80,144, 72, 90,165,104, 44,165,243, 60,157, 38,204,167,201, 50, 3, 6,230, 90, 14,206, 52, 37,203,155, 22,
+190, 5,108,220,157,247,204,110, 93,254, 14,226,231,222,233,203,239,152,167,136, 56, 69,164, 24,145,216,173,159,174, 78, 7,134,
+194, 68, 26,162, 27, 25,229, 45,216,190,243,238,246,222,210,185,146,151,252,137, 72, 96,205,188,204,204,135,168, 98, 15,227,237,
+209, 14,137,104,242,156,143, 11, 93,167,154,133,129, 68, 56,112,197, 91,173,216,182,125,216,137,187,116,124,106,235, 75, 83,160,
+200,212, 25,230,186,214,134,105, 26, 4, 59,160,161, 86,119,112, 33,117,201,181,231,223, 1,132,193,148, 90,237, 51, 61,218,188,
+ 90, 27, 5,201,136,130, 29,249, 15, 58, 98,214,207,204,181, 97, 73,148,231,160, 99, 89, 22, 60,121,242, 24,167, 43,121, 7,124,
+240,184, 92, 86, 4, 15,236,251,142,175,190,248, 18,175, 94,190,176,125,185, 62,215,218,209,194, 34,187, 3,121, 12, 3, 34, 51,
+110, 94,247,160, 75,239,255, 88, 20,231, 48,240,201,135,159,163,255,231,216,229,247,195, 91,213,143, 12,123,224,193,250,239,232,
+149,255, 71, 18,185, 67,103,223,236,223, 86,236,182,166,130,170,157,215,126,117, 54, 86,138, 25, 15, 1,180,198, 82,168, 91,109,
+ 95,234, 80,217,161,169,104,166,213,106,105, 78,106,121,201, 76,240,138,211, 68, 53, 56,247,114, 52,227,203,232,169,161,119,111,
+126,186, 97,145, 51, 15, 9, 15, 34, 57, 44,154,229, 63, 7, 27,141,203,200, 43, 90,197,172, 73, 55, 42,206,216,182,157,135,131,
+216, 74,106,169, 82,229, 80,209, 90,139,160, 89, 5, 67, 57,114,134,115,206,220,229, 74,161, 81, 74, 19,106, 84, 17,127,168,138,
+192,244,129,155,166,153, 47, 85, 49, 37,113,136,105, 8,149, 32, 98,151, 99,180,168, 98, 29, 61, 1,251, 37,139,154, 61,166,136,
+ 64,207,170,118, 59, 80,161, 70,147, 96,151, 78, 91,144, 70,136,246, 94,153, 61,191, 91,102,125,136,254, 48, 18, 18,177, 92,208,
+ 46,142,227,184,235,215,222, 69,155,222,196,203,207, 94, 72,103,147, 50,190,120,255,175, 81, 43,237, 79, 76,156,115, 83,224, 72,
+ 31, 40, 16,164,111, 80, 22, 49, 11,156, 68,246,181,163, 60,183, 55, 17,125,168,157, 74,188,175, 13, 49,200, 88,183,183, 10, 15,
+ 41,194, 90, 45,112,221, 67, 85,113, 21, 35,106,182, 22,185,112,211, 60, 27, 98,178,150,141,113,148, 82, 16,238,219,166,172, 91,
+137,233, 44, 25,141, 7, 65,175, 69, 42,108,118,130, 71, 49,139,116,252,144,233,192, 49,197,138, 94,233,143, 62,218,225,110,129,
+111,126,235, 70, 52, 17,181, 35,206, 18,218,179,255,191,124,189,201,179,101,215,121,229,183,118,123,206,189,239,189,236, 1, 36,
+ 0,162, 33, 1,144,128, 36,146, 18,169,170, 82,201, 97,107, 80,161,145,135,246,196, 99, 15,253,151,217, 30,217, 81,170,112,184,
+ 34, 60,144,100,135, 74, 46,135, 90,146, 2, 8, 18,109, 38,178,125, 47, 95,119,239, 57,103,119, 30,124,205, 62, 55, 1, 22, 71,
+ 32,144,249,218,115,246,254,154,181,126, 43, 21,192, 20, 44,137, 10,159,182, 95, 16, 91, 65,137, 27, 44,112,248,228,147,175,176,
+219,207, 56,222, 14, 56, 30, 35, 46, 79, 47,241,229,151,143,177,241, 6,184, 56,199, 50,140,112,155,141, 90, 85,114, 74, 64,153,
+225,246,231,216, 47, 51,242,156,241,151,255,207,111, 49,131,158, 69, 15,131,255,156, 95,224,111,127,245, 24,255,245,207,222,193,
+208, 50,154,113,248,224,181, 35,140, 22,248,139,223,204,152,103, 17, 62,210,170,164,212,198, 59,191,214,211, 18,219, 74,228, 37,
+ 93,133,238, 16, 87,225,124, 13, 43,148,111, 69, 69, 2, 16, 84,172, 90, 43,219, 5,107, 33, 32,140, 78, 8, 42,239, 43, 41, 79,
+ 64, 68,173, 57, 51,101,146,189,214,116, 16, 97,165, 95, 1,114, 77, 8, 54,178,254,162,103,116,151,156,212,101,209,216,219, 43,
+123,231, 34,121,246, 92, 85,167,196,130,201, 24,225, 74,101,183, 73,207,118, 23, 10, 92, 45, 13,195, 16,217,197, 65, 33, 72,203,
+156,216, 81,209,214, 33,133,186, 31, 45,156, 11, 81, 56, 69,207,249,192, 34,185,136, 24, 35,177,222, 3, 21,190,195,102,212,212,
+ 63,217,255, 75,184, 77, 75,133, 11,126,172,172,147, 22,199,199, 35, 31,214,100, 13,150,100, 76, 84, 94, 49, 53,234,164,235, 92,
+116,247, 45, 65, 78,114,118,241,124, 81,183,191, 68,238,204,216,237,246,188, 34,115,204,151, 16,112, 10,219,146, 89, 51,100, 87,
+103,175, 82,206, 90, 31,217,183,131,200,209,170,107,133, 82, 8,221, 93, 91,183, 38,210, 61,209, 3,167,196, 33,208,217,232,130,
+131,229,209, 63,131,137,100, 2,228,131,215,206, 50,198,128, 27, 55, 78,176, 61, 58,194,246,104, 75,105,139,173, 97,158, 22,238,
+210, 27, 46, 47, 46,241,228,241, 55, 90,116,148,146,168,249,224,166, 80,158, 69,180,134, 92, 22,110,160,202, 33,160,109, 29, 4,
+246,242,229,252, 82,103, 78,223,230, 33,112, 6,223,218,173,119,191,122,123,249,131, 98,253,121,215,139,117, 28, 92,238,235,120,
+227, 67,191,186,164,140,242,212,156, 27, 45, 90, 79, 67, 51,225,101,207,174,105,136,181,194, 91,233,142, 18, 11, 24,188, 65,206,
+ 43, 53,188, 16, 42, 26, 14,133, 54,165, 40, 25,167,213,194, 51,126,142, 91, 69,183, 49, 72,245,152,185, 0,168, 60, 26, 50,134,
+ 98, 92, 75, 33, 80,138,105,125,111, 67, 68,163, 64,234,210, 49,194, 26, 82,180,231,210,224,189,101,134, 55,239,211,121,103,110,
+120,119, 38, 76,107,233,204,187,255,153, 20,166, 78,118,118,150,252, 11, 42,208,107, 56,136,128, 21, 16, 5, 17,167, 60, 33, 38,
+ 1, 5, 68, 16, 16,197, 34,114,197, 78, 33, 43, 94,125,150,134,169, 97,116,211, 85, 22,173, 17, 68, 67,184,205, 62,120, 58,240,
+ 27,119,232, 96, 97,156,115,188,107,151,248,213, 2,235,131,130, 52,100, 63, 74, 17,175, 77, 47, 49,170, 96, 13,134,227,187,216,
+220,125, 15,207,158, 92,194, 89,139,147,147,136,139,135,255,132,101,158, 20,151,235, 25, 49, 88, 42,253, 29, 99, 45,252, 16,217,
+ 75,107, 20, 26,195,165, 63,199,197,130, 59,113,168,189, 8, 85,190,246, 78,118,170, 92, 33,211,104,210,113,246,121,229, 93,101,
+ 31, 97, 81,209,206,202,120,211, 15, 10,226, 10,164, 21,114,215, 41,227, 93,198,192,242,220,146, 87, 62,107,144,140,140,239,181,
+ 50,150,209,159,115, 24, 54, 91,184, 16,113,122, 58,227,203, 47, 39,252,240,213,155, 40, 48, 24,189, 69,220,120,216,224, 48, 47,
+ 25,155, 49, 96, 89, 10, 2,135,201, 68,103, 16, 76,131,157,175,241,197,211, 61,174,175, 39,212, 82,113,255,149,219,152,150,130,
+ 39,143,207,112,118,126,141,237,205, 17,118,190, 6,120,133, 83, 76, 67,219, 37,216,235, 51,212,121,135, 92, 50,174,246, 9,127,
+249,143, 15,241,127, 77, 79, 0, 0,127,234,239, 98, 87, 27, 62,171,123,252,135,127,124,128, 31,189,115, 23, 71, 71, 35,230,185,
+162, 26,131, 59,219,128, 63,127,251, 6,254,230,209, 21, 30,214,140, 87,238, 57, 24, 75, 94,118,249,121,172, 61,174,235,147,201,
+172,196,175,221, 70,211, 14, 60,230,141, 65,228,181,102,152,210,148, 90, 88,106,134,107, 65, 59,141,200,161, 37, 26, 96,196, 5,
+132,119,142, 16,207, 76,157, 75, 60, 34,244, 33,178, 56,175,160, 53,193, 24, 19,103, 60,132,168,235, 20,177, 22, 89,158,208, 9,
+ 68, 69,198,240,116,214, 0, 33, 90,165, 63,162, 25,248, 24,148,145, 77, 59,121,199, 74,236,166,171, 50,235, 28,156, 23,218, 24,
+ 93,118,180, 10,172, 88,150,196,180,201,218,215, 15,134, 26, 4, 73, 91,243,129, 4,114,227,118,163, 30,117, 51,176, 15,223, 91,
+108, 70,162, 0,230, 92,123,246,129,165, 2, 98,158, 72,200, 43,174, 14, 24,139, 48, 56,246, 48, 23, 21,234,201, 37,149, 83, 34,
+ 59, 48,107,109,176,162,226,181, 10,254,254,200,170,152,150, 2,152,134,105, 90,180,217,138,172,195,161,233,106,101,103,130, 67,
+ 45,141,155, 34,116,107,241,138,240, 38, 2,219, 36,145,176,171,169, 14, 89, 52,121, 21,130,166,162, 85, 18,255, 73, 28,179,211,
+209, 59,173, 97,253,129, 64, 77,254,190,172, 43,214, 4,187,237,118,131,147,147, 19, 28,159, 28, 35,142, 17, 67,140,156,250,151,
+121,199,111,144,151,140,103, 79,158,224,252,197, 41,173, 84,188,103, 52, 50, 61,203,146,184, 39, 54,215, 90,179, 94,221, 70, 7,
+ 88, 29, 48, 99,190,181, 31, 63,220,153,191,172, 96, 55, 42,156,123,233,207,190, 52,130, 95,239,213,213,131,254,210,104,236,192,
+201,246, 82,215, 46,227,121,114,186, 91, 46, 84,140,226, 98, 53, 41,142,139,120,107, 45,114, 73, 42, 40, 47,133,215,189,104,240,
+ 70, 46, 66,235, 80, 82, 66, 3, 85, 79, 61,210, 77,148,128, 22, 46, 68, 14,162,175,250, 75,164,203, 90, 22, 20, 78,155, 79,201,
+112,150, 7, 86,162, 18,141,236, 2, 77,213,144,122,169, 92, 5,251, 71,223,135, 83, 81,137, 2,110,106,195,245,126,198,238,122,
+162, 10, 54, 23,189,204, 83, 74,234,233, 36,152,139, 91, 97, 31,173, 86,158,132, 80,133,174, 8,200,203, 9, 13,110, 80,129,155,
+235,163,167, 86, 42,226, 48,240,152,107, 62, 72,108, 11, 49,114,236, 33,253,160,135, 72,170,226, 24, 3, 77, 58,106, 57,124,177,
+106, 67, 42, 11,237,195,231,121,245,184,241, 8,210, 81,188, 45,117,248,236, 45, 54, 44,232, 22,197, 57,143, 63,229,251,107, 45,
+243,126,168, 34,140, 71, 56,185,255, 17,158, 62,190, 68, 90, 18,110,222,222, 34,159,255, 6,251,171, 51, 18, 97,112, 32, 11, 93,
+116,158,158, 23,227, 57, 14, 52,114, 97,212,180, 80, 17,106,149, 28, 16,214, 25, 52,203,145,157, 6,128, 64, 78,196, 35, 90, 13,
+143,247,196, 38,222, 69, 43,165, 54,212,156, 16,152, 91, 76,249,176,164,171, 40, 44, 66, 44,181, 41, 76, 70, 60,211,164,187,224,
+ 30,165, 9,137,140, 5, 47,205,232, 62, 74,198,134,228,249, 4,167,180, 21,248, 16, 21,241,154, 82,195, 47, 63,222, 97,123,116,
+130,179, 57, 3,209,163, 6, 96,219, 26,236,146,225, 0,148,148,129, 37,193, 91,139,205,134, 20,202,121, 94,240,240,217, 37,126,
+253,217,115, 76,211,130,215,238, 28,227,230,201, 6,203, 82,241,245,131, 39,152,150, 5, 71, 55, 94, 65,185,113, 15,126, 28,144,
+ 51, 61, 87,241,226, 25,236,114,133,101,169,120,118,182,195, 95,252,250, 11,124,130,107,220,192,128, 31,187, 27,248,111,255,248,
+ 7,120,126, 57,227,127,249,197,231,248,228,242, 10,159, 61,186,196,107,119,233,197,245, 28,136,116,103,180,248,239,126,120,130,
+255,240,201, 57, 30,213,140,215,238, 17,245,144,200, 88,157, 39,109,180,136,105,186,175, 38,155,223,225,129,180,102,123, 41, 18,
+182,102, 84, 99, 96, 87, 25,209, 36, 36, 53,157, 78,104, 45,123,145,171,170,239,141, 21,122,159, 57,176,187, 97, 21,197, 12, 14,
+135,129,231,203,218,210, 84,174,228,132,121,182,138, 57, 14,108, 7, 5,143,230,117,181,192,171,149,186,178,165, 58,158,136, 45,
+115, 66,240,192, 50, 39, 12, 35, 21,211,203,146, 48,110, 28, 79,209, 40,199, 28,236, 54,161,131,170, 34, 14,129, 71,255, 30,243,
+180,104,182,182,243, 52,153,242,129,232,149,199, 39, 71,196, 37,143, 97, 5, 59,129,146, 40,133,163, 81, 74,197,156,102, 26,131,
+243,249,145,109,134,133,101,134,123, 85, 2,103, 45, 21, 37,149, 21,123,157,120, 3,100,143,131,170,187,133,184, 38,171,182,131,
+ 36,177,146,117,138, 39,129, 43,210,205, 16, 47,222,161,228,138, 56,196, 46, 2,171, 5,165,242, 26,179, 18,163,191,228,194, 59,
+117,114, 31, 8,155, 96, 78,137,195, 94, 90, 79,119,171, 64,225,253, 47,229,125,116,123,101,159, 2, 53,253,253,135,224, 84,141,
+ 47, 41,140,149,167, 48,183,110,222,194,173,219, 55, 89,183, 48, 32, 68,113, 29,205,204,152,207,152,246, 9,167,207,158,225,242,
+242, 5,113, 46, 76, 83, 54, 67,169, 69,167, 17,228,242, 40,189, 99,127,233, 25,111,171,125,118,107,223,186, 87,187, 72,121,213,
+173, 31,248,208,191,221,220,119, 11, 49,214, 23,122, 59,216,189, 31, 20, 22,191,163, 75, 63,252,184,135,125,187,164,221,209,231,
+145, 41, 7,175, 74, 42,241,223, 69,139, 64, 95, 51, 11,214, 75,150, 40,207, 0, 15, 3,235, 29, 7, 3,244,246, 31,134, 0, 14,
+105, 89,244, 50,168, 92, 21,211, 24,138,170, 79,235,186, 32, 73,178,129, 37, 63, 87,126,177,146,138, 99,157,165, 16,121,126,136,
+164,227,144,125, 92, 12, 1,113,232,254, 80,181, 48,176,141, 35,229,172, 65, 42,173,210, 56,157, 94,120, 22,196,201,174,138,211,
+207,114,206, 60, 54, 46, 60,113,160,138,136, 46, 51,199,193, 8,149,129, 26,116, 48, 56,141,221,235, 49,160, 20,112,144, 16,130,
+ 87, 86,177,143, 1,227, 16,153,215,139,213,126,143,195, 66,100, 55,197,156,103,199, 93,183,116,167,142, 69, 59, 50, 49,200, 44,
+234,179,140, 88,148,152,190,102,235,161,151, 82,190, 63,129,134,248, 1,119,222,250, 49, 78, 95, 36, 44, 75, 66, 28, 2,230,243,
+175,113,241,232, 11,237,230, 13,219,113,106, 17,254, 48, 19,183,184,232,114,222,195,182, 70, 99,124,231,153, 18,232,120,252, 13,
+ 24,166, 67, 97, 85, 49, 90, 70,129, 90,231,209, 80, 84,163,225, 66,100,232, 12,125,173,235,173, 82,109, 0, 88,161, 47,170, 86,
+ 41, 4,105,228, 71, 95,107, 97,104,134,234, 12, 44,115,161, 11, 9,237, 12, 35, 18,201,235,159, 21,164,210,120,125,226,124,192,
+230,228, 6, 98, 28, 96,156,199, 47,255,229, 2,113,188,129,241,100,139, 90,102,156, 78, 21, 87,203,140,109,116,112,181, 98,176,
+192,224, 45,198,232, 96, 98, 68, 25, 55,200, 41, 99, 87, 2,126,241,229, 87, 56, 59,189,132, 1,240,238, 31,190,143, 33, 4, 44,
+211, 14,223, 60, 62,131, 65,195, 59,111,191, 6, 27, 7, 94,113, 84,180,221, 21,112,117,137,150, 51, 30, 60,185,196,255,241,245,
+215,120,138,132,239,225, 8,255,238,205, 55,113,239,198, 6,173, 1, 55,183, 3,238,251, 1, 95,229, 9,191,122,240, 2,112, 30,
+ 49,120, 68,103,209, 92, 0,150, 9, 49,101,252,209,107, 35,254,207,211, 29, 99,150,237,225, 8,181,245,220,115,193,118,182, 90,
+ 86,243,246,195, 99,164, 27,120,250,134,182,150,133,132,141, 32,158, 2, 37, 46,123,253, 61,155,213, 32, 64, 66,121,132, 87,144,
+114, 81,245,181, 81, 47,173,103, 20,178, 3, 76, 85, 97, 83, 85,119, 73, 97,222,192,162,232, 85, 48, 62,182,178, 95, 87,194,171,
+ 26, 26,156,233, 99, 74,154,186, 25,108,182, 27, 94, 73, 81,177, 1, 22, 93,166, 37,233,187, 76,108,244,181,245, 74, 20,242, 94,
+167, 3, 21, 21,209, 70,181,144,141,155, 72, 32, 28,107, 59,113,141,133,186,141,167, 21, 46, 16, 98,117,222, 39,157, 0,164, 57,
+169,152, 81, 68,194,198, 0,227, 54, 34, 47,153,254, 28, 91,105,133,195,111,189,135,231, 29,170, 88,179,150,148,117, 90, 42,186,
+ 25,234,220,105,170,210, 84, 36, 9,134, 66, 53,190,132, 25,216, 99, 13, 76, 48,202,157, 23, 43, 94,173, 5, 11,235,144, 42, 59,
+ 1, 68, 72, 76, 0,175,204, 19,141,172, 14, 20,199, 54,101, 82,153,187, 21,181,173, 29,228, 12,120, 47, 52,209,170, 58, 7,153,
+ 24,120, 78,201,220,110,143,176,217,142, 56,185,113, 76, 83, 77,239, 84,192, 58,237, 39, 45,104,246,187, 61,158, 62,126,140,121,
+222, 51,173,142,238,146,222, 21,247, 92,115, 1,206,200, 74,101, 93,196,154,131, 43,252,219, 79,125, 95,183,115, 71,254,173, 33,
+250,234, 13,105, 43, 23,216,119,205,241, 33,231, 28,193,157, 76,251,150, 0,254,176,160,126,249,159, 87, 19,250,134,254,185,136,
+155,105,117,106, 32,162,214,218, 10, 28, 11,189,169,177,161,194,201, 67, 21,208,134, 15, 85, 6, 60, 48,165,136, 8, 14, 92, 29,
+251,128, 82, 37,237,140, 98, 10, 43,239, 72,105, 44,148, 16,199,141,238,190, 41,133,173,104, 2, 13,169,189, 41, 96,161,180,140,
+ 16, 7,222,161,247, 17,161,144,204,198,205, 72,187,242,194, 84, 29, 75, 15,236, 60,205,152,246, 51, 67, 77, 44,230, 57,227,232,
+104, 64, 75,132, 1,116,204,117,151, 23, 97,220, 12, 10,247,151,159,162,101, 97,135, 53,116, 32, 46,169,118,107, 0,103,176,139,
+200,164, 72,116, 35, 87, 98, 5, 29, 28, 99, 88,140, 67,121,235,128,183,142, 58,118,241,109,215, 10,195, 63, 71,203, 59,184, 6,
+192,106,158,110,239,114,101,124, 60,207, 73,211,118,168,170,182,170,100,165, 29,117,225,167,144, 60,189, 68,252, 34,193,223,173,
+215, 63,196,197,149,193,213,197, 53,140,179,216,248, 29,158,125,253, 27,194,198,242,239,131,239, 0, 14, 93,225, 81, 42,172,134,
+237,200,122,164,153, 74, 49,161,141, 14,230,214,152, 4,199,211, 6,107, 72, 73, 43,191, 63,195,182, 50, 58, 0, 28, 80, 45, 11,
+ 31, 29,114,170, 40, 53, 3,181,194,135,129, 1, 51,244,240, 22, 22, 14, 10,128,199,112, 36, 43,173,117, 58,101,169, 50,236,133,
+126,111,196, 77, 64,163, 0,158, 16,163, 70, 76, 58,197, 3,211,250, 99,123,116,131,105, 75,192,195,111,246,184,220,121, 28,223,
+220, 32, 12, 30,117,105,168,105,198,229, 62,225,217,179, 43,132, 96,177, 29, 60,110, 29, 69,140, 48, 20,199,105, 2,246,185,226,
+175,254,211,199,248,242,193, 51,204,211,130,127,245,147,247,240,234, 43,183, 80,114,193,139,211,115,188,184,222,161,181,138,237,
+232, 17,189, 65,202,172, 62,190,190,196,110,183,224,227, 47,159,227,255,190,120,138, 2,139, 15,112, 3,127,246,222, 27,120,227,
+206, 49, 21, 39,148, 96,131,239,191,122, 11, 15, 30, 62,193,131,211, 61,222,121,189, 98,202, 84, 56, 14,150,208,179,187, 84,113,
+ 52, 58,196,214, 71,114,140,141, 65,213,248,235,151, 46,116, 57,170,204,170,250,111,223,181,211,235, 61, 2,165,220, 69,142,186,
+ 13,218,213, 73, 34,154, 18, 22, 43,239,245,217,197,176,238, 46, 26,147,216, 90, 35,130, 36, 88,189,108, 28, 86,127,159,253,207,
+185, 32, 91,194,143, 6, 88,216,232,180, 83,111,149,221, 53,168,122,240,235, 37,210,122,128,133,172, 12,140, 17,123, 45, 65, 82,
+ 54, 71, 86, 5,119, 20, 31,219, 79, 77,183,202, 66,246,206, 33, 55,192, 71,143, 24,105,143,238, 3,105, 12, 44,251, 99, 41,120,
+ 38,235,231, 83, 14,133,248,137, 89, 61, 47,226, 85,199,226, 47,141,178, 93,157,113,198, 2,105,159,244,223, 53,238,196, 50, 79,
+180,114,106, 76,179,243,172, 3,202,218, 73,146,199, 31, 42,112,155, 38,182,176,214,138,121,201, 4, 64,226,189,245, 60, 37,141,
+144, 94,230,164,231, 82,173, 89,189,254,133, 5,167, 37,151,149,234,189,162,228, 74,216,106,239,213, 6, 40,194, 67,121, 15,251,
+244,211,112, 28, 47,212,245,195, 81, 23,240,158,154,159,227,147, 35,118, 16,144, 77,153, 46,121,175,176,179,221,245, 30, 97, 32,
+109,212,233,243,231,184,188,184, 80,126,125, 79, 57, 19,120, 77, 82,219,180, 42,218, 87, 93,120,143, 67, 48,135, 93,187,162, 97,
+ 15,247,233, 7,227,243,223,101, 83,107, 56, 8, 87,249,157,183,243, 1,127,238,165,105, 88, 51,122, 13,225,191, 52, 53,195, 97,
+ 28,172, 88,135, 9, 9, 44, 43,102,190,228, 91, 81,174,126,229,169,156,111,124,168, 36, 81,169, 27,242,192, 26,217,135,218,198,
+176,127,182, 8, 48,129, 13,165, 87,172,100,132, 3, 71, 65,102,238,170, 86,223, 32,251,238,106,235,158, 97, 25,203,234, 72,139,
+ 31,184,192,187, 50,178,131, 17, 22, 85, 20,183, 57,103,194,194, 78, 51, 18, 87,150,227, 16,232,194, 67, 39,253,132, 16,104,170,
+192,121,235,195, 16, 96, 89, 36, 39,156,122,185,116, 75,173,172, 82,119,152,167, 5,195, 16,104,159, 29,131, 62, 72, 98,241, 19,
+101, 45,161, 64, 29,188, 15, 36,178,178, 22,195, 24, 86, 73, 87, 44,188, 81,223,107,103,251,170,168,193,209, 8,185, 11, 28,154,
+142,144,151,121,225, 67, 27,252,249, 69,225,222, 93, 10,193,211, 47,125,225,151,250,238,247, 62, 68,182, 55,113,126,118,142, 6,
+131,147, 77,195,243, 47,255,153, 46,221, 70,137, 73,178,111,174,156,190,229, 88,184,104,173,135,113,134,139, 3, 42, 18, 68,169,
+ 91,153,149, 94,101,247,183, 42,114,172,117,168,121, 33, 15,123, 74,176, 94, 44,101, 22,198, 81, 34, 12, 41,214, 1, 3,170,200,
+193,144,147, 42,221,159,161, 98, 72,148,158,180, 35,228,128, 27, 78, 85, 36,245, 45, 9,102,228,235, 18, 7, 3, 21, 68,232,145,
+184,186, 79,182,216, 28,111, 81, 17,240,213,215, 51,158, 60,111,168, 38,224,214,221, 91,202,253, 47,176,216,103,135,154,102,186,
+ 32,172,197, 30, 30, 87,167,123,184, 97,131,227,101,194, 24, 22,252,253,223,255, 26, 95,126,253, 20,203,146,112,180,137,248,224,
+189,215,176, 29, 12,166, 90,241,235, 79, 31,224, 58,237,113,228, 34,142,182,131, 38, 90,153,180, 67,154,174,241, 15,191,125,134,
+191,219,157,163,193,227, 30, 34,254,252,195,183,113,188,137, 58,214, 35, 26, 31, 48, 6,135,130,138, 71,151, 19,174,246, 25, 67,
+160,164,172,106, 12, 96, 27, 82, 51,192,237,155, 24,158, 36,228, 60,171, 23,216, 40,229, 13,170,116,151, 14,230,119, 15,250,240,
+157,255, 78, 68,173,206,121,182, 46,246,212,171,146,147,146,249,122, 26, 92,211, 76, 0, 81, 30,135, 16, 40,122,215,246,156, 6,
+ 43,197,100,171,136,113, 64,173,164,149, 0,231,150,215, 70,209,184,228,147, 14, 48,206, 96,158, 22,222, 71,147, 56, 48,179,165,
+139,166, 76, 93, 43,225,216,237, 32, 19, 52, 41,158, 97, 12,166,253,130,205,118, 64, 28, 34,237,163,115, 34,251,101, 32,100,172,
+ 97, 65,104,136, 20,242, 19, 35,117,222,113,136,140,132,117,122, 46, 73,115, 98,120,197,211, 69,144, 44, 86,187,222,227,250,114,
+199,157, 61,137, 89,151,153, 59,113,206, 59, 39,190,125, 86,151,129, 15, 14,211,190,192, 88, 10,176,114,158, 67, 93, 50,119,214,
+158,180, 55,134,119,199, 18,179, 74,235,127,171,221,186, 0,134, 98,244,152,103, 74,117, 52, 86, 10, 39,168,250, 59, 51,252, 41,
+165,110, 79, 22,171,156,184, 24,150,148, 97,173, 71,136, 13,134, 73,154,149, 39, 33,148,150, 39,144, 32,240, 36,102,125, 30, 64,
+159,143,113, 28, 49,142, 35,142,142, 55,170, 59,178,124,214,209,154,133,206,255,101,102,182,189,119,184,186,184,198,249,139, 51,
+ 76,211, 68,241,162, 14, 74,196, 76, 75,103,206,147, 78,163,232,106,182, 29,236,164, 87, 23,188,161,200,111,172,152, 37,125,252,
+190,222,149,155,213, 71, 89,101,130,172,222,145,111,221,239, 47,253,139,223,245,150,201, 68,195, 28,220,230,173,143, 21, 86,187,
+118, 25,168,153,245,148,193,116,228,183, 20,238,118,149,240, 38,122, 13, 35, 56, 94, 99,225, 11, 11, 23,168,155,236,170, 75,197,
+ 37, 26, 67, 23, 59,231, 53, 75, 71, 41, 20, 40, 18,126, 84,205,115,238,251, 77,199,188,112, 7,227,208,201, 67, 42,216, 96, 49,
+149,113,170,160,108,172,112,221, 28,145,186,158,130, 26, 76, 23,102,148,130, 92, 50,251, 20, 13,103, 12,103,237,142, 73, 85,221,
+ 35, 9,205,234, 97, 92,199, 82,106,170, 80,165,151, 33,241,184, 91, 66, 12,228,107,145,236,109,241, 63, 82,113,227,244, 1,245,
+158, 3, 86,152,118, 71, 35,118,195,161, 43,100,223,106,154,219, 78, 85,175, 60,164, 36, 76,164, 23,209, 24,131,121, 74,212,197,
+191, 84,198,169,135,221, 16, 1, 79,136, 75, 64,215, 44,188,242,246, 15, 97,198, 87,241,228,225, 25, 74,109, 56, 62,242, 56,251,
+250, 31,137, 5,189,122,200, 29, 87,199,228,253, 52,170, 33,128, 97, 1, 32,119,183, 20,191,104,120,148,103,122, 55,100, 44, 2,
+ 31,106,132, 18,134,170,251, 91,237,224,100,139,213, 37, 35, 30, 17, 67, 66, 69, 63, 68, 88,239,225,196,118,102,232,149, 34,102,
+127, 90,141,245, 29, 76, 96,204, 45,168,176,148,177,187, 80,161, 66,116,200,252,205, 73,162, 88,173, 64, 28, 7,148,226,240,224,
+137,195,249,121,197,107,183,182,248,209,251,119,113,113, 57,227,122,191,192, 56,143,121, 63, 99, 73,133,246,254,113,128,143, 1,
+197, 56,236, 83, 65,105, 1,117, 95,112,122,121,129,199, 95,127,131, 71,143,158,177, 2,184,224,199, 63,125, 15,119,238,220, 4,
+202,140, 80, 23, 60,126,250, 2, 0,240,222,155,175,226,248,100,139, 60,147,120, 51,149,140,191,250,229, 35,124, 60, 95, 97, 68,
+164,248, 92, 0,159, 62,190,192, 71,111,221,213,238,214, 57,135, 92,155, 30,208,251, 82,176,155,137,234, 85, 1,156, 28, 69, 56,
+111, 96,110,222,129,187,113, 19, 75,126, 66, 69,166,103,234,151,161,103, 70, 10,110, 81, 51,155,245,152,177, 29,142,255,100,123,
+215, 86,167,138,179, 78, 29, 6, 70, 15,105,171,204,110, 82,190, 55, 52,219,122,208, 18,119,236, 96,177, 85,173,164,252,166, 67,
+ 39,175,214, 1, 92,102, 25,203, 23, 10,217, 72, 5, 82,100, 86,212,175,204,202,113,177, 91,225, 37,239,111,173,149,105,135,162,
+205, 17,228,109, 23, 26,145,221,209, 97,220, 68, 22,198,210,225, 71,157,102, 97,209,158, 20, 36,149, 63,159, 71,140, 17, 71,199,
+ 27,250,218,120, 10, 86, 11, 93,250, 57, 87,237,242, 67, 12,216,108, 73,205,190,223, 77,216, 95,239, 49,237,233, 93,243,174, 71,
+127,202, 4, 83,246,160,242,253,214, 90,225,163,195,245,229, 30,195, 38,162,148,130, 16,105, 7,158,248,156, 36, 49, 45,137,210,
+214,129, 56,222,123,204, 11,171,187,249,207, 78,251, 69,253,241, 68,175,164,201,158,116,167, 66,133, 43, 53,163, 21,233,196, 23,
+213, 44,244,115,145,216,225, 2,157, 17, 66, 89, 8, 94, 53, 1, 34, 94,164, 41, 95,215, 56, 80, 65,232,177,217,140, 56, 58,218,
+ 34, 68,102,140, 4,207, 25,239,212,232,133, 64,190,248,148, 18, 34,243,244,175,175,119,184,186,188,196,180,223,233,196,173,159,
+ 89, 30, 57,207,204,119, 79, 76,177, 75,171, 84,181,151, 54, 76, 56,188, 59, 37,136,101,253,191,158, 26,183, 22,139,126,123,220,
+254,187,202,223,239,222,135,127,199,158,126,213,181, 31, 4, 32,173,147,225,214,119,189,249,246,162,224, 32,203, 67, 92,105,181,
+ 80,230,130,145, 59,184,168,205,173, 25, 11,111,172,120, 45, 3, 67, 58, 50, 17,195,248, 43,145,232, 60,162, 8,209, 24, 76, 0,
+ 46,162,175,165,145, 58,135,193, 88,176,221,134, 9,101,188,199,165, 92,227,194, 47, 28,195, 83,162, 83,188, 97, 67,211,234,216,
+128, 95,122, 57,176,141, 65,105, 21,211,126,210,189, 75,211,172,231, 78,135,163, 95, 44, 29,148,203,146,245,176, 32,177, 72,233,
+172,226, 34, 89,203, 86, 9, 72, 41,101,165, 63,153, 85,198, 52, 9,218, 50,195, 99, 68,237, 25, 56,142, 17, 42,230, 43, 26, 30,
+208, 52,125,135,192, 42, 20,142, 16, 98,212,138,173,213, 30,185, 42,251, 65, 9, 39,167, 81, 51, 91,202,248,215,154,211,130, 56,
+ 4, 45,138,136,249, 78, 33, 13,119,223,254, 16,241,198, 91,120,244,224,140,162, 42,183, 30,215, 79,127,137,253,213, 11, 22, 37,
+209,215, 77,159,159, 60,195,196,175, 14,188, 94,168, 12,158, 16, 32,135,131,229, 92,119, 74,186,227, 74, 87,189,152, 70,199,145,
+149, 41,110,211,190, 71, 76, 54, 82, 29,146,178, 89,115,177,169,170, 28, 54, 27,250,222,216,133,208,106,134,113,150, 87, 1,101,
+149, 23,110, 25, 85, 89, 0,227,212,226, 97,228,239, 88, 18,225, 21,222,215,151, 68, 89,210,198,123, 88, 31,241,236,204,225,209,
+115,143,187,247,238,224, 15,126,239, 46,134,253, 57,114,153, 81, 48,163,185,134, 93,154, 81,150,190,171,183,198, 98, 94, 72, 56,
+ 84, 27, 80,115,193, 60,103,156,191,184,192,151, 95, 61, 82,190,193,107,119,111,227,245, 55, 94,197,213,110,198,232, 45, 78,175,
+ 10,206,118, 19,172,177,120,227,245,219, 56, 62, 25,145, 56, 9, 16,103, 19,126,250,131,215,240,226,147,138, 93,109, 40,172,245,
+248,213,139,107, 52, 99,240,147,119,238,194,178, 21,175, 54,131,108, 44, 70, 19, 81,140, 69,174,192,156, 10,106,107,136,131, 67,
+ 24, 35,204,230, 8,205, 24,236,231, 25,104,221, 94,217,106, 93, 49,166,153,129,112,224,100,238, 2,166, 67,181,111,223,135, 58,
+ 31,213, 46,103,120, 21, 36, 23, 57,106, 69,230, 81, 48,133, 95,116,216, 82,206,101, 69,121, 44,202,232,135,224,144, 25,194, 98,
+100,239,103, 29, 44, 43,174,165, 88,173,105, 33, 1, 94, 4,246,187, 29,142, 79,110,144, 31, 90,116, 37,206,160,176,134,133, 46,
+228,200,103,142,101, 62, 2,117,136, 52,213, 3,150,133, 46, 97, 82, 16, 55,245,195,103, 14,156, 10,145,222,103,217,147,251,192,
+162,174, 24,177, 57, 26,201,109, 35, 42,127, 71, 78, 3,195, 96, 44,137, 78, 13, 49, 96,158,200, 78,187,187,158, 48,239,103,182,
+225, 6,126, 86, 12, 7, 97,145, 95, 92,166,140,162, 30,111,141,208,203, 20, 94, 85,212,138,151, 27,133, 62, 53, 85,233, 23,166,
+225,137,154, 93,210,108, 73, 3, 48,207, 11,143,197, 61,188,184,147,184,137,105, 44, 24, 37, 91, 31, 9,110,197, 93,146,217,162,
+ 38,147, 8, 82,163, 51,218, 57, 17, 19, 67, 69,138,166,175, 76, 26, 55, 67, 18,236, 69,105,149, 1,227, 56, 32,132,136,237,209,
+ 8, 3,112,248,141, 85, 77,209,250,172,219,239, 40,171, 33, 14, 17,105,201,216,239,174,113,113,113,169,100, 74,185,196, 28,219,
+214,200,225, 83, 20, 45, 44, 49,224, 82,178,174,167,233,114,195,183,111,217,197, 14, 54,227, 93,236, 88, 87, 87,166,238,192,219,
+ 33, 5,238, 96, 95,245,187,246,233,223,190,232, 15,254,232,203, 11,243,213,136,125,125,153, 27,201, 99,127,233, 99,202,239,191,
+187, 78, 8,209, 46,103,160,129, 1, 44,152,244,105,224, 21, 86, 98, 68, 61,204,150, 41, 25, 27, 48,147,183,144,244, 20,210,107,
+135,249,172, 0, 0, 32, 0, 73, 68, 65, 84,217, 75, 50,143, 94,254,214, 34,120,171, 74, 83,163,170,119,175,226, 52,107, 29, 82,
+154, 97,189,209, 29, 84,136, 81,127, 51,181, 84,184,209,227,232,120,171, 93,122,229, 39, 43, 39,242, 99, 46,243,130,105,191,192,
+ 58, 3,192, 43,239,152,212,171, 25,126,140,156, 24,231,212, 46,146, 82, 86,235, 27,217,223,168,194, 92,230, 25,206,121, 76,172,
+126, 21,225, 79, 87,149, 87, 44, 75, 85, 27,213, 56, 14,188, 35, 18, 66,156,196,182, 50,246,113,173,254,100,142,178, 15, 18, 51,
+217, 69,238, 37, 21,174, 90, 61,195, 81,214,160,141,190, 47, 45,124, 33, 10,248, 71,254, 28,137, 73, 42,238,188,254, 30,142, 95,
+253, 0,223,124,125,138,121, 90, 48,142, 30,215, 79,126,133,171,179, 71, 92, 2, 90, 62,252, 2,199,156,130,167, 50, 21,181, 38,
+ 5,226, 88, 24, 88,207, 99,227, 6,238,194,237,202,103,203,137,197,181,162, 24,163,190,218, 92, 27,108,227, 61, 96,206,180,227,
+151, 21, 12,243,192,117, 31, 62,140,204, 95, 39,223,113, 99, 84,174,177, 28,188, 35,126, 76,235,212, 81, 97,156,215,181,129,119,
+178,179, 7,106,110,156,188, 71, 98, 70,231, 3,170,137,184,188,182,120,118, 30, 49,110,111,225,189,247,111,225,198,201, 64,160,
+145, 84, 97, 7, 7, 95, 11,134,154,225,188,193,134,163,110,231,235, 29, 18, 28, 0,139, 82,102,164,185, 96, 41, 22, 23, 23,215,
+120,248,224, 17,125, 94, 67,145,169,111,191,253, 26,246,251, 9,222, 86,180,205, 6,191,252,151,175,144, 91, 65,180, 30,239,188,
+253, 26,142, 54, 1, 37, 88, 44,169, 34,188,243, 14,126, 8, 32,160,225, 47, 62,254, 6,222, 6,148, 86,113, 39, 4,252,224,254,
+ 45,166,254, 1,197, 80, 81,183, 75,156, 33,222,128, 41, 23,178,247, 4,160,109, 6,204, 55,110,163,204, 51, 48,101, 92, 92,237,
+241,182,245,186, 0, 92,103, 48, 87, 1,110,188, 84,235, 31,134, 66,137,136,211,145, 96,147,237,126, 48,142, 59,222, 30, 11,105,
+ 26,197,127,186,224,153, 86, 86, 52,182,178, 37,113,218, 52,228,133,162,112,235, 74,211, 80, 74,101, 1, 95,211, 85,141, 66,159,
+ 88, 7, 16,124, 64,109, 36,124,117,133,214, 89,203,178, 80,242,153,243, 12,164, 98,178, 99,109,172,160,238,218, 0,235, 44, 91,
+ 51,141,134, 13,209,234,176,177, 42,220, 51,228,165,174, 38, 95, 93,100,104,157,131, 15, 86,113,177,210,205, 47,115, 90, 93,174,
+124,161,242,218, 39,167, 78,165, 43, 12,193, 90,230, 69, 17,176, 34,208,171,166,170, 73, 42,165,164, 93,186, 88,248,132,194, 38,
+157,218,188, 36,178, 0,231,238, 23,151,117,159,172, 31, 1,211,149,234,204,186, 16, 58,157,120,217, 37,114,217, 58, 96,153,179,
+166, 73, 54, 86,141, 91,182,157, 73, 4,169, 1, 14, 32, 86,218, 61,114, 50,151,248,196,131,232, 43,184,179,223,108, 40,104, 43,
+198, 8,103, 45, 55, 78, 85,197,195,210,148,181, 38,150, 57,138,204, 29, 55, 35, 90,107,184,188,184, 66, 90,200, 45, 96,217, 69,
+ 69,161, 64,125,196, 15,222, 25,235, 26,129, 63, 86, 39,130,214, 85, 78,187,233, 59,104,131,131,172,116,250,186,205,106,247,222,
+190,205,108,104,135, 32,154,245,248, 28,178, 42, 91,137,125, 15, 59,233,246, 93, 45,250,183, 90,111,115,112,227, 31,138,226,116,
+ 84,175,223, 73,111,224,122,133, 80,213, 54,217, 71,243, 70,157, 99, 50,161,246,134, 85,157,181,210,168,199,135,168,159,134,198,
+ 48, 43, 66, 91,174, 26,234, 97,157, 3,172, 83, 69,188, 60,188, 13,224,232, 86,232,200,220,135,128, 34, 4, 52,121,168,141, 69,
+ 8,125, 7,221,120,239,139, 38, 0, 23,122, 33, 13,239, 70,106, 35,226,211,110,183,231,203,195,173, 4,118, 61, 66,114, 89,250,
+248, 92,108, 32,145,243,152,233,165,245,180,223, 7, 84,133, 78,187,227,172,203, 18,137, 15, 44,165,169,232,200,251, 64,209,167,
+ 60,114,151,200,198,245,126,132, 58, 9,175,163,169, 24,195,202,151,111, 97, 3,103,127,243,138,131,118, 84, 88,197, 71, 26,216,
+ 64,100,189, 86,197, 39, 95,244, 55, 47,233, 62,173, 85,220,124,229,123,184,243,189,223,195, 55, 15,206, 48,237, 23,248,224,112,
+253,244, 95,112,125,250,144,126,185,206,193, 51,163,189, 50,191,208, 51,249, 43,196,168,235, 9,233, 28, 76, 99, 37,179, 39,155,
+ 30,117,240, 70,247, 71,165, 86, 29,229,121,239, 48,237, 38, 6,200, 20,173, 66,137, 48,183,114, 85,153,206,182,166, 93, 35, 41,
+156, 13,115,181,107,171,112, 16,197, 59,115,165, 13,193, 69, 26, 43,125,105,251,190, 74, 85, 42,210,157, 22, 88,191,193,213,180,
+197,249,179,134,203, 93,195,107,175,221,195, 91,239,222,230,162, 20,184,158, 43,108,171, 48,197,194, 44, 6,152, 22,184, 74,182,
+188,209, 83,254,182, 55, 13, 41,103,164, 6,248,205, 6,209, 55, 60,252,230, 12, 15,190,122,192,150, 71,122, 23,126,255,163, 31,
+ 32, 90,131,221,195,135,104,183,110, 32,223,189,135,199,207,206,177,141, 35,182, 67,192, 43,175,220, 0,140,197, 48, 56, 12, 3,
+ 48, 15, 30,227,247,223,194,110, 90, 48,124,250, 12, 75,173,184, 21, 7,252,217, 71,175,227,120,140,186,250, 41,141,190,158,194,
+240,166,165, 22,248, 96, 49, 28, 5,224,230, 29,180,163, 45, 8, 9,111, 53,141,173, 20,161, 61, 50,138,151, 5, 84,135, 84,153,
+118,208, 49,168, 50,216, 58, 13, 45,170,205,116,171, 41,123, 97,141,170,155,185,163,110, 5,166, 82, 14, 56, 93,118, 77, 39, 82,
+ 20,101,204,244, 58,244,192, 12,225,137,151,182, 62, 20,137,160, 33, 81,156,134, 51,212, 37, 90, 53,231, 2, 99,169,155,175,188,
+191, 38,224,145,225, 75,197,233,207, 44,215,194,163, 96,195,226,200,192,218,159,198,201,111, 70, 21,251, 36,188,165,168,209,214,
+ 26, 54,219, 1,243,180,176,102, 7,202,134, 15,129,118,233,243,156,224,189, 93,141,187,173,174, 54,168,201,225, 64,169,121,193,
+126,183,231, 20, 59,207, 22, 88,201,111, 7,159, 61,141, 93, 46,134, 18,186,248,119, 96,189,133,131,227,204,243,138,105,154,233,
+ 44,105, 64, 8,100,187,148, 53,162, 16,220,228, 76,241,158,149,253,188, 58, 43,165,135,175, 88,107,225,108,161, 41,229, 10, 89,
+237,156, 35,203,104,169, 26, 14, 69,246,167,166, 69,117, 91,119,227, 88,173,115,152,205,222, 42, 17,232,198,113,224,200, 89,203,
+113,196, 78, 1, 65, 50,217,148, 75,115,154,102,154,208, 13,196,201, 47,185,224,242,226, 10,243, 52,235, 10,181,213,214, 65, 68,
+188, 90,148, 38,141, 86, 84,158,207,134, 66, 34,237, 90, 14,242, 29, 52,147,220,116,212, 43,141,219, 13,240,210,126,189,181, 67,
+ 45,188, 52,207,245, 59, 90,122,209, 64,173,199,251,230,191, 36, 81,121,201,148,134,239,198, 66,124,167, 95,125,189,227, 63,252,
+211, 13,223,245,183,157,245, 74,241,147, 85,153,126,141,198,192,183, 42, 59, 50,195,191, 96, 48,222,147,236, 64,200, 89, 71,203,
+ 2,219,151, 46,163,213,172, 37, 8,229,133, 7,221,127,171, 13,134, 59, 53,152, 85,198,108,165, 56, 79, 26, 71, 25, 77, 0,243,
+252, 98, 17,243,221, 41, 94, 86, 96, 14,211,126, 70, 90,104,244,239, 69,113,107, 13, 95, 56,212,133, 14,209,245,228, 27,246,181,
+230,204,185,211,172,212,150,221,119,101,187,148,232,171, 72,253, 9,190, 76,171, 50,229, 53,110,145,193, 48,206,133,149,160, 16,
+171, 64, 8,154,122, 88,239, 24,160, 70,168, 87, 18,112,161,195, 81,172,209, 67, 35, 45,164,182,151,120,189,148,232, 69, 36,126,
+ 53,237,208,101, 10, 94,107, 65,205, 25,183, 94,125, 11,247,223,251, 25,190,250,226, 57,133, 86, 56,139,229,252,183,184, 62,123,
+ 0,112, 0,135,117, 30,206, 5, 37, 91,137,130, 84,186,115,168,114,190,227, 36,133, 27,111,173,133,141,180,111, 4,163, 33, 27,
+239,240,106,173,216, 93,207,122, 0, 24, 11, 82,183,115,236,109,101, 95,190,252,110, 90,225, 14, 52,211, 51, 69, 17,190,130,143,
+164,103,160,164,212, 19, 2,121,172,100,172,163,200, 56,116,145,160, 0,108,156,115,152,150, 17, 95,127,229,113, 61, 21,220,186,
+113,132,143, 62,186,143, 6,135,203,235, 9,105,201,176, 62,192,185, 66,153,229, 75,130,157, 95, 96,235, 26,188, 49,136, 14, 88,
+174,103, 88,227,224, 13,239,164, 82, 65, 13, 35,190,248,230, 41, 62,251,226, 17,114, 33, 33,102, 45, 21,239,188,249, 10, 94,189,
+119,130, 58, 47,112,241, 6,106, 60,194,217,139, 43, 60, 61,187,130,115, 6,247,110, 31, 99,227, 1,247,236, 27,212,163, 27, 8,
+183,110, 99, 19, 2,178,181,248,248,209, 21, 18, 31,236,163,119, 8, 43,176, 79,230, 64,140,138,134,125, 46, 56,138, 3, 6,111,
+177,185,125, 19,230,238,109, 42,114,157, 67,154, 38,160, 21,213, 86,104, 54,180,138,156,202, 75, 29,198,106, 27,199, 90, 23,203,
+226, 55,210,196,200, 20,167, 7,178, 84, 30,169, 11,178, 57,165,140,224, 35,231,213, 19,149,141, 58, 73,122,124, 6, 23, 97, 12,
+ 93,244, 18, 50, 67,239,142,209,142, 94,124,243, 69,169,118, 61,226, 85,138, 75,233, 50, 37,121,176,241,142, 94,166, 84,228, 71,
+183, 12,139,225, 44,118,182, 65,149, 92, 96, 2,159, 47,178,166, 3,141,190,199,109,224,209,181,209, 78, 61,242,120,220,135,160,
+151,143, 15, 30,195, 24, 0, 80,199, 46, 57, 4,178,135, 78, 75, 65, 28,169,209,201,165,240, 25,194, 46, 3,110,198,125,112, 72,
+ 75, 86, 96, 38,113, 55,160,250,143,204,188, 10,112,102, 56, 90, 67, 53, 13,198,176,189, 13,125,194, 87, 74, 23,155, 73,136, 14,
+ 26, 96, 57,223,129,222, 35,206,215,246, 30,165, 36,253,253, 9, 24,198, 57, 2,224, 16, 91, 66,194,182, 40, 67,131,154, 27,195,
+ 34, 55,163, 83, 76,112,241,237,188,227, 21,169,129, 9,158, 19, 40,233, 12, 27,199,145, 33, 60, 86,149,249, 29, 72,100,153, 56,
+154, 21,101, 75,218, 4,250,250,175, 46,175,112,125,181, 83,216,145,211,212, 61, 97,134,208,187, 93,107, 86,253,143,156, 63,234,
+148, 41,249, 96,207,172,190,116,211, 47, 97,243,146,161,173,245,168,131,111, 9,212,218,119,169,222, 94, 34, 47, 30, 92,232,120,
+105,150,223,190,141,166, 51, 47, 45,214,205,119,136, 81, 15,196,112,166,171, 92,204,193,215,184,186,151,101,106,106, 44,156,177,
+ 26,134,101, 29, 71,174,250,192,211, 31,122,191,188,196, 84, 58,190, 88,169,154,143,189,210,183, 61,153,201,172,196, 72,212, 13,
+145,144, 70, 94, 68, 33, 12,201, 40, 86,198,201,212,181, 70,160,177, 0,136, 15,107, 25, 63,136,216, 38,196, 17,155, 35,242, 49,
+202, 56, 34, 45,153, 61,230, 69, 31, 22, 42, 40, 56,231,153,195,226,115, 46, 42, 50,171, 43,235, 85, 78, 5,227, 38, 34,167,134,
+220, 10, 39,204, 89, 29, 21,150, 92, 85,245,171,174,192,218,147,141,208,154, 86,242, 50,162,151, 74,210,177,144, 75, 33, 56, 60,
+197,160,136, 61,242, 80,143,145, 64, 36,132, 90, 77,124,208,113, 48, 2, 43,244, 69,171, 80,149, 48,101, 20,248, 34,244, 42,160,
+162,149,138, 59,175,191,131,215,223,251, 35,124,254,217, 51, 92, 93, 78,180,139,187,252, 28, 87,207,191,224,228, 39,207,163,169,
+142,154,117, 62,176,218,158,194,199,106,173,112, 13,170,196,181,214,193,134, 0, 86, 49,240,104,145, 33, 15,185,243,255, 91, 45,
+ 90, 24, 25,208, 14, 90,148, 21,194,180,167,226,144, 10, 30, 43,110,138, 90,224,173,231, 98, 10,148, 2,197, 90, 13, 83, 41,150,
+ 54, 45, 73,145,135,203,188,240,104,162,234, 32,170,100,210, 53, 84, 4, 60,122,106,241,248,105,195,184,241,248,209, 59,183,113,
+107,235,145,231, 61,150,102, 81,175,119, 72, 83,194,126,202,200, 54, 2,214, 96,180, 21, 67,201,184,118, 6,105, 90,176, 29, 35,
+129, 49,150,130, 58, 47,200,115,194,217,213, 30, 31,255,234, 33,158, 95, 77,220, 65, 53, 4,231,240, 71, 63,125, 31,239,189,247,
+ 6,173,113,152,232, 85, 26,240,205,195,103, 4, 61,202, 25,209, 2,249,201, 35, 92,165, 2, 95, 61,142,238,191,134,214, 42,174,
+ 94, 92,224,211, 7,167,136,158, 50,170,207,230,132,255,248,203, 71,120,239,238, 17, 62,184,127,147,125,189,192,156, 42,206,103,
+209,124, 0,102,123,140, 6, 7,235,232,144,164, 60, 4,207, 88,100, 10,197,233,163,196,210,151,131,107, 18,128,161,201, 8, 21,
+204,108,115, 50, 92,180, 99, 29,241, 72,133,170, 85, 43, 26,165, 0, 42, 82, 85,196,154, 37,161, 54, 7,203,202,239,101,154, 85,
+ 63,210,216,150, 36, 94,113,153,148,137, 69, 75,115,160, 87,203, 1,231,132,123, 1,117,192, 72, 1, 74, 2, 77,210, 10, 56, 71,
+ 23,124, 28,130, 50, 12, 80, 42,251,186, 59,100, 71,236, 90, 94,199,190, 12, 65,226,145,178,208, 17,157, 37,184, 83,229, 60,113,
+130, 68, 85,226,207,243,233, 47, 23, 99,206,100,133,147,119, 66, 5,153,176,152,118, 11,127,223, 13,214, 82, 78,121, 99,112,145,
+128,115, 36,174,214, 90,131,198,144,160,146, 10,191,243,137,180, 73,156,177, 46,113,168,210, 92,200, 10,207, 90,135,198, 28,138,
+101, 73, 40,133,206,106, 74, 70,236,171, 47,242, 42,247, 11,210, 57,139, 92,114, 31,203,114, 49, 47, 41,105, 75,202,140,141,237,
+ 17,160,114,102,198, 24, 25, 52,212,125,251,146,236, 70, 2,193,202,112, 25,175,250,166,253,110,102,247, 1, 16, 98,196, 48, 16,
+244,167,214, 66,184,215,154, 87, 89, 4,128,243, 70,167,162, 20, 73,187,186,172,107, 81,103, 75,149,239, 37,247,203,186,181,223,
+225,230,248, 14,240,139,121,249, 46,110,135, 23,127, 59,228, 53,117,128,234, 75,171,244,181,240,237, 16, 96,211,190,227,207,125,
+ 87,135,221,199,237,230, 32, 71,157,167, 55, 60, 25,235, 58, 53,171,117,131,119, 20, 73, 77,211,236,214,109,148, 10,253,170, 92,
+ 48,242, 4, 57, 11, 14, 21,132, 73,172,188,115,166, 14, 41,179,213, 72,186,102, 67,193, 41, 77,226, 29,105,132,158,150,153,128,
+ 52, 18, 75,138, 62,235, 39, 11, 22,237,120,172,179, 8, 8,186, 55,117, 54, 40,118, 82, 58,245,113, 24,116, 36, 40,170,120, 99,
+129,121,158,105, 55,212,250, 72, 12,133, 70,109,228,167,230, 28,104,198,147,210,218, 64,212,239,135, 15,137,236, 30,172, 92, 62,
+ 98,255, 48,194,202, 54, 58, 58,118,252, 49,196,170,148, 83,193, 48, 68, 30,199,145,112,200,121,242,102,203,136,218, 49, 76, 71,
+ 20,243,226, 57, 44,108, 73,241,158, 84,251, 36, 36,226, 93,117,206, 40,185,113,183, 64,135,142, 32,118, 37,223,248,222,235,239,
+226,213,119,127,140,207,127,251, 20, 23,231,100,159,201, 87, 95,225,250,244, 51, 56, 31,120, 4,104,216, 95,236, 20, 52,147,115,
+ 33, 37,126,149,100, 52,175,176, 24,107,156,250, 32,141,117,132,139, 20, 31,191,117, 40,144, 36, 36,114, 9,172,179,188, 37,151,
+190, 72, 50, 83,237, 94, 75,121,240,164, 75,170,234,105, 6,172,113, 60, 37, 40,196, 62,200,139, 70,227, 54, 86,111,203,203, 75,
+ 12,242, 6,227, 6,156, 94, 56, 60,120, 68,185, 0, 63,248,254, 93,220,185,115,130,176, 59, 71, 40, 25,182, 52,192,122, 12, 37,
+ 97,218,239, 97,151,140,227, 49,195,134, 45,192,140,237,232, 29,182, 71,244,187, 43,251, 5,187,235, 25,121, 73,248,242,233, 5,
+190, 58,223, 99,102,178,161,116,158, 63,251,241,187,248,209,135,111,177,179,194,118,124,176,109,248,229,217,185, 38,141,189,118,
+123,139, 52, 39,204, 75,195,113, 3, 23, 40, 14,127,245, 55, 31,227,116,191,192, 51,211,223, 89,139,235,156,241,247,223,156,225,
+ 55,207,175,241,123,247,111,224,189,251, 39,216, 47, 11, 46,231, 5,185, 86,108,135, 65, 69,145, 2, 51,217,140, 30, 14,192,156,
+120, 77, 4,219,253,232,109,117, 48,177,247, 64, 20,236,198, 56, 21, 55, 18, 0,198,234,232, 91, 38, 51,116,160, 85, 88, 46, 32,
+215,158,221,218, 24, 71,203, 8, 85,211, 50, 9,223,172,193,178,244,132, 54, 99,109,199, 6,163,209,101,134,166,202,232, 53,198,
+ 86, 58,187,222,105, 22,118,148,172,182,163,130,143,118, 65, 47,236,180,228,222,209,177,235,101,176, 30, 41,101, 12,227,160, 23,
+ 60,105,109,172,226, 73,141, 5, 12, 91, 52, 9, 49, 93, 49,110,122,183,233, 2,197,147, 18,226,153,104,137,181,102,204,115,209,
+162, 75, 3,102,216,243, 78, 78, 22,139,156, 27,108,108,108,115,229,113,185, 68,100, 58,154,116,201, 5, 95,146,172, 49, 11,246,
+251,153,215, 22, 84, 88, 88,166,119,106,119,174,185, 25,204,249,168,141, 47,116, 18, 35, 39,214,180,244, 88, 84, 86,214,243,207,
+220, 24, 18,158,218,106,209,108,131,117, 65,149,224,214, 2,181,145, 24, 89,138, 46, 99,168,144,217,110,183,156,124, 72, 68, 61,
+207,103,138, 20,123,214,246, 8, 87, 99, 12,166,105,198, 50, 47,168,181, 32, 4,135, 97,140,234, 32, 58, 63,191,228, 11, 59,245,
+ 81, 58,159,141,228, 36,201,236, 53, 23,141,147, 71,206, 11,159,247, 70,131,183,202,234, 57,151,100, 54, 34,233,117,117, 59,117,
+235,230, 59,172,227,237, 91,106,243, 53,126,198,152,151,130, 93,240,237,139, 92, 47,240,213,252,125,157,165,240, 59, 33, 52,223,
+ 49,114, 55, 42, 62,151,118,189,169,223,188,231, 55,172, 7,241,134, 67,116,178, 18, 94,157,160,214, 93,231,199, 88, 22,182,202,
+187,235,165, 2,211, 63,104,197, 19, 71, 68, 48,219, 68,213,222,147,118,250, 40,158,108, 18, 48,148,234, 36,137, 59,158,125,133,
+125, 42, 97,120, 95, 66,194, 39,203, 86,133, 53, 14,210,249,136,113, 28,117, 63,213, 86,227,234,156, 50,179,148, 83, 87,187,115,
+118,158, 99,204,173,229,192, 2,203,184, 67, 41, 84, 36, 62,176,143,153, 68,173,207, 70,125, 47, 59,196,222,221, 83,250, 40, 77,
+ 29,188,239,190, 93,199, 99, 40,218,245, 26, 5,200, 72, 53,220,233,113, 84,244,120,182,130, 8,207,184,173,248,211,244,189, 25,
+ 37, 40,209, 62,168,178,213,173,234,190, 90, 14,139, 55,190,255, 67,220,126,227, 71,248,252,183, 79,112,241, 98, 15,231, 45, 48,
+ 61,192,245,233,103,244,242,231, 10, 99, 2, 91,207,156, 30,180, 2,252, 33, 75, 72, 65,240, 36,100,233, 7,161,208,195,236, 42,
+ 98,145,243,161,211, 66,163,108,205,162,239, 59, 60,226,122,215,149, 45,169,123,241,197,106, 37,135,141, 36,124, 81, 28,163,101,
+130,160,163, 17,247, 66,193, 60,148,224, 74, 85,186,216, 43, 91, 45,168, 8,120,122, 10, 92, 92, 57,108,134, 17,127,248, 7,247,
+113,124,114,132,148, 42,202, 50, 35,101,250, 92,176, 30,213,143, 8,184,196,205,209,193,222, 28,105, 13,176,137,152,206,247,180,
+110,224, 41, 65, 93, 50, 92,107,176, 45,227,151, 95, 61,199,211,125, 82, 58, 34,248,160,125,255,221,251,120,255,131,183,201, 42,
+ 34, 57, 6,165,194, 89, 42,182,158, 60, 59,231, 2,211,225,181, 55,238, 1, 71, 17,102,211, 96, 78, 78,136,115, 16, 26,238,221,
+ 61,193,157,147, 35, 92,236, 38,230,163,211,197, 30,172,195, 46, 23,252,127, 15,206,240,249,233, 53,137,241,106,133, 99, 54,129,
+ 15,158,163, 91,171, 18,193,188,203, 48,231, 79, 57,159, 58,117,182,182, 15, 42,104,132,177,218,237, 90,235,251,120,111,205,169,
+ 22, 8, 17, 26,156, 11, 61,137,177, 84, 14,116,169,108, 23,163,119,189,182,190, 42,147,103,168,105,150, 58, 23, 15, 13,104,153,
+131, 96,120,114, 39,150, 85,121,135,214,201, 94,107,116,108,107, 13,214, 83, 34, 99, 41, 21, 78, 17,169, 85, 63, 47,237,212,189,
+138, 79,107,109, 24,198,129,161, 46, 52, 85, 26,134,168,248,234, 24,189,198,161, 58, 43, 59, 97,102,216,143, 65,129, 40, 66,170,
+180,209,115, 83, 96,184,136,181, 28, 48, 68, 33, 43, 82,160,138,200, 52,205, 43,130, 89, 37,162,227,146, 88, 40, 42,145,196, 60,
+117, 42, 44,250, 44,185, 32,183,202,172,140,194,192, 22, 18, 43,138,126, 73,168,119,222, 7, 20, 14,150,106, 13,216,239,103,202,
+ 71, 96,235,177, 8,219,228,231, 73, 19, 50,217, 45, 27, 77,206, 20,189, 14,120,253, 37, 26, 4,225,191,147,163,129, 68,109,155,
+ 13,173, 58,157,117, 36,118, 99,239, 63,173, 19,138, 22,100, 41, 81, 81, 34,194,201, 16, 61,198,205, 70,109,112, 87,151, 87,200,
+133,166,171,242,113,232, 44,102,157,150,164, 88,150,170, 54, 63,177,105,117,251, 46,248,206, 49, 48, 5,244,142,243,197, 78,144,
+ 42,116, 77,128,121, 73,229,190, 26, 93,155, 3, 76,108,191,220,215, 16,166,111,253, 51,176,178,116,175,132,117, 6,223,234,238,
+ 91, 59, 84,185,183,117, 84, 27,186,118,164, 11,227,214, 23,186,233,191, 15,126,111,193,144,182,134,254,193,233,253,226,233,128,
+ 5, 55,173, 78,163,195,165,121, 12, 62, 32,243,115,225,141, 49,138,212, 68, 51,136,195,160, 47, 18,141,115, 28,106,174,186,175,
+240,222, 99, 89, 22,141,121, 68,115, 12, 23, 33,245, 57,141, 82, 28,123, 75, 43,226,176,161,224, 21,219, 73, 71, 82, 93,200,159,
+243,156,194,230,125,192,102,187, 65,140,129,247, 81, 77,115,211,231,105, 86,116,164,236,189, 68,174, 40,176,137, 2, 3,239,161,
+ 30,216,106,232, 2, 77,139, 89,229, 73,179, 90,189, 57,237,204, 69, 13, 44, 9, 95,133, 69, 33, 98,217,208,125, 58,143, 55, 12,
+160, 85,149, 28,112,128,193, 48,120,237,222, 36,211,188,241,254, 92,210,226,192, 24, 88,199,251, 46,233, 96,215,246,163, 90, 25,
+ 12,200,234,216, 55,191,255, 33,110,190,246, 30, 62,251,244, 49, 46, 47,246, 84,245, 78, 95, 99,127,254,128,127,174, 20, 44, 67,
+ 93,148,231,145, 94, 80, 26, 30, 97, 88, 11,130,188,172,108,103,179, 14, 10, 47,160,137, 69,208,176, 24,121,152,201,118, 69,120,
+ 86, 58,216, 9,181, 11, 86,193,171,211,129,199,227,226,195, 21,232, 14, 9,174, 56,208,199,121,101, 65, 75, 18, 91,205,164,216,
+174,133,195, 38, 56, 10,214, 7,143,243,115,139, 79, 63,175,248,254,247,238,225,103,255,246, 77,220, 56,217,162, 89,139,221, 62,
+225,178,206,168, 32, 39,193,156, 50, 42, 50,252,237, 13,112,114, 3,219,253, 21,114, 42, 88,114, 69,219,239,113,180, 25,208, 74,
+198,178,159,169,227,107,192,179,171, 9,191,120,240, 2,215, 75,193,209,118, 80, 59, 99,173, 13, 31,189,247, 6, 62,252,232, 29,
+ 98,122,243,229,154,178, 81, 93,194,139, 23,215,152, 88,133,108, 12, 48,158,156, 32,111, 71,120,103,176,203, 13,152, 43, 76, 89,
+240, 39, 63,121, 27,127,252,193, 43,248,229, 87,167,248,171,191,249, 4,159, 61, 58,163, 81,175,243,234,159,125,122, 77, 99,108,
+199,185, 7,222, 25,140,209,161,193, 97,153, 18, 80, 18,112,113,138,146,103,164,179, 43, 70, 98,246,238,206, 57,207,196,184, 30,
+129,217,154, 81, 70, 68,107, 6, 70,153, 9, 50,106,109, 28,188,209, 58,254, 87, 20,239,134, 25,254,173,209, 72,215, 5,141, 25,
+174,181,162,162,114, 26, 33, 61,155,222,211,180,173,153,166,253,133,181, 36, 88,181,250, 49, 37, 27,157, 51,217,171,225,194,142,
+118,187,173, 1,243,188, 32,198, 65,255, 89, 46, 10, 25, 47,230, 82, 96,138,225,213, 1,209, 43, 91,131,254,185,101, 33,154, 97,
+ 8, 94, 41,140,206, 17,255,193,123,135,205, 17, 53, 12, 49,122,142,101,245,172,142,151,119,195,115,212,178, 65,205, 85,187, 82,
+ 74, 43,108, 88,230,194, 34, 91, 33, 59, 82,227, 80,109,211,213,159,136,203,100, 39, 47, 83,170,121, 90, 72,107, 36,209,196,173,
+ 97, 24, 54,172, 85,130,146,234, 8,159, 77,231, 69, 98, 86,193,126,183, 71, 74,153,155, 16,163,132, 1, 42, 20,106,167,170,193,
+234,129, 47, 69,159,117, 84, 36,166,156, 17, 60, 77, 18, 93,160, 41, 80,140,195,106,212, 76, 44,125,199,162, 55,171,150,198, 30,
+243,156, 82,198,245,213, 78,119,194,228,245,167,157,252, 60,205,152,166, 73,117, 1,214,146,194,158,116, 17,172,157, 66,211,204,
+137, 42,207, 68,237, 51,232,198,121, 19,194,160, 32, 47,125, 65, 45, 73, 69,161, 34,186,181,214,247,248,234, 21,189,205,172, 72,
+ 48,166,225, 59,100,103, 93, 83,126, 56, 82, 63, 36,209,181,122,232, 62,107,171,150, 94,138,228,190,254, 50, 7, 54, 57, 99,205,
+ 1, 82,214,174, 45,106,102, 53, 33, 19,228,171,117, 61,122, 85,210, 57, 87,249,237, 85, 89,251, 93,209,223,239, 28, 17,166,122,
+ 30,203,115,198,122,227,151,188,112,210, 81,225, 44,115, 31,140,218, 54,124, 12, 42, 88, 42,156,130, 4,219,171, 63,195, 41,102,
+198, 88, 88,206, 69, 7, 23, 0,243, 60, 99,220,140, 84,237,137,141,132, 15,207, 37, 81, 53,103,140,163, 76,242, 97,224, 61,141,
+ 84, 47,228, 43,191,190,218, 97, 89,102,253, 6,199,113,192,178, 36,133, 52,136,239,213,178,151,207,242,222,172, 85,122,112,114,
+206,136, 67,196,180,103,197,101,147,223,122, 83,207, 37,165,251, 24,181, 99, 24,217, 71,115,241, 32,113,134, 49,146,248,172,149,
+ 10,231, 37, 9,137,170,202, 82, 24, 63, 41, 21, 19, 31, 92,185, 20,254,239,244,160, 90, 14, 75,169, 43, 81, 70,109,171,136, 91,
+ 73,192,242, 22,239,252,240,247,177,185,245, 22, 62,251,205, 99, 92, 94, 76, 52, 9,216,125,137,253,229, 35, 22, 64, 57, 30,183,
+ 25,134,202, 64,187,110, 25,175, 18,113, 43,246, 97, 20,243,164, 13,239, 54,168,179, 54, 10,228,145, 53,134,243, 52,246, 21,192,
+ 79,109,134,237,120,108, 65,172, 20,176, 82, 51,141,195,230,253, 68, 64, 10, 71,190,119,193,252, 90,103,105,135, 87, 58,128, 71,
+ 0, 54,148,149,158, 97,217, 82,233,156,229,132,190, 17,229, 69,193,135,239,221,198, 31,253,248,109, 88,107,113,189, 79,234,189,
+ 63,222, 68, 36,111,177, 76, 51,242,254, 28,246,198, 9,117, 74, 33, 32, 93, 55,180, 76, 93,245,120,247, 54,114, 3,230,243, 11,
+ 88,236,209, 90,197,111, 30, 93,226,243,103, 87, 72,165, 96, 28, 35,117, 30,173, 33, 6,143,255,234, 95,127,136,239,191,123, 31,
+165, 84, 26,159, 26, 58,108,114,202,168,185,194, 71,143,175, 31, 62, 67, 46,164, 57,184,119,243, 8,155, 33,112,209, 72, 47,235,
+254,252, 5,202,233, 99, 4,222,219,254,201,207,127,132, 63,253, 55, 31,226, 31,254,233, 51,252,175,255,254, 63,227,244,114,191,
+130, 36,153,158,121,110, 12,198, 33,224,104,160,177, 50,205,220, 95, 96,191,223,227,242, 58, 33, 85,131,237,102,131, 48,140,221,
+178,163, 73,138, 70, 3,157,154,210, 90,232, 57,215, 76, 3, 21,172,246, 3,168, 86,114,188,138,128,212,114,226,150, 28,232, 98,
+ 95,172, 18,244,194,197,124,169, 21, 53,209,132, 79,236, 96,244, 25, 11,170,174, 95,232,194,169, 43,156,151,119, 94,181, 54, 82,
+ 40, 11, 87,189, 11,229, 72,148,233,184, 35, 25,198,129,217,231,125,245, 67,162,172, 10, 31, 50, 28,251,204,197,227,171, 89, 17,
+ 48,216, 30,109,144,115,225,192, 16,143,113, 51,244, 46, 73,124,250,206, 41, 42,149, 86, 95,194,157, 55, 12, 94,105,216,108,253,
+ 42,123,156,126,186, 89, 17,216,244,204, 91, 16,153,179,212,138,101, 90, 96,184,169,168,106, 67,165,119, 97,216,140,220,141,173,
+ 67,112,232,125, 39,136, 77,229,124,116,102,202,231,172,154, 24,185,200,122,161, 37,172,117,199, 5, 67, 7,109,209,193,111, 49,
+140,163,218,223,164,128,144, 49, 48,173, 51, 28,229,198, 51, 6,150,166,116,133,163, 93,233,103, 66,238,128,160, 2,183,153, 19,
+226,118,187, 93, 7,234,112, 81, 32, 93,189,232,105,228,210, 92, 68,181,207, 5, 94,105,156, 50, 86, 87,151,162, 49,250,179,114,
+214, 34,177,155,233, 80,157,222,232, 34, 99,244,180, 54,139, 47,161,144,205, 1,149,193,176, 15,188, 7,188,152,213,199,108,173,
+155,222, 69, 73,111,165,225,125,121,148,110,215,127,238, 80, 23, 38,243, 0,163,218, 43,123,192,131,183, 7, 1, 76,102, 53, 9,
+176,250, 76, 74,247, 46, 16, 8,211,119, 13,250, 51,202, 37,147, 85, 89,226,120,141, 1,192,148, 83, 18, 94,200, 47,128,171, 9,
+ 86, 37, 83,180,101, 84, 27,129,227,104, 55, 25,129, 83, 90, 22,129, 37,194, 48,112,110,116, 65, 99, 81, 74,225, 11,130,108, 34,
+158, 32, 25,149, 70, 40, 57, 23, 4,111, 85,217,231,125,196, 48,142,132,137,181,142, 59,218,204,223, 63,145,170,164,147,170,149,
+ 46,140,202,123,164,156, 73, 69, 12,131, 3,228,170,252,214,156, 39,209, 70, 8, 44, 20,226,213,128,238,219,213, 72, 72,126, 75,
+195, 99,208, 56, 4,173,118, 37,243, 92,245, 1,150,112,170,203, 34, 96, 26,163, 22, 58,241,104,166,148,185,242,207, 43,125,128,
+248, 74,139,102,183,235,190,209, 52,173,228,188,115,248,224,167,127, 12,184,155,248,236,211, 71,184,186,154,137, 95,125,253, 5,
+150,221, 83,182, 6, 2,141, 65,255, 6, 13,141,237,131, 20, 86, 67, 54, 20, 27, 7, 26,131,134,192,251,174,202, 93,118, 83,165,
+ 43,133,163, 88,158,206,208, 69, 65,157,126, 86, 36,100, 46, 61,144, 35,113, 36,106,229, 81,108,225,221,191,215, 74, 27,154,152,
+ 86,114, 70,171,244, 32, 55, 78,230, 18,220, 35,253, 55, 18,248,128,179,206,195, 16,169,251, 99, 33, 93,136, 17, 23, 87, 51,156,
+ 49, 48,206,146, 30, 97, 78,200,165, 96,153, 18,142, 78,182, 56, 58, 30, 81,141,195, 52, 45, 36,144,171, 30, 33, 24,140,183,110,
+ 98, 98,156,102, 29,183, 56,125,126,129,127,254,228, 9,118,153,138, 24,239,232,239,160, 53, 28,111, 7,252,201,207,127,132,251,
+111,220, 35, 96, 14, 26, 2,167,138,229,148,217,165,224, 48, 77, 51,190,254,230, 84,131,120, 78,182,131, 2, 66, 82, 42,112, 21,
+200, 79,158, 34, 47, 19, 90, 6,134,152,209,190,122,140, 27,223,123, 29, 63,255,217, 7,248,224,253, 55,240,191,255,251,255, 23,
+127,253,247,159,169,167,219,192, 34,179, 30,229,149,187, 39,184,119,123,131,235,253,130,197, 85,212,157, 67,216, 12,216, 21,131,
+253, 85,193,176, 25,216, 83,110, 85,120, 36,122, 23,234, 52, 69, 21,187, 18,230, 88,171,255,194, 24, 42,216,100, 84,175, 74,120,
+121,246, 12, 69, 58,166,156,145,139,252,127, 38, 46,122,219, 3, 93,235,202, 79,220, 26,163, 68, 61, 95,188, 18,178,209,185,220,
+214,244, 78,178,119, 45,189,192,148,131,177,148, 2, 87,233, 82,179,206,193, 54, 71,197,178,119, 48, 28,138,148,139,104, 9, 8,
+174, 98, 12,217,188, 98,140, 12,149,113, 60, 9,160, 85,198,198,145, 16, 45,142, 17, 13, 70, 11,113,201,118, 40,133,172,149, 34,
+250, 18,119, 2, 21, 27,180,230, 27,198,128,221,245,172,130, 44, 17,204, 73, 24, 83,102, 61, 2,249,208,179, 30,252,146, 29,111,
+141,225, 46,153, 46, 95,177,111,229, 84,148,115, 47, 22,176,196,209,163,178,186, 19,152, 15, 17, 37,187, 79, 94, 46, 83, 0,172,
+ 55,234,171, 46,239, 37, 2,218,232,247,148,115,102, 7,129, 88,215, 12, 89,205, 10, 93, 70,203,156, 84,189, 46,252,122,231,168,
+137, 18, 23,204,213,229,142, 44,105,203, 76,205,155, 49,112,142,222, 37,217,151, 3,253,236,246,222,107, 4,182, 97,157,150,243,
+ 86, 69,207,149,207,158,202,234,247, 82,136,121,208, 0,204, 83, 87,203, 31, 32,227, 84, 4,199, 77,201,203,227,117,115,104, 21,
+147, 98, 8, 47,255,251,151, 8,111,162,255, 18,102, 75,171,135, 33, 84, 26,100,179,182,211,241,197,109,209, 39,121,130, 70, 23,
+189,152,196,145, 91, 99, 15,132,124,142,139,227, 46, 20,109, 42,164, 62, 20,144, 86,190, 19,107, 23,159, 43, 32,205,177,240,218,
+ 35,132, 1, 33, 70,248,117, 52, 31,125,128,194, 15, 11, 71,186,177, 2,190,171, 90,187,146, 64, 0, 16,209,143,200, 11,209, 40,
+228,192, 32,152,128,231, 37,191,215,157,157, 42, 49, 13,169,215, 83, 74, 24, 55, 3,134,113, 32,213, 59,255, 70, 50,167, 18,165,
+133,162, 12,155, 86,201,189,202,182,130,109,244,110,245, 53,113, 32,205,202,187,217, 69, 52,107, 32, 77,210, 42, 93, 2, 87, 66,
+ 12,154,205, 43,226, 5, 18, 61, 89,237,222,125, 96,177, 29, 67, 18,214,170,221, 16,250,206,164,178,223,115,217,207,202,232,213,
+140,241,117,224,170,248, 12, 25,200,239,189, 69, 28, 6,124,240,147,127,133,253, 28,241,245,111,159,224,242, 98,194, 48, 58,204,
+231,191, 65,218,159,106, 21,215,140,225, 73,121,101, 10, 32,141,201,198, 49,104, 49, 99,172,129,101, 93,123,145,209, 0, 40,176,
+133,246,118,232, 99,102, 46,101,213,182,195, 35,193,156, 73,143, 32,118, 66,177,182,201,255,134,205,160,108,120,231,233,162, 73,
+203, 66,176, 16, 67,137,108,206, 90,212,146, 56, 46,145,105,121,181,168,168,208,135, 8, 63, 12,236,192, 48,188, 43,109,216,167,
+138,103,103,123,220,187,115, 4,111, 28,210, 50,211,139,151, 59,233, 43, 23,131, 96, 29,204, 38, 98,140, 14, 87,206,160, 2,184,
+220, 45, 72,153,190,254, 79, 63,253, 10,223, 60, 57, 83, 54, 64,206, 85,139,144,155,199, 91,252,155, 63,254, 16,119,239,222,212,
+195,197,240, 30, 82, 69,149, 44, 76,249,230,225,115,156, 95,237,180,136,187,117,235,132, 18,237, 4, 18, 52,207,104,121, 70, 46,
+ 5,181, 88,180, 12,184, 84,145,207,118,152, 83,193, 56, 6,252, 15,255,253,159,226, 79,255,245,251,248,159,255,183,191,197,103,
+143,206,104,143,207, 72,205,247,223,190,139,215, 95,191,133,221,245,132,253,133, 67,157, 79,177,179, 6,203, 64, 94, 99,159,174,
+212, 75, 46, 69, 51,184,163,232,158,115, 3,138, 90,162, 46, 93,230,114, 70,196,167,202,133, 0, 11, 42,141, 90,178,202,188,144,
+142, 37,103, 36, 6,175, 52,190,124, 75,173,186,191,215,220,103,198,178, 90,103, 81, 42,113, 26, 12,228,128,166, 34,208,113,178,
+163,109,102, 69,197, 2,235, 62, 4,108, 67,157,106, 3, 77,217, 98,164,174,146, 14, 43,191,130, 87,101,132, 64, 68, 55, 10,242,
+ 33, 33, 31, 77,128,160, 29,152,115, 14,195, 72,221,229, 50, 39,238,186,105,101, 49,239, 23, 77, 78, 44, 44,144, 21,182,251,192,
+145,172, 57, 23, 42,240, 1,132, 13, 81,232,196, 37, 19,130,165, 92,119, 97,113, 48,222,186, 49,177,178, 49, 11, 97,158,178, 6,
+ 30,129, 15,116, 97,179,139, 37,174,182,138,178, 80,211, 34, 89,235,211,148,120, 68, 78,157, 51, 21,178, 75,207,212,174, 77,127,
+151, 50,102, 39,145,154,215, 11, 77, 10,120,107,193, 63, 71, 71, 63, 71,177,206,101,106,174, 42, 11, 59,247,251, 9,181, 54,140,
+ 99,212, 12,248,194,235,132,253,126,194, 60, 47,152,167, 25, 75, 74, 84, 28,240,217, 66, 2, 46, 18,224,102, 94,211,138,107,167,
+ 25, 42, 54, 68,136,108, 45,227,136,249,210,147,194, 48,132, 1,203, 66,188,119, 25,201, 87,214, 79,201,148,180,169,195,163,169,
+127,222, 50,238, 26, 85,232,151,135,233,113,253,194, 62, 84,196,137, 43, 71,129, 95,181,117, 62,188, 53,250,126,136, 7,188,113,
+ 51, 35,106, 55,153,178,233,223, 93,249,204, 73, 95,149,117,117, 93,106,159,178, 72, 7, 46,133, 65,237, 9, 69, 93,160,186, 90,
+ 6,116, 24, 13, 61, 47,142,223, 29,153,182,121,231,233,220,244,145,217, 1, 4,108,242,122, 17, 58,199,106, 67,195,233, 99, 78,
+115,181, 41, 38,147,163, 49,115,209, 48,118,160, 40,188, 69, 34, 59,141, 37,218, 17,177,140, 11, 98, 28,104,231,196, 59, 29,122,
+201, 50,188,115, 72,185,240, 47,153, 42, 70, 18,110, 8,201,172,104, 14,241,180,159,180, 26, 11, 12,116,209,221,184,100,131,219,
+126,153, 58, 33,239,176,189, 74, 94, 70, 82,140, 86, 69, 76,210,247, 7, 78, 30,242,100,115,210,157, 63,133, 43,200,104, 75, 84,
+198, 11, 43,155,173, 53, 92,245,123, 29, 25,130, 65, 25,146,251, 43,191,240,174,218,132,190, 8, 82, 36, 89,223, 3, 18,208,128,
+ 56, 30,225,163,159,255, 91, 60,127,190,224,209,195,167,164,242, 29, 26,234,245,111, 96,234,165,238, 82,117, 23, 67,244,114, 61,
+ 44,135,129, 68, 66, 52,113,224,148, 55, 33, 53, 25, 11,235,233, 65,145, 68, 37,128, 14,154, 97, 28,200,179,238,201,106, 87,120,
+199,157, 82, 34,177, 28,239,199, 41,128,163,233, 97,130,214, 5,148,210, 57,144,215, 89,190, 71, 17, 51, 45,202,210,119, 22,156,
+103, 77,227, 85,207, 83, 4,178,239,241, 85, 81, 43, 66, 48,184,190,158,177, 44, 5,231, 87, 11,198, 96,177, 29, 28, 78, 78, 54,
+112,195,128, 96,216,185,176, 79, 72,185, 98, 24, 35,106,169, 24, 51,127,206, 37,225,139,175, 31,227,171,135,207,113,181,155,180,
+184,107,204, 10, 88,150,132, 87,238,222,192,159,252,252,135,184,121,235, 68, 71, 95,104, 92,116, 58,192, 27, 67,128, 24, 3, 44,
+243,130,143, 63,125,160, 7,198,173,147, 13,190,255,238,107,200,133,105,103,198, 2, 33,162,109, 78,128,122, 14,211, 26, 76,176,
+104,195,128, 92, 27,246, 83,162,223,167, 55,120,227,245,187,248,159,254,199, 63,199,211,211, 43,252,195, 63,126,129,191,253,231,
+ 47, 80, 27,240,193,219,119,241,202,189, 35,236,183, 30,211,198, 35,205, 39,216,219,107, 76,209,227,203,103,123,108,143, 2,119,
+205, 14,214,117, 49,143,117,140,232, 21,222,128, 49,171,192, 7,195,106,231,172,157,185, 91,225,157,115,106,252,140,100, 69, 41,
+ 75,130,151,117, 70,237,104, 61, 13,106,197,157,144,177,103, 45,164,113,200,137, 99, 55, 57,143,129,211,204, 12,119,242,114, 72,
+107, 49,194, 2, 83,205,132,230,206, 37,165,207,235,114, 52, 0, 0, 32, 0, 73, 68, 65, 84, 76,239,219, 76,122, 15, 31,131,174,
+223, 42, 3, 95,100, 85, 32, 59,247,148, 10,226, 40, 44,137,238,165, 30, 54, 3,172,161, 93, 61, 26,224,188,213,179,141, 50,199,
+ 9,173,234, 71,183, 34,210, 89, 14,152,138,106,253, 75, 83,214,212, 51,129, 91,137,197,181, 73,236, 44,141, 37,116, 50,135,118,
+152, 50,166,211, 44,158, 68,101, 38, 9,122,239,176,223,113, 3, 96,160,206,130,101, 89,212,141, 34,209,171, 49,138,207, 30,154,
+154, 38,103,165,168,204,197,130,215, 42,120,194,210,243, 60,150, 37,163,228,138,253,126, 81,110, 70, 8,158, 19, 39, 61, 11, 88,
+ 19,246,251, 25, 57, 23, 76,211,172,133,189,236,216, 75,173,202,117, 87,203, 31,191, 63, 50, 89, 81,164,105, 21, 4,117, 95,187,
+120, 7, 36, 86,249,207,243,158,197,193, 6,185, 85,125,182, 68, 4,166, 46,142, 86, 97,109, 64,179, 85, 47,121, 83, 43,165, 69,
+114,195,164, 72,233, 53,101,141,119,223, 93, 11,213, 84,192,221,173, 35,125,207,222,148, 70, 99,180,219,110, 60,242,151,224,162,
+158,113, 98, 14,210, 3,233, 46,229,117, 28, 41, 64, 58,197,145,129, 40, 7, 76,119,211,109,118, 77,146,229,196, 49, 98,176, 90,
+207, 8, 60,202, 50, 59,192, 35,198, 17,206, 7,120, 31, 16,130,216, 16,121,252, 46,130,145,218,232,194, 33, 22,187, 81, 65,148,
+ 70, 9, 90, 7, 19,250, 30,200, 57,131,165,204,156, 81, 76, 35,130, 16, 2, 77, 75,208, 35, 57,105, 92,237, 52, 20,194, 8,254,
+208, 24, 84, 70,182,134, 56, 80,167,236, 28,141,218,121, 60,187, 44,179,122, 48, 3, 35, 8, 29,219, 42, 42, 43, 57, 87,136, 1,
+181, 92,248, 96,120,127,196, 74, 74, 67,156,103,231, 44,102, 86,115, 58,142,249, 28,199, 81, 65, 13,133,153,239,162, 16,149, 93,
+161, 53,188,183, 19,109, 7,119,249,214, 90, 24, 14,120,209,145, 94,202, 60, 30, 35, 13, 66, 8, 52, 14,164,145,148,213, 75, 92,
+248,202,181, 20, 52, 99,112,231,222,171,120,239,199, 63,199,215, 95,190,192,233,243, 75,236,247, 9,193, 37, 44, 23,191, 69, 73,
+179, 94,222, 70,246,177,214,195,170, 87, 81,252,165,134, 85,167,236, 73, 45,132,182,172, 60, 85, 49,142, 2, 32,188,243,236,199,
+ 38, 95,105,202,148,109, 94,138, 81,255,115,206, 5, 75,162,159,253, 60, 47, 26,196, 51, 12, 17,243, 68,138,245,156,178,142,200,
+ 74,149, 92, 87,104, 48,142,128, 71,122, 44, 35,161, 61, 3,127,173,224,143, 41,130,193,212, 42, 41,150, 99,132,243, 13,251,139,
+132,218, 12,174,175,175,224,156,197,253, 87, 79, 96, 99, 67, 28, 0, 83, 9,222, 33, 32,156,253,190, 33, 45, 25,211,110,198,167,
+159,126,141,211,243,107, 60, 61,187, 90,185, 13,232, 99,207, 75, 70, 12, 22,119,110,157,224,103,127,248, 35,248, 24,201,202,103,
+ 9,207,235,172, 69, 93, 22,114,126,248, 0,239, 44, 98,240,184,188,184,198,233,249,181, 22,134,223,187,127, 7,145,129, 75,213,
+ 68,128, 59, 35,187, 61, 65, 59,190, 9, 87, 22,196,237,136,102, 3,255, 12, 9,107, 91,155,195, 92,169, 96,120,235,173,251,120,
+239, 7,175,227,205, 55,239,224, 63,254,229, 47,240,253,247,223,192, 38,122,108,134,128,116,188,193,126,185, 66,216,239, 17,173,
+193,220, 26,134,193, 0, 28,150,132,182, 18, 10,213,170,123, 57,210,136,148, 85,120, 18,217,244,106, 17, 76, 43, 57, 67,212,186,
+ 90, 42, 90, 38,215, 65,169, 69,133,167, 50,181,129,237, 23,185, 30,102,102,133,213,108, 21, 21, 6,104,137,153,235, 6,214,208,
+115, 69,110,153,126,160, 67, 69,178, 12,187,226,253,127, 97, 11,165,227, 46, 57, 4, 46, 68,216,255, 46,220, 8,153,188,213, 10,
+164,165, 96, 24,233, 57,150,139,172,148,170, 69,182,116,231,109,181,202,171,149,164, 10, 98,189, 13,209,234,174,190,177,110,198,
+ 25,135, 16, 57, 61,145, 57,237, 37, 23,120,103,176,148,238,101, 10,129,222,101, 25,185,246,124, 4, 18, 62, 46, 53,235, 52, 69,
+138,252,162,171, 75,139,194, 56,107, 26,121,139,104, 22,156, 68, 71, 63,239,192,136,222, 56, 16, 50, 87, 98, 75,181,120, 83, 78,
+134,209,241,119,226,241,185,100, 91,180, 66,223, 63,217,226,154,238,215, 55,155,129, 29, 29, 78, 25,239,251,105,194,180,159,121,
+ 21,192, 33, 82,173, 11,220,188,119, 7,206, 45,175,151,119, 15,126, 89, 75,211, 72,173,158,217,210, 75, 63, 35,209, 41,208,249,
+212, 85,236,194,251, 79,203,220,137,137,192, 74, 3, 96, 87, 30,242, 85,250,153, 92,188, 44, 26,163, 34,171,112, 67, 70,226,101,
+237,204, 1, 93,175,174, 19,236, 84, 95, 96, 44, 33,174, 57, 73, 79,180, 93,208, 9, 85,183,104,202,101,143, 70,235, 60,211,253,
+111,170,189, 48, 2, 50, 91,189,139,198,172,195,101,192,123,118, 28,252,236, 36, 5, 81,157, 23,198,194, 26,139, 56,140,136,113,
+128,115,129,186,244, 16,224, 44,199,216,130,166, 3,222, 58, 75,249,214,181,161,181,172,121,230, 18, 99,168,213, 48,167,152,213,
+ 74, 52,183,121, 94, 52,166,177,178, 90,188, 7,165,116,245, 36,154, 97,251, 90,235, 23, 41, 95, 74,214,209,131,109, 29,117,201,
+ 96, 6,176,247, 14, 19,143,173,209,170, 10, 54,188,183,136,209,235, 40, 52,165,110, 36,164, 88,208,218,105,109,221, 73, 64,233,
+ 67,131, 99,193, 15, 41, 76, 73,212, 36, 32,142,195,177,189, 40, 24, 11, 11,224, 90,173,176,129,168, 61,150,247,113, 84, 25,117,
+251,136, 42, 42, 88,100, 68, 29,189,225,209, 9, 84, 73, 79,225, 47,153, 31,206,158,212,245,250, 59,239,226,205, 31,124,132, 47,
+ 63,123,138, 39,143,207,201,198,227, 38,164,171, 47, 81,203,194,194, 11,167,100, 33, 26, 48,175, 41,112,142, 15, 63, 30,231, 84,
+131,153,247,190, 96, 21,102, 74, 5,109,166,120,219,181,178, 85,170,217, 82,233,176,174, 13, 60,178,236, 93,160,172, 29, 90, 35,
+191,186, 11,180,199,172,124, 41, 11,217, 73, 68, 78,173, 85, 30, 75,211,158,207, 59,122, 14,132,145, 45,170,124,177, 84,145,198,
+193,234, 97,212,106, 65,205, 51,114, 14,176, 28,170, 49,110, 34,174,246, 9, 46, 82,254, 54,150, 25, 25, 14, 67,164, 67,191,230,
+ 5, 79,158,158,227, 31,254,233, 51, 92, 79, 51,166, 41, 97,224,137,145,247,150,139, 79,250,122,239,222, 58,193,239,127,244, 3,
+ 12, 3, 21,138, 75,170,176,174, 17,241, 13, 36,184, 51,180, 72,132,177, 52,242,123,248,232,185, 86,217,181, 20,188,245,189, 87,
+121,215, 90,117,215,153, 18, 16,188,129,241, 14,110, 60, 65, 54, 13,166, 2, 1,148, 63, 79, 56, 97,154,248,212, 82,176,219, 39,
+196,232,240,195, 15,222,196,171,175,222, 66, 8, 30,167,207, 47, 16, 6,206,236,206, 25,129,211,199, 30, 93, 37,140,175, 17, 92,
+ 8, 76, 86, 19, 2,164,216,129,100,127,106, 12,131,144, 12,217, 43,133, 18, 38, 34, 36,152, 66,156,127, 5, 71,149,213,142,222,
+173,114,190, 1,163, 23,187,129, 53,140,117,134,236,140,165,240,109, 29, 82,101, 44, 44,199,170, 58, 23,248, 29,160,201,135,248,
+137, 73,216, 42, 62,110,192,201,193, 38,180, 60,230,124,203,182,180, 53, 82,108, 55, 62,232,156,119, 24,199, 65,249, 22,206, 83,
+ 78,119,101, 81, 42,133,186,208,154, 37,231,196,177,189, 22, 3, 79,176,104,175, 91, 72,151,210, 58,174, 57, 70,202, 1,240,190,
+175,237, 12,179,212,211, 34,201,142,244, 94, 9,113, 80,127,246, 60, 78, 71, 51,152, 57,155,220,240,101, 40,221,186,186, 8,100,
+ 44, 15,225,201,211,133, 73,238, 21,154, 22, 24,214, 49,201,179, 21, 3,187, 6,120,212, 76, 54, 93,163,192,175, 90,123,104, 85,
+201, 92, 92,167,172,116, 79, 31, 60,182, 71, 81, 11, 51,185,228, 82,206,104,149,112,181,251,253, 68,211, 27, 46, 12, 66, 8,138,
+ 38, 38,225,107, 85,225,154, 93,165,249,145, 20,203,194,122,187,178, 60, 26, 94,233,201, 36,145,248, 15, 98, 53,108, 10, 73,162,
+208, 42,231, 44,230, 37,105, 7, 92,107,101,198,131,225, 40, 86,167,150, 75, 17, 23, 66,211,203,136,114,214, 51,200, 29, 92,147,
+ 12,117, 62,107, 44,116,116, 46,229,128,124,157, 13,253, 44,196, 10, 80,211,208,180, 40,173,171, 40,226, 53,150, 85, 56,234,109,
+197,144, 23, 75,154, 85, 34,129,170,236, 86,169,149,185,211, 0, 69,240,103,176,226,204,247, 41,236, 48,110,169, 51,119,158, 39,
+155,158,105,139,172,157,224, 9,150,181,150, 2, 93,136, 76,196, 22,179, 74,225, 30, 30,157,254, 35, 29,165, 40, 17, 43, 3,254,
+115,206, 36,192,226,200, 68, 81, 99,247,168, 81,199,151,111, 81,219, 68,230,151, 64,208,133,196,162,166, 74,195, 59,122, 65,151,
+ 37,233, 65,179,223, 77, 60,178,117,170,246, 36, 90, 29, 16, 3, 69, 41,150, 90, 52,138, 85, 82,211,156,183,200,198, 48,228,197,
+118, 86, 46,132, 64,199,217,202, 43,168,130,243,172,116, 87,190,240,106,223,209, 64,182,157, 74, 69,143,170, 26,249,101, 33,155,
+ 29, 65, 93,114, 41, 42,160,169,170, 87,232,213,112,109,146,252, 75,151,229,123, 31,253, 62,182, 55, 94,193,111, 63,121,132,179,
+179,107,178,249,153, 11,212,253, 99,160, 21,120, 31,213, 17, 64, 2, 45,163, 62,124, 37, 79, 57,187, 82,180,178,183,184, 74, 74,
+ 84,165, 41, 71, 41,176,177,211,200, 28,195, 56, 4,132, 39, 47,248, 50, 83, 96, 78, 45, 21,227, 56,112, 26, 84, 83,209, 80,145,
+ 46, 60,103, 46, 22, 18,115,156, 11, 9,225,248, 82, 22, 1, 33,165,112, 69,130,246,136,213, 70, 67,132, 9, 11,219, 84, 84,213,
+144, 89,244,211, 90,198, 56, 4,108,142, 6,148,218,144, 43,161, 20, 47, 46,246, 56,218, 4, 26,135,213,134,105,166, 61,230,215,
+ 95, 63,193, 63,255,234,115,204, 11,253,140,130, 39, 10, 92,169, 21, 45, 53,141,194,252,225, 59,175,226,207,254,155,159,192,123,
+135,203,171, 5,215,187, 5, 46, 58,160, 20, 20, 88,100, 94, 61, 12,129,178, 2,140, 1,246,251, 5,159,125,241, 84, 41, 94, 55,
+182, 35,222,184,127,139, 66,126,172, 37,219,166,115, 88, 82, 65, 42,228,142,168, 75,194, 38, 58,152, 70,194, 40,103, 45, 39,157,
+ 1,206,210,237,126,113,118,197,135,140,197, 38, 90,124,252,215,127,135, 99, 87,113,252,214,235,184,249,234, 93,184,203, 29,114,
+105, 56,155, 50,158, 76, 51,222,181,125, 63, 88, 43,117, 62,181,244, 93,183,138, 68,209,159, 99,233,220,235,234, 82, 65,169, 4,
+ 37, 49,134, 67,131,172,174,136, 10, 67,147, 68, 76,215, 12,173, 68,172, 6, 14, 97, 21,145,107, 15,130,141, 36,156, 39, 37,214,
+121,128, 68, 66, 33,132,149,158,134,247,132, 28, 75,186,206,154, 22, 68,168, 93, 5, 74, 25, 14,239,161, 38,195,179, 91,134,153,
+ 12, 32,251,163,115, 30,113,136,240,193,169,192, 77,118,250,148,171, 62,174,172, 72,189,179, 52,177, 39,204,165, 36,225, 37,166,
+ 63,239, 60, 46,157,167,164, 93,153, 56,103, 44,139,252, 90, 46, 44,216, 51,236,182, 41,250, 57, 10, 39, 87,138,186, 90, 0, 63,
+148,149,158, 0,239, 52, 25, 78,199,242,181,175,177, 26, 79, 17,192,214, 95,195,182, 46, 65,227, 46,105,230,208,150,164,121, 9,
+210, 48, 58,239,177,217,110,116,202, 33,133,133,136, 63, 97, 12,174,175,246, 52,157, 97,193,160,120,224,181, 43,230,139, 55,120,
+182,165,114, 49, 78, 26, 8,167, 35,231, 82, 42,224,173, 98,156,151, 37, 49,159,160,112,195, 85, 86,138,124,126, 7,156, 67,229,
+244, 76,154,208, 46, 52, 37,211, 73, 40, 7,242,212,166,150, 99,231, 2,188,231,179,134,237,124,204,239,212, 38,100, 77,123,171,
+171,155,214,172, 56, 14, 52,190,127,169, 11,111,141, 32,106,194,101, 41,245, 64, 84, 39, 23, 58, 86,240, 25,105, 18, 14,214, 96,
+171, 72,225, 90,215,239, 38,123,243,209, 39, 86,135,196,120, 14, 6, 99, 16, 24,233,180, 6, 12,227, 6, 33, 12, 44,130,244, 92,
+204, 27,196, 16, 14, 82, 51, 45,120,181,172, 22, 47,126,226, 43,197,111,145, 21, 73,204,239, 6,176,193,116, 80, 64,105,106,133,
+104,172,152,151,221,217,126, 55,117,201,191,165, 46,137,108,106,125,207, 76, 35, 14,171,223,200, 48,142, 42,214,178,204, 85,174,
+173, 98,222,207,164,144,110, 34,162, 33,241, 30, 93, 26,156, 3,237, 45, 76, 37,212,170,147, 93,150,181,112, 43,220, 30, 49,156,
+ 89, 44, 18, 61,137,108, 66,224, 21, 0, 61, 92,106,109,121,137,126,149,115,134,231, 95, 84, 78, 5,155,237, 8,239,237, 1,118,
+ 81, 94,154, 90,233,229,215, 8, 76, 57,232, 26,186,178, 22,253,161,218, 30,111,241,225, 31,254, 12,251,201,224, 55,159,124,131,
+171, 43,202, 13,246,245, 57,234, 66, 93,161,143,131,218,224,156, 51,240, 49,104,130, 17, 21, 14,150, 5, 64,208, 17,167,181,238,
+ 32, 64,194,112, 46,118,107,142,139,148,170,144, 6, 99,161,126,246,214,138,102,155, 75, 2,223, 60, 47, 12,219, 1,219,138, 72,
+184, 51, 77,115,127, 28, 45,141,204,164,203,118,214,210,224,194,146, 56,199,123,175,121,236,237, 96, 60, 7, 61,164,188,167,130,
+136, 14,170, 4, 3,131,113,140,104,150,214, 50,187, 61,185, 23, 74,109,152,115,198,178, 20, 68,111,224, 13,237, 91, 81, 42,230,
+ 57, 33,241,129,186, 44, 69,247,179, 98,171,114,214,225, 15,126,244, 54,254,224,247,222,134,115, 22, 67,244, 24,238, 4,220,184,
+ 49, 98,154, 18, 22, 94, 83, 80,144, 15, 65,143,198,145,168, 90,159,125,246, 8, 47,174,247,136,209,195, 89,139,119,190,119, 15,
+ 71,219, 1,198, 91, 68, 68,202, 29,135,193, 16, 88,131,194, 72,214, 92, 10, 70, 79,222, 96,103, 13, 12, 44,218,178, 32, 47, 9,
+203,126,194, 38,122, 44, 25,200,243,140,203,175, 30,163,238,102, 92,123,139,103,167,159,227,248,238, 41, 94,189,127,130, 0,131,
+127,122,112,137,241, 8, 8, 67,208,131,183, 11, 92,173,186, 61,196,210, 36,116,178,202,208,142, 34,227,245, 66,151,147, 31,142,
+ 56, 52,200, 29, 8, 92, 5,242, 1,201, 74, 55,178,138, 34,112, 15, 69, 35, 67, 99, 99,165, 99,171, 28, 44, 99,180,176, 44,122,
+ 96, 69,222,247, 54, 0,110, 5,212, 38, 2, 98, 81,154, 22,217, 75,171,198,151, 2, 21,214, 54, 94, 59, 12, 88,230,132, 56, 90,
+118,188, 20,132,208,224, 24,223, 28,162, 95, 49,221,141,102, 42,148,131,139,168,123,133, 61, 59, 95,156, 51, 74,149,140,209, 43,
+ 14,213, 49, 16,136, 70,239, 25, 33, 88, 76,123, 81,181,247,192,151,202,214, 71,234,150,165, 97, 97,204, 50, 95,178,142,119,194,
+180,102, 12, 12,199,114, 24, 54,163, 82,238,140, 53, 74,194, 52,166,168, 29, 45,142, 68,119,155,167,133,214,104,153,178,200,107,
+201, 88,230,180,178,246, 90, 14, 20, 34,174, 70,136, 3, 77, 78,121, 10, 71, 33, 47, 84,224, 79, 19, 65,165, 72, 97,223,244, 89,
+161,143, 19,176,164,140, 16, 60, 18, 23, 42,206,137,122,220, 43,233, 48, 70,163, 57, 25, 69,178,220,249,114, 35,224,213, 33, 77,
+208,241,244,150, 46, 97,187,138,161,109, 10,255,146, 96, 26, 99, 56, 13,148,159,107,141,183, 46,101, 69, 26,101,205, 83, 43, 48,
+ 21,186, 42, 57, 96,191, 27, 3,167, 29,181,237,194, 81, 0,173, 57, 62, 7,125,183, 10,178, 80,216, 57,219,195,110, 90, 61,136,
+ 96,237,163,127,113,114,208,125, 99, 86,151,183,218, 30, 91, 15, 57,106,170,136, 95,121,230,185,200, 49,104, 26, 55, 13, 22,149,
+142,227, 6,222, 15, 24,134, 1, 62, 68, 86,185,155,190, 83,231, 92, 21, 97,175,136, 13,181,214, 12,111,157,103, 17, 4, 39, 54,
+101,242, 95, 59,231,184, 98, 47,138,128,244, 44,184,114,193, 33, 39,254, 34, 45, 86, 48,121,202,201, 45,133,136, 65,212,253,146,
+141, 65, 70,239, 82,181, 18,167,217,193, 27,143,113, 35, 36, 57,207, 93,166,195,180,167,177,217,180,159,244,112, 50, 98,229,209,
+212, 47,186,204,169,211, 22,159,119,133,231,253,152,179,182,143,140, 60,117, 3, 85,162, 85,105,104,174, 93,122,169, 21,145, 81,
+183,166, 90,173, 74,187,170,150, 40,108,210,241, 59,111,216,242,103,148,136, 84, 50,123, 92,185, 80,144,248,196,182, 30, 1,241,
+ 3,242,202,253,251,248,224,199, 63,198, 55, 15, 46,240,232,225, 25, 95,212, 5, 54, 63, 69,201,215,196,220,175,108, 93, 17,149,
+113,115,224, 33, 5,143,220,141,218,227,192, 99, 44, 70,166,243,154,193,178,143,191, 39, 21, 9, 43,160,214, 30, 67, 75, 93, 67,
+230,203,157, 3,109, 26, 9,168,164,170,167,106,184,251, 49, 27,219,217,100, 45, 34,196, 65, 81, 56, 12,227,134, 63,191,215,160,
+ 23, 24,232, 88,148,112,171,204, 29,119, 52,202, 47, 37,163,149,140, 97, 24, 96,141,193,146, 44,246, 51,197,174, 6, 78,218,195,
+ 74,105,124,149, 42,198,104, 49, 14, 21,193, 91, 21,238, 8,209,204, 27, 96, 97,228,238, 56, 4,252,236,167,239,227,221,183,239,
+163, 90,224,252, 98,194,149,157,176,221, 12, 24, 55, 1,199,219,128,156, 28,230, 76,163,116, 58,127, 88,141,189, 44,248,197,167,
+ 15,177,217, 12,188,151,183,120,235,173, 87,169,112,225,145, 45, 93,124,149, 89,224, 68,246, 41,203, 2,164, 5,109,160, 84,182,
+105,183,135,171, 20,144,212,114,129, 31, 2,130,179, 8,206, 34,239,174, 81,230, 25,115,169,152,115, 67, 78,192, 89,187,198,105,
+ 5,218,229, 21,126,241,236, 26,183,239,121,141,230,236, 43,162,172,227, 87, 69, 19,151, 46,102, 92,150,153, 5,112,185,103,100,
+163,193,175, 28, 24,114,152, 8,213,171,241,184,188, 19,234,232, 89, 19,120, 16,117,210,224,152,214,254,247,105,252,158,245,226,
+ 44, 44,220,211,247,223, 19,104, 70, 98,177,122, 78,116,247,169,175,243, 32,132,151, 96,154,197,126, 63, 97, 24, 6,164,133,196,
+ 64,162, 83, 9,222, 97, 24, 7,125,223, 8,160,226, 84, 72, 22, 98, 64,157, 22, 44,115, 70, 28,131,238,109,125,164, 6, 33, 39,
+201, 33,160, 38,220,179,147,160,115,202, 91,119, 7,112, 4, 52,173, 12,120,111,234, 27,176,116,234,154,230, 70,240,152,188,175,
+ 45, 43,210, 82, 49,140, 1,227,134,247,227, 44,208, 51, 60, 65,162,206,159,246,194, 62, 24,245,169,239,174, 39, 24,211,176,223,
+ 77,180, 51, 79, 11, 26,107,117,198, 13,173, 32,136,184,103,123,214, 72,109,100,253,227,194, 66,172,106, 57,101,162,185,173,196,
+174, 26,173, 45,232,217,149,131, 64, 46, 50,129,234, 84,222, 51,147, 45, 57,171, 30, 65, 71,241,102,165,167,226,241,189, 76,141,
+132,199, 33,209,202,146, 16, 41,163,107,199,226,233, 16, 34,114, 78, 7,222,111, 25,243, 31, 98,135, 89,239,101, 61, 26, 42,156,
+ 13, 42, 14,149, 73, 79, 59,184,200, 1, 99, 59,100,200, 52,187,202,140,239, 84, 76, 29,171,211, 83, 77, 23,186, 61,204,131,177,
+198,105, 66, 31,197,145, 59, 21,125, 98,117, 89,195, 64, 87,216, 26,242, 98, 59,163,194, 88,195, 43, 95, 10,151,114, 62, 96, 24,
+ 54,136,195, 8,239,131,174, 85, 67,136,135,153,110,214, 42,196, 77,222,125,177,115,122, 17, 32, 72, 53, 27,135,240, 18,120,159,
+118,201, 26, 45,200, 59, 32,177,167, 73,183, 70, 9, 76,244, 0,133, 16,116,183, 64,135,185,213,228, 37,241,165,202, 40,125, 28,
+ 3, 54,155,145,136, 78,188, 47, 73,243,172,187,161,198, 81, 72,194,188, 37,239,183, 67,224, 84, 39,103,165,131, 23,200, 10,253,
+ 16,156,181,148,247,205, 80, 24,177,204, 20,206,248, 54, 26, 98, 67, 39,201,102, 51,232,215, 78, 26,129,176,170,182,170, 50,167,
+ 7, 62,160, 13,243,158, 19,227, 33, 75,238, 25,201,242,226, 59, 86,200,211,184,205,178,159,222,224,237,247,223,199,171,111,190,
+139,207,127,243, 12,103,167, 87, 76,223, 90, 96,210, 35, 21, 5, 86,217,243, 8, 78, 87, 44,113,206,161, 84,135,146,232,224, 22,
+219,139, 5,237,209,197, 38,100, 33,105,115,141, 61,241,134,169, 89,149, 43,253,194,122, 8,186,160,209,138, 10, 82,114, 46,152,
+247,179,134,180, 24,219,208, 56,228,132,196, 51,137, 53, 3, 50, 5, 73,154,170, 39, 1, 16, 97,136, 93, 20, 98, 13,172,241,170,
+150,182,214,194,242,248, 51,231,130, 92,168,115,117,206, 34,140, 35,134,113,164, 19,214, 2,184,172,136,129, 88, 7,214,208,168,
+ 61,115, 18,160, 5, 48,205, 52, 85,218,142, 30,251,253, 2,163,235,162,134, 31,190,113, 11,159, 61,190,196, 62,101,164, 84, 48,
+207, 25,187, 41,209,250,164, 17,138,183,154,140,210, 12, 66, 48, 8, 14, 24, 96,208, 66, 84, 1, 90, 45, 21, 15,158, 93, 81,152,
+203, 74,135,112,251,246, 13,174,150,169,140,137, 30,100,173, 27,131, 70,143,238, 77,192,139,165,226,250,244, 18,131, 7,124, 43,
+216, 68,131, 60, 47,204, 91, 15, 40, 67, 64, 43, 25,121,218,227, 60, 37, 60,153, 19,246, 12,131, 50,245, 28,126, 54, 48,166,226,
+214, 27,130, 46,229,136, 90, 25,215, 53, 40,195, 97, 89, 22,221,141,231, 76,221, 28,233, 55,186,232,168,234, 36,167,194,219,174,
+ 2,151,247,145,222, 85,186,144,170,116, 23,132, 58, 99,184, 75, 99, 29,133,213,189, 61,157,127, 2,167,177,108,139,229,140,238,
+146, 81, 91,195,104, 54, 12, 49,137, 10,140,178, 28,242, 35, 98,209,181, 71,183,105,184, 80,161, 76,117, 31, 48, 47, 11, 9,120,
+115,233, 7,190,233, 29,112, 28, 60,246,187, 25,219,163, 13,156,167, 34, 37,250, 64, 54, 59,211, 20, 11,173, 35,108,153, 30, 24,
+254, 94, 45,212,237, 82,185, 75, 23, 16,148, 0,109,140,137,122,232,147,184, 13,188,162, 97,122, 93,140, 36, 46,171, 89,207, 75,
+225,219,135,104, 87,211, 52, 90, 13,202,153, 81, 43, 49,190, 75,174, 61,189,144,179, 16,168,216, 42,204, 88,247,136,131, 87, 61,
+147, 40,252,231, 57,241, 68, 17,168, 57,179,123,160,169,138, 93,113,175,173,155,189,100,125, 67, 17,205, 21, 41,167,213,184,124,
+109, 33,230, 85,112,163,189,122,230, 41,132, 83, 53,183, 56,144, 58, 97, 83, 5,117,132,160, 96,180, 43, 84,233, 47, 93,181,129,
+ 69,169,153, 69,115, 77, 83,249, 76,173, 36, 66,229, 80,152, 46, 24, 51, 42, 44, 3, 23,222,224, 40,110, 81,178,215,182, 22,196,
+ 85, 56,190,200, 69,216, 70,120,228,118, 96,211,182, 43,160,140,136, 80, 41,195,224,165,117,184,138,221, 44,154, 41,234, 68,146,
+181, 34,212,214, 86,149,150,167,155,198,202,145,229,104,108, 65,102,177, 97, 12,112,142, 20,236,162,102,143,195,160,238, 42,209,
+148, 88,199,192, 34,209,123, 25,179,154, 8,203,115,221,224, 83, 42, 26,144, 66, 22,151, 76, 35,162,148, 21,148, 34,204, 99, 33,
+184, 25,205, 26,150,192,136,130,138, 76, 89,232,141,195, 58, 86,251, 5,121, 1,214,213,133,176,214,157,247,154,128, 38,246,139,
+204, 22,145,101, 94,116,188,219,152, 70,229,130, 99,120, 66, 83, 1,130, 96, 25,101, 23, 86, 75, 69, 81, 64,144, 81,229, 99, 63,
+192, 86, 9, 78, 13,240,220, 45, 82,231, 75,163, 96,242,193, 58,180, 82,145,115,197, 48,112, 96,138,190,224,230,160, 58,135, 1,
+230,169,135, 23,144, 34,215, 40,137, 45,231,130,163,227, 35,252,232,167, 63,129, 15,199,248,237,175, 31,225,226,197,142,159,162,
+ 75,164,233, 25,156, 39,175, 60,237,170,105,172,226, 56, 56, 66, 42,210,204,163,242,106,233, 48,169, 92,136,228,210, 52,203, 93,
+156, 5, 50,242,183,134, 38, 38,114,136, 24,211,187,117, 72,160,135, 53,172, 40, 78,164,232,229, 41,131, 88, 99,140, 53,220,205,
+147, 35,193,240,184, 75,248,208,173, 53,238, 26, 60,103, 95,211,222,207, 75,250,148,120,152,141,209,131,107,158, 39,228,133,138,
+ 24,218,135, 18, 39, 64,212,170, 37, 87,212,156,145,167, 25,182, 21,148, 37,163, 36,177, 21,145,178, 84,178,140,200, 30, 73,187,
+ 59, 81, 18,159,220,185,133,159,191,249, 6,254,250, 63,253, 2,198, 0, 95,124,249, 8,183,238,220,196,201,201,182,231,203, 87,
+ 0,169, 32,229,134,113, 28,200, 90, 85, 41,137,205, 25,131,139,139,107,252,237,223,253, 90,127, 30,181, 52,220, 56, 30,177,221,
+ 6,204, 11,193, 60,130,179,128, 51,112,141, 99, 39,157,131, 65,197, 29,151,112, 35,238,241,252,234, 18,159, 63,206,152,138,193,
+141,173, 71,222, 95,225,249,229, 41, 54, 27,135,134, 2, 88, 22, 31,109, 26,236,145,197, 70,154,217,149,224, 38,243, 26, 74,220,
+ 29,133,217,217,100, 61,203,122,248,211,120,157,131, 95,248, 2, 17, 63,186, 20, 59, 48,158, 58, 22, 30,109,202,127,183, 12,131,
+ 66,181, 40,173, 80, 14, 4,167, 32, 30,216, 71, 69, 85,189,202,134, 22, 73,144, 6,241, 88,138, 5,149,113,253,178, 76,172,219,
+233, 30, 95,222,209,241,101,235, 85,191,178, 70,109, 75,174,123,206, 9,131, 27,176, 44, 51,150, 52, 32,164,140, 56, 52,221,219,
+138,119,204, 57, 96,153,103,253, 56,214, 38,254,122, 43,124,112, 10,225,107,181, 11,197,106,147,188,118,168,136,109,173, 79,209,
+213, 97, 19, 75, 88,209, 81,115, 41, 4,191, 74, 75,226,194,179,147, 54,107,101,107, 87, 21,110, 57, 77, 58,197,187,109, 12, 56,
+ 34,213,106, 88,203, 52,205, 58, 78,151, 17,181,229,196,180, 24, 7,214, 21,208, 33,158, 19, 93,244,162, 71, 89,230,132, 6,234,
+232,115,202,140,135,245, 36, 20, 13, 1,227,224,137,118,183, 20, 38, 1,250,222,105,243,101,105,184, 89,178, 44, 20,244,222,253,
+255,100,189, 73,147, 36,215,189,221,121,238,232, 30,145,145,153,149, 89, 3,166, 7, 2,143, 32, 65, 82,124, 67, 83,175,219,100,
+109,210,166,205,122, 39,211,162, 23,250, 52,189,225,119,235,109, 47,212,207, 36, 25, 9,129, 32, 64,176, 48, 87,229, 24,225,195,
+157,122,241, 31,174, 39, 69, 51, 26, 73,176,134,204, 72,247,123,255,195, 57,191,195,157, 61,148, 56, 41,204, 11,131, 70,235, 80,
+ 17, 62,243,253, 32,176, 25,185, 51,160,233,127, 77,133,216, 70,233,119,124,207, 48,218, 88,138, 69,103, 27,130,247,244,207,107,
+209,103, 42,165,188, 17, 98,115, 50,167,228, 76, 24,192, 62, 97,186,119, 59,152,243, 34, 6, 47, 58,142,119,182,135,181,202, 51,
+169, 59,112,165,203,113, 17, 43, 26, 42,131, 13, 88,198,232,136,221,232,120,157,245, 11, 72, 44,108,110, 42, 40, 53,222,108, 50,
+220, 89,212,230, 3, 11,223,232, 34, 31,134, 65,133,168,222,210, 59, 41,196, 61, 33, 65,202,136,159, 62,111,175, 77,181, 68,133,
+123,202, 24,230,136, 69, 38,215,104,236, 40, 87, 95,148, 30, 22, 72,101,171,105, 95, 86,237, 35,222, 59,164,106, 55,234, 75,211,
+ 95, 82, 39,201,103,221, 30, 7, 85,176,146, 98, 53,142, 81,161, 35,242, 97, 81,156, 32,141,132, 67,244, 26, 39,104,216,163, 75,
+255,156,241,181, 85,130, 79,248,242,227,174, 49,167,196, 15, 23, 89,220,228, 32, 18,207, 36,125,239,130,144,164, 29,205,186,214,
+ 39,161, 2,173, 53,134,219,208,139,228, 88,192, 32,212, 36,108, 81,127, 32,127,109,140,129,158, 46, 6,175,132,224,240,252,213,
+ 43,252,250,159,255, 9, 63,253,240,136,215,159,125,141,121, 78,128, 5, 76,121, 11, 91, 31, 97,130, 87, 54, 60,140,219, 64, 29,
+ 28,156,231, 49, 56,175, 57,200,167, 44,214, 31,143, 6,203,121,212,134, 3,104,108,167,241,241, 65,180,204,180,151, 79, 43,193,
+126, 40,245,138,148,209,165, 84,172, 75,214,207,176,113,184,207,186, 36, 86,235, 23,212, 84,153,163,159, 53,222, 82,188,235,227,
+ 24,181,114, 23,214,187, 15, 65,167, 44, 0, 16,134,129,119,220,108,151, 91,137,235, 76, 7,150,103, 75, 97, 6,248,249,171,156,
+103,110,177, 71, 91, 39,148,165,194, 25, 15,111, 65, 89, 4,173,251,113, 67,244,202, 75, 88, 20, 22,100,225,199, 61, 46,159,157,
+227, 23, 63,127, 31, 95,126,245, 61,230,148,240, 95,254,191, 63,226, 31,255,225, 19, 92, 95, 93,170,168, 51, 87,131,181, 84,148,
+ 70,187,211,232, 45, 28,143,228,254,244,213,143,152,215,172,235, 2, 99, 12,254,254,195, 23, 24, 57, 10, 52,167,194,159, 19,173,
+ 63, 44, 26,144, 19,214,159,190, 87, 7,201,176,206,248,232,114,135,219,226,240,175,159,125,139,215, 63,222,225,197,115,131,119,
+ 71,131, 24, 58, 1,177, 85, 40, 39,162, 50, 24, 67, 1,152,146, 25,224, 26,219,140, 88,181, 94, 10,106, 43,252,110, 86, 29,107,
+107,225,187, 17,205, 9,104,198,250, 17, 4, 4,176, 20,176,100, 29, 39, 48,242,255, 54, 6,182,113, 7,165, 73,101, 18, 94, 4,
+ 5,199,136,178, 89,172,130,116, 54, 20, 78,214,235,168,203,170,240, 14, 67, 98, 40,231,184, 75,183,128,161,137,209,202,159,149,
+115, 94, 15,104, 85, 5,243,216, 59,231,130, 97, 24,122,113,185,172, 56, 89, 26,191,123,239,177, 46, 25,227,126,228, 48, 41, 67,
+207,121,202,112,205, 97,220,121, 44, 75,214,176, 24,177,188, 73,132,243, 54,211, 92, 50, 25,104,245,213, 84, 51, 4, 52, 22,150,
+210, 30,157, 10,220,140,172, 66, 96,171, 77, 6, 0,141, 27, 21,117,124, 90,147,186,105,248,199, 11, 99,154,250,231,173, 51,252,
+ 46, 53, 68,230, 77,108, 17,165, 66,128, 92,151, 68, 40, 94,142,135, 21,186,220,214,134,102,140,193, 48, 68,130,232,176,215, 94,
+ 2, 63,232,235, 43,155, 0, 18,202,188, 23, 93,212, 22,226, 66,170,247, 64, 26,150,232, 57, 32,203, 50,252,168, 50, 0,172,105,
+ 14,130,224,193,183, 19, 15,225, 16,212, 82, 0, 30, 23,115,120,184,166,107,182, 90,225, 5,158, 35, 77,135,116,230,206,111, 2,
+ 93, 54,197, 1,119,220,202, 9,128, 48, 73, 12,219,139,155,250,219,157,181, 40,141, 19,225, 84,131,210,243, 67,172,161,233,129,
+ 85,119, 17, 39,119,130,132,188,116,150, 75, 19,200, 77,155, 20,163,216, 40,227,249,239,118, 46,118, 94, 59,127,125,180,154,101,
+253,136, 33, 55,135, 15,145, 73,112,129,197,227,145,147, 34,155,230, 56,200,100, 75, 10, 31, 73, 12, 5, 23,157,116, 23, 23,110,
+136, 26, 5,186,148,146, 85,109, 72,213, 63,143,165, 88,165,220, 28,239,134, 69, 33, 56,120, 14, 53, 48, 88,151,202,246, 39,203,
+ 42,103,163, 21,154, 84,183,165, 84,142, 25,109, 79, 96,247, 80,209,138,127,114,128,213, 82,176,242, 8, 94, 18,194, 42, 67, 43,
+ 12,149,199,154,128,102,248, 50, 54,214,233, 15,193, 40,102,207,194, 7,171,202,206,156, 51,206, 14,123, 21, 59,136, 72,199,114,
+ 2, 27,189,176, 84, 1,199,129,166, 21,226,169, 20,241, 67,169, 13,196, 25,177, 24, 68, 25,206,187,105, 2,166, 4,254,126,189,
+190, 64,191,254,199,127,131,139,231,175,240,197,231, 63,224,225,110, 34,111,168,171,104,137,130, 58, 68,100,147,249,176,241, 33,
+240,222, 5, 10,234,111,205,110,236, 23,116,193,109,163, 93,121, 58, 10, 99,105, 28,107, 25,224, 33, 65, 19,134,149,183,214, 26,
+204,211, 2,103, 41,117,204,123, 11,148,198,148,181,220, 21,210, 34,244, 97, 53,191,208,240,198, 93, 84,150,184, 80,246,172,149,
+252, 95,163, 62,205,117, 93, 17, 7,254,181,214, 18,188,165,100, 44, 51,141,133,157, 53, 24,134, 1,113,136,228,113,103,168,209,
+186,172,212, 53,149,140, 86, 10,230,135, 35,194,224, 96,141, 71, 13, 30, 67,244,136,193, 33, 39, 98,166,193, 91,245, 95,239, 15,
+123, 92, 95,157,147,123,194, 24,148, 74,234,215, 15,222,127,133, 31,126,188, 5, 12, 9,134,190,248,226, 53,206,255,151, 3, 28,
+ 19,198,168, 35, 50,180,203, 46, 9, 37,122, 4, 83,241,248, 56,227,139,175,190,131, 76,179,168,107, 53,120,249,226, 74,109, 52,
+ 22, 84, 72, 24, 23,144,151, 5,246,238, 13, 60, 10,234, 90,200,174, 25, 60, 30,239, 19,154,205,136, 47,158,227, 87, 31,191,194,
+ 97,140,120,253,211, 3, 62,255,114,193, 7,239, 26,156,237, 91,135,100,176,231,220,112,208, 14, 52,250,147,220, 32,180,103, 93,
+181,216,234,108,235,246, 36,190,147,198,131, 80,141, 3,159,148, 68,118,243, 3,156, 15, 12,128,225,170,223, 57,148,210, 51,155,
+ 75,133,146,235,176,205,119,222, 8,134,250, 69,214,189,215, 77, 25,238, 61,213, 77, 61,187,198,116, 42, 90,219,170,187,141,134,
+ 95,200, 89, 68, 34, 52,246, 72,171,194, 25,228, 90, 97,246,185, 15,145,167, 19, 5,243, 52, 35,196, 1,235,178,194, 24, 75,228,
+ 54, 99, 49,238,162,198,164, 26, 78, 25, 20,187,152,105,125,154, 40, 83,183,156, 10,133,149,160,171,155,173,170,214,161,147,192,
+180, 22,181,142,201, 10, 65, 38,134,141,241,167, 33, 58,141,140, 53, 6, 88, 83,129,133,229,139,189,232, 57,228,189, 35, 26,156,
+ 53,132,186,229, 75,195,139,109,180, 54,181,220, 53,246,177,147,157,142,198,236,105,205, 42,220,243,236,204,145, 21, 67,136, 81,
+191,102, 90,203, 84, 56, 71,147, 9,154, 40,244, 4, 54,243, 55, 17,164,149,133,112,181, 80, 46, 66,101,224, 12, 37,176,121,216,
+218,161, 45,181, 62, 37,142,246,130,194,179, 32,143,158, 39,105,218, 40,161, 82, 66,160, 42, 50,175, 67, 28, 11,139, 41, 16,134,
+ 66,160,132,234,153,153,252, 73, 24, 98, 38,184,137, 86,137, 59,105,197,187, 90, 79, 19, 72,198,124,183,214,224, 77,251,159,162,
+116,133,124,104,173, 3,228, 89,213,189,127,208,123, 76, 32, 56,134,173,139,242, 62,200, 59,106,173, 87,109,139, 15,129, 21,244,
+ 27, 40,145,177, 27,219,228, 8,235, 28,134,161, 91,212,188, 15,125,170,198,212,207, 24,153,131, 32,232, 39, 71, 56, 90, 69,161,
+139,200,145, 87, 38, 50,138,247,243,188, 62, 21, 92,113, 85, 31, 66,208,223,108, 29,117,189,222,123,234,236,114,229,177,114, 67,
+136, 30,235,146,180, 82,144, 31,170,116,214,104,128, 9,134, 3, 70,250, 56,183, 54,131,253, 46,176,186,207,243,104,138, 46, 3,
+241, 92, 22, 30, 99, 89,103, 17,140,213, 8,121,194, 67, 22, 61,100, 41,238,177, 41,209,136,194, 68,162, 10,196, 68,248, 51,178,
+160, 70,192, 14, 21, 44,174,226,234,186, 85, 22,138,240,131, 35, 2,158,224,141, 42, 48,189,167, 17,150,149, 8,213, 6,206, 64,
+175, 26, 2,129, 70, 2,187,195,249, 1,191,249,221, 63, 97,158,129, 63,255,143,239,112, 58, 46,244,162, 96, 66, 41,119, 88,215,
+ 69,137,125,118,227, 6,144, 56, 90,218, 35, 49,117,139,163, 32,101,185, 35, 47,182, 32,114,101, 12, 90, 57, 2,113,149,200,199,
+141, 37,145, 70,168,178,135,205, 42,134,179,155,206,144,246,136,149,139,140,204, 65, 21,108, 71,100,170,148,139, 65,173,106, 96,
+136, 71,227,226,131,132,135,212, 9, 56,231,144,121,135,159, 88,141, 94, 75,198, 48,208, 65, 43, 54, 56, 57,144, 72, 79,208,176,
+ 46, 11, 12, 40,169,106, 58, 2, 67,141, 48, 94,248,217,145,166, 31,251,161, 83,189,156, 1,140,195, 60, 77, 28, 8, 67, 66,169,
+196, 84,180, 97, 28,240,226,249, 37,126,248,241, 6,198, 90,220, 61, 28,241,167,207,191,198,167,159,126,196, 17,147, 52, 46,207,
+137, 70,231,203, 90,176,162,225, 15,159,191,198,196,227, 81,207,157,195,232, 12,230,251,123,188,110,100,211, 26, 7, 15,148,134,
+211,241,132,188, 44, 40, 55,143,112,140,197,141,214, 34,160, 98, 56,219,195, 94, 95, 97, 89, 19,206,246, 3, 62,254,240, 5,158,
+ 95,159,227,203,111,239,240,249,151,111,113,182,207,120,255, 29,139, 33, 54,205,147, 22,140,177,240,208,181,235,110, 77, 57, 7,
+242, 51,104,173,118,235, 14,156,238, 21,141,221,112,177,121,223,106, 93,132,143, 35,125,150, 78,222,111,143,194,120, 78,195, 0,
+158, 46,122,100, 78,127,109, 27, 65,155,172,120,122,241,188,245,185,131,119,234,194,164,246, 62, 48,126, 19, 61,225,175, 85,180,
+156, 88,174, 74, 19,175,234,158,194, 70, 36, 92, 73,138, 93,114, 71,208,138,136,162,159,169, 91,111,205, 32,156, 7, 22, 4,210,
+249,224, 60,137,235,140, 21,228,107, 96, 12,110,198,110, 79, 10,244, 16,157,194, 21, 8,114,227,245, 98,183,220,200,164,181,162,
+114,190, 4, 26,241, 5,104,167, 95, 24, 34,197, 90,149,210, 54,201, 92, 22,205,242, 4,135,241,161, 50,221, 40, 28, 11, 13,181,
+223, 66, 25,237,130,118, 37,173, 78,209, 46, 87, 58,230,146,139, 78, 48,107,173, 12,128,178,204,197,183, 8,134,154, 35, 87,248,
+121,112,178, 91,166,213, 37,117,127,235,230,179,165,159, 79, 74,153, 18, 38, 53, 74,153,190,214,186,172,106,149, 34,220, 52, 20,
+ 6,180,166,194,147,197,170,197,142,184,102,172, 19, 62, 63,180,187,150,194,175,150,170,201,126, 49, 4, 22,151,102, 56, 7,213,
+ 50, 37,190, 43, 44,231, 87,196, 24,121,239,238,121,197,211, 21,234, 34,154,147, 92,121, 3, 11, 23,232,130,115, 62,114,230, 64,
+161,213, 46,107,160,208,168,201,144, 28, 12,217,255,211, 25,151, 24,172, 22, 58, 45, 81,154, 62,190,168,173,115, 26,169, 43, 5,
+148, 56, 11,196, 21, 37, 8, 89, 18, 24, 6,206, 66,176,164,247,112, 30,113,160,119,208,135,216,193, 76, 34,176,227,191,175, 54,
+240,148, 69, 80,185,134,181, 17,153,255, 94,108,144,184, 77, 11, 51, 47,213,125,143,202, 4, 89, 54, 74,209,212, 49, 82,170,179,
+138,177,213, 13, 70, 15, 79,136,115,138, 41,172, 93,214, 47, 47,127,223,173,178, 77,134, 63, 8,231,221,147,164, 27,231,136,115,
+188,240, 40,201,109, 70, 66, 82, 41,202, 15,191, 53,249, 6,125,183,206,242,191,107,227,151, 7,134,241,175, 77, 3, 39, 28,239,
+182,188, 35, 76,105,140,129,187,186,214,133, 33,172,252,165, 81,110,120, 98,107,144,245,132, 19,171,128,207, 0, 0, 32, 0, 73,
+ 68, 65, 84,140,172, 83,202, 12,218,112,140,234,115,248,229,111, 63,197,187,127,247, 51,188,254,203, 27,220,221, 30, 49, 77,116,
+ 97,181,245, 6, 41, 79,155,168, 82,170,196, 36, 84, 71,126, 68,194,109, 54,155, 84, 33, 23, 44, 11,217,232, 97,166,106,155, 48,
+145,109, 3,233,177,198, 32,215,138,102, 28,251,234, 45, 31, 72,153, 39, 28,165,239,126,152,152, 37,196, 49, 81,180,147,150,194,
+ 41,111, 64,178,228,173,226, 60,153,190,197,149,172,136,102,228,231,106,157,195, 50, 51,109,176, 36,180, 86, 48, 12, 17,118, 8,
+253, 66, 41,148, 49, 13, 80,188,169, 32, 37, 5, 56,100, 93,195,227,154, 17,134,136,161, 26, 28,108, 69, 43, 11,108, 24, 81, 29,
+217,217,106, 93,145,171,135, 9,236, 93,118, 22,185,208, 88,106, 89, 18, 33, 94, 1,188,247,222, 11,188,189,121,160, 3, 3, 6,
+175,191,249, 17, 47,174, 47,240,236,250, 18,165, 53,162, 72, 49,121,173,149,134,239,190,125,131,175, 95,255,168, 57, 8, 11, 43,
+185,127,243,238, 51, 92,180, 5,109,126,192,177,156,227,254, 56,195,151,132, 56,142,132, 50,117, 30,199, 57, 99,201, 25,103,227,
+128,203,203, 11,156, 95,157, 83,238,244, 58,227,244, 56, 51,224, 39,226,147,143, 94,225,213,203,103,248,235,235, 31,240, 95,255,
+240, 19,222,121, 1,188,122, 81,213, 18, 73,133,178,221,140,208,229,249,112,202,161,110, 48,104,178,187,227,119, 82, 83,209,120,
+ 87,218, 4, 81,105, 28, 92, 28, 20,127, 76,187,245, 30,135,209, 32, 52,186, 46,114,149,113,167,236, 49, 53,195,186, 1,153,187,
+113, 73,137,170,173,231, 99,135, 32,211,128,190,103,109,220,165, 89, 67,201,133, 82,252, 9,131,161,182,250,132, 10, 73,251,235,
+117,163, 20,230, 24,225,156,116, 4, 95, 61,209,250,214, 53,209,222, 84,227,100, 9, 68, 51,157, 22,154, 46,193, 32,240,251,179,
+ 44, 89, 41,147,146, 76,233,125, 96,158, 61,233,106,150,185, 42,186, 86,186,195, 92,196,199, 79,207, 68, 8, 94, 67,174, 74,102,
+ 39,136, 88,175, 76, 67, 12, 35,101, 0,112,183, 22,130, 71,243,224, 9, 66,208,238,222,123,139,148,171,254,156, 41, 5,109,225,
+213, 71,227,110, 60,169,246, 73,136,148,158,191,119,250,249, 64,155, 32,137,179,174, 27,228,174, 76, 53, 37,181, 78, 10, 18,199,
+221,253, 60,175,220, 45,246,159, 47,237,119, 59,195, 63, 21,130,120,209,121,156,148,208,231,131,131, 85,189, 18, 52, 58,148,109,
+216, 26,252, 67,187,109,249,253, 85, 21,247,158,115, 15,228,126,160,243,150,159, 41,113, 71,100,131,230,106,215,219,148,218,131,
+ 83,140,164, 20,118,107,181, 20,172,205, 84, 5,213,100, 46, 40,132, 94, 23,188, 85, 48,144,124,207, 62, 16, 68,205,122,211,105,
+139, 16, 62, 73,212,149, 19, 77,137,200,169, 32, 58, 17,249,121,161, 85,130, 41,161, 11,247, 66,136,136, 60,102, 15,113, 96,253,
+ 26,219,247, 42, 97,202, 5, 1, 78,217, 11,133,158,103,141,219,237,182,115,157,120, 85,104, 17,190,181, 17,122,241, 47, 75, 55,
+103,116, 71, 98, 17,120, 28, 42, 88, 84, 9, 61, 41,185,104, 62,120,101,143,113, 31,141,144, 20, 93,133, 12,214,168,224, 3,155,
+ 88, 68, 1,222,232, 62,149, 97, 15,101, 45,188,131, 19,186, 89,207, 25,119,156,182, 36, 24, 82, 31,130, 50,206,197,122, 34, 35,
+114,201, 4,150,157, 28, 85,246,196, 70,151, 23,149, 66, 79, 24, 7,201,226, 48, 99,193,126,217,140,113, 63,108,148,231, 84, 20,
+120, 79, 96, 5, 17,254,229,210,233, 73, 21, 13,207, 46, 47,240,143,255,235, 63, 35,103,143,207,255,248, 13,142, 15, 51,201,135,
+234,130,117,122,131,156, 87,245, 24, 38,169,118,165,160,241, 14,105,233,190,211, 45, 30,209, 5,203,150, 19, 2,203,108, 69,108,
+ 66,175, 43,153,170,222, 34,185,109, 27, 59,139, 40, 82,201,158,102,224,157,168,119, 51,123,206, 13,182, 89,132,214, 89, 26, 79,
+ 6, 71, 99,192, 84,186,192,168,201,225,236,121,228, 5,190,132,157,166, 28,229,180, 18, 92,131,149,255,227,110,212,244, 54,131,
+198,123, 63, 48, 27,158, 10,132,202,191,222, 90,131,102, 44,134,193, 2,222, 96,134,131, 3, 5,100,216, 24, 81, 42,129, 97,156,
+247,104, 41,193,249,136, 52, 79,200,137,201,115, 67,196,154, 50, 30, 30, 79,184, 78,207,200, 18,231, 3, 66,160,221,109,229,206,
+231,171,175,191,199,249,229, 57,127, 93, 70, 47,206,148, 18,254,244,197,107,204, 75,210,159, 77,173, 13, 67,244,184, 62,219,195,
+186,128,118,241, 12, 23,129,132,138,211,100,241,230, 97,161, 3,106,124,134, 22, 43, 60, 26,166,218, 80,178,195,114,115,196,203,
+ 23,231, 24,118, 59,236,198, 1,203, 60,225, 44, 85,204, 75,193,213, 33,224,157,203, 15, 17,208,240,245,247, 95,226,234,210,115,
+ 71,203,187,100,238,152,173, 13,155, 3,138, 14,110,122,254, 10,123,138, 83,199, 86,162,241,126,144,195,116,156,131,113,145, 14,
+207, 40,163, 62,166,204, 89,162, 68, 54, 88, 29, 51, 82,195,198, 42,222,214,199,250, 52,202,124,138,100,174,133,199,213,220,137,
+196, 24, 81,107,210, 51,196,216, 30, 8, 83,121,180, 46,194,174,190, 95,183, 40,101, 85,210,100,183,167,241, 37,205, 28, 13, 89,
+ 37,209,197,150,250,122, 47, 23, 46, 14,192,233,130,188,119,102,231, 74, 98, 90, 96, 90, 57, 2,185, 26, 45,136,233, 32,183,172,
+ 20,175,154, 13, 64, 63,119, 78,105, 51,134,201,115, 12,249, 48, 36,140,148,115,108,183, 11, 0, 67,158, 4,141, 45,123, 49, 73,
+ 76, 35, 95,124,213,117,158,132,117,212, 90, 49,207, 25, 0, 21, 5, 6,204,168,135,193,124, 90,158, 40,252,201,206,216,244, 89,
+ 21, 8,215,186,100,205,210, 46, 60, 61, 20,189,143, 54, 40,156, 60, 86,152,113, 17,249, 28, 55,214,160, 26,138,168, 93,150,132,
+ 33,146, 63,157,114, 59,130, 66,181,106, 45,136,135,208,213,252,134, 47, 53, 67,207,153, 9, 78, 47, 98,209, 3, 73,156,173, 76,
+ 9, 37, 68, 73,248,248,222, 56,178,238, 90, 42, 60, 56,249, 9,168,194, 86, 55,122, 7,208,228,222,193,243,126,221,218,214,215,
+ 63,146, 96, 87, 55,204, 6, 88, 21, 99,155,237,196, 73, 86,195, 18,236,130,190, 27,239,112,157,210,249,249, 60, 45, 34,140,180,
+121,178,138,245,124, 31,136, 75, 44,231,196, 5,179,164,178,113,250,164,115, 24,199,145,173,138, 94,223,225,221, 46,240,221,100,
+212, 89, 35, 19,178, 32, 29,122, 41,186,166,174,149,252,202, 91,237,147, 52,218, 50,126,207, 57,195,253, 95,255,199,191,251,189,
+ 30,210, 60, 78, 13,161,219,218,196,107, 44, 22, 18,211,249,247,170,156,236,142,250,166,136, 60,233, 2, 5, 92, 34, 41, 55,149,
+149,148,206,147, 63,253,236,252,128,221,217,158, 96, 29,173,162,150,132,227,195, 35, 78,199,147,118,137,173,161, 11, 85,244,165,
+103, 47,168,181, 93,120,231,136,163, 44, 48, 11, 65,231,201,142, 78, 67, 35, 90,231, 42,123,183, 77,113,163,203, 93, 86,195,154,
+ 19,189, 17,104,144,104,167,104,104, 6,105, 13,200,195,249,233, 63,252, 10,191,252,237,111,241,230,199, 19,190,251,230, 45,166,
+211,138,101, 73, 48,237, 17,121,190, 81, 18,147,248,218, 37,130, 84,160, 19, 0, 16,163,231,142,166,231, 70,147, 5, 4, 26,115,
+168,180,170,156,137, 9, 93, 50,171,214, 51,167, 20, 22,245,144,182,218,119, 50,107, 42, 79,246,174,206, 25, 44, 75,162,145, 88,
+ 12,172,164,119, 90, 81,123,206,186, 87, 6,113,173, 28,144,195, 98, 68, 17,166,152,174, 81, 88,151, 5,133,237, 84,180, 91, 11,
+136, 49,106, 58,147,112,229,193,130,185,198,158,209,154,187,112,199,216,158,204,117,115,211,168, 19,151, 10, 53, 14,176, 62,114,
+ 42, 88, 3,156,167, 32,147,105, 66, 78, 43,126,188, 57,234,133, 40,154, 2, 41,124, 74, 41,120,120,156, 52,192, 40,165,140,146,
+ 10,174,159, 95, 18, 1,174, 82,177,241,199,207,190,194, 15, 63,221,232,179,180,205,103,246,214,224,253, 95,126,132,243,235,103,
+ 36,172, 76,212,105,158,159, 69, 56,239,112, 60,173, 56, 46, 5,143,115,193,244,120,194,242,112,143, 99,106, 88, 50,253, 20,188,
+ 51,136, 40,216, 69,139,193,145,205,237,176,115,120,253,205, 13,236,112,143,221,222,179,173,203,195,249, 64,187, 65, 22,239,200,
+136,174, 25,153,162,128, 51, 5, 68,177, 43, 29, 57, 77,126, 72, 80, 73,145,140,148,230,228,213,191,171,105,120, 13,156,249, 96,
+ 53, 58, 56, 51,171, 91, 67, 73,180,232,169, 10, 84,146,231,214, 7,175,144,170,200,161, 43,242,247,234, 59,226,236,147, 61,188,
+ 60, 43, 91,173, 0,133,155,172,202,159,151,216,222,109,222,181,176, 39, 0, 80, 94, 67, 8,188, 91, 37,165, 57,109, 15,123,178,
+164,240,202,141,225, 28,113,208,186,144,240,176, 77, 5, 72,130,173,205,153,247,159,214,161, 39, 55, 27,190,144, 26,211,230, 40,
+ 51,220, 5,130,246,200,122,128,220, 23,252,217,112, 65,227, 3,141,247, 61,195,183,200, 82, 10,238, 20,171, 98,139,165,251,204,
+ 41,211, 72, 93, 68,101, 34,142,171,155, 11,172,245,190, 77,214, 97, 34, 68, 51,154, 43, 14, 29,225, 74,238,129,132,170,136, 35,
+ 98,139,136,150,239, 85,214,165,214,116,155,150, 60, 51,206,219,190,175, 54, 93,105,237,172,131, 15,158,139, 13, 14, 18,226,251,
+196,104, 81, 97, 56, 69,206,233,186, 83,254, 44,105, 18,212,174,198,231,184, 8, 14, 27, 71, 89, 27, 22, 12,169, 94,137, 93, 0,
+186,178,100,225,181,172, 63,132,102, 42,133,186, 8,228,250, 3,213,221, 21,248, 27,173,136,217,188, 35,134, 47,114,253,103,130,
+228,118, 60, 37, 97, 13,151,128,213,140,104,195, 12, 16, 60, 57,122,198,113,143, 16, 40, 82,218, 49, 53, 53,196,200,246,210, 30,
+129, 28, 56, 29,207,108,214,225, 58,218,175, 61, 94,188, 42,226,119,139, 28, 38,171,113, 78, 25,126, 27, 83,183, 77,224,161,221,
+148,231, 31, 82, 85,192, 64, 45, 4,163,113,252,131, 41,188, 99, 65,166,109,135,247, 22,235,188, 62,169,184, 21, 95, 89,133, 66,
+ 71, 86, 9,121, 32,232, 67,239, 73, 88,180,175,234, 88, 65,218, 47, 52, 29,197,203, 15, 86, 30,116, 10, 41,160,174, 89,132, 39,
+178,119, 33, 33, 68,101,129, 66,120, 50,145,144, 48, 2,233, 58, 82,206,138,187, 44, 60, 46,164, 2,132, 70,116, 82, 33, 5, 86,
+129,138,178,125,183,223,227,183,191,251, 71, 24, 59,224,203,207,191,199,178,144, 45,204,154,140,150,126, 68,181, 96, 69,101,211,
+ 61, 76, 41, 25,222,137,130,145, 4, 27,198,178,146,181, 54,192, 83,156, 98, 78,130,236,132,138, 91, 84,169,107, 45,150,105, 70,
+ 67,223,187, 74, 5,175,145,179, 27,214,176, 76, 82,132,142,183,174, 61,186,209,160, 33, 12,129,253,251,172, 66, 70, 3,204,198,
+ 71, 44,160,157,210, 89,231,212, 53, 17,137,110, 93, 87,180, 74, 99, 45, 31,168, 51,118,210, 85, 88,192, 26,222, 89,169, 61,140,
+ 38, 28,121, 93,225,120,151, 28,152,143, 15,182, 0, 93, 28, 86,148,182,224,108,231,144,203,136,106, 61, 76,107, 72, 28,164, 97,
+ 26,193,105,170, 37,188,171, 42,122,185,128,250,230,187,159,250,174, 23, 6,145, 15, 21,114, 19, 84,124,253,205,143, 24,199,136,
+151, 47,175, 0, 0, 15, 15, 71,124,245,151,239,117,228,213,197, 69, 6, 25,192,127,251,235, 91,220,150,207,240,191,253,203,175,
+112,113, 24,176, 27, 3,188, 51,120,124,152, 97,106,193, 59,215, 59,164, 84,112,255,184,224,135,219, 19,150,227, 17,102, 74,184,
+185, 95,240,221, 16,112,125,112,120,177, 51,120,113,189,199,225, 44,226,124, 28,113, 92, 43,126,184,191,193,123,127,119, 64, 5,
+117, 90,198,145, 11, 66,102,156,181, 54, 24,231, 53,226, 81, 52, 16,114,224, 72,247,208,227, 28, 29, 83,203,118, 90,212,218, 13,
+ 35, 66,214, 77,141,199,150, 41, 17, 20, 39,103,194,111, 10,153, 16,108, 91,106,252, 12, 57,239,217,202,100,117,151, 71,103,101,
+225,115, 66,118,200, 77,197,176,138, 60,101,104,134, 90,235,248, 10,202, 57, 81, 3, 80, 73,125, 92, 75,226,253,105, 87,165,139,
+117,135, 44, 77,129,243,191, 51, 92, 33,123,172, 49,132,230,117,142,158,217, 24, 27,154, 1,188, 37, 26,219,184,139,152, 25,245,
+234,156, 67,110,188, 58,224,238,213, 7,186, 60, 99,244, 61, 64,195, 18,101,172, 22,106, 0, 4,134, 99,189,133,105,244, 94, 73,
+209, 83,114,213,189,174,117, 30, 48,155,108, 6,235, 0,111, 54,208, 20,106, 48,116, 44,110,128,233,180,112,163, 98, 52,133, 79,
+ 58, 92,177, 50,146, 53,205,195,114,209, 51, 24, 78, 19, 84,188, 43, 96,188, 67,128, 81,142,132,115, 3, 82, 42, 24,134,192,223,
+ 63, 84,244, 41, 13,131,172,251,228, 44,165, 71,169,146, 66,154,159, 53, 29,237, 6,175, 14, 24,209,253,208, 56,154, 47, 80,112,
+ 18, 93, 41, 92,204, 73, 74, 95,247,250,211, 52,167,106,186,166, 76,135,115,202,202,228,247,188,250,163, 64, 30, 18,165,134, 96,
+250,250, 38,103,250,179,109,239,197,107,165,159, 35,229,188,131, 73,155,109,243,188, 1,141,139,107, 89,105,202, 69, 45,217,240,
+164, 92, 39,254, 63, 24,137, 46,147, 49,203,130,108, 33, 46, 26, 67,120,115, 34, 14, 70, 20, 91, 52,197, 45,176, 85, 59, 14, 3,
+ 35,108,173,166,123, 90,102,190, 8,140,169, 55,155, 29, 30,230,189, 81, 69,124,229,208, 29,231,232,231,186,213,218, 72, 12,118,
+ 46, 52, 61,159,167, 19,220,127,252,223,127,247,251, 14, 14, 49,204, 78,182,221, 38,192,212,167,200,241,152, 61,126,145,252,221,
+216,196,233, 9, 59, 93,211,148,248,226, 33,204,169,211,133,183, 84, 96,135,243, 3,226,184,195,176, 27, 57, 68,100, 37,213,123,
+ 73,152, 78,179,142,115, 4,136, 32,151,186,247, 94, 11, 2, 57,172, 74,105,154,241, 43, 30, 76, 57,204, 40,248,161, 83,160,228,
+ 5, 21,207, 55, 9,173,192, 17,163,150,187, 85,203,127,167, 60,232,252, 33, 87,217, 27, 83, 69,245,209, 39, 31,227,211,127,250,
+ 7,188,125,115,194,235,191,252,132,121, 78, 52,242, 94,110, 81,214,187,205,174,198,179, 0,199,178, 13,164,103,175, 91,103,144,
+214, 2, 52,178,238,104,130, 25, 92, 79,168,226,149, 3,219, 62,159,194, 41, 10,129, 84,200, 19,219, 39, 19,226,189,239,163, 29,
+232, 5, 45, 15,130, 88, 18,229,192,183,108, 85,244,161,143,214,219, 38, 42,178,199,201, 26,166, 84, 37,130, 93,228,164,145,170,
+148,201, 76,249,206,194,225, 22, 47,171, 40, 81, 11, 17,129,128, 86,116,180,234, 57,181,201,113,119,128, 86,241,236,210,225,217,
+101,197,217, 89,197,215, 95, 79,128,137,216,159,237, 54,250, 6, 32, 45, 43,144, 19,210,154,112,243,184,244,244,176,141,103,184,
+ 20, 2, 29, 45,108,211, 91, 57, 78,182,148,130,239,127,184,193, 24, 60, 46, 47, 15,240,222, 97,136, 30,111,111, 30,116,229, 51,
+ 50, 49,174,176,246,228, 52,205,248,252, 79,223,160,228,138,139,203,115, 88, 31,129, 86,176,174, 5,165, 1,231,187,128, 23,229,
+ 30, 87, 54,195, 22,201,125,247,152, 83,198,237,195,132,219, 83,198, 52,103,196,224, 48,236, 6,252,225,243,239,240,246,244, 35,
+118,103,148,133, 64, 10,109,199, 99,112,240,104,188,109, 0, 80, 77,149,196, 26,155,204, 87,172, 15, 17,206, 71,132, 97, 71, 7,
+ 10,143, 67,229,215,168,106, 23,146, 71, 13, 21,174,233,248,120, 3, 19, 81,157, 72, 12,186,235,220,170,230,181,123,100,152,143,
+236,100,233,107,241, 79,186, 32,235, 68,171,147,153, 93,145, 84,205, 46, 66,187, 90,178, 22,169,212,209,231, 77,172, 39,141, 57,
+233, 48, 29, 24,112,228,144, 75,227,184, 92,195, 42,126, 25, 75, 23, 45, 12, 74,237,234,111, 65, 46,131, 27, 6,114,216,108, 11,
+ 21,251, 4,241,188,172,148, 99,208, 41, 34, 70, 39,143,146, 4, 41, 96, 17,107, 45,196, 38, 44, 99, 86,180,166, 29,186,100,199,
+151, 34, 40,217,242,100, 26, 34,251, 95,233,134,229,130, 18, 2,167, 48, 10,228,103, 42, 29,170,236,147, 5,207, 45,194, 94,122,
+110,168,179, 29,134,160,231,181, 20, 13,162, 23,210,125, 56,255,255,137,181, 57, 78, 66,189,148,133, 15,237,162,221, 70,103, 33,
+ 92, 12,233, 50,131,239, 63,123,185,248, 37, 29, 78, 57,246,102,251,247,218, 77,131,230, 53,146,187, 71,131, 91, 93, 47, 25,118,
+182,200,231,133, 77,154,166,174, 44,237, 86,196,217,116,109, 98, 45, 51, 73,140,237,150,203,210, 87, 26, 98,239,243,142, 86,149,
+244, 14, 89,165,232, 25, 93,169,112, 54, 61, 79,161, 75,233, 88,106,239, 29,134,145,222, 63,185, 11,133,197, 2,112,145, 39, 4,
+ 67,207, 19, 55,177, 21,110, 66,212, 4,136,195, 92, 60,205, 14,161,149,234,170, 54,207,101, 89,144,214, 21,243, 52,209, 10,224,
+ 63,253,135,127,249,125,230,209, 17, 12,158, 84,242, 20,147, 71,221,155,136, 68,104,148, 84,186, 39,220,117,145,142,124, 33,234,
+101, 55,125,252, 34, 76,100, 45, 30,124,192,254,112,134,253,225, 12,214, 5,238, 0, 19,230,105,194,116, 60,177, 32,175, 63,236,
+ 82,181, 8,208,222,108,144,129,134, 21,160,149,121,188,148, 33,110, 53, 87, 92,138, 10,185,224, 12,191,120, 29,221,138,190,106,
+240, 76, 54,242, 86, 31,200, 56, 4,142, 56,108,234,113,191,184,188,196, 63,255,187,127,139, 56,158,227,155,191,190,193,221,205,
+ 17,185, 52, 88,155, 81,211, 45, 90, 89, 20,123,219,179,132,155,194,105,232, 0,171, 61,229,138, 53, 1,195, 16,153,131,205, 34,
+ 35,142,132,149,145,170, 40, 84,193, 65, 30, 10, 2,105, 82, 60, 56, 70,244,114, 5,206,214,152,218,216,211, 92, 68,213, 78,127,
+ 23,172, 97, 68,175, 35,244,230,102, 95,215,106,101,181,104, 83, 90,145,198, 76,182, 70,225, 45,188,138, 31, 98, 64,140, 68, 7,
+180, 28,229,216,116,125, 66,137, 91, 84,145, 74, 84,104, 34,229, 44, 23, 36,157, 94, 37,138, 90,225, 56,211,248,118, 93, 13, 94,
+127,103,113,125,125,213,167, 16,155, 41, 83,157,103, 56,103,113,127, 90,186, 21,167,246,181, 82,173,141,152,215,236, 41,110,181,
+113,167, 68,118, 29, 3,224,157, 87,207,225,172,197,179,171, 3,110,111, 30,144, 75,213, 68,169, 79,222, 37, 27,219,227,156,176,
+172,212,213,126,251,253, 13,190,250,234, 7, 60,187, 60,199,225,226, 28,185, 20, 76,247, 15,184,249,254, 45,230,187, 7, 92, 12,
+ 1,239, 62,219,225,114,116, 48,243,132, 22, 3,224, 60,110,239, 38,124,253,221, 91,252,229,219,183,120,253,221, 91,124,246,245,
+ 55,184,122,110,117,204,172, 11, 82, 81, 82,111, 32, 62,219,142,187,178,101,137,132,167, 14,158,197,105, 46, 4,114, 69,240, 37,
+228,172,211, 14, 67, 15, 63, 64, 39,114,244,156, 84, 26,187,243,216,145,242,218,253,166,147,226,231,139, 11, 64, 17,214,138, 8,
+140,214, 69,229, 9, 91,189,255,190,250, 36,230,178, 54, 10,254,145,112,139,158, 94,198,228, 52,201,125,231, 49,182,236, 40,131,
+ 31,200,199,107,105, 45,225,125,164,174,152, 51,226, 27,140,158, 25, 50,146, 20,200, 82, 45,141,139,118,163, 19, 68,233,216, 10,
+211,211, 66,244,228, 11,230,230, 68, 50, 22, 42,107, 87,164,155,173,165, 7,167, 72,177, 34,135,183,211, 29,107,223,157,211,106,
+173,105, 16, 18,208,176, 44,153,166, 87,182, 7,128, 56, 71,123,231, 90,170,198, 87, 91, 99, 85,252, 85, 10,137,163, 66,240,218,
+245, 9, 40, 71, 46, 26,203, 52, 77,203,150,216, 97,140,155, 36, 74,240,153,226, 85,160,214, 54, 41,151,146,166, 39, 13, 77,201,
+133,206, 52,137,222,102, 27,165,116,220, 93, 96,109, 85,184,187, 45, 16, 84,244,182,129,192,168,231,158,115, 43, 10,171,219,155,
+ 98,101,187,240,204, 74,225, 34,251,117,254, 26,122,195,229, 54,147, 15,167,127,175,147,180,182, 77,236,175,172, 5,104, 39, 15,
+157, 58, 90,231,217, 18,109,251,215,197,191,111, 24, 7, 22,179, 25,109, 40,123, 40, 77, 7, 36,201,185,238, 57, 53,141,226, 81,
+131,134,150,201, 89,188,253, 51, 36,111, 94,255, 44,211,109,159,194, 70, 16,171,110, 90,201,241, 64, 5, 36, 21,188,203,178, 32,
+151,140,121,158, 48,207,243,230,125, 50,112,255,241,223,255,238,247, 82, 5,201,142, 71,108, 9,210,197,210,195,212,244,131, 16,
+ 27,141, 36, 8,201, 15, 76, 30, 28,129,129,200,126,161,109,190,113, 17, 2,140,187, 29,118,103,103, 8,113, 32,155, 82,109, 72,
+235,130,180, 44, 88,230,153, 83,126, 8, 29, 43,222,113,101,230,242, 72, 75, 58, 75,113,184, 71, 70,184,170, 77,137, 3, 14,228,
+ 96,146, 23, 79,126, 28,242, 80,232,195,238,122,119, 46, 31, 62,117, 27, 70,171,167, 16, 3, 62,253,135, 95,225,103,191,248,132,
+ 64, 50,127,249, 9,243,180,162,212, 2, 83, 31,145,151, 59, 46,114,232,207, 24, 71, 26,127,201,138, 64, 14, 81, 65,200, 86, 14,
+224, 16, 75,155,227, 23, 86, 94, 98,241,207, 55,209, 52, 24, 9,231, 40,170,248, 23,181, 43,209,170, 82, 71, 8,242, 97,187, 44,
+ 9,105, 93,121, 36,214,167, 49, 77,117, 3, 68,139,147,221,166,225,164, 58, 65,119,138,149, 74, 8, 78, 57, 37,212, 74, 9,109,
+222, 89,236,198,129,196, 64,178,251,130, 81, 75,160, 0,137,104,247,152,144, 87, 18,208, 53,238,218,173,231, 17, 61,103,162,123,
+ 79,209,162, 82, 81,139,130,247,135, 31, 42,230, 57,226,226,226,160, 89,222, 82,112,120,111,225, 76, 65, 53, 22, 63,188,121,160,
+206, 77, 81,138,192, 3, 43,206, 73, 36, 67,190,242,221,224,241,226,234,128,143,127,246, 46,126,241,201, 7,120,255,253,151,156,
+126, 68, 83,131,253,110,192,235,111,223,208, 36, 32, 87, 92,158, 69,252,226,253,231, 24, 7,143,183, 15, 19, 61,175,185,224, 56,
+ 45,248,252,139,191,226,244, 56,225,252,108,192, 89, 58,193,181,130, 92, 43,222, 78, 25,183,143, 9,209, 2,239,156, 7,188,250,
+224, 26,247,199, 21,127,252,242, 43,188,243,110,198,225,178,160,186, 9,135, 11, 3,235,249, 93,105, 61, 37, 75, 14, 36,162,193,
+113,127,205,187, 78,218,205,141,244,249,249,168,104, 73,121,214, 73,212,233,187,208,175,209, 8, 47,179,214, 1, 74,173, 99, 36,
+105,237,132, 71, 93,213,216,254,115,160,206,155, 49,155,214,104,142,122, 46,153, 11, 14,209,206,180,158, 11,109,122, 7, 34, 99,
+208,148,215, 13,216, 3,170,120,151,213, 28,121,211,139,162,102,213,194,233, 7, 24,227, 97, 93, 64,173, 22, 67, 28, 73,176,216,
+ 28, 39, 17, 54, 38,223,245, 85,162, 60,183,141,109,106,162, 29, 50, 12,212, 34, 34, 34,169,207, 67,244, 26, 70,211,152, 0, 41,
+211, 60,161,117,213, 90, 56, 74,117, 75,158,131,226,170, 59,135, 99,115, 40,163,103, 68, 57, 47, 86,175,166, 74,117,225,165, 59,
+239, 48,157, 40,180,200, 88, 65,110, 55, 12, 99,196,202,226,217, 30,250, 34, 97, 61,208,194, 74, 10, 87, 13,113, 98,207,127,103,
+133, 27,221,123,247,240, 21,241,211,123, 94, 31,152, 39, 34,172, 97, 8, 12,197,177, 12,190,162, 66,200,234, 69,212, 5, 92, 50,
+ 17,139, 49, 32,165, 14,168,162,241, 53, 52, 50, 87,139, 31,231, 84, 0, 40,121, 20, 98, 95,150,247,159,108,213, 86, 57, 10, 82,
+108, 58,134,114,216, 77,194,167, 32,104, 45, 95,238,181, 54,189,220, 69,215,161,133,190,216,207, 76, 47, 98,244,207,116,142,243,
+202, 61, 79, 56, 28,130, 15,122, 95,200,121,180,253, 87, 23,112, 27,156,157,157,241,154,151, 26, 96,103,123,216,150,232, 59, 26,
+136,139, 96, 88,148,217,116,218,252, 84, 20,151,185,233, 16,103,146,208, 35,167,105, 66, 90, 23,172,203,204,241,228, 80,174, 9,
+ 26,224,254,211,127,248,183,191, 23,208, 76, 46, 89,171, 48, 33,104, 9, 56,166, 87, 21,237,137,197, 77,118,102,242,205,118, 33,
+196,255,236,185,150,241, 13,117, 1, 84,209,236, 15,103,186, 31,111, 53, 99, 58, 30,241,248,112,212, 42,197, 40, 51,215, 62,169,
+240,104, 28, 38,170, 70, 9,101,233,187,211, 97,140,106, 47, 35, 53,123,211,162,131,252,234,246, 73, 58,209, 54, 43,119,251, 32,
+201,238, 3, 13,120,249,222, 43,252,246,119,255,132, 82, 60,254,242,231, 31,112,123,115,228,241,208,130,154,110, 80,107,194, 56,
+ 70, 86,181, 59,245,111, 58, 70,253,129, 31,166,156, 50,219, 98,170, 90, 57,156, 51,172,196,183,156,107,110,181,203, 17,114, 31,
+133, 66,100, 85, 59,110,139,149,204,163,248, 45, 12,164, 53,250,245, 96, 49,154,247,114, 33,208,180,195, 57,171, 35, 83,199,226,
+ 39,217,129, 75, 68,103,211, 52,173,218, 73, 78,150,104,124,250,159, 82,129, 42,136,162,168,181,133,132,146,252, 61,151,204,204,
+121,171,187, 44, 31,156,242,161,251,171, 34,113,183,141, 47, 99,224,179,207, 23,188,124,241, 2,135,243, 51, 30,215, 27, 45,222,
+104,166,100,177,100,131, 31,223,220,177,170,185,242,104, 42,243,190,141,118,239,251,232,241,235,143, 95,226,215, 31, 94,225,131,
+ 15, 94,225,250,229,115,242, 53,243, 75, 15,134, 48, 13, 67,192,244,120,194,227, 68,214,202,183,247, 19,222,127,113,192,123, 47,
+ 46, 48, 88,224,187,183,199,141,128, 12,184,185,123,196,215,175,127,196,224, 44,222,121,126,142, 64, 17,136,168, 48,248,233, 97,
+198,237,113, 69,116,192,213,203, 75,220,221, 46,184,159, 86, 92, 92, 26,182, 45, 26,189,224,200, 82,211, 87, 60,149,241,152,206,
+ 7,132, 48,162,193, 96, 24,247, 76, 26, 36, 75, 85, 96, 21,174, 28,116, 98,103,234, 93, 61,141,250,200,161,226, 84, 15, 34,138,
+ 80, 17,161,201,223,169,147, 35, 24,189, 88, 5, 91,172,177,189,174, 91, 80, 9,164, 82, 40,116,168,148, 62,202,228,200,217,198,
+255,217,195, 57,122, 6,132,168,180,104, 37,148,181,232,104,155,232, 99,239, 71,120, 63,192,135, 1,150,187,244, 90, 41,252,130,
+ 44,171,161, 39,193,192,108, 28, 11,149,175,161,206,224,176,174, 23, 25, 60,209,124, 18,157, 76, 93, 58,237,209,141, 53,148, 12,
+ 23,189,138,246,100, 66, 68, 66,190,162, 74,106,193,255, 72, 48, 11, 1,114,114,247, 81,243, 51, 77, 40,105, 97, 2, 8,162, 20,
+236,163,166,134,105, 97,171,108, 8, 30,243,180,106,247,223, 42, 77,221, 74, 45,108,129, 53,106,205,203,185,168,190,197,110, 98,
+103,229,178, 69,235, 63, 59, 69,155,154,190,175, 23,140,182,216,120,123, 30,186, 81,132,248,182, 83,173, 27, 11,155,196,216, 74,
+ 76,234,211, 4, 65,163, 23,174,144,212,107, 41,155,102,138, 46, 51,207,159,187, 76,161,100,106, 44,207,176,168,211, 61,175, 88,
+201, 9, 36, 20, 60, 46, 4,248, 94,161, 20,185,176, 65, 22,247,175, 83, 62, 3, 65,160,123,207,163,120,142, 30, 23,145, 53, 53,
+ 38,142,131,206,172,122,192, 45,175,163,100, 85, 35, 20, 61,107, 40,117,207,178,200, 50, 14, 65,139, 68,209, 72, 84, 45,110, 91,
+ 31,179,111, 2,140, 68, 72,158,115,209,169,215,186,172, 72, 44,128,155,231, 25,235,186, 48,219,131,206, 70,249,254,229,190,240,
+ 62,192,203, 23, 70, 34, 5,167, 49,159, 62,122, 86,101,154, 30,220,194, 35,144,154, 73,109, 77, 21, 30,225, 90,211,146,224,188,
+237, 57,196, 70,112,129, 69,171, 19,189,208, 45,129, 94,100, 68, 33, 69, 4,117, 94,149, 15,126,122,249, 58,162, 17, 58,106,210,
+157,222, 70, 40,164,222,243, 40, 33, 37, 12, 66, 81,104, 0, 61,212, 99, 28,180,210,213, 63, 11, 13,158,233, 65,173, 86,237, 56,
+ 37,140,102,183,223,225,151,191,253, 20,113, 56,224,251,111,222,226,225,254,132,105,162, 93, 96,203, 15, 0,164,146,166,253,200,
+110, 63, 34,231, 6,235,218, 38,120,194,176,165,167, 99, 3,125,240, 27,191, 58,143,111, 44, 7, 9, 40,103,185,233,238, 92,196,
+ 28, 70, 15, 15,177,181, 85,205, 22, 46, 76,180, 82,112,143, 53, 48,150, 43,113,231, 17, 44, 29,160,173,242,126,223,110,220, 10,
+ 27,136,140, 28, 14,181, 2, 37,175, 58, 93,216, 78, 60, 36,250,207, 90,203, 62, 90,143,204,221,189,145,168, 75, 86,233, 74,114,
+154,132, 87, 72,197, 93, 75,161, 32,138,218,152,207,204,221, 16,175, 25, 72, 89,155, 17, 60,133,186, 12,193,161, 41,105,139,159,
+ 25,146,129, 35,151,132,148, 72,168, 7,102, 39, 95,156, 57, 12, 49,224, 48, 90, 92, 95, 95, 98, 55,120,196,154,224,163, 67, 25,
+ 56, 73,142,139, 45,209, 78,231,101,134,113, 30, 31,189,251, 12,127,253,246, 45, 86, 38, 99,125,241,205, 13,126,119, 62,226,131,
+ 87,151,248,236,245, 13,214,218,158,100,152,151,218,240, 95,190,250, 9, 0,240,219,143, 95, 32,175, 22,193,103,152, 66, 81,177,
+223,252,120,194,222,237,241,171, 95,190,135,255,231,255, 61,226,238,174,224,250,121, 84,141, 4, 9,172, 44,226,110,208,174, 47,
+ 48,159,219,178, 31,215,113, 49, 45, 5,154, 84,233,173,118, 49,164, 6,118, 52,194, 0, 91,239,224,130,129,173, 36, 6,165, 72,
+210,166,129, 61,127,171, 62,150,131,176,139, 93,123,192,147, 76, 84, 90, 37, 33, 90, 77, 5,214,210,159,227, 56,208, 35,241,243,
+106,116,175,222,250,239, 3,169,144, 11, 79,112, 42, 79,128,182,123,111,169,238,172,139, 8,126, 68,140, 59, 52, 56,138,201, 52,
+ 14,214, 6, 0,142, 89, 14,228,108,160,179, 73,196,155,116, 9, 36,225, 45,136,246,162,138,195,132, 50, 29,204, 0,172, 68,104,
+165, 73, 82, 42,216,237,119,170,100,159,166, 76,197,221,105, 81,229,113, 73,116,177, 52, 78,195,155,213, 6, 5,214, 19, 25,141,
+122,150,162, 86,248,244,142,167, 89, 48, 68,165, 20,132,172,243,244, 14,146, 6,150,115,222, 13,217, 87,165,161,218, 66,174, 12,
+ 7,238,100,161,224,113,132,108,206, 77,227, 96,165,169,170, 53,233,100, 75, 81,208, 76, 82,171,133, 68,184,105, 35,132, 3,175,
+ 90,229,107,151,198, 65, 38, 41,242,141,138,178,222, 50, 76,131,104,112, 78,133,110,206,202,180, 3, 61,143,130,255,187, 97, 58,
+ 41,229, 59,208,196,111, 93,147, 6, 60, 41,153,206, 25, 21, 70, 91, 91, 57, 59,128,104,116,214, 89, 12, 46,114, 71,155,122, 12,
+169, 33, 26, 93, 45, 77,223,167,214, 26,220,166, 84, 52, 32, 78,130,172, 29,122,134,124,111,144,130,247, 28, 94,100, 52, 95,157,
+ 10,134, 30, 63, 44, 58, 10, 90, 93,134, 13, 77,111,208,207, 48,179,109, 16, 5, 58,161,208,179,198, 24, 22,119,246,179,215, 56,
+163, 83,160,196,193, 60, 98,225, 44, 57,179,200, 55,179,227,196,235,244,150,238, 65,114,100,248, 82, 11, 80,193,120, 83, 30, 81,
+177,165,194, 72,213,210, 26,198,195, 5,210,244,168, 99,117,225, 50, 27, 99,145,150,196, 72,195,172,202,243,198, 23, 38,141,150,
+232,146, 17,191, 99, 3,176,219,141, 79, 72, 60,222, 91, 36, 3,172, 41,179, 34, 86,226, 68,237, 38,159,182,234, 78, 10,141, 30,
+ 62,167,227,150,170,187, 48, 18,247, 80, 49, 32,151, 14, 77, 21,217,103, 42,170, 95,206,246,173, 76,200, 51,108, 23,210,135,195,
+ 7,252,236,231, 63,195,171,247,223,199,155,159, 30,241,229, 23,127,165,124,229, 82,225,221,138,117,126, 96, 43,137,131,245,148,
+168, 70, 25,198,156,202,198,113,141,141,149,138, 37,247,125,110,227,140,227, 24,189,142,158,182, 99, 44, 9,169,208, 68, 50,166,
+121, 89, 43,130, 62, 86,108,242,131, 67,223, 9,177, 47, 43,199, 57,146,128,197,170,104,201,123,250,121,192,121, 10, 88,217, 88,
+ 92,104,180, 10,218,213,164,140, 86,203,147, 64,134, 16,156,238,120,133,150,100, 56,130,147, 40, 81, 93, 56,162,158,201,180, 42,
+161, 43, 4,171, 68,164, 16,157,174, 19,104,231, 86, 97, 36,111,153,187, 54, 73,152,155,167, 9,222, 59,188,251,170,225,171,191,
+222,227,253,247,159, 19, 43,193,177, 54,195, 89, 52, 22, 8,238,207,118,248,244,211,143,176, 27,130, 86,210, 49,122, 68,100,152,
+180, 32,231, 6,199,212,177,234, 71, 77, 4,171, 37,163,112, 38,182, 1, 16,199, 1,165, 0,151,175, 94,226,147, 15,239,240,217,
+215,111,224,172,193, 15, 15, 51,254,242,253, 45,206, 71,178,163,196,224,177,166,140, 33,122,181,114, 14,193,225,234,114,143,221,
+ 97,135,214,118,188, 54,114,152,167,149, 21,183, 21,213, 69,252,230,211,159,225,203,215,223,225,250, 69,160, 3,203,243, 33,193,
+222,112,239, 69,123,129,190,215,230,169, 10,137,186,156, 10,147,156,181,104,210, 93, 85,102,114, 51,118,116, 27,143, 41, 66, 40,
+209,114,148,210,105,126,253, 93,204, 60,101,170, 58, 6,166, 51,160,207, 81,196, 94, 67,233,126,149, 29, 13, 77,197, 85,165,210,
+ 72, 94, 56,234, 98,205, 50,204,215, 46,124,137,111, 59,216, 82, 41,235, 93, 14, 93,231, 6,248, 64,153,210,214, 70,138, 29, 54,
+ 30,242, 91,189,167,239, 53,231, 74,159, 21, 7,195,136, 16,210, 57, 10,254, 88,150,166,254,227, 56, 4,204,211,130,156, 37,147,
+ 26, 42, 14, 36,175,181,193,233, 56,211,164, 3, 84, 24,136,160, 50,115,128, 78,107,141, 82,207,184, 11, 51,173, 17,118,217, 73,
+ 65, 68, 19,207,202, 23,114,228, 88, 99,239, 29,141,209, 29, 37,147, 97, 35, 68,150, 46, 95, 66,166,228,231,174, 86,210,214,116,
+135, 79, 77,142,209,172,115, 98,179, 71,164,148,116, 47, 77,158,106,171,227,109, 99,229,140,102,107, 95,107,200,173, 95,204, 50,
+162, 46,165,219,203, 10,239,210,115,110, 60,161,168,112,250, 28, 53,157,210, 72,227,161, 52,207, 53,171, 87,188, 85,122,175,187,
+ 0, 17, 48,168, 90,252, 56,239, 80, 0,157, 88, 2,228, 62, 16, 23, 4, 21, 54,133, 61,254, 69, 97, 93,130, 92,149,105, 68,136,
+145,238, 43,103,116, 45, 49,140,156, 7,129,142, 83, 21,140,171, 49, 64,116, 94,181, 98,222,246, 52, 75,178,104,146,171,128,224,
+ 46, 44,242, 45, 69,191,151,148, 50,156,181, 8, 49,146, 91, 71,214, 9, 82,244,110, 50,224,157,111,218,136,137,128, 87,206,218,
+202, 46, 46,137, 60,150,105,232,178,172,112,206, 98, 89, 22,172,235,202,196, 61,167,197, 85, 8,145,133,169, 61,119,222,123,163,
+239,180, 90,218,186,197,192,118, 1,151,179,168, 9,170, 6,223,254, 75, 34, 90,115,162,145,115, 22,209,150,193, 38,183, 25, 42,
+226, 32,193, 73, 81, 11,141, 11,164,200,132,122,242, 88, 8,192, 23, 30,173, 1,172,126, 93, 42,226,227, 10, 18,166,239, 30,213,
+226,166, 73,115, 85, 85,227,198,138,111,208, 40, 88, 66,246, 54,153, 71,132, 54, 90,254,128, 29, 28,168, 26, 60, 59, 28,240,171,
+127,252, 53,230,169,226,203, 63,125,143,187,219, 35,143, 14, 19,202,250, 0,184,174,124, 20,213,166,100,147,123, 99, 49, 79, 43,
+ 29,170,137, 81,150,220,149, 96, 19,227, 40,130,154,190, 95, 19, 6, 56, 99, 41, 55, 35,170, 42,157,120,235, 42, 98, 73,112, 74,
+ 41, 83, 81,196, 69,206,150,228, 68,113,178, 94, 21,244,231,215,207,113,186,191,133,129,231,208, 26, 18, 17,166, 68, 92,113, 26,
+175,211, 30, 57, 48,228,198,218,200,145,149,142, 47, 21,250,204,196, 94,167, 34,196, 68,211,154,180,174, 72,235,202,221,155,229,
+135,184, 51,224,189,179,104, 70,124,207,116,136,215, 82,129, 77, 40,143, 8,255, 36,140,226,229,203,128,215,223,174,152,231, 85,
+ 69,125,181, 80,122, 94, 74, 69,159,139,171,171,115,157,252, 8,221,108,153, 19,253, 57,235,132,106, 44, 76,116,168, 54,168,215,
+222,123,162,209,229, 84, 17,247, 35, 85,235,107, 66,131,193,175,127,245, 33,238,231,132,105,165, 23,249,245,237,140,221,144,113,
+184, 56, 67,109, 21,231,231,123,172, 92,120, 57,107,240,207,159,188,194,223,191,123, 5, 31, 40,173,238,241,113,134, 29, 6,152,
+ 66, 80,145,129, 15,129,171,103,103,248,254,205,136,146, 11,198, 61,139,119,188,225,145,105,230, 41, 87,235,162,202, 74, 59, 99,
+201, 82,111,155,124,242,218,160, 94, 89,171,232,222,166, 59, 84,205,149,150, 78, 76,121,254,125, 20,104,120, 66,100, 56,184,194,
+128, 46,237,210, 26,108,115,172, 1, 1,235, 57, 50,170, 53, 20,220, 82, 86,194,194,162,106,209,237,125, 96, 40, 83,219, 36, 13,
+102,221,121, 82,247,104, 57,192, 38, 35,231, 85, 47,116,218,159,143,112,126, 32,205,128, 13, 48, 54, 34,186, 8,107, 35, 12, 19,
+188,100,156, 42,233,117,206, 57,172,137,104,129, 33, 4,238, 18,201,202, 85,114, 65, 8, 14,199,148,104,223, 89, 0, 51, 2,203,
+ 12,196, 49,162, 85,122, 95, 7,110, 8,150, 90,113,126,190,227,228, 52,138, 45,118,206,113, 68,114,103,209, 11,117, 63, 4, 42,
+136,228,194,244, 44, 24,163,105,166, 8,245, 88,196,202,248, 87,105, 34,250,179, 94,245,242,209,226,169, 52,206,167,239, 59, 86,
+ 25,223,234, 74, 15,192, 60, 47,186,174,162,166,202, 17,144,198,245, 32, 28, 90, 41, 24,229,158,139, 40,145,172,111, 30,165,117,
+140,171,164, 76,150, 77, 49, 33,128,176,206,253,160,255, 78,197, 5,244, 89, 19,254,132,229, 28,241,148, 18,134,129,226,187, 91,
+223,168,208,159,195,151, 46, 77,142, 40, 88, 11, 28,152, 34,153,240, 62,244, 12, 14,203,177,214,141,155, 20,171,130, 56,160,178,
+206,203, 24, 3, 27,169,232,241,220,168,202,101, 47,130, 55,201,147,111,220,172,168,122,159,167, 47, 21, 18, 11,219, 54,234,123,
+167, 43, 9,103,157, 66,156, 2, 67,205,232, 78,115,172, 65, 2,239,213,155,226,211,101, 13,189, 93, 77,136, 59,167,181,186,201,
+ 73,161,159,101,214, 20,195, 0, 0, 32, 0, 73, 68, 65, 84,213,241,241,136,156,147,138,236, 36,182,218,176,173,220, 74,216,199,
+102, 85, 41,171, 38,247,127,254,203,111,127, 47,221, 96, 8,182,167, 81, 9, 61,135,173, 76, 62, 70,148,180,234,229, 40, 35, 4,
+218,117,116, 72,140, 99, 31,250,214,202, 32, 86,143,109,130,209,197,245, 75, 28, 46,159, 33,142, 7,196,113, 64,171, 13,211,233,
+ 17, 57, 45,170,246, 83, 17,131, 68,185,170,234,214,110,178,102,193, 0,150,254, 65,201, 40, 92, 4, 61, 34, 48, 33, 59,133,209,
+ 31,104,247,192,146, 0, 99,140, 1,207,159, 95,224,213,171, 23,248,217, 47,127,129,183, 63, 61,226,219,215,111, 48, 77,204,163,
+207, 71, 88, 76,168,181, 98,127,126,137,214,178,122,216, 61,103, 42,207, 39, 34, 89,173, 43, 85,206, 36, 82, 75,250, 80, 56,238,
+ 48,157,119, 24,207, 46, 16,135,136,188, 65, 97,234,120, 43,238, 48,238,247, 88,166, 73, 87, 23, 86, 67, 89,172, 62, 0,194, 35,
+ 46, 85, 44,125,244,121,133, 24,112,118,121,133,154,147,170,218,173,243, 40,105,209, 93,166,120,131,165,219, 42,137,160, 49,198,
+118, 27, 20,169, 55,187,253, 67, 92, 14,102,179,211,214,100,176, 90,177, 46,139, 66,138, 66, 12,218,177,197, 24, 16,188,213,172,
+123, 17,102, 82, 50, 19,219,145,120,141, 98,141, 83, 65, 79, 8, 65,169, 92, 67,244,184, 63, 58,156, 95, 28,250,133, 87,187,251,
+161,177,237, 79,246,109,178,191,107,153,139, 69, 67,122, 5,227, 44,154,143, 12,217,161,180, 50,231, 60,124,164,236,237, 16, 61,
+ 12,219,158,226, 24, 17,172,195,253,227,204,238, 8,143, 10,154, 54,200,232,113,183, 27,224,157,197, 47, 63,124,129,223,124,252,
+146,118,220,142,166, 8,178, 43, 44,165,194,143, 3, 48, 14, 40, 21,248,241,205, 29,118,135, 21,187, 51,251, 55,187,224,166, 22,
+205,214,176, 73,127,178,155, 95, 70,211,171,204,251, 91,153,146, 72, 65,109, 55,133, 0, 56,255, 92, 73,108,165, 32,229,164,158,
+118,113, 79,200,115, 39,187,116, 93, 25,233, 30, 80, 20,235,141,221, 9,133,215, 50,148, 75,160,191, 79,192, 74,156, 86,101,173,
+164,197,241,136, 61, 39, 46,226, 19, 82, 94,144,210,210, 59,116,227, 16,226, 30, 33,238,224,220, 8, 31,104,244,238,252, 0, 24,
+175, 33, 52,100, 73, 50,106,113, 42, 28,143,220, 88,228, 75, 34, 79,186, 48,214, 37,169, 88,211, 52, 25,135, 98, 83,208,244, 73,
+ 97,227,164, 52, 9,126, 41, 27, 2, 92,225, 34,165,233,174, 30, 28,142,148, 24, 84,101,159, 68,160, 22, 94, 75,172,156, 12, 39,
+110, 30, 31,172, 94,178,212,101,245, 21, 72,218,216, 45, 69, 23,211, 1, 50, 77,187, 68,195,163,115,154,104,230, 30,214,194,194,
+ 80,129,217, 60,201, 14,104, 20,130, 35,174, 60,209, 17, 73,214, 71,206,165, 19,230,182, 12,120,165,217,101, 21,183,150, 90,148,
+ 86, 89,248,239,178, 60,213, 17, 65,173,120,246, 75,206,204,176, 72, 8,222,169,182, 65,166, 74, 74,235,116, 29, 22,211, 49,198,
+208,213,169, 53, 61,139, 94,184, 37, 66,167,115,155,137,172, 8,128,101,130,213,211, 70,157, 38,200, 57,158,168,250, 16, 52, 14,
+216,108,214, 86, 98,121,107,219,128, 28,141, 28, 54, 24,198, 17,198, 58,229,178,199, 97, 80, 61,139,209,231, 82, 24, 14, 93, 35,
+224,157, 83,221,130, 52, 68,216, 8,145,115, 46,152,166,137, 47,246,170,239,172,181,142,167, 99, 78,155, 84,209, 21,200,231, 39,
+137,118,181, 53,120,108, 70,218,243,180, 48, 33, 44,242,238,155,198,185,150, 69, 63,137,219, 75,221, 65,108, 60,205, 2, 63, 89,
+115,210,113,139,168, 54,157, 55, 29,157,231, 28,141, 45,130,199,233,225, 30, 33,173, 24,198, 29,219,231, 40, 86, 81, 70, 44,180,
+ 67,106,234,223,147, 67,202, 7, 7, 8, 28,134,213,245,226, 59, 21, 6,176, 68,144,138,229,164,100,153, 36,176, 78,128,173, 10,
+251,253,136,203,243, 61,158, 95, 63, 67, 12, 30, 57, 55, 60,156, 18,254,252,249,119, 56, 29,103,170, 78,243,140,150, 79,244, 89,
+ 56, 66,150, 58,223, 31, 50,130,196,176,205,207, 82,224,132, 80,204, 52, 97,136, 95, 76, 17,152,120,166, 52, 85, 14,146, 40,235,
+170, 21,151,225,241,143,140,160, 40,227,187,123, 48, 5, 23, 41,140, 99,217, 39, 57,241,121, 59, 7,239, 44,134,232, 81,119, 81,
+127, 95,171,133,195,108,120, 37,144, 51,175, 5,146,130,122, 98, 28,244, 98, 17,111,179, 18,200,184, 64,146, 89,174, 76, 42,114,
+226,189, 93,173,156,204, 86, 40,122, 80,128, 16,158,208,142, 82,237,243,218, 81,121,247,118, 51,166,237,163,218,166, 1, 48,214,
+122,180,150,113,125,237,240,230,246, 17,167,211, 57, 14,135,145, 44,134,124,105,164, 92,212,106, 84, 75,219,136,184, 42, 76, 5,
+ 90,136,188,207, 93,177,204, 51,130, 39, 63,247,241,241,136, 92, 23,180, 22,240,222,123,175, 54, 7,135, 71,179, 21, 13, 30, 31,
+126,242, 17,190,249,241, 22,143,199, 89, 95,124, 18, 94, 58, 21,146,253,252,227,247,240,155, 95,188,143,161,156,224, 55, 66, 49,
+103, 12,246,151,123,132,195,136,228, 71,220,220, 29,241,205,247, 63,194, 12, 39,140,177,119, 60, 26, 4, 33, 34, 71, 16,252, 69,
+216,237,226,229, 53,204,164,177,214, 10,169,148, 14, 92, 64,199,141,168,221, 70, 38,251,204,156, 18, 74, 45,170,136, 22,213,177,
+140,254,172,237,217, 7,222, 65,247,237,154, 33, 45,133, 66,206,154,180, 69, 16,187,166, 69,156,112,175, 13,191,171, 13, 13, 89,
+ 83,215, 26,139,230, 68,208,181,234, 56,155, 14,194,128, 16,118, 8,129, 46,115,231,200,186,102,109, 4, 12, 77, 82, 26,123,196,
+183,185, 18, 36, 0,227, 51, 9,125, 4,233, 44,117,137,142,211,231,114,218,190,179, 17,173, 20,248, 51,131,180, 44,200, 76,179,
+220,159,237, 48,215,166, 89, 16,222, 57,172,117,209,231,190,108, 46,215,233, 52, 51,221,177,162, 54,131,121,234,162, 56, 52,154,
+202,205, 83,210, 73, 89, 99,245,123,107, 86,145,163,130,126, 45, 44,114,115,140,113, 54,108, 99,146, 11, 90, 10, 88, 9,223, 42,
+185,144, 70, 70,149,239,242,235, 13,150,165,168,144,207,242,164,176,182,206, 51, 88,151, 85, 1, 55, 50,222, 86,242,155,237,217,
+226,105, 45,122, 17, 21, 46,146, 42, 12, 96, 58,170, 86, 66, 92, 4, 25,222,195, 85, 88, 15,197,224,162,194,226, 73,202,138,231,
+ 0,162,106,159,124, 6,206,245,100,185,202, 98,104,200,101,207, 98, 97,111, 28,143,233,161,130, 54,207, 23,158,209, 41, 16, 91,
+100, 5,124,196, 77,138, 97,136,147,181,142, 19,254,130,174, 37,169, 96,165, 66, 53, 12, 81,225, 90, 62, 68,172,235, 74,130,222,
+ 24, 9,201, 28,237, 19,230, 9,236, 38, 35,157, 45,124,181,110,163,104,177, 9,172, 42,189,152,150,159, 61, 79,136,151,180, 34,
+167,164,193, 69,242,254, 26,121, 87,225, 58, 6,189, 85, 88, 22, 78, 74,241,162, 43, 18,107,225, 75,206,108, 37,233,135,234, 92,
+103, 88, 99, 16, 7, 66,251, 85, 20, 84, 22,202,249, 97, 68,176, 22, 37,173, 26,199,233,252,128, 90, 23, 98, 40, 75, 87, 18, 60,
+252,217, 14,211,227,253,134, 67,108,121,103, 76,216,203, 16, 77,199,117,150, 4,227, 68,252, 66,148, 40,203,221,147,117,129,228,
+251,204,214, 13,195, 14,105, 93, 89, 92,229, 84, 65,123,113,117,133,219,183,183,240,214, 96, 60, 59, 71, 94,103,196,113,199,135,
+ 64,197, 58,205,236, 39,116,120,231,229, 5, 94, 60,191,198, 48,142,120,120, 92,112,154, 22,124,255,253, 45,121,147,115,197,112,
+113,197,211,192, 21, 62, 54,248, 48,162,242,135,125,184,188, 4,140,193,254,226, 25,140, 49,120,188,189,101,129, 5,189,224, 54,
+ 68, 18, 40,149, 6, 32,113, 39, 65, 98,171, 97,228,135,137,187,141,121, 89, 96,125,232,187,222, 90, 49,236,247,200,235,218, 67,
+ 13, 74,131,245,196, 61,142,123,122,137,208, 10,210,186,160,150,130, 96, 3,206, 46, 47,177,158, 78,136,135, 1, 62,122,173,134,
+227,238, 0,231, 28, 78,247,183,164, 10,221, 29,176, 78, 15, 20,166,146, 18,206,175,174,177, 78,143, 20, 72, 18, 2,225,102,215,
+153,253,231,180,179, 9,195, 14, 62, 70, 26,245, 47, 51,242,186,176,146,191, 32,238,206, 17,119, 69,191, 86,107, 12, 78,247, 55,
+250,153,187,230, 52, 7,154,192, 12, 70, 69,122,173,208,232,173,114,167,100, 5,100, 34, 43, 23,107,225,229,226, 52, 1,222, 54,
+124,248,126,198,215,223,222,192,186,231,176, 0,134, 49,160,128,146,193, 44,239,174,156,183,176,181, 31, 22,118,220,241, 36, 0,
+ 72,115, 70, 75, 5,190, 22,220,220,220,225,226, 48,227,226, 34,227,207, 95, 85, 60,187,186,196,225,226,128, 16, 35,173, 36,150,
+149, 42,223,224,241,209,199, 31,224,179,255,241,149, 34, 69,101,210,227,172,199,167, 31,191,194,207,127,245,247, 24,163, 7,142,
+ 5,168, 25,222, 2,171,221,161,186,136, 33, 6,248,146, 81, 79, 43,190,249,254, 47,104,225, 17,113, 20,152, 80,239, 18,100,164,
+ 46,240, 11,245, 65, 27, 18, 44, 86,101, 98, 55, 29,249,201, 69,147, 75,210,105,143,221, 88, 4,115,102,215, 65,235, 32,169,218,
+ 40,180, 69, 96, 54, 34, 10, 45, 44,106,205,173,104, 28,165,120,165,155,138,101, 37, 86,153, 16,188,148,158,101,181,163,183, 44,
+196, 52,118, 27,179,154, 55, 88,216,190,155, 22,127,174,181, 30, 49,238,121,143, 62,194,152, 0, 31, 70, 52, 88,210, 6,176, 0,
+104,219,157, 43,127, 94, 66,109, 90, 86, 31,124, 74, 21,201,200,104,220,233,175, 35,120, 11,115, 16,106,128,117, 36,170, 26,198,
+136,146, 41,146,120,220, 13, 40,197,192,193,195, 6, 1, 0, 85,228,181, 42,191, 33,165,170, 44,115,205, 9,111,164,223,152, 39,
+106,100, 44,187,134,233,239,175,124,113, 91,208,176,211, 32, 51, 11,163,234,196,211, 81,140,115,233, 76, 13,199,187,243, 45, 21,
+ 83, 61,218, 3,173, 52,220, 38,114, 19, 6,180, 54,226,230, 96, 97,209,179, 6,187,172, 69, 69, 88, 2,112, 17,218,155,105,100,
+ 63,131,109, 58,177,104,181,209,106,105,195,253,207,252,103,102,214, 7,145, 6,195, 82, 49,193,118, 80,181,207, 57,179,233,194,
+251,232,189,100, 14, 63,169,150,167, 8, 64,107, 14,198,208, 78, 91,237,145,150,109, 27, 66,190,227, 40, 95,177,171,245,231,221,
+194,132,174,188, 23,171,111,201,137, 38,131, 12,153,180,155,156,247, 14, 45,171, 26,227, 26, 66, 64,169,180,187, 95,217, 15, 46,
+ 25, 34, 68, 15,141, 58, 29, 86,209, 96,147,244,196,158,215,225, 88, 24, 89,153, 81, 34, 63,131, 82,171,254,122,181, 92, 26,131,
+105,154,233, 62, 99,235,154,225,103,218, 57,223, 99, 99,189,225, 34,213,178, 78, 41,235, 84, 92,190,167,198, 65, 80,190,212,194,
+ 47,131,213, 15,209,242, 75, 84, 10,141,193, 61, 31,112,198, 57,164,229, 68,182,176,253, 25,106,201, 88,231,132,218, 38,132, 97,
+135,146, 38,133,162,196,241,140, 70, 47,134, 31, 62,174,190,200, 95,235,121,167, 36,157,153,133, 11, 35,242,186,232,129, 20,135,
+ 29,124,136,120,184,191, 35, 63, 98, 24, 96,157,197,114,154, 97,230, 9,187,195, 57, 33, 56,121, 23, 49,158, 29, 48,159,102, 29,
+ 61,146,128, 98, 64, 94, 23, 52, 52, 28, 14, 7,188,252,224, 93,140,129, 0,251,169, 56,188,189, 57, 97,158,110,144, 56,177,106,
+ 89, 27,214,121, 37,204,100,157, 80,203, 17,121,165,248,198, 48,140,136,187, 29,242, 58, 99, 62, 61, 98,220,159,227,241,238, 86,
+233,120, 41, 23,178,162, 57,143,229,116,194,178, 38,196, 97, 64, 28, 6,164,117, 38,228, 46,143,122, 74, 46, 40,166, 74, 2, 54,
+198,113,192,195, 60, 17,193,104, 28,248,176, 78,104,113,164,231,198, 24,248, 72,159, 79, 89, 41,249, 44, 12, 3,226, 48,162,178,
+ 50,157, 4, 94, 17,181,172,152, 31, 78,104, 48,216,157, 95, 98, 62, 62, 80, 84,226, 74, 98,166, 16, 28,214, 19, 85,179,227, 46,
+ 98, 24, 3,188, 59, 71, 78, 51,210,156, 16,134, 17, 67,188, 64, 78,180,167, 11, 59,218,107,150,188, 32,167, 70, 36, 47, 99, 48,
+ 29,143,228,249,126,188,225,151,184, 34, 12, 35,176,161, 89,181, 74,145,159,186,118,105,149,159, 47,238,244,197, 94,197,163, 37,
+233, 48,250,250, 70, 10, 11,238, 6, 91,197,126, 15,156,141,143,120,184, 27,112,249,236, 92, 61,195, 70,120,253,214,162,242,136,
+208,114, 12,107, 74,180,227, 75, 41,193,194, 32,163, 97, 77,183,120,231, 69,134,181, 5,214,120,188,122, 81,112,115,115, 15,148,
+130,221,217, 14, 46,142, 68,182,227,175,233,221,247, 94,224,245,235, 31, 48, 77,211, 19,107,204, 47,255,238, 26,127,255,243, 15,
+104,247,151, 11,220,238,128,101,158,209,130, 67,220, 81, 49,177,206, 43,242,154,241,223,255,251,159,176,212, 27, 12, 59, 66, 3,
+ 27,227, 0,238,142,196, 91,102,172,133, 51,118,227, 59, 54,154,112, 38,191, 76, 18,170,182,168, 72, 93, 59,241,175, 79,204, 29,
+104, 27, 32, 12, 29, 78,124, 24,215,130, 82,243,102,167,219, 35, 50, 69, 44,219,132,242,166, 33,148, 60,122,175, 6, 13,221,219,
+ 78, 69, 59, 84,152,199, 49,137, 40, 53,241,180,166,176,163,163,251,168,101,116,232, 92, 68, 8, 59,162,224,133, 29,156,139,176,
+ 46, 18, 77,209,121,246, 34,123,221, 31,246,220,245,218, 59, 99, 97,145,155,134,133,217, 5,153,147, 19,211,218,185,232, 46, 9,
+ 21,172,194,154,134,180, 90, 32, 52, 96,193, 19, 7, 64,107, 13,197, 86,118, 2, 61,133,141,136, 88, 85, 14, 85,201, 80,108,104,
+152, 78, 75, 23, 17, 55,179,193,208,146, 67, 72,160, 93,138, 45,206,189, 56,156,231,196, 81,166,221, 34,108, 57, 21, 81,114,230,
+ 5, 19, 45,194,217, 30, 0, 34, 7, 59, 61, 75,235,218,195,182,176, 81, 96,211,142, 63,108, 70,223,244,249,165, 76,223,193, 86,
+ 54,229,156, 69, 53,141, 74, 19,231,177, 44, 43,103, 85,152,141, 46, 9, 79, 48,175,150,197,147, 20,249, 92, 20, 35,222, 54, 46,
+135,156, 24, 38,149,170,254,121,222,123,190,128, 61,171,203,187, 80, 77, 72,156,145,191,110, 77,103,131, 99,170,156,213, 4, 79,
+249, 33, 85, 6,247,200,250, 72, 38, 56,114,137, 10,251, 99,147, 28,207, 43, 7,168,139, 42,248,160, 98,101,112, 35, 72,107,230,
+173,101,155,166, 14,158, 39,165,181,108,132,208,173,105,113, 83, 54, 89,243,242,243, 46,185, 80, 36,117,226,216,114,118, 28, 81,
+ 65, 80,225,172,127,146,149,208, 56,233,141, 88, 33, 22, 96,112,145,240,255, 83, 74,250, 92,249, 86, 11, 86, 22, 90, 17, 26, 20,
+104, 45,195, 6,135,188,146,120, 65,246, 84,121,157, 88,197,238,176, 76, 39, 24, 71, 98,163,148, 18, 92, 24, 40,148,165,100, 24,
+ 71,190,191,229,248, 64, 7, 69, 54, 44, 10,200, 27, 11,129,133, 31,123, 7,184, 46, 51,214,121,214,125,111, 28, 7, 28, 31,232,
+247, 47,203, 74, 48,130,113, 68,141, 25,181,144,248,195,199,128,117, 89, 49,238, 70,192, 56, 44,211,145,173, 7, 84,160, 68,107,
+112,241,236, 25, 14,135, 61, 1,108,106,192,237,219, 27,164, 92,136, 10,198,196, 48, 10,194,160,170,206,250,132, 86, 11,150,101,
+ 70,206, 75, 23,254,149,130,176,223,211, 37,207, 7, 76,136,196, 65, 46,165,114,208, 12,165,133,173,235, 74, 31,244,186, 96, 28,
+119, 40, 57,241, 97, 96, 20, 96,211,106,211, 16,141,211,241,136, 48,238, 97,204, 9,113, 24, 41,201,141,199, 81, 36, 50,170, 40,
+105,214, 49, 86, 45, 13,166,101,196,221, 14,243, 99,130, 99,189,192,178, 16,165, 13,188,131,234,228, 57,230,204,243,154,194,128,
+128, 45,178,151,105, 53,115,142,122, 3,204,138,253,197, 21,210, 58, 83,241,229, 7,164,101,194,186,172, 50, 75, 66,225,140,119,
+ 57,212,197, 35,227, 67,196,252,120,215,245, 20, 60,142,133, 86,221, 50,102,238,187, 86,242,127, 58, 21,207,160, 9, 74,182,194,
+ 52,178,228, 84,206, 46,110, 60,210,126,255, 93,135,207,190,120,192, 37, 14,212,189,177, 5,200,152, 2, 24,178,197,216,129, 86,
+ 41,202,180,102, 45, 66, 74, 11, 94,189,147,176,219,211,120,176,100,234, 62,119, 35,112,255,120,131,220, 14,120, 60,174,112,115,
+129,227, 36, 43,207, 7,202, 71, 31,125,128,127,253,215, 63,242, 75,239,240,222, 59, 87,120,239,227,159,161,249,145,242, 14, 24,
+149, 91,214, 4, 88, 7, 44, 43,124, 12, 88,150, 21,255,237, 15,127,194,106,239, 48,158,121,254, 58,146,234, 80,100,202,209, 96,
+117,125, 34,211,173, 14, 82,225, 60,239,121,166,253, 40,251,166,173,235,170,244,148,132,161, 94,216,226, 38, 91,128,162,187,211,
+ 62, 22,108, 29, 65, 41,232,205,210, 63,231, 86, 58,134,151,190,198,170,197,147, 0,147,106, 43, 26,176, 2, 22, 23,145,160,147,
+ 60,231,109,195, 70,223,230, 75, 24, 78,175, 10, 97, 7, 31, 70,132, 48, 34,132, 29,143, 24, 61, 96, 60,124,136, 26, 42, 34,151,
+182,149, 48, 35,116,129,153,138, 95, 25, 91,108,208,144,171,164, 15, 78,176,182, 41, 80,202, 90,139,253,110,196, 50,101, 10, 3,
+ 43, 14,130,226,161,244,197, 12,107, 87, 69, 89,103, 43, 88,234, 78,251,138,198,235, 85, 32, 29,178, 92,106,222, 19,164,197,130,
+214, 74,153, 57, 11,134, 89, 10, 68, 41,115,124,134, 82,247,182, 44, 43,175,178, 88, 15,176,137, 63, 22,216, 77,230, 9,136,247,
+100,231,162, 34, 96,229,245, 28, 21, 96,166,116,103, 2,217, 8,235,134,181,238,249,239, 15,106,143, 19,177, 29,173,208,184,168,
+102, 29,130,210,227, 74,210,157,240, 56, 68,157,194,210,121, 88, 55,118, 51, 46, 68, 74,121,114,121,213, 34,226,224,186,193,135,
+155,205,174,222,234, 4, 9, 27,240,146,188,179, 0,176,206, 11, 39, 90,174,234, 12, 17, 7, 86,171,149,226,127, 55, 92, 2,153,
+102, 60,241,144, 11,216,133,187,222,233, 68, 86, 69,142,250, 80, 52,120, 90,217,189, 33, 43,102,187, 41,178, 44,157,219,162,253,
+ 33,113, 31, 41,209,177,177,255, 73,161,101, 89,244, 75,176,180,198,246,195,166, 69,214,188,204,124,177,211,207,191,241,247, 75,
+171,163,190, 82,168, 98, 85, 53, 93, 8, 40,224, 30,177,141,139, 85,180,177,158,198, 11,135, 89, 56,196,226,149,110, 12,243, 23,
+139, 85,173, 5,203, 60,161,150, 30,140,178, 59, 27,112,124,152,216, 94,181, 96, 24,247,120,188, 61, 97,119, 56, 32, 45,139,130,
+ 46, 4, 21,106, 55, 99, 15, 88,131,146, 38, 22,206, 88,248,232,148,132, 68, 66,173,128,113,127, 1,227, 44,198, 67, 99,170, 86,
+ 69, 41,143, 84, 32, 44, 19,198,179, 11,184,156,225,195,128,180,204, 8,193,225,242,226, 28,215, 87,231,120,246,226, 21, 30,111,
+239,145,114,197,219,155,137, 20,143,126,196,195,237,137,119, 81,128, 13, 30, 97, 31, 65, 19,149,202,153,196, 64, 53,108,147,147,
+ 68, 44,221, 9,202,104,202,178,159,144, 46,169,202,123, 49,231, 45,140,143, 24,207,162,194,102, 72,253,154,144, 83,247, 38, 74,
+103, 37, 15, 78,205, 25,158, 59, 67, 24, 10,105, 65,171,112, 49,243, 3,218,179,144,125, 12,138, 71,181,206, 32,179,118,192, 88,
+ 25,199,109,212,211,173, 91,210,168,226,167, 11,213,251, 78, 43,179,206,179,149, 35,232, 1, 41, 99,173,117, 73,216,133, 29,194,
+238, 12, 62,142, 44, 62, 2, 92,205, 72,147,248,200,105,149, 50,236,246, 88, 79,143,122, 0, 98,131,208, 52,130,101, 84, 56,141,
+237, 59,184,214, 0, 39,233,125,242,114,115,149,207,144, 13, 81,169,215, 66, 88,212,188, 38,188,184,170, 56, 30, 39,236,118,180,
+ 3,243,214,194,120,234, 32, 91,227,125,220,208,253,231,104, 5,131,127,196,229,243, 5, 62, 24,180, 70, 93,132,120, 79,209, 26,
+206,207, 78,152, 78, 84,172,182, 90, 57,102,184, 34,238,207,248, 98,240, 24, 99,192,237,253, 17, 47, 94, 92,227,163, 79, 62, 70,
+181, 1,211,146,209,214,153, 39, 1,141,125,193, 11,210,106,241,248,195, 29,254,244,213, 95,144,237, 3,226,208, 19,183,250, 24,
+189, 42,159, 90,190,239,101, 73,170, 63, 72, 41,177,142, 34,107,198,122, 15,161,200, 48,213,232, 63, 83,129, 90, 45, 76,106,107,
+155,108,242, 78, 11, 20, 39,137, 88,214, 58, 20,134, 62, 59, 26,229, 54, 13,184, 48,182, 23,103,212, 17, 85,137,107, 71, 46, 73,
+ 69, 81, 45, 37,237, 91, 37,233,176,199,182,244,110,215,218, 0,239, 7,222,161, 15,112,126,228,156,131, 72, 23,186, 15, 42,204,
+ 36, 64, 82,183, 81,130,173, 87,102, 11,190,146,139,134, 33, 55, 57,173, 88,230, 9, 41, 45,104,141,198,169, 49, 4,192, 91,204,
+115,215,120,160, 1, 33, 22,140, 24, 80,162,135, 19, 15,112, 54,236, 40,161,110,169,176,170, 89,227,154, 25, 84,164,128,166,202,
+144, 31,167, 70, 29,233,119, 85,221,221, 26, 80, 76,238,212, 52, 94, 7, 88, 55,242,154,164, 48,147, 34,107, 40,143,136,248, 74,
+202,128,119, 88, 87,201, 71, 47, 24,135,160,144, 26,201,198, 40,133, 86,124,212,169, 59,212,146, 52,115,163, 85,218,207, 18,110,
+187,193, 90,118, 8,193, 96,220, 57,140, 99, 84, 33,236,184,139,172, 25,177, 60,241,168,184,191,123,196,241,241,164,185,225,149,
+ 11,144, 53, 37, 22, 25,214, 46,170, 91,133, 51, 66, 23,111,181,189,187,207,169,243,209, 37,134,186, 86,163,151,107,215, 65,244,
+207, 64, 28, 80, 82, 36, 88,107, 40, 60,138, 47,120,209, 60,208, 62,221, 0,182, 23, 21, 98, 29,116,190,175, 36,131,183, 58,217,
+ 17, 38,134,116,243,243,178,112, 90,101, 64, 94,179,254,172, 20,246, 83, 27,115, 7, 54, 12, 1,136,253,208,117,202,101,112,188,
+ 62, 73, 72,107,183, 24,231,148,217, 54,156,168,217,227,201,142,164,188, 81,250,100, 85,173,131, 20, 55,146,126,168, 23, 59,175,
+ 37,139, 18, 74, 29, 11, 83, 29,252,186,172, 92, 5,122,180, 2,246, 13,246,131, 85,148,235,149,119, 15, 82,177, 91, 67,221,117,
+171, 5,198, 89,204,199, 35,156, 15,136,187, 17, 46, 4, 44,211,157,126, 8, 84,197,122,245,219,137, 82,176,150, 4, 88,202, 60,
+ 94, 78, 51,226,184, 71,195, 91, 78, 76, 75,200,105, 65,157,201,128, 31, 98,192, 50, 23,221,207, 82,101,150,177, 59, 59,224,213,
+171,107, 28, 6,143, 24, 34,114, 1,166, 57,227,205,155, 35,238,110, 30, 81, 91, 83,203,211,238,224, 81,249,208,141,187,128,218,
+ 18, 74, 90, 81, 82,227,149,194,129, 5, 62, 76, 17,242, 91,102, 47, 93,162,100, 19, 41,136, 60,206, 33, 61, 0,117,252,214, 39,
+ 76,167, 19, 42,131, 91,156,119, 40, 43,244,197,139,145,124,186,158, 59,116,234,242, 73, 76,130,154, 17,247,103,152,143, 39,141,
+225,139, 49,162,172, 19,130,241, 24,198, 29, 74,201, 88,231, 35, 10,167, 25,237, 14, 23,212,161,173, 9,113,207, 16,154, 2,197,
+ 64, 58,215,243,136, 99,244,250, 67,151,196, 43,225,230, 67,210,175, 56,241,168,150,172,211,134,117,153,144,150,169,123, 37,217,
+ 42,229,196,137,224, 44,118,103,231, 88,166, 71, 70,243,242, 88, 40,117, 59,145,118,234,218, 85, 17,158, 82, 81,195, 44,254,145,
+ 81, 99,102,130, 30, 17,195,154, 30, 24,149,121,220,181, 1, 87,207,128, 63,255,245, 17,105,217,113,128,133,165, 9,145,233,209,
+150,214,128,246,136,229,136,171,139, 9,103,123,240,133,207,221, 49,103, 51, 27,235,128, 90,176, 27, 27,110,238,110,128,246, 2,
+121, 77,152,166, 5,113, 24, 49,223, 29, 53,141,233,234,250, 25,113,226,223,123, 7,107, 42, 72,169,160,166, 5,168, 69,157, 13,
+196, 13, 95,241,211,155, 91,124,251,211,119, 56,123, 70,105,114,116, 49, 87, 69,239,138,216,166,214,181,239,200, 75, 81,177,151,
+188, 63,125, 15,202, 54,174, 82, 96, 18, 84, 0,213, 26,255,218, 86,225, 26,117, 63,164, 8,110, 42,164, 34, 6,188,225, 11,163,
+109, 58, 77,190,116, 91,209, 72, 84,176,205, 80,212,208,132,104, 23, 32, 82, 23,207,149,154,249,247, 53,221,167,226,111, 58,243,
+142, 73, 21, 65,156,103, 85,251, 30,214,122, 88, 55,192,121,182,170,109, 21,238,214,246, 14,133, 39, 68, 13,228, 11, 23,171,145,
+140, 30, 11,219, 59, 41, 32,134, 47,244,188,160,148,149, 38, 61,213,160,213,128, 80, 9,100,100, 48,192, 89,242, 1,251,224,177,
+174,148,229, 62, 12, 77, 63,243,110, 21,229, 44,241,232,177, 46, 52, 46, 37,219,158,215,142, 51, 68,143,117, 45,170, 78,223,159,
+197,110, 11, 86,177,150,132,153, 84,205,164,167,239,147,232,117,178,187, 45, 62,192, 57, 48,141,142,154,170,236, 51,159, 63,244,
+ 94, 73,172,169,228,177,203, 69, 93,231,138, 24,189,114, 58,182,142, 27,161, 85, 6,198, 94,203, 24,126,183, 27,158,216,107,155,
+138,184, 54, 33, 58,206,226,234,197, 21,222,254,116,135, 31,191,251, 1,211, 52,235, 78, 56, 4,199,235, 51,163, 5, 14,193, 80,
+208,133,144,205,104, 48,148, 92, 80,235, 90,213,107,238, 28, 11, 47, 83, 71,116,111,105,141,142, 83, 51,229, 25, 34, 70, 73,238,
+ 57, 18,173,145, 5,147, 29, 0,224,134,133, 4,138, 13,134,125,238, 6, 64,225, 53, 83,226,103, 71,160, 74,228,128, 96,126, 70,
+163,228,192,202, 83, 15, 89,255,136,149, 82, 68,173,226, 87,167,207,218, 43, 10,183,129,220, 87, 36, 82,164,207, 53,229, 76, 19,
+ 87,118, 12, 56,103, 80,114, 71,207, 90,198,134,171,242, 95,194,211, 56, 41,142,166,131, 30, 77, 50,224, 13,101, 97, 9, 61,178,
+148,130, 97, 32,206,191, 55, 32, 15, 37,184,250,234,204,110,167, 10,233, 16, 61, 82, 74, 8,195,128,202, 49,137,214, 7,148,188,
+234,190,207, 88,131,117,158, 48,236,206, 48, 61, 62, 42,223,184,143,240,168,203,203, 57,195,135,168, 7,155,103, 33,193,180,208,
+254,207,179,177,190,230,140, 16,119,200,121,102,185,190,195,249,213, 57, 30,239,238,176,219,141,120,126,117,129,119, 94,189,194,
+229,245,115, 60,222, 31,241,240,112,196, 79,111,238, 81,106, 67, 46, 13, 97,215, 48,157,102, 85,178,134,232, 96, 93,131,243,116,
+ 0,132, 33, 98,153,120,244, 99, 44,134,221, 64,226, 13,102, 27,247,132, 54,186,176, 99,116,202, 50, 22,123, 8,189,140, 34,148,
+105, 88,166, 9, 33,142,104, 62, 35,175,137,196,128,195,136,178,206, 24, 70, 30,125,177, 5,171,172, 5, 99, 12,240, 43,217,181,
+ 74,166, 2,163,150,130,113, 71,144,140, 17,173,143,234, 56,144,165,100, 82,214,135,184,211,131, 86,146,178,164, 82,118,222,118,
+150,115,240,168, 60,226,211, 49,215, 70, 37, 76,137, 76, 93, 41,238, 60,137,147, 36,117, 41,205, 19,206, 46, 46,144,230, 25, 57,
+ 45,100, 59,218,141, 72,243, 9,206, 91,248,184, 35,107,147,198, 80,209,190, 72, 88,244,210,174, 9,128, 71,128, 35, 85,178,177,
+ 45, 95, 8,140,173,173,165, 50,212,134, 65, 69,210,201,182, 30,206, 97,172,131,119, 6,231,251, 5,199,211,140,103,151, 52,134,
+175,220, 77,197,104,208,106,194, 52,157, 16,221, 29, 46, 46,243, 38,151, 90, 98,100,177, 73,174,227,136, 90, 52, 28, 14, 19, 30,
+ 78, 73,109,101,133,125,225, 41,145,111,221,143,103,184,126, 53,224,238,254,136,187,251, 19, 74, 78,240,166, 98, 8, 30,251, 93,
+160, 0,161,148,241,240,240,136,111,126,248, 26, 23,215, 64,201, 70,109, 43,137,137, 89,178,103,125,124, 60,110, 88,255,165,231,
+142, 51,120,200, 26,199, 23, 73,247,176, 11,204,162,212,222,141, 11, 64,100, 59,126, 4,122,124,170,250, 92,101,156, 46,223,188,
+129,142,250,244, 61, 21, 23, 6,239, 72, 75,237,182, 44, 26, 19, 39,141,195,148,162, 64, 24, 18, 79,187,243,167,119,188,247, 3,
+ 98,216, 33, 68, 82,183,123, 63, 80, 56,139,161,112, 22, 99,156, 30,198,133,125,249, 41,103,242, 81,203,247, 42, 19,142,210,145,
+180,148,228,150,177,174, 11,210,186, 32,231, 5, 37, 47,168, 53,161,148,196, 32,173, 8,107, 6,254,245,158,109,125,134,113,172,
+ 3,131,102,168, 51,222,237, 7, 84,161,127,165,132,194, 66,193, 90, 43,198, 49,160, 20,160, 22,234, 20,119,251,129,115, 21, 26,
+114,166,247,239,248, 48,179, 54, 8,234,109,174,121,213, 75,198,106, 39,201,172,111, 99,148, 69, 17,135,158,184, 70, 66,224,130,
+ 56, 68, 88, 67,207, 32,197,150, 50,155,157,139, 41,241,207,239,207,118, 60, 49, 36,208,205,225, 16, 52, 7, 93, 38,166,134, 93,
+ 55, 20,192,226,213, 49, 2, 0,235,105,162,162,100, 79,184,211,113, 63,192, 26, 75, 80, 33,231,176, 63,203, 8,113,196,195,253,
+163,186, 75, 40, 55,220,245,216,221,214,148,154,166,158,108, 35,254,234, 62,173,180, 90, 1, 50,207,128,131,123, 72, 24, 72, 93,
+110,229, 36, 76,153,102, 57,187, 93, 25,210,247,147, 57,115,188,242, 89,102,248, 60,174, 10, 69,178, 27, 90,158,233,239,178,114,
+251,141, 90, 54,231, 57, 61, 73,150,115, 76,164,171, 76,164,147,157,117,226,248,211, 56, 4,222,118,246,239,179,129, 92, 19,164,
+ 65,232, 89,232, 66,141, 36,248, 13, 21,101,113, 28, 41, 18, 92, 86,211, 76, 81, 37,216, 13, 1,139,106, 33,198, 2, 9,194,171,
+178,244,183,172, 0,233,212,229,188,245, 57,173, 36, 70, 74, 34,234, 72,122, 56, 26,182,212,228,149, 18,185,166,121,198,217,197,
+ 5, 89,136,150, 19, 10,131, 0,218,204, 10,199, 64,106,200,117,153,249,130,225, 60, 91,174, 52, 8, 77,104, 68,114,163,232,214,
+101, 94, 97,172,197,186, 30, 17,198, 29,210,186,208, 68,160,172,136,113,196,176, 59,131, 51, 22, 87, 23,103, 56,124,248, 14, 14,
+103,103,152,167,140,227, 41,227,230,254, 39,220,221,222, 34,113, 7, 87,106, 35,238,110,164,238, 38,151,132, 97,180, 0, 86, 24,
+ 59,192, 7,131,156,128,156, 22, 88, 79,221,125, 43, 5,203,188,162,193, 17, 66, 82,109, 75,149,217,210, 86,187, 34, 99, 13, 76,
+ 51, 88, 78, 51,252, 16,177,174, 21, 41,157,244, 18, 51,166, 34,238,118,136,227,158,190,247,156,104,229, 44,160, 26,111, 52,147,
+ 93, 36, 82, 34, 52,146,195,119, 93,146,190, 48,181, 85,160, 20,228, 83,198,184,223, 97,220,147,242,127, 93, 23,245, 69,194,144,
+216, 48,196,160,187,117,231, 12,210,124,194, 56,238,176, 59, 59,224,116,119, 75,228, 58,103, 20, 44, 4,211, 11, 43,218,221, 88,
+ 77, 97, 35, 23, 5, 83,186, 78, 71,248, 56, 96,207,214,195, 52,157,244, 98, 26,246,228, 37, 15,195, 8,107,104,167,152, 78,247,
+ 60, 54,134,238,191, 84,184,195,237,141, 36, 90, 45,115, 81, 14,193,186,102, 13,117,145,139,140, 96, 15, 44, 42,107, 18,145, 72,
+ 7,250,229, 69,195, 23, 95,221,224,217,197, 25, 93, 44, 92,184, 44,203,138,156, 30,240,236,226,136,224, 36,210, 51,117,174, 60,
+ 63,147,102,147, 91,208, 84, 77, 93,129,246, 6,181, 61, 39,123,158, 49, 90,156, 54, 30,167,206,185,114, 17,150, 96, 77,195, 84,
+ 27, 30,141,193,221,163,195,126, 23,113,188,191, 71,198, 61,174, 95, 9, 34,149,116, 7,162, 94,149,221, 52,237,176,169, 75, 22,
+ 78,184, 66, 40, 88, 60,152, 91,209,168,227, 45,133,173,176,226, 85,236,111,236,100,163,175,210, 26,221,211, 3,181,171,233,177,
+ 17, 86, 9,175, 92, 81,183,156,135,174, 43,236,198,254,254,194,163,191,170,207,198,223,182,225,205,244,175,171,239, 50,183,255,
+ 50,136,145,236,106,206, 13, 12,151,137,108, 91,243,112,214,195,160,175,145,232, 96,183,250, 25,232,104,114, 67, 87,147,233, 64,
+206,133,186,243,101, 65, 90,103,164, 76,209,205,212,161,175, 48, 40, 0, 40, 80,169, 56,135,182,210,179,228,125,224,142,145,118,
+181,194,197,112,187, 81,151,255,235,146,148, 98, 38,240, 24, 81,161, 75,113, 54, 79,237, 9,102, 84, 46,178,113, 36,225, 36, 15,
+ 54,248,247, 22, 69, 41, 91,211, 35, 59,165,120, 10,209,245,125, 52,127,191,187, 33, 80,126, 3,120,125,217,186,138, 90,118,207,
+222,247,236,121,183,167,179,234,252,226,208, 21,243, 60,129, 17,112, 75, 90,105,220, 63, 12, 17, 11,219,142, 97, 44,246,251,145,
+ 69,204, 22,203,188,224,246,230, 30,243, 52, 99,158,201,118,108,109, 64,202, 85,173,140,165, 18,236,167, 42, 36, 11,155, 24, 85,
+210,104,200, 26,176,150, 94,234,105, 49, 93,187, 48, 12, 60, 6,167,128, 41,217,145, 23, 53, 45, 27, 75,235, 80,141, 30, 54,196,
+200,215,104,110,214,205, 40, 76,137,195,195, 72, 48,219,119,227, 50,209, 82,133,124,233,107, 8, 89,177, 90, 93, 77,118, 31,124,
+213,192, 35,167, 52, 71, 65,105,167,212,116, 50,230,172,229, 66,212,105,130,225,178,172,154,174, 6,190,244,231,121,229, 75,155,
+190,231, 97,116,124, 38, 85,157, 80,200, 62,189,255, 28,123, 48, 12, 74,213, 66, 72,139,122, 33, 18,254,223,255,249,223, 55,242,
+ 66,123, 13,112, 55,155,100, 33, 18, 90, 4,205,115,150,208,135,192, 68, 56,203,134,120,231, 3,118,103,231, 84,181,230,172, 25,
+188,158,171,211,170,252,117, 11,239, 35,174, 95, 94,195,199, 1, 46, 70,164, 53, 35, 45, 51,230,211, 17,211,241,164, 40,191,221,
+ 56,224,234,242, 18, 87,207, 46,224, 92,196,178, 20, 60,220, 79, 56, 77, 43, 93,226, 54,224,248,120,162, 23,187, 84, 13,228,240,
+193,194,218,138,113, 71,151,180, 8, 0,125,112,218,173, 40,217,201, 82,103,158,216,114,150, 57,134,209, 57,139,101, 78, 60,202,
+222,238, 52,232, 67, 89,230,164,149, 18,241,214,161, 99, 49,195,187, 55, 17,131, 41,158, 83,160, 14,219,131,153,247,154,228, 61,
+175, 93, 25,203,191,191,176,154,216, 24,244, 75,141, 69, 67,206,154, 13,172,164,234,190,104, 93,215, 77, 85,203,227,237, 84, 57,
+105,174,169, 34, 83, 84,231, 70,241,163,153,233, 80,108,171,225, 7, 65,236, 74,129, 31,194,162,161, 29, 76,151,115,244,115, 85,
+181,116,235, 97, 15,114, 73,200,129,166,212, 51,174,154,197,163,107,141,217,124, 70,146,136, 5,189,192, 5,182, 65,225, 5, 85,
+121,248,223,126,223,224,252, 75, 60,191,186,192,237,237, 3, 30,142, 15,184,122,182,226,226,156,190, 15,221,229, 51, 18, 82,197,
+103,149, 43,124, 30,139, 11,249,176, 54, 96, 77,192, 15, 63,158,225,112,184, 68,169,224,128, 29,154,104,164, 92,144,115,165,236,
+226,148, 16, 25, 78, 34, 7,201,221,221, 45,206, 46, 18,206,206,141,134,147, 72,225,176,229,172, 83, 49,151, 54,207, 86,223,209,
+146,197,180,118,176, 38, 39, 19, 54, 30,131,151,218, 54, 25,220,142, 15, 63,137,103,229,120, 27, 43,226,212,196,214, 23,206, 10,
+216,228,119,203,243, 79,226,163,162,147, 31,152,246, 4, 97,218,239,239,214, 59,239,206,167, 17, 97,250, 38,189, 11, 79,190,190,
+ 24,119,240, 46,194,249, 17,145,211,213,156,139,236, 6, 97, 76, 50,243,204,101,236,174, 35, 85, 97, 59,240,179,174, 9,101,149,
+ 10,161,156, 87,164,180, 96,153, 39,180,150,145,185, 67,111, 53,211,127,114,218, 27,157, 89,103,212, 36, 12,180,203,143,195, 14,
+222, 5,132, 24, 17,227,136,113, 55, 80,129,202,163,233, 16,131, 38,136,137, 21, 41,198, 64, 80,162, 33, 98, 93,211,147,131, 82,
+ 10,227, 24,189, 66, 94,100,245, 38,144, 38, 99,240, 55,180, 75,232,106, 69,131,116,184,184,150,177, 58, 52,147,157, 8,158,242,
+191,149,203,222,122,224, 21,237,145,141,186,108,196, 63,157, 89,109,189,157,230, 16, 37,146,119,213, 28, 69,124,124, 60,225,248,
+120,194, 52, 77,152, 78, 51, 23, 59, 21,173, 57, 60,123,254, 46, 78,199, 71,164,229, 78,145,215,214, 89,122, 7, 88,128,215, 3,
+127,140, 90,197, 68, 4, 40,147, 32, 81,215,203,138,169,181,110, 51, 67,235,171, 58,121,223,181, 43,229,239,205, 8,148,102,115,
+166, 10,203, 68,166,145,242, 32, 54,126,119,132,175,226, 92,207,171, 16,129,104, 78,165,255, 76, 96, 25,169, 29,224, 67,208, 53,
+139, 99, 20,117,136, 65,209,223,178,166,210,115,149,167, 1, 82,152,175,107, 70,201, 25, 41, 37, 44,203,162,163,117,249,187, 58,
+205,181,105,206, 10,176, 81,200, 11,154,184,210,202,205,179,128, 86, 3,121,176, 41, 84,106,213, 53,157,151,177,157, 38,107,109,
+ 30, 54, 17, 25,208, 88,201,233, 33,228,125, 64, 54, 77,125,116,165, 0, 46, 12, 72, 57, 99, 62,157,224, 67, 64,203, 69,199,133,
+ 70,160,255,220,173, 91,233, 38, 35, 65, 91, 4, 90, 95, 50,169,180,159, 63,123,142, 87,175, 94,192, 57,143,105, 74,184,189, 95,
+113, 58, 30,145,107,195,233,180,226,248,184,192,248,128, 56, 0, 15, 15, 19,137, 18,188, 5, 76,134,117,181,239,179, 75,163,175,
+141,247, 73, 89,125,155,141,145,141,204, 74,111, 61,104, 68, 46,238,170, 56,206, 46, 98,160,157, 34,212, 75, 88, 53,128,130,249,
+219,181, 17, 42,112, 19,159,183, 77, 70,146, 93,149,140,174,156,165, 41,133, 88, 82,100,172,178, 46, 9, 33,144,237, 3,173, 98,
+ 24,189, 30,236,166, 81,144, 70,201, 5,205,118, 62,178, 84,137,181, 85, 70, 31, 66, 85,174,222, 89, 88, 47,251, 56, 43, 75, 84,
+ 6, 37,212, 30, 58,163, 15, 38,137,255, 42,251,114,185, 54, 32,188,168,118,224,230,201,131,108, 93,213,140,110,203, 47,158,184,
+ 4,192,240,154,194, 5,144, 15,244,146, 9,228,145,108, 83, 20,150, 65, 69, 22,120,220,201,104, 73,174, 70, 9,126, 87,200,106,
+195,136,224,151, 47, 12,254,240,249, 91, 76,243,140,232, 31,241,225, 7, 86,199,155,180,183,244, 10, 35, 49,155,238,200,122,175,
+226, 36,186,240,179, 94,114, 6, 5, 49,172,184,189, 49, 24, 3,181, 81, 51, 0, 0, 15,117, 73, 68, 65, 84,134, 65, 85,227,196,
+253,167, 12,131,182,174, 8,214, 34,179, 43, 96, 45, 21,211,250,136,243,203, 21, 97, 52,200,197,233,197, 35,202,254,182, 9, 47,
+217,190,188, 66,212, 51,205, 60, 1, 91, 84,197,134,242,200, 17, 85,187, 32, 18, 13,109, 40,132, 60,222, 19,107,155, 92,212, 6,
+146,154,199,216, 88, 94,101, 72, 33,208, 74,235,255,187,117,133,174,217,220,222,230,111, 47,116, 60,129,224,109,238,248, 13,141,
+142,125,182,129,249,237, 33,208,101, 78, 96,153, 64,121, 9,214,169,239, 90,148,238,212, 60,208,138, 72, 4, 96,102,147,143,190,
+221,159,175,235, 74, 4,202,188,176, 46,129,186,243, 90, 18,249,214,217,190,215,211, 14, 87,148, 66, 17,192,198, 56,132, 80, 80,
+ 96,224,170,195,233,116, 82, 1, 92, 74, 96, 33, 18,189, 35,105, 77,234, 53, 78,107, 67,225,221,185, 36,147,137, 69, 73, 88, 20,
+153,197, 94,130, 9,149,213,147,196, 84,251, 90, 53, 24, 68,146,185, 2,239,194,101,151,236,156,225,208,162,166,169,107, 50,186,
+118,150,196,114,173,153, 30,155,202,204, 14, 10, 52, 34, 32,148, 36,247,201,115, 47,255,166, 88,107,139,227,241,132,101, 94,112,
+ 58, 78, 72, 41, 97, 58, 45,180, 86,228, 34,160,243, 7, 40,242,247,248,120,194,186, 76,204, 40,105,154,174, 56, 77,243, 19, 17,
+161,142,152, 89, 41,110,108, 63, 11,169, 1,226, 11,152,207, 88,176,166,131, 86,201, 22,173, 64, 27, 13,171, 49,223,178, 38,107,
+ 42,152,148,144, 43, 17,210, 78, 75, 82, 87,132,156, 61,221,114,215,167,175,212, 76,249,206,172,231, 59,140,158, 89,104,128, 76,
+173, 21,235,178, 34, 12,145,244, 21,206, 49, 91,194,116, 91,166,193, 19,180, 47,221, 99, 69,173,106,203, 66,159,169,172, 87,140,
+181, 88,151,117,147,244,102, 54, 86,188,170,231,129,198, 14,115,194, 27,173, 99,184, 49,226,245,130,156,191,164,115,233, 5,181,
+231, 12, 35,162,240, 88,203,248,199,158,125, 43,187,207,156, 87, 86,165,210, 14, 11,153,237, 23,193,227,240,236, 57, 90, 51,152,
+143, 15, 12,245, 23,241, 6, 80, 83,131,247,161,123,123, 45, 61,200, 68,161,107,240,129,190,152,253,126,196,203,103,231, 8,206,
+ 35,165,134,159,222, 76,152,166, 21,243,156,144, 75, 35, 81, 18,167,148,237,175,158, 33,173, 9,211, 60, 33, 12, 22, 33, 22,180,
+ 58,179,157,141,148,205, 90,237,212,202, 15, 85, 85,171, 27,212, 71, 8, 77, 18, 43,165,193,251, 30,195,186,204, 36, 70, 19,111,
+ 44, 76,235, 47,112,237, 30,234, 90,179, 90, 34,114,238, 54, 34, 99, 13, 26, 67, 56,100, 76, 35,221,156, 40, 26, 73,100,199,151,
+220, 38,178,144, 88,210,244,194, 72, 80,128, 88,196, 52, 0, 0, 82,156, 88, 13, 64, 49,242,119,240,195,101,184,184,201,185,106,
+177, 86, 56, 58,146,198,202, 89, 89,208,208,206, 12, 76,113,227, 52, 35, 21,148, 84,189, 60,156,119,172,115,128,194, 99, 68, 45,
+ 43, 43, 23, 65,153,166, 53, 49,121,176,176,250,150,212,235,150,191, 46,137,148,108,173,160,149,138,102,232,247, 56,239, 0,107,
+209, 74,225,189, 22, 58, 74,183,117, 69,117, 8, 13,239,190,172, 56, 28, 38,140, 99,208,226,141, 72, 95, 13,144, 46,191, 86,254,
+ 51,250, 56,187,177, 32, 70,190,175,156, 23, 10,229,169, 5,187,161,226,246,230, 45,156,189,166, 29, 42,167, 36, 89,107, 17,157,
+193,249, 97,135,148, 18,230,156,240,211,219,123,184, 97,194,243,119,156, 2, 78,138,178,249,205,223,132, 95, 72, 4,234,255,223,
+214,181,237,216,109, 28,193,154, 11,201, 93, 57, 78,236,135, 0, 9, 96, 63,228,255, 63, 43, 15, 14, 16, 59,182,172, 61,231,144,
+115,233,201, 67, 87,247, 12,109, 9, 16, 4, 44, 36,237,146,135,156,238,174,174, 75, 92, 34, 87,181, 83, 79,132,129,199,178, 11,
+159, 40,204,156,218,215, 73,217,236, 52,173,249,180,230,199,190, 30,252,239,117,202,172, 26,167, 78,251,179,227, 38, 87,192, 36,
+ 35, 33,172,243,121,184, 23,246,101, 37, 57,198, 82,227,131,197,119,110, 94,208,247, 67,161,219,141,153,232,192, 44,232,112, 98,
+ 26,156,209,222,250,156,220, 76,114, 55, 29, 25, 59,122,107, 40,245,242,130,174,158, 10, 85,207,165, 81, 1, 84, 90,191,172, 77,
+ 53,208,165, 18,185,216,144, 82, 67,109, 21, 57,155, 90,100,195,121, 94, 8, 81, 27,185,109,219,200,124,166,206,155,205,106,135,
+224,245, 58, 85,158,118,108, 14,211,170, 15,133, 65,231,112,207,246, 45, 37, 8, 39, 84, 51,100,114, 75,107, 78, 97, 58, 81,235,
+174,214,154, 2, 35, 40, 91,163, 16, 34,152,205,173, 15,255,182,103, 95,147, 25,167,166, 92, 5,163,171,252,106, 14, 29,211, 6,
+ 22, 67, 11,240,235,169, 83,248,227,241,100,222,195,148, 90, 53,114, 24,148,209, 62,188,129,120,251,116,208, 0,168, 65,216,156,
+152,237,172, 41, 45,134, 8, 98,200,158, 97,111,143,145,197,209,118,242, 65,114,202,254, 46,169,194, 69,125,243, 83, 74,142, 32,
+ 26,170, 97,201,115, 49, 76, 94,138, 77,234,118, 63, 12,221, 51, 91,104,227,121,105, 61, 91, 99,136,103, 86,155, 57,245, 37,222,
+103,115,228, 84, 4, 35,123,100,177,237,235,117, 55,222,177,167,233,187, 98, 60, 29,131,253,205,213, 80,155,121, 54,157,173,222,
+204,162,208,187,171, 78,212, 13, 86,207,233,110,140,251,218, 16,227, 68, 61, 76,249,209, 91,115,228,213,243,215,137, 42, 91,212,
+116,167, 9, 82, 6, 4,209,187, 22, 97,197,159,187,179,141,249,189, 70,167,183, 27, 97,111,118,111, 13, 95,126,253, 89, 15,235,
+214, 61,151, 86, 53,233,137, 58,214,177,236,194, 42, 90,219,244, 34, 14,229,112,126,251,118, 32, 33,224,247,207, 23, 94,175, 7,
+158,175,130,243,210, 29,215,117, 53,196,108, 83,139, 78,142,143, 47,191, 33, 39,193,113,116, 79, 19,179,125,181,194, 53,209, 39,
+229, 28,130,134, 27,208,223,215,166,108,125,209,231,174, 55,165,192, 0, 2,157,110,246, 35, 47,153,226,184,153, 10,120,210, 34,
+221,198,202,213, 72, 72, 81,105, 96, 38, 81, 77,117,160, 1, 49, 42,179,242, 60,139, 63,148, 66,223,246,108, 4, 69,179, 11, 13,
+240,140,112,149, 92,204,137, 78,247,159,253,118, 0,175, 48,220,236, 22, 53, 24, 99,176,235, 11,113,129, 80, 57, 1, 91, 62,180,
+ 70, 54,138,107,218, 3,244,250, 58,253,169,253,112, 29, 97,153, 2,131,119,218,154,122, 74,171, 69,139, 37,140,137,135, 48, 83,
+228, 74, 33, 66, 48,240,122, 40,255,160, 94,250,176,231,180,234,118, 59, 66, 87,184, 83, 95,242,232, 5,195,156,182, 52,242,176,
+249,164,222, 91,197,247,223, 1, 67, 42,202, 53,227,125,253, 90,237,112,176,156,110, 55, 24, 17,111,106,220, 95, 61, 48, 87,122,
+232,117,126,247,221,137, 95,254,243, 63,236,251,155, 42, 29, 74,197,219,177, 97,223,222,241,122,105,206,241, 79,255,253, 5,127,
+253,190,226,239,255,248,228, 76,122,157, 20, 4, 0, 19,157,114,102, 97, 45, 12,199,208, 67, 77,245,228,118,176, 36,247,111,182,
+104, 82,135,249, 48,247,182,198,202,118,184,117, 76, 57,142,174, 62,132,205,100, 92, 32,117, 42, 13, 32,186, 34,185,193,232,227,
+207,108,245,177, 74,179,194, 77,243,107,187, 61, 47,232,127, 34,188, 7, 45,228,187,234,207,119,146,226, 98, 82,103,200, 85,125,
+ 97,202, 11,243,235,246, 92,239, 46,124,180,105, 98,211,245,231,174, 77, 61, 42,106, 43,184,174, 23, 73,112, 69,239,171, 84,200,
+104, 24,210,110, 43, 14,191, 30,207,119, 47, 16,217,209,187,146, 83,115,214,176, 17,164,140, 24, 6,141, 78, 56,169,146,236,123,
+ 28,135,146,157, 24,245,171, 13,250,180,216, 77, 35, 57,241,209, 62, 43,203, 67,183, 70,206, 66,139, 34, 77, 96,212,149, 13, 44,
+ 14,244,163,168,170, 58, 17, 1,114, 86,228,107,223,178, 26, 71, 5, 96,132,225,196,177,141,214,220,103,189, 92, 1,227,106,163,
+ 23,220,203,222, 62,251,215,243,196,243,161, 30, 26,154,160,216, 60,186,216, 10,184,145, 36,173,209, 53,180, 40,229, 12, 25, 17,
+ 32, 26,226,166, 39,214,188,218,170,144,239,175,177,254, 91,155,235, 66, 55,127,177,240,120, 26, 33,217,207,108,146, 47,251,173,
+ 4,228,230,141,159,121, 47,140,133,133, 89, 59,179, 72,168,134, 82, 2,174, 44,171,161,224, 82,199,225, 68,225,137,154,165,148,
+200, 63, 74, 72,121,195,182,101,198,135,139, 15,129, 54,100, 89,146, 95,163,228,176, 93, 21,177, 69, 59,130,253, 68,190,248, 89,
+ 61, 30, 31,254,238,205,204,140,238, 36, 97,107,240, 60, 69,174,119, 52,147,116,135,225, 28, 46,243, 2, 25, 67, 0,161, 14, 94,
+132,110,232, 51,115,161,209, 99, 66,186, 32, 43, 52,216,233, 81, 25, 49,122,115,253,157, 38, 43,233,161,157, 24,252,224,105, 80,
+ 8, 24, 65,148,192, 68,219,186,169,123,141, 40,103, 81,157,175,177, 89,217,157,138, 31, 62, 3,173, 40,228,255,251,243,194,199,
+163,224,186, 42,174, 83,205,107,122,159, 26,188, 64, 88,116,223,129, 24, 27, 54, 90, 2,106,241, 75, 64, 83, 15,232,193, 34,165,
+ 7,134,249, 82, 79,215,186,152,166, 17,193, 16,154, 89, 12,133,232,243,198, 29,148, 77, 71,116, 54,203, 57,210,148, 66,221,209,
+214,221,186,133, 97,236, 71, 90, 36, 24,113,198, 40,118,225,126, 95, 67, 26, 18,111,250,220,151, 40,249, 37, 68, 64,218,240,220,
+229,200, 66, 27, 72,210,210,105,187, 57,236, 35, 93,176, 31, 27, 68,135, 45,221, 77,166,200, 16,137,224, 76,104,113,105, 84, 92,
+162, 84, 65,102, 60, 31,170,129,197, 12,134,161, 44,181,187, 29,162,176,176,216,122, 34, 48,105,205,188,244, 45,169, 47,249,100,
+161,100, 65, 44, 80,179,244, 14,105,102,132,211, 81, 37,120,131, 84, 45, 71,221,247, 91,205,119, 78,181, 54, 63,140, 53,245,170,
+112,111,107, 47, 69,243,233,221, 88,234,154, 96,215,252,165,193, 8, 51, 60, 33, 40, 10, 97,134, 47,182,106,176,207, 67,247,201,
+180,100, 29, 3,219,214, 17,143, 7,202, 83,229,111,182,167, 46,231,133,231,243,196,207,159, 63,227,159, 63, 2,223,124,251, 78,
+120, 54,122, 97, 14, 49, 83, 18,179,249,228,145,199,174,205,133, 5, 48, 64, 53,181,102, 44, 19, 98,210,249, 82,204,219, 31,115,
+ 90, 48, 40,190,247,165,160,136, 79,115,129, 72,210, 48,167, 44,169,108, 12,198,173, 73, 95,208,250, 63, 34,232,203, 58, 96, 45,
+213,227,214, 48,134,233, 70, 51, 27, 36,135,221,163, 23,114, 43,236, 41,239,202,108,143,137,190,237,201,119,156,195, 67, 67,104,
+136, 50, 58,119,152,147, 12,103,147,102,151, 6,145,134, 82, 78,148,122, 82,121, 67,184, 93, 10, 27,152,254,199,125,192, 87, 26,
+150,134, 90, 47,228,188, 19,145, 59,241,246,246,134,171, 48, 36, 35, 68, 92, 87, 65, 41, 13,239,239,111, 44,190, 21,159,190,121,
+ 87, 50,173, 7, 41,117,103, 49,219,103,116,190,206, 25,133,203,213,156,249, 54,104,200, 76,167,223,120,242,116, 46, 64,225, 84,
+133,218,251,242, 30,168,193,201,179, 84,151,142,198,212, 81, 95,138,184, 60, 62,228,230,185,191, 6,132, 32, 0, 31, 95, 26,191,
+223, 32, 81,107, 62,243,142,246, 12, 37,236,218,212, 58,205,193,244,140, 83,152, 62, 33,196, 93,223,137,246,244, 0, 26, 13,124,
+ 2,174,243,226,215,194,189, 32, 27, 95,163,155,253,112,192,190,169, 18,105,176, 17,101,210, 1, 17,129,228,177,191, 51, 20, 38,
+112, 85, 18,248,190, 12,247, 84,241,253,240, 98, 21,219,249,110, 27, 39,105,140,232, 36,100,123, 70, 45,120,198, 16, 1,125,156,
+233,158,200,179, 10, 92, 45,235,125,152, 6, 74, 93,186,174, 44, 23, 75,117,247,197,103, 3, 88,107, 65,171,141,114,207,153,199,
+ 17,226, 76,158,244, 21, 32, 21, 22, 78,160, 37,105,185,113,226,182,208,172,110,242, 61,139, 86, 77,202,250,247, 53,240, 48, 88,
+ 94,239, 95,158, 89,173,220, 17,164,232, 55, 53,111,219,116, 97,228, 69,107, 6, 55,167,170, 16, 17,146, 48,118, 84,157,193,108,
+130,200,140,180,203, 57,161,182, 37, 88,158,211, 68,171, 13,191,254,124,225, 58, 59,206,171,206,130, 16, 3, 6, 37, 20,105,139,
+ 80,235,230,130,253,128, 67, 30,215, 89, 84, 83, 9, 22,151, 56, 89,163, 86, 80, 21,101,176,131, 53,121, 71,169,132, 25, 26,235,
+ 84,241, 78,108, 64,211,187,114, 12,144, 1,228, 40,232,157,142, 73,180,138,236,109,166,225,204, 93,221,212,114,186, 7, 51,179,
+222,205, 62,213,246, 98, 0,208,139,120, 98,156, 25, 88, 96, 4,106, 68,133,102, 17,193,225,170, 96,228,138,184, 88, 52, 6, 96,
+116,241,110,218,174,215,194, 86, 6,134,103, 42, 15, 12, 72, 45,206,196,148,160,159,141, 30, 34, 10, 75,135, 8, 84,178, 96, 21,
+137,201,252,127,130, 67,162, 10,175, 51, 62,151,102, 22,182,223, 82, 61,120, 33, 2, 33, 19,118,238,157,241,129,209, 15,142, 24,
+163,202,250, 0,102, 84, 7,196, 33,144, 22,110,187, 67,219,167,201, 50, 97,199,104,251,114, 78,161, 11, 36,109, 36, 45, 33, 76,
+107, 18,164,177,144,212,172,152, 56,215,131,147,166, 50,237,163, 91,122,202,152,101,240,219,191, 13,252,244,185, 34,149,134, 79,
+223,188,227,237,200,248,229,215, 15, 60,234,239,248,225, 95,154,234,166,132,187,160, 13, 49, 89,219,198, 42, 55,152,217, 8, 50,
+ 49, 69,156,116, 78, 12,105,166, 86,137,116, 90,171, 10,155,183,177,192,167,114,131,234, 21, 77, 80, 6,111, 37,204,175, 48,250,
+202, 80,159, 6, 48,171, 17,140, 23,102,140,251, 20, 27,190,166, 45, 95,254,237, 88,216,247, 94,215,131,223,207, 16, 18, 73,104,
+159, 56,157,111,234, 10,151, 54,132,168, 74,143,152, 19,229,148, 51, 81,107, 70,121,234, 90, 75, 74,245,230,163,213,206, 67,147,
+150,154,237, 68, 41, 23,164,147, 12, 55,218,178, 63,191,147,250, 2,166,202,230, 94,212,133,108,249,147,172,124,125, 22,246, 35,
+ 59,186,168, 43,167, 0, 57, 54,222,130,142,243,188,148,109, 30,117, 2,237, 77,220, 8,196, 11, 70,210,172, 2,219, 73,103, 73,
+232, 61, 78, 43, 83, 66,228,225,164, 67,220,150, 81,174,203, 87, 99, 38,209,179,201, 47,156,156,238, 45,223,158,223,195, 73, 98,
+ 93, 9,194,147,201,221,150, 20,197, 53,249,111,146, 83,205,218,182,241,156,108,189,163,131,222, 17,146,110,201,110,145,104, 88,
+222,222,112,157, 47, 64, 46, 95, 37, 90, 66,156,173,155,134, 8,210,150,153,248,216,221,100,106,208,157, 79,152, 67, 16,194, 92,
+137, 6, 68,198,252, 6, 72, 24, 75,192,204,112,249,179,213, 38,105,226,123,100, 31, 46,185, 91,206, 41,163, 19,121, 8,182,131,
+103, 13, 75, 41,163,212,194,230,139,198, 69,190, 94, 18,162, 34, 74,244, 54,196,110,163,153, 78,107,182,254,154,104,146, 38,154,
+106,243, 95, 94,197,239,111, 35, 33,238, 60, 95,238, 13, 17,104,181,174, 15,119,184, 37,210, 13,183,196, 54,190,139, 54, 27,231,
+171, 56, 58,106,232, 67, 92,185, 13, 33,176,160,119,111,126,245,243,238,254, 12,100, 37, 30, 97, 18, 18, 8,191,167,152, 8,193,
+194,139,146,233,133, 71,183,167, 70,208,155, 22,116, 61,212, 35, 82,222,144, 55,211,253, 6,159,182,221,199,186, 11, 18,229,103,
+ 31,207,130,215,147,121,200,153,105,112, 91, 68,171, 5,239,239, 3, 57,107,182,247,160, 14, 79,243,201, 5,199,219,225,249,217,
+105, 83,130, 73,165,251,143, 57,115,101, 66, 95, 6,181,244, 62,144, 6,176,237,145,153,220,145, 76,245, 37,237, 9,129,241,133,
+129, 93,221, 64, 19, 62,252,117, 66, 85, 33, 4, 71,193, 99, 28,126, 95, 76, 94,166,222, 4,193,139, 36,220, 35, 25, 56,222,119,
+151, 72, 25,121, 6, 49,176, 72, 83,243, 30,151,132, 34,204,134,192, 58, 68, 55,195, 33,100,156,114, 68, 41,213,201, 70,246,255,
+ 90,167, 94, 75,157, 59,114,122,192,247, 46, 12,228, 80, 59, 86, 45, 24,129, 49,174,130, 8, 30, 68,152, 49,173,138,134, 76,252,
+171,209, 64, 66, 72, 34,155, 70, 49, 76,149,147,249,252,128, 6, 47, 6, 69,137,241, 3,250,204,153, 71, 72, 68, 95,112,243,115,
+246, 78,185,117,205, 92, 31, 36,128,153, 11,215, 26,231,104, 80,155,177,189,187, 44,126,203,141,205,253,152,161, 8, 57,121,202,
+221,180,190, 37,209, 12, 1, 57, 3,251,123,199,245,219, 64,137,192,191,191,124,224, 47,223,119,252,248,131,134,190, 88,150,121,
+ 24, 3,199,219,161,135,249, 18,150, 97,135,136,125, 46,205, 15,238,137,124,129, 84, 19, 89,243,207,205,108, 37, 96,129,208,225,
+225, 44, 70,210,148, 49,225, 76, 44, 5, 28, 52,133, 27,203,159,179,136,143, 91,192, 6,238, 95,162,106, 97,122,170,143,123,169,
+ 95, 10,188, 69, 29,103,108,251, 59,142,227, 19,182,125,215, 44,244,188,185,127,187,241, 43,220, 33,142, 7,228,140,149,158,141,
+153, 77,232,181, 84, 93, 65, 54, 13,123,186,202, 11,173,158,110, 40, 51,134, 22,115,127, 17,195, 87,213,118, 95,181,168, 53,150,
+ 60,160, 90,228,148,148,208,116, 28,193,119,204, 41, 51,147, 61,137, 15, 6,198,109,177, 56, 96,159, 2, 69,136,226,137,107,213,
+227,162,236, 88,149, 40,118,109,186,207,143, 68, 12, 35, 7, 39,113, 4, 80,145,185,232,241,198,138,132, 90, 35, 36,222,240,153,
+191,192,141, 80, 6, 99,208, 51, 52, 40,154, 55,131, 66,252,182,215, 54,132, 54,209,132, 41,198,190, 12, 32,148, 94, 70,101,249,
+247,246, 64,239,215,228,125,112,144,241,226, 52, 4,113, 76,206, 80,107, 21,206,120,115,120, 94,207,156, 25, 49, 60,161,100, 29,
+118, 22,130,152,173,250, 40,181, 84,114,156,102, 22, 4,128, 92, 27, 61,139,106, 43,110,108, 3,227,149, 18,210, 47,181,249, 26,
+201, 26, 81, 67, 34, 66, 0,101,150,217,163,166,109, 64, 90,127,117,219,211,143, 85, 6, 59,110,202, 2,243, 72, 48,189,122,171,
+226, 74, 14, 43,208,238,183, 80,245,231,219,182,221, 27,228,169, 40, 10,168, 36, 34,218, 36,127,158, 39,182,156,209,153,116, 89,
+174,230,211,191, 17, 50, 53, 35, 68, 47,254,255,159,208,210,246, 3,165,114,118, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index d40831f9e87..cf3961e0820 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -703,7 +703,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf)
dflag |= GP_DRAWDATA_ONLYV2D|GP_DRAWDATA_IEDITHACK;
}
break;
-
+#if 0 /* removed since 2.5x, needs to be added back */
case SPACE_SEQ: /* sequence */
{
SpaceSeq *sseq= (SpaceSeq *)sa->spacedata.first;
@@ -728,7 +728,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf)
dflag |= GP_DRAWDATA_ONLYI2D;
}
break;
-
+#endif
default: /* for spacetype not yet handled */
offsx= 0;
offsy= 0;
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
index 57dd1ef5572..760faf01b6c 100644
--- a/source/blender/editors/gpencil/gpencil_buttons.c
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -125,7 +125,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl, con
/* active */
block= uiLayoutGetBlock(sub);
icon= (gpl->flag & GP_LAYER_ACTIVE) ? ICON_RADIOBUT_ON : ICON_RADIOBUT_OFF;
- but= uiDefIconBut(block, BUT, 0, icon, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Set active layer");
+ but= uiDefIconButBitI(block, TOG, GP_LAYER_ACTIVE, 0, icon, 0, 0, UI_UNIT_X, UI_UNIT_Y, &gpd->flag, 0.0, 0.0, 0.0, 0.0, "Set active layer");
uiButSetFunc(but, gp_ui_activelayer_cb, gpd, gpl);
/* locked */
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index cd3d87a8979..33e9192a23e 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -136,13 +136,8 @@ void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, int row_w, int
* is expected to be in RGBA byte or float format, and the
* modelview and projection matrices are assumed to define a
* 1-to-1 mapping to screen space.
- * @param gamma_correct Optionally gamma correct float sources to sRGB for display
*/
- /* only for float rects, converts to 32 bits and draws */
-void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf, int gamma_correct);
-
-
void glaDrawPixelsTex (float x, float y, int img_w, int img_h, int format, void *rect);
void glaDrawPixelsTexScaled(float x, float y, int img_w, int img_h, int format, void *rect, float scaleX, float scaleY);
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 8f97d1c8602..7e7d60fdea8 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -47,6 +47,7 @@ struct BPoint;
/* curve_ops.c */
void ED_operatortypes_curve(void);
+void ED_operatormacros_curve(void);
void ED_keymap_curve (struct wmKeyConfig *keyconf);
/* editcurve.c */
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 2cd610e1fe4..6b374274205 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -87,8 +87,8 @@ struct rcti;
/* meshtools.c */
-intptr_t mesh_octree_table(struct Object *ob, struct EditMesh *em, float *co, char mode);
-long mesh_mirrtopo_table(struct Object *ob, char mode);
+intptr_t mesh_octree_table(struct Object *ob, struct EditMesh *em, float *co, char mode);
+int mesh_mirrtopo_table(struct Object *ob, char mode);
struct EditVert *editmesh_get_x_mirror_vert(struct Object *ob, struct EditMesh *em, struct EditVert *eve, float *co, int index);
int mesh_get_x_mirror_vert(struct Object *ob, int index);
@@ -243,6 +243,20 @@ int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob
int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
int ED_mesh_color_remove_named(struct bContext *C, struct Object *ob, struct Mesh *me, const char *name);
+
+/* mirrtopo */
+typedef struct MirrTopoStore_t {
+ intptr_t *index_lookup;
+ int prev_vert_tot;
+ int prev_edge_tot;
+ int prev_ob_mode;
+} MirrTopoStore_t;
+
+int ED_mesh_mirrtopo_recalc_check(struct Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_topo_store);
+void ED_mesh_mirrtopo_init(struct Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_topo_store,
+ const short skip_em_vert_array_init);
+void ED_mesh_mirrtopo_free(MirrTopoStore_t *mesh_topo_store);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 39d6ba8bc1b..51d3c3f021b 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -56,7 +56,8 @@ struct wmOperator;
struct wmOperatorType;
/* object_edit.c */
-struct Object *ED_object_active_context(struct bContext *C);
+struct Object *ED_object_context(struct bContext *C); /* context.object */
+struct Object *ED_object_active_context(struct bContext *C); /* context.object or context.active_object */
/* object_ops.c */
void ED_operatortypes_object(void);
@@ -102,8 +103,11 @@ float ED_object_new_primitive_matrix(struct bContext *C, struct Object *editob,
void ED_object_add_generic_props(struct wmOperatorType *ot, int do_editmode);
int ED_object_add_generic_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
-int ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer);
-struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer);
+int ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op,
+ float *loc, float *rot, int *enter_editmode, unsigned int *layer);
+
+struct Object *ED_object_add_type(struct bContext *C, int type, float *loc,
+ float *rot, int enter_editmode, unsigned int layer);
void ED_object_single_users(struct Main *bmain, struct Scene *scene, int full);
void ED_object_single_user(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 476cf2ac109..0562f400700 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -201,7 +201,7 @@ void ED_view3d_depth_tag_update(struct RegionView3D *rv3d);
/* Projection */
#define IS_CLIPPED 12000
-void ED_view3d_calc_clipping(struct BoundBox *bb, float planes[4][4], struct bglMats *mats, struct rcti *rect);
+void ED_view3d_calc_clipping(struct BoundBox *bb, float planes[4][4], struct bglMats *mats, const struct rcti *rect);
void project_short(struct ARegion *ar, const float vec[3], short adr[2]);
void project_short_noclip(struct ARegion *ar, const float vec[3], short adr[2]);
@@ -215,7 +215,7 @@ void project_float_noclip(struct ARegion *ar, const float vec[3], float adr[2]);
int ED_view3d_clip_range_get(struct View3D *v3d, struct RegionView3D *rv3d, float *clipsta, float *clipend);
int ED_view3d_viewplane_get(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct rctf *viewplane, float *clipsta, float *clipend);
void ED_view3d_ob_project_mat_get(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
-void ED_view3d_project_float(struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]);
+void ED_view3d_project_float(const struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]);
void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, struct rctf *viewborder_r, short no_shift);
void ED_view3d_calc_camera_border_size(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, float size_r[2]);
@@ -257,7 +257,7 @@ void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc);
void view3d_operator_needs_opengl(const struct bContext *C);
void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *ar);
int view3d_get_view_aligned_coordinate(struct ViewContext *vc, float fp[3], const int mval[2], const short do_fallback);
-void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats);
+void view3d_get_transformation(const struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats);
/* XXX should move to BLI_math */
int edge_inside_circle(short centx, short centy, short rad, short x1, short y1, short x2, short y2);
@@ -286,8 +286,8 @@ Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]);
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
int ED_view3d_lock(struct RegionView3D *rv3d);
-unsigned int ED_view3d_datamask(struct Scene *scene, struct View3D *v3d);
-unsigned int ED_viewedit_datamask(struct bScreen *screen);
+uint64_t ED_view3d_datamask(struct Scene *scene, struct View3D *v3d);
+uint64_t ED_viewedit_datamask(struct bScreen *screen);
/* camera lock functions */
int ED_view3d_camera_lock_check(struct View3D *v3d, struct RegionView3D *rv3d);
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 4ac5a6eed4a..8373ea7c52e 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -589,8 +589,8 @@ DEF_ICON(MOD_SOLIDIFY)
DEF_ICON(MOD_SCREW)
DEF_ICON(MOD_VERTEX_WEIGHT)
DEF_ICON(MOD_DYNAMICPAINT)
+DEF_ICON(MOD_REMESH)
#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK162)
DEF_ICON(BLANK163)
DEF_ICON(BLANK164)
DEF_ICON(BLANK165)
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index a10de9a8a42..4948073f9c6 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -904,7 +904,9 @@ void uiEndBlock(const bContext *C, uiBlock *block)
/* handle pending stuff */
if(block->layouts.first) uiBlockLayoutResolve(block, NULL, NULL);
ui_block_do_align(block);
- if((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
+ if((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) {
+ ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
+ }
if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block);
/* after keymaps! */
@@ -1901,7 +1903,7 @@ void ui_set_but_soft_range(uiBut *but, double value)
if(softmin < (double)but->hardmin)
softmin= (double)but->hardmin;
}
- else if(value_max-1e-10 > softmax) {
+ if(value_max-1e-10 > softmax) {
if(value_max < 0.0)
softmax= -soft_range_round_down(-value_max, -softmax);
else
@@ -2833,7 +2835,7 @@ uiBut *uiDefBut(uiBlock *block, int type, int retval, const char *str, int x1, i
*/
static int findBitIndex(unsigned int x)
{
- if (!x || (x&(x-1))!=0) { /* x&(x-1) strips lowest bit */
+ if (!x || !is_power_of_2_i(x)) { /* is_power_of_2_i(x) strips lowest bit */
return -1;
} else {
int idx= 0;
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index da94fd9237a..6ebb67af67a 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -389,17 +389,7 @@ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad)
glEnable( GL_BLEND );
}
- /* solid part */
- uiDrawBox(GL_POLYGON, minx, miny, maxx, maxy, rad);
-
- /* set antialias line */
- glEnable( GL_LINE_SMOOTH );
- glEnable( GL_BLEND );
-
- uiDrawBox(GL_LINE_LOOP, minx, miny, maxx, maxy, rad);
-
- glDisable( GL_BLEND );
- glDisable( GL_LINE_SMOOTH );
+ ui_draw_anti_roundbox(GL_POLYGON, minx, miny, maxx, maxy, rad);
}
@@ -1475,18 +1465,22 @@ static ImBuf *scale_trackpreview_ibuf(ImBuf *ibuf, float zoomx, float zoomy)
{
ImBuf *scaleibuf;
int x, y, w= ibuf->x*zoomx, h= ibuf->y*zoomy;
+ const float max_x= ibuf->x-1.0f;
+ const float max_y= ibuf->y-1.0f;
+ const float scalex= 1.0f/zoomx;
+ const float scaley= 1.0f/zoomy;
+
scaleibuf= IMB_allocImBuf(w, h, 32, IB_rect);
for(y= 0; y<scaleibuf->y; y++) {
for (x= 0; x<scaleibuf->x; x++) {
- int pixel= scaleibuf->x*y + x;
- int orig_pixel= ibuf->x*(int)(((float)y)/zoomy) + (int)(((float)x)/zoomx);
- char *rrgb= (char*)scaleibuf->rect + pixel*4;
- char *orig_rrgb= (char*)ibuf->rect + orig_pixel*4;
- rrgb[0]= orig_rrgb[0];
- rrgb[1]= orig_rrgb[1];
- rrgb[2]= orig_rrgb[2];
- rrgb[3]= orig_rrgb[3];
+ float src_x= scalex*x;
+ float src_y= scaley*y;
+
+ CLAMP(src_x, 0, max_x);
+ CLAMP(src_y, 0, max_y);
+
+ bicubic_interpolation(ibuf, scaleibuf, src_x, src_y, x, y);
}
}
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index c24d07f73b9..525b15ac7e3 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -114,6 +114,17 @@ typedef enum uiButtonJumpType {
BUTTON_EDIT_JUMP_ALL
} uiButtonJumpType;
+typedef enum uiButtonDelimType {
+ BUTTON_DELIM_NONE,
+ BUTTON_DELIM_ALPHA,
+ BUTTON_DELIM_PUNCT,
+ BUTTON_DELIM_BRACE,
+ BUTTON_DELIM_OPERATOR,
+ BUTTON_DELIM_QUOTE,
+ BUTTON_DELIM_WHITESPACE,
+ BUTTON_DELIM_OTHER
+} uiButtonDelimType;
+
typedef struct uiHandleButtonData {
wmWindowManager *wm;
wmWindow *window;
@@ -1230,46 +1241,60 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
/* ************* in-button text selection/editing ************* */
/* return 1 if char ch is special character, otherwise return 0 */
-static short test_special_char(char ch)
+static uiButtonDelimType test_special_char(const char ch)
{
+ if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
+ return BUTTON_DELIM_ALPHA;
+ }
+
switch(ch) {
- case '\\':
- case '/':
+ case ',':
+ case '.':
+ return BUTTON_DELIM_PUNCT;
+
+ case '{':
+ case '}':
+ case '[':
+ case ']':
+ case '(':
+ case ')':
+ return BUTTON_DELIM_BRACE;
+
+ case '+':
+ case '-':
+ case '=':
case '~':
+ case '%':
+ case '/':
+ case '<':
+ case '>':
+ case '^':
+ case '*':
+ case '&':
+ return BUTTON_DELIM_OPERATOR;
+
+ case '\'':
+ case '\"': // " - an extra closing one for Aligorith's text editor
+ return BUTTON_DELIM_QUOTE;
+
+ case ' ':
+ return BUTTON_DELIM_WHITESPACE;
+
+ case '\\':
case '!':
case '@':
case '#':
case '$':
- case '%':
- case '^':
- case '&':
- case '*':
- case '(':
- case ')':
- case '+':
- case '=':
- case '{':
- case '}':
- case '[':
- case ']':
case ':':
case ';':
- case '\'':
- case '\"': // " - an extra closing one for Aligorith's text editor
- case '<':
- case '>':
- case ',':
- case '.':
case '?':
case '_':
- case '-':
- case ' ':
- return 1;
- break;
+ return BUTTON_DELIM_OTHER;
+
default:
break;
}
- return 0;
+ return BUTTON_DELIM_NONE;
}
static int ui_textedit_step_next_utf8(const char *str, size_t maxlen, short *pos)
@@ -1308,12 +1333,13 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen,
if(direction) { /* right*/
if(jump != BUTTON_EDIT_JUMP_NONE) {
+ const uiButtonDelimType is_special= (*pos) < maxlen ? test_special_char(str[(*pos)]) : BUTTON_DELIM_NONE;
/* jump between special characters (/,\,_,-, etc.),
* look at function test_special_char() for complete
* list of special character, ctr -> */
while((*pos) < maxlen) {
if (ui_textedit_step_next_utf8(str, maxlen, pos)) {
- if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break;
+ if((jump != BUTTON_EDIT_JUMP_ALL) && (is_special != test_special_char(str[(*pos)]))) break;
}
else {
break; /* unlikely but just incase */
@@ -1326,6 +1352,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen,
}
else { /* left */
if(jump != BUTTON_EDIT_JUMP_NONE) {
+ const uiButtonDelimType is_special= (*pos) > 1 ? test_special_char(str[(*pos) - 1]) : BUTTON_DELIM_NONE;
/* left only: compensate for index/change in direction */
ui_textedit_step_prev_utf8(str, maxlen, pos);
@@ -1334,7 +1361,7 @@ static void ui_textedit_step_utf8(const char *str, size_t maxlen,
* list of special character, ctr -> */
while ((*pos) > 0) {
if (ui_textedit_step_prev_utf8(str, maxlen, pos)) {
- if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break;
+ if((jump != BUTTON_EDIT_JUMP_ALL) && (is_special != test_special_char(str[(*pos)]))) break;
}
else {
break;
@@ -5242,9 +5269,13 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
data->state= state;
if(state != BUTTON_STATE_EXIT) {
- /* When objects for eg. are removed, running ui_check_but()
- * can access the removed data - so disable update on exit */
- ui_check_but(but);
+ /* When objects for eg. are removed, running ui_check_but() can access
+ the removed data - so disable update on exit. Also in case of
+ highlight when not in a popup menu, we remove because data used in
+ button below popup might have been removed by action of popup. Needs
+ a more reliable solution... */
+ if(state != BUTTON_STATE_HIGHLIGHT || (but->block->flag & UI_BLOCK_LOOP))
+ ui_check_but(but);
}
/* redraw */
@@ -5488,6 +5519,11 @@ wmOperator *uiContextActiveOperator(const struct bContext *C)
ARegion *ar_ctx= CTX_wm_region(C);
uiBlock *block;
+ /* background mode */
+ if (ar_ctx == NULL) {
+ return NULL;
+ }
+
/* scan active regions ui */
for(block=ar_ctx->uiblocks.first; block; block=block->next) {
if (block->ui_operator) {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index d6460f9046e..e4cc605e3f5 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -462,6 +462,7 @@ extern int ui_button_is_active(struct ARegion *ar);
/* interface_widgets.c */
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
+void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy, float rad);
void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol);
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 2a75c2a26c1..b50df29918d 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -458,11 +458,16 @@ static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op))
* - otherwise, up to info (which is what users normally see)
*/
str = BKE_reports_string(reports, (G.f & G_DEBUG)? RPT_DEBUG : RPT_INFO);
-
- write_text(txt, str);
- MEM_freeN(str);
-
- return OPERATOR_FINISHED;
+
+ if (str) {
+ write_text(txt, str);
+ MEM_freeN(str);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
}
static void UI_OT_reports_to_textblock(wmOperatorType *ot)
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 1edfa2f4ea6..c21bc09ff27 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -330,7 +330,6 @@ static void uiPanelPop(uiBlock *UNUSED(block))
#endif
/* triangle 'icon' for panel header */
-/* NOTE - this seems to be only used for hiding nodes now */
void UI_DrawTriIcon(float x, float y, char dir)
{
if(dir=='h') {
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 58c3c0130b8..c535f2c1ad0 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1071,18 +1071,16 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
/* copy to int, gets projected if possible too */
x1= x1f; y1= y1f; x2= x2f; y2= y2f;
- if(butregion) {
- if(butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) {
- UI_view2d_to_region_no_clip(&butregion->v2d, x1f, y1f, &x1, &y1);
- UI_view2d_to_region_no_clip(&butregion->v2d, x2f, y2f, &x2, &y2);
- }
-
- x1 += butregion->winrct.xmin;
- x2 += butregion->winrct.xmin;
- y1 += butregion->winrct.ymin;
- y2 += butregion->winrct.ymin;
+ if(butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) {
+ UI_view2d_to_region_no_clip(&butregion->v2d, x1f, y1f, &x1, &y1);
+ UI_view2d_to_region_no_clip(&butregion->v2d, x2f, y2f, &x2, &y2);
}
-
+
+ x1 += butregion->winrct.xmin;
+ x2 += butregion->winrct.xmin;
+ y1 += butregion->winrct.ymin;
+ y2 += butregion->winrct.ymin;
+
wm_window_get_size(CTX_wm_window(C), &winx, &winy);
if(x2 > winx) {
@@ -1096,7 +1094,8 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
x2= winx;
}
}
- if(y1 < 0) { /* XXX butregion NULL check?, there is one above */
+
+ if(y1 < 0) {
int newy1;
UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, NULL, &newy1);
newy1 += butregion->winrct.ymin;
@@ -2481,22 +2480,14 @@ void uiPupMenuOkee(bContext *C, const char *opname, const char *str, ...)
va_end(ap);
}
+/* note, only call this is the file exists,
+ * the case where the file does not exist so can be saved without a
+ * popup must be checked for already, since saving from here
+ * will free the operator which will break invoke().
+ * The operator state for this is implicitly OPERATOR_RUNNING_MODAL */
void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename)
{
- size_t len= strlen(filename);
-
- if(len==0)
- return;
-
- if(filename[len-1]=='/' || filename[len-1]=='\\') {
- uiPupMenuError(C, "Cannot overwrite a directory");
- WM_operator_free(op);
- return;
- }
- if(BLI_exists(filename)==0)
- operator_cb(C, op, 1);
- else
- confirm_operator(C, op, "Save Over", filename);
+ confirm_operator(C, op, "Save Over", filename);
}
void uiPupMenuNotice(bContext *C, const char *str, ...)
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index eb7e06623f7..fca1591c2ea 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -681,7 +681,7 @@ static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
static int modifier_can_delete(ModifierData *md)
{
- // fluid particle modifier can't be deleted here
+ /* fluid particle modifier can't be deleted here */
if(md->type == eModifierType_ParticleSystem)
if(((ParticleSystemModifierData *)md)->psys->part->type == PART_FLUID)
return 0;
@@ -689,14 +689,16 @@ static int modifier_can_delete(ModifierData *md)
return 1;
}
-// Check wheter Modifier is a simulation or not, this is used for switching to the physics/particles context tab
+/* Check wheter Modifier is a simulation or not, this is used for switching to the physics/particles context tab */
static int modifier_is_simulation(ModifierData *md)
{
- // Physic Tab
- if(ELEM7(md->type, eModifierType_Cloth, eModifierType_Collision, eModifierType_Fluidsim, eModifierType_Smoke, eModifierType_Softbody, eModifierType_Surface, eModifierType_DynamicPaint)) {
+ /* Physic Tab */
+ if (ELEM7(md->type, eModifierType_Cloth, eModifierType_Collision, eModifierType_Fluidsim, eModifierType_Smoke,
+ eModifierType_Softbody, eModifierType_Surface, eModifierType_DynamicPaint))
+ {
return 1;
}
- // Particle Tab
+ /* Particle Tab */
else if (md->type == eModifierType_ParticleSystem) {
return 2;
}
@@ -705,7 +707,8 @@ static int modifier_is_simulation(ModifierData *md)
}
}
-static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex)
+static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob,
+ ModifierData *md, int index, int cageIndex, int lastCageIndex)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
PointerRNA ptr;
@@ -845,7 +848,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
uiItemEnumO(row, "OBJECT_OT_modifier_apply", IFACE_("Apply"), 0, "apply_as", MODIFIER_APPLY_DATA);
- if (modifier_sameTopology(md))
+ if (modifier_sameTopology(md) && !modifier_nonGeometrical(md))
uiItemEnumO(row, "OBJECT_OT_modifier_apply", IFACE_("Apply as Shape"), 0, "apply_as", MODIFIER_APPLY_SHAPE);
}
@@ -853,7 +856,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
- uiItemO(row, TIP_("Copy"), ICON_NONE, "OBJECT_OT_modifier_copy");
+ uiItemO(row, IFACE_("Copy"), ICON_NONE, "OBJECT_OT_modifier_copy");
}
/* result is the layout block inside the box, that we return so that modifier settings can be drawn */
@@ -1223,7 +1226,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
uiDefButS(block, ROW, B_MATPRV, IFACE_("World"), 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, "");
uiDefButS(block, ROW, B_MATPRV, IFACE_("Both"), 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_BOTH, 0, 0, "");
- /* Alpha buton for texture preview */
+ /* Alpha button for texture preview */
if(*pr_texture!=TEX_PR_OTHER) {
row = uiLayoutRow(layout, 0);
uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, ICON_NONE);
@@ -2198,6 +2201,17 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
}
uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "is_active", i, 0, 0, 0, 0, NULL);
}
+ else if(itemptr->type == &RNA_MovieTrackingObject) {
+ MovieTrackingObject *tracking_object= (MovieTrackingObject*)itemptr->data;
+
+ split= uiLayoutSplit(sub, 0.75f, 0);
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ uiItemL(split, name, ICON_CAMERA_DATA);
+ }
+ else {
+ uiItemL(split, name, ICON_OBJECT_DATA);
+ }
+ }
/* There is a last chance to display custom controls (in addition to the name/label):
* If the given item property group features a string property named as prop_list,
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 9a438070e1e..d8a34262e81 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -200,7 +200,25 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
+}
+
+void ui_draw_anti_roundbox(int mode, float minx, float miny, float maxx, float maxy, float rad)
+{
+ float color[4];
+ int j;
+ glEnable(GL_BLEND);
+ glGetFloatv(GL_CURRENT_COLOR, color);
+ color[3] *= 0.125f;
+ glColor4fv(color);
+
+ for(j=0; j<8; j++) {
+ glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
+ uiDrawBox(mode, minx, miny, maxx, maxy, rad);
+ glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
+ }
+
+ glDisable(GL_BLEND);
}
static void widget_init(uiWidgetBase *wtb)
@@ -1777,7 +1795,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
{
/* gouraud triangle fan */
float radstep, ang= 0.0f;
- float centx, centy, radius;
+ float centx, centy, radius, cursor_radius;
float rgb[3], hsvo[3], hsv[3], col[3], colcent[3];
int a, tot= 32;
int color_profile = but->block->color_profile;
@@ -1846,12 +1864,12 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
ang= 2.0f*(float)M_PI*hsvo[0] + 0.5f*(float)M_PI;
if(but->flag & UI_BUT_COLOR_CUBIC)
- radius= (1.0f - powf(1.0f - hsvo[1], 3.0f)) *radius;
+ cursor_radius = (1.0f - powf(1.0f - hsvo[1], 3.0f));
else
- radius= hsvo[1] * radius;
+ cursor_radius = hsvo[1];
+ radius= CLAMPIS(cursor_radius, 0.0f, 1.0f) * radius;
ui_hsv_cursor(centx + cosf(-ang)*radius, centy + sinf(-ang)*radius);
-
}
/* ************ custom buttons, old stuff ************** */
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index dee945ecd7d..c3fe50edcd3 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1715,6 +1715,8 @@ void init_userdef_do_versions(void)
U.ndof_flag = NDOF_LOCK_HORIZON |
NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM | NDOF_SHOULD_ROTATE;
}
+ if (U.tweak_threshold == 0 )
+ U.tweak_threshold= 10;
/* funny name, but it is GE stuff, moves userdef stuff to engine */
// XXX space_set_commmandline_options();
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index c2c482b0a2c..57d46de9cb7 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -177,7 +177,8 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* see eView2D_CommonViewTypes in UI_view2d.h for available view presets */
switch (type) {
- /* 'standard view' - optimum setup for 'standard' view behaviour, that should be used new views as basis for their
+ /* 'standard view' - optimum setup for 'standard' view behaviour,
+ * that should be used new views as basis for their
* own unique View2D settings, which should be used instead of this in most cases...
*/
case V2D_COMMONVIEW_STANDARD:
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index 02d20e64bc3..42a1b7e88f0 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -815,3 +815,241 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
return OPERATOR_FINISHED;
}
+
+
+/* ********************* MESH VERTEX MIRR TOPO LOOKUP *************** */
+/* note, this is not the best place for the function to be but moved
+ * here to for the purpose of syncing with bmesh */
+
+typedef int MirrTopoHash_t;
+
+typedef struct MirrTopoVert_t {
+ MirrTopoHash_t hash;
+ int v_index;
+} MirrTopoVert_t;
+
+static int mirrtopo_hash_sort(const void *l1, const void *l2)
+{
+ if ((MirrTopoHash_t)(intptr_t)l1 > (MirrTopoHash_t)(intptr_t)l2 ) return 1;
+ else if ((MirrTopoHash_t)(intptr_t)l1 < (MirrTopoHash_t)(intptr_t)l2 ) return -1;
+ return 0;
+}
+
+static int mirrtopo_vert_sort(const void *v1, const void *v2)
+{
+ if (((MirrTopoVert_t *)v1)->hash > ((MirrTopoVert_t *)v2)->hash ) return 1;
+ else if (((MirrTopoVert_t *)v1)->hash < ((MirrTopoVert_t *)v2)->hash ) return -1;
+ return 0;
+}
+
+int ED_mesh_mirrtopo_recalc_check(Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_topo_store)
+{
+ int totvert;
+ int totedge;
+
+ if (me->edit_mesh) {
+ totvert = me->edit_mesh->totvert;
+ totedge = me->edit_mesh->totedge;
+ }
+ else {
+ totvert = me->totvert;
+ totedge = me->totedge;
+ }
+
+ if( (mesh_topo_store->index_lookup==NULL) ||
+ (mesh_topo_store->prev_ob_mode != ob_mode) ||
+ (totvert != mesh_topo_store->prev_vert_tot) ||
+ (totedge != mesh_topo_store->prev_edge_tot))
+ {
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+
+}
+
+void ED_mesh_mirrtopo_init(Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_topo_store,
+ const short skip_em_vert_array_init)
+{
+ MEdge *medge;
+ EditMesh *em = me->edit_mesh;
+ void **eve_tmp_back = NULL; /* some of the callers are using eve->tmp so restore after */
+
+ /* editmode*/
+ EditEdge *eed;
+
+ int a, last;
+ int totvert, totedge;
+ int tot_unique = -1, tot_unique_prev = -1;
+
+ MirrTopoHash_t *topo_hash = NULL;
+ MirrTopoHash_t *topo_hash_prev = NULL;
+ MirrTopoVert_t *topo_pairs;
+
+ intptr_t *index_lookup; /* direct access to mesh_topo_store->index_lookup */
+
+ /* reallocate if needed */
+ ED_mesh_mirrtopo_free(mesh_topo_store);
+
+ mesh_topo_store->prev_ob_mode = ob_mode;
+
+ if(em) {
+ EditVert *eve;
+ totvert = 0;
+ eve_tmp_back = MEM_mallocN(em->totvert * sizeof(void *), "TopoMirr");
+ for(eve = em->verts.first; eve; eve = eve->next) {
+ eve_tmp_back[totvert]= eve->tmp.p;
+ eve->tmp.l = totvert++;
+ }
+ }
+ else {
+ totvert = me->totvert;
+ }
+
+ topo_hash = MEM_callocN(totvert * sizeof(MirrTopoHash_t), "TopoMirr");
+
+ /* Initialize the vert-edge-user counts used to detect unique topology */
+ if(em) {
+ totedge = 0;
+
+ for(eed=em->edges.first; eed; eed = eed->next, totedge++) {
+ topo_hash[eed->v1->tmp.l]++;
+ topo_hash[eed->v2->tmp.l]++;
+ }
+ }
+ else {
+ totedge = me->totedge;
+
+ for(a=0, medge=me->medge; a < me->totedge; a++, medge++) {
+ topo_hash[medge->v1]++;
+ topo_hash[medge->v2]++;
+ }
+ }
+
+ topo_hash_prev = MEM_dupallocN(topo_hash);
+
+ tot_unique_prev = -1;
+ while(1) {
+ /* use the number of edges per vert to give verts unique topology IDs */
+
+ if(em) {
+ for(eed=em->edges.first; eed; eed = eed->next) {
+ topo_hash[eed->v1->tmp.l] += topo_hash_prev[eed->v2->tmp.l];
+ topo_hash[eed->v2->tmp.l] += topo_hash_prev[eed->v1->tmp.l];
+ }
+ }
+ else {
+ for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
+ /* This can make really big numbers, wrapping around here is fine */
+ topo_hash[medge->v1] += topo_hash_prev[medge->v2];
+ topo_hash[medge->v2] += topo_hash_prev[medge->v1];
+ }
+ }
+ memcpy(topo_hash_prev, topo_hash, sizeof(MirrTopoHash_t) * totvert);
+
+ /* sort so we can count unique values */
+ qsort(topo_hash_prev, totvert, sizeof(MirrTopoHash_t), mirrtopo_hash_sort);
+
+ tot_unique = 1; /* account for skiping the first value */
+ for(a=1; a<totvert; a++) {
+ if (topo_hash_prev[a-1] != topo_hash_prev[a]) {
+ tot_unique++;
+ }
+ }
+
+ if (tot_unique <= tot_unique_prev) {
+ /* Finish searching for unique valus when 1 loop dosnt give a
+ * higher number of unique values compared to the previous loop */
+ break;
+ }
+ else {
+ tot_unique_prev = tot_unique;
+ }
+ /* Copy the hash calculated this iter, so we can use them next time */
+ memcpy(topo_hash_prev, topo_hash, sizeof(MirrTopoHash_t) * totvert);
+ }
+
+ /* restore eve->tmp.* */
+ if(eve_tmp_back) {
+ EditVert *eve;
+ totvert = 0;
+ for(eve = em->verts.first; eve; eve = eve->next) {
+ eve->tmp.p = eve_tmp_back[totvert++];
+ }
+
+ MEM_freeN(eve_tmp_back);
+ eve_tmp_back = NULL;
+ }
+
+
+ /* Hash/Index pairs are needed for sorting to find index pairs */
+ topo_pairs = MEM_callocN( sizeof(MirrTopoVert_t) * totvert, "MirrTopoPairs");
+
+ /* since we are looping through verts, initialize these values here too */
+ index_lookup = MEM_mallocN(totvert * sizeof(*index_lookup), "mesh_topo_lookup");
+
+ if(em) {
+ if (skip_em_vert_array_init == FALSE) {
+ EM_init_index_arrays(em, 1, 0, 0);
+ }
+ }
+
+
+ for(a=0; a<totvert; a++) {
+ topo_pairs[a].hash = topo_hash[a];
+ topo_pairs[a].v_index = a;
+
+ /* initialize lookup */
+ index_lookup[a] = -1;
+ }
+
+ qsort(topo_pairs, totvert, sizeof(MirrTopoVert_t), mirrtopo_vert_sort);
+
+ /* Since the loop starts at 2, we must define the last index where the hash's differ */
+ last = ((totvert >= 2) && (topo_pairs[0].hash == topo_pairs[1].hash)) ? 0 : 1;
+
+ /* Get the pairs out of the sorted hashes, note, totvert+1 means we can use the previous 2,
+ * but you cant ever access the last 'a' index of MirrTopoPairs */
+ for(a=2; a <= totvert; a++) {
+ /* printf("I %d %ld %d\n", (a-last), MirrTopoPairs[a ].hash, MirrTopoPairs[a ].vIndex ); */
+ if ((a==totvert) || (topo_pairs[a-1].hash != topo_pairs[a].hash)) {
+ if (a-last==2) {
+ if(em) {
+ index_lookup[topo_pairs[a-1].v_index] = (intptr_t)EM_get_vert_for_index(topo_pairs[a-2].v_index);
+ index_lookup[topo_pairs[a-2].v_index] = (intptr_t)EM_get_vert_for_index(topo_pairs[a-1].v_index);
+ }
+ else {
+ index_lookup[topo_pairs[a-1].v_index] = topo_pairs[a-2].v_index;
+ index_lookup[topo_pairs[a-2].v_index] = topo_pairs[a-1].v_index;
+ }
+ }
+ last = a;
+ }
+ }
+ if(em) {
+ if (skip_em_vert_array_init == FALSE) {
+ EM_free_index_arrays();
+ }
+ }
+
+ MEM_freeN(topo_pairs);
+ topo_pairs = NULL;
+
+ MEM_freeN(topo_hash);
+ MEM_freeN(topo_hash_prev);
+
+ mesh_topo_store->index_lookup = index_lookup;
+ mesh_topo_store->prev_vert_tot = totvert;
+ mesh_topo_store->prev_edge_tot = totedge;
+}
+
+void ED_mesh_mirrtopo_free(MirrTopoStore_t *mesh_topo_store)
+{
+ if (mesh_topo_store->index_lookup) {
+ MEM_freeN(mesh_topo_store->index_lookup);
+ }
+ mesh_topo_store->index_lookup = NULL;
+ mesh_topo_store->prev_vert_tot = -1;
+ mesh_topo_store->prev_edge_tot = -1;
+}
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index f6aae0e20ae..f617971967c 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -743,7 +743,8 @@ void make_editMesh(Scene *scene, Object *ob)
EditSelection *ese;
float *co, (*keyco)[3]= NULL;
int tot, a, eekadoodle= 0;
- const short is_paint_sel= paint_facesel_test(ob);
+ const short is_paint_face_sel= paint_facesel_test(ob);
+ const short is_paint_vert_sel= is_paint_face_sel ? FALSE : paint_vertsel_test(ob);
if(me->edit_mesh==NULL)
me->edit_mesh= MEM_callocN(sizeof(EditMesh), "editmesh");
@@ -794,8 +795,8 @@ void make_editMesh(Scene *scene, Object *ob)
evlist[a]= eve;
/* face select sets selection in next loop */
- if(!is_paint_sel)
- eve->f |= (mvert->flag & 1);
+ if(!is_paint_face_sel)
+ eve->f |= (mvert->flag & SELECT);
if (mvert->flag & ME_HIDE) eve->h= 1;
normal_short_to_float_v3(eve->no, mvert->no);
@@ -821,15 +822,25 @@ void make_editMesh(Scene *scene, Object *ob)
eed= addedgelist(em, evlist[medge->v1], evlist[medge->v2], NULL);
/* eed can be zero when v1 and v2 are identical, dxf import does this... */
if(eed) {
+ int is_sel;
+ if (is_paint_vert_sel) {
+ /* when from vertex select, flush flags to edges,
+ * allow selection, code below handles editmode selection conversion */
+ is_sel= (eed->v1->f & SELECT) && (eed->v2->f & SELECT);
+ }
+ else {
+ is_sel= (medge->flag & SELECT);
+ }
+
eed->crease= ((float)medge->crease)/255.0f;
eed->bweight= ((float)medge->bweight)/255.0f;
if(medge->flag & ME_SEAM) eed->seam= 1;
if(medge->flag & ME_SHARP) eed->sharp = 1;
- if(medge->flag & SELECT) eed->f |= SELECT;
if(medge->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines!
if(medge->flag & ME_HIDE) eed->h |= 1;
- if(em->selectmode==SCE_SELECT_EDGE)
+ if(is_sel) eed->f |= SELECT;
+ if(em->selectmode==SCE_SELECT_EDGE)
EM_select_edge(eed, eed->f & SELECT); // force edge selection to vertices, seems to be needed ...
CustomData_to_em_block(&me->edata,&em->edata, a, &eed->data);
}
@@ -859,15 +870,30 @@ void make_editMesh(Scene *scene, Object *ob)
if(mface->flag & ME_HIDE) {
efa->h= 1;
} else {
+ int is_sel;
+
+ if (!is_paint_vert_sel) {
+ is_sel= (mface->flag & ME_FACE_SEL);
+ }
+ else {
+ /* when from vertex select, flush flags to edges,
+ * allow selection, code below handles editmode selection conversion */
+ is_sel= ( (efa->v1->f & SELECT) &&
+ (efa->v2->f & SELECT) &&
+ (efa->v3->f & SELECT) &&
+ (efa->v4 == NULL || efa->v4->f & SELECT)
+ );
+ }
+
if (a==me->act_face) {
EM_set_actFace(em, efa);
}
/* dont allow hidden and selected */
- if(mface->flag & ME_FACE_SEL) {
+ if(is_sel) {
efa->f |= SELECT;
- if(is_paint_sel) {
+ if(is_paint_face_sel) {
EM_select_face(efa, 1); /* flush down */
}
@@ -896,7 +922,10 @@ void make_editMesh(Scene *scene, Object *ob)
for(a=0; a<me->totselect; a++, mselect++){
/*check if recorded selection is still valid, if so copy into editmesh*/
- if( (mselect->type == EDITVERT && me->mvert[mselect->index].flag & SELECT) || (mselect->type == EDITEDGE && me->medge[mselect->index].flag & SELECT) || (mselect->type == EDITFACE && me->mface[mselect->index].flag & ME_FACE_SEL) ){
+ if ( (mselect->type == EDITVERT && me->mvert[mselect->index].flag & SELECT) ||
+ (mselect->type == EDITEDGE && me->medge[mselect->index].flag & SELECT) ||
+ (mselect->type == EDITFACE && me->mface[mselect->index].flag & ME_FACE_SEL) )
+ {
ese = MEM_callocN(sizeof(EditSelection), "Edit Selection");
ese->type = mselect->type;
if(ese->type == EDITVERT) ese->data = EM_get_vert_for_index(mselect->index); else
@@ -1549,7 +1578,7 @@ void MESH_OT_separate(wmOperatorType *ot)
ot->poll= ED_operator_editmesh;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_UNDO;
ot->prop= RNA_def_enum(ot->srna, "type", prop_separate_types, 0, "Type", "");
}
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index 845cc29c91b..8dea636f0b6 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -1316,7 +1316,7 @@ static short extrudeflag_edge(Object *obedit, EditMesh *em, short UNUSED(flag),
if (mmd->mirror_ob) {
float imtx[4][4];
invert_m4_m4(imtx, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, obedit->obmat, imtx);
+ mult_m4_m4m4(mtx, imtx, obedit->obmat);
}
for (eed= em->edges.first; eed; eed= eed->next) {
@@ -1603,7 +1603,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
if (mmd->mirror_ob) {
float imtx[4][4];
invert_m4_m4(imtx, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, obedit->obmat, imtx);
+ mult_m4_m4m4(mtx, imtx, obedit->obmat);
}
for (eed= em->edges.first; eed; eed= eed->next) {
@@ -2412,7 +2412,7 @@ void EM_make_hq_normals(EditMesh *em)
EdgeHash *edge_hash = BLI_edgehash_new();
EdgeHashIterator *edge_iter;
int edge_ref_count = 0;
- int ed_v1, ed_v2; /* use when getting the key */
+ unsigned int ed_v1, ed_v2; /* use when getting the key */
EdgeFaceRef *edge_ref_array = MEM_callocN(em->totedge * sizeof(EdgeFaceRef), "Edge Connectivity");
EdgeFaceRef *edge_ref;
float edge_normal[3];
@@ -2426,15 +2426,20 @@ void EM_make_hq_normals(EditMesh *em)
/* This function adds an edge hash if its not there, and adds the face index */
#define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \
- edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, EDV1, EDV2); \
+ { \
+ const unsigned int mf_v1 = EDV1; \
+ const unsigned int mf_v2 = EDV2; \
+ edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, mf_v1, mf_v2); \
if (!edge_ref) { \
edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \
- edge_ref->f1=i; \
- edge_ref->f2=-1; \
- BLI_edgehash_insert(edge_hash, EDV1, EDV2, edge_ref); \
- } else { \
- edge_ref->f2=i; \
- }
+ edge_ref->f1 = i; \
+ edge_ref->f2 = -1; \
+ BLI_edgehash_insert(edge_hash, mf_v1, mf_v2, edge_ref); \
+ } \
+ else { \
+ edge_ref->f2 = i; \
+ } \
+ }
efa= em->faces.first;
@@ -2456,7 +2461,7 @@ void EM_make_hq_normals(EditMesh *em)
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
/* Get the edge vert indices, and edge value (the face indices that use it)*/
- BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
+ BLI_edgehashIterator_getKey(edge_iter, &ed_v1, &ed_v2);
edge_ref = BLI_edgehashIterator_getValue(edge_iter);
if (edge_ref->f2 != -1) {
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index a4d418aee69..995db5aa88b 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -873,12 +873,10 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
/* here was an edge-mode only select flush case, has to be generalized */
EM_selectmode_flush(em);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
- BKE_mesh_end_editmesh(me, em);
- return OPERATOR_FINISHED;
}
BKE_mesh_end_editmesh(me, em);
- return OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
/* ***************************************************** */
@@ -1092,12 +1090,10 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
/* here was an edge-mode only select flush case, has to be generalized */
EM_selectmode_flush(em);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
- BKE_mesh_end_editmesh(me, em);
- return OPERATOR_FINISHED;
}
-
+
BKE_mesh_end_editmesh(me, em);
- return OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
/* ********************************* */
@@ -1135,7 +1131,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
if (!ok || !deselcount) { /* no data selected OR no more data to select*/
BKE_mesh_end_editmesh(me, em);
- return 0;
+ return OPERATOR_CANCELLED;
}
if(mode == SIMVERT_FACE) {
@@ -1166,7 +1162,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
deselcount--;
if (!deselcount) {/*have we selected all posible faces?, if so return*/
BKE_mesh_end_editmesh(me, em);
- return selcount;
+ return OPERATOR_FINISHED;
}
}
}
@@ -1184,7 +1180,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
deselcount--;
if (!deselcount) {/*have we selected all posible faces?, if so return*/
BKE_mesh_end_editmesh(me, em);
- return selcount;
+ return OPERATOR_FINISHED;
}
}
}
@@ -1198,7 +1194,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
if (!base_dvert || base_dvert->totweight == 0) {
BKE_mesh_end_editmesh(me, em);
- return selcount;
+ return OPERATOR_FINISHED;
}
for(eve= em->verts.first; eve; eve= eve->next) {
@@ -1216,7 +1212,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
deselcount--;
if (!deselcount) { /*have we selected all posible faces?, if so return*/
BKE_mesh_end_editmesh(me, em);
- return selcount;
+ return OPERATOR_FINISHED;
}
break;
}
@@ -1230,12 +1226,10 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
if(selcount) {
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
- BKE_mesh_end_editmesh(me, em);
- return OPERATOR_FINISHED;
}
BKE_mesh_end_editmesh(me, em);
- return OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
static int select_similar_exec(bContext *C, wmOperator *op)
@@ -1342,7 +1336,8 @@ void mesh_layers_menu_concat(CustomData *data, int type, char *str)
}
}
-int mesh_layers_menu(CustomData *data, int type) {
+int mesh_layers_menu(CustomData *data, int type)
+{
int ret;
char *str_pt, *str;
@@ -2461,7 +2456,8 @@ static int select_linked_limited_invoke(ViewContext *vc, short all, short sel)
#undef is_face_tag
#undef face_tag
-static void linked_limit_default(bContext *C, wmOperator *op) {
+static void linked_limit_default(bContext *C, wmOperator *op)
+{
if(!RNA_property_is_set(op->ptr, "limit")) {
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
@@ -4151,20 +4147,10 @@ static int smooth_vertex(bContext *C, wmOperator *op)
for (eve= em->verts.first; eve; eve= eve->next) {
if(eve->f & SELECT) {
- switch(mmd->axis){
- case 0:
- if (fabsf(eve->co[0]) < mmd->tolerance)
- eve->f2 |= 1;
- break;
- case 1:
- if (fabsf(eve->co[1]) < mmd->tolerance)
- eve->f2 |= 2;
- break;
- case 2:
- if (fabsf(eve->co[2]) < mmd->tolerance)
- eve->f2 |= 4;
- break;
- }
+ if (mmd->flag & MOD_MIR_AXIS_X && fabsf(eve->co[0]) < mmd->tolerance) eve->f2 |= 1;
+ if (mmd->flag & MOD_MIR_AXIS_Y && fabsf(eve->co[1]) < mmd->tolerance) eve->f2 |= 2;
+ if (mmd->flag & MOD_MIR_AXIS_Z && fabsf(eve->co[2]) < mmd->tolerance) eve->f2 |= 4;
+
}
}
}
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index acc6ab1fc0e..12e51acbda7 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -2666,20 +2666,11 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float
if(mmd->flag & MOD_MIR_CLIPPING) {
for (eve= em->verts.first; eve; eve= eve->next) {
eve->f2= 0;
- switch(mmd->axis){
- case 0:
- if (fabsf(eve->co[0]) < mmd->tolerance)
- eve->f2 |= 1;
- break;
- case 1:
- if (fabsf(eve->co[1]) < mmd->tolerance)
- eve->f2 |= 2;
- break;
- case 2:
- if (fabsf(eve->co[2]) < mmd->tolerance)
- eve->f2 |= 4;
- break;
- }
+
+ if (mmd->flag & MOD_MIR_AXIS_X && fabsf(eve->co[0]) < mmd->tolerance) eve->f2 |= 1;
+ if (mmd->flag & MOD_MIR_AXIS_Y && fabsf(eve->co[1]) < mmd->tolerance) eve->f2 |= 2;
+ if (mmd->flag & MOD_MIR_AXIS_Z && fabsf(eve->co[2]) < mmd->tolerance) eve->f2 |= 4;
+
}
}
}
@@ -6317,8 +6308,8 @@ static int validate_loop(EditMesh *em, Collection *edgecollection)
return(1);
}
-static int loop_bisect(EditMesh *em, Collection *edgecollection){
-
+static int loop_bisect(EditMesh *em, Collection *edgecollection)
+{
EditFace *efa, *sf1, *sf2;
EditEdge *eed, *sed;
CollectedEdge *curredge;
@@ -7255,7 +7246,7 @@ static int sort_faces_exec(bContext *C, wmOperator *op)
float cur[3];
if (event == 1)
- mul_m4_m4m4(mat, OBACT->obmat, rv3d->viewmat); /* apply the view matrix to the object matrix */
+ mult_m4_m4m4(mat, rv3d->viewmat, OBACT->obmat); /* apply the view matrix to the object matrix */
else if (event == 2) { /* sort from cursor */
if( v3d && v3d->localvd ) {
VECCOPY(cur, v3d->cursor);
@@ -7519,10 +7510,11 @@ static int select_axis_exec(bContext *C, wmOperator *op)
EditSelection *ese = em->selected.last;
- if(ese==NULL)
+ if (ese==NULL || ese->type != EDITVERT) {
+ BKE_report(op->reports, RPT_WARNING, "This operator requires an active vertex (last selected)");
return OPERATOR_CANCELLED;
-
- if(ese->type==EDITVERT) {
+ }
+ else {
EditVert *ev;
EditVert *act_vert= (EditVert*)ese->data;
float value= act_vert->co[axis];
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index aa94b48c1e9..7762203c371 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -318,14 +318,14 @@ int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *na
static int layers_poll(bContext *C)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ID *data= (ob)? ob->data: NULL;
return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib);
}
static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE))
@@ -418,7 +418,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Assign Image to UV Map";
- ot->description= "Assigns Image to active UV Map, or creates a UV Map";
+ ot->description= "Assign Image to active UV Map, or create an UV Map";
ot->idname= "MESH_OT_drop_named_image";
/* api callbacks */
@@ -435,7 +435,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot)
static int uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
if(!ED_mesh_uv_texture_remove(C, ob, me))
@@ -464,7 +464,7 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot)
static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
if(!ED_mesh_color_add(C, scene, ob, me, NULL, TRUE))
@@ -490,7 +490,7 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot)
static int vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
if(!ED_mesh_color_remove(C, ob, me))
@@ -520,7 +520,7 @@ static int sticky_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
/*if(me->msticky)
@@ -551,7 +551,7 @@ void MESH_OT_sticky_add(wmOperatorType *ot)
static int sticky_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Mesh *me= ob->data;
if(!me->msticky)
diff --git a/source/blender/editors/mesh/mesh_navmesh.c b/source/blender/editors/mesh/mesh_navmesh.c
index 48d2c629148..973659cbb35 100644
--- a/source/blender/editors/mesh/mesh_navmesh.c
+++ b/source/blender/editors/mesh/mesh_navmesh.c
@@ -534,7 +534,8 @@ void MESH_OT_navmesh_face_copy(struct wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int compare(const void * a, const void * b){
+static int compare(const void * a, const void * b)
+{
return ( *(int*)a - *(int*)b );
}
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 3caafb12f82..b94b60fc279 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -327,7 +327,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
/* if this is the object we're merging into, no need to do anything */
if(base->object != ob) {
/* watch this: switch matmul order really goes wrong */
- mul_m4_m4m4(cmat, base->object->obmat, imat);
+ mult_m4_m4m4(cmat, imat, base->object->obmat);
/* transform vertex coordinates into new space */
for(a=0, mv=mvert; a < me->totvert; a++, mv++) {
@@ -497,7 +497,6 @@ int join_mesh_exec(bContext *C, wmOperator *op)
MEM_freeN(matar);
ob->totcol= me->totcol= totcol;
- ob->colbits= 0;
if (matmap) MEM_freeN(matmap);
@@ -672,17 +671,17 @@ static void mesh_octree_free_node(MocNode **bt)
/* temporal define, just to make nicer code below */
-#define MOC_ADDNODE(vx, vy, vz) mesh_octree_add_node(basetable + ((vx)*MOC_RES*MOC_RES) + (vy)*MOC_RES + (vz), index)
+#define MOC_INDEX(vx, vy, vz) (((vx)*MOC_RES*MOC_RES) + (vy)*MOC_RES + (vz))
static void mesh_octree_add_nodes(MocNode **basetable, float *co, float *offs, float *div, intptr_t index)
{
float fx, fy, fz;
int vx, vy, vz;
- if (!finite(co[0]) ||
- !finite(co[1]) ||
- !finite(co[2])
- ) {
+ if ( !finite(co[0]) ||
+ !finite(co[1]) ||
+ !finite(co[2]))
+ {
return;
}
@@ -693,33 +692,33 @@ static void mesh_octree_add_nodes(MocNode **basetable, float *co, float *offs, f
CLAMP(fy, 0.0f, MOC_RES-MOC_THRESH);
CLAMP(fz, 0.0f, MOC_RES-MOC_THRESH);
- vx= floor(fx);
- vy= floor(fy);
- vz= floor(fz);
-
- MOC_ADDNODE(vx, vy, vz);
-
- if( vx>0 )
- if( fx-((float)vx)-MOC_THRESH < 0.0f)
- MOC_ADDNODE(vx-1, vy, vz);
- if( vx<MOC_RES-2 )
- if( fx-((float)vx)+MOC_THRESH > 1.0f)
- MOC_ADDNODE(vx+1, vy, vz);
-
- if( vy>0 )
- if( fy-((float)vy)-MOC_THRESH < 0.0f)
- MOC_ADDNODE(vx, vy-1, vz);
- if( vy<MOC_RES-2 )
- if( fy-((float)vy)+MOC_THRESH > 1.0f)
- MOC_ADDNODE(vx, vy+1, vz);
-
- if( vz>0 )
- if( fz-((float)vz)-MOC_THRESH < 0.0f)
- MOC_ADDNODE(vx, vy, vz-1);
- if( vz<MOC_RES-2 )
- if( fz-((float)vz)+MOC_THRESH > 1.0f)
- MOC_ADDNODE(vx, vy, vz+1);
-
+ vx= (int)floorf(fx);
+ vy= (int)floorf(fy);
+ vz= (int)floorf(fz);
+
+ mesh_octree_add_node(basetable + MOC_INDEX(vx, vy, vz), index);
+
+ if (vx > 0)
+ if (fx-((float)vx)-MOC_THRESH < 0.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx - 1, vy, vz), index);
+ if (vx < MOC_RES - 2)
+ if (fx-((float)vx)+MOC_THRESH > 1.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx + 1, vy, vz), index);
+
+ if (vy > 0)
+ if (fy-((float)vy)-MOC_THRESH < 0.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx, vy - 1, vz), index);
+ if (vy < MOC_RES - 2)
+ if (fy-((float)vy)+MOC_THRESH > 1.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx, vy + 1, vz), index);
+
+ if (vz > 0)
+ if (fz-((float)vz)-MOC_THRESH < 0.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx, vy, vz - 1), index);
+ if (vz <MOC_RES - 2)
+ if (fz-((float)vz)+MOC_THRESH > 1.0f)
+ mesh_octree_add_node(basetable + MOC_INDEX(vx, vy, vz + 1), index);
+
}
static intptr_t mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
@@ -766,7 +765,7 @@ intptr_t mesh_octree_table(Object *ob, EditMesh *em, float *co, char mode)
if(mode=='u') { /* use table */
if(MeshOctree.table==NULL)
mesh_octree_table(ob, em, NULL, 's');
-
+
if(MeshOctree.table) {
Mesh *me= ob->data;
bt= MeshOctree.table + mesh_octree_get_base_offs(co, MeshOctree.offs, MeshOctree.div);
@@ -849,212 +848,23 @@ intptr_t mesh_octree_table(Object *ob, EditMesh *em, float *co, char mode)
return 0;
}
-
-/* ********************* MESH VERTEX MIRR TOPO LOOKUP *************** */
-
-#define MIRRHASH_TYPE int
-
-typedef struct MirrTopoPair {
- long hash;
- int vIndex;
-} MirrTopoPair;
-
-static int MirrTopo_long_sort(const void *l1, const void *l2)
-{
- if( (MIRRHASH_TYPE)(intptr_t)l1 > (MIRRHASH_TYPE)(intptr_t)l2 ) return 1;
- else if( (MIRRHASH_TYPE)(intptr_t)l1 < (MIRRHASH_TYPE)(intptr_t)l2 ) return -1;
- return 0;
-}
-
-static int MirrTopo_item_sort(const void *v1, const void *v2)
-{
- if( ((MirrTopoPair *)v1)->hash > ((MirrTopoPair *)v2)->hash ) return 1;
- else if( ((MirrTopoPair *)v1)->hash < ((MirrTopoPair *)v2)->hash ) return -1;
- return 0;
-}
-
-static long *mesh_topo_lookup = NULL;
-static int mesh_topo_lookup_tot = -1;
-static int mesh_topo_lookup_mode = -1;
+MirrTopoStore_t mesh_topo_store= {NULL, -1. -1, -1};
/* mode is 's' start, or 'e' end, or 'u' use */
/* if end, ob can be NULL */
-long mesh_mirrtopo_table(Object *ob, char mode)
+/* note, is supposed return -1 on error, which callers are currently checking for, but is not used so far */
+int mesh_mirrtopo_table(Object *ob, char mode)
{
if(mode=='u') { /* use table */
- Mesh *me= ob->data;
- if( (mesh_topo_lookup==NULL) ||
- (mesh_topo_lookup_mode != ob->mode) ||
- (me->edit_mesh && me->edit_mesh->totvert != mesh_topo_lookup_tot) ||
- (me->edit_mesh==NULL && me->totvert != mesh_topo_lookup_tot)
- ) {
+ if (ED_mesh_mirrtopo_recalc_check(ob->data, ob->mode, &mesh_topo_store)) {
mesh_mirrtopo_table(ob, 's');
}
- } else if(mode=='s') { /* start table */
- Mesh *me= ob->data;
- MEdge *medge;
- EditMesh *em= me->edit_mesh;
- void **eve_tmp_back= NULL; /* some of the callers are using eve->tmp so restore after */
-
-
- /* editmode*/
- EditEdge *eed;
-
- int a, last, totvert;
- int totUnique= -1, totUniqueOld= -1;
-
- MIRRHASH_TYPE *MirrTopoHash = NULL;
- MIRRHASH_TYPE *MirrTopoHash_Prev = NULL;
- MirrTopoPair *MirrTopoPairs;
- mesh_topo_lookup_mode= ob->mode;
-
- /* reallocate if needed */
- if (mesh_topo_lookup) {
- MEM_freeN(mesh_topo_lookup);
- mesh_topo_lookup = NULL;
- }
-
- if(em) {
- EditVert *eve;
- totvert= 0;
- eve_tmp_back= MEM_callocN( em->totvert * sizeof(void *), "TopoMirr" );
- for(eve= em->verts.first; eve; eve= eve->next) {
- eve_tmp_back[totvert]= eve->tmp.p;
- eve->tmp.l = totvert++;
- }
- }
- else {
- totvert = me->totvert;
- }
-
- MirrTopoHash = MEM_callocN( totvert * sizeof(MIRRHASH_TYPE), "TopoMirr" );
-
- /* Initialize the vert-edge-user counts used to detect unique topology */
- if(em) {
- for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->tmp.l]++;
- MirrTopoHash[eed->v2->tmp.l]++;
- }
- } else {
- for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
- MirrTopoHash[medge->v1]++;
- MirrTopoHash[medge->v2]++;
- }
- }
-
- MirrTopoHash_Prev = MEM_dupallocN( MirrTopoHash );
-
- totUniqueOld = -1;
- while(1) {
- /* use the number of edges per vert to give verts unique topology IDs */
-
- if(em) {
- for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->tmp.l] += MirrTopoHash_Prev[eed->v2->tmp.l];
- MirrTopoHash[eed->v2->tmp.l] += MirrTopoHash_Prev[eed->v1->tmp.l];
- }
- } else {
- for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
- /* This can make really big numbers, wrapping around here is fine */
- MirrTopoHash[medge->v1] += MirrTopoHash_Prev[medge->v2];
- MirrTopoHash[medge->v2] += MirrTopoHash_Prev[medge->v1];
- }
- }
- memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MIRRHASH_TYPE) * totvert);
-
- /* sort so we can count unique values */
- qsort(MirrTopoHash_Prev, totvert, sizeof(MIRRHASH_TYPE), MirrTopo_long_sort);
-
- totUnique = 1; /* account for skiping the first value */
- for(a=1; a<totvert; a++) {
- if (MirrTopoHash_Prev[a-1] != MirrTopoHash_Prev[a]) {
- totUnique++;
- }
- }
-
- if (totUnique <= totUniqueOld) {
- /* Finish searching for unique valus when 1 loop dosnt give a
- * higher number of unique values compared to the previous loop */
- break;
- } else {
- totUniqueOld = totUnique;
- }
- /* Copy the hash calculated this iter, so we can use them next time */
- memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MIRRHASH_TYPE) * totvert);
- }
-
- /* restore eve->tmp.* */
- if(eve_tmp_back) {
- EditVert *eve;
- totvert= 0;
- for(eve= em->verts.first; eve; eve= eve->next) {
- eve->tmp.p= eve_tmp_back[totvert++];
- }
-
- MEM_freeN(eve_tmp_back);
- eve_tmp_back= NULL;
- }
-
-
- /* Hash/Index pairs are needed for sorting to find index pairs */
- MirrTopoPairs= MEM_callocN( sizeof(MirrTopoPair) * totvert, "MirrTopoPairs");
-
- /* since we are looping through verts, initialize these values here too */
- mesh_topo_lookup = MEM_mallocN( totvert * sizeof(long), "mesh_topo_lookup" );
-
- if(em) {
- EM_init_index_arrays(em,1,0,0);
- }
-
-
- for(a=0; a<totvert; a++) {
- MirrTopoPairs[a].hash= MirrTopoHash[a];
- MirrTopoPairs[a].vIndex = a;
-
- /* initialize lookup */
- mesh_topo_lookup[a] = -1;
- }
-
- qsort(MirrTopoPairs, totvert, sizeof(MirrTopoPair), MirrTopo_item_sort);
-
- /* Since the loop starts at 2, we must define the last index where the hash's differ */
- last = ((totvert >= 2) && (MirrTopoPairs[0].hash == MirrTopoPairs[1].hash)) ? 0 : 1;
-
- /* Get the pairs out of the sorted hashes, note, totvert+1 means we can use the previous 2,
- * but you cant ever access the last 'a' index of MirrTopoPairs */
- for(a=2; a < totvert+1; a++) {
- /* printf("I %d %ld %d\n", (a-last), MirrTopoPairs[a ].hash, MirrTopoPairs[a ].vIndex ); */
- if ((a==totvert) || (MirrTopoPairs[a-1].hash != MirrTopoPairs[a].hash)) {
- if (a-last==2) {
- if(em) {
- mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] = (long)EM_get_vert_for_index(MirrTopoPairs[a-2].vIndex);
- mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] = (long)EM_get_vert_for_index(MirrTopoPairs[a-1].vIndex);
- } else {
- mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] = MirrTopoPairs[a-2].vIndex;
- mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] = MirrTopoPairs[a-1].vIndex;
- }
- }
- last= a;
- }
- }
- if(em) {
- EM_free_index_arrays();
- }
-
- MEM_freeN( MirrTopoPairs );
- MirrTopoPairs = NULL;
-
- MEM_freeN( MirrTopoHash );
- MEM_freeN( MirrTopoHash_Prev );
-
- mesh_topo_lookup_tot = totvert;
-
- } else if(mode=='e') { /* end table */
- if (mesh_topo_lookup) {
- MEM_freeN(mesh_topo_lookup);
- }
- mesh_topo_lookup = NULL;
- mesh_topo_lookup_tot= -1;
+ }
+ else if(mode=='s') { /* start table */
+ ED_mesh_mirrtopo_init(ob->data, ob->mode, &mesh_topo_store, FALSE);
+ }
+ else if(mode=='e') { /* end table */
+ ED_mesh_mirrtopo_free(&mesh_topo_store);
}
return 0;
}
@@ -1078,7 +888,7 @@ static int mesh_get_x_mirror_vert_topo(Object *ob, int index)
if (mesh_mirrtopo_table(ob, 'u')==-1)
return -1;
- return mesh_topo_lookup[index];
+ return mesh_topo_store.index_lookup[index];
}
int mesh_get_x_mirror_vert(Object *ob, int index)
@@ -1114,7 +924,7 @@ static EditVert *editmesh_get_x_mirror_vert_spacial(Object *ob, EditMesh *em, fl
static EditVert *editmesh_get_x_mirror_vert_topo(Object *ob, struct EditMesh *em, EditVert *eve, int index)
{
- long poinval;
+ intptr_t poinval;
if (mesh_mirrtopo_table(ob, 'u')==-1)
return NULL;
@@ -1126,7 +936,7 @@ static EditVert *editmesh_get_x_mirror_vert_topo(Object *ob, struct EditMesh *em
}
}
- poinval= mesh_topo_lookup[ index ];
+ poinval= mesh_topo_store.index_lookup[index];
if(poinval != -1)
return (EditVert *)(poinval);
@@ -1270,8 +1080,8 @@ int *mesh_get_x_mirror_faces(Object *ob, EditMesh *em)
/* make sure v4 is not 0 if a quad */
if(mf->v4 && mirrormf.v4==0) {
- SWAP(int, mirrormf.v1, mirrormf.v3);
- SWAP(int, mirrormf.v2, mirrormf.v4);
+ SWAP(unsigned int, mirrormf.v1, mirrormf.v3);
+ SWAP(unsigned int, mirrormf.v2, mirrormf.v4);
}
hashmf= BLI_ghash_lookup(fhash, &mirrormf);
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index a77a34e05ec..414d3344511 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -40,6 +40,7 @@
#include "BLI_rand.h"
#include "BLI_utildefines.h"
+#include "DNA_defs.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index f1bc63aa746..1547c5daf54 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -47,9 +47,10 @@
#include "DNA_speaker_types.h"
#include "DNA_vfont_types.h"
+#include "BLI_ghash.h"
+#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_string.h"
-#include "BLI_listbase.h"
#include "BLI_utildefines.h"
#include "BKE_anim.h"
@@ -244,7 +245,8 @@ int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev
return op->type->exec(C, op);
}
-int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer)
+int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc,
+ float *rot, int *enter_editmode, unsigned int *layer)
{
View3D *v3d = CTX_wm_view3d(C);
int a, layer_values[20];
@@ -305,7 +307,8 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa
/* for object add primitive operators */
/* do not call undo push in this function (users of this function have to) */
-Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer)
+Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot,
+ int enter_editmode, unsigned int layer)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -891,7 +894,7 @@ static int object_delete_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- const short use_global= RNA_boolean_get(op->ptr, "global");
+ const short use_global= RNA_boolean_get(op->ptr, "use_global");
/* int islamp= 0; */ /* UNUSED */
if(CTX_data_edit_object(C))
@@ -949,7 +952,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_boolean(ot->srna, "global", 0, "Delete Globally", "Remove object from all scenes");
+ RNA_def_boolean(ot->srna, "use_global", 0, "Delete Globally", "Remove object from all scenes");
}
/**************************** Copy Utilities ******************************/
@@ -1048,11 +1051,17 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
{
ListBase *lb;
DupliObject *dob;
-
+ GHash *dupli_gh= NULL, *parent_gh= NULL;
+
if(!(base->object->transflag & OB_DUPLI))
return;
lb= object_duplilist(scene, base->object);
+
+ if(use_hierarchy || use_base_parent) {
+ dupli_gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "make_object_duplilist_real dupli_gh");
+ parent_gh= BLI_ghash_new(BLI_ghashutil_pairhash, BLI_ghashutil_paircmp, "make_object_duplilist_real parent_gh");
+ }
for(dob= lb->first; dob; dob= dob->next) {
Base *basen;
@@ -1081,6 +1090,11 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
copy_m4_m4(ob->obmat, dob->mat);
object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
+
+ if(dupli_gh)
+ BLI_ghash_insert(dupli_gh, dob, ob);
+ if(parent_gh)
+ BLI_ghash_insert(parent_gh, BLI_ghashutil_pairalloc(dob->ob, dob->index), ob);
}
if (use_hierarchy) {
@@ -1089,12 +1103,17 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
Object *ob_src= dob->ob;
Object *ob_src_par= ob_src->parent;
- Object *ob_dst= (Object *)ob_src->id.newid;
+ Object *ob_dst= BLI_ghash_lookup(dupli_gh, dob);
+ Object *ob_dst_par= NULL;
- if (ob_src_par && ob_src_par->id.newid) {
- /* the parent was also made real, parent newly real duplis */
- Object *ob_dst_par= (Object *)ob_src_par->id.newid;
+ /* find parent that was also made real */
+ if(ob_src_par) {
+ GHashPair *pair = BLI_ghashutil_pairalloc(ob_src_par, dob->index);
+ ob_dst_par = BLI_ghash_lookup(parent_gh, pair);
+ BLI_ghashutil_pairfree(pair);
+ }
+ if (ob_dst_par) {
/* allow for all possible parent types */
ob_dst->partype= ob_src->partype;
BLI_strncpy(ob_dst->parsubstr, ob_src->parsubstr, sizeof(ob_dst->parsubstr));
@@ -1128,8 +1147,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
* base object */
for(dob= lb->first; dob; dob= dob->next) {
/* original parents */
- Object *ob_src= dob->ob;
- Object *ob_dst= (Object *)ob_src->id.newid;
+ Object *ob_dst= BLI_ghash_lookup(dupli_gh, dob);
ob_dst->parent= base->object;
ob_dst->partype= PAROBJECT;
@@ -1143,6 +1161,11 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
}
}
+ if(dupli_gh)
+ BLI_ghash_free(dupli_gh, NULL, NULL);
+ if(parent_gh)
+ BLI_ghash_free(parent_gh, BLI_ghashutil_pairfree, NULL);
+
copy_object_set_idnew(C, 0);
free_object_duplilist(lb);
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index cf55a5317a5..a02b90a1d16 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -997,9 +997,7 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l
*lvl= mmd->lvl;
if(*lvl==0) {
- DerivedMesh *tmp_dm= CDDM_from_mesh(me, ob);
- dm= CDDM_copy(tmp_dm);
- tmp_dm->release(tmp_dm);
+ return NULL;
} else {
MultiresModifierData tmp_mmd= *mmd;
DerivedMesh *cddm= CDDM_from_mesh(me, ob);
@@ -1059,6 +1057,7 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
{
Object *ob;
Scene *scene= CTX_data_scene(C);
+ int objects_baked= 0;
if(!multiresbake_check(C, op))
return OPERATOR_CANCELLED;
@@ -1089,6 +1088,10 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
/* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */
bkr.lores_dm= multiresbake_create_loresdm(scene, ob, &bkr.lvl);
+
+ if(!bkr.lores_dm)
+ continue;
+
bkr.hires_dm= multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple);
multiresbake_start(&bkr);
@@ -1097,9 +1100,14 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
bkr.lores_dm->release(bkr.lores_dm);
bkr.hires_dm->release(bkr.hires_dm);
+
+ objects_baked++;
}
CTX_DATA_END;
+ if(!objects_baked)
+ BKE_report(op->reports, RPT_ERROR, "No objects found to bake from");
+
return OPERATOR_FINISHED;
}
@@ -1117,13 +1125,21 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
MultiresBakerJobData *data;
+ DerivedMesh *lores_dm;
+ int lvl;
ob= base->object;
multires_force_update(ob);
+ lores_dm = multiresbake_create_loresdm(scene, ob, &lvl);
+ if(!lores_dm)
+ continue;
+
data= MEM_callocN(sizeof(MultiresBakerJobData), "multiresBaker derivedMesh_data");
- data->lores_dm = multiresbake_create_loresdm(scene, ob, &data->lvl);
+ data->lores_dm = lores_dm;
+ data->lvl = lvl;
data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
+
BLI_addtail(&bkj->data, data);
}
CTX_DATA_END;
@@ -1206,6 +1222,11 @@ static int multiresbake_image_exec(bContext *C, wmOperator *op)
bkr= MEM_callocN(sizeof(MultiresBakeJob), "MultiresBakeJob data");
init_multiresbake_job(C, bkr);
+ if(!bkr->data.first) {
+ BKE_report(op->reports, RPT_ERROR, "No objects found to bake from");
+ return OPERATOR_CANCELLED;
+ }
+
/* setup job */
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Multires Bake", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS);
WM_jobs_customdata(steve, bkr, multiresbake_freejob);
@@ -1259,9 +1280,7 @@ static int test_bake_internal(bContext *C, ReportList *reports)
{
Scene *scene= CTX_data_scene(C);
- if(scene->r.renderer!=R_INTERN) {
- BKE_report(reports, RPT_ERROR, "Bake only supported for Internal Renderer");
- } else if((scene->r.bake_flag & R_BAKE_TO_ACTIVE) && CTX_data_active_object(C)==NULL) {
+ if((scene->r.bake_flag & R_BAKE_TO_ACTIVE) && CTX_data_active_object(C)==NULL) {
BKE_report(reports, RPT_ERROR, "No active object");
}
else if(scene->r.bake_mode==RE_BAKE_AO && scene->world==NULL) {
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 2a45a7df735..8266f3501c5 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -408,8 +408,21 @@ static void test_constraints (Object *owner, bPoseChannel *pchan)
if((data->flag&CAMERASOLVER_ACTIVECLIP)==0) {
if(data->clip != NULL && data->track[0]) {
- if (!BKE_tracking_named_track(&data->clip->tracking, data->track))
+ MovieTracking *tracking= &data->clip->tracking;
+ MovieTrackingObject *tracking_object;
+
+ if(data->object[0])
+ tracking_object= BKE_tracking_named_object(tracking, data->object);
+ else
+ tracking_object= BKE_tracking_get_camera_object(tracking);
+
+ if(!tracking_object) {
curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else {
+ if (!BKE_tracking_named_track(tracking, tracking_object, data->track))
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
}
else curcon->flag |= CONSTRAINT_DISABLE;
}
@@ -420,6 +433,12 @@ static void test_constraints (Object *owner, bPoseChannel *pchan)
if((data->flag&CAMERASOLVER_ACTIVECLIP)==0 && data->clip == NULL)
curcon->flag |= CONSTRAINT_DISABLE;
}
+ else if (curcon->type == CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data = curcon->data;
+
+ if((data->flag&CAMERASOLVER_ACTIVECLIP)==0 && data->clip == NULL)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
/* Check targets for constraints */
if (cti && cti->get_constraint_targets) {
@@ -684,25 +703,13 @@ void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot)
/* ------------- Child-Of Constraint ------------------ */
-/* ChildOf Constraint - set inverse callback */
-static int childof_set_inverse_exec (bContext *C, wmOperator *op)
+static void child_get_inverse_matrix (Scene *scene, Object *ob, bConstraint *con, float invmat[4][4])
{
- Scene *scene= CTX_data_scene(C);
- Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
- bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
bConstraint *lastcon = NULL;
bPoseChannel *pchan= NULL;
- /* despite 3 layers of checks, we may still not be able to find a constraint */
- if (data == NULL) {
- printf("DEBUG: Child-Of Set Inverse - object = '%s'\n", (ob)? ob->id.name+2 : "<None>");
- BKE_report(op->reports, RPT_ERROR, "Couldn't find constraint data for Child-Of Set Inverse");
- return OPERATOR_CANCELLED;
- }
-
/* nullify inverse matrix first */
- unit_m4(data->invmat);
+ unit_m4(invmat);
/* try to find a pose channel - assume that this is the constraint owner */
// TODO: get from context instead?
@@ -747,8 +754,8 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
* the effect of the constraint
*/
invert_m4_m4(imat, pchan->pose_mat);
- mul_m4_m4m4(tmat, imat, pmat);
- invert_m4_m4(data->invmat, tmat);
+ mult_m4_m4m4(tmat, pmat, imat);
+ invert_m4_m4(invmat, tmat);
/* 5. restore constraints */
pchan->constraints.last = lastcon;
@@ -770,9 +777,27 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
/* use what_does_parent to find inverse - just like for normal parenting */
what_does_parent(scene, ob, &workob);
- invert_m4_m4(data->invmat, workob.obmat);
+ invert_m4_m4(invmat, workob.obmat);
+ }
+}
+
+/* ChildOf Constraint - set inverse callback */
+static int childof_set_inverse_exec (bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob = ED_object_active_context(C);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
+ bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
+
+ /* despite 3 layers of checks, we may still not be able to find a constraint */
+ if (data == NULL) {
+ printf("DEBUG: Child-Of Set Inverse - object = '%s'\n", (ob)? ob->id.name+2 : "<None>");
+ BKE_report(op->reports, RPT_ERROR, "Couldn't find constraint data for Child-Of Set Inverse");
+ return OPERATOR_CANCELLED;
}
+ child_get_inverse_matrix(scene, ob, con, data->invmat);
+
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
return OPERATOR_FINISHED;
@@ -846,6 +871,96 @@ void CONSTRAINT_OT_childof_clear_inverse (wmOperatorType *ot)
edit_constraint_properties(ot);
}
+/* ------------- Object Solver Constraint ------------------ */
+
+static int objectsolver_set_inverse_exec (bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob = ED_object_active_context(C);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
+ bObjectSolverConstraint *data= (con) ? (bObjectSolverConstraint *)con->data : NULL;
+
+ /* despite 3 layers of checks, we may still not be able to find a constraint */
+ if (data == NULL) {
+ printf("DEBUG: Child-Of Set Inverse - object = '%s'\n", (ob)? ob->id.name+2 : "<None>");
+ BKE_report(op->reports, RPT_ERROR, "Couldn't find constraint data for Child-Of Set Inverse");
+ return OPERATOR_CANCELLED;
+ }
+
+ child_get_inverse_matrix(scene, ob, con, data->invmat);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int objectsolver_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ if (edit_constraint_invoke_properties(C, op))
+ return objectsolver_set_inverse_exec(C, op);
+ else
+ return OPERATOR_CANCELLED;
+}
+
+void CONSTRAINT_OT_objectsolver_set_inverse (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Inverse";
+ ot->idname= "CONSTRAINT_OT_objectsolver_set_inverse";
+ ot->description= "Set inverse correction for ObjectSolver constraint";
+
+ ot->exec= objectsolver_set_inverse_exec;
+ ot->invoke= objectsolver_set_inverse_invoke;
+ ot->poll= edit_constraint_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ edit_constraint_properties(ot);
+}
+
+static int objectsolver_clear_inverse_exec (bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
+ bObjectSolverConstraint *data= (con) ? (bObjectSolverConstraint *)con->data : NULL;
+
+ if(data==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Childof constraint not found");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* simply clear the matrix */
+ unit_m4(data->invmat);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int objectsolver_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ if (edit_constraint_invoke_properties(C, op))
+ return objectsolver_clear_inverse_exec(C, op);
+ else
+ return OPERATOR_CANCELLED;
+}
+
+void CONSTRAINT_OT_objectsolver_clear_inverse (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Inverse";
+ ot->idname= "CONSTRAINT_OT_objectsolver_clear_inverse";
+ ot->description= "Clear inverse correction for ObjectSolver constraint";
+
+ ot->exec= objectsolver_clear_inverse_exec;
+ ot->invoke= objectsolver_clear_inverse_invoke;
+ ot->poll= edit_constraint_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ edit_constraint_properties(ot);
+}
+
/***************************** BUTTONS ****************************/
void ED_object_constraint_set_active(Object *ob, bConstraint *con)
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 722e7057ece..658f4acf940 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -111,6 +111,10 @@ static int pupmenu(const char *UNUSED(msg)) {return 0;}
static bContext *evil_C;
static void error_libdata(void) {}
+Object *ED_object_context(bContext *C)
+{
+ return CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+}
/* find the correct active object per context
* note: context can be NULL when called from a enum with PROP_ENUM_NO_CONTEXT */
@@ -118,7 +122,7 @@ Object *ED_object_active_context(bContext *C)
{
Object *ob= NULL;
if(C) {
- ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ob= ED_object_context(C);
if (!ob) ob= CTX_data_active_object(C);
}
return ob;
@@ -439,9 +443,6 @@ void ED_object_enter_editmode(bContext *C, int flag)
ob->mode= OB_MODE_EDIT;
if(ob->type==OB_MESH) {
- Mesh *me= ob->data;
-
- if(me->pv) mesh_pmv_off(me);
ok= 1;
scene->obedit= ob; // context sees this
@@ -1142,7 +1143,7 @@ static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
}
else if(event==3) { /* size */
copy_v3_v3(base->object->size, ob->size);
- copy_v3_v3(base->object->dsize, ob->dsize);
+ copy_v3_v3(base->object->dscale, ob->dscale);
}
else if(event==4) { /* drawtype */
base->object->dt= ob->dt;
@@ -2181,3 +2182,51 @@ void OBJECT_OT_logic_bricks_copy(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
+static int game_physics_copy_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob=ED_object_active_context(C);
+
+ CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
+ if(ob != ob_iter) {
+ ob_iter->gameflag = ob->gameflag;
+ ob_iter->gameflag2 = ob->gameflag2;
+ ob_iter->inertia = ob->inertia;
+ ob_iter->formfactor = ob->formfactor;;
+ ob_iter->damping = ob->damping;
+ ob_iter->rdamping = ob->rdamping;
+ ob_iter->min_vel = ob->min_vel;
+ ob_iter->max_vel = ob->max_vel;
+ ob_iter->obstacleRad = ob->obstacleRad;
+ ob_iter->mass = ob->mass;
+ ob_iter->anisotropicFriction[0] = ob->anisotropicFriction[0];
+ ob_iter->anisotropicFriction[1] = ob->anisotropicFriction[1];
+ ob_iter->anisotropicFriction[2] = ob->anisotropicFriction[2];
+ ob_iter->collision_boundtype = ob->collision_boundtype;
+ ob_iter->margin = ob->margin;
+ ob_iter->bsoft = copy_bulletsoftbody(ob->bsoft);
+ if(ob->restrictflag & OB_RESTRICT_RENDER)
+ ob_iter->restrictflag |= OB_RESTRICT_RENDER;
+ else
+ ob_iter->restrictflag &= ~OB_RESTRICT_RENDER;
+ }
+ }
+ CTX_DATA_END;
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_game_physics_copy(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy Game Physics Properties to Selected";
+ ot->description = "Copy game physics properties to other selected objects";
+ ot->idname= "OBJECT_OT_game_physics_copy";
+
+ /* api callbacks */
+ ot->exec= game_physics_copy_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c
index bf0439b7044..74cf174d7b4 100644
--- a/source/blender/editors/object/object_group.c
+++ b/source/blender/editors/object/object_group.c
@@ -46,6 +46,7 @@
#include "BKE_report.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -230,7 +231,7 @@ void GROUP_OT_create(wmOperatorType *ot)
static int group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Group *group;
if(ob == NULL)
@@ -261,7 +262,7 @@ void OBJECT_OT_group_add(wmOperatorType *ot)
static int group_link_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group"));
if(ELEM(NULL, ob, group))
@@ -299,7 +300,7 @@ void OBJECT_OT_group_link(wmOperatorType *ot)
static int group_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Group *group= CTX_data_pointer_get_type(C, "group", &RNA_Group).data;
if(!ob || !group)
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 2a827091fde..7bb91c1fc4b 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -608,7 +608,9 @@ void OBJECT_OT_hook_remove(wmOperatorType *ot)
ot->poll= hook_op_edit_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* this operator removes modifier which isn't stored in local undo stack,
+ so redoing it from redo panel gives totally weird results */
+ ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
/* properties */
prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to remove");
@@ -644,7 +646,7 @@ static int object_hook_reset_exec(bContext *C, wmOperator *op)
float imat[4][4], mat[4][4];
/* calculate the world-space matrix for the pose-channel target first, then carry on as usual */
- mul_m4_m4m4(mat, pchan->pose_mat, hmd->object->obmat);
+ mult_m4_m4m4(mat, hmd->object->obmat, pchan->pose_mat);
invert_m4_m4(imat, mat);
mul_serie_m4(hmd->parentinv, imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
@@ -794,7 +796,9 @@ void OBJECT_OT_hook_assign(wmOperatorType *ot)
ot->poll= hook_op_edit_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* this operator changes data stored in modifier which doesn't get pushed to undo stack,
+ so redoing it from redo panel gives totally weird results */
+ ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
/* properties */
prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to");
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 185d8d43765..8973fb88c85 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -92,6 +92,7 @@ void OBJECT_OT_game_property_remove(struct wmOperatorType *ot);
void OBJECT_OT_game_property_copy(struct wmOperatorType *ot);
void OBJECT_OT_game_property_clear(struct wmOperatorType *ot);
void OBJECT_OT_logic_bricks_copy(struct wmOperatorType *ot);
+void OBJECT_OT_game_physics_copy(struct wmOperatorType *ot);
/* object_select.c */
void OBJECT_OT_select_all(struct wmOperatorType *ot);
@@ -185,6 +186,8 @@ void CONSTRAINT_OT_stretchto_reset(struct wmOperatorType *ot);
void CONSTRAINT_OT_limitdistance_reset(struct wmOperatorType *ot);
void CONSTRAINT_OT_childof_set_inverse(struct wmOperatorType *ot);
void CONSTRAINT_OT_childof_clear_inverse(struct wmOperatorType *ot);
+void CONSTRAINT_OT_objectsolver_set_inverse(struct wmOperatorType *ot);
+void CONSTRAINT_OT_objectsolver_clear_inverse (struct wmOperatorType *ot);
/* object_vgroup.c */
void OBJECT_OT_vertex_group_add(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 86477eb9dbd..9a592bc9324 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -452,11 +452,10 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
Key *key=me->key;
KeyBlock *kb;
- if(!modifier_sameTopology(md)) {
+ if(!modifier_sameTopology(md) || mti->type == eModifierTypeType_NonGeometrical) {
BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to Shapes");
return 0;
}
- mesh_pmv_off(me);
dm = mesh_create_derived_for_modifier(scene, ob, md);
if (!dm) {
@@ -501,13 +500,11 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
Mesh *me = ob->data;
MultiresModifierData *mmd= find_multires_modifier_before(scene, md);
- if( me->key) {
+ if(me->key && mti->type != eModifierTypeType_NonGeometrical) {
BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
return 0;
}
- mesh_pmv_off(me);
-
/* Multires: ensure that recent sculpting is applied */
if(md->type == eModifierType_Multires)
multires_force_update(ob);
@@ -646,7 +643,7 @@ static int modifier_add_exec(bContext *C, wmOperator *op)
static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free)
{
Object *ob= ED_object_active_context(C);
- EnumPropertyItem *item= NULL, *md_item;
+ EnumPropertyItem *item= NULL, *md_item, *group_item= NULL;
ModifierTypeInfo *mti;
int totitem= 0, a;
@@ -666,6 +663,17 @@ static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr)
(ob->type==OB_MESH && (mti->flags & eModifierTypeFlag_AcceptsMesh))))
continue;
}
+ else {
+ group_item= md_item;
+ md_item= NULL;
+
+ continue;
+ }
+
+ if(group_item) {
+ RNA_enum_item_add(&item, &totitem, group_item);
+ group_item= NULL;
+ }
RNA_enum_item_add(&item, &totitem, md_item);
}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index b7fe2d70b37..acc318723d8 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -161,6 +161,8 @@ void ED_operatortypes_object(void)
WM_operatortype_append(CONSTRAINT_OT_limitdistance_reset);
WM_operatortype_append(CONSTRAINT_OT_childof_set_inverse);
WM_operatortype_append(CONSTRAINT_OT_childof_clear_inverse);
+ WM_operatortype_append(CONSTRAINT_OT_objectsolver_set_inverse);
+ WM_operatortype_append(CONSTRAINT_OT_objectsolver_clear_inverse);
WM_operatortype_append(OBJECT_OT_vertex_group_add);
WM_operatortype_append(OBJECT_OT_vertex_group_remove);
@@ -189,6 +191,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_game_property_copy);
WM_operatortype_append(OBJECT_OT_game_property_clear);
WM_operatortype_append(OBJECT_OT_logic_bricks_copy);
+ WM_operatortype_append(OBJECT_OT_game_physics_copy);
WM_operatortype_append(OBJECT_OT_shape_key_add);
WM_operatortype_append(OBJECT_OT_shape_key_remove);
@@ -338,9 +341,9 @@ void ED_keymap_object(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OBJECT_OT_move_to_layer", MKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE);
WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE);
WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 3a4cd6135cf..1ba0157e8d3 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -340,7 +340,7 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
/* Add new object for the proxy */
newob= add_object(scene, OB_EMPTY);
- BLI_snprintf(name, sizeof(name), "%s_proxy", ((ID *)(gob ? gob : ob))->name);
+ BLI_snprintf(name, sizeof(name), "%s_proxy", ((ID *)(gob ? gob : ob))->name+2);
rename_id(&newob->id, name);
@@ -512,19 +512,9 @@ static EnumPropertyItem prop_make_parent_types[] = {
{0, NULL, 0, NULL, NULL}
};
-static int test_parent_loop(Object *par, Object *ob)
-{
- /* test if 'ob' is a parent somewhere in par's parents */
-
- if(par == NULL) return 0;
- if(ob == par) return 1;
-
- return test_parent_loop(par->parent, ob);
-}
-
void ED_object_parent(Object *ob, Object *par, int type, const char *substr)
{
- if(!par || test_parent_loop(par, ob)) {
+ if (!par || BKE_object_parent_loop_check(par, ob)) {
ob->parent= NULL;
ob->partype= PAROBJECT;
ob->parsubstr[0]= 0;
@@ -593,7 +583,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
if(ob!=par) {
- if( test_parent_loop(par, ob) ) {
+ if (BKE_object_parent_loop_check(par, ob)) {
BKE_report(op->reports, RPT_ERROR, "Loop in parents");
}
else {
@@ -766,7 +756,7 @@ static int parent_noinv_set_exec(bContext *C, wmOperator *op)
/* context iterator */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if (ob != par) {
- if (test_parent_loop(par, ob)) {
+ if (BKE_object_parent_loop_check(par, ob)) {
BKE_report(op->reports, RPT_ERROR, "Loop in parents");
}
else {
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index fce37b7a022..c4d33b74574 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -41,6 +41,7 @@
#include "DNA_modifier_types.h"
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
+#include "DNA_armature_types.h"
#include "BLI_math.h"
#include "BLI_listbase.h"
@@ -893,7 +894,7 @@ static int object_select_mirror_exec(bContext *C, wmOperator *op)
extend= RNA_boolean_get(op->ptr, "extend");
CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
- char tmpname[32];
+ char tmpname[MAXBONENAME];
flip_side_name(tmpname, primbase->object->id.name+2, TRUE);
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index 28f9c88f950..956ec868104 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -61,6 +61,7 @@
#include "BLO_sys_types.h" // for intptr_t support
+#include "ED_object.h"
#include "ED_mesh.h"
#include "RNA_access.h"
@@ -269,14 +270,14 @@ static int object_shape_key_mirror(bContext *C, Object *ob)
static int shape_key_mode_poll(bContext *C)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ID *data= (ob)? ob->data: NULL;
return (ob && !ob->id.lib && data && !data->lib && ob->mode != OB_MODE_EDIT);
}
static int shape_key_poll(bContext *C)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ID *data= (ob)? ob->data: NULL;
return (ob && !ob->id.lib && data && !data->lib);
}
@@ -284,7 +285,7 @@ static int shape_key_poll(bContext *C)
static int shape_key_add_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
int from_mix = RNA_boolean_get(op->ptr, "from_mix");
ED_object_shape_key_add(C, scene, ob, from_mix);
@@ -312,7 +313,7 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot)
static int shape_key_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!ED_object_shape_key_remove(C, ob))
return OPERATOR_CANCELLED;
@@ -337,7 +338,7 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
static int shape_key_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Key *key= ob_get_key(ob);
KeyBlock *kb= ob_get_keyblock(ob);
@@ -370,7 +371,7 @@ void OBJECT_OT_shape_key_clear(wmOperatorType *ot)
static int shape_key_mirror_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!object_shape_key_mirror(C, ob))
return OPERATOR_CANCELLED;
@@ -395,7 +396,7 @@ void OBJECT_OT_shape_key_mirror(wmOperatorType *ot)
static int shape_key_move_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
int type= RNA_enum_get(op->ptr, "type");
Key *key= ob_get_key(ob);
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 0d2b35eec02..a83896e7280 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -188,15 +188,15 @@ static void object_clear_scale(Object *ob)
{
/* clear scale factors which are not locked */
if ((ob->protectflag & OB_LOCK_SCALEX)==0) {
- ob->dsize[0]= 1.0f;
+ ob->dscale[0]= 1.0f;
ob->size[0]= 1.0f;
}
if ((ob->protectflag & OB_LOCK_SCALEY)==0) {
- ob->dsize[1]= 1.0f;
+ ob->dscale[1]= 1.0f;
ob->size[1]= 1.0f;
}
if ((ob->protectflag & OB_LOCK_SCALEZ)==0) {
- ob->dsize[2]= 1.0f;
+ ob->dscale[2]= 1.0f;
ob->size[2]= 1.0f;
}
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 16073434cc7..dfe0b94605d 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -67,6 +67,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_mesh.h"
#include "UI_resources.h"
@@ -99,6 +100,7 @@ int ED_vgroup_object_is_edit_mode(Object *ob)
bDeformGroup *ED_vgroup_add_name(Object *ob, const char *name)
{
bDeformGroup *defgroup;
+
if(!ob || !OB_TYPE_SUPPORT_VGROUP(ob->type))
return NULL;
@@ -174,7 +176,7 @@ int ED_vgroup_data_create(ID *id)
}
}
-static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
+static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot, const short use_vert_sel)
{
*dvert_tot = 0;
*dvert_arr = NULL;
@@ -200,20 +202,39 @@ static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_to
*dvert_tot = i;
i = 0;
- for (eve=em->verts.first; eve; eve=eve->next, i++) {
- (*dvert_arr)[i] = CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if (use_vert_sel) {
+ for (eve=em->verts.first; eve; eve=eve->next, i++) {
+ (*dvert_arr)[i] = (eve->f & SELECT) ?
+ CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT) : NULL;
+ }
+ }
+ else {
+ for (eve=em->verts.first; eve; eve=eve->next, i++) {
+ (*dvert_arr)[i] = CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ }
}
return 1;
}
else if(me->dvert) {
+ MVert *mvert= me->mvert;
+ MDeformVert *dvert= me->dvert;
int i;
*dvert_tot= me->totvert;
*dvert_arr= MEM_mallocN(sizeof(void*)*me->totvert, "vgroup parray from me");
- for (i=0; i<me->totvert; i++) {
- (*dvert_arr)[i] = me->dvert + i;
+ if (use_vert_sel) {
+ for (i=0; i<me->totvert; i++) {
+ (*dvert_arr)[i] = (mvert[i].flag & SELECT) ?
+ &dvert[i] : NULL;
+ }
+ }
+ else {
+ for (i=0; i<me->totvert; i++) {
+ (*dvert_arr)[i] = me->dvert + i;
+ }
}
return 1;
@@ -230,11 +251,20 @@ static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_to
lt= (lt->editlatt)? lt->editlatt->latt: lt;
if(lt->dvert) {
+ BPoint *def= lt->def;
*dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
*dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me");
- for (i=0; i<*dvert_tot; i++) {
- (*dvert_arr)[i] = lt->dvert + i;
+ if (use_vert_sel) {
+ for (i=0; i<*dvert_tot; i++) {
+ (*dvert_arr)[i] = (def->f1 & SELECT) ?
+ &lt->dvert[i] : NULL;
+ }
+ }
+ else {
+ for (i=0; i<*dvert_tot; i++) {
+ (*dvert_arr)[i] = lt->dvert + i;
+ }
}
return 1;
@@ -285,15 +315,15 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
int dvert_tot_from;
int dvert_tot;
int i;
- int totdef_from= BLI_countlist(&ob_from->defbase);
- int totdef= BLI_countlist(&ob->defbase);
+ int defbase_tot_from= BLI_countlist(&ob_from->defbase);
+ int defbase_tot= BLI_countlist(&ob->defbase);
short new_vgroup= FALSE;
- ED_vgroup_give_parray(ob_from->data, &dvert_array_from, &dvert_tot_from);
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ ED_vgroup_give_parray(ob_from->data, &dvert_array_from, &dvert_tot_from, FALSE);
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, FALSE);
if((dvert_array == NULL) && (dvert_array_from != NULL) && ED_vgroup_data_create(ob->data)) {
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, FALSE);
new_vgroup= TRUE;
}
@@ -313,11 +343,11 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
BLI_duplicatelist(&ob->defbase, &ob_from->defbase);
ob->actdef= ob_from->actdef;
- if(totdef_from < totdef) {
+ if(defbase_tot_from < defbase_tot) {
/* correct vgroup indices because the number of vgroups is being reduced. */
- int *remap= MEM_mallocN(sizeof(int) * (totdef + 1), "ED_vgroup_copy_array");
- for(i=0; i<=totdef_from; i++) remap[i]= i;
- for(; i<=totdef; i++) remap[i]= 0; /* can't use these, so disable */
+ int *remap= MEM_mallocN(sizeof(int) * (defbase_tot + 1), __func__);
+ for(i=0; i<=defbase_tot_from; i++) remap[i]= i;
+ for(; i<=defbase_tot; i++) remap[i]= 0; /* can't use these, so disable */
vgroup_remap_update_users(ob, remap);
MEM_freeN(remap);
@@ -342,160 +372,84 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
return 1;
}
-/* for mesh in object mode
- lattice can be in editmode */
-static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
-{
- /* This routine removes the vertex from the deform
- * group with number def_nr.
- *
- * This routine is meant to be fast, so it is the
- * responsibility of the calling routine to:
- * a) test whether ob is non-NULL
- * b) test whether ob is a mesh
- * c) calculate def_nr
- */
-
- MDeformWeight *newdw;
- MDeformVert *dvert= NULL;
- int i, tot;
-
- /* get the deform vertices corresponding to the
- * vertnum
- */
- ED_vgroup_give_array(ob->data, &dvert, &tot);
-
- if(dvert==NULL)
- return;
-
- dvert+= vertnum;
-
- /* for all of the deform weights in the
- * deform vert
- */
- for(i=dvert->totweight - 1 ; i>=0 ; i--){
-
- /* if the def_nr is the same as the one
- * for our weight group then remove it
- * from this deform vert.
- */
- if(dvert->dw[i].def_nr == def_nr) {
- dvert->totweight--;
-
- /* if there are still other deform weights
- * attached to this vert then remove this
- * deform weight, and reshuffle the others
- */
- if(dvert->totweight) {
- newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight),
- "deformWeight");
- if(dvert->dw){
- memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
- memcpy(newdw+i, dvert->dw+i+1,
- sizeof(MDeformWeight)*(dvert->totweight-i));
- MEM_freeN(dvert->dw);
- }
- dvert->dw=newdw;
- }
- /* if there are no other deform weights
- * left then just remove the deform weight
- */
- else {
- MEM_freeN(dvert->dw);
- dvert->dw = NULL;
- break;
- }
- }
- }
-
-}
/* for Mesh in Object mode */
/* allows editmode for Lattice */
-static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode)
+static void ED_vgroup_nr_vert_add(Object *ob,
+ const int def_nr, const int vertnum,
+ const float weight, const int assignmode)
{
/* add the vert to the deform group with the
* specified number
*/
- MDeformVert *dv= NULL;
- MDeformWeight *newdw;
- int i, tot;
+ MDeformVert *dvert= NULL;
+ int tot;
/* get the vert */
- ED_vgroup_give_array(ob->data, &dv, &tot);
+ ED_vgroup_give_array(ob->data, &dvert, &tot);
- if(dv==NULL)
+ if(dvert==NULL)
return;
-
+
/* check that vertnum is valid before trying to get the relevant dvert */
if ((vertnum < 0) || (vertnum >= tot))
return;
- else
- dv += vertnum;
- /* Lets first check to see if this vert is
- * already in the weight group -- if so
- * lets update it
- */
- for(i=0; i<dv->totweight; i++){
-
- /* if this weight cooresponds to the
- * deform group, then add it using
- * the assign mode provided
+
+ if (dvert) {
+ MDeformVert *dv= &dvert[vertnum];
+ MDeformWeight *dw;
+
+ /* Lets first check to see if this vert is
+ * already in the weight group -- if so
+ * lets update it
*/
- if(dv->dw[i].def_nr == def_nr){
-
+
+ dw= defvert_find_index(dv, def_nr);
+
+ if (dw) {
switch(assignmode) {
case WEIGHT_REPLACE:
- dv->dw[i].weight=weight;
+ dw->weight = weight;
break;
case WEIGHT_ADD:
- dv->dw[i].weight+=weight;
- if(dv->dw[i].weight >= 1.0f)
- dv->dw[i].weight = 1.0f;
+ dw->weight += weight;
+ if(dw->weight >= 1.0f)
+ dw->weight = 1.0f;
break;
case WEIGHT_SUBTRACT:
- dv->dw[i].weight-=weight;
+ dw->weight -= weight;
/* if the weight is zero or less then
* remove the vert from the deform group
*/
- if(dv->dw[i].weight <= 0.0f)
- ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
+ if(dw->weight <= 0.0f) {
+ defvert_remove_group(dv, dw);
+ }
break;
}
- return;
}
- }
+ else {
+ /* if the vert wasn't in the deform group then
+ * we must take a different form of action ...
+ */
- /* if the vert wasn't in the deform group then
- * we must take a different form of action ...
- */
+ switch(assignmode) {
+ case WEIGHT_SUBTRACT:
+ /* if we are subtracting then we don't
+ * need to do anything
+ */
+ return;
- switch(assignmode) {
- case WEIGHT_SUBTRACT:
- /* if we are subtracting then we don't
- * need to do anything
- */
- return;
+ case WEIGHT_REPLACE:
+ case WEIGHT_ADD:
+ /* if we are doing an additive assignment, then
+ * we need to create the deform weight
+ */
- case WEIGHT_REPLACE:
- case WEIGHT_ADD:
- /* if we are doing an additive assignment, then
- * we need to create the deform weight
- */
- newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1),
- "deformWeight");
- if(dv->dw){
- memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
- MEM_freeN(dv->dw);
+ /* we checked if the vertex was added before so no need to test again, simply add */
+ defvert_add_index_notest(dv, def_nr, weight);
+ }
}
- dv->dw=newdw;
-
- dv->dw[dv->totweight].weight=weight;
- dv->dw[dv->totweight].def_nr=def_nr;
-
- dv->totweight++;
- break;
}
}
@@ -505,7 +459,7 @@ void ED_vgroup_vert_add(Object *ob, bDeformGroup *dg, int vertnum, float weight,
/* add the vert to the deform group with the
* specified assign mode
*/
- int def_nr;
+ const int def_nr= BLI_findindex(&ob->defbase, dg);
MDeformVert *dv= NULL;
int tot;
@@ -513,7 +467,6 @@ void ED_vgroup_vert_add(Object *ob, bDeformGroup *dg, int vertnum, float weight,
/* get the deform group number, exit if
* it can't be found
*/
- def_nr = defgroup_find_index(ob, dg);
if(def_nr < 0) return;
/* if there's no deform verts then create some,
@@ -532,19 +485,34 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)
/* This routine removes the vertex from the specified
* deform group.
*/
- const int def_nr= defgroup_find_index(ob, dg);
- if(def_nr < 0)
- return;
- ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
+ /* TODO, this is slow in a loop, better pass def_nr directly, but leave for later... - campbell */
+ const int def_nr= BLI_findindex(&ob->defbase, dg);
+
+ if(def_nr != -1) {
+ MDeformVert *dvert= NULL;
+ int tot;
+
+ /* get the deform vertices corresponding to the
+ * vertnum
+ */
+ ED_vgroup_give_array(ob->data, &dvert, &tot);
+
+ if(dvert) {
+ MDeformVert *dv= &dvert[vertnum];
+ MDeformWeight *dw;
+
+ dw= defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ }
+ }
}
-static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
+static float get_vert_def_nr(Object *ob, const int def_nr, const int vertnum)
{
- MDeformVert *dvert= NULL;
+ MDeformVert *dv= NULL;
EditVert *eve;
Mesh *me;
- int i;
/* get the deform vertices corresponding to the vertnum */
if(ob->type==OB_MESH) {
@@ -555,14 +523,13 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
if(!eve) {
return 0.0f;
}
- dvert= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT);
- vertnum= 0;
+ dv= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT);
}
else {
if(vertnum >= me->totvert) {
return 0.0f;
}
- dvert = me->dvert;
+ dv = &me->dvert[vertnum];
}
}
else if(ob->type==OB_LATTICE) {
@@ -572,30 +539,27 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
if(vertnum >= lt->pntsu*lt->pntsv*lt->pntsw) {
return 0.0f;
}
- dvert = lt->dvert;
+ dv = &lt->dvert[vertnum];
}
}
- if(dvert==NULL)
- return -1;
-
- dvert += vertnum;
-
- for(i=dvert->totweight-1 ; i>=0 ; i--)
- if(dvert->dw[i].def_nr == def_nr)
- return dvert->dw[i].weight;
+ if (dv) {
+ MDeformWeight *dw= defvert_find_index(dv, def_nr);
+ if (dw) {
+ return dw->weight;
+ }
+ }
return -1;
}
float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
{
- int def_nr;
-
- if(!ob) return -1;
+ const int def_nr= BLI_findindex(&ob->defbase, dg);
- def_nr = defgroup_find_index(ob, dg);
- if(def_nr < 0) return -1;
+ if(def_nr == -1) {
+ return -1;
+ }
return get_vert_def_nr(ob, def_nr, vertnum);
}
@@ -610,34 +574,56 @@ void ED_vgroup_select_by_name(Object *ob, const char *name)
/* only in editmode */
static void vgroup_select_verts(Object *ob, int select)
{
- EditVert *eve;
- MDeformVert *dvert;
- int i;
+ const int def_nr= ob->actdef-1;
+ MDeformVert *dv;
+
+ if (!BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- for(eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ if (me->edit_mesh) {
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+ EditVert *eve;
- if(dvert && dvert->totweight){
- for(i=0; i<dvert->totweight; i++){
- if(dvert->dw[i].def_nr == (ob->actdef-1)){
- if(!eve->h) {
- if(select) eve->f |= SELECT;
- else eve->f &= ~SELECT;
- }
- break;
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (!eve->h) {
+ dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ if (defvert_find_index(dv, def_nr)) {
+ if (select) eve->f |= SELECT;
+ else eve->f &= ~SELECT;
}
}
}
+ /* this has to be called, because this function operates on vertices only */
+ if(select) EM_select_flush(em); // vertices to edges/faces
+ else EM_deselect_flush(em);
+
+ BKE_mesh_end_editmesh(me, em);
}
- /* this has to be called, because this function operates on vertices only */
- if(select) EM_select_flush(em); // vertices to edges/faces
- else EM_deselect_flush(em);
+ else {
+ if (me->dvert) {
+ MVert *mv;
+ MDeformVert *dv;
+ int i;
+
+ mv = me->mvert;
+ dv = me->dvert;
+
+ for (i=0; i<me->totvert; i++, mv++, dv++) {
+ if (!(mv->flag & ME_HIDE)) {
+ if (defvert_find_index(dv, def_nr)) {
+ if (select) mv->flag |= SELECT;
+ else mv->flag &= ~SELECT;
+ }
+ }
+ }
- BKE_mesh_end_editmesh(me, em);
+ paintvert_flush_flags(ob);
+ }
+ }
}
else if(ob->type == OB_LATTICE) {
Lattice *lt= vgroup_edit_lattice(ob);
@@ -646,17 +632,13 @@ static void vgroup_select_verts(Object *ob, int select)
BPoint *bp;
int a, tot;
- dvert= lt->dvert;
+ dv= lt->dvert;
tot= lt->pntsu*lt->pntsv*lt->pntsw;
- for(a=0, bp= lt->def; a<tot; a++, bp++, dvert++) {
- for(i=0; i<dvert->totweight; i++){
- if(dvert->dw[i].def_nr == (ob->actdef-1)) {
- if(select) bp->f1 |= SELECT;
- else bp->f1 &= ~SELECT;
-
- break;
- }
+ for(a=0, bp= lt->def; a<tot; a++, bp++, dv++) {
+ if (defvert_find_index(dv, def_nr)) {
+ if (select) bp->f1 |= SELECT;
+ else bp->f1 &= ~SELECT;
}
}
}
@@ -667,8 +649,8 @@ static void vgroup_duplicate(Object *ob)
{
bDeformGroup *dg, *cdg;
char name[sizeof(dg->name)];
- MDeformWeight *org, *cpy;
- MDeformVert *dvert, **dvert_array=NULL;
+ MDeformWeight *dw_org, *dw_cpy;
+ MDeformVert **dvert_array=NULL;
int i, idg, icdg, dvert_tot=0;
dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
@@ -692,53 +674,51 @@ static void vgroup_duplicate(Object *ob)
ob->actdef = BLI_countlist(&ob->defbase);
icdg = (ob->actdef-1);
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
-
- if(!dvert_array)
- return;
+ /* TODO, we might want to allow only copy selected verts here? - campbell */
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, FALSE);
- for(i = 0; i < dvert_tot; i++) {
- dvert = dvert_array[i];
- org = defvert_find_index(dvert, idg);
- if(org) {
- float weight = org->weight;
- /* defvert_verify_index re-allocs org so need to store the weight first */
- cpy = defvert_verify_index(dvert, icdg);
- cpy->weight = weight;
+ if (dvert_array) {
+ for(i = 0; i < dvert_tot; i++) {
+ MDeformVert *dv= dvert_array[i];
+ dw_org = defvert_find_index(dv, idg);
+ if(dw_org) {
+ /* defvert_verify_index re-allocs org so need to store the weight first */
+ dw_cpy = defvert_verify_index(dv, icdg);
+ dw_cpy->weight = dw_org->weight;
+ }
}
- }
- MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
static void vgroup_normalize(Object *ob)
{
- bDeformGroup *dg;
MDeformWeight *dw;
- MDeformVert *dvert, **dvert_array=NULL;
- int i, def_nr, dvert_tot=0;
-
+ MDeformVert *dv, **dvert_array=NULL;
+ int i, dvert_tot=0;
+ const int def_nr= ob->actdef-1;
+
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ if (!BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
- if(dg) {
+ if (dvert_array) {
float weight_max = 0.0f;
- def_nr= ob->actdef-1;
-
for(i = 0; i < dvert_tot; i++) {
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- dw = defvert_find_index(dvert, def_nr);
+ dw = defvert_find_index(dv, def_nr);
if(dw) {
weight_max = MAX2(dw->weight, weight_max);
}
@@ -747,12 +727,12 @@ static void vgroup_normalize(Object *ob)
if(weight_max > 0.0f) {
for(i = 0; i < dvert_tot; i++) {
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- dw = defvert_find_index(dvert, def_nr);
+ dw = defvert_find_index(dv, def_nr);
if(dw) {
dw->weight /= weight_max;
@@ -761,9 +741,9 @@ static void vgroup_normalize(Object *ob)
}
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
/* This adds the indices of vertices to a list if they are not already present
@@ -874,47 +854,20 @@ static void getSingleCoordinate(MVert *points, int count, float coord[3])
mul_v3_fl(coord, 1.0f/count);
}
-/* find the closest point on a plane to another point and store it in dst */
-/* coord is a point on the plane */
-/* point is the point that you want the nearest of */
-/* norm is the plane's normal, and d is the last number in the plane equation 0 = ax + by + cz + d */
-static void getNearestPointOnPlane(const float norm[3], const float coord[3], const float point[3], float dst_r[3])
-{
- float temp[3];
- float dotprod;
-
- sub_v3_v3v3(temp, point, coord);
- dotprod= dot_v3v3(temp, norm);
-
- dst_r[0] = point[0] - (norm[0] * dotprod);
- dst_r[1] = point[1] - (norm[1] * dotprod);
- dst_r[2] = point[2] - (norm[2] * dotprod);
-}
-
-/* distance of two vectors a and b of size length */
-static float distance(float* a, float *b, int length)
-{
- int i;
- float sum = 0;
- for(i = 0; i < length; i++) {
- sum += (b[i]-a[i])*(b[i]-a[i]);
- }
- return sqrt(sum);
-}
-
/* given a plane and a start and end position,
compute the amount of vertical distance relative to the plane and store it in dists,
then get the horizontal and vertical change and store them in changes
*/
-static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, float *start, float distToStart,
+static void getVerticalAndHorizontalChange(const float norm[3], float d, const float coord[3],
+ const float start[3], float distToStart,
float *end, float (*changes)[2], float *dists, int index)
{
// A=Q-((Q-P).N)N
// D = (a*x0 + b*y0 +c*z0 +d)
- float projA[3] = {0}, projB[3] = {0};
+ float projA[3], projB[3];
- getNearestPointOnPlane(norm, coord, start, projA);
- getNearestPointOnPlane(norm, coord, end, projB);
+ closest_to_plane_v3(projA, coord, norm, start);
+ closest_to_plane_v3(projB, coord, norm, end);
// (vertical and horizontal refer to the plane's y and xz respectively)
// vertical distance
dists[index] = norm[0]*end[0] + norm[1]*end[1] + norm[2]*end[2] + d;
@@ -922,7 +875,7 @@ static void getVerticalAndHorizontalChange(float *norm, float d, float *coord, f
changes[index][0] = dists[index] - distToStart;
//printf("vc %f %f\n", distance(end, projB, 3)-distance(start, projA, 3), changes[index][0]);
// horizontal change
- changes[index][1] = distance(projA, projB, 3);
+ changes[index][1] = len_v3v3(projA, projB);
}
// I need the derived mesh to be forgotten so the positions are recalculated with weight changes (see dm_deform_recalc)
@@ -964,11 +917,14 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
int totweight = dvert->totweight;
float oldw = 0;
float oldPos[3] = {0};
- float vc, hc, dist = 0.0f /* Not necessary, but quites down gcc warnings! */;
+ float vc, hc, dist = 0.0f;
int i, k;
float (*changes)[2] = MEM_mallocN(sizeof(float *)*totweight*2, "vertHorzChange");
float *dists = MEM_mallocN(sizeof(float)*totweight, "distance");
- int *upDown = MEM_callocN(sizeof(int)*totweight, "upDownTracker");// track if up or down moved it closer for each bone
+
+ /* track if up or down moved it closer for each bone */
+ int *upDown = MEM_callocN(sizeof(int)*totweight, "upDownTracker");
+
int *dwIndices = MEM_callocN(sizeof(int)*totweight, "dwIndexTracker");
float distToStart;
int bestIndex = 0;
@@ -1169,136 +1125,82 @@ static void vgroup_fix(Scene *scene, Object *ob, float distToBe, float strength,
static void vgroup_levels(Object *ob, float offset, float gain)
{
- bDeformGroup *dg;
MDeformWeight *dw;
- MDeformVert *dvert, **dvert_array=NULL;
- int i, def_nr, dvert_tot=0;
-
+ MDeformVert *dv, **dvert_array=NULL;
+ int i, dvert_tot=0;
+ const int def_nr= ob->actdef-1;
+
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
-
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
-
- if(dg) {
- def_nr= ob->actdef-1;
-
+ if (!BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
+
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
+
+ if (dvert_array) {
for(i = 0; i < dvert_tot; i++) {
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- dw = defvert_find_index(dvert, def_nr);
+ dw = defvert_find_index(dv, def_nr);
if(dw) {
dw->weight = gain * (dw->weight + offset);
-
+
CLAMP(dw->weight, 0.0f, 1.0f);
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
/* TODO - select between groups */
static void vgroup_normalize_all(Object *ob, int lock_active)
{
- MDeformWeight *dw, *dw_act;
- MDeformVert *dvert, **dvert_array=NULL;
+ MDeformVert *dv, **dvert_array=NULL;
int i, dvert_tot=0;
- float tot_weight;
+ const int def_nr= ob->actdef-1;
-
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ if (lock_active && !BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
+
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
- if(dvert_array) {
+ if (dvert_array) {
if(lock_active) {
- int def_nr= ob->actdef-1;
for(i = 0; i < dvert_tot; i++) {
- float lock_iweight= 1.0f;
- int j;
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- tot_weight= 0.0f;
- dw_act= NULL;
- dvert = dvert_array[i];
-
- j= dvert->totweight;
- while(j--) {
- dw= dvert->dw + j;
-
- if(dw->def_nr==def_nr) {
- dw_act= dw;
- lock_iweight = (1.0f - dw_act->weight);
- }
- else {
- tot_weight += dw->weight;
- }
- }
-
- if(tot_weight) {
- j= dvert->totweight;
- while(j--) {
- dw= dvert->dw + j;
- if(dw == dw_act) {
- if (dvert->totweight==1) {
- dw_act->weight= 1.0f; /* no other weights, set to 1.0 */
- }
- } else {
- if(dw->weight > 0.0f)
- dw->weight = (dw->weight / tot_weight) * lock_iweight;
- }
-
- /* incase of division errors with very low weights */
- CLAMP(dw->weight, 0.0f, 1.0f);
- }
- }
+ defvert_normalize_lock(dv, def_nr);
}
}
else {
for(i = 0; i < dvert_tot; i++) {
- int j;
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
- continue;
- }
-
- tot_weight= 0.0f;
- dvert = dvert_array[i];
- j= dvert->totweight;
- while(j--) {
- dw= dvert->dw + j;
- tot_weight += dw->weight;
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
+ continue;
}
- if(tot_weight) {
- j= dvert->totweight;
- while(j--) {
- dw= dvert->dw + j;
- dw->weight /= tot_weight;
-
- /* incase of division errors with very low weights */
- CLAMP(dw->weight, 0.0f, 1.0f);
- }
- }
+ defvert_normalize(dv);
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
@@ -1331,68 +1233,64 @@ static void vgroup_lock_all(Object *ob, int action)
}
}
-static void vgroup_invert(Object *ob, int auto_assign, int auto_remove)
+static void vgroup_invert(Object *ob, const short auto_assign, const short auto_remove)
{
- bDeformGroup *dg;
MDeformWeight *dw;
- MDeformVert *dvert, **dvert_array=NULL;
- int i, def_nr, dvert_tot=0;
+ MDeformVert *dv, **dvert_array=NULL;
+ int i, dvert_tot=0;
+ const int def_nr= ob->actdef-1;
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
-
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
-
- if(dg) {
- def_nr= ob->actdef-1;
+ if (!BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
+ if (dvert_array) {
for(i = 0; i < dvert_tot; i++) {
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- if(auto_assign) {
- dw= defvert_verify_index(dvert, def_nr);
- } else {
- dw= defvert_find_index(dvert, def_nr);
+ if (auto_assign) {
+ dw= defvert_verify_index(dv, def_nr);
+ }
+ else {
+ dw= defvert_find_index(dv, def_nr);
}
if(dw) {
- dw->weight = 1.0f-dw->weight;
+ dw->weight = 1.0f - dw->weight;
if(auto_remove && dw->weight <= 0.0f) {
- /* could have a faster function for this */
- ED_vgroup_nr_vert_remove(ob, def_nr, i);
+ defvert_remove_group(dv, dw);
}
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
static void vgroup_blend(Object *ob)
{
- bDeformGroup *dg;
MDeformWeight *dw;
MDeformVert *dvert_array=NULL, *dvert;
- int i, def_nr, dvert_tot=0;
+ int i, dvert_tot=0;
+ const int def_nr= ob->actdef-1;
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)ob->data));
// ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
- if(em==NULL)
+ if (em==NULL)
return;
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
-
- if(dg) {
+ if (BLI_findlink(&ob->defbase, def_nr)) {
int sel1, sel2;
int i1, i2;
@@ -1401,8 +1299,6 @@ static void vgroup_blend(Object *ob)
float *vg_weights;
float *vg_users;
- def_nr= ob->actdef-1;
-
i= 0;
for(eve= em->verts.first; eve; eve= eve->next)
eve->tmp.l= i++;
@@ -1452,6 +1348,9 @@ static void vgroup_blend(Object *ob)
dw= defvert_verify_index(dvert, def_nr);
dw->weight= vg_weights[i] / (float)vg_users[i];
+
+ /* incase of division errors */
+ CLAMP(dw->weight, 0.0f, 1.0f);
}
i++;
@@ -1461,83 +1360,85 @@ static void vgroup_blend(Object *ob)
}
}
-static void vgroup_clean(Object *ob, float eul, int keep_single)
+static void vgroup_clean(Object *ob, const float epsilon, int keep_single)
{
- bDeformGroup *dg;
MDeformWeight *dw;
- MDeformVert *dvert, **dvert_array=NULL;
- int i, def_nr, dvert_tot=0;
+ MDeformVert *dv, **dvert_array=NULL;
+ int i, dvert_tot=0;
+ const int def_nr= ob->actdef-1;
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ if (!BLI_findlink(&ob->defbase, def_nr)) {
+ return;
+ }
- /* only the active group */
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
- if(dg) {
- def_nr= ob->actdef-1;
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
+ if (dvert_array) {
+ /* only the active group */
for(i = 0; i < dvert_tot; i++) {
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- dw= defvert_find_index(dvert, def_nr);
+ dw= defvert_find_index(dv, def_nr);
- if(dw) {
- if(dw->weight <= eul)
- if(keep_single==FALSE || dvert->totweight > 1)
- ED_vgroup_nr_vert_remove(ob, def_nr, i);
+ if (dw) {
+ if (dw->weight <= epsilon) {
+ if(keep_single==FALSE || dv->totweight > 1) {
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ }
+ }
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
-static void vgroup_clean_all(Object *ob, float eul, int keep_single)
+static void vgroup_clean_all(Object *ob, const float epsilon, const int keep_single)
{
-
- MDeformWeight *dw;
- MDeformVert *dvert, **dvert_array=NULL;
+ MDeformVert **dvert_array=NULL;
int i, dvert_tot=0;
Mesh *me = ob->data;
- MVert *mvert = me->mvert;
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+ ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
+
+ if (dvert_array) {
+ MDeformVert *dv;
+ MDeformWeight *dw;
- if(dvert_array) {
for(i = 0; i < dvert_tot; i++) {
int j;
-
- if(use_vert_sel && !(mvert[i].flag & SELECT)) {
+
+ /* incase its not selected */
+ if (!(dv = dvert_array[i])) {
continue;
}
- dvert = dvert_array[i];
- j= dvert->totweight;
+ j= dv->totweight;
while(j--) {
- if(keep_single && dvert->totweight == 1)
+ if(keep_single && dv->totweight == 1)
break;
- dw= dvert->dw + j;
-
- if(dw->weight <= eul)
- ED_vgroup_nr_vert_remove(ob, dw->def_nr, i);
+ dw= dv->dw + j;
+ if(dw->weight <= epsilon) {
+ defvert_remove_group(dv, dw);
+ }
}
}
- }
- if (dvert_array) MEM_freeN(dvert_array);
+ MEM_freeN(dvert_array);
+ }
}
@@ -1607,21 +1508,37 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
sel, sel_mirr, \
flip_map, flip_map_len, \
mirror_weights, flip_vgroups, \
- all_vgroups, act_vgroup \
+ all_vgroups, def_nr \
)
EditVert *eve, *eve_mirr;
MDeformVert *dvert, *dvert_mirr;
short sel, sel_mirr;
int *flip_map, flip_map_len;
- const int act_vgroup= ob->actdef > 0 ? ob->actdef-1 : 0;
+ const int def_nr= ob->actdef-1;
- if(mirror_weights==0 && flip_vgroups==0)
+ if ( (mirror_weights==0 && flip_vgroups==0) ||
+ (BLI_findlink(&ob->defbase, def_nr) == NULL) )
+ {
return;
+ }
+
+ if (flip_vgroups) {
+ flip_map= all_vgroups ?
+ defgroup_flip_map(ob, &flip_map_len, FALSE) :
+ defgroup_flip_map_single(ob, &flip_map_len, FALSE, def_nr);
+
+ BLI_assert(flip_map != NULL);
- flip_map= all_vgroups ?
- defgroup_flip_map(ob, &flip_map_len, FALSE) :
- defgroup_flip_map_single(ob, &flip_map_len, FALSE, act_vgroup);
+ if (flip_map == NULL) {
+ /* something went wrong!, possibly no groups */
+ return;
+ }
+ }
+ else {
+ flip_map= NULL;
+ flip_map_len= 0;
+ }
/* only the active group */
if(ob->type == OB_MESH) {
@@ -1630,8 +1547,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
if (em) {
if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
- MEM_freeN(flip_map);
- return;
+ goto cleanup;
}
EM_cache_x_mirror_vert(ob, em);
@@ -1653,7 +1569,6 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
eve->tmp.v= eve_mirr->tmp.v= NULL;
}
}
-
BKE_mesh_end_editmesh(me, em);
}
else {
@@ -1663,8 +1578,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
if (me->dvert == NULL) {
- MEM_freeN(flip_map);
- return;
+ goto cleanup;
}
if (!use_vert_sel) {
@@ -1702,17 +1616,14 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
}
}
else if (ob->type == OB_LATTICE) {
- Lattice *lt= ob->data;
+ Lattice *lt= vgroup_edit_lattice(ob);
int i1, i2;
int u, v, w;
int pntsu_half;
/* half but found up odd value */
- if(lt->editlatt) lt= lt->editlatt->latt;
-
if(lt->pntsu == 1 || lt->dvert == NULL) {
- MEM_freeN(flip_map);
- return;
+ goto cleanup;
}
/* unlike editmesh we know that by only looping over the first hald of
@@ -1748,9 +1659,11 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
}
}
- MEM_freeN(flip_map);
+cleanup:
+ if (flip_map) MEM_freeN(flip_map);
#undef VGROUP_MIRR_OP
+
}
static void vgroup_remap_update_users(Object *ob, int *map)
@@ -1794,12 +1707,12 @@ static void vgroup_remap_update_users(Object *ob, int *map)
static void vgroup_delete_update_users(Object *ob, int id)
{
- int i, tot= BLI_countlist(&ob->defbase) + 1;
- int *map= MEM_mallocN(sizeof(int) * tot, "vgroup del");
+ int i, defbase_tot= BLI_countlist(&ob->defbase) + 1;
+ int *map= MEM_mallocN(sizeof(int) * defbase_tot, "vgroup del");
map[id]= map[0]= 0;
for(i=1; i<id; i++) map[i]=i;
- for(i=id+1; i<tot; i++) map[i]=i-1;
+ for(i=id+1; i<defbase_tot; i++) map[i]=i-1;
vgroup_remap_update_users(ob, map);
MEM_freeN(map);
@@ -1809,35 +1722,39 @@ static void vgroup_delete_update_users(Object *ob, int id)
static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg)
{
MDeformVert *dvert_array=NULL;
- int i, e, dvert_tot=0;
- const int dg_index= BLI_findindex(&ob->defbase, dg);
+ int dvert_tot=0;
+ const int def_nr= BLI_findindex(&ob->defbase, dg);
+
+ assert(def_nr > -1);
- assert(dg_index > -1);
-
ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
if(dvert_array) {
- MDeformVert *dvert;
- for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
- ED_vgroup_vert_remove(ob, dg, i); /* ok if the dg isnt in this dvert, will continue silently */
- }
-
- for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
- for(e = 0; e < dvert->totweight; e++) {
- if(dvert->dw[e].def_nr > dg_index) {
- dvert->dw[e].def_nr--;
+ int i, j;
+ MDeformVert *dv;
+ for(i= 0, dv= dvert_array; i < dvert_tot; i++, dv++) {
+ MDeformWeight *dw;
+
+ dw= defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+
+ /* inline, make into a function if anything else needs to do this */
+ for(j = 0; j < dv->totweight; j++) {
+ if(dv->dw[j].def_nr > def_nr) {
+ dv->dw[j].def_nr--;
}
}
+ /* done */
}
}
- vgroup_delete_update_users(ob, dg_index + 1);
+ vgroup_delete_update_users(ob, def_nr + 1);
/* Remove the group */
BLI_freelinkN(&ob->defbase, dg);
/* Update the active deform index if necessary */
- if(ob->actdef > dg_index)
+ if(ob->actdef > def_nr)
ob->actdef--;
if(ob->actdef < 1 && ob->defbase.first)
ob->actdef= 1;
@@ -1848,56 +1765,64 @@ static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg)
/* removes from active defgroup, if allverts==0 only selected vertices */
static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGroup *dg)
{
- EditVert *eve;
- MDeformVert *dvert;
- MDeformWeight *newdw;
- bDeformGroup *eg;
- int i;
+ MDeformVert *dv;
+ const int def_nr= BLI_findindex(&ob->defbase, dg);
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- for(eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if(dvert && dvert->dw && ((eve->f & SELECT) || allverts)){
- for(i=0; i<dvert->totweight; i++){
- /* Find group */
- eg = BLI_findlink(&ob->defbase, dvert->dw[i].def_nr);
- if(eg == dg){
- dvert->totweight--;
- if(dvert->totweight){
- newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), "deformWeight");
-
- if(dvert->dw){
- memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
- memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
- MEM_freeN(dvert->dw);
- }
- dvert->dw=newdw;
- }
- else{
- MEM_freeN(dvert->dw);
- dvert->dw=NULL;
- break;
- }
+ if (me->edit_mesh) {
+ EditVert *eve;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if (dv && dv->dw && (allverts || (eve->f & SELECT))) {
+ MDeformWeight *dw = defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ }
+ }
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else {
+ MVert *mv;
+ MDeformVert *dv;
+ int i;
+
+ if (!me->dvert) {
+ ED_vgroup_data_create(&me->id);
+ }
+
+ mv = me->mvert;
+ dv = me->dvert;
+
+ for (i=0; i<me->totvert; i++, mv++, dv++) {
+ if (mv->flag & SELECT) {
+ if (dv->dw && (allverts || (mv->flag & SELECT))) {
+ MDeformWeight *dw = defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
}
}
}
}
- BKE_mesh_end_editmesh(me, em);
}
else if(ob->type == OB_LATTICE) {
Lattice *lt= vgroup_edit_lattice(ob);
if(lt->dvert) {
BPoint *bp;
- int a, tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ int i, tot= lt->pntsu*lt->pntsv*lt->pntsw;
- for(a=0, bp= lt->def; a<tot; a++, bp++) {
- if(allverts || (bp->f1 & SELECT))
- ED_vgroup_vert_remove(ob, dg, a);
+ for(i=0, bp= lt->def; i<tot; i++, bp++) {
+ if(allverts || (bp->f1 & SELECT)) {
+ MDeformWeight *dw;
+
+ dv= &lt->dvert[i];
+
+ dw = defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ }
}
}
}
@@ -1985,6 +1910,18 @@ static int vgroup_object_in_edit_mode(Object *ob)
return 0;
}
+static int vgroup_object_in_wpaint_vert_select(Object *ob)
+{
+ if (ob->type == OB_MESH) {
+ Mesh *me = ob->data;
+ return ( (ob->mode & OB_MODE_WEIGHT_PAINT) &&
+ (me->edit_mesh == NULL) &&
+ (ME_EDIT_PAINT_SEL_MODE(me) == SCE_SELECT_VERTEX) );
+ }
+
+ return 0;
+}
+
static void vgroup_delete(Object *ob)
{
bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef-1);
@@ -2021,73 +1958,79 @@ static void vgroup_delete_all(Object *ob)
}
/* only in editmode */
-static void vgroup_assign_verts(Object *ob, float weight)
+static void vgroup_assign_verts(Object *ob, const float weight)
{
- EditVert *eve;
- bDeformGroup *dg, *eg;
- MDeformWeight *newdw;
- MDeformVert *dvert;
- int i, done;
+ MDeformVert *dv;
+ const int def_nr= ob->actdef-1;
- dg=BLI_findlink(&ob->defbase, ob->actdef-1);
- if(!dg)
+ if(!BLI_findlink(&ob->defbase, def_nr))
return;
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
+ if (me->edit_mesh) {
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+ EditVert *eve;
- if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT))
- EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL);
+ if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT))
+ EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL);
- /* Go through the list of editverts and assign them */
- for(eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if(dvert && (eve->f & SELECT)){
- /* See if this vert already has a reference to this group */
- /* If so: Change its weight */
- done=0;
- for(i=0; i<dvert->totweight; i++){
- eg = BLI_findlink(&ob->defbase, dvert->dw[i].def_nr);
- /* Find the actual group */
- if(eg==dg){
- dvert->dw[i].weight= weight;
- done=1;
- break;
- }
- }
- /* If not: Add the group and set its weight */
- if(!done){
- newdw = MEM_callocN(sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight");
- if(dvert->dw){
- memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*dvert->totweight);
- MEM_freeN(dvert->dw);
+ /* Go through the list of editverts and assign them */
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ MDeformWeight *dw;
+ dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); /* can be NULL */
+ dw= defvert_verify_index(dv, def_nr);
+ if (dw) {
+ dw->weight= weight;
}
- dvert->dw=newdw;
+ }
+ }
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else {
+ MVert *mv;
+ MDeformVert *dv;
+ int i;
- dvert->dw[dvert->totweight].weight= weight;
- dvert->dw[dvert->totweight].def_nr= ob->actdef-1;
+ if (!me->dvert) {
+ ED_vgroup_data_create(&me->id);
+ }
- dvert->totweight++;
+ mv = me->mvert;
+ dv = me->dvert;
+ for (i=0; i<me->totvert; i++, mv++, dv++) {
+ if (mv->flag & SELECT) {
+ MDeformWeight *dw;
+ dw= defvert_verify_index(dv, def_nr);
+ if (dw) {
+ dw->weight= weight;
+ }
}
}
}
- BKE_mesh_end_editmesh(me, em);
}
else if(ob->type == OB_LATTICE) {
Lattice *lt= vgroup_edit_lattice(ob);
BPoint *bp;
int a, tot;
-
+
if(lt->dvert==NULL)
ED_vgroup_data_create(&lt->id);
-
+
+ dv= lt->dvert;
+
tot= lt->pntsu*lt->pntsv*lt->pntsw;
- for(a=0, bp= lt->def; a<tot; a++, bp++) {
- if(bp->f1 & SELECT)
- ED_vgroup_nr_vert_add(ob, ob->actdef-1, a, weight, WEIGHT_REPLACE);
+ for(a=0, bp= lt->def; a<tot; a++, bp++, dv++) {
+ if(bp->f1 & SELECT) {
+ MDeformWeight *dw;
+
+ dw= defvert_verify_index(dv, def_nr);
+ if (dw) {
+ dw->weight= weight;
+ }
+ }
}
}
}
@@ -2110,14 +2053,14 @@ static void vgroup_remove_verts(Object *ob, int allverts)
static int vertex_group_poll(bContext *C)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ID *data= (ob)? ob->data: NULL;
return (ob && !ob->id.lib && OB_TYPE_SUPPORT_VGROUP(ob->type) && data && !data->lib);
}
static int vertex_group_poll_edit(bContext *C)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ID *data= (ob)? ob->data: NULL;
if(!(ob && !ob->id.lib && data && !data->lib))
@@ -2126,9 +2069,22 @@ static int vertex_group_poll_edit(bContext *C)
return vgroup_object_in_edit_mode(ob);
}
+/* editmode _or_ weight paint vertex sel */
+static int vertex_group_poll_edit_or_wpaint_vert_select(bContext *C)
+{
+ Object *ob= ED_object_context(C);
+ ID *data= (ob)? ob->data: NULL;
+
+ if(!(ob && !ob->id.lib && data && !data->lib))
+ return 0;
+
+ return ( vgroup_object_in_edit_mode(ob) ||
+ vgroup_object_in_wpaint_vert_select(ob) );
+}
+
static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ED_vgroup_add(ob);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -2154,7 +2110,7 @@ void OBJECT_OT_vertex_group_add(wmOperatorType *ot)
static int vertex_group_remove_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(RNA_boolean_get(op->ptr, "all"))
vgroup_delete_all(ob);
@@ -2179,7 +2135,10 @@ void OBJECT_OT_vertex_group_remove(wmOperatorType *ot)
ot->exec= vertex_group_remove_exec;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* redo operator will fail in this case because vertex groups aren't stored
+ in local edit mode stack and toggling "all" property will lead to
+ all groups deleted without way to restore them (see [#29527], sergey) */
+ ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups");
@@ -2188,7 +2147,7 @@ void OBJECT_OT_vertex_group_remove(wmOperatorType *ot)
static int vertex_group_assign_exec(bContext *C, wmOperator *op)
{
ToolSettings *ts= CTX_data_tool_settings(C);
- Object *ob= CTX_data_edit_object(C);
+ Object *ob= ED_object_context(C);
if(RNA_boolean_get(op->ptr, "new"))
ED_vgroup_add(ob);
@@ -2207,11 +2166,14 @@ void OBJECT_OT_vertex_group_assign(wmOperatorType *ot)
ot->idname= "OBJECT_OT_vertex_group_assign";
/* api callbacks */
- ot->poll= vertex_group_poll_edit;
+ ot->poll= vertex_group_poll_edit_or_wpaint_vert_select;
ot->exec= vertex_group_assign_exec;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* redo operator will fail in this case because vertex group assignment
+ isn't stored in local edit mode stack and toggling "new" property will
+ lead to creating plenty of new veretx groups (see [#29527], sergey) */
+ ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "new", 0, "New", "Assign vertex to new vertex group");
@@ -2219,7 +2181,7 @@ void OBJECT_OT_vertex_group_assign(wmOperatorType *ot)
static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_edit_object(C);
+ Object *ob= ED_object_context(C);
if(RNA_boolean_get(op->ptr, "all"))
vgroup_remove_verts(ob, 0);
@@ -2246,11 +2208,14 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot)
ot->idname= "OBJECT_OT_vertex_group_remove_from";
/* api callbacks */
- ot->poll= vertex_group_poll_edit;
+ ot->poll= vertex_group_poll_edit_or_wpaint_vert_select;
ot->exec= vertex_group_remove_from_exec;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* redo operator will fail in this case because vertex groups ssignment
+ isn't stored in local edit mode stack and toggling "all" property will lead to
+ removing vertices from all groups (see [#29527], sergey) */
+ ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups");
@@ -2258,7 +2223,7 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot)
static int vertex_group_select_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_edit_object(C);
+ Object *ob= ED_object_context(C);
if(!ob || ob->id.lib)
return OPERATOR_CANCELLED;
@@ -2276,7 +2241,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot)
ot->idname= "OBJECT_OT_vertex_group_select";
/* api callbacks */
- ot->poll= vertex_group_poll_edit;
+ ot->poll= vertex_group_poll_edit_or_wpaint_vert_select;
ot->exec= vertex_group_select_exec;
/* flags */
@@ -2285,7 +2250,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot)
static int vertex_group_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_edit_object(C);
+ Object *ob= ED_object_context(C);
vgroup_select_verts(ob, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
@@ -2300,7 +2265,7 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot)
ot->idname= "OBJECT_OT_vertex_group_deselect";
/* api callbacks */
- ot->poll= vertex_group_poll_edit;
+ ot->poll= vertex_group_poll_edit_or_wpaint_vert_select;
ot->exec= vertex_group_deselect_exec;
/* flags */
@@ -2309,7 +2274,7 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot)
static int vertex_group_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
vgroup_duplicate(ob);
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -2335,7 +2300,7 @@ void OBJECT_OT_vertex_group_copy(wmOperatorType *ot)
static int vertex_group_levels_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
float offset= RNA_float_get(op->ptr,"offset");
float gain= RNA_float_get(op->ptr,"gain");
@@ -2368,7 +2333,7 @@ void OBJECT_OT_vertex_group_levels(wmOperatorType *ot)
static int vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
vgroup_normalize(ob);
@@ -2395,7 +2360,7 @@ void OBJECT_OT_vertex_group_normalize(wmOperatorType *ot)
static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
int lock_active= RNA_boolean_get(op->ptr,"lock_active");
vgroup_normalize_all(ob, lock_active);
@@ -2505,7 +2470,7 @@ void OBJECT_OT_vertex_group_lock(wmOperatorType *ot)
static int vertex_group_invert_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
int auto_assign= RNA_boolean_get(op->ptr,"auto_assign");
int auto_remove= RNA_boolean_get(op->ptr,"auto_remove");
@@ -2539,7 +2504,7 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot)
static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
vgroup_blend(ob);
@@ -2568,7 +2533,7 @@ void OBJECT_OT_vertex_group_blend(wmOperatorType *ot)
static int vertex_group_clean_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
float limit= RNA_float_get(op->ptr,"limit");
int all_groups= RNA_boolean_get(op->ptr,"all_groups");
@@ -2600,13 +2565,14 @@ void OBJECT_OT_vertex_group_clean(wmOperatorType *ot)
RNA_def_float(ot->srna, "limit", 0.01f, 0.0f, 1.0, "Limit", "Remove weights under this limit", 0.001f, 0.99f);
RNA_def_boolean(ot->srna, "all_groups", FALSE, "All Groups", "Clean all vertex groups");
- RNA_def_boolean(ot->srna, "keep_single", FALSE, "Keep Single", "Keep verts assigned to at least one group when cleaning");
+ RNA_def_boolean(ot->srna, "keep_single", FALSE, "Keep Single",
+ "Keep verts assigned to at least one group when cleaning");
}
static int vertex_group_mirror_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
ED_vgroup_mirror(ob,
RNA_boolean_get(op->ptr,"mirror_weights"),
@@ -2645,7 +2611,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Base *base;
int retval= OPERATOR_CANCELLED;
@@ -2685,7 +2651,7 @@ void OBJECT_OT_vertex_group_copy_to_linked(wmOperatorType *ot)
static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op)
{
- Object *obact= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *obact= ED_object_context(C);
int change= 0;
int fail= 0;
@@ -2728,9 +2694,10 @@ static EnumPropertyItem vgroup_items[]= {
static int set_active_group_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
int nr= RNA_enum_get(op->ptr, "group");
+ BLI_assert(nr+1 >= 0);
ob->actdef= nr+1;
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -2741,7 +2708,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op)
static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
EnumPropertyItem tmp = {0, "", 0, "", ""};
EnumPropertyItem *item= NULL;
bDeformGroup *def;
@@ -2792,8 +2759,8 @@ void OBJECT_OT_vertex_group_set_active(wmOperatorType *ot)
static char *vgroup_init_remap(Object *ob)
{
bDeformGroup *def;
- int def_tot = BLI_countlist(&ob->defbase);
- char *name_array= MEM_mallocN(MAX_VGROUP_NAME * sizeof(char) * def_tot, "sort vgroups");
+ int defbase_tot = BLI_countlist(&ob->defbase);
+ char *name_array= MEM_mallocN(MAX_VGROUP_NAME * sizeof(char) * defbase_tot, "sort vgroups");
char *name;
name= name_array;
@@ -2809,9 +2776,12 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
{
MDeformVert *dvert= NULL;
bDeformGroup *def;
- int def_tot = BLI_countlist(&ob->defbase);
- int *sort_map_update= MEM_mallocN(MAX_VGROUP_NAME * sizeof(int) * def_tot + 1, "sort vgroups"); /* needs a dummy index at the start*/
+ int defbase_tot = BLI_countlist(&ob->defbase);
+
+ /* needs a dummy index at the start*/
+ int *sort_map_update= MEM_mallocN(sizeof(int) * (defbase_tot + 1), "sort vgroups");
int *sort_map= sort_map_update + 1;
+
char *name;
int i;
@@ -2819,6 +2789,8 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
for(def= ob->defbase.first, i=0; def; def=def->next, i++){
sort_map[i]= BLI_findstringindex(&ob->defbase, name, offsetof(bDeformGroup, name));
name += MAX_VGROUP_NAME;
+
+ BLI_assert(sort_map[i] != -1);
}
if(ob->mode == OB_MODE_EDIT) {
@@ -2829,7 +2801,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
for(eve=em->verts.first; eve; eve=eve->next){
dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
if(dvert && dvert->totweight){
- defvert_remap(dvert, sort_map);
+ defvert_remap(dvert, sort_map, defbase_tot);
}
}
}
@@ -2847,18 +2819,19 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
/*create as necassary*/
while(dvert && dvert_tot--) {
if(dvert->totweight)
- defvert_remap(dvert, sort_map);
+ defvert_remap(dvert, sort_map, defbase_tot);
dvert++;
}
}
/* update users */
- for(i=0; i<def_tot; i++)
+ for(i=0; i<defbase_tot; i++)
sort_map[i]++;
sort_map_update[0]= 0;
vgroup_remap_update_users(ob, sort_map_update);
+ BLI_assert(sort_map_update[ob->actdef] >= 0);
ob->actdef= sort_map_update[ob->actdef];
MEM_freeN(sort_map_update);
@@ -2876,7 +2849,7 @@ static int vgroup_sort(void *def_a_ptr, void *def_b_ptr)
static int vertex_group_sort_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
char *name_array;
int ret;
@@ -2915,7 +2888,7 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot)
static int vgroup_move_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
bDeformGroup *def;
char *name_array;
int dir= RNA_enum_get(op->ptr, "direction"), ret;
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c
index 6e25307b786..cdcaae91070 100644
--- a/source/blender/editors/physics/dynamicpaint_ops.c
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@ -42,6 +42,7 @@
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -58,7 +59,7 @@
static int surface_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
{
DynamicPaintModifierData *pmd = NULL;
- Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *cObject = ED_object_context(C);
DynamicPaintCanvasSettings *canvas;
DynamicPaintSurface *surface;
@@ -100,7 +101,7 @@ void DPAINT_OT_surface_slot_add(wmOperatorType *ot)
static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
DynamicPaintModifierData *pmd = NULL;
- Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *cObject = ED_object_context(C);
DynamicPaintCanvasSettings *canvas;
DynamicPaintSurface *surface;
int id=0;
@@ -148,7 +149,7 @@ void DPAINT_OT_surface_slot_remove(wmOperatorType *ot)
static int type_toggle_exec(bContext *C, wmOperator *op)
{
- Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *cObject = ED_object_context(C);
Scene *scene = CTX_data_scene(C);
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
int type= RNA_enum_get(op->ptr, "type");
@@ -199,7 +200,7 @@ void DPAINT_OT_type_toggle(wmOperatorType *ot)
static int output_toggle_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob = ED_object_context(C);
Scene *scene = CTX_data_scene(C);
DynamicPaintSurface *surface;
DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
@@ -344,7 +345,7 @@ static int dynamicPaint_initBake(struct bContext *C, struct wmOperator *op)
{
DynamicPaintModifierData *pmd = NULL;
DynamicPaintCanvasSettings *canvas;
- Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob = ED_object_context(C);
int status = 0;
double timer = PIL_check_seconds_timer();
char result_str[80];
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index bbff2239a38..b26661da4a2 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -59,6 +59,7 @@
#include "ED_particle.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "physics_intern.h"
@@ -66,7 +67,7 @@
static int particle_system_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Scene *scene = CTX_data_scene(C);
if(!scene || !ob)
@@ -97,7 +98,7 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot)
static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Scene *scene = CTX_data_scene(C);
int mode_orig = ob->mode;
if(!scene || !ob)
@@ -581,7 +582,7 @@ static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
static int disconnect_hair_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= NULL;
int all = RNA_boolean_get(op->ptr, "all");
@@ -719,7 +720,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
static int connect_hair_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= NULL;
int all = RNA_boolean_get(op->ptr, "all");
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index cc60f4a52fd..5294e29d3d5 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -146,7 +146,8 @@ static int fluid_is_animated_mesh(FluidsimSettings *fss)
#if 0
/* helper function */
-void fluidsimGetGeometryObjFilename(Object *ob, char *dst) { //, char *srcname) {
+void fluidsimGetGeometryObjFilename(Object *ob, char *dst) { //, char *srcname)
+{
//BLI_snprintf(dst,FILE_MAXFILE, "%s_cfgdata_%s.bobj.gz", srcname, ob->id.name);
BLI_snprintf(dst,FILE_MAXFILE, "fluidcfgdata_%s.bobj.gz", ob->id.name);
}
@@ -769,7 +770,8 @@ static void fluidbake_endjob(void *customdata)
}
}
-int runSimulationCallback(void *data, int status, int frame) {
+int runSimulationCallback(void *data, int status, int frame)
+{
FluidBakeJob *fb = (FluidBakeJob *)data;
elbeemSimulationSettings *settings = fb->settings;
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 0cecfa05b49..62e0e5e201d 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -59,7 +59,8 @@
#include "physics_intern.h"
-static int cache_break_test(void *UNUSED(cbd)) {
+static int cache_break_test(void *UNUSED(cbd))
+{
return G.afbreek==1;
}
static int ptcache_bake_all_poll(bContext *C)
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index dbd1e27024e..e4597d6afc3 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -76,10 +76,10 @@
/* called inside thread! */
void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volatile rcti *renrect)
{
- float x1, y1, *rectf= NULL;
+ float *rectf= NULL;
int ymin, ymax, xmin, xmax;
- int rymin, rxmin, do_color_management;
- char *rectc;
+ int rymin, rxmin, predivide, profile_from;
+ unsigned char *rectc;
/* if renrect argument, we only refresh scanlines */
if(renrect) {
@@ -136,50 +136,20 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
imb_addrectImBuf(ibuf);
rectf+= 4*(rr->rectx*ymin + xmin);
- rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin);
+ rectc= (unsigned char*)(ibuf->rect + ibuf->x*rymin + rxmin);
- do_color_management = (scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT));
-
- /* XXX make nice consistent functions for this */
- for(y1= 0; y1<ymax; y1++) {
- float *rf= rectf;
- float srgb[3];
- char *rc= rectc;
- const float dither = ibuf->dither / 255.0f;
-
- /* XXX temp. because crop offset */
- if(rectc >= (char *)(ibuf->rect)) {
- for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- /* color management */
- if(do_color_management) {
- srgb[0]= linearrgb_to_srgb(rf[0]);
- srgb[1]= linearrgb_to_srgb(rf[1]);
- srgb[2]= linearrgb_to_srgb(rf[2]);
- }
- else {
- copy_v3_v3(srgb, rf);
- }
-
- /* dither */
- if(dither != 0.0f) {
- const float d = (BLI_frand()-0.5f)*dither;
-
- srgb[0] += d;
- srgb[1] += d;
- srgb[2] += d;
- }
-
- /* write */
- rc[0]= FTOCHAR(srgb[0]);
- rc[1]= FTOCHAR(srgb[1]);
- rc[2]= FTOCHAR(srgb[2]);
- rc[3]= FTOCHAR(rf[3]);
- }
- }
-
- rectf += 4*rr->rectx;
- rectc += 4*ibuf->x;
+ if(scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)) {
+ profile_from= IB_PROFILE_LINEAR_RGB;
+ predivide= (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);
+ }
+ else {
+ profile_from= IB_PROFILE_SRGB;
+ predivide= 0;
}
+
+ IMB_buffer_byte_from_float(rectc, rectf,
+ 4, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide,
+ xmax, ymax, ibuf->x, rr->rectx);
}
/* ****************************** render invoking ***************** */
@@ -378,8 +348,12 @@ static void render_progress_update(void *rjv, float progress)
{
RenderJob *rj= rjv;
- if(rj->progress)
+ if(rj->progress && *rj->progress != progress) {
*rj->progress = progress;
+
+ /* make jobs timer to send notifier */
+ *(rj->do_update)= 1;
+ }
}
static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect)
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 35b21c626ed..be4d54ae2e8 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -206,14 +206,11 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
* float buffer. */
if(oglrender->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
- float *rctf = rr->rectf;
- int i;
+ int predivide= 0; /* no alpha */
- for (i = oglrender->sizex * oglrender->sizey; i > 0; i--, rctf+=4) {
- rctf[0]= srgb_to_linearrgb(rctf[0]);
- rctf[1]= srgb_to_linearrgb(rctf[1]);
- rctf[2]= srgb_to_linearrgb(rctf[2]);
- }
+ IMB_buffer_float_from_float(rr->rectf, rr->rectf,
+ 4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_SRGB, predivide,
+ oglrender->sizex, oglrender->sizey, oglrender->sizex, oglrender->sizex);
}
RE_ReleaseResult(oglrender->re);
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index feff1e05d60..86328ca2a64 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -460,12 +460,15 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
Render *re;
RenderResult rres;
char name[32];
- int do_gamma_correct=0;
+ int do_gamma_correct=0, do_predivide=0;
int offx=0, newx= rect->xmax-rect->xmin, newy= rect->ymax-rect->ymin;
if (id && GS(id->name) != ID_TE) {
/* exception: don't color manage texture previews - show the raw values */
- if (sce) do_gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ if (sce) {
+ do_gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ do_predivide = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE;
+ }
}
if(!split || first) sprintf(name, "Preview %p", (void *)sa);
@@ -488,10 +491,28 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
if(rres.rectf) {
if(ABS(rres.rectx-newx)<2 && ABS(rres.recty-newy)<2) {
+
newrect->xmax= MAX2(newrect->xmax, rect->xmin + rres.rectx + offx);
newrect->ymax= MAX2(newrect->ymax, rect->ymin + rres.recty);
- glaDrawPixelsSafe_to32(rect->xmin+offx, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, do_gamma_correct);
+ if(rres.rectx && rres.recty) {
+ /* temporary conversion to byte for drawing */
+ float fx= rect->xmin + offx;
+ float fy= rect->ymin;
+ int profile_from= (do_gamma_correct)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB;
+ int dither= 0;
+ unsigned char *rect_byte;
+
+ rect_byte= MEM_mallocN(rres.rectx*rres.recty*sizeof(int), "ed_preview_draw_rect");
+
+ IMB_buffer_byte_from_float(rect_byte, rres.rectf,
+ 4, dither, IB_PROFILE_SRGB, profile_from, do_predivide,
+ rres.rectx, rres.recty, rres.rectx, rres.rectx);
+
+ glaDrawPixelsSafe(fx, fy, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect_byte);
+
+ MEM_freeN(rect_byte);
+ }
RE_ReleaseResultImage(re);
return 1;
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index f4731eda5bb..ea3c538d908 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -73,6 +73,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_curve.h"
#include "ED_mesh.h"
#include "ED_node.h"
@@ -91,7 +92,7 @@
static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!ob)
return OPERATOR_CANCELLED;
@@ -120,7 +121,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
static int material_slot_remove_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!ob)
return OPERATOR_CANCELLED;
@@ -156,7 +157,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!ob)
return OPERATOR_CANCELLED;
@@ -216,7 +217,7 @@ void OBJECT_OT_material_slot_assign(wmOperatorType *ot)
static int material_slot_de_select(bContext *C, int select)
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
if(!ob)
return OPERATOR_CANCELLED;
@@ -322,7 +323,7 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot)
static int material_slot_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Object *ob= ED_object_context(C);
Material ***matar;
if(!ob || !(matar= give_matarar(ob)))
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 0bba9838005..0b231ee7b96 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -559,27 +559,6 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
glaDrawPixelsTexScaled(x, y, img_w, img_h, format, rect, 1.0f, 1.0f);
}
-/* row_w is unused but kept for completeness */
-void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int UNUSED(row_w), float *rectf, int do_gamma_correct)
-{
- unsigned char *rect32;
-
- /* copy imgw-imgh to a temporal 32 bits rect */
- if(img_w<1 || img_h<1) return;
-
- rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits");
-
- if (do_gamma_correct) {
- floatbuf_to_srgb_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
- } else {
- floatbuf_to_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
- }
-
- glaDrawPixelsSafe(fx, fy, img_w, img_h, img_w, GL_RGBA, GL_UNSIGNED_BYTE, rect32);
-
- MEM_freeN(rect32);
-}
-
void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, int row_w, int format, int type, void *rect)
{
float xzoom= glaGetOneFloat(GL_ZOOM_X);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 007a8f7e4d7..ffdfea7fde5 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1293,6 +1293,7 @@ static void area_split_exit(bContext *C, wmOperator *op)
op->customdata = NULL;
}
+ WM_cursor_restore(CTX_wm_window(C));
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
/* this makes sure aligned edges will result in aligned grabbing */
@@ -1491,6 +1492,37 @@ static int area_split_modal(bContext *C, wmOperator *op, wmEvent *event)
}
}
break;
+
+ case MIDDLEMOUSE:
+ case TABKEY:
+ if (sd->previewmode==0){
+ }
+ else{
+ dir = RNA_enum_get(op->ptr, "direction");
+
+ if(event->val==KM_PRESS){
+ if (sd->sarea){
+ sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V);
+ ED_area_tag_redraw(sd->sarea);
+
+ if (dir=='v'){
+ RNA_enum_set(op->ptr, "direction", 'h');
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_H;
+
+ WM_cursor_set(CTX_wm_window(C),CURSOR_X_MOVE);
+ }
+ else{
+ RNA_enum_set(op->ptr, "direction", 'v');
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_V;
+
+ WM_cursor_set(CTX_wm_window(C),CURSOR_Y_MOVE);
+ }
+ }
+ }
+ }
+
+ break;
+
case RIGHTMOUSE: /* cancel operation */
case ESCKEY:
return area_split_cancel(C, op);
@@ -1634,6 +1666,47 @@ static int region_scale_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
+static int region_scale_get_maxsize(RegionMoveData *rmd)
+{
+ int maxsize= 0;
+
+ if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT) {
+ return rmd->sa->winx - UI_UNIT_X;
+ }
+
+ if(rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS) {
+ /* this calculation seems overly verbose
+ * can someone explain why this method is necessary? - campbell */
+ maxsize = rmd->maxsize - ((rmd->sa->headertype==HEADERTOP)?UI_UNIT_Y*2:UI_UNIT_Y) - (UI_UNIT_Y/4);
+ }
+
+ return maxsize;
+}
+
+static void region_scale_validate_size(RegionMoveData *rmd)
+{
+ if((rmd->ar->flag & RGN_FLAG_HIDDEN)==0) {
+ short *size, maxsize= -1;
+
+
+ if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT)
+ size= &rmd->ar->sizex;
+ else
+ size= &rmd->ar->sizey;
+
+ maxsize= region_scale_get_maxsize(rmd);
+
+ if(*size > maxsize && maxsize > 0)
+ *size= maxsize;
+ }
+}
+
+static void region_scale_toggle_hidden(bContext *C, RegionMoveData *rmd)
+{
+ ED_region_toggle_hidden(C, rmd->ar);
+ region_scale_validate_size(rmd);
+}
+
static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
{
RegionMoveData *rmd= op->customdata;
@@ -1653,35 +1726,31 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
if(rmd->ar->sizex < UI_UNIT_X) {
rmd->ar->sizex= rmd->origval;
if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
- ED_region_toggle_hidden(C, rmd->ar);
+ region_scale_toggle_hidden(C, rmd);
}
else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
- ED_region_toggle_hidden(C, rmd->ar);
+ region_scale_toggle_hidden(C, rmd);
}
else {
- int maxsize=0;
+ int maxsize= region_scale_get_maxsize(rmd);
delta= event->y - rmd->origy;
if(rmd->edge==AE_BOTTOM_TO_TOPLEFT) delta= -delta;
rmd->ar->sizey= rmd->origval + delta;
CLAMP(rmd->ar->sizey, 0, rmd->maxsize);
- if(rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS) {
- /* this calculation seems overly verbose
- * can someone explain why this method is necessary? - campbell */
- maxsize = rmd->maxsize - ((rmd->sa->headertype==HEADERTOP)?UI_UNIT_Y*2:UI_UNIT_Y) - (UI_UNIT_Y/4);
- }
-
/* note, 'UI_UNIT_Y/4' means you need to drag the header almost
* all the way down for it to become hidden, this is done
* otherwise its too easy to do this by accident */
- if(rmd->ar->sizey < UI_UNIT_Y/4 || (maxsize > 0 && (rmd->ar->sizey > maxsize)) ) {
+ if(rmd->ar->sizey < UI_UNIT_Y/4) {
rmd->ar->sizey= rmd->origval;
if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
- ED_region_toggle_hidden(C, rmd->ar);
+ region_scale_toggle_hidden(C, rmd);
}
+ else if(maxsize > 0 && (rmd->ar->sizey > maxsize))
+ rmd->ar->sizey= maxsize;
else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
- ED_region_toggle_hidden(C, rmd->ar);
+ region_scale_toggle_hidden(C, rmd);
}
ED_area_tag_redraw(rmd->sa);
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -1693,10 +1762,14 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
if(ABS(event->x - rmd->origx) < 2 && ABS(event->y - rmd->origy) < 2) {
if(rmd->ar->flag & RGN_FLAG_HIDDEN) {
- ED_region_toggle_hidden(C, rmd->ar);
- ED_area_tag_redraw(rmd->sa);
- WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+ region_scale_toggle_hidden(C, rmd);
}
+ else if(rmd->ar->flag & RGN_FLAG_TOO_SMALL) {
+ region_scale_validate_size(rmd);
+ }
+
+ ED_area_tag_redraw(rmd->sa);
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
MEM_freeN(op->customdata);
op->customdata = NULL;
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 7d0ec866456..31aab956754 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -68,28 +68,20 @@
typedef struct ScreenshotData {
unsigned int *dumprect;
int dumpsx, dumpsy;
+ rcti crop;
} ScreenshotData;
/* get shot from frontbuffer */
-static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int fscreen)
+static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy)
{
wmWindow *win= CTX_wm_window(C);
- ScrArea *curarea= CTX_wm_area(C);
int x=0, y=0;
unsigned int *dumprect= NULL;
- if(fscreen) { /* full screen */
- x= 0;
- y= 0;
- *dumpsx= win->sizex;
- *dumpsy= win->sizey;
- }
- else {
- x= curarea->totrct.xmin;
- y= curarea->totrct.ymin;
- *dumpsx= curarea->totrct.xmax-x;
- *dumpsy= curarea->totrct.ymax-y;
- }
+ x= 0;
+ y= 0;
+ *dumpsx= win->sizex;
+ *dumpsy= win->sizey;
if (*dumpsx && *dumpsy) {
@@ -108,15 +100,23 @@ static int screenshot_data_create(bContext *C, wmOperator *op)
{
unsigned int *dumprect;
int dumpsx, dumpsy;
+
+ /* do redraw so we don't show popups/menus */
+ WM_redraw_windows(C);
- dumprect= screenshot(C, &dumpsx, &dumpsy, RNA_boolean_get(op->ptr, "full"));
+ dumprect= screenshot(C, &dumpsx, &dumpsy);
+
if(dumprect) {
ScreenshotData *scd= MEM_callocN(sizeof(ScreenshotData), "screenshot");
+ ScrArea *sa= CTX_wm_area(C);
scd->dumpsx= dumpsx;
scd->dumpsy= dumpsy;
scd->dumprect= dumprect;
+ if(sa)
+ scd->crop= sa->totrct;
op->customdata= scd;
+
return TRUE;
}
else {
@@ -137,6 +137,21 @@ static void screenshot_data_free(wmOperator *op)
}
}
+static void screenshot_crop(ImBuf *ibuf, rcti crop)
+{
+ unsigned int *to= ibuf->rect;
+ unsigned int *from= ibuf->rect + crop.ymin*ibuf->x + crop.xmin;
+ int y, cropw= crop.xmax - crop.xmin, croph = crop.ymax - crop.ymin;
+
+ if(cropw > 0 && croph > 0) {
+ for(y=0; y<croph; y++, to+=cropw, from+=ibuf->x)
+ memmove(to, from, sizeof(unsigned int)*cropw);
+
+ ibuf->x= cropw;
+ ibuf->y= croph;
+ }
+}
+
static int screenshot_exec(bContext *C, wmOperator *op)
{
ScreenshotData *scd= op->customdata;
@@ -166,6 +181,10 @@ static int screenshot_exec(bContext *C, wmOperator *op)
ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0);
ibuf->rect= scd->dumprect;
+ /* crop to show only single editor */
+ if(!RNA_boolean_get(op->ptr, "full"))
+ screenshot_crop(ibuf, scd->crop);
+
BKE_write_ibuf(ibuf, path, &scene->r.im_format);
IMB_freeImBuf(ibuf);
@@ -199,8 +218,6 @@ static int screenshot_cancel(bContext *UNUSED(C), wmOperator *op)
void SCREEN_OT_screenshot(wmOperatorType *ot)
{
- PropertyRNA *prop;
-
ot->name= "Save Screenshot"; /* weak: opname starting with 'save' makes filewindow give save-over */
ot->idname= "SCREEN_OT_screenshot";
@@ -212,8 +229,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
ot->flag= 0;
WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH);
- prop= RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
- RNA_def_property_flag(prop, PROP_HIDDEN); /* hide because once the file sel is displayed, the option no longer does anything */
+ RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
}
/* *************** screenshot movie job ************************* */
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index d557a3bd144..8a4cb8aa78b 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -383,7 +383,7 @@ typedef struct UndoImageTile {
void *rect;
int x, y;
- short source;
+ short source, use_float;
char gen_type;
} UndoImageTile;
@@ -413,11 +413,13 @@ static void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int
ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_IMAGE);
UndoImageTile *tile;
int allocsize;
+ short use_float = ibuf->rect_float ? 1 : 0;
for(tile=lb->first; tile; tile=tile->next)
if(tile->x == x_tile && tile->y == y_tile && ima->gen_type == tile->gen_type && ima->source == tile->source)
- if(strcmp(tile->idname, ima->id.name)==0 && strcmp(tile->ibufname, ibuf->name)==0)
- return tile->rect;
+ if(tile->use_float == use_float)
+ if(strcmp(tile->idname, ima->id.name)==0 && strcmp(tile->ibufname, ibuf->name)==0)
+ return tile->rect;
if (*tmpibuf==NULL)
*tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect);
@@ -435,6 +437,7 @@ static void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int
tile->gen_type= ima->gen_type;
tile->source= ima->source;
+ tile->use_float= use_float;
undo_copy_tile(tile, *tmpibuf, ibuf, 0);
undo_paint_push_count_alloc(UNDO_PAINT_IMAGE, allocsize);
@@ -455,6 +458,8 @@ static void image_undo_restore(bContext *C, ListBase *lb)
IB_rectfloat|IB_rect);
for(tile=lb->first; tile; tile=tile->next) {
+ short use_float;
+
/* find image based on name, pointer becomes invalid with global undo */
if(ima && strcmp(tile->idname, ima->id.name)==0) {
/* ima is valid */
@@ -464,6 +469,7 @@ static void image_undo_restore(bContext *C, ListBase *lb)
}
ibuf= BKE_image_get_ibuf(ima, NULL);
+ use_float = ibuf->rect_float ? 1 : 0;
if(ima && ibuf && strcmp(tile->ibufname, ibuf->name)!=0) {
/* current ImBuf filename was changed, probably current frame
@@ -480,6 +486,9 @@ static void image_undo_restore(bContext *C, ListBase *lb)
if (ima->gen_type != tile->gen_type || ima->source != tile->source)
continue;
+ if (use_float != tile->use_float)
+ continue;
+
undo_copy_tile(tile, tmpibuf, ibuf, 1);
GPU_free_image(ima); /* force OpenGL reload */
@@ -1807,7 +1816,9 @@ static int project_bucket_isect_circle(const float cent[2], const float radius_s
return 1;
*/
- if((bucket_bounds->xmin <= cent[0] && bucket_bounds->xmax >= cent[0]) || (bucket_bounds->ymin <= cent[1] && bucket_bounds->ymax >= cent[1]) ) {
+ if ( (bucket_bounds->xmin <= cent[0] && bucket_bounds->xmax >= cent[0]) ||
+ (bucket_bounds->ymin <= cent[1] && bucket_bounds->ymax >= cent[1]) )
+ {
return 1;
}
@@ -2807,7 +2818,11 @@ static int project_bucket_face_isect(ProjPaintState *ps, int bucket_x, int bucke
p4[0] = bucket_bounds.xmax; p4[1] = bucket_bounds.ymin;
if (mf->v4) {
- if( isect_point_quad_v2(p1, v1, v2, v3, v4) || isect_point_quad_v2(p2, v1, v2, v3, v4) || isect_point_quad_v2(p3, v1, v2, v3, v4) || isect_point_quad_v2(p4, v1, v2, v3, v4) ||
+ if ( isect_point_quad_v2(p1, v1, v2, v3, v4) ||
+ isect_point_quad_v2(p2, v1, v2, v3, v4) ||
+ isect_point_quad_v2(p3, v1, v2, v3, v4) ||
+ isect_point_quad_v2(p4, v1, v2, v3, v4) ||
+
/* we can avoid testing v3,v1 because another intersection MUST exist if this intersects */
(isect_line_line_v2(p1, p2, v1, v2) || isect_line_line_v2(p1, p2, v2, v3) || isect_line_line_v2(p1, p2, v3, v4)) ||
(isect_line_line_v2(p2, p3, v1, v2) || isect_line_line_v2(p2, p3, v2, v3) || isect_line_line_v2(p2, p3, v3, v4)) ||
@@ -2818,7 +2833,10 @@ static int project_bucket_face_isect(ProjPaintState *ps, int bucket_x, int bucke
}
}
else {
- if( isect_point_tri_v2(p1, v1, v2, v3) || isect_point_tri_v2(p2, v1, v2, v3) || isect_point_tri_v2(p3, v1, v2, v3) || isect_point_tri_v2(p4, v1, v2, v3) ||
+ if ( isect_point_tri_v2(p1, v1, v2, v3) ||
+ isect_point_tri_v2(p2, v1, v2, v3) ||
+ isect_point_tri_v2(p3, v1, v2, v3) ||
+ isect_point_tri_v2(p4, v1, v2, v3) ||
/* we can avoid testing v3,v1 because another intersection MUST exist if this intersects */
(isect_line_line_v2(p1, p2, v1, v2) || isect_line_line_v2(p1, p2, v2, v3)) ||
(isect_line_line_v2(p2, p3, v1, v2) || isect_line_line_v2(p2, p3, v2, v3)) ||
@@ -3078,8 +3096,8 @@ static void project_paint_begin(ProjPaintState *ps)
}
/* same as view3d_get_object_project_mat */
- mul_m4_m4m4(vmat, ps->ob->obmat, viewmat);
- mul_m4_m4m4(ps->projectMat, vmat, winmat);
+ mult_m4_m4m4(vmat, viewmat, ps->ob->obmat);
+ mult_m4_m4m4(ps->projectMat, winmat, vmat);
}
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index 3b001a8fcdc..a5e68f9a244 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -41,6 +41,7 @@ struct Mesh;
struct Object;
struct PaintStroke;
struct PointerRNA;
+struct rcti;
struct Scene;
struct VPaint;
struct ViewContext;
@@ -104,6 +105,26 @@ void PAINT_OT_image_from_view(struct wmOperatorType *ot);
/* paint_utils.c */
+
+/* Convert the object-space axis-aligned bounding box (expressed as
+ its minimum and maximum corners) into a screen-space rectangle,
+ returns zero if the result is empty */
+int paint_convert_bb_to_rect(struct rcti *rect,
+ const float bb_min[3],
+ const float bb_max[3],
+ const struct ARegion *ar,
+ struct RegionView3D *rv3d,
+ struct Object *ob);
+
+/* Get four planes in object-space that describe the projection of
+ screen_rect from screen into object-space (essentially converting a
+ 2D screens-space bounding box into four 3D planes) */
+void paint_calc_redraw_planes(float planes[4][4],
+ const struct ARegion *ar,
+ struct RegionView3D *rv3d,
+ struct Object *ob,
+ const struct rcti *screen_rect);
+
void projectf(struct bglMats *mats, const float v[3], float p[2]);
float paint_calc_object_space_radius(struct ViewContext *vc, float center[3], float pixel_radius);
float paint_get_tex_pixel(struct Brush* br, float u, float v);
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 2d0ad349be8..eb20465a2ab 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -605,9 +605,13 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
ed_keymap_paint_brush_size(keymap, "tool_settings.weight_paint.brush.size");
ed_keymap_paint_brush_radial_control(keymap, "weight_paint", 0);
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* face mask toggle */
RNA_string_set(kmi->ptr, "data_path", "weight_paint_object.data.use_paint_mask");
+ /* note, conflicts with vertex paint, but this is more useful */
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", VKEY, KM_PRESS, 0, 0); /* vert mask toggle */
+ RNA_string_set(kmi->ptr, "data_path", "weight_paint_object.data.use_paint_mask_vertex");
+
WM_keymap_verify_item(keymap, "PAINT_OT_weight_from_bones", WKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 0e65383861b..7cff37e8814 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -123,19 +123,19 @@ static int same_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
{
MTex* mtex = &brush->mtex;
- return
- (mtex->tex &&
- mtex->ofs[0] == snap->ofs[0] &&
- mtex->ofs[1] == snap->ofs[1] &&
- mtex->ofs[2] == snap->ofs[2] &&
- mtex->size[0] == snap->size[0] &&
- mtex->size[1] == snap->size[1] &&
- mtex->size[2] == snap->size[2] &&
- mtex->rot == snap->rot) &&
- ((mtex->brush_map_mode == MTEX_MAP_MODE_FIXED && brush_size(brush) <= snap->brush_size) || (brush_size(brush) == snap->brush_size)) && // make brush smaller shouldn't cause a resample
- mtex->brush_map_mode == snap->brush_map_mode &&
- vc->ar->winx == snap->winx &&
- vc->ar->winy == snap->winy;
+ return ( (mtex->tex) &&
+ equals_v3v3(mtex->ofs, snap->ofs) &&
+ equals_v3v3(mtex->size, snap->size) &&
+ mtex->rot == snap->rot
+ ) &&
+
+ /* make brush smaller shouldn't cause a resample */
+ ( (mtex->brush_map_mode == MTEX_MAP_MODE_FIXED && (brush_size(brush) <= snap->brush_size)) ||
+ (brush_size(brush) == snap->brush_size)) &&
+
+ (mtex->brush_map_mode == snap->brush_map_mode) &&
+ (vc->ar->winx == snap->winx) &&
+ (vc->ar->winy == snap->winy);
}
static void make_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
@@ -869,7 +869,10 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(stroke);
return OPERATOR_FINISHED;
}
- else if(first || ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (event->type == TIMER && (event->customdata == stroke->timer))) {
+ else if( (first) ||
+ (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) ||
+ (event->type == TIMER && (event->customdata == stroke->timer)) )
+ {
if(stroke->stroke_started) {
if(paint_smooth_stroke(stroke, mouse, event)) {
if(paint_space_stroke_enabled(stroke->brush)) {
@@ -887,7 +890,8 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
}
}
- /* we want the stroke to have the first daub at the start location instead of waiting till we have moved the space distance */
+ /* we want the stroke to have the first daub at the start location
+ * instead of waiting till we have moved the space distance */
if(first &&
stroke->stroke_started &&
paint_space_stroke_enabled(stroke->brush) &&
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index ed2956ff054..fdacc2d15f5 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -67,6 +67,78 @@
#include "paint_intern.h"
+/* Convert the object-space axis-aligned bounding box (expressed as
+ its minimum and maximum corners) into a screen-space rectangle,
+ returns zero if the result is empty */
+int paint_convert_bb_to_rect(rcti *rect,
+ const float bb_min[3],
+ const float bb_max[3],
+ const ARegion *ar,
+ RegionView3D *rv3d,
+ Object *ob)
+{
+ float projection_mat[4][4];
+ int i, j, k;
+
+ rect->xmin = rect->ymin = INT_MAX;
+ rect->xmax = rect->ymax = INT_MIN;
+
+ /* return zero if the bounding box has non-positive volume */
+ if(bb_min[0] > bb_max[0] || bb_min[1] > bb_max[1] || bb_min[2] > bb_max[2])
+ return 0;
+
+ ED_view3d_ob_project_mat_get(rv3d, ob, projection_mat);
+
+ for(i = 0; i < 2; ++i) {
+ for(j = 0; j < 2; ++j) {
+ for(k = 0; k < 2; ++k) {
+ float vec[3], proj[2];
+ vec[0] = i ? bb_min[0] : bb_max[0];
+ vec[1] = j ? bb_min[1] : bb_max[1];
+ vec[2] = k ? bb_min[2] : bb_max[2];
+ /* convert corner to screen space */
+ ED_view3d_project_float(ar, vec, proj,
+ projection_mat);
+ /* expand 2D rectangle */
+ rect->xmin = MIN2(rect->xmin, proj[0]);
+ rect->xmax = MAX2(rect->xmax, proj[0]);
+ rect->ymin = MIN2(rect->ymin, proj[1]);
+ rect->ymax = MAX2(rect->ymax, proj[1]);
+ }
+ }
+ }
+
+ /* return false if the rectangle has non-positive area */
+ return rect->xmin < rect->xmax && rect->ymin < rect->ymax;
+}
+
+/* Get four planes in object-space that describe the projection of
+ screen_rect from screen into object-space (essentially converting a
+ 2D screens-space bounding box into four 3D planes) */
+void paint_calc_redraw_planes(float planes[4][4],
+ const ARegion *ar,
+ RegionView3D *rv3d,
+ Object *ob,
+ const rcti *screen_rect)
+{
+ BoundBox bb;
+ bglMats mats;
+ rcti rect;
+
+ memset(&bb, 0, sizeof(BoundBox));
+ view3d_get_transformation(ar, rv3d, ob, &mats);
+
+ /* use some extra space just in case */
+ rect = *screen_rect;
+ rect.xmin -= 2;
+ rect.xmax += 2;
+ rect.ymin -= 2;
+ rect.ymax += 2;
+
+ ED_view3d_calc_clipping(&bb, planes, &mats, &rect);
+ mul_m4_fl(planes, -1.0f);
+}
+
/* convert a point in model coordinates to 2D screen coordinates */
/* TODO: can be deleted once all calls are replaced with
view3d_project_float() */
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index a5bd38d6696..76185d7c5cf 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -288,9 +288,9 @@ static void make_vertexcol(Object *ob) /* single ob */
}
/* mirror_vgroup is set to -1 when invalid */
-static int wpaint_mirror_vgroup_ensure(Object *ob)
+static int wpaint_mirror_vgroup_ensure(Object *ob, const int vgroup_active)
{
- bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef - 1);
+ bDeformGroup *defgroup= BLI_findlink(&ob->defbase, vgroup_active);
if(defgroup) {
bDeformGroup *curdef;
@@ -391,7 +391,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
Mesh *me= ob->data;
MFace *mf;
MDeformWeight *dw, *uw;
- int vgroup, vgroup_mirror= -1;
+ int vgroup_active, vgroup_mirror= -1;
unsigned int index;
/* mutually exclusive, could be made into a */
@@ -399,11 +399,11 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
if(me->totface==0 || me->dvert==NULL || !me->mface) return;
- vgroup= ob->actdef-1;
+ vgroup_active = ob->actdef - 1;
/* if mirror painting, find the other group */
if(me->editflag & ME_EDIT_MIRROR_X) {
- vgroup_mirror= wpaint_mirror_vgroup_ensure(ob);
+ vgroup_mirror= wpaint_mirror_vgroup_ensure(ob, vgroup_active);
}
copy_wpaint_prev(wp, me->dvert, me->totvert);
@@ -423,9 +423,9 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
continue;
}
- dw= defvert_verify_index(&me->dvert[vidx], vgroup);
+ dw= defvert_verify_index(&me->dvert[vidx], vgroup_active);
if(dw) {
- uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup);
+ uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup_active);
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
@@ -437,8 +437,8 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
} else {
- dw= defvert_verify_index(me->dvert+j, vgroup);
- uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
+ dw= defvert_verify_index(me->dvert+j, vgroup_active);
+ uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_active);
}
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
@@ -734,56 +734,64 @@ static int sample_backbuf_area(ViewContext *vc, int *indexar, int totface, int x
return tot;
}
-static float calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], float *vert_nor, const float mval[2], float pressure)
+/* whats _dl mean? */
+static float calc_vp_strength_dl(VPaint *vp, ViewContext *vc, const float *vert_nor,
+ const float mval[2], const float brush_size_final)
{
Brush *brush = paint_brush(&vp->paint);
- float fac, fac_2, size, dx, dy;
- float alpha;
- int vertco[2];
- const int radius= brush_size(brush);
+ float dist_squared;
+ float vertco[2], delta[2];
- project_int_noclip(vc->ar, vert_nor, vertco);
- dx= mval[0]-vertco[0];
- dy= mval[1]-vertco[1];
-
- if (brush_use_size_pressure(brush))
- size = pressure * radius;
- else
- size = radius;
-
- fac_2= dx*dx + dy*dy;
- if(fac_2 > size*size) return 0.f;
- fac = sqrtf(fac_2);
-
- alpha= brush_alpha(brush) * brush_curve_strength_clamp(brush, fac, size);
-
- if (brush_use_alpha_pressure(brush))
- alpha *= pressure;
-
- if(vp->flag & VP_NORMALS) {
- float *no= vert_nor+3;
-
- /* transpose ! */
- fac= vpimat[2][0]*no[0]+vpimat[2][1]*no[1]+vpimat[2][2]*no[2];
- if(fac > 0.0f) {
- dx= vpimat[0][0]*no[0]+vpimat[0][1]*no[1]+vpimat[0][2]*no[2];
- dy= vpimat[1][0]*no[0]+vpimat[1][1]*no[1]+vpimat[1][2]*no[2];
-
- alpha*= fac/sqrtf(dx*dx + dy*dy + fac*fac);
+ project_float_noclip(vc->ar, vert_nor, vertco);
+ sub_v2_v2v2(delta, mval, vertco);
+ dist_squared= dot_v2v2(delta, delta); /* len squared */
+ if (dist_squared > brush_size_final * brush_size_final) {
+ return 0.0f;
+ }
+ else {
+ const float dist = sqrtf(dist_squared);
+ return brush_curve_strength_clamp(brush, dist, brush_size_final);
+ }
+}
+
+static float calc_vp_alpha_dl(VPaint *vp, ViewContext *vc,
+ float vpimat[][3], const float *vert_nor,
+ const float mval[2],
+ const float brush_size_final, const float brush_alpha_final)
+{
+ float strength = calc_vp_strength_dl(vp, vc, vert_nor, mval, brush_size_final);
+
+ if (strength > 0.0f) {
+ float alpha= brush_alpha_final * strength;
+
+ if(vp->flag & VP_NORMALS) {
+ float dvec[3];
+ const float *no= vert_nor + 3;
+
+ /* transpose ! */
+ dvec[2] = dot_v3v3(vpimat[2], no);
+ if (dvec[2] > 0.0f) {
+ dvec[0] = dot_v3v3(vpimat[0], no);
+ dvec[1] = dot_v3v3(vpimat[1], no);
+
+ alpha *= dvec[2] / len_v3(dvec);
+ }
+ else {
+ return 0.0f;
+ }
}
- else return 0.f;
+
+ return alpha;
}
-
- return alpha;
+
+ return 0.0f;
}
static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float alpha, float paintval, int flip, int multipaint)
{
Brush *brush = paint_brush(&wp->paint);
int tool = brush->vertexpaint_tool;
-
- if(dw==NULL || uw==NULL) return;
-
+
if (flip) {
switch(tool) {
case VP_MIX:
@@ -890,7 +898,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
else {
MFace *mf= ((MFace *)me->mface) + index-1;
- const int vgroup= vc.obact->actdef - 1;
+ const int vgroup_active= vc.obact->actdef - 1;
ToolSettings *ts= vc.scene->toolsettings;
float mval_f[2];
int v_idx_best= -1;
@@ -914,7 +922,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
} while (fidx--);
if(v_idx_best != -1) { /* should always be valid */
- ts->vgroup_weight= defvert_find_weight(&me->dvert[v_idx_best], vgroup);
+ ts->vgroup_weight= defvert_find_weight(&me->dvert[v_idx_best], vgroup_active);
change= TRUE;
}
}
@@ -967,11 +975,11 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA
index= view3d_sample_backbuf(&vc, win->eventstate->x - vc.ar->winrct.xmin, win->eventstate->y - vc.ar->winrct.ymin);
if(index && index<=me->totface) {
- const int totgroup= BLI_countlist(&vc.obact->defbase);
- if(totgroup) {
+ const int defbase_tot= BLI_countlist(&vc.obact->defbase);
+ if(defbase_tot) {
MFace *mf= ((MFace *)me->mface) + index-1;
unsigned int fidx= mf->v4 ? 3:2;
- int *groups= MEM_callocN(totgroup*sizeof(int), "groups");
+ int *groups= MEM_callocN(defbase_tot*sizeof(int), "groups");
int found= FALSE;
do {
@@ -979,8 +987,10 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA
int i= dvert->totweight;
MDeformWeight *dw;
for(dw= dvert->dw; i > 0; dw++, i--) {
- groups[dw->def_nr]= TRUE;
- found= TRUE;
+ if (dw->def_nr < defbase_tot) {
+ groups[dw->def_nr]= TRUE;
+ found= TRUE;
+ }
}
} while (fidx--);
@@ -992,7 +1002,7 @@ static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA
int totitem= 0;
int i= 0;
bDeformGroup *dg;
- for(dg= vc.obact->defbase.first; dg && i<totgroup; i++, dg= dg->next) {
+ for(dg= vc.obact->defbase.first; dg && i<defbase_tot; i++, dg= dg->next) {
if(groups[i]) {
item_tmp.identifier= item_tmp.name= dg->name;
item_tmp.value= i;
@@ -1021,6 +1031,7 @@ static int weight_sample_group_exec(bContext *C, wmOperator *op)
ViewContext vc;
view3d_set_viewcontext(C, &vc);
+ BLI_assert(type + 1 >= 0);
vc.obact->actdef= type + 1;
DAG_id_tag_update(&vc.obact->id, OB_RECALC_DATA);
@@ -1090,7 +1101,8 @@ static void do_weight_paint_auto_normalize(MDeformVert *dvert,
#endif
/* the active group should be involved in auto normalize */
-static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, const char *vgroup_validmap, char do_auto_normalize)
+static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, const int defbase_tot,
+ const char *vgroup_validmap, char do_auto_normalize)
{
if (do_auto_normalize == FALSE) {
return;
@@ -1101,9 +1113,11 @@ static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, const
MDeformWeight *dw;
for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
- if (vgroup_validmap[dw->def_nr]) {
- tot++;
- sum += dw->weight;
+ if (dw->def_nr < defbase_tot) {
+ if (vgroup_validmap[dw->def_nr]) {
+ tot++;
+ sum += dw->weight;
+ }
}
}
@@ -1114,8 +1128,10 @@ static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, const
fac= 1.0f / sum;
for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
- if (vgroup_validmap[dw->def_nr]) {
- dw->weight *= fac;
+ if (dw->def_nr < defbase_tot) {
+ if (vgroup_validmap[dw->def_nr]) {
+ dw->weight *= fac;
+ }
}
}
}
@@ -1124,12 +1140,17 @@ static void do_weight_paint_auto_normalize_all_groups(MDeformVert *dvert, const
/*
See if the current deform vertex has a locked group
*/
-static char has_locked_group(MDeformVert *dvert, const char *lock_flags)
+static char has_locked_group(MDeformVert *dvert, const int defbase_tot,
+ const char *bone_groups, const char *lock_flags)
{
int i;
- for(i = 0; i < dvert->totweight; i++) {
- if(lock_flags[dvert->dw[i].def_nr] && dvert->dw[i].weight > 0.0f) {
- return TRUE;
+ MDeformWeight *dw;
+
+ for (i= dvert->totweight, dw= dvert->dw; i != 0; i--, dw++) {
+ if (dw->def_nr < defbase_tot) {
+ if (bone_groups[dw->def_nr] && lock_flags[dw->def_nr] && dw->weight > 0.0f) {
+ return TRUE;
+ }
}
}
return FALSE;
@@ -1158,7 +1179,7 @@ static char *gen_lock_flags(Object* ob, int defbase_tot)
return NULL;
}
-static int has_locked_group_selected(int defbase_tot, char *defbase_sel, char *lock_flags)
+static int has_locked_group_selected(int defbase_tot, const char *defbase_sel, const char *lock_flags)
{
int i;
for(i = 0; i < defbase_tot; i++) {
@@ -1187,7 +1208,7 @@ static int has_unselected_unlocked_bone_group(int defbase_tot, char *defbase_sel
#endif
-static void multipaint_selection(MDeformVert *dvert, float change, char *defbase_sel, int defbase_tot)
+static void multipaint_selection(MDeformVert *dvert, const int defbase_tot, float change, const char *defbase_sel)
{
int i;
MDeformWeight *dw;
@@ -1226,7 +1247,10 @@ static void multipaint_selection(MDeformVert *dvert, float change, char *defbase
/* move all change onto valid, unchanged groups. If there is change left over,
* then return it.
* assumes there are valid groups to shift weight onto */
-static float redistribute_change(MDeformVert *ndv, char *change_status, int changeme, int changeto, float totchange, float total_valid, char do_auto_normalize)
+static float redistribute_change(MDeformVert *ndv, const int defbase_tot,
+ char *change_status, const char change_me, int changeto,
+ float totchange, float total_valid,
+ char do_auto_normalize)
{
float was_change;
float change;
@@ -1240,30 +1264,35 @@ static float redistribute_change(MDeformVert *ndv, char *change_status, int chan
change = totchange/total_valid;
for(i = 0; i < ndv->totweight && total_valid && totchange; i++) {
ndw = (ndv->dw+i);
- /* change only the groups with a valid status */
- if(change_status[ndw->def_nr] == changeme) {
- oldval = ndw->weight;
- /* if auto normalize is active, don't worry about upper bounds */
- if(do_auto_normalize == FALSE && ndw->weight + change > 1) {
- totchange -= 1-ndw->weight;
- ndw->weight = 1;
- /* stop the changes to this group */
- change_status[ndw->def_nr] = changeto;
- total_valid--;
- }
- else if(ndw->weight + change < 0) { /* check the lower bound */
- totchange -= ndw->weight;
- ndw->weight = 0;
- change_status[ndw->def_nr] = changeto;
- total_valid--;
- }
- else {/* a perfectly valid change occurred to ndw->weight */
- totchange -= change;
- ndw->weight += change;
- }
- /* see if there was a change */
- if(oldval != ndw->weight) {
- was_change = TRUE;
+
+ /* ignore anything outside the value range */
+ if (ndw->def_nr < defbase_tot) {
+
+ /* change only the groups with a valid status */
+ if(change_status[ndw->def_nr] == change_me) {
+ oldval = ndw->weight;
+ /* if auto normalize is active, don't worry about upper bounds */
+ if(do_auto_normalize == FALSE && ndw->weight + change > 1) {
+ totchange -= 1-ndw->weight;
+ ndw->weight = 1;
+ /* stop the changes to this group */
+ change_status[ndw->def_nr] = changeto;
+ total_valid--;
+ }
+ else if(ndw->weight + change < 0) { /* check the lower bound */
+ totchange -= ndw->weight;
+ ndw->weight = 0;
+ change_status[ndw->def_nr] = changeto;
+ total_valid--;
+ }
+ else {/* a perfectly valid change occurred to ndw->weight */
+ totchange -= change;
+ ndw->weight += change;
+ }
+ /* see if there was a change */
+ if(oldval != ndw->weight) {
+ was_change = TRUE;
+ }
}
}
}
@@ -1273,12 +1302,14 @@ static float redistribute_change(MDeformVert *ndv, char *change_status, int chan
/* left overs */
return totchange;
}
-static float get_mp_change(MDeformVert *odv, char *defbase_sel, float brush_change);
+static float get_mp_change(MDeformVert *odv, const int defbase_tot, const char *defbase_sel, float brush_change);
/* observe the changes made to the weights of groups.
* make sure all locked groups on the vertex have the same deformation
* by moving the changes made to groups onto other unlocked groups */
-static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, char *defbase_sel,
- const char *lock_flags, const char *vgroup_validmap, char do_auto_normalize, char do_multipaint)
+static void enforce_locks(MDeformVert *odv, MDeformVert *ndv,
+ const int defbase_tot, const char *defbase_sel,
+ const char *lock_flags, const char *vgroup_validmap,
+ char do_auto_normalize, char do_multipaint)
{
float totchange = 0.0f;
float totchange_allowed = 0.0f;
@@ -1294,7 +1325,7 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, c
char *change_status;
- if(!lock_flags || !has_locked_group(ndv, lock_flags)) {
+ if(!lock_flags || !has_locked_group(ndv, defbase_tot, vgroup_validmap, lock_flags)) {
return;
}
/* record if a group was changed, unlocked and not changed, or locked */
@@ -1358,17 +1389,17 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, c
totchange_allowed = -totchange;
}
/* move the weight evenly between the allowed groups, move excess back onto the used groups based on the change */
- totchange_allowed = redistribute_change(ndv, change_status, 1, -1, totchange_allowed, total_valid, do_auto_normalize);
+ totchange_allowed = redistribute_change(ndv, defbase_tot, change_status, 1, -1, totchange_allowed, total_valid, do_auto_normalize);
left_over += totchange_allowed;
if(left_over) {
/* more than one nonzero weights were changed with the same ratio with multipaint, so keep them changed that way! */
if(total_changed > 1 && do_multipaint) {
- float undo_change = get_mp_change(ndv, defbase_sel, left_over);
- multipaint_selection(ndv, undo_change, defbase_sel, defbase_tot);
+ float undo_change = get_mp_change(ndv, defbase_tot, defbase_sel, left_over);
+ multipaint_selection(ndv, defbase_tot, undo_change, defbase_sel);
}
/* or designatedw is still -1 put weight back as evenly as possible */
else {
- redistribute_change(ndv, change_status, 2, -2, left_over, total_changed, do_auto_normalize);
+ redistribute_change(ndv, defbase_tot, change_status, 2, -2, left_over, total_changed, do_auto_normalize);
}
}
}
@@ -1388,15 +1419,17 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot, c
}
/* multi-paint's initial, potential change is computed here based on the user's stroke */
-static float get_mp_change(MDeformVert *odv, char *defbase_sel, float brush_change)
+static float get_mp_change(MDeformVert *odv, const int defbase_tot, const char *defbase_sel, float brush_change)
{
float selwsum = 0.0f;
unsigned int i;
MDeformWeight *dw= odv->dw;
for (i= odv->totweight; i != 0; i--, dw++) {
- if(defbase_sel[dw->def_nr]) {
- selwsum += dw->weight;
+ if (dw->def_nr < defbase_tot) {
+ if(defbase_sel[dw->def_nr]) {
+ selwsum += dw->weight;
+ }
}
}
if(selwsum && selwsum+brush_change > 0) {
@@ -1407,15 +1440,15 @@ static float get_mp_change(MDeformVert *odv, char *defbase_sel, float brush_chan
/* change the weights back to the wv's weights
* it assumes you already have the correct pointer index */
-static void reset_to_prev(MDeformVert *wv, MDeformVert *dvert)
+static void defvert_reset_to_prev(MDeformVert *dv_prev, MDeformVert *dv)
{
- MDeformWeight *dw= dvert->dw;
- MDeformWeight *w;
+ MDeformWeight *dw= dv->dw;
+ MDeformWeight *dw_prev;
unsigned int i;
- for (i= dvert->totweight; i != 0; i--, dw++) {
- w= defvert_find_index(wv, dw->def_nr);
+ for (i= dv->totweight; i != 0; i--, dw++) {
+ dw_prev= defvert_find_index(dv_prev, dw->def_nr);
/* if there was no w when there is a d, then the old weight was 0 */
- dw->weight = w ? w->weight : 0.0f;
+ dw->weight = dw_prev ? dw_prev->weight : 0.0f;
}
}
@@ -1440,15 +1473,16 @@ typedef struct WeightPaintInfo {
int defbase_tot_sel;
int defbase_tot_unsel;
+ int vgroup_active; /* (ob->actdef - 1) */
int vgroup_mirror; /* mirror group or -1 */
- char *lock_flags; /* boolean array for locked bones,
- * length of defbase_tot */
- char *defbase_sel; /* boolean array for selected bones,
- * length of defbase_tot */
+ const char *lock_flags; /* boolean array for locked bones,
+ * length of defbase_tot */
+ const char *defbase_sel; /* boolean array for selected bones,
+ * length of defbase_tot, cant be const because of how its passed */
- char *vgroup_validmap; /* same as WeightPaintData.vgroup_validmap,
- * only added here for convenience */
+ const char *vgroup_validmap; /* same as WeightPaintData.vgroup_validmap,
+ * only added here for convenience */
char do_flip;
char do_multipaint;
@@ -1457,7 +1491,10 @@ typedef struct WeightPaintInfo {
/* fresh start to make multi-paint and locking modular */
/* returns TRUE if it thinks you need to reset the weights due to
- * normalizing while multi-painting */
+ * normalizing while multi-painting
+ *
+ * note: this assumes dw->def_nr range has been checked by the caller
+ */
static int apply_mp_locks_normalize(Mesh *me, const WeightPaintInfo *wpi,
const unsigned int index,
MDeformWeight *dw, MDeformWeight *tdw,
@@ -1472,13 +1509,13 @@ static int apply_mp_locks_normalize(Mesh *me, const WeightPaintInfo *wpi,
dv_test.totweight = dv->totweight;
/* do not multi-paint if a locked group is selected or the active group is locked
* !lock_flags[dw->def_nr] helps if nothing is selected, but active group is locked */
- if( (wpi->lock_flags == NULL) ||
- ((wpi->lock_flags[dw->def_nr] == FALSE) &&
- has_locked_group_selected(wpi->defbase_tot, wpi->defbase_sel, wpi->lock_flags) == FALSE))
+ if ( (wpi->lock_flags == NULL) ||
+ ((wpi->lock_flags[dw->def_nr] == FALSE) && /* def_nr range has to be checked for by caller */
+ has_locked_group_selected(wpi->defbase_tot, wpi->defbase_sel, wpi->lock_flags) == FALSE))
{
if(wpi->do_multipaint && wpi->defbase_tot_sel > 1) {
if(change && change!=1) {
- multipaint_selection(dv, change, wpi->defbase_sel, wpi->defbase_tot);
+ multipaint_selection(dv, wpi->defbase_tot, change, wpi->defbase_sel);
}
}
else { /* this lets users paint normally, but don't let them paint locked groups */
@@ -1489,7 +1526,7 @@ static int apply_mp_locks_normalize(Mesh *me, const WeightPaintInfo *wpi,
enforce_locks(&dv_test, dv, wpi->defbase_tot, wpi->defbase_sel, wpi->lock_flags, wpi->vgroup_validmap, wpi->do_auto_normalize, wpi->do_multipaint);
- do_weight_paint_auto_normalize_all_groups(dv, wpi->vgroup_validmap, wpi->do_auto_normalize);
+ do_weight_paint_auto_normalize_all_groups(dv, wpi->defbase_tot, wpi->vgroup_validmap, wpi->do_auto_normalize);
if(oldChange && wpi->do_multipaint && wpi->defbase_tot_sel > 1) {
if(tdw->weight != oldw) {
@@ -1513,13 +1550,15 @@ static int apply_mp_locks_normalize(Mesh *me, const WeightPaintInfo *wpi,
/* within the current dvert index, get the dw that is selected and has a weight
* above 0, this helps multi-paint */
-static int get_first_selected_nonzero_weight(MDeformVert *dvert, char *defbase_sel)
+static int get_first_selected_nonzero_weight(MDeformVert *dvert, const int defbase_tot, const char *defbase_sel)
{
int i;
MDeformWeight *dw= dvert->dw;
for(i=0; i< dvert->totweight; i++, dw++) {
- if(defbase_sel[dw->def_nr] && dw->weight > 0.0f) {
- return i;
+ if (dw->def_nr < defbase_tot) {
+ if (defbase_sel[dw->def_nr] && dw->weight > 0.0f) {
+ return i;
+ }
}
}
return -1;
@@ -1539,15 +1578,14 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
MDeformVert *dv= &me->dvert[index];
MDeformWeight *dw, *uw;
- int vgroup= ob->actdef-1;
if(wp->flag & VP_ONLYVGROUP) {
- dw= defvert_find_index(dv, vgroup);
- uw= defvert_find_index(wp->wpaint_prev+index, vgroup);
+ dw= defvert_find_index(dv, wpi->vgroup_active);
+ uw= defvert_find_index(wp->wpaint_prev+index, wpi->vgroup_active);
}
else {
- dw= defvert_verify_index(dv, vgroup);
- uw= defvert_verify_index(wp->wpaint_prev+index, vgroup);
+ dw= defvert_verify_index(dv, wpi->vgroup_active);
+ uw= defvert_verify_index(wp->wpaint_prev+index, wpi->vgroup_active);
}
if(dw==NULL || uw==NULL) {
@@ -1559,8 +1597,8 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
/* If there are no locks or multipaint,
* then there is no need to run the more complicated checks */
- if( (wpi->do_multipaint == FALSE || wpi->defbase_tot_sel <= 1) &&
- (wpi->lock_flags == NULL || has_locked_group(dv, wpi->lock_flags) == FALSE))
+ if ( (wpi->do_multipaint == FALSE || wpi->defbase_tot_sel <= 1) &&
+ (wpi->lock_flags == NULL || has_locked_group(dv, wpi->defbase_tot, wpi->vgroup_validmap, wpi->lock_flags) == FALSE))
{
wpaint_blend(wp, dw, uw, alpha, paintweight, wpi->do_flip, FALSE);
@@ -1569,7 +1607,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
if(index_mirr != -1) {
MDeformVert *dv_mirr= &me->dvert[index_mirr];
/* copy, not paint again */
- uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : vgroup);
+ uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : wpi->vgroup_active);
uw->weight= dw->weight;
}
}
@@ -1578,7 +1616,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
* which has already been scaled down in relation to other weights,
* then scales a second time [#26193]. Tricky multi-paint code doesn't
* suffer from this problem - campbell */
- do_weight_paint_auto_normalize_all_groups(dv, wpi->vgroup_validmap, wpi->do_auto_normalize);
+ do_weight_paint_auto_normalize_all_groups(dv, wpi->defbase_tot, wpi->vgroup_validmap, wpi->do_auto_normalize);
}
else {
/* use locks and/or multipaint */
@@ -1603,13 +1641,13 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
dv_copy.totweight = dv->totweight;
tdw = dw;
tuw = uw;
- change = get_mp_change(wp->wpaint_prev+index, wpi->defbase_sel, neww - oldw);
+ change = get_mp_change(&wp->wpaint_prev[index], wpi->defbase_tot, wpi->defbase_sel, neww - oldw);
if(change) {
if(!tdw->weight) {
- i = get_first_selected_nonzero_weight(dv, wpi->defbase_sel);
+ i = get_first_selected_nonzero_weight(dv, wpi->defbase_tot, wpi->defbase_sel);
if(i>=0) {
tdw = &(dv->dw[i]);
- tuw = defvert_verify_index(wp->wpaint_prev+index, tdw->def_nr);
+ tuw = defvert_verify_index(&wp->wpaint_prev[index], tdw->def_nr);
}
else {
change = 0;
@@ -1622,7 +1660,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
if( testw > tuw->weight ) {
if(change > oldChange) {
/* reset the weights and use the new change */
- reset_to_prev(wp->wpaint_prev+index, dv);
+ defvert_reset_to_prev(wp->wpaint_prev+index, dv);
}
else {
/* the old change was more significant, so set
@@ -1632,7 +1670,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
}
else {
if(change < oldChange) {
- reset_to_prev(wp->wpaint_prev+index, dv);
+ defvert_reset_to_prev(wp->wpaint_prev+index, dv);
}
else {
change = 0;
@@ -1647,7 +1685,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
}
if(apply_mp_locks_normalize(me, wpi, index, dw, tdw, change, oldChange, oldw, neww)) {
- reset_to_prev(&dv_copy, dv);
+ defvert_reset_to_prev(&dv_copy, dv);
change = 0;
oldChange = 0;
}
@@ -1668,7 +1706,7 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
if(index_mirr != -1) {
MDeformVert *dv_mirr= &me->dvert[index_mirr];
/* copy, not paint again */
- uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : vgroup);
+ uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : wpi->vgroup_active);
//uw->weight= dw->weight;
apply_mp_locks_normalize(me, wpi, index_mirr, uw, tdw, change, oldChange, oldw, neww);
}
@@ -1733,10 +1771,13 @@ static int set_wpaint(bContext *C, wmOperator *UNUSED(op)) /* toggle */
/* for switching to/from mode */
static int paint_poll_test(bContext *C)
{
+ Object *ob= CTX_data_active_object(C);
if(CTX_data_edit_object(C))
return 0;
if(CTX_data_active_object(C)==NULL)
return 0;
+ if(!ob->data || ((ID *)ob->data)->lib)
+ return 0;
return 1;
}
@@ -1761,13 +1802,14 @@ void PAINT_OT_weight_paint_toggle(wmOperatorType *ot)
struct WPaintData {
ViewContext vc;
int *indexar;
+ int vgroup_active;
int vgroup_mirror;
float *vertexcosnos;
float wpimat[3][3];
/*variables for auto normalize*/
- char *vgroup_validmap; /*stores if vgroups tie to deforming bones or not*/
- char *lock_flags;
+ const char *vgroup_validmap; /*stores if vgroups tie to deforming bones or not*/
+ const char *lock_flags;
int defbase_tot;
};
@@ -1822,6 +1864,8 @@ static char *wpaint_make_validmap(Object *ob)
vgroup_validmap[i]= (BLI_ghash_lookup(gh, dg->name) != NULL);
}
+ BLI_assert(i == BLI_ghash_size(gh));
+
BLI_ghash_free(gh, NULL, NULL);
return vgroup_validmap;
@@ -1831,14 +1875,18 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
{
Scene *scene= CTX_data_scene(C);
struct PaintStroke *stroke = op->customdata;
- ToolSettings *ts= CTX_data_tool_settings(C);
+ ToolSettings *ts= scene->toolsettings;
VPaint *wp= ts->wpaint;
Object *ob= CTX_data_active_object(C);
struct WPaintData *wpd;
Mesh *me;
+ bDeformGroup *dg;
+
float mat[4][4], imat[4][4];
- if(scene->obedit) return OPERATOR_CANCELLED;
+ if(scene->obedit) {
+ return FALSE;
+ }
me= get_mesh(ob);
if(me==NULL || me->totface==0) return OPERATOR_PASS_THROUGH;
@@ -1848,29 +1896,9 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
ED_vgroup_data_create(&me->id);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
}
-
- /* make mode data storage */
- wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
- paint_stroke_set_mode_data(stroke, wpd);
- view3d_set_viewcontext(C, &wpd->vc);
- wpd->vgroup_mirror= -1;
-
- /*set up auto-normalize, and generate map for detecting which
- vgroups affect deform bones*/
- wpd->defbase_tot = BLI_countlist(&ob->defbase);
- wpd->lock_flags = gen_lock_flags(ob, wpd->defbase_tot);
- if (ts->auto_normalize || ts->multipaint || wpd->lock_flags) {
- wpd->vgroup_validmap = wpaint_make_validmap(ob);
- }
- /* ALLOCATIONS! no return after this line */
- /* painting on subsurfs should give correct points too, this returns me->totvert amount */
- wpd->vertexcosnos= mesh_get_mapped_verts_nors(scene, ob);
- wpd->indexar= get_indexarray(me);
- copy_wpaint_prev(wp, me->dvert, me->totvert);
-
/* this happens on a Bone select, when no vgroup existed yet */
- if(ob->actdef<=0) {
+ if (ob->actdef <= 0) {
Object *modob;
if((modob = modifiers_isDeformedByArmature(ob))) {
Bone *actbone= ((bArmature *)modob->data)->act_bone;
@@ -1879,10 +1907,14 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
if(pchan) {
bDeformGroup *dg= defgroup_find_name(ob, pchan->name);
- if(dg==NULL)
+ if(dg==NULL) {
dg= ED_vgroup_add_name(ob, pchan->name); /* sets actdef */
- else
- ob->actdef= 1 + defgroup_find_index(ob, dg);
+ }
+ else {
+ int actdef = 1 + BLI_findindex(&ob->defbase, dg);
+ BLI_assert(actdef >= 0);
+ ob->actdef= actdef;
+ }
}
}
}
@@ -1891,17 +1923,53 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED
ED_vgroup_add(ob);
}
+ /* ensure we dont try paint onto an invalid group */
+ if (ob->actdef <= 0) {
+ BKE_report(op->reports, RPT_WARNING, "No active vertex group for painting, aborting");
+ return FALSE;
+ }
+
+ /* check if we are attempting to paint onto a locked vertex group,
+ * and other options disallow it from doing anything useful */
+ dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
+ if (dg->flag & DG_LOCK_WEIGHT) {
+ BKE_report(op->reports, RPT_WARNING, "Active group is locked, aborting");
+ return FALSE;
+ }
+
+ /* ALLOCATIONS! no return after this line */
+ /* make mode data storage */
+ wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
+ paint_stroke_set_mode_data(stroke, wpd);
+ view3d_set_viewcontext(C, &wpd->vc);
+
+ wpd->vgroup_active = ob->actdef - 1;
+ wpd->vgroup_mirror = -1;
+
+ /* set up auto-normalize, and generate map for detecting which
+ * vgroups affect deform bones*/
+ wpd->defbase_tot = BLI_countlist(&ob->defbase);
+ wpd->lock_flags = gen_lock_flags(ob, wpd->defbase_tot);
+ if (ts->auto_normalize || ts->multipaint || wpd->lock_flags) {
+ wpd->vgroup_validmap = wpaint_make_validmap(ob);
+ }
+
+ /* painting on subsurfs should give correct points too, this returns me->totvert amount */
+ wpd->vertexcosnos= mesh_get_mapped_verts_nors(scene, ob);
+ wpd->indexar= get_indexarray(me);
+ copy_wpaint_prev(wp, me->dvert, me->totvert);
+
/* imat for normals */
- mul_m4_m4m4(mat, ob->obmat, wpd->vc.rv3d->viewmat);
+ mult_m4_m4m4(mat, wpd->vc.rv3d->viewmat, ob->obmat);
invert_m4_m4(imat, mat);
copy_m3_m4(wpd->wpimat, imat);
-
+
/* if mirror painting, find the other group */
if(me->editflag & ME_EDIT_MIRROR_X) {
- wpd->vgroup_mirror= wpaint_mirror_vgroup_ensure(ob);
+ wpd->vgroup_mirror = wpaint_mirror_vgroup_ensure(ob, wpd->vgroup_active);
}
- return 1;
+ return TRUE;
}
static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
@@ -1916,11 +1984,16 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
float mat[4][4];
float paintweight;
int *indexar;
- int totw;
+ float totw;
unsigned int index, totindex;
float alpha;
- float mval[2], pressure;
+ float mval[2];
int use_vert_sel;
+ char *defbase_sel;
+
+ const float pressure = RNA_float_get(itemptr, "pressure");
+ const float brush_size_final = brush_size(brush) * (brush_use_size_pressure(brush) ? pressure : 1.0f);
+ const float brush_alpha_final = brush_alpha(brush) * (brush_use_alpha_pressure(brush) ? pressure : 1.0f);
/* intentionally dont initialize as NULL, make sure we initialize all members below */
WeightPaintInfo wpi;
@@ -1941,9 +2014,8 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
view3d_operator_needs_opengl(C);
/* load projection matrix */
- mul_m4_m4m4(mat, ob->obmat, vc->rv3d->persmat);
+ mult_m4_m4m4(mat, vc->rv3d->persmat, ob->obmat);
- pressure = RNA_float_get(itemptr, "pressure");
RNA_float_get_array(itemptr, "mouse", mval);
mval[0]-= vc->ar->winrct.xmin;
mval[1]-= vc->ar->winrct.ymin;
@@ -1952,10 +2024,13 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* *** setup WeightPaintInfo - pass onto do_weight_paint_vertex *** */
wpi.defbase_tot= wpd->defbase_tot;
- wpi.defbase_sel= MEM_mallocN(wpi.defbase_tot*sizeof(char), "wpi.defbase_sel");
- wpi.defbase_tot_sel= get_selected_defgroups(ob, wpi.defbase_sel, wpi.defbase_tot);
- if(wpi.defbase_tot_sel == 0 && ob->actdef) wpi.defbase_tot_sel = 1;
+ defbase_sel= MEM_mallocN(wpi.defbase_tot*sizeof(char), "wpi.defbase_sel");
+ wpi.defbase_tot_sel= get_selected_defgroups(ob, defbase_sel, wpi.defbase_tot);
+ wpi.defbase_sel= defbase_sel; /* so we can stay const */
+ if(wpi.defbase_tot_sel == 0 && ob->actdef > 0) wpi.defbase_tot_sel = 1;
+
wpi.defbase_tot_unsel= wpi.defbase_tot - wpi.defbase_tot_sel;
+ wpi.vgroup_active= wpd->vgroup_active;
wpi.vgroup_mirror= wpd->vgroup_mirror;
wpi.lock_flags= wpd->lock_flags;
wpi.vgroup_validmap= wpd->vgroup_validmap;
@@ -1974,7 +2049,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
if(wp->flag & VP_AREA) {
/* Ugly hack, to avoid drawing vertex index when getting the face index buffer - campbell */
me->editflag &= ~ME_EDIT_VERT_SEL;
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size(brush));
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size_final);
me->editflag |= use_vert_sel ? ME_EDIT_VERT_SEL : 0;
}
else {
@@ -2009,7 +2084,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* make sure each vertex gets treated only once */
/* and calculate filter weight */
- totw= 0;
+ totw= 0.0f;
if(brush->vertexpaint_tool==VP_BLUR)
paintweight= 0.0f;
else
@@ -2043,11 +2118,11 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
do {
unsigned int vidx= *(&mface->v1 + fidx);
-
- dw= dw_func(me->dvert+vidx, ob->actdef-1);
- if(dw) {
- paintweight+= dw->weight;
- totw++;
+ const float fac = calc_vp_strength_dl(wp, vc, wpd->vertexcosnos+6*vidx, mval, brush_size_final);
+ if (fac > 0.0f) {
+ dw = dw_func(&me->dvert[vidx], wpi.vgroup_active);
+ paintweight += dw ? (dw->weight * fac) : 0.0f;
+ totw += fac;
}
} while (fidx--);
@@ -2056,9 +2131,10 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
}
}
- if(brush->vertexpaint_tool==VP_BLUR)
- paintweight/= (float)totw;
-
+ if (brush->vertexpaint_tool==VP_BLUR) {
+ paintweight /= totw;
+ }
+
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totface) {
@@ -2068,7 +2144,8 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
unsigned int vidx= *(&mf->v1 + fidx);
if(me->dvert[vidx].flag) {
- alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*vidx, mval, pressure);
+ alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*vidx,
+ mval, brush_size_final, brush_alpha_final);
if(alpha) {
do_weight_paint_vertex(wp, ob, &wpi, vidx, alpha, paintweight);
}
@@ -2080,7 +2157,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* *** free wpi members */
- MEM_freeN(wpi.defbase_sel);
+ MEM_freeN((void *)wpi.defbase_sel);
/* *** dont freeing wpi members */
@@ -2102,9 +2179,9 @@ static void wpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
MEM_freeN(wpd->indexar);
if (wpd->vgroup_validmap)
- MEM_freeN(wpd->vgroup_validmap);
+ MEM_freeN((void *)wpd->vgroup_validmap);
if(wpd->lock_flags)
- MEM_freeN(wpd->lock_flags);
+ MEM_freeN((void *)wpd->lock_flags);
MEM_freeN(wpd);
}
@@ -2135,8 +2212,8 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
op->customdata = paint_stroke_new(C, NULL, wpaint_stroke_test_start,
- wpaint_stroke_update_step,
- wpaint_stroke_done, event->type);
+ wpaint_stroke_update_step,
+ wpaint_stroke_done, event->type);
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -2320,14 +2397,17 @@ static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent
copy_vpaint_prev(vp, (unsigned int *)me->mcol, me->totface);
/* some old cruft to sort out later */
- mul_m4_m4m4(mat, ob->obmat, vpd->vc.rv3d->viewmat);
+ mult_m4_m4m4(mat, vpd->vc.rv3d->viewmat, ob->obmat);
invert_m4_m4(imat, mat);
copy_m3_m4(vpd->vpimat, imat);
return 1;
}
-static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, const unsigned int index, const float mval[2], float pressure, int UNUSED(flip))
+static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob,
+ const unsigned int index, const float mval[2],
+ const float brush_size_final, const float brush_alpha_final,
+ int UNUSED(flip))
{
ViewContext *vc = &vpd->vc;
Brush *brush = paint_brush(&vp->paint);
@@ -2355,9 +2435,11 @@ static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, const uns
}
for(i = 0; i < (mface->v4 ? 4 : 3); ++i) {
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i], mval, pressure);
- if(alpha)
+ alpha = calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i],
+ mval, brush_size_final, brush_alpha_final);
+ if(alpha) {
vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, (int)(alpha*255.0f));
+ }
}
}
@@ -2373,16 +2455,19 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
float mat[4][4];
int *indexar= vpd->indexar;
int totindex, index, flip;
- float pressure, mval[2];
+ float mval[2];
+
+ const float pressure = RNA_float_get(itemptr, "pressure");
+ const float brush_size_final = brush_size(brush) * (brush_use_size_pressure(brush) ? pressure : 1.0f);
+ const float brush_alpha_final = brush_alpha(brush) * (brush_use_alpha_pressure(brush) ? pressure : 1.0f);
RNA_float_get_array(itemptr, "mouse", mval);
flip = RNA_boolean_get(itemptr, "pen_flip");
- pressure = RNA_float_get(itemptr, "pressure");
view3d_operator_needs_opengl(C);
/* load projection matrix */
- mul_m4_m4m4(mat, ob->obmat, vc->rv3d->persmat);
+ mult_m4_m4m4(mat, vc->rv3d->persmat, ob->obmat);
mval[0]-= vc->ar->winrct.xmin;
mval[1]-= vc->ar->winrct.ymin;
@@ -2390,7 +2475,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
/* which faces are involved */
if(vp->flag & VP_AREA) {
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size(brush));
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush_size_final);
}
else {
indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
@@ -2401,8 +2486,9 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
swap_m4m4(vc->rv3d->persmat, mat);
for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface)
- vpaint_paint_face(vp, vpd, ob, indexar[index]-1, mval, pressure, flip);
+ if (indexar[index] && indexar[index]<=me->totface) {
+ vpaint_paint_face(vp, vpd, ob, indexar[index]-1, mval, brush_size_final, brush_alpha_final, flip);
+ }
}
swap_m4m4(vc->rv3d->persmat, mat);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index a63a9256055..649a993ea69 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -248,90 +248,51 @@ typedef struct StrokeCache {
/* Get a screen-space rectangle of the modified area */
static int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d,
- Object *ob, rcti *rect)
+ Object *ob, rcti *rect)
{
+ SculptSession *ss;
PBVH *pbvh= ob->sculpt->pbvh;
- float bb_min[3], bb_max[3], pmat[4][4];
- int i, j, k;
-
- ED_view3d_ob_project_mat_get(rv3d, ob, pmat);
+ float bb_min[3], bb_max[3];
if(!pbvh)
return 0;
BLI_pbvh_redraw_BB(pbvh, bb_min, bb_max);
- rect->xmin = rect->ymin = INT_MAX;
- rect->xmax = rect->ymax = INT_MIN;
-
- if(bb_min[0] > bb_max[0] || bb_min[1] > bb_max[1] || bb_min[2] > bb_max[2])
+ /* convert 3D bounding box to screen space */
+ if(!paint_convert_bb_to_rect(rect,
+ bb_min,
+ bb_max,
+ ar,
+ rv3d,
+ ob)) {
return 0;
-
- for(i = 0; i < 2; ++i) {
- for(j = 0; j < 2; ++j) {
- for(k = 0; k < 2; ++k) {
- float vec[3], proj[2];
- vec[0] = i ? bb_min[0] : bb_max[0];
- vec[1] = j ? bb_min[1] : bb_max[1];
- vec[2] = k ? bb_min[2] : bb_max[2];
- ED_view3d_project_float(ar, vec, proj, pmat);
- rect->xmin = MIN2(rect->xmin, proj[0]);
- rect->xmax = MAX2(rect->xmax, proj[0]);
- rect->ymin = MIN2(rect->ymin, proj[1]);
- rect->ymax = MAX2(rect->ymax, proj[1]);
- }
- }
}
-
- if (rect->xmin < rect->xmax && rect->ymin < rect->ymax) {
- /* expand redraw rect with redraw rect from previous step to prevent
- partial-redraw issues caused by fast strokes. This is needed here (not in sculpt_flush_update)
- as it was before because redraw rectangle should be the same in both of
- optimized PBVH draw function and 3d view redraw (if not -- some mesh parts could
- disapper from screen (sergey) */
- SculptSession *ss = ob->sculpt;
-
- if (ss->cache) {
- if (!BLI_rcti_is_empty(&ss->cache->previous_r))
- BLI_union_rcti(rect, &ss->cache->previous_r);
- }
- return 1;
+ /* expand redraw rect with redraw rect from previous step to
+ prevent partial-redraw issues caused by fast strokes. This is
+ needed here (not in sculpt_flush_update) as it was before
+ because redraw rectangle should be the same in both of
+ optimized PBVH draw function and 3d view redraw (if not -- some
+ mesh parts could disapper from screen (sergey) */
+ ss = ob->sculpt;
+ if(ss->cache) {
+ if(!BLI_rcti_is_empty(&ss->cache->previous_r))
+ BLI_union_rcti(rect, &ss->cache->previous_r);
}
- return 0;
+ return 1;
}
void sculpt_get_redraw_planes(float planes[4][4], ARegion *ar,
RegionView3D *rv3d, Object *ob)
{
PBVH *pbvh= ob->sculpt->pbvh;
- BoundBox bb;
- bglMats mats;
rcti rect;
- memset(&bb, 0, sizeof(BoundBox));
-
- view3d_get_transformation(ar, rv3d, ob, &mats);
- sculpt_get_redraw_rect(ar, rv3d,ob, &rect);
-
-#if 1
- /* use some extra space just in case */
- rect.xmin -= 2;
- rect.xmax += 2;
- rect.ymin -= 2;
- rect.ymax += 2;
-#else
- /* it was doing this before, allows to redraw a smaller
- part of the screen but also gives artifaces .. */
- rect.xmin += 2;
- rect.xmax -= 2;
- rect.ymin += 2;
- rect.ymax -= 2;
-#endif
+ sculpt_get_redraw_rect(ar, rv3d, ob, &rect);
- ED_view3d_calc_clipping(&bb, planes, &mats, &rect);
- mul_m4_fl(planes, -1.0f);
+ paint_calc_redraw_planes(planes, ar, rv3d, ob, &rect);
/* clear redraw flag from nodes */
if(pbvh)
@@ -592,7 +553,12 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
float pen_flip = cache->pen_flip ? -1 : 1;
float invert = cache->invert ? -1 : 1;
float accum = integrate_overlap(brush);
- float overlap = (brush->flag & BRUSH_SPACE_ATTEN && brush->flag & BRUSH_SPACE && !(brush->flag & BRUSH_ANCHORED)) && (brush->spacing < 100) ? 1.0f/accum : 1; // spacing is integer percentage of radius, divide by 50 to get normalized diameter
+ /* spacing is integer percentage of radius, divide by 50 to get
+ normalized diameter */
+ float overlap = (brush->flag & BRUSH_SPACE_ATTEN &&
+ brush->flag & BRUSH_SPACE &&
+ !(brush->flag & BRUSH_ANCHORED) &&
+ (brush->spacing < 100)) ? 1.0f/accum : 1;
float flip = dir * invert * pen_flip;
switch(brush->sculpt_tool){
@@ -648,9 +614,11 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
return feather;
case SCULPT_TOOL_GRAB:
- case SCULPT_TOOL_ROTATE:
return feather;
+ case SCULPT_TOOL_ROTATE:
+ return alpha*pressure*feather;
+
default:
return 0;
}
@@ -705,16 +673,16 @@ static float tex_strength(SculptSession *ss, Brush *br, float point[3],
radius = ss->cache->pixel_radius; // use pressure adjusted size for fixed mode
- x = point_2d[0];
- y = point_2d[1];
+ x = point_2d[0] + ss->cache->vc->ar->winrct.xmin;
+ y = point_2d[1] + ss->cache->vc->ar->winrct.ymin;
}
else /* else (mtex->brush_map_mode == MTEX_MAP_MODE_TILED),
leave the coordinates relative to the screen */
{
radius = brush_size(br); // use unadjusted size for tiled mode
- x = point_2d[0] - ss->cache->vc->ar->winrct.xmin;
- y = point_2d[1] - ss->cache->vc->ar->winrct.ymin;
+ x = point_2d[0];
+ y = point_2d[1];
}
x /= ss->cache->vc->ar->winx;
@@ -1502,13 +1470,20 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
float bstrength= ss->cache->bstrength;
float an[3];
int n;
- float m[3][3];
+ float m[4][4], rot[4][4], lmat[4][4], ilmat[4][4];
static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 };
float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass];
calc_sculpt_normal(sd, ob, an, nodes, totnode);
- axis_angle_to_mat3(m, an, angle);
+ unit_m4(m);
+ unit_m4(lmat);
+
+ copy_v3_v3(lmat[3], ss->cache->location);
+ invert_m4_m4(ilmat, lmat);
+ axis_angle_to_mat4(rot, an, angle);
+
+ mul_serie_m4(m, lmat, rot, ilmat, NULL, NULL, NULL, NULL, NULL);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
for(n=0; n<totnode; n++) {
@@ -1532,7 +1507,7 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist,
an, origno[vd.i], NULL);
- mul_v3_m3v3(proxy[vd.i], m, origco[vd.i]);
+ mul_v3_m4v3(proxy[vd.i], m, origco[vd.i]);
sub_v3_v3(proxy[vd.i], origco[vd.i]);
mul_v3_fl(proxy[vd.i], fade);
@@ -1679,7 +1654,7 @@ static void calc_flatten_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
if(ss->cache->original) {
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test_fast(&test, unode->co[vd.i])) {
- add_v3_v3(private_fc, vd.co);
+ add_v3_v3(private_fc, unode->co[vd.i]);
private_count++;
}
}
@@ -1707,7 +1682,9 @@ static void calc_flatten_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
/* this calculates flatten center and area normal together,
amortizing the memory bandwidth and loop overhead to calculate both at the same time */
-static void calc_area_normal_and_flatten_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float an[3], float fc[3])
+static void calc_area_normal_and_flatten_center(Sculpt *sd, Object *ob,
+ PBVHNode **nodes, int totnode,
+ float an[3], float fc[3])
{
SculptSession *ss = ob->sculpt;
int n;
@@ -1749,7 +1726,7 @@ static void calc_area_normal_and_flatten_center(Sculpt *sd, Object *ob, PBVHNode
add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
// fc
- add_v3_v3(private_fc, vd.co);
+ add_v3_v3(private_fc, unode->co[vd.i]);
private_count++;
}
}
@@ -2112,7 +2089,7 @@ static void do_clay_tubes_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
copy_v3_v3(mat[3], ss->cache->location); mat[3][3] = 1;
normalize_m4(mat);
scale_m4_fl(scale, ss->cache->radius);
- mul_m4_m4m4(tmat, scale, mat);
+ mult_m4_m4m4(tmat, mat, scale);
invert_m4_m4(mat, tmat);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
@@ -2579,7 +2556,9 @@ static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob)
/* Flip all the editdata across the axis/axes specified by symm. Used to
calculate multiple modifications to the mesh when symmetry is enabled. */
-static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float UNUSED(feather))
+static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm,
+ const char axis, const float angle,
+ const float UNUSED(feather))
{
(void)sd; /* unused */
@@ -2611,7 +2590,9 @@ static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm,
mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry);
}
-static void do_radial_symmetry(Sculpt *sd, Object *ob, Brush *brush, const char symm, const int axis, const float feather)
+static void do_radial_symmetry(Sculpt *sd, Object *ob, Brush *brush,
+ const char symm, const int axis,
+ const float feather)
{
SculptSession *ss = ob->sculpt;
int i;
@@ -2945,7 +2926,10 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
cache->original = 1;
}
- if(ELEM8(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES, SCULPT_TOOL_ROTATE))
+ if(ELEM8(brush->sculpt_tool,
+ SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB,
+ SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY,
+ SCULPT_TOOL_CLAY_TUBES, SCULPT_TOOL_ROTATE))
if(!(brush->flag & BRUSH_ACCUMULATE))
cache->original = 1;
@@ -3029,7 +3013,9 @@ static void sculpt_update_brush_delta(Sculpt *sd, Object *ob, Brush *brush)
}
/* Initialize the stroke cache variants from operator properties */
-static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, struct PaintStroke *stroke, PointerRNA *ptr)
+static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob,
+ struct PaintStroke *stroke,
+ PointerRNA *ptr)
{
SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
@@ -3086,7 +3072,9 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, st
cache->radius_squared = cache->radius*cache->radius;
- if(!(brush->flag & BRUSH_ANCHORED || ELEM4(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE))) {
+ if(!(brush->flag & BRUSH_ANCHORED ||
+ ELEM4(brush->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_SNAKE_HOOK,
+ SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE))) {
copy_v2_v2(cache->tex_mouse, cache->mouse);
if ( (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) &&
@@ -3128,7 +3116,9 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, st
if (!hit)
copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
- cache->radius= paint_calc_object_space_radius(paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius);
+ cache->radius= paint_calc_object_space_radius(paint_stroke_view_context(stroke),
+ cache->true_location,
+ cache->pixel_radius);
cache->radius_squared = cache->radius*cache->radius;
copy_v3_v3(sd->anchored_location, cache->true_location);
@@ -3160,7 +3150,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, st
dx = cache->mouse[0] - cache->initial_mouse[0];
dy = cache->mouse[1] - cache->initial_mouse[1];
- cache->vertex_rotation = -atan2(dx, dy);
+ cache->vertex_rotation = -atan2(dx, dy) * cache->bstrength;
sd->draw_anchored = 1;
copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index dd7ea81d520..8eb1f08b5b0 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -212,6 +212,104 @@ static void SOUND_OT_open_mono(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "mono", TRUE, "Mono", "Mixdown the sound to mono");
}
+/* ******************************************************* */
+
+static int sound_update_animation_flags_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Sequence* seq;
+ Scene* scene = CTX_data_scene(C);
+ struct FCurve* fcu;
+ char driven;
+
+ SEQ_BEGIN(scene->ed, seq) {
+ fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "volume", 0, &driven);
+ if(fcu || driven)
+ seq->flag |= SEQ_AUDIO_VOLUME_ANIMATED;
+ else
+ seq->flag &= ~SEQ_AUDIO_VOLUME_ANIMATED;
+
+ fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pitch", 0, &driven);
+ if(fcu || driven)
+ seq->flag |= SEQ_AUDIO_PITCH_ANIMATED;
+ else
+ seq->flag &= ~SEQ_AUDIO_PITCH_ANIMATED;
+
+ fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pan", 0, &driven);
+ if(fcu || driven)
+ seq->flag |= SEQ_AUDIO_PAN_ANIMATED;
+ else
+ seq->flag &= ~SEQ_AUDIO_PAN_ANIMATED;
+ }
+ SEQ_END
+
+ fcu = id_data_find_fcurve(&scene->id, scene, &RNA_Scene, "audio_volume", 0, &driven);
+ if(fcu || driven)
+ scene->audio.flag |= AUDIO_VOLUME_ANIMATED;
+ else
+ scene->audio.flag &= ~AUDIO_VOLUME_ANIMATED;
+
+ return OPERATOR_FINISHED;
+}
+
+static void SOUND_OT_update_animation_flags(wmOperatorType *ot)
+{
+ /*
+ This operator is needed to set a correct state of the sound animation
+ System. Unfortunately there's no really correct place to call the exec
+ function, that's why I made it an operator that's only visible in the
+ search menu. Apart from that the bake animation operator calls it too.
+ */
+
+ /* identifiers */
+ ot->name= "Update animation";
+ ot->description= "Update animation flags";
+ ot->idname= "SOUND_OT_update_animation_flags";
+
+ /* api callbacks */
+ ot->exec= sound_update_animation_flags_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+}
+
+/* ******************************************************* */
+
+static int sound_bake_animation_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Main* bmain = CTX_data_main(C);
+ Scene* scene = CTX_data_scene(C);
+ int oldfra = scene->r.cfra;
+ int cfra;
+
+ sound_update_animation_flags_exec(C, NULL);
+
+ for(cfra = scene->r.sfra > 0 ? scene->r.sfra - 1 : 0; cfra <= scene->r.efra + 1; cfra++)
+ {
+ scene->r.cfra = cfra;
+ scene_update_for_newframe(bmain, scene, scene->lay);
+ }
+
+ scene->r.cfra = oldfra;
+ scene_update_for_newframe(bmain, scene, scene->lay);
+
+ return OPERATOR_FINISHED;
+}
+
+static void SOUND_OT_bake_animation(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Update animation cache";
+ ot->description= "Updates the audio animation cache so that it's up to date";
+ ot->idname= "SOUND_OT_bake_animation";
+
+ /* api callbacks */
+ ot->exec= sound_bake_animation_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+}
+
+
/******************** mixdown operator ********************/
static int sound_mixdown_exec(bContext *C, wmOperator *op)
@@ -228,6 +326,8 @@ static int sound_mixdown_exec(bContext *C, wmOperator *op)
AUD_Codec codec;
const char* result;
+ sound_bake_animation_exec(C, op);
+
RNA_string_get(op->ptr, "filepath", path);
bitrate = RNA_int_get(op->ptr, "bitrate") * 1000;
accuracy = RNA_int_get(op->ptr, "accuracy");
@@ -615,104 +715,6 @@ static void SOUND_OT_unpack(wmOperatorType *ot)
/* ******************************************************* */
-static int sound_update_animation_flags_exec(bContext *C, wmOperator *UNUSED(op))
-{
- Sequence* seq;
- Scene* scene = CTX_data_scene(C);
- struct FCurve* fcu;
- char driven;
-
- SEQ_BEGIN(scene->ed, seq) {
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "volume", 0, &driven);
- if(fcu || driven)
- seq->flag |= SEQ_AUDIO_VOLUME_ANIMATED;
- else
- seq->flag &= ~SEQ_AUDIO_VOLUME_ANIMATED;
-
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pitch", 0, &driven);
- if(fcu || driven)
- seq->flag |= SEQ_AUDIO_PITCH_ANIMATED;
- else
- seq->flag &= ~SEQ_AUDIO_PITCH_ANIMATED;
-
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "pan", 0, &driven);
- if(fcu || driven)
- seq->flag |= SEQ_AUDIO_PAN_ANIMATED;
- else
- seq->flag &= ~SEQ_AUDIO_PAN_ANIMATED;
- }
- SEQ_END
-
- fcu = id_data_find_fcurve(&scene->id, scene, &RNA_Scene, "audio_volume", 0, &driven);
- if(fcu || driven)
- scene->audio.flag |= AUDIO_VOLUME_ANIMATED;
- else
- scene->audio.flag &= ~AUDIO_VOLUME_ANIMATED;
-
- return OPERATOR_FINISHED;
-}
-
-static void SOUND_OT_update_animation_flags(wmOperatorType *ot)
-{
- /*
- This operator is needed to set a correct state of the sound animation
- System. Unfortunately there's no really correct place to call the exec
- function, that's why I made it an operator that's only visible in the
- search menu. Apart from that the bake animation operator calls it too.
- */
-
- /* identifiers */
- ot->name= "Update animation";
- ot->description= "Update animation flags";
- ot->idname= "SOUND_OT_update_animation_flags";
-
- /* api callbacks */
- ot->exec= sound_update_animation_flags_exec;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER;
-}
-
-/* ******************************************************* */
-
-static int sound_bake_animation_exec(bContext *C, wmOperator *UNUSED(op))
-{
- Main* bmain = CTX_data_main(C);
- Scene* scene = CTX_data_scene(C);
- int oldfra = scene->r.cfra;
- int cfra;
-
- sound_update_animation_flags_exec(C, NULL);
-
- for(cfra = scene->r.sfra > 0 ? scene->r.sfra - 1 : 0; cfra <= scene->r.efra + 1; cfra++)
- {
- scene->r.cfra = cfra;
- scene_update_for_newframe(bmain, scene, scene->lay);
- }
-
- scene->r.cfra = oldfra;
- scene_update_for_newframe(bmain, scene, scene->lay);
-
- return OPERATOR_FINISHED;
-}
-
-static void SOUND_OT_bake_animation(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Update animation cache";
- ot->description= "Updates the audio animation cache so that it's up to date";
- ot->idname= "SOUND_OT_bake_animation";
-
- /* api callbacks */
- ot->exec= sound_bake_animation_exec;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER;
-}
-
-
-/* ******************************************************* */
-
void ED_operatortypes_sound(void)
{
WM_operatortype_append(SOUND_OT_open);
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 1382d58482d..414999b2f2b 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -360,6 +360,8 @@ static EnumPropertyItem prop_column_select_types[] = {
/* ------------------- */
/* Selects all visible keyframes between the specified markers */
+/* TODO, this is almost an _exact_ duplicate of a function of the same name in graph_select.c
+ * should de-duplicate - campbell */
static void markers_selectkeys_between (bAnimContext *ac)
{
ListBase anim_data = {NULL, NULL};
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index fbf8af514b6..7c5361c8af0 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -132,6 +132,7 @@ void ED_spacetypes_init(void)
ED_operatormacros_graph();
ED_operatormacros_action();
ED_operatormacros_clip();
+ ED_operatormacros_curve();
/* register dropboxes (can use macros) */
spacetypes = BKE_spacetypes_list();
diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c
index c0ccaeaea90..6927a78332f 100644
--- a/source/blender/editors/space_buttons/buttons_texture.c
+++ b/source/blender/editors/space_buttons/buttons_texture.c
@@ -1,6 +1,4 @@
/*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index 3f9ec3f3c82..ca2646e9967 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -96,6 +96,8 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
float x;
int *points, totseg, i, a;
float sfra= SFRA, efra= EFRA, framelen= ar->winx/(efra-sfra+1);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(&clip->tracking);
+ MovieTrackingReconstruction *reconstruction= BKE_tracking_get_reconstruction(&clip->tracking);
glEnable(GL_BLEND);
@@ -119,8 +121,8 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
}
/* track */
- if(clip->tracking.act_track) {
- MovieTrackingTrack *track= clip->tracking.act_track;
+ if(act_track) {
+ MovieTrackingTrack *track= act_track;
for(i= sfra, a= 0; i <= efra; i++) {
int framenr;
@@ -152,9 +154,9 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
}
/* failed frames */
- if(clip->tracking.reconstruction.flag&TRACKING_RECONSTRUCTED) {
- int n= clip->tracking.reconstruction.camnr;
- MovieReconstructedCamera *cameras= clip->tracking.reconstruction.cameras;
+ if(reconstruction->flag&TRACKING_RECONSTRUCTED) {
+ int n= reconstruction->camnr;
+ MovieReconstructedCamera *cameras= reconstruction->cameras;
glColor4ub(255, 0, 0, 96);
@@ -835,8 +837,9 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
{
float x, y;
MovieTracking* tracking= &clip->tracking;
- MovieTrackingMarker *marker;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track, *act_track;
+ MovieTrackingMarker *marker;
int framenr= sc->user.framenr;
int undistort= sc->user.render_flag&MCLIP_PROXY_RENDER_UNDISTORT;
float *marker_pos= NULL, *fp, *active_pos= NULL, cur_pos[2];
@@ -858,13 +861,13 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
glMultMatrixf(sc->stabmat);
glScalef(width, height, 0);
- act_track= clip->tracking.act_track;
+ act_track= BKE_tracking_active_track(tracking);
if(sc->user.render_flag&MCLIP_PROXY_RENDER_UNDISTORT) {
int count= 0;
/* count */
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
marker= BKE_tracking_get_marker(track, framenr);
@@ -880,7 +883,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
if(count) {
marker_pos= MEM_callocN(2*sizeof(float)*count, "draw_tracking_tracks marker_pos");
- track= tracking->tracks.first;
+ track= tracksbase->first;
fp= marker_pos;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
@@ -902,7 +905,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
}
if(sc->flag&SC_SHOW_TRACK_PATH) {
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0)
draw_track_path(sc, clip, track);
@@ -912,7 +915,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
}
/* markers outline and non-selected areas */
- track= tracking->tracks.first;
+ track= tracksbase->first;
fp= marker_pos;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
@@ -936,7 +939,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
/* selected areas only, so selection wouldn't be overlapped by
non-selected areas */
- track= tracking->tracks.first;
+ track= tracksbase->first;
fp= marker_pos;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
@@ -974,15 +977,16 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
}
if(sc->flag&SC_SHOW_BUNDLES) {
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
float pos[4], vec[4], mat[4][4], aspy;
glEnable(GL_POINT_SMOOTH);
glPointSize(3.0f);
aspy= 1.0f/clip->tracking.camera.pixel_aspect;
- BKE_tracking_projection_matrix(tracking, framenr, width, height, mat);
+ BKE_tracking_projection_matrix(tracking, object, framenr, width, height, mat);
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0 && track->flag&TRACK_HAS_BUNDLE) {
marker= BKE_tracking_get_marker(track, framenr);
@@ -1027,7 +1031,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
if(sc->flag&SC_SHOW_NAMES) {
/* scaling should be cleared before drawing texts, otherwise font would also be scaled */
- track= tracking->tracks.first;
+ track= tracksbase->first;
fp= marker_pos;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c
index c5036145792..d75df0ab51e 100644
--- a/source/blender/editors/space_clip/clip_editor.c
+++ b/source/blender/editors/space_clip/clip_editor.c
@@ -171,12 +171,13 @@ static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track;
int width, height, ok= 0;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
INIT_MINMAX2(min, max);
ED_space_clip_size(sc, &width, &height);
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr);
diff --git a/source/blender/editors/space_clip/clip_graph_draw.c b/source/blender/editors/space_clip/clip_graph_draw.c
index 7b14783d4ca..9aba6db0c80 100644
--- a/source/blender/editors/space_clip/clip_graph_draw.c
+++ b/source/blender/editors/space_clip/clip_graph_draw.c
@@ -177,6 +177,7 @@ static void draw_tracks_curves(View2D *v2d, SpaceClip *sc)
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
int width, height;
struct { MovieTrackingTrack *act_track; int sel; float xscale, yscale, hsize; } userdata;
@@ -188,13 +189,13 @@ static void draw_tracks_curves(View2D *v2d, SpaceClip *sc)
/* non-selected knot handles */
userdata.hsize= UI_GetThemeValuef(TH_HANDLE_VERTEX_SIZE);
userdata.sel= 0;
- userdata.act_track= clip->tracking.act_track;
+ userdata.act_track= act_track;
UI_view2d_getscale(v2d, &userdata.xscale, &userdata.yscale);
clip_graph_tracking_values_iterate(sc, &userdata, tracking_segment_knot_cb, NULL, NULL);
/* draw graph lines */
glEnable(GL_BLEND);
- clip_graph_tracking_values_iterate(sc, tracking->act_track, tracking_segment_point_cb, tracking_segment_start_cb, tracking_segment_end_cb);
+ clip_graph_tracking_values_iterate(sc, act_track, tracking_segment_point_cb, tracking_segment_start_cb, tracking_segment_end_cb);
glDisable(GL_BLEND);
/* selected knot handles on top of curves */
@@ -206,7 +207,7 @@ static void draw_frame_curves(SpaceClip *sc)
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
+ MovieTrackingReconstruction *reconstruction= BKE_tracking_get_reconstruction(tracking);
int i, lines= 0, prevfra= 0;
glColor3f(0.0f, 0.0f, 1.0f);
@@ -235,6 +236,7 @@ static void draw_frame_curves(SpaceClip *sc)
void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene)
{
+ MovieClip *clip= ED_space_clip(sc);
View2D *v2d= &ar->v2d;
View2DGrid *grid;
short unitx= V2D_UNIT_FRAMESCALE, unity= V2D_UNIT_VALUES;
@@ -244,11 +246,13 @@ void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene)
UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
UI_view2d_grid_free(grid);
- if(sc->flag&SC_SHOW_GRAPH_TRACKS)
- draw_tracks_curves(v2d, sc);
+ if(clip) {
+ if(sc->flag&SC_SHOW_GRAPH_TRACKS)
+ draw_tracks_curves(v2d, sc);
- if(sc->flag&SC_SHOW_GRAPH_FRAMES)
- draw_frame_curves(sc);
+ if(sc->flag&SC_SHOW_GRAPH_FRAMES)
+ draw_frame_curves(sc);
+ }
/* current frame */
draw_graph_cfra(sc, ar, scene);
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c
index 56ca1632bae..08d6bcf47bc 100644
--- a/source/blender/editors/space_clip/clip_graph_ops.c
+++ b/source/blender/editors/space_clip/clip_graph_ops.c
@@ -155,13 +155,14 @@ static int mouse_select_knot(bContext *C, float co[2], int extend)
ARegion *ar= CTX_wm_region(C);
View2D *v2d= &ar->v2d;
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
static const int delta= 6;
- if(tracking->act_track) {
+ if(act_track) {
MouseSelectUserData userdata;
mouse_select_init_data(&userdata, co);
- clip_graph_tracking_values_iterate_track(sc, tracking->act_track,
+ clip_graph_tracking_values_iterate_track(sc, act_track,
&userdata, find_nearest_tracking_knot_cb, NULL, NULL);
if(userdata.marker) {
@@ -191,6 +192,7 @@ static int mouse_select_curve(bContext *C, float co[2], int extend)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
MouseSelectUserData userdata;
mouse_select_init_data(&userdata, co);
@@ -198,12 +200,12 @@ static int mouse_select_curve(bContext *C, float co[2], int extend)
if(userdata.track) {
if(extend) {
- if(tracking->act_track==userdata.track) {
+ if(act_track==userdata.track) {
/* currently only single curve can be selected (selected curve represents active track) */
- tracking->act_track= NULL;
+ act_track= NULL;
}
}
- else if(tracking->act_track!=userdata.track) {
+ else if(act_track!=userdata.track) {
MovieTrackingMarker *marker;
SelectUserData selectdata = {SEL_DESELECT};
@@ -292,9 +294,11 @@ static int delete_curve_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
- if(tracking->act_track)
- clip_delete_track(C, clip, tracking->act_track);
+ if(act_track)
+ clip_delete_track(C, clip, tracksbase, act_track);
return OPERATOR_FINISHED;
}
@@ -322,16 +326,17 @@ static int delete_knot_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
- if(tracking->act_track) {
+ if(act_track) {
int a= 0;
- MovieTrackingTrack *track= tracking->act_track;
- while(a<track->markersnr) {
- MovieTrackingMarker *marker= &track->markers[a];
+ while(a<act_track->markersnr) {
+ MovieTrackingMarker *marker= &act_track->markers[a];
if(marker->flag&MARKER_GRAPH_SEL)
- clip_delete_marker(C, clip, track, marker);
+ clip_delete_marker(C, clip, tracksbase, act_track, marker);
else
a++;
}
diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h
index da0b589652e..64881499a31 100644
--- a/source/blender/editors/space_clip/clip_intern.h
+++ b/source/blender/editors/space_clip/clip_intern.h
@@ -92,8 +92,8 @@ void clip_graph_tracking_values_iterate(struct SpaceClip *sc, void *userdata,
void clip_graph_tracking_iterate(struct SpaceClip *sc, void *userdata,
void (*func) (void *userdata, struct MovieTrackingMarker *marker));
-void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track);
-void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
+void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct ListBase *tracksbase, struct MovieTrackingTrack *track);
+void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct ListBase *tracksbase, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
void clip_view_center_to_point(struct SpaceClip *sc, float x, float y);
@@ -124,6 +124,7 @@ void CLIP_OT_set_origin(struct wmOperatorType *ot);
void CLIP_OT_set_floor(struct wmOperatorType *ot);
void CLIP_OT_set_axis(struct wmOperatorType *ot);
void CLIP_OT_set_scale(struct wmOperatorType *ot);
+void CLIP_OT_set_solution_scale(struct wmOperatorType *ot);
void CLIP_OT_set_center_principal(struct wmOperatorType *ot);
@@ -139,6 +140,9 @@ void CLIP_OT_stabilize_2d_remove(struct wmOperatorType *ot);
void CLIP_OT_stabilize_2d_select(struct wmOperatorType *ot);
void CLIP_OT_stabilize_2d_set_rotation(struct wmOperatorType *ot);
-void CLIP_OT_clean_tracks(wmOperatorType *ot);
+void CLIP_OT_clean_tracks(struct wmOperatorType *ot);
+
+void CLIP_OT_tracking_object_new(struct wmOperatorType *ot);
+void CLIP_OT_tracking_object_remove(struct wmOperatorType *ot);
#endif /* ED_CLIP_INTERN_H */
diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c
index c4a858797e5..fe0b58ddda9 100644
--- a/source/blender/editors/space_clip/clip_ops.c
+++ b/source/blender/editors/space_clip/clip_ops.c
@@ -201,7 +201,7 @@ void CLIP_OT_open(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Open Clip";
- ot->description= "Open clip";
+ ot->description= "Load a sequence of frames or a movie file";
ot->idname= "CLIP_OT_open";
/* api callbacks */
@@ -827,6 +827,7 @@ typedef struct ProxyBuildJob {
Scene *scene;
struct Main *main;
MovieClip *clip;
+ int clip_flag;
} ProxyJob;
static void proxy_freejob(void *pjv)
@@ -877,10 +878,10 @@ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *prog
for(cfra= sfra; cfra<=efra; cfra++) {
if(clip->source != MCLIP_SRC_MOVIE)
- BKE_movieclip_build_proxy_frame(clip, NULL, cfra, build_sizes, build_count, 0);
+ BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, NULL, cfra, build_sizes, build_count, 0);
if(undistort)
- BKE_movieclip_build_proxy_frame(clip, distortion, cfra, build_sizes, build_count, 1);
+ BKE_movieclip_build_proxy_frame(clip, pj->clip_flag, distortion, cfra, build_sizes, build_count, 1);
if(*stop || G.afbreek)
break;
@@ -893,7 +894,7 @@ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *prog
BKE_tracking_distortion_destroy(distortion);
}
-static int sequencer_rebuild_proxy_exec(bContext *C, wmOperator *UNUSED(op))
+static int clip_rebuild_proxy_exec(bContext *C, wmOperator *UNUSED(op))
{
wmJob * steve;
ProxyJob *pj;
@@ -911,6 +912,7 @@ static int sequencer_rebuild_proxy_exec(bContext *C, wmOperator *UNUSED(op))
pj->scene= scene;
pj->main= CTX_data_main(C);
pj->clip= clip;
+ pj->clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
WM_jobs_customdata(steve, pj, proxy_freejob);
WM_jobs_timer(steve, 0.2, NC_MOVIECLIP|ND_DISPLAY, 0);
@@ -929,10 +931,10 @@ void CLIP_OT_rebuild_proxy(wmOperatorType *ot)
/* identifiers */
ot->name= "Rebuild Proxy and Timecode Indices";
ot->idname= "CLIP_OT_rebuild_proxy";
- ot->description= "Rebuild all selected proxies and timecode indeces in the background";
+ ot->description= "Rebuild all selected proxies and timecode indices in the background";
/* api callbacks */
- ot->exec= sequencer_rebuild_proxy_exec;
+ ot->exec= clip_rebuild_proxy_exec;
ot->poll= ED_space_clip_poll;
/* flags */
diff --git a/source/blender/editors/space_clip/clip_toolbar.c b/source/blender/editors/space_clip/clip_toolbar.c
index fe09c5cd829..941c12df4aa 100644
--- a/source/blender/editors/space_clip/clip_toolbar.c
+++ b/source/blender/editors/space_clip/clip_toolbar.c
@@ -212,6 +212,7 @@ static void clip_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOp
}
}
+/* TODO de-duplicate redo panel functions - campbell */
static void clip_panel_operator_redo(const bContext *C, Panel *pa)
{
wmOperator *op= WM_operator_last_redo(C);
@@ -224,7 +225,7 @@ static void clip_panel_operator_redo(const bContext *C, Panel *pa)
block= uiLayoutGetBlock(pa->layout);
- if(ED_undo_valid(C, op->type->name)==0)
+ if (!WM_operator_check_ui_enabled(C, op->type->name))
uiLayoutSetEnabled(pa->layout, 0);
/* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c
index 649b278ab3d..3ca8fc35c7f 100644
--- a/source/blender/editors/space_clip/clip_utils.c
+++ b/source/blender/editors/space_clip/clip_utils.c
@@ -119,9 +119,10 @@ void clip_graph_tracking_values_iterate(SpaceClip *sc, void *userdata,
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
clip_graph_tracking_values_iterate_track(sc, track, userdata, func, segment_start, segment_end);
@@ -136,9 +137,10 @@ void clip_graph_tracking_iterate(SpaceClip *sc, void *userdata,
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
int i;
@@ -158,14 +160,15 @@ void clip_graph_tracking_iterate(SpaceClip *sc, void *userdata,
}
}
-void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
+void clip_delete_track(bContext *C, MovieClip *clip, ListBase *tracksbase, MovieTrackingTrack *track)
{
MovieTracking *tracking= &clip->tracking;
MovieTrackingStabilization *stab= &tracking->stabilization;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
int has_bundle= 0, update_stab= 0;
- if(track==tracking->act_track)
+ if(track==act_track)
tracking->act_track= NULL;
if(track==stab->rot_track) {
@@ -179,7 +182,7 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
has_bundle= 1;
BKE_tracking_free_track(track);
- BLI_freelinkN(&tracking->tracks, track);
+ BLI_freelinkN(tracksbase, track);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
@@ -194,10 +197,10 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
-void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
+void clip_delete_marker(bContext *C, MovieClip *clip, ListBase *tracksbase, MovieTrackingTrack *track, MovieTrackingMarker *marker)
{
if(track->markersnr==1) {
- clip_delete_track(C, clip, track);
+ clip_delete_track(C, clip, tracksbase, track);
}
else {
BKE_tracking_delete_marker(track, marker->framenr);
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index c8577f7760e..5291121571c 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -351,6 +351,7 @@ static void clip_operatortypes(void)
WM_operatortype_append(CLIP_OT_set_floor);
WM_operatortype_append(CLIP_OT_set_axis);
WM_operatortype_append(CLIP_OT_set_scale);
+ WM_operatortype_append(CLIP_OT_set_solution_scale);
/* detect */
WM_operatortype_append(CLIP_OT_detect_features);
@@ -372,6 +373,10 @@ static void clip_operatortypes(void)
WM_operatortype_append(CLIP_OT_graph_select);
WM_operatortype_append(CLIP_OT_graph_delete_curve);
WM_operatortype_append(CLIP_OT_graph_delete_knot);
+
+ /* object tracking */
+ WM_operatortype_append(CLIP_OT_tracking_object_new);
+ WM_operatortype_append(CLIP_OT_tracking_object_remove);
}
static void clip_keymap(struct wmKeyConfig *keyconf)
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index 89c58ab5d81..d6940d14dbf 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_movieclip_types.h"
#include "DNA_object_types.h" /* SELECT */
@@ -45,6 +46,7 @@
#include "BKE_main.h"
#include "BKE_context.h"
+#include "BKE_constraint.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
#include "BKE_global.h"
@@ -90,41 +92,21 @@ static int space_clip_frame_poll(bContext *C)
return 0;
}
-static int space_clip_frame_camera_poll(bContext *C)
-{
- Scene *scene= CTX_data_scene(C);
-
- if(space_clip_frame_poll(C)) {
- return scene->camera != NULL;
- }
-
- return 0;
-}
-
-static int space_clip_camera_poll(bContext *C)
-{
- SpaceClip *sc= CTX_wm_space_clip(C);
- Scene *scene= CTX_data_scene(C);
-
- if(sc && sc->clip && scene->camera)
- return 1;
-
- return 0;
-}
-
/********************** add marker operator *********************/
static void add_marker(SpaceClip *sc, float x, float y)
{
MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
int width, height;
ED_space_clip_size(sc, &width, &height);
- track= BKE_tracking_add_track(&clip->tracking, x, y, sc->user.framenr, width, height);
+ track= BKE_tracking_add_track(tracking, tracksbase, x, y, sc->user.framenr, width, height);
- BKE_tracking_select_track(&clip->tracking, track, TRACK_AREA_ALL, 0);
+ BKE_tracking_select_track(tracksbase, track, TRACK_AREA_ALL, 0);
clip->tracking.act_track= track;
}
@@ -191,13 +173,14 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track= tracking->tracks.first, *next;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track= tracksbase->first, *next;
while(track) {
next= track->next;
if(TRACK_VIEW_SELECTED(sc, track))
- clip_delete_track(C, clip, track);
+ clip_delete_track(C, clip, tracksbase, track);
track= next;
}
@@ -230,7 +213,8 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
- MovieTrackingTrack *track= clip->tracking.tracks.first, *next;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
+ MovieTrackingTrack *track= tracksbase->first, *next;
int framenr= sc->user.framenr;
int has_selection= 0;
@@ -243,7 +227,7 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
if(marker) {
has_selection|= track->markersnr>1;
- clip_delete_marker(C, clip, track, marker);
+ clip_delete_marker(C, clip, tracksbase, track, marker);
}
}
@@ -429,6 +413,7 @@ static void *slide_marker_customdata(bContext *C, wmEvent *event)
int width, height;
float co[2];
void *customdata= NULL;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
ED_space_clip_size(sc, &width, &height);
@@ -437,7 +422,7 @@ static void *slide_marker_customdata(bContext *C, wmEvent *event)
ED_clip_mouse_pos(C, event, co);
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_LOCKED)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr);
@@ -721,12 +706,12 @@ static float dist_to_rect(float co[2], float pos[2], float min[2], float max[2])
return MIN4(d1, d2, d3, d4);
}
-static MovieTrackingTrack *find_nearest_track(SpaceClip *sc, MovieClip *clip, float co[2])
+static MovieTrackingTrack *find_nearest_track(SpaceClip *sc, ListBase *tracksbase, float co[2])
{
MovieTrackingTrack *track= NULL, *cur;
float mindist= 0.0f;
- cur= clip->tracking.tracks.first;
+ cur= tracksbase->first;
while(cur) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(cur, sc->user.framenr);
@@ -764,10 +749,11 @@ static int mouse_select(bContext *C, float co[2], int extend)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *act_track= tracking->act_track;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
MovieTrackingTrack *track= NULL; /* selected marker */
- track= find_nearest_track(sc, clip, co);
+ track= find_nearest_track(sc, tracksbase, co);
if(track) {
int area= track_mouse_area(sc, co, track);
@@ -784,7 +770,7 @@ static int mouse_select(bContext *C, float co[2], int extend)
if(area==TRACK_AREA_POINT)
area= TRACK_AREA_ALL;
- BKE_tracking_select_track(tracking, track, area, extend);
+ BKE_tracking_select_track(tracksbase, track, area, extend);
clip->tracking.act_track= track;
}
}
@@ -867,6 +853,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
rcti rect;
rctf rectf;
int change= 0, mode, extend;
@@ -884,7 +871,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
extend= RNA_boolean_get(op->ptr, "extend");
/* do actual selection */
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr);
@@ -952,6 +939,7 @@ static int circle_select_exec(bContext *C, wmOperator *op)
MovieClip *clip= ED_space_clip(sc);
ARegion *ar= CTX_wm_region(C);
MovieTrackingTrack *track;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
int x, y, radius, width, height, mode, change= 0;
float zoomx, zoomy, offset[2], ellipse[2];
@@ -972,7 +960,7 @@ static int circle_select_exec(bContext *C, wmOperator *op)
ED_clip_point_stable_pos(C, x, y, &offset[0], &offset[1]);
/* do selection */
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr);
@@ -1026,13 +1014,14 @@ static int select_all_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track= NULL; /* selected track */
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
int action= RNA_enum_get(op->ptr, "action");
int framenr= sc->user.framenr;
int has_selection= 0;
if(action == SEL_TOGGLE){
action= SEL_SELECT;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
action= SEL_DESELECT;
@@ -1043,7 +1032,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
}
}
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
@@ -1108,9 +1097,11 @@ static int select_groped_exec(bContext *C, wmOperator *op)
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track;
MovieTrackingMarker *marker;
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
int group= RNA_enum_get(op->ptr, "group");
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
int ok= 0;
@@ -1132,11 +1123,13 @@ static int select_groped_exec(bContext *C, wmOperator *op)
ok= marker->flag&MARKER_DISABLED;
}
else if(group==5) { /* color */
- if(clip->tracking.act_track) {
- ok= (track->flag&TRACK_CUSTOMCOLOR) == (clip->tracking.act_track->flag&TRACK_CUSTOMCOLOR);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
+
+ if(act_track) {
+ ok= (track->flag&TRACK_CUSTOMCOLOR) == (act_track->flag&TRACK_CUSTOMCOLOR);
if(ok && track->flag&TRACK_CUSTOMCOLOR)
- ok= equals_v3v3(track->color, clip->tracking.act_track->color);
+ ok= equals_v3v3(track->color, act_track->color);
}
}
else if(group==6) { /* failed */
@@ -1208,12 +1201,18 @@ static int track_markers_testbreak(void)
static int track_count_markers(SpaceClip *sc, MovieClip *clip)
{
int tot= 0;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
+ int framenr= sc->user.framenr;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
- if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_LOCKED)==0)
- tot++;
+ if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_LOCKED)==0) {
+ MovieTrackingMarker *marker= BKE_tracking_exact_marker(track, framenr);
+
+ if (!marker || (marker->flag&MARKER_DISABLED) == 0)
+ tot++;
+ }
track= track->next;
}
@@ -1223,6 +1222,7 @@ static int track_count_markers(SpaceClip *sc, MovieClip *clip)
static void track_init_markers(SpaceClip *sc, MovieClip *clip, int *frames_limit_r)
{
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
int framenr= sc->user.framenr, hidden= 0;
int frames_limit= 0;
@@ -1230,7 +1230,7 @@ static void track_init_markers(SpaceClip *sc, MovieClip *clip, int *frames_limit
if((sc->flag&SC_SHOW_MARKER_PATTERN)==0) hidden|= TRACK_AREA_PAT;
if((sc->flag&SC_SHOW_MARKER_SEARCH)==0) hidden|= TRACK_AREA_SEARCH;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(hidden)
BKE_tracking_track_flag(track, hidden, SELECT, 1);
@@ -1443,6 +1443,11 @@ static int track_markers_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve
int backwards= RNA_boolean_get(op->ptr, "backwards");
int sequence= RNA_boolean_get(op->ptr, "sequence");
+ if(WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C))) {
+ /* only one tracking is allowed at a time */
+ return OPERATOR_CANCELLED;
+ }
+
if(clip->tracking_context)
return OPERATOR_CANCELLED;
@@ -1541,9 +1546,10 @@ static int solve_camera_initjob(bContext *C, SolveCameraJob *scj, wmOperator *op
Scene *scene= CTX_data_scene(C);
MovieTracking *tracking= &clip->tracking;
MovieTrackingSettings *settings= &clip->tracking.settings;
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
int width, height;
- if(!BKE_tracking_can_reconstruct(tracking, error_msg, max_error))
+ if(!BKE_tracking_can_reconstruct(tracking, object, error_msg, max_error))
return 0;
/* could fail if footage uses images with different sizes */
@@ -1554,7 +1560,7 @@ static int solve_camera_initjob(bContext *C, SolveCameraJob *scj, wmOperator *op
scj->reports= op->reports;
scj->user= sc->user;
- scj->context= BKE_tracking_reconstruction_context_new(tracking,
+ scj->context= BKE_tracking_reconstruction_context_new(tracking, object,
settings->keyframe1, settings->keyframe2, width, height);
tracking->stats= MEM_callocN(sizeof(MovieTrackingStats), "solve camera stats");
@@ -1607,9 +1613,6 @@ static void solve_camera_freejob(void *scv)
id_us_plus(&clip->id);
/* set blender camera focal length so result would look fine there */
- if(!scene->camera)
- scene->camera= scene_find_camera(scene);
-
if(scene->camera) {
Camera *camera= (Camera*)scene->camera->data;
int width, height;
@@ -1665,9 +1668,15 @@ static int solve_camera_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingReconstruction *reconstruction= BKE_tracking_get_reconstruction(tracking);
wmJob *steve;
char error_msg[256]= "\0";
+ if(WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C))) {
+ /* only one solve is allowed at a time */
+ return OPERATOR_CANCELLED;
+ }
+
scj= MEM_callocN(sizeof(SolveCameraJob), "SolveCameraJob data");
if(!solve_camera_initjob(C, scj, op, error_msg, sizeof(error_msg))) {
if(error_msg[0])
@@ -1681,7 +1690,7 @@ static int solve_camera_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even
BLI_strncpy(tracking->stats->message, "Solving camera | Preparing solve", sizeof(tracking->stats->message));
/* hide reconstruction statistics from previous solve */
- clip->tracking.reconstruction.flag&= ~TRACKING_RECONSTRUCTED;
+ reconstruction->flag&= ~TRACKING_RECONSTRUCTED;
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
/* setup job */
@@ -1741,7 +1750,9 @@ static int clear_solution_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track= tracking->tracks.first;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
+ MovieTrackingReconstruction *reconstruction= BKE_tracking_get_reconstruction(tracking);
+ MovieTrackingTrack *track= tracksbase->first;
while(track) {
track->flag&= ~TRACK_HAS_BUNDLE;
@@ -1749,13 +1760,13 @@ static int clear_solution_exec(bContext *C, wmOperator *UNUSED(op))
track= track->next;
}
- if(tracking->reconstruction.cameras)
- MEM_freeN(tracking->reconstruction.cameras);
+ if(reconstruction->cameras)
+ MEM_freeN(reconstruction->cameras);
- tracking->reconstruction.cameras= NULL;
- tracking->reconstruction.camnr= 0;
+ reconstruction->cameras= NULL;
+ reconstruction->camnr= 0;
- tracking->reconstruction.flag&= ~TRACKING_RECONSTRUCTED;
+ reconstruction->flag&= ~TRACKING_RECONSTRUCTED;
DAG_id_tag_update(&clip->id, 0);
@@ -1787,9 +1798,10 @@ static int clear_track_path_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track;
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
int action= RNA_enum_get(op->ptr, "action");
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track))
BKE_tracking_clear_path(track, sc->user.framenr, action);
@@ -1834,7 +1846,8 @@ static int disable_markers_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track= tracking->tracks.first;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track= tracksbase->first;
int action= RNA_enum_get(op->ptr, "action");
while(track) {
@@ -1883,14 +1896,80 @@ void CLIP_OT_disable_markers(wmOperatorType *ot)
/********************** set origin operator *********************/
+static Object *get_camera_with_movieclip(Scene *scene, MovieClip *clip)
+{
+ Object *camera= scene->camera;
+ Base *base;
+
+ if(camera && object_get_movieclip(scene, camera, 0)==clip)
+ return camera;
+
+ base= scene->base.first;
+ while(base) {
+ if(base->object->type == OB_CAMERA) {
+ if(object_get_movieclip(scene, base->object, 0)==clip) {
+ camera= base->object;
+ break;
+ }
+ }
+
+ base= base->next;
+ }
+
+ return camera;
+}
+
+static Object *get_orientation_object(bContext *C)
+{
+ Scene *scene= CTX_data_scene(C);
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= BKE_tracking_active_object(tracking);
+ Object *object= NULL;
+
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ object= get_camera_with_movieclip(scene, clip);
+ }
+ else {
+ object= OBACT;
+ }
+
+ if(object && object->parent)
+ object= object->parent;
+
+ return object;
+}
+
+static int set_orientation_poll(bContext *C)
+{
+ if(space_clip_frame_poll(C)) {
+ Scene *scene= CTX_data_scene(C);
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= BKE_tracking_active_object(tracking);
+
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ return 1;
+ }
+ else {
+ return OBACT != NULL;
+ }
+ }
+
+ return 0;
+}
+
static int count_selected_bundles(bContext *C)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
int tot= 0;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_HAS_BUNDLE))
tot++;
@@ -1901,38 +1980,115 @@ static int count_selected_bundles(bContext *C)
return tot;
}
+static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
+{
+ bConstraint *con;
+ int found= 0;
+
+ for (con= ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ if(!cti)
+ continue;
+
+ if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data= (bObjectSolverConstraint *)con->data;
+
+ if(!found) {
+ Object *cam= data->camera ? data->camera : scene->camera;
+
+ where_is_object_mat(scene, cam, invmat);
+ }
+
+ mult_m4_m4m4(invmat, invmat, data->invmat);
+
+ found= 1;
+ }
+ }
+
+ if(found)
+ invert_m4(invmat);
+ else
+ unit_m4(invmat);
+}
+
+static Object *object_solver_camera(Scene *scene, Object *ob)
+{
+ bConstraint *con;
+
+ for (con= ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ if(!cti)
+ continue;
+
+ if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data= (bObjectSolverConstraint *)con->data;
+
+ return data->camera ? data->camera : scene->camera;
+ }
+ }
+
+ return NULL;
+}
+
static int set_origin_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
+ MovieTrackingObject *tracking_object;
Scene *scene= CTX_data_scene(C);
- Object *parent= scene->camera;
- float mat[4][4], vec[3];
+ Object *object;
+ Object *camera= get_camera_with_movieclip(scene, clip);
+ ListBase *tracksbase;
+ float mat[4][4], vec[3], median[3];
+ int selected_count= count_selected_bundles(C);
+
+ if(selected_count==0) {
+ BKE_report(op->reports, RPT_ERROR, "At least one track with bundle should be selected to define origin position");
- if(count_selected_bundles(C)!=1) {
- BKE_report(op->reports, RPT_ERROR, "Track with bundle should be selected to define origin position");
return OPERATOR_CANCELLED;
}
- if(scene->camera->parent)
- parent= scene->camera->parent;
+ object= get_orientation_object(C);
+ if(!object) {
+ BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
- track= clip->tracking.tracks.first;
+ return OPERATOR_CANCELLED;
+ }
+
+ tracking_object= BKE_tracking_active_object(tracking);
+
+ tracksbase= BKE_tracking_object_tracks(tracking, tracking_object);
+
+ track= tracksbase->first;
+ zero_v3(median);
while(track) {
- if(TRACK_VIEW_SELECTED(sc, track))
- break;
+ if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_HAS_BUNDLE)) {
+ add_v3_v3(median, track->bundle_pos);
+ }
track= track->next;
}
+ mul_v3_fl(median, 1.0f/selected_count);
- BKE_get_tracking_mat(scene, NULL, mat);
- mul_v3_m4v3(vec, mat, track->bundle_pos);
+ BKE_get_tracking_mat(scene, camera, mat);
- sub_v3_v3(parent->loc, vec);
+ mul_v3_m4v3(vec, mat, median);
+
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ sub_v3_v3(object->loc, vec);
+ }
+ else {
+ object_solver_inverted_matrix(scene, object, mat);
+ mul_v3_m4v3(vec, mat, vec);
+ copy_v3_v3(object->loc, vec);
+ }
DAG_id_tag_update(&clip->id, 0);
- DAG_id_tag_update(&parent->id, OB_RECALC_OB);
+ DAG_id_tag_update(&object->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -1949,20 +2105,42 @@ void CLIP_OT_set_origin(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_origin_exec;
- ot->poll= space_clip_frame_camera_poll;
+ ot->poll= set_orientation_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "use_median", 0, "Use Median", "Set origin to median point of selected bundles");
}
/********************** set floor operator *********************/
-static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char axis)
+static void set_axis(Scene *scene, Object *ob, MovieClip *clip, MovieTrackingObject *tracking_object,
+ MovieTrackingTrack *track, char axis)
{
- float mat[4][4], vec[3], obmat[4][4];
+ Object *camera= get_camera_with_movieclip(scene, clip);
+ int is_camera= tracking_object->flag&TRACKING_OBJECT_CAMERA;
+ int flip= 0;
+ float mat[4][4], vec[3], obmat[4][4], dvec[3];
+
+ object_to_mat4(ob, obmat);
- BKE_get_tracking_mat(scene, NULL, mat);
+ BKE_get_tracking_mat(scene, camera, mat);
mul_v3_m4v3(vec, mat, track->bundle_pos);
+ copy_v3_v3(dvec, vec);
+
+ if(!is_camera) {
+ float imat[4][4];
+
+ object_solver_inverted_matrix(scene, ob, imat);
+ mul_v3_m4v3(vec, imat, vec);
+
+ invert_m4_m4(imat, obmat);
+ mul_v3_m4v3(dvec, imat, vec);
+
+ sub_v3_v3(vec, obmat[3]);
+ }
if(len_v2(vec) < 1e-3f)
return;
@@ -1970,26 +2148,48 @@ static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char
unit_m4(mat);
if(axis=='X') {
- if(fabsf(vec[1])<1e-3f) {
+ if(fabsf(dvec[1])<1e-3f) {
+ flip= 1;
+
mat[0][0]= -1.0f; mat[0][1]= 0.0f; mat[0][2]= 0.0f;
mat[1][0]= 0.0f; mat[1][1]= -1.0f; mat[1][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
} else {
copy_v3_v3(mat[0], vec);
- mat[0][2]= 0.0f;
- mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
- cross_v3_v3v3(mat[1], mat[2], mat[0]);
+
+ if(is_camera || fabsf(vec[2])<1e-3f) {
+ mat[0][2]= 0.0f;
+ mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
+ cross_v3_v3v3(mat[1], mat[2], mat[0]);
+ }
+ else {
+ vec[2]= 0.0f;
+
+ cross_v3_v3v3(mat[1], mat[0], vec);
+ cross_v3_v3v3(mat[2], mat[0], mat[1]);
+ }
}
} else {
- if(fabsf(vec[0])<1e-3f) {
+ if(fabsf(dvec[0])<1e-3f) {
+ flip= 1;
+
mat[0][0]= -1.0f; mat[0][1]= 0.0f; mat[0][2]= 0.0f;
mat[1][0]= 0.0f; mat[1][1]= -1.0f; mat[1][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
} else {
copy_v3_v3(mat[1], vec);
- mat[1][2]= 0.0f;
- mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
- cross_v3_v3v3(mat[0], mat[1], mat[2]);
+
+ if(is_camera || fabsf(vec[2])<1e-3f) {
+ mat[1][2]= 0.0f;
+ mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
+ cross_v3_v3v3(mat[0], mat[1], mat[2]);
+ }
+ else {
+ vec[2]= 0.0f;
+
+ cross_v3_v3v3(mat[0], vec, mat[1]);
+ cross_v3_v3v3(mat[2], mat[0], mat[1]);
+ }
}
}
@@ -1997,10 +2197,30 @@ static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char
normalize_v3(mat[1]);
normalize_v3(mat[2]);
- invert_m4(mat);
+ if(is_camera) {
+ invert_m4(mat);
+
+ mult_m4_m4m4(mat, mat, obmat);
+ }
+ else {
+ if(!flip) {
+ float lmat[4][4], ilmat[4][4], rmat[3][3];
+
+ object_rot_to_mat3(ob, rmat);
+ invert_m3(rmat);
+ mul_m4_m4m3(mat, mat, rmat);
+
+ unit_m4(lmat);
+ copy_v3_v3(lmat[3], obmat[3]);
+ invert_m4_m4(ilmat, lmat);
+
+ mul_serie_m4(mat, lmat, mat, ilmat, obmat, NULL, NULL, NULL, NULL);
+ }
+ else {
+ mult_m4_m4m4(mat, obmat, mat);
+ }
+ }
- object_to_mat4(ob, obmat);
- mul_m4_m4m4(mat, obmat, mat);
object_apply_mat4(ob, mat, 0, 0);
}
@@ -2009,9 +2229,12 @@ static int set_floor_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
Scene *scene= CTX_data_scene(C);
- MovieTrackingTrack *track, *axis_track= NULL;
- Object *camera= scene->camera;
- Object *parent= camera;
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object;
+ MovieTrackingTrack *track, *axis_track= NULL, *act_track;
+ ListBase *tracksbase;
+ Object *object;
+ Object *camera= get_camera_with_movieclip(scene, clip);
int tot= 0;
float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3]= {0.0f, 0.0f, 0.0f};
float rot[4][4]={{0.0f, 0.0f, -1.0f, 0.0f},
@@ -2021,21 +2244,30 @@ static int set_floor_exec(bContext *C, wmOperator *op)
if(count_selected_bundles(C)!=3) {
BKE_report(op->reports, RPT_ERROR, "Three tracks with bundles are needed to orient the floor");
+
return OPERATOR_CANCELLED;
}
- if(scene->camera->parent)
- parent= scene->camera->parent;
+ tracking_object= BKE_tracking_active_object(tracking);
+ tracksbase= BKE_tracking_object_tracks(tracking, tracking_object);
+ act_track= BKE_tracking_active_track(tracking);
+
+ object= get_orientation_object(C);
+ if(!object) {
+ BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
+
+ return OPERATOR_CANCELLED;
+ }
- BKE_get_tracking_mat(scene, NULL, mat);
+ BKE_get_tracking_mat(scene, camera, mat);
/* get 3 bundles to use as reference */
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track && tot<3) {
if(track->flag&TRACK_HAS_BUNDLE && TRACK_VIEW_SELECTED(sc, track)) {
mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
- if(tot==0 || track==clip->tracking.act_track)
+ if(tot==0 || track==act_track)
copy_v3_v3(orig, vec[tot]);
else
axis_track= track;
@@ -2065,25 +2297,30 @@ static int set_floor_exec(bContext *C, wmOperator *op)
mat[3][1]= orig[1];
mat[3][2]= orig[2];
- invert_m4(mat);
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ invert_m4(mat);
- object_to_mat4(parent, obmat);
- mul_m4_m4m4(mat, obmat, mat);
- mul_m4_m4m4(newmat, mat, rot);
- object_apply_mat4(parent, newmat, 0, 0);
+ object_to_mat4(object, obmat);
+ mult_m4_m4m4(mat, mat, obmat);
+ mult_m4_m4m4(newmat, rot, mat);
+ object_apply_mat4(object, newmat, 0, 0);
- /* make camera have positive z-coordinate */
- if(parent->loc[2]<0) {
- invert_m4(rot);
- mul_m4_m4m4(newmat, mat, rot);
- object_apply_mat4(parent, newmat, 0, 0);
+ /* make camera have positive z-coordinate */
+ if(object->loc[2]<0) {
+ invert_m4(rot);
+ mult_m4_m4m4(newmat, rot, mat);
+ object_apply_mat4(object, newmat, 0, 0);
+ }
+ }
+ else {
+ object_apply_mat4(object, mat, 0, 0);
}
- where_is_object(scene, parent);
- set_axis(scene, parent, axis_track, 'X');
+ where_is_object(scene, object);
+ set_axis(scene, object, clip, tracking_object, axis_track, 'X');
DAG_id_tag_update(&clip->id, 0);
- DAG_id_tag_update(&parent->id, OB_RECALC_OB);
+ DAG_id_tag_update(&object->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -2100,7 +2337,7 @@ void CLIP_OT_set_floor(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_floor_exec;
- ot->poll= space_clip_camera_poll;
+ ot->poll= set_orientation_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2112,9 +2349,12 @@ static int set_axis_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= BKE_tracking_active_object(tracking);
MovieTrackingTrack *track;
Scene *scene= CTX_data_scene(C);
- Object *parent= scene->camera;
+ Object *object;
+ ListBase *tracksbase;
int axis= RNA_enum_get(op->ptr, "axis");
if(count_selected_bundles(C)!=1) {
@@ -2123,10 +2363,16 @@ static int set_axis_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if(scene->camera->parent)
- parent= scene->camera->parent;
+ object= get_orientation_object(C);
+ if(!object) {
+ BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
+
+ return OPERATOR_CANCELLED;
+ }
- track= clip->tracking.tracks.first;
+ tracksbase= BKE_tracking_object_tracks(tracking, tracking_object);
+
+ track=tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track))
break;
@@ -2134,10 +2380,10 @@ static int set_axis_exec(bContext *C, wmOperator *op)
track= track->next;
}
- set_axis(scene, parent, track, axis==0?'X':'Y');
+ set_axis(scene, object, clip, tracking_object, track, axis==0?'X':'Y');
DAG_id_tag_update(&clip->id, 0);
- DAG_id_tag_update(&parent->id, OB_RECALC_OB);
+ DAG_id_tag_update(&object->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -2160,7 +2406,7 @@ void CLIP_OT_set_axis(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_axis_exec;
- ot->poll= space_clip_frame_camera_poll;
+ ot->poll= set_orientation_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2171,29 +2417,37 @@ void CLIP_OT_set_axis(wmOperatorType *ot)
/********************** set scale operator *********************/
-static int set_scale_exec(bContext *C, wmOperator *op)
+static int do_set_scale(bContext *C, wmOperator *op, int scale_solution)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= BKE_tracking_active_object(tracking);
MovieTrackingTrack *track;
Scene *scene= CTX_data_scene(C);
- Object *parent= scene->camera;
+ Object *object= NULL;
+ Object *camera= get_camera_with_movieclip(scene, clip);
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
int tot= 0;
float vec[2][3], mat[4][4], scale;
float dist= RNA_float_get(op->ptr, "distance");
if(count_selected_bundles(C)!=2) {
- BKE_report(op->reports, RPT_ERROR, "Two tracks with bundles should be selected to scale scene");
+ BKE_report(op->reports, RPT_ERROR, "Two tracks with bundles should be selected to set scale");
return OPERATOR_CANCELLED;
}
- if(scene->camera->parent)
- parent= scene->camera->parent;
+ object= get_orientation_object(C);
+ if(!object) {
+ BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
+
+ return OPERATOR_CANCELLED;
+ }
- BKE_get_tracking_mat(scene, NULL, mat);
+ BKE_get_tracking_mat(scene, camera, mat);
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
@@ -2208,11 +2462,29 @@ static int set_scale_exec(bContext *C, wmOperator *op)
if(len_v3(vec[0])>1e-5f) {
scale= dist / len_v3(vec[0]);
- mul_v3_fl(parent->size, scale);
- mul_v3_fl(parent->loc, scale);
+ if(tracking_object->flag&TRACKING_OBJECT_CAMERA) {
+ mul_v3_fl(object->size, scale);
+ mul_v3_fl(object->loc, scale);
+ }
+ else if(!scale_solution){
+ Object *solver_camera= object_solver_camera(scene, object);
+
+ object->size[0]= object->size[1]= object->size[2]= 1.0f/scale;
+
+ if(solver_camera) {
+ object->size[0]/= solver_camera->size[0];
+ object->size[1]/= solver_camera->size[1];
+ object->size[2]/= solver_camera->size[2];
+ }
+ }
+ else {
+ tracking_object->scale= scale;
+ }
DAG_id_tag_update(&clip->id, 0);
- DAG_id_tag_update(&parent->id, OB_RECALC_OB);
+
+ if(object)
+ DAG_id_tag_update(&object->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -2221,6 +2493,11 @@ static int set_scale_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+static int set_scale_exec(bContext *C, wmOperator *op)
+{
+ return do_set_scale(C, op, 0);
+}
+
static int set_scale_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceClip *sc= CTX_wm_space_clip(C);
@@ -2243,7 +2520,60 @@ void CLIP_OT_set_scale(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_scale_exec;
ot->invoke= set_scale_invoke;
- ot->poll= space_clip_frame_camera_poll;
+ ot->poll= set_orientation_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_float(ot->srna, "distance", 0.0f, -FLT_MAX, FLT_MAX,
+ "Distance", "Distance between selected tracks", -100.0f, 100.0f);
+}
+
+/********************** set solution scale operator *********************/
+
+static int set_solution_scale_poll(bContext *C)
+{
+ if(space_clip_frame_poll(C)) {
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object= BKE_tracking_active_object(tracking);
+
+ return (tracking_object->flag&TRACKING_OBJECT_CAMERA) == 0;
+ }
+
+ return 0;
+}
+
+static int set_solution_scale_exec(bContext *C, wmOperator *op)
+{
+ return do_set_scale(C, op, 1);
+}
+
+static int set_solution_scale_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ float dist= RNA_float_get(op->ptr, "distance");
+
+ if(dist==0.0f)
+ RNA_float_set(op->ptr, "distance", clip->tracking.settings.object_distance);
+
+ return set_solution_scale_exec(C, op);
+}
+
+void CLIP_OT_set_solution_scale(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Solution Scale";
+ ot->description= "Set object solution scale using distance between two selected tracks";
+ ot->idname= "CLIP_OT_set_solution_scale";
+
+ /* api callbacks */
+ ot->exec= set_solution_scale_exec;
+ ot->invoke= set_solution_scale_invoke;
+ ot->poll= set_solution_scale_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2296,11 +2626,14 @@ static int hide_tracks_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTrackingTrack *track;
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
int unselected;
unselected= RNA_boolean_get(op->ptr, "unselected");
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(unselected==0 && TRACK_VIEW_SELECTED(sc, track)) {
track->flag|= TRACK_HIDDEN;
@@ -2311,7 +2644,7 @@ static int hide_tracks_exec(bContext *C, wmOperator *op)
track= track->next;
}
- if(clip->tracking.act_track && clip->tracking.act_track->flag&TRACK_HIDDEN)
+ if(act_track && act_track->flag&TRACK_HIDDEN)
clip->tracking.act_track= NULL;
if(unselected==0) {
@@ -2348,9 +2681,10 @@ static int hide_tracks_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
track->flag&= ~TRACK_HIDDEN;
@@ -2401,8 +2735,11 @@ static int detect_features_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
- ImBuf *ibuf= BKE_movieclip_get_ibuf_flag(clip, &sc->user, 0);
- MovieTrackingTrack *track= clip->tracking.tracks.first;
+ int clip_flag= clip->flag&MCLIP_TIMECODE_FLAGS;
+ ImBuf *ibuf= BKE_movieclip_get_ibuf_flag(clip, &sc->user, clip_flag);
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track= tracksbase->first;
int placement= RNA_enum_get(op->ptr, "placement");
int margin= RNA_int_get(op->ptr, "margin");
int min_trackability= RNA_int_get(op->ptr, "min_trackability");
@@ -2424,7 +2761,8 @@ static int detect_features_exec(bContext *C, wmOperator *op)
track= track->next;
}
- BKE_tracking_detect_fast(&clip->tracking, ibuf, sc->user.framenr, margin, min_trackability, min_distance, layer, place_outside_layer);
+ BKE_tracking_detect_fast(tracking, tracksbase, ibuf, sc->user.framenr, margin,
+ min_trackability, min_distance, layer, place_outside_layer);
IMB_freeImBuf(ibuf);
@@ -2473,7 +2811,7 @@ static int frame_jump_exec(bContext *C, wmOperator *op)
int delta;
if(pos<=1) { /* jump to path */
- track= clip->tracking.act_track;
+ track= BKE_tracking_active_track(&clip->tracking);
if(!track)
return OPERATOR_CANCELLED;
@@ -2493,13 +2831,16 @@ static int frame_jump_exec(bContext *C, wmOperator *op)
if(clip->tracking.reconstruction.flag&TRACKING_RECONSTRUCTED) {
int a= sc->user.framenr;
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *object= BKE_tracking_active_object(tracking);
delta= pos == 3 ? 1 : -1;
a+= delta;
while(a+delta >= SFRA && a+delta <= EFRA) {
- MovieReconstructedCamera *cam= BKE_tracking_get_reconstructed_camera(tracking, a);
+ MovieReconstructedCamera *cam;
+
+ cam= BKE_tracking_get_reconstructed_camera(tracking, object, a);
if(!cam) {
sc->user.framenr= a;
@@ -2556,16 +2897,18 @@ static int join_tracks_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *act_track, *track, *next;
- act_track= clip->tracking.act_track;
+ act_track= BKE_tracking_active_track(tracking);
if(!act_track) {
BKE_report(op->reports, RPT_ERROR, "No active track to join to");
return OPERATOR_CANCELLED;
}
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && track!=act_track) {
if(!BKE_tracking_test_join_tracks(act_track, track)) {
@@ -2577,7 +2920,7 @@ static int join_tracks_exec(bContext *C, wmOperator *op)
track= track->next;
}
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
next= track->next;
@@ -2585,7 +2928,7 @@ static int join_tracks_exec(bContext *C, wmOperator *op)
BKE_tracking_join_tracks(act_track, track);
BKE_tracking_free_track(track);
- BLI_freelinkN(&clip->tracking.tracks, track);
+ BLI_freelinkN(tracksbase, track);
}
track= next;
@@ -2618,7 +2961,8 @@ static int lock_tracks_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track= tracking->tracks.first;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track= tracksbase->first;
int action= RNA_enum_get(op->ptr, "action");
while(track) {
@@ -2667,12 +3011,14 @@ static int track_copy_color_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
- MovieTrackingTrack *track, *act_track= clip->tracking.act_track;
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track, *act_track= BKE_tracking_active_track(tracking);
if(!act_track)
return OPERATOR_CANCELLED;
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && track!=act_track) {
track->flag&= ~TRACK_CUSTOMCOLOR;
@@ -2713,11 +3059,12 @@ static int stabilize_2d_add_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
MovieTrackingStabilization *stab= &tracking->stabilization;
int update= 0;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_USE_2D_STAB)==0) {
track->flag|= TRACK_USE_2D_STAB;
@@ -2762,10 +3109,11 @@ static int stabilize_2d_remove_exec(bContext *C, wmOperator *UNUSED(op))
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MovieTrackingStabilization *stab= &tracking->stabilization;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
int a= 0, update= 0;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(track->flag&TRACK_USE_2D_STAB) {
if(a==stab->act_track) {
@@ -2820,10 +3168,11 @@ static int stabilize_2d_select_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
int update= 0;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
if(track->flag&TRACK_USE_2D_STAB) {
BKE_tracking_track_flag(track, TRACK_AREA_ALL, SELECT, 0);
@@ -2862,11 +3211,12 @@ static int stabilize_2d_set_rotation_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking);
- if(tracking->act_track) {
+ if(act_track) {
MovieTrackingStabilization *stab= &tracking->stabilization;
- stab->rot_track= tracking->act_track;
+ stab->rot_track= act_track;
stab->ok= 0;
DAG_id_tag_update(&clip->id, 0);
@@ -2991,7 +3341,8 @@ static int clean_tracks_exec(bContext *C, wmOperator *op)
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
- MovieTrackingTrack *track, *next, *act_track= clip->tracking.act_track;
+ ListBase *tracksbase= BKE_tracking_get_tracks(tracking);
+ MovieTrackingTrack *track, *next, *act_track= BKE_tracking_active_track(tracking);
int frames= RNA_int_get(op->ptr, "frames");
int action= RNA_enum_get(op->ptr, "action");
float error= RNA_float_get(op->ptr, "error");
@@ -2999,7 +3350,7 @@ static int clean_tracks_exec(bContext *C, wmOperator *op)
if(error && action==TRACKING_CLEAN_DELETE_SEGMENT)
action= TRACKING_CLEAN_DELETE_TRACK;
- track= tracking->tracks.first;
+ track= tracksbase->first;
while(track) {
next= track->next;
@@ -3018,7 +3369,7 @@ static int clean_tracks_exec(bContext *C, wmOperator *op)
clip->tracking.act_track= NULL;
BKE_tracking_free_track(track);
- BLI_freelinkN(&clip->tracking.tracks, track);
+ BLI_freelinkN(tracksbase, track);
track= NULL;
}
@@ -3028,7 +3379,7 @@ static int clean_tracks_exec(bContext *C, wmOperator *op)
clip->tracking.act_track= NULL;
BKE_tracking_free_track(track);
- BLI_freelinkN(&clip->tracking.tracks, track);
+ BLI_freelinkN(tracksbase, track);
}
}
}
@@ -3085,3 +3436,71 @@ void CLIP_OT_clean_tracks(wmOperatorType *ot)
RNA_def_float(ot->srna, "error", 0.0f, 0.0f, FLT_MAX, "Reprojection Error", "Effect on tracks with have got larger reprojection error", 0.0f, 100.0f);
RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute");
}
+
+/********************** add tracking object *********************/
+
+static int tracking_object_new_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+
+ BKE_tracking_new_object(tracking, "Object");
+
+ WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
+
+ return OPERATOR_FINISHED;
+}
+
+void CLIP_OT_tracking_object_new(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Tracking Object";
+ ot->description= "Add new object for tracking";
+ ot->idname= "CLIP_OT_tracking_object_new";
+
+ /* api callbacks */
+ ot->exec= tracking_object_new_exec;
+ ot->poll= ED_space_clip_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** remove tracking object *********************/
+
+static int tracking_object_remove_exec(bContext *C, wmOperator *op)
+{
+ SpaceClip *sc= CTX_wm_space_clip(C);
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *object;
+
+ object= BKE_tracking_active_object(tracking);
+
+ if(object->flag&TRACKING_OBJECT_CAMERA) {
+ BKE_report(op->reports, RPT_WARNING, "Object used for camera tracking can't be deleted");
+ return OPERATOR_CANCELLED;
+ }
+
+ BKE_tracking_remove_object(tracking, object);
+
+ WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
+
+ return OPERATOR_FINISHED;
+}
+
+void CLIP_OT_tracking_object_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Movie Tracking Object";
+ ot->description= "Remove object for tracking";
+ ot->idname= "CLIP_OT_tracking_object_remove";
+
+ /* api callbacks */
+ ot->exec= tracking_object_remove_exec;
+ ot->poll= ED_space_clip_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 69c192b077b..daa2031bb5f 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -715,7 +715,7 @@ int file_draw_check_exists(SpaceFile *sfile)
if(RNA_boolean_get(sfile->op->ptr, "check_existing")) {
char filepath[FILE_MAX];
BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file);
- if(BLI_exists(filepath) && !BLI_is_dir(filepath)) {
+ if(BLI_is_file(filepath)) {
return TRUE;
}
}
@@ -1143,8 +1143,8 @@ int file_directory_exec(bContext *C, wmOperator *UNUSED(unused))
BLI_dir_create_recursive(sfile->params->dir);
}
- /* special case, user may have pasted a fulepath into the directory */
- if(BLI_exists(sfile->params->dir) && BLI_is_dir(sfile->params->dir) == 0) {
+ /* special case, user may have pasted a filepath into the directory */
+ if(BLI_is_file(sfile->params->dir)) {
char path[sizeof(sfile->params->dir)];
BLI_strncpy(path, sfile->params->dir, sizeof(path));
BLI_split_dirfile(path, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file));
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 65473bde0d1..1d629ad6dea 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -667,9 +667,13 @@ void autocomplete_file(struct bContext *C, char *str, void *UNUSED(arg_v))
void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile)
{
- thumbnails_stop(sfile->files, C);
- filelist_freelib(sfile->files);
- filelist_free(sfile->files);
+ /* only NULL in rare cases - [#29734] */
+ if (sfile->files) {
+ thumbnails_stop(sfile->files, C);
+ filelist_freelib(sfile->files);
+ filelist_free(sfile->files);
+ }
+
sfile->params->active_file = -1;
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
}
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index 2ba79ee230a..c1268ec61f0 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -386,6 +386,8 @@ static EnumPropertyItem prop_column_select_types[] = {
/* ------------------- */
/* Selects all visible keyframes between the specified markers */
+/* TODO, this is almost an _exact_ duplicate of a function of the same name in action_select.c
+ * should de-duplicate - campbell */
static void markers_selectkeys_between (bAnimContext *ac)
{
ListBase anim_data = {NULL, NULL};
@@ -393,7 +395,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{NULL}};
float min, max;
/* get extreme markers */
@@ -404,9 +406,8 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* get editing funcs + data */
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
select_cb= ANIM_editkeyframes_select(SELECT_ADD);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
- ked.f1= min;
+
+ ked.f1= min;
ked.f2= max;
/* filter data */
@@ -416,8 +417,8 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* select keys in-between */
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
-
- if (adt) {
+
+ if (adt) {
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index c647ff3df53..8d8c79386c5 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -750,7 +750,9 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "use_fields"));
uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
- uiItemR(split, &imaptr, "use_premultiply", 0, NULL, ICON_NONE);
+ row= uiLayoutRow(layout, 0);
+ uiItemR(row, &imaptr, "use_premultiply", 0, NULL, ICON_NONE);
+ uiItemR(row, &imaptr, "use_color_unpremultiply", 0, NULL, ICON_NONE);
}
}
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 15e5719be37..1b5f2417384 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -115,6 +115,9 @@ static void active_node_panel(const bContext *C, Panel *pa)
uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle");
+ uiItemS(layout);
/* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifuncbut)
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 02a8b5cc9fb..7b692f55965 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -351,10 +351,10 @@ static void node_update_hidden(bNode *node)
/* calculate minimal radius */
for(nsock= node->inputs.first; nsock; nsock= nsock->next)
- if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
+ if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE))
totin++;
for(nsock= node->outputs.first; nsock; nsock= nsock->next)
- if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
+ if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE))
totout++;
tot= MAX2(totin, totout);
@@ -371,7 +371,7 @@ static void node_update_hidden(bNode *node)
rad=drad= (float)M_PI/(1.0f + (float)totout);
for(nsock= node->outputs.first; nsock; nsock= nsock->next) {
- if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
+ if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) {
nsock->locx= node->totr.xmax - hiddenrad + (float)sin(rad)*hiddenrad;
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
rad+= drad;
@@ -382,7 +382,7 @@ static void node_update_hidden(bNode *node)
rad=drad= - (float)M_PI/(1.0f + (float)totin);
for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
- if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
+ if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) {
nsock->locx= node->totr.xmin + hiddenrad + (float)sin(rad)*hiddenrad;
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
rad+= drad;
@@ -562,6 +562,18 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
+/* common handle function for operator buttons that need to select the node first */
+static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_argv)
+{
+ bNode *node = (bNode*)node_argv;
+ const char *opname = (const char *)op_argv;
+
+ /* select & activate only the button's node */
+ node_select_single(C, node);
+
+ WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL);
+}
+
static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
@@ -601,43 +613,34 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
- /* show/hide icons, note this sequence is copied in do_header_node() node_state.c */
+ /* show/hide icons */
iconofs= rct->xmax - 7.0f;
+ /* preview */
if(node->typeinfo->flag & NODE_PREVIEW) {
- int icon_id;
-
- if(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT))
- icon_id= ICON_MATERIAL;
- else
- icon_id= ICON_MATERIAL_DATA;
+ uiBut *but;
iconofs-=iconbutw;
- uiDefIconBut(node->block, LABEL, B_REDR, icon_id, iconofs, rct->ymax-NODE_DY,
- iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
+ uiBlockSetEmboss(node->block, UI_EMBOSSN);
+ but = uiDefIconBut(node->block, TOGBUT, B_REDR, ICON_MATERIAL,
+ iconofs, rct->ymax-NODE_DY, iconbutw, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
+ uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_preview_toggle");
+ /* XXX this does not work when node is activated and the operator called right afterwards,
+ * since active ID is not updated yet (needs to process the notifier).
+ * This can only work as visual indicator!
+ */
+// if (!(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT)))
+// uiButSetFlag(but, UI_BUT_DISABLED);
+ uiBlockSetEmboss(node->block, UI_EMBOSS);
}
+ /* group edit */
if(node->type == NODE_GROUP) {
-
+ uiBut *but;
iconofs-=iconbutw;
- uiDefIconBut(node->block, LABEL, B_REDR, ICON_NODETREE, iconofs, rct->ymax-NODE_DY,
- iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
- }
- if(node->typeinfo->flag & NODE_OPTIONS) {
- iconofs-=iconbutw;
- uiDefIconBut(node->block, LABEL, B_REDR, ICON_BUTS, iconofs, rct->ymax-NODE_DY,
- iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
- }
- { /* always hide/reveal unused sockets */
- // XXX re-enable
- /* int shade;
- if(node_has_hidden_sockets(node))
- shade= -40;
- else
- shade= -90; */
-
- iconofs-=iconbutw;
-
- uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY,
- iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
+ uiBlockSetEmboss(node->block, UI_EMBOSSN);
+ but = uiDefIconBut(node->block, TOGBUT, B_REDR, ICON_NODETREE,
+ iconofs, rct->ymax-NODE_DY, iconbutw, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
+ uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_group_edit");
+ uiBlockSetEmboss(node->block, UI_EMBOSS);
}
/* title */
@@ -647,7 +650,19 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open/close entirely? */
- UI_DrawTriIcon(rct->xmin+10.0f, rct->ymax-NODE_DY/2.0f, 'v');
+ {
+ uiBut *but;
+ int but_size = UI_UNIT_X *0.6f;
+ /* XXX button uses a custom triangle draw below, so make it invisible without icon */
+ uiBlockSetEmboss(node->block, UI_EMBOSSN);
+ but = uiDefBut(node->block, TOGBUT, B_REDR, "",
+ rct->xmin+10.0f-but_size/2, rct->ymax-NODE_DY/2.0f-but_size/2, but_size, but_size, NULL, 0, 0, 0, 0, "");
+ uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_hide_toggle");
+ uiBlockSetEmboss(node->block, UI_EMBOSS);
+
+ /* custom draw function for this button */
+ UI_DrawTriIcon(rct->xmin+10.0f, rct->ymax-NODE_DY/2.0f, 'v');
+ }
/* this isn't doing anything for the label, so commenting out
if(node->flag & SELECT)
@@ -793,7 +808,19 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open entirely icon */
- UI_DrawTriIcon(rct->xmin+10.0f, centy, 'h');
+ {
+ uiBut *but;
+ int but_size = UI_UNIT_X *0.6f;
+ /* XXX button uses a custom triangle draw below, so make it invisible without icon */
+ uiBlockSetEmboss(node->block, UI_EMBOSSN);
+ but = uiDefBut(node->block, TOGBUT, B_REDR, "",
+ rct->xmin+10.0f-but_size/2, centy-but_size/2, but_size, but_size, NULL, 0, 0, 0, 0, "");
+ uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_hide_toggle");
+ uiBlockSetEmboss(node->block, UI_EMBOSS);
+
+ /* custom draw function for this button */
+ UI_DrawTriIcon(rct->xmin+10.0f, centy, 'h');
+ }
/* disable lines */
if(node->flag & NODE_MUTED)
@@ -827,12 +854,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
/* sockets */
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
+ if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE))
node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
for(sock= node->outputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
+ if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE))
node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 56246dd659f..7345c1ec6aa 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -487,6 +487,7 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
}
else {
*ntree= NULL;
+ *edittree= NULL;
if(treetype) *treetype= 0;
}
}
@@ -693,108 +694,6 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
}
}
-static int compare_nodes(bNode *a, bNode *b)
-{
- bNode *parent;
- /* These tell if either the node or any of the parent nodes is selected.
- * A selected parent means an unselected node is also in foreground!
- */
- int a_select=(a->flag & NODE_SELECT), b_select=(b->flag & NODE_SELECT);
- int a_active=(a->flag & NODE_ACTIVE), b_active=(b->flag & NODE_ACTIVE);
-
- /* if one is an ancestor of the other */
- /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */
- for (parent = a->parent; parent; parent=parent->parent) {
- /* if b is an ancestor, it is always behind a */
- if (parent==b)
- return 1;
- /* any selected ancestor moves the node forward */
- if (parent->flag & NODE_ACTIVE)
- a_active = 1;
- if (parent->flag & NODE_SELECT)
- a_select = 1;
- }
- for (parent = b->parent; parent; parent=parent->parent) {
- /* if a is an ancestor, it is always behind b */
- if (parent==a)
- return 0;
- /* any selected ancestor moves the node forward */
- if (parent->flag & NODE_ACTIVE)
- b_active = 1;
- if (parent->flag & NODE_SELECT)
- b_select = 1;
- }
-
- /* if one of the nodes is in the background and the other not */
- if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND))
- return 0;
- else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND))
- return 1;
-
- /* if one has a higher selection state (active > selected > nothing) */
- if (!b_active && a_active)
- return 1;
- else if (!b_select && (a_active || a_select))
- return 1;
-
- return 0;
-}
-/* Sorts nodes by selection: unselected nodes first, then selected,
- * then the active node at the very end. Relative order is kept intact!
- */
-void node_sort(bNodeTree *ntree)
-{
- /* merge sort is the algorithm of choice here */
- bNode *first_a, *first_b, *node_a, *node_b, *tmp;
- int totnodes= BLI_countlist(&ntree->nodes);
- int k, a, b;
-
- k = 1;
- while (k < totnodes) {
- first_a = first_b = ntree->nodes.first;
-
- do {
- /* setup first_b pointer */
- for (b=0; b < k && first_b; ++b) {
- first_b = first_b->next;
- }
- /* all batches merged? */
- if (first_b==NULL)
- break;
-
- /* merge batches */
- node_a = first_a;
- node_b = first_b;
- a = b = 0;
- while (a < k && b < k && node_b) {
- if (compare_nodes(node_a, node_b)==0) {
- node_a = node_a->next;
- ++a;
- }
- else {
- tmp = node_b;
- node_b = node_b->next;
- ++b;
- BLI_remlink(&ntree->nodes, tmp);
- BLI_insertlinkbefore(&ntree->nodes, node_a, tmp);
- }
- }
-
- /* setup first pointers for next batch */
- first_b = node_b;
- for (; b < k; ++b) {
- /* all nodes sorted? */
- if (first_b==NULL)
- break;
- first_b = first_b->next;
- }
- first_a = first_b;
- } while (first_b);
-
- k = k << 1;
- }
-}
-
static int inside_rctf(rctf *bounds, rctf *rect)
{
return (bounds->xmin <= rect->xmin && bounds->xmax >= rect->xmax
@@ -943,7 +842,7 @@ static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(op))
ED_preview_kill_jobs(C);
if (snode->nodetree==snode->edittree) {
- bNode *gnode= nodeGetActive(snode->nodetree);
+ bNode *gnode = nodeGetActive(snode->edittree);
snode_make_group_editable(snode, gnode);
}
else
@@ -958,8 +857,11 @@ static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
-
- gnode= nodeGetActive(snode->edittree);
+
+ gnode = nodeGetActive(snode->edittree);
+ if (!gnode)
+ return OPERATOR_CANCELLED;
+
/* XXX callback? */
if(gnode && gnode->id && GS(gnode->id->name)==ID_NT && gnode->id->lib) {
uiPupMenuOkee(C, op->type->idname, "Make group local?");
@@ -1699,90 +1601,8 @@ void NODE_OT_resize(wmOperatorType *ot)
ot->flag= OPTYPE_BLOCKING;
}
-/* ********************** select ******************** */
-
-
-/* no undo here! */
-void node_deselectall(SpaceNode *snode)
-{
- bNode *node;
-
- for(node= snode->edittree->nodes.first; node; node= node->next)
- node->flag &= ~SELECT;
-}
-
-/* return 1 if we need redraw otherwise zero. */
-int node_select_same_type(SpaceNode *snode)
-{
- bNode *nac, *p;
- int redraw;
- /* search for the active node. */
- for (nac= snode->edittree->nodes.first; nac; nac= nac->next) {
- if (nac->flag & SELECT)
- break;
- }
-
- /* no active node, return. */
- if (!nac)
- return(0);
-
- redraw= 0;
- for (p= snode->edittree->nodes.first; p; p= p->next) {
- if (p->type != nac->type && p->flag & SELECT) {
- /* if it's selected but different type, unselect */
- redraw= 1;
- p->flag &= ~SELECT;
- }
- else if (p->type == nac->type && (!(p->flag & SELECT))) {
- /* if it's the same type and is not selected, select! */
- redraw= 1;
- p->flag |= SELECT;
- }
- }
- return(redraw);
-}
-
-/* return 1 if we need redraw, otherwise zero.
- * dir can be 0 == next or 0 != prev.
- */
-int node_select_same_type_np(SpaceNode *snode, int dir)
-{
- bNode *nac, *p;
-
- /* search the active one. */
- for (nac= snode->edittree->nodes.first; nac; nac= nac->next) {
- if (nac->flag & SELECT)
- break;
- }
-
- /* no active node, return. */
- if (!nac)
- return(0);
-
- if (dir == 0)
- p= nac->next;
- else
- p= nac->prev;
-
- while (p) {
- /* Now search the next with the same type. */
- if (p->type == nac->type)
- break;
-
- if (dir == 0)
- p= p->next;
- else
- p= p->prev;
- }
-
- if (p) {
- node_deselectall(snode);
- p->flag |= SELECT;
- return(1);
- }
- return(0);
-}
+/* ********************** hidden sockets ******************** */
int node_has_hidden_sockets(bNode *node)
{
@@ -1797,6 +1617,31 @@ int node_has_hidden_sockets(bNode *node)
return 0;
}
+/* note: call node_tree_verify_groups(snode->nodetree) after this
+ */
+void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
+{
+ bNodeSocket *sock;
+
+ if(set==0) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ sock->flag &= ~SOCK_HIDDEN;
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ sock->flag &= ~SOCK_HIDDEN;
+ }
+ else {
+ /* hide unused sockets */
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->link==NULL)
+ sock->flag |= SOCK_HIDDEN;
+ }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(nodeCountSocketLinks(snode->edittree, sock)==0)
+ sock->flag |= SOCK_HIDDEN;
+ }
+ }
+}
+
static void node_link_viewer(SpaceNode *snode, bNode *tonode)
{
bNode *node;
@@ -2235,7 +2080,7 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate
{
bNode *node= NULL, *gnode;
- node_deselectall(snode);
+ node_deselect_all(snode);
node = nodeAddNode(snode->edittree, ntemp);
@@ -3133,15 +2978,21 @@ void NODE_OT_group_make(wmOperatorType *ot)
static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
{
- int tot_eq= 0, tot_neq= 0;
bNode *node;
+ int tot_eq= 0, tot_neq= 0;
+ /* Toggles the flag on all selected nodes.
+ * If the flag is set on all nodes it is unset.
+ * If the flag is not set on all nodes, it is set.
+ */
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
-
+
if(toggle_flag== NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW)==0)
continue;
-
+ if(toggle_flag== NODE_OPTIONS && (node->typeinfo->flag & NODE_OPTIONS)==0)
+ continue;
+
if(node->flag & toggle_flag)
tot_eq++;
else
@@ -3150,10 +3001,12 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
}
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
-
+
if(toggle_flag== NODE_PREVIEW && (node->typeinfo->flag & NODE_PREVIEW)==0)
continue;
-
+ if(toggle_flag== NODE_OPTIONS && (node->typeinfo->flag & NODE_OPTIONS)==0)
+ continue;
+
if( (tot_eq && tot_neq) || tot_eq==0)
node->flag |= toggle_flag;
else
@@ -3162,7 +3015,7 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
}
}
-static int node_hide_exec(bContext *C, wmOperator *UNUSED(op))
+static int node_hide_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -3185,14 +3038,14 @@ void NODE_OT_hide_toggle(wmOperatorType *ot)
ot->idname= "NODE_OT_hide_toggle";
/* callbacks */
- ot->exec= node_hide_exec;
+ ot->exec= node_hide_toggle_exec;
ot->poll= ED_operator_node_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_preview_exec(bContext *C, wmOperator *UNUSED(op))
+static int node_preview_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -3217,7 +3070,37 @@ void NODE_OT_preview_toggle(wmOperatorType *ot)
ot->idname= "NODE_OT_preview_toggle";
/* callbacks */
- ot->exec= node_preview_exec;
+ ot->exec= node_preview_toggle_exec;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int node_options_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+
+ /* sanity checking (poll callback checks this already) */
+ if((snode == NULL) || (snode->edittree == NULL))
+ return OPERATOR_CANCELLED;
+
+ node_flag_toggle_exec(snode, NODE_OPTIONS);
+
+ snode_notify(C, snode);
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_options_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Node Options";
+ ot->description= "Toggle option buttons display for selected nodes";
+ ot->idname= "NODE_OT_options_toggle";
+
+ /* callbacks */
+ ot->exec= node_options_toggle_exec;
ot->poll= ED_operator_node_active;
/* flags */
@@ -3228,7 +3111,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
- int hidden= 0;
+ int hidden;
/* sanity checking (poll callback checks this already) */
if((snode == NULL) || (snode->edittree == NULL))
@@ -3236,6 +3119,8 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
ED_preview_kill_jobs(C);
+ /* Toggle for all selected nodes */
+ hidden = 0;
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
if(node_has_hidden_sockets(node)) {
@@ -3244,7 +3129,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
}
}
}
-
+
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & SELECT) {
node_set_hidden_sockets(snode, node, !hidden);
@@ -3280,10 +3165,6 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
- /* no disabling inside of groups */
- if(node_tree_get_editgroup(snode->nodetree))
- return OPERATOR_CANCELLED;
-
ED_preview_kill_jobs(C);
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -3577,7 +3458,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
}
}
- node_deselectall(snode);
+ node_deselect_all(snode);
if (snode->nodetree->type==NTREE_COMPOSIT)
ntemp.type = CMP_NODE_IMAGE;
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 88b81d0855c..9068493360e 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -82,17 +82,23 @@ void node_operatortypes(void);
void node_keymap(wmKeyConfig *keyconf);
/* node_select.c */
+void node_deselect_all(struct SpaceNode *snode);
+int node_select_same_type(struct SpaceNode *snode);
+int node_select_same_type_np(struct SpaceNode *snode, int dir);
+void node_select_single(struct bContext *C, struct bNode *node);
+
void NODE_OT_select(struct wmOperatorType *ot);
void NODE_OT_select_all(wmOperatorType *ot);
void NODE_OT_select_linked_to(wmOperatorType *ot);
void NODE_OT_select_linked_from(wmOperatorType *ot);
-void NODE_OT_visibility_toggle(struct wmOperatorType *ot);
-void NODE_OT_view_all(struct wmOperatorType *ot);
void NODE_OT_select_border(struct wmOperatorType *ot);
void NODE_OT_select_same_type(struct wmOperatorType *ot);
void NODE_OT_select_same_type_next(wmOperatorType *ot);
void NODE_OT_select_same_type_prev(wmOperatorType *ot);
+/* node_state.c */
+void NODE_OT_view_all(struct wmOperatorType *ot);
+
/* drawnode.c */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
@@ -108,10 +114,6 @@ void snode_dag_update(bContext *C, SpaceNode *snode);
bNode *node_add_node(struct SpaceNode *snode, struct Main *bmain, struct Scene *scene, struct bNodeTemplate *ntemp, float locx, float locy);
void snode_set_context(SpaceNode *snode, Scene *scene);
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
-void node_sort(struct bNodeTree *ntree);
-void node_deselectall(SpaceNode *snode);
-int node_select_same_type(SpaceNode *snode);
-int node_select_same_type_np(SpaceNode *snode, int dir);
void snode_composite_job(const struct bContext *C, ScrArea *sa);
bNode *node_tree_get_editgroup(bNodeTree *ntree);
void node_tree_verify_groups(bNodeTree *nodetree);
@@ -141,6 +143,7 @@ void NODE_OT_mute_toggle(struct wmOperatorType *ot);
void NODE_OT_hide_toggle(struct wmOperatorType *ot);
void NODE_OT_hide_socket_toggle(struct wmOperatorType *ot);
void NODE_OT_preview_toggle(struct wmOperatorType *ot);
+void NODE_OT_options_toggle(struct wmOperatorType *ot);
void NODE_OT_show_cyclic_dependencies(struct wmOperatorType *ot);
void NODE_OT_link_viewer(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 8309181ddda..b5c435b50e8 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -59,10 +59,11 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_select_same_type_prev);
WM_operatortype_append(NODE_OT_view_all);
- WM_operatortype_append(NODE_OT_visibility_toggle);
+
WM_operatortype_append(NODE_OT_mute_toggle);
WM_operatortype_append(NODE_OT_hide_toggle);
WM_operatortype_append(NODE_OT_preview_toggle);
+ WM_operatortype_append(NODE_OT_options_toggle);
WM_operatortype_append(NODE_OT_hide_socket_toggle);
WM_operatortype_append(NODE_OT_show_cyclic_dependencies);
@@ -148,7 +149,6 @@ void node_keymap(struct wmKeyConfig *keyconf)
/* each of these falls through if not handled... */
WM_keymap_add_item(keymap, "NODE_OT_link", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_resize", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_visibility_toggle", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "NODE_OT_select_link_viewer", LEFTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index c863efada9f..15efd65450c 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -31,6 +31,8 @@
#include <stdio.h>
+#include "BLI_listbase.h"
+
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
@@ -68,6 +70,206 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my)
return NULL;
}
+static int compare_nodes(bNode *a, bNode *b)
+{
+ bNode *parent;
+ /* These tell if either the node or any of the parent nodes is selected.
+ * A selected parent means an unselected node is also in foreground!
+ */
+ int a_select=(a->flag & NODE_SELECT), b_select=(b->flag & NODE_SELECT);
+ int a_active=(a->flag & NODE_ACTIVE), b_active=(b->flag & NODE_ACTIVE);
+
+ /* if one is an ancestor of the other */
+ /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */
+ for (parent = a->parent; parent; parent=parent->parent) {
+ /* if b is an ancestor, it is always behind a */
+ if (parent==b)
+ return 1;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ a_active = 1;
+ if (parent->flag & NODE_SELECT)
+ a_select = 1;
+ }
+ for (parent = b->parent; parent; parent=parent->parent) {
+ /* if a is an ancestor, it is always behind b */
+ if (parent==a)
+ return 0;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ b_active = 1;
+ if (parent->flag & NODE_SELECT)
+ b_select = 1;
+ }
+
+ /* if one of the nodes is in the background and the other not */
+ if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND))
+ return 0;
+ else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND))
+ return 1;
+
+ /* if one has a higher selection state (active > selected > nothing) */
+ if (!b_active && a_active)
+ return 1;
+ else if (!b_select && (a_active || a_select))
+ return 1;
+
+ return 0;
+}
+
+/* Sorts nodes by selection: unselected nodes first, then selected,
+ * then the active node at the very end. Relative order is kept intact!
+ */
+static void node_sort(bNodeTree *ntree)
+{
+ /* merge sort is the algorithm of choice here */
+ bNode *first_a, *first_b, *node_a, *node_b, *tmp;
+ int totnodes= BLI_countlist(&ntree->nodes);
+ int k, a, b;
+
+ k = 1;
+ while (k < totnodes) {
+ first_a = first_b = ntree->nodes.first;
+
+ do {
+ /* setup first_b pointer */
+ for (b=0; b < k && first_b; ++b) {
+ first_b = first_b->next;
+ }
+ /* all batches merged? */
+ if (first_b==NULL)
+ break;
+
+ /* merge batches */
+ node_a = first_a;
+ node_b = first_b;
+ a = b = 0;
+ while (a < k && b < k && node_b) {
+ if (compare_nodes(node_a, node_b)==0) {
+ node_a = node_a->next;
+ ++a;
+ }
+ else {
+ tmp = node_b;
+ node_b = node_b->next;
+ ++b;
+ BLI_remlink(&ntree->nodes, tmp);
+ BLI_insertlinkbefore(&ntree->nodes, node_a, tmp);
+ }
+ }
+
+ /* setup first pointers for next batch */
+ first_b = node_b;
+ for (; b < k; ++b) {
+ /* all nodes sorted? */
+ if (first_b==NULL)
+ break;
+ first_b = first_b->next;
+ }
+ first_a = first_b;
+ } while (first_b);
+
+ k = k << 1;
+ }
+}
+
+/* no undo here! */
+void node_deselect_all(SpaceNode *snode)
+{
+ bNode *node;
+
+ for(node= snode->edittree->nodes.first; node; node= node->next)
+ node->flag &= ~SELECT;
+}
+
+/* return 1 if we need redraw otherwise zero. */
+int node_select_same_type(SpaceNode *snode)
+{
+ bNode *nac, *p;
+ int redraw;
+
+ /* search for the active node. */
+ for (nac= snode->edittree->nodes.first; nac; nac= nac->next) {
+ if (nac->flag & SELECT)
+ break;
+ }
+
+ /* no active node, return. */
+ if (!nac)
+ return(0);
+
+ redraw= 0;
+ for (p= snode->edittree->nodes.first; p; p= p->next) {
+ if (p->type != nac->type && p->flag & SELECT) {
+ /* if it's selected but different type, unselect */
+ redraw= 1;
+ p->flag &= ~SELECT;
+ }
+ else if (p->type == nac->type && (!(p->flag & SELECT))) {
+ /* if it's the same type and is not selected, select! */
+ redraw= 1;
+ p->flag |= SELECT;
+ }
+ }
+ return(redraw);
+}
+
+/* return 1 if we need redraw, otherwise zero.
+ * dir can be 0 == next or 0 != prev.
+ */
+int node_select_same_type_np(SpaceNode *snode, int dir)
+{
+ bNode *nac, *p;
+
+ /* search the active one. */
+ for (nac= snode->edittree->nodes.first; nac; nac= nac->next) {
+ if (nac->flag & SELECT)
+ break;
+ }
+
+ /* no active node, return. */
+ if (!nac)
+ return(0);
+
+ if (dir == 0)
+ p= nac->next;
+ else
+ p= nac->prev;
+
+ while (p) {
+ /* Now search the next with the same type. */
+ if (p->type == nac->type)
+ break;
+
+ if (dir == 0)
+ p= p->next;
+ else
+ p= p->prev;
+ }
+
+ if (p) {
+ node_deselect_all(snode);
+ p->flag |= SELECT;
+ return(1);
+ }
+ return(0);
+}
+
+void node_select_single(bContext *C, bNode *node)
+{
+ Main *bmain= CTX_data_main(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
+
+ node_deselect_all(snode);
+ node->flag |= SELECT;
+
+ ED_node_set_active(bmain, snode->edittree, node);
+
+ node_sort(snode->edittree);
+
+ WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
+}
+
/* ****** Click Select ****** */
static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, const int mval[2], short extend)
@@ -86,7 +288,7 @@ static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, cons
if (node) {
if (extend == 0) {
- node_deselectall(snode);
+ node_deselect_all(snode);
node->flag |= SELECT;
}
else
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index bfebd087c3f..58623e17b10 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -52,160 +52,6 @@
#include "node_intern.h"
-/* **************** Node Header Buttons ************** */
-
-/* note: call node_tree_verify_groups(snode->nodetree) after this
- */
-void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
-{
- bNodeSocket *sock;
-
- if(set==0) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_HIDDEN;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_HIDDEN;
- }
- else {
- /* hide unused sockets */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link==NULL)
- sock->flag |= SOCK_HIDDEN;
- }
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= SOCK_HIDDEN;
- }
- }
-}
-
-static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node)
-{
- node_set_hidden_sockets(snode, node, !node_has_hidden_sockets(node));
- ntreeUpdateTree(snode->edittree);
-}
-
-static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
-{
- rctf totr= node->totr;
-
- totr.ymin= totr.ymax-20.0f;
-
- totr.xmax= totr.xmin+15.0f;
- if(BLI_in_rctf(&totr, mx, my)) {
- node->flag |= NODE_HIDDEN;
- return 1;
- }
-
- totr.xmax= node->totr.xmax;
- totr.xmin= totr.xmax-18.0f;
- if(node->typeinfo->flag & NODE_PREVIEW) {
- if(BLI_in_rctf(&totr, mx, my)) {
- node->flag ^= NODE_PREVIEW;
- return 1;
- }
- totr.xmin-=15.0f;
- }
- if(node->type == NODE_GROUP) {
- if(BLI_in_rctf(&totr, mx, my)) {
- snode_make_group_editable(snode, node);
- return 1;
- }
- totr.xmin-=15.0f;
- }
- if(node->typeinfo->flag & NODE_OPTIONS) {
- if(BLI_in_rctf(&totr, mx, my)) {
- node->flag ^= NODE_OPTIONS;
- return 1;
- }
- totr.xmin-=15.0f;
- }
- /* hide unused sockets */
- if(BLI_in_rctf(&totr, mx, my)) {
- node_hide_unhide_sockets(snode, node);
- }
-
- return 0;
-}
-
-static int do_header_hidden_node(bNode *node, float mx, float my)
-{
- rctf totr= node->totr;
-
- totr.xmax= totr.xmin+15.0f;
- if(BLI_in_rctf(&totr, mx, my)) {
- node->flag &= ~NODE_HIDDEN;
- return 1;
- }
- return 0;
-}
-
-static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, const int mval[2])
-{
- bNode *node;
- float mx, my;
-
- mx= (float)mval[0];
- my= (float)mval[1];
-
- UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
-
- for(node=snode->edittree->nodes.last; node; node=node->prev) {
- if(node->flag & NODE_HIDDEN) {
- if(do_header_hidden_node(node, mx, my)) {
- ED_region_tag_redraw(ar);
- return 1;
- }
- }
- else {
- if(do_header_node(snode, node, mx, my)) {
- ED_region_tag_redraw(ar);
- return 1;
- }
- }
- }
- return 0;
-}
-
-static int node_toggle_visibility_exec(bContext *C, wmOperator *op)
-{
- SpaceNode *snode= CTX_wm_space_node(C);
- ARegion *ar= CTX_wm_region(C);
- int mval[2];
-
- mval[0] = RNA_int_get(op->ptr, "mouse_x");
- mval[1] = RNA_int_get(op->ptr, "mouse_y");
- if(node_toggle_visibility(snode, ar, mval))
- return OPERATOR_FINISHED;
- else
- return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
-}
-
-static int node_toggle_visibility_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- RNA_int_set(op->ptr, "mouse_x", event->mval[0]);
- RNA_int_set(op->ptr, "mouse_y", event->mval[1]);
-
- return node_toggle_visibility_exec(C,op);
-}
-
-void NODE_OT_visibility_toggle(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Toggle Visibility";
- ot->idname= "NODE_OT_visibility_toggle";
- ot->description= "Handle clicks on node header buttons";
-
- /* api callbacks */
- ot->invoke= node_toggle_visibility_invoke;
- ot->poll= ED_operator_node_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_int(ot->srna, "mouse_x", 0, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
- RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
-}
/* **************** View All Operator ************** */
diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c
index 6027a272270..a733d45c20b 100644
--- a/source/blender/editors/space_node/node_templates.c
+++ b/source/blender/editors/space_node/node_templates.c
@@ -1,6 +1,4 @@
/*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 1a808e8ee5f..9d4c5705bd1 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -248,12 +248,10 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
case NC_IMAGE:
if (wmn->action == NA_EDITED) {
if(type==NTREE_COMPOSIT) {
- Scene *scene= wmn->window->screen->scene;
-
/* note that nodeUpdateID is already called by BKE_image_signal() on all
* scenes so really this is just to know if the images is used in the compo else
* painting on images could become very slow when the compositor is open. */
- if(nodeUpdateID(scene->nodetree, wmn->reference))
+ if(nodeUpdateID(snode->nodetree, wmn->reference))
ED_area_tag_refresh(sa);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 86031ca7104..f3bab197b3c 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1014,6 +1014,8 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto
UI_icon_draw(x, y, ICON_MOD_SOLIDIFY); break;
case eModifierType_Screw:
UI_icon_draw(x, y, ICON_MOD_SCREW); break;
+ case eModifierType_Remesh:
+ UI_icon_draw(x, y, ICON_MOD_REMESH); break;
case eModifierType_WeightVGEdit:
case eModifierType_WeightVGMix:
case eModifierType_WeightVGProximity:
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index 30a7abd3c0b..9b1bd1d7b31 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -221,12 +221,17 @@ void OUTLINER_OT_item_openclose(wmOperatorType *ot)
static void do_item_rename(ARegion *ar, TreeElement *te, TreeStoreElem *tselem, ReportList *reports)
{
/* can't rename rna datablocks entries */
- if(ELEM3(tselem->type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM))
- ;
- else if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
+ if(ELEM3(tselem->type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
+ /* do nothing */;
+ }
+ else if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE,
+ TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
+ {
BKE_report(reports, RPT_WARNING, "Cannot edit builtin name");
- else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP))
+ }
+ else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP)) {
BKE_report(reports, RPT_WARNING, "Cannot edit sequence name");
+ }
else if(tselem->id->lib) {
// XXX error_libdata();
}
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 42fe14cd59c..bf570c929cc 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -237,7 +237,6 @@ static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *so
if(set) {
ob->actcol= te->index+1;
ob->matbits[te->index]= 1; // make ob material active too
- ob->colbits |= (1<<te->index);
}
else {
if(ob->actcol == te->index+1)
@@ -249,7 +248,6 @@ static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *so
if(set) {
ob->actcol= te->index+1;
ob->matbits[te->index]= 0; // make obdata material active too
- ob->colbits &= ~(1<<te->index);
}
else {
if(ob->actcol == te->index+1)
@@ -398,7 +396,9 @@ static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *
/* id in tselem is object */
ob= (Object *)tselem->id;
if(set) {
+ BLI_assert(te->index+1 >= 0);
ob->actdef= te->index+1;
+
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
@@ -823,8 +823,12 @@ static int outliner_item_activate(bContext *C, wmOperator *op, wmEvent *event)
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], fmval, fmval+1);
- if(!ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP) && !(soops->flag & SO_HIDE_RESTRICTCOLS) && fmval[0] > ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX)
+ if ( !ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP) &&
+ !(soops->flag & SO_HIDE_RESTRICTCOLS) &&
+ (fmval[0] > ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX))
+ {
return OPERATOR_CANCELLED;
+ }
for(te= soops->tree.first; te; te= te->next) {
if(do_outliner_item_activate(C, scene, ar, soops, te, extend, fmval)) break;
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 794f898a1fc..084e48c0d6e 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -977,7 +977,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
if(te->name)
te->flag |= TE_FREE_NAME;
else
- te->name= (char*)RNA_struct_ui_name(ptr->type);
+ te->name= RNA_struct_ui_name(ptr->type);
/* If searching don't expand RNA entries */
if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
@@ -1007,7 +1007,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
prop= propptr.data;
proptype= RNA_property_type(prop);
- te->name= (char*)RNA_property_ui_name(prop);
+ te->name= RNA_property_ui_name(prop);
te->directdata= prop;
te->rnaptr= *ptr;
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index bf268b0e304..303f6912ff1 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -105,7 +105,6 @@ static SpaceLink *sequencer_new(const bContext *C)
sseq= MEM_callocN(sizeof(SpaceSeq), "initsequencer");
sseq->spacetype= SPACE_SEQ;
- sseq->zoom= 4;
sseq->chanshown = 0;
sseq->view = SEQ_VIEW_SEQUENCE;
sseq->mainb = SEQ_DRAW_IMG_IMBUF;
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 16ee32d10a2..566659e0391 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -195,7 +195,6 @@ void TEXT_OT_new(wmOperatorType *ot)
ot->description= "Create a new text data block";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
ot->exec= text_new_exec;
ot->poll= text_new_poll;
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index b3baccde5c9..65ef3273e30 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -580,7 +580,6 @@ static SpaceLink *time_new(const bContext *C)
stime= MEM_callocN(sizeof(SpaceTime), "inittime");
stime->spacetype= SPACE_TIME;
- stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN; // XXX: depreceated
stime->flag |= TIME_DRAWFRAMES;
/* header */
diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c
index 30042433ef2..1784d949761 100644
--- a/source/blender/editors/space_view3d/drawanimviz.c
+++ b/source/blender/editors/space_view3d/drawanimviz.c
@@ -312,269 +312,3 @@ void draw_motion_paths_cleanup(View3D *v3d)
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
glPopMatrix();
}
-
-#if 0 // XXX temp file guards
-
-/* ***************************** Onion Skinning (Ghosts) ******************************** */
-
-#if 0 // XXX only for bones
-/* helper function for ghost drawing - sets/removes flags for temporarily
- * hiding unselected bones while drawing ghosts
- */
-static void ghost_poses_tag_unselected(Object *ob, short unset)
-{
- bArmature *arm= ob->data;
- bPose *pose= ob->pose;
- bPoseChannel *pchan;
-
- /* don't do anything if no hiding any bones */
- if ((arm->flag & ARM_GHOST_ONLYSEL)==0)
- return;
-
- /* loop over all pchans, adding/removing tags as appropriate */
- for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
- if (unset) {
- /* remove tags from all pchans if cleaning up */
- pchan->bone->flag &= ~BONE_HIDDEN_PG;
- }
- else {
- /* set tags on unselected pchans only */
- if ((pchan->bone->flag & BONE_SELECTED)==0)
- pchan->bone->flag |= BONE_HIDDEN_PG;
- }
- }
- }
-}
-#endif // XXX only for bones
-
-/* draw ghosts that occur within a frame range
- * note: object should be in posemode
- */
-static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
-{
- Object *ob= base->object;
- AnimData *adt= BKE_animdata_from_id(&ob->id);
- bArmature *arm= ob->data;
- bPose *posen, *poseo;
- float start, end, stepsize, range, colfac;
- int cfrao, flago, ipoflago;
-
- start = (float)arm->ghostsf;
- end = (float)arm->ghostef;
- if (end <= start)
- return;
-
- stepsize= (float)(arm->ghostsize);
- range= (float)(end - start);
-
- /* store values */
- ob->mode &= ~OB_MODE_POSE;
- cfrao= CFRA;
- flago= arm->flag;
- arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
- ipoflago= ob->ipoflag;
- ob->ipoflag |= OB_DISABLE_PATH;
-
- /* copy the pose */
- poseo= ob->pose;
- copy_pose(&posen, ob->pose, 1);
- ob->pose= posen;
- armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
- ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
-
- glEnable(GL_BLEND);
- if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
-
- /* draw from first frame of range to last */
- for (CFRA= (int)start; CFRA < end; CFRA += (int)stepsize) {
- colfac = (end - (float)CFRA) / range;
- UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac)));
-
- BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
- where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
- }
- glDisable(GL_BLEND);
- if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
-
- ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
- free_pose(posen);
-
- /* restore */
- CFRA= cfrao;
- ob->pose= poseo;
- arm->flag= flago;
- armature_rebuild_pose(ob, ob->data);
- ob->mode |= OB_MODE_POSE;
- ob->ipoflag= ipoflago;
-}
-
-/* draw ghosts on keyframes in action within range
- * - object should be in posemode
- */
-static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
-{
- Object *ob= base->object;
- AnimData *adt= BKE_animdata_from_id(&ob->id);
- bAction *act= (adt) ? adt->action : NULL;
- bArmature *arm= ob->data;
- bPose *posen, *poseo;
- DLRBT_Tree keys;
- ActKeyColumn *ak, *akn;
- float start, end, range, colfac, i;
- int cfrao, flago;
-
- start = (float)arm->ghostsf;
- end = (float)arm->ghostef;
- if (end <= start)
- return;
-
- /* get keyframes - then clip to only within range */
- BLI_dlrbTree_init(&keys);
- action_to_keylist(adt, act, &keys, NULL);
- BLI_dlrbTree_linkedlist_sync(&keys);
-
- range= 0;
- for (ak= keys.first; ak; ak= akn) {
- akn= ak->next;
-
- if ((ak->cfra < start) || (ak->cfra > end))
- BLI_freelinkN((ListBase *)&keys, ak);
- else
- range++;
- }
- if (range == 0) return;
-
- /* store values */
- ob->mode &= ~OB_MODE_POSE;
- cfrao= CFRA;
- flago= arm->flag;
- arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
- ob->ipoflag |= OB_DISABLE_PATH;
-
- /* copy the pose */
- poseo= ob->pose;
- copy_pose(&posen, ob->pose, 1);
- ob->pose= posen;
- armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
- ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
-
- glEnable(GL_BLEND);
- if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
-
- /* draw from first frame of range to last */
- for (ak=keys.first, i=0; ak; ak=ak->next, i++) {
- colfac = i/range;
- UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac)));
-
- CFRA= (int)ak->cfra;
-
- BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
- where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
- }
- glDisable(GL_BLEND);
- if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
-
- ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
- BLI_dlrbTree_free(&keys);
- free_pose(posen);
-
- /* restore */
- CFRA= cfrao;
- ob->pose= poseo;
- arm->flag= flago;
- armature_rebuild_pose(ob, ob->data);
- ob->mode |= OB_MODE_POSE;
-}
-
-/* draw ghosts around current frame
- * - object is supposed to be armature in posemode
- */
-static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
-{
- Object *ob= base->object;
- AnimData *adt= BKE_animdata_from_id(&ob->id);
- bArmature *arm= ob->data;
- bPose *posen, *poseo;
- float cur, start, end, stepsize, range, colfac, actframe, ctime;
- int cfrao, flago;
-
- /* pre conditions, get an action with sufficient frames */
- if ELEM(NULL, adt, adt->action)
- return;
-
- calc_action_range(adt->action, &start, &end, 0);
- if (start == end)
- return;
-
- stepsize= (float)(arm->ghostsize);
- range= (float)(arm->ghostep)*stepsize + 0.5f; /* plus half to make the for loop end correct */
-
- /* store values */
- ob->mode &= ~OB_MODE_POSE;
- cfrao= CFRA;
- actframe= BKE_nla_tweakedit_remap(adt, (float)CFRA, 0);
- flago= arm->flag;
- arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
-
- /* copy the pose */
- poseo= ob->pose;
- copy_pose(&posen, ob->pose, 1);
- ob->pose= posen;
- armature_rebuild_pose(ob, ob->data); /* child pointers for IK */
- ghost_poses_tag_unselected(ob, 0); /* hide unselected bones if need be */
-
- glEnable(GL_BLEND);
- if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
-
- /* draw from darkest blend to lowest */
- for(cur= stepsize; cur<range; cur+=stepsize) {
- ctime= cur - (float)fmod(cfrao, stepsize); /* ensures consistent stepping */
- colfac= ctime/range;
- UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac)));
-
- /* only within action range */
- if (actframe+ctime >= start && actframe+ctime <= end) {
- CFRA= (int)BKE_nla_tweakedit_remap(adt, actframe+ctime, NLATIME_CONVERT_MAP);
-
- if (CFRA != cfrao) {
- BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
- where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
- }
- }
-
- ctime= cur + (float)fmod((float)cfrao, stepsize) - stepsize+1.0f; /* ensures consistent stepping */
- colfac= ctime/range;
- UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac)));
-
- /* only within action range */
- if ((actframe-ctime >= start) && (actframe-ctime <= end)) {
- CFRA= (int)BKE_nla_tweakedit_remap(adt, actframe-ctime, NLATIME_CONVERT_MAP);
-
- if (CFRA != cfrao) {
- BKE_animsys_evaluate_animdata(scene, &ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
- where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
- }
- }
- }
- glDisable(GL_BLEND);
- if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
-
- ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
- free_pose(posen);
-
- /* restore */
- CFRA= cfrao;
- ob->pose= poseo;
- arm->flag= flago;
- armature_rebuild_pose(ob, ob->data);
- ob->mode |= OB_MODE_POSE;
-}
-
-
-
-#endif // XXX temp file guards
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 1bc55b8d73f..e0b1741b0d0 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -70,6 +70,25 @@
#include "view3d_intern.h" // own include
+/* user data structures for derived mesh callbacks */
+typedef struct drawMeshFaceSelect_userData {
+ Mesh *me;
+ EdgeHash *eh;
+} drawMeshFaceSelect_userData;
+
+typedef struct drawEMTFMapped_userData {
+ EditMesh *em;
+ short has_mcol;
+ short has_mtface;
+ MFace *mf;
+ MTFace *tf;
+} drawEMTFMapped_userData;
+
+typedef struct drawTFace_userData {
+ MFace *mf;
+ MTFace *tf;
+} drawTFace_userData;
+
/**************************** Face Select Mode *******************************/
/* Flags for marked edges */
@@ -121,7 +140,7 @@ static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
static int draw_mesh_face_select__setHiddenOpts(void *userData, int index)
{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
+ drawMeshFaceSelect_userData *data = userData;
Mesh *me= data->me;
MEdge *med = &me->medge[index];
uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
@@ -138,7 +157,7 @@ static int draw_mesh_face_select__setHiddenOpts(void *userData, int index)
static int draw_mesh_face_select__setSelectOpts(void *userData, int index)
{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
+ drawMeshFaceSelect_userData *data = userData;
MEdge *med = &data->me->medge[index];
uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
@@ -159,7 +178,7 @@ static int draw_mesh_face_select__drawFaceOptsInv(void *userData, int index)
static void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm)
{
- struct { Mesh *me; EdgeHash *eh; } data;
+ drawMeshFaceSelect_userData data;
data.me = me;
data.eh = get_tface_mesh_marked_edge_info(me);
@@ -180,7 +199,7 @@ static void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* dull unselected faces so as not to get in the way of seeing color */
glColor4ub(96, 96, 96, 64);
- dm->drawMappedFacesTex(dm, draw_mesh_face_select__drawFaceOptsInv, (void*)me);
+ dm->drawMappedFacesTex(dm, draw_mesh_face_select__drawFaceOptsInv, NULL, (void*)me);
glDisable(GL_BLEND);
}
@@ -513,7 +532,7 @@ static int draw_tface_mapped__set_draw(void *userData, int index)
static int draw_em_tf_mapped__set_draw(void *userData, int index)
{
- struct {EditMesh *em; short has_mcol; short has_mtface;} *data = userData;
+ drawEMTFMapped_userData *data = userData;
EditMesh *em = data->em;
EditFace *efa= EM_get_face_for_index(index);
MTFace *tface;
@@ -629,6 +648,32 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
ddm->release(ddm);
}
+static int compareDrawOptions(void *userData, int cur_index, int next_index)
+{
+ drawTFace_userData *data = userData;
+
+ if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr)
+ return 0;
+
+ if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage)
+ return 0;
+
+ return 1;
+}
+
+static int compareDrawOptionsEm(void *userData, int cur_index, int next_index)
+{
+ drawEMTFMapped_userData *data= userData;
+
+ if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr)
+ return 0;
+
+ if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage)
+ return 0;
+
+ return 1;
+}
+
void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags)
{
Mesh *me= ob->data;
@@ -643,32 +688,39 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
glColor4f(1.0f,1.0f,1.0f,1.0f);
if(ob->mode & OB_MODE_EDIT) {
- struct {EditMesh *em; short has_mcol; short has_mtface;} data;
+ drawEMTFMapped_userData data;
data.em= me->edit_mesh;
data.has_mcol= CustomData_has_layer(&me->edit_mesh->fdata, CD_MCOL);
data.has_mtface= CustomData_has_layer(&me->edit_mesh->fdata, CD_MTFACE);
+ data.mf= DM_get_face_data_layer(dm, CD_MFACE);
+ data.tf= DM_get_face_data_layer(dm, CD_MTFACE);
- dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, &data);
+ dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, compareDrawOptionsEm, &data);
}
else if(draw_flags & DRAW_FACE_SELECT) {
if(ob->mode & OB_MODE_WEIGHT_PAINT)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me, 1);
else
- dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, me);
+ dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, NULL, me);
}
else {
if(GPU_buffer_legacy(dm)) {
if (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)
- dm->drawFacesTex(dm, draw_mcol__set_draw_legacy);
+ dm->drawFacesTex(dm, draw_mcol__set_draw_legacy, NULL, NULL);
else
- dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
+ dm->drawFacesTex(dm, draw_tface__set_draw_legacy, NULL, NULL);
}
else {
+ drawTFace_userData userData;
+
if(!CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL))
add_tface_color_layer(dm);
- dm->drawFacesTex(dm, draw_tface__set_draw);
+ userData.mf = DM_get_face_data_layer(dm, CD_MFACE);
+ userData.tf = DM_get_face_data_layer(dm, CD_MTFACE);
+
+ dm->drawFacesTex(dm, draw_tface__set_draw, compareDrawOptions, &userData);
}
}
@@ -806,7 +858,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
int useColors= 1;
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions,
- ob->data, useColors, GPU_enable_material, NULL);
+ GPU_enable_material, NULL, ob->data, useColors);
}
else {
Mesh *me= ob->data;
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e7b9e35c18d..7f54821c98d 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -118,6 +118,48 @@ typedef enum eWireDrawMode {
OBDRAW_WIRE_ON_DEPTH= 2
} eWireDrawMode;
+/* user data structures for derived mesh callbacks */
+typedef struct foreachScreenVert_userData {
+ void (*func)(void *userData, EditVert *eve, int x, int y, int index);
+ void *userData;
+ ViewContext vc;
+ eV3DClipTest clipVerts;
+} foreachScreenVert_userData;
+
+typedef struct foreachScreenEdge_userData {
+ void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
+ void *userData;
+ ViewContext vc;
+ eV3DClipTest clipVerts;
+} foreachScreenEdge_userData;
+
+typedef struct foreachScreenFace_userData {
+ void (*func)(void *userData, EditFace *efa, int x, int y, int index);
+ void *userData;
+ ViewContext vc;
+} foreachScreenFace_userData;
+
+typedef struct drawDMVerts_userData {
+ int sel;
+ EditVert *eve_act;
+} drawDMVerts_userData;
+
+typedef struct drawDMEdgesSel_userData {
+ unsigned char *baseCol, *selCol, *actCol;
+ EditEdge *eed_act;
+} drawDMEdgesSel_userData;
+
+typedef struct drawDMFacesSel_userData {
+ unsigned char *cols[3];
+ EditFace *efa_act;
+ int *orig_index;
+} drawDMFacesSel_userData;
+
+typedef struct bbsObmodeMeshVerts_userData {
+ void *offset;
+ MVert *mvert;
+} bbsObmodeMeshVerts_userData;
+
static void draw_bounding_volume(Scene *scene, Object *ob, char type);
static void drawcube_size(float size);
@@ -265,7 +307,7 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
return (scene->gm.matmode == GAME_MAT_GLSL) && (dt > OB_SOLID);
}
-static int check_material_alpha(Base *base, int glsl)
+static int check_alpha_pass(Base *base)
{
if(base->flag & OB_FROMDUPLI)
return 0;
@@ -273,7 +315,7 @@ static int check_material_alpha(Base *base, int glsl)
if(G.f & G_PICKSEL)
return 0;
- return (glsl || (base->object->dtx & OB_DRAWTRANSP));
+ return (base->object->dtx & OB_DRAWTRANSP);
}
/***/
@@ -689,7 +731,8 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3],
const float size= ED_view3d_pixel_size(rv3d, co) * (float)U.obcenter_dia * 0.5f;
float verts[CIRCLE_RESOL][3];
- /* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */
+ /* using gldepthfunc guarantees that it does write z values,
+ * but not checks for it, so centers remain visible independt order of drawing */
if(v3d->zbuf) glDepthFunc(GL_ALWAYS);
glEnable(GL_BLEND);
@@ -750,10 +793,14 @@ void view3d_cached_text_draw_begin(void)
CachedTextLevel++;
}
-void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag, const unsigned char col[4])
+void view3d_cached_text_draw_add(const float co[3],
+ const char *str,
+ short xoffs, short flag,
+ const unsigned char col[4])
{
int alloc_len= strlen(str) + 1;
ListBase *strings= &CachedText[CachedTextLevel-1];
+ /* TODO, replace with more efficient malloc, perhaps memarena per draw? */
ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString) + alloc_len, "ViewCachedString");
BLI_addtail(strings, vos);
@@ -815,7 +862,9 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
else glDepthMask(0);
for(vos= strings->first; vos; vos= vos->next) {
-#if 0 // too slow, reading opengl info while drawing is very bad, better to see if we can use the zbuffer while in pixel space - campbell
+ /* too slow, reading opengl info while drawing is very bad,
+ * better to see if we can use the zbuffer while in pixel space - campbell */
+#if 0
if(v3d->zbuf && (vos->flag & V3D_CACHE_TEXT_ZBUF)) {
gluProject(vos->vec[0], vos->vec[1], vos->vec[2], mats.modelview, mats.projection, (GLint *)mats.viewport, &ux, &uy, &uz);
glReadPixels(ar->winrct.xmin+vos->mval[0]+vos->xoffs, ar->winrct.ymin+vos->mval[1], 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
@@ -831,12 +880,14 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
glColor3ubv(vos->col.ub);
col_pack_prev= vos->col.pack;
}
- if(vos->flag & V3D_CACHE_TEXT_ASCII) {
- BLF_draw_default_ascii((float)vos->sco[0]+vos->xoffs, (float)vos->sco[1], (depth_write)? 0.0f: 2.0f, str, vos->str_len);
- }
- else {
- BLF_draw_default((float)vos->sco[0]+vos->xoffs, (float)vos->sco[1], (depth_write)? 0.0f: 2.0f, str, vos->str_len);
- }
+ ((vos->flag & V3D_CACHE_TEXT_ASCII) ?
+ BLF_draw_default_ascii :
+ BLF_draw_default
+ ) ( (float)vos->sco[0] + vos->xoffs,
+ (float)vos->sco[1],
+ (depth_write) ? 0.0f: 2.0f,
+ str,
+ vos->str_len);
}
}
@@ -891,8 +942,12 @@ static void drawcube(void)
static void drawcube_size(float size)
{
glBegin(GL_LINE_STRIP);
- glVertex3f(-size,-size,-size); glVertex3f(-size,-size,size);glVertex3f(-size,size,size); glVertex3f(-size,size,-size);
- glVertex3f(-size,-size,-size); glVertex3f(size,-size,-size);glVertex3f(size,-size,size); glVertex3f(size,size,size);
+ glVertex3f(-size,-size,-size); glVertex3f(-size,-size,size);
+ glVertex3f(-size,size,size); glVertex3f(-size,size,-size);
+
+ glVertex3f(-size,-size,-size); glVertex3f(size,-size,-size);
+ glVertex3f(size,-size,size); glVertex3f(size,size,size);
+
glVertex3f(size,size,-size); glVertex3f(size,-size,-size);
glEnd();
@@ -1445,48 +1500,49 @@ static void draw_bundle_sphere(void)
glCallList(displist);
}
-static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, int flag)
+static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *v3d,
+ MovieClip *clip, MovieTrackingObject *tracking_object, int flag, int *global_track_index)
{
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
- float mat[4][4], imat[4][4], curcol[4];
+ float mat[4][4], imat[4][4];
unsigned char col[4], scol[4];
- int bundlenr= 1;
-
- if((v3d->flag2&V3D_SHOW_RECONSTRUCTION)==0)
- return;
-
- if(v3d->flag2&V3D_RENDER_OVERRIDE)
- return;
-
- glGetFloatv(GL_CURRENT_COLOR, curcol);
+ int tracknr= *global_track_index;
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, tracking_object);
UI_GetThemeColor4ubv(TH_TEXT, col);
UI_GetThemeColor4ubv(TH_SELECT, scol);
BKE_get_tracking_mat(scene, base->object, mat);
- glEnable(GL_LIGHTING);
- glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- glShadeModel(GL_SMOOTH);
+ glPushMatrix();
- /* current ogl matrix is translated in camera space, bundles should
- be rendered in world space, so camera matrix should be "removed"
- from current ogl matrix */
- invert_m4_m4(imat, base->object->obmat);
+ if(tracking_object->flag & TRACKING_OBJECT_CAMERA) {
+ /* current ogl matrix is translated in camera space, bundles should
+ be rendered in world space, so camera matrix should be "removed"
+ from current ogl matrix */
+ invert_m4_m4(imat, base->object->obmat);
- glPushMatrix();
- glMultMatrixf(imat);
- glMultMatrixf(mat);
+ glMultMatrixf(imat);
+ glMultMatrixf(mat);
+ }
+ else {
+ float obmat[4][4];
+
+ BKE_tracking_get_interpolated_camera(tracking, tracking_object, scene->r.cfra, obmat);
+
+ invert_m4_m4(imat, obmat);
+ glMultMatrixf(imat);
+ }
+
+ for (track= tracksbase->first; track; track= track->next) {
+ int selected= TRACK_SELECTED(track);
- for ( track= tracking->tracks.first; track; track= track->next) {
- int selected= track->flag&SELECT || track->pat_flag&SELECT || track->search_flag&SELECT;
if((track->flag&TRACK_HAS_BUNDLE)==0)
continue;
if(flag&DRAW_PICKING)
- glLoadName(base->selcol + (bundlenr<<16));
+ glLoadName(base->selcol + (tracknr<<16));
glPushMatrix();
glTranslatef(track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
@@ -1494,7 +1550,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
if(v3d->drawtype==OB_WIRE) {
glDisable(GL_LIGHTING);
- glDepthMask(0);
if(selected) {
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
@@ -1506,7 +1561,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
drawaxes(0.05f, v3d->bundle_drawtype);
- glDepthMask(1);
glEnable(GL_LIGHTING);
} else if(v3d->drawtype>OB_WIRE) {
if(v3d->bundle_drawtype==OB_EMPTY_SPHERE) {
@@ -1515,7 +1569,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
else UI_ThemeColor(TH_SELECT);
- glDepthMask(0);
glLineWidth(2.f);
glDisable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -1525,7 +1578,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_LIGHTING);
glLineWidth(1.f);
- glDepthMask(1);
}
if(track->flag&TRACK_CUSTOMCOLOR) glColor3fv(track->color);
@@ -1534,7 +1586,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
draw_bundle_sphere();
} else {
glDisable(GL_LIGHTING);
- glDepthMask(0);
if(selected) {
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
@@ -1546,7 +1597,6 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
drawaxes(0.05f, v3d->bundle_drawtype);
- glDepthMask(1);
glEnable(GL_LIGHTING);
}
}
@@ -1564,32 +1614,67 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
view3d_cached_text_draw_add(pos, track->name, 10, V3D_CACHE_TEXT_GLOBALSPACE, tcol);
}
- bundlenr++;
+ tracknr++;
}
if((flag & DRAW_PICKING)==0) {
- if(v3d->flag2&V3D_SHOW_CAMERAPATH && clip->tracking.reconstruction.camnr) {
- int a= 0;
- MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
- MovieReconstructedCamera *camera= tracking->reconstruction.cameras;
+ if((v3d->flag2&V3D_SHOW_CAMERAPATH) && (tracking_object->flag&TRACKING_OBJECT_CAMERA)) {
+ MovieTrackingReconstruction *reconstruction;
+ reconstruction= BKE_tracking_object_reconstruction(tracking, tracking_object);
- glDisable(GL_LIGHTING);
- UI_ThemeColor(TH_CAMERA_PATH);
- glLineWidth(2.0f);
+ if(reconstruction->camnr) {
+ MovieReconstructedCamera *camera= reconstruction->cameras;
+ int a= 0;
- glBegin(GL_LINE_STRIP);
- for(a= 0; a<reconstruction->camnr; a++, camera++) {
- glVertex3fv(camera->mat[3]);
- }
- glEnd();
+ glDisable(GL_LIGHTING);
+ UI_ThemeColor(TH_CAMERA_PATH);
+ glLineWidth(2.0f);
- glLineWidth(1.0f);
- glEnable(GL_LIGHTING);
+ glBegin(GL_LINE_STRIP);
+ for(a= 0; a<reconstruction->camnr; a++, camera++) {
+ glVertex3fv(camera->mat[3]);
+ }
+ glEnd();
+
+ glLineWidth(1.0f);
+ glEnable(GL_LIGHTING);
+ }
}
}
glPopMatrix();
+ *global_track_index= tracknr;
+}
+
+static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, int flag)
+{
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *tracking_object;
+ float curcol[4];
+ int global_track_index= 1;
+
+ if((v3d->flag2&V3D_SHOW_RECONSTRUCTION)==0)
+ return;
+
+ if(v3d->flag2&V3D_RENDER_OVERRIDE)
+ return;
+
+ glGetFloatv(GL_CURRENT_COLOR, curcol);
+
+ glEnable(GL_LIGHTING);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ glShadeModel(GL_SMOOTH);
+
+ tracking_object= tracking->objects.first;
+ while(tracking_object) {
+ draw_viewport_object_reconstruction(scene, base, v3d, clip, tracking_object,
+ flag, &global_track_index);
+
+ tracking_object= tracking_object->next;
+ }
+
/* restore */
glShadeModel(GL_FLAT);
glDisable(GL_COLOR_MATERIAL);
@@ -1717,7 +1802,8 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base
}
/* flag similar to draw_object() */
-static void drawspeaker(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D *UNUSED(rv3d), Object *UNUSED(ob), int UNUSED(flag))
+static void drawspeaker(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D *UNUSED(rv3d),
+ Object *UNUSED(ob), int UNUSED(flag))
{
//Speaker *spk = ob->data;
@@ -1900,9 +1986,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
* use the object matrix in the useual way */
static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
- struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index);
- void *userData; ViewContext vc; eV3DClipTest clipVerts; } *data = userData;
-
+ foreachScreenVert_userData *data = userData;
EditVert *eve = EM_get_vert_for_index(index);
if (eve->h==0) {
@@ -1919,11 +2003,12 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co
}
}
-void mesh_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, eV3DClipTest clipVerts)
+void mesh_foreachScreenVert(
+ ViewContext *vc,
+ void (*func)(void *userData, EditVert *eve, int x, int y, int index),
+ void *userData, eV3DClipTest clipVerts)
{
- struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index);
- void *userData; ViewContext vc; eV3DClipTest clipVerts; } data;
-
+ foreachScreenVert_userData data;
DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
data.vc= *vc;
@@ -1977,8 +2062,7 @@ static int is_co_in_region(ARegion *ar, const short co[2])
}
static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
{
- struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
- void *userData; ViewContext vc; eV3DClipTest clipVerts; } *data = userData;
+ foreachScreenEdge_userData *data = userData;
EditEdge *eed = EM_get_edge_for_index(index);
short s[2][2];
@@ -2004,10 +2088,12 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
}
}
-void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, eV3DClipTest clipVerts)
+void mesh_foreachScreenEdge(
+ ViewContext *vc,
+ void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index),
+ void *userData, eV3DClipTest clipVerts)
{
- struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index);
- void *userData; ViewContext vc; eV3DClipTest clipVerts; } data;
+ foreachScreenEdge_userData data;
DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
data.vc= *vc;
@@ -2027,7 +2113,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, EditEd
static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
{
- struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; } *data = userData;
+ foreachScreenFace_userData *data = userData;
EditFace *efa = EM_get_face_for_index(index);
short s[2];
@@ -2040,9 +2126,12 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *ce
}
}
-void mesh_foreachScreenFace(ViewContext *vc, void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
+void mesh_foreachScreenFace(
+ ViewContext *vc,
+ void (*func)(void *userData, EditFace *efa, int x, int y, int index),
+ void *userData)
{
- struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ViewContext vc; } data;
+ foreachScreenFace_userData data;
DerivedMesh *dm = editmesh_get_derived_cage(vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
data.vc= *vc;
@@ -2059,7 +2148,10 @@ void mesh_foreachScreenFace(ViewContext *vc, void (*func)(void *userData, EditFa
dm->release(dm);
}
-void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
+void nurbs_foreachScreenVert(
+ ViewContext *vc,
+ void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y),
+ void *userData)
{
Curve *cu= vc->obedit->data;
short s[2] = {IS_CLIPPED, 0};
@@ -2184,7 +2276,7 @@ static void draw_dm_vert_normals(Scene *scene, DerivedMesh *dm)
/* Draw verts with color set based on selection */
static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
- struct { int sel; EditVert *eve_act; } * data = userData;
+ drawDMVerts_userData * data = userData;
EditVert *eve = EM_get_vert_for_index(index);
if (eve->h==0 && (eve->f&SELECT)==data->sel) {
@@ -2211,7 +2303,7 @@ static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *
static void draw_dm_verts(DerivedMesh *dm, int sel, EditVert *eve_act)
{
- struct { int sel; EditVert *eve_act; } data;
+ drawDMVerts_userData data;
data.sel = sel;
data.eve_act = eve_act;
@@ -2225,7 +2317,7 @@ static int draw_dm_edges_sel__setDrawOptions(void *userData, int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
//unsigned char **cols = userData, *col;
- struct { unsigned char *baseCol, *selCol, *actCol; EditEdge *eed_act; } * data = userData;
+ drawDMEdgesSel_userData * data = userData;
unsigned char *col;
if (eed->h==0) {
@@ -2249,7 +2341,7 @@ static int draw_dm_edges_sel__setDrawOptions(void *userData, int index)
}
static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditEdge *eed_act)
{
- struct { unsigned char *baseCol, *selCol, *actCol; EditEdge *eed_act; } data;
+ drawDMEdgesSel_userData data;
data.baseCol = baseCol;
data.selCol = selCol;
@@ -2323,7 +2415,7 @@ static void draw_dm_edges_sharp(DerivedMesh *dm)
* return 2 for the active face so it renders with stipple enabled */
static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
{
- struct { unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
+ drawDMFacesSel_userData * data = userData;
EditFace *efa = EM_get_face_for_index(index);
unsigned char *col;
@@ -2343,11 +2435,17 @@ static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNU
static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int next_index)
{
- struct { unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
- EditFace *efa = EM_get_face_for_index(index);
- EditFace *next_efa = EM_get_face_for_index(next_index);
+ drawDMFacesSel_userData *data = userData;
+ EditFace *efa;
+ EditFace *next_efa;
unsigned char *col, *next_col;
+ if(!data->orig_index)
+ return 0;
+
+ efa= EM_get_face_for_index(data->orig_index[index]);
+ next_efa= EM_get_face_for_index(data->orig_index[next_index]);
+
if(efa == next_efa)
return 1;
@@ -2366,13 +2464,14 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int
/* also draws the active face */
static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act)
{
- struct { unsigned char *cols[3]; EditFace *efa_act; } data;
+ drawDMFacesSel_userData data;
data.cols[0] = baseCol;
data.cols[1] = selCol;
data.cols[2] = actCol;
data.efa_act = efa_act;
+ data.orig_index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
- dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions);
+ dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions, &data, 0);
}
static int draw_dm_creases__setDrawOptions(void *UNUSED(userData), int index)
@@ -2439,7 +2538,8 @@ static void draw_dm_bweights(Scene *scene, DerivedMesh *dm)
/* EditMesh drawing routines*/
-static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, DerivedMesh *cageDM, EditVert *eve_act)
+static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
+ DerivedMesh *cageDM, EditVert *eve_act)
{
ToolSettings *ts= scene->toolsettings;
int sel;
@@ -2496,7 +2596,9 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, Deriv
glPointSize(1.0);
}
-static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh *cageDM, short sel_only, EditEdge *eed_act)
+static void draw_em_fancy_edges(Scene *scene, View3D *v3d,
+ Mesh *me, DerivedMesh *cageDM, short sel_only,
+ EditEdge *eed_act)
{
ToolSettings *ts= scene->toolsettings;
int pass;
@@ -2554,7 +2656,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh
}
}
-static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em, UnitSettings *unit)
+static void draw_em_measure_stats(View3D *v3d, Object *ob, EditMesh *em, UnitSettings *unit)
{
Mesh *me= ob->data;
EditEdge *eed;
@@ -2577,11 +2679,6 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
else if (grid < 1.0f) conv_float= "%.4g";
else if (grid < 10.0f) conv_float= "%.3g";
else conv_float= "%.2g";
-
- if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
- glDisable(GL_DEPTH_TEST);
-
- if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0f);
if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
@@ -2700,23 +2797,49 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
}
}
}
+}
- /* useful for debugging index vs shape key index */
-#if 0
- {
- EditVert *eve;
- int j;
+static void draw_em_indices(EditMesh *em)
+{
+ EditEdge *e;
+ EditFace *f;
+ EditVert *v;
+ int i;
+ char val[32];
+ float pos[3];
+ unsigned char col[4];
+
+ /* For now, reuse appropriate theme colors from stats text colors */
+
+ if (em->selectmode & SCE_SELECT_VERTEX) {
UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
- for(eve= em->verts.first, j= 0; eve; eve= eve->next, j++) {
- sprintf(val, "%d:%d", j, eve->keyindex);
- view3d_cached_text_draw_add(eve->co, val, 0, V3D_CACHE_TEXT_ASCII, col);
+ for (v = em->verts.first, i = 0; v; v = v->next, i++) {
+ if (v->f & SELECT) {
+ sprintf(val, "%d", i);
+ view3d_cached_text_draw_add(v->co, val, 0, V3D_CACHE_TEXT_ASCII, col);
+ }
}
}
-#endif
- if(v3d->zbuf) {
- glEnable(GL_DEPTH_TEST);
- bglPolygonOffset(rv3d->dist, 0.0f);
+ if (em->selectmode & SCE_SELECT_EDGE) {
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
+ for (e = em->edges.first, i = 0; e; e = e->next, i++) {
+ if (e->f & SELECT) {
+ sprintf(val, "%d", i);
+ mid_v3_v3v3(pos, e->v1->co, e->v2->co);
+ view3d_cached_text_draw_add(pos, val, 0, V3D_CACHE_TEXT_ASCII, col);
+ }
+ }
+ }
+
+ if (em->selectmode & SCE_SELECT_FACE) {
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col);
+ for (f = em->faces.first, i = 0; f; f = f->next, i++) {
+ if (f->f & SELECT) {
+ sprintf(val, "%d", i);
+ view3d_cached_text_draw_add(f->cent, val, 0, V3D_CACHE_TEXT_ASCII, col);
+ }
+ }
}
}
@@ -2739,7 +2862,8 @@ static int draw_em_fancy__setGLSLFaceOpts(void *UNUSED(userData), int index)
return (efa->h==0);
}
-static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
+static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d,
+ Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
{
Mesh *me = ob->data;
EditFace *efa_act = EM_get_actFace(em, 0); /* annoying but active faces is stored differently */
@@ -2764,11 +2888,11 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
if(CHECK_OB_DRAWTEXTURE(v3d, dt)) {
if(draw_glsl_material(scene, ob, v3d, dt)) {
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
-
+
finalDM->drawMappedFacesGLSL(finalDM, GPU_enable_material,
- draw_em_fancy__setGLSLFaceOpts, NULL);
+ draw_em_fancy__setGLSLFaceOpts, em);
GPU_disable_material();
-
+
glFrontFace(GL_CCW);
}
else {
@@ -2776,14 +2900,14 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
}
}
else {
- /* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
+ /* 3 floats for position,
+ * 3 for normal and times two because the faces may actually be quads instead of triangles */
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
-
+
glEnable(GL_LIGHTING);
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
-
- finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, NULL, 0, GPU_enable_material, NULL);
-
+ finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, GPU_enable_material, NULL, NULL, 0);
+
glFrontFace(GL_CCW);
glDisable(GL_LIGHTING);
}
@@ -2872,7 +2996,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
if(me->drawflag & ME_DRAWBWEIGHTS) {
draw_dm_bweights(scene, cageDM);
}
-
+
draw_em_fancy_edges(scene, v3d, me, cageDM, 0, eed_act);
}
if(em) {
@@ -2889,8 +3013,16 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_dm_vert_normals(scene, cageDM);
}
- if(me->drawflag & (ME_DRAWEXTRA_EDGELEN|ME_DRAWEXTRA_FACEAREA|ME_DRAWEXTRA_FACEANG) && !((v3d->flag2 & V3D_RENDER_OVERRIDE)))
- draw_em_measure_stats(v3d, rv3d, ob, em, &scene->unit);
+ if ( (me->drawflag & (ME_DRAWEXTRA_EDGELEN|ME_DRAWEXTRA_FACEAREA|ME_DRAWEXTRA_FACEANG)) &&
+ !(v3d->flag2 & V3D_RENDER_OVERRIDE))
+ {
+ draw_em_measure_stats(v3d, ob, em, &scene->unit);
+ }
+
+ if ((G.f & G_DEBUG) && (me->drawflag & ME_DRAWEXTRA_INDICES) &&
+ !(v3d->flag2 & V3D_RENDER_OVERRIDE)) {
+ draw_em_indices(em);
+ }
}
if(dt>OB_WIRE) {
@@ -2944,7 +3076,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
int /* totvert,*/ totedge, totface;
DerivedMesh *dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
ModifierData *md = NULL;
- int draw_flags = (ob==OBACT && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0;
+ const short is_obact= (ob == OBACT);
+ int draw_flags = (is_obact && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0;
if(!dm)
return;
@@ -2991,7 +3124,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else if(dt==OB_WIRE || totface==0) {
draw_wire= OBDRAW_WIRE_ON; /* draw wire only, no depth buffer stuff */
}
- else if ( (draw_flags & DRAW_FACE_SELECT || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
+ else if ( (draw_flags & DRAW_FACE_SELECT || (is_obact && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
if ( (v3d->flag & V3D_SELECT_OUTLINE) &&
@@ -3019,7 +3152,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
if(!(draw_flags & DRAW_FACE_SELECT)) {
if(base->flag & SELECT)
- UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
+ UI_ThemeColor(is_obact ? TH_ACTIVE : TH_SELECT);
else
UI_ThemeColor(TH_WIRE);
@@ -3028,11 +3161,11 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
}
else if(dt==OB_SOLID) {
- if(ob==OBACT && ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
+ if(is_obact && ob->mode & OB_MODE_WEIGHT_PAINT) {
/* weight paint in solid mode, special case. focus on making the weights clear
* rather than the shading, this is also forced in wire view */
GPU_enable_material(0, NULL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mface, 1);
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
@@ -3084,7 +3217,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
- dm->drawMappedFaces(dm, NULL, NULL, 1, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, NULL, GPU_enable_material, NULL, NULL, 1);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
@@ -3132,7 +3265,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glDisable(GL_LIGHTING);
if(base->flag & SELECT) {
- UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
+ UI_ThemeColor(is_obact ? TH_ACTIVE : TH_SELECT);
} else {
UI_ThemeColor(TH_WIRE);
}
@@ -3141,7 +3274,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
}
else if(dt==OB_PAINT) {
- if(ob==OBACT) {
+ if (is_obact) {
if(ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
/* enforce default material settings */
GPU_enable_material(0, NULL);
@@ -3156,7 +3289,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, me->mface, 1);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
@@ -3164,10 +3297,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
if(me->mcol)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, NULL, 1);
else {
glColor3f(1.0f, 1.0f, 1.0f);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, GPU_enable_material, NULL, NULL, 0);
}
}
}
@@ -3176,12 +3309,12 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* set default draw color back for wire or for draw-extra later on */
if (dt!=OB_WIRE) {
if(base->flag & SELECT) {
- if(ob==OBACT && ob->flag & OB_FROMGROUP)
+ if (is_obact && ob->flag & OB_FROMGROUP)
UI_ThemeColor(TH_GROUP_ACTIVE);
else if(ob->flag & OB_FROMGROUP)
UI_ThemeColorShade(TH_GROUP_ACTIVE, -16);
else if(flag!=DRAW_CONSTCOLOR)
- UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
+ UI_ThemeColor(is_obact ? TH_ACTIVE : TH_SELECT);
else
glColor3ub(80,80,80);
} else {
@@ -3200,7 +3333,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* When using wireframe object traw in particle edit mode
* the mesh gets in the way of seeing the particles, fade the wire color
* with the background. */
- if(ob==OBACT && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
+ if(is_obact && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
float col_wire[4], col_bg[4], col[3];
UI_GetThemeColor3fv(TH_BACK, col_bg);
@@ -3232,7 +3365,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
}
- if(paint_vertsel_test(ob)) {
+ if(is_obact && paint_vertsel_test(ob)) {
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
@@ -3251,7 +3384,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
Object *obedit= scene->obedit;
Mesh *me= ob->data;
EditMesh *em= me->edit_mesh;
- int do_alpha_pass= 0, drawlinked= 0, retval= 0, glsl, check_alpha, i;
+ int do_alpha_after= 0, drawlinked= 0, retval= 0, glsl, check_alpha, i;
/* If we are drawing shadows and any of the materials don't cast a shadow,
* then don't draw the object */
@@ -3296,11 +3429,11 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
if(me->totface<=4 || ED_view3d_boundbox_clip(rv3d, ob->obmat, (ob->bb)? ob->bb: me->bb)) {
glsl = draw_glsl_material(scene, ob, v3d, dt);
- check_alpha = check_material_alpha(base, glsl);
+ check_alpha = check_alpha_pass(base);
if(dt==OB_SOLID || glsl) {
GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl,
- (check_alpha)? &do_alpha_pass: NULL);
+ (check_alpha)? &do_alpha_after: NULL);
}
draw_mesh_fancy(scene, ar, v3d, rv3d, base, dt, flag);
@@ -3312,7 +3445,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
/* GPU_begin_object_materials checked if this is needed */
- if(do_alpha_pass) {
+ if(do_alpha_after) {
if(ob->dtx & OB_DRAWXRAY) {
add_view3d_after(&v3d->afterdraw_xraytransp, base, flag);
}
@@ -3733,7 +3866,8 @@ static void draw_particle_arrays(int draw_as, int totpoint, int ob_dt, int selec
break;
}
}
-static void draw_particle(ParticleKey *state, int draw_as, short draw, float pixsize, float imat[4][4], float *draw_line, ParticleBillboardData *bb, ParticleDrawData *pdd)
+static void draw_particle(ParticleKey *state, int draw_as, short draw, float pixsize,
+ float imat[4][4], float *draw_line, ParticleBillboardData *bb, ParticleDrawData *pdd)
{
float vec[3], vec2[3];
float *vd = NULL;
@@ -3888,7 +4022,8 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
/* 5. start filling the arrays */
/* 6. draw the arrays */
/* 7. clean up */
-static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int ob_dt)
+static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d,
+ Base *base, ParticleSystem *psys, int ob_dt)
{
Object *ob=base->object;
ParticleEditSettings *pset = PE_settings(scene);
@@ -3976,7 +4111,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
float mat[4][4];
- mul_m4_m4m4(mat, psys->imat, ob->obmat);
+ mult_m4_m4m4(mat, ob->obmat, psys->imat);
glMultMatrixf(mat);
}
@@ -6055,7 +6190,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{
static int warning_recursive= 0;
ModifierData *md = NULL;
- Object *ob;
+ Object *ob= base->object;
Curve *cu;
RegionView3D *rv3d= ar->regiondata;
float vec1[3], vec2[3];
@@ -6063,12 +6198,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
int /*sel, drawtype,*/ colindex= 0;
int i, selstart, selend, empty_object=0;
short dt, dtx, zbufoff= 0;
+ const short is_obact= (ob == OBACT);
/* only once set now, will be removed too, should become a global standard */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- ob= base->object;
-
if (ob!=scene->obedit) {
if (ob->restrictflag & OB_RESTRICT_VIEW)
return;
@@ -6194,7 +6328,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
dtx= 0;
/* faceselect exception: also draw solid when dt==wire, except in editmode */
- if(ob==OBACT && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ if (is_obact && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
if(ob->type==OB_MESH) {
if(ob->mode & OB_MODE_EDIT);
@@ -6390,9 +6524,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
break;
case OB_CAMERA:
- if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0 || (rv3d->persp==RV3D_CAMOB && v3d->camera==ob)) /* special exception for active camera */
- drawcamera(scene, v3d, rv3d, base, flag);
+ if ( (v3d->flag2 & V3D_RENDER_OVERRIDE)==0 ||
+ (rv3d->persp==RV3D_CAMOB && v3d->camera==ob)) /* special exception for active camera */
+ {
+ drawcamera(scene, v3d, rv3d, base, flag);
break;
+ }
case OB_SPEAKER:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
drawspeaker(scene, v3d, rv3d, ob, flag);
@@ -6456,7 +6593,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
/* run this so that possible child particles get cached */
- if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) {
+ if (ob->mode & OB_MODE_PARTICLE_EDIT && is_obact) {
PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit && edit->psys == psys)
draw_update_ptcache_edit(scene, ob, edit);
@@ -6474,12 +6611,12 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* draw edit particles last so that they can draw over child particles */
- if( (warning_recursive==0) &&
- (flag & DRAW_PICKING)==0 &&
- (!scene->obedit)
- ) {
+ if ( (warning_recursive==0) &&
+ (flag & DRAW_PICKING)==0 &&
+ (!scene->obedit))
+ {
- if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) {
+ if (ob->mode & OB_MODE_PARTICLE_EDIT && is_obact) {
PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit) {
glLoadMatrixf(rv3d->viewmat);
@@ -6539,7 +6676,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
// #if 0
smd->domain->tex = NULL;
GPU_create_smoke(smd, 0);
- draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex,
+ smd->domain->p0, smd->domain->p1,
+ smd->domain->res, smd->domain->dx,
+ smd->domain->tex_shadow);
GPU_free_smoke(smd);
// #endif
#if 0
@@ -6590,7 +6730,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{
smd->domain->tex = NULL;
GPU_create_smoke(smd, 1);
- draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex,
+ smd->domain->p0, smd->domain->p1,
+ smd->domain->res_wt, smd->domain->dx_wt,
+ smd->domain->tex_shadow);
GPU_free_smoke(smd);
}
}
@@ -6671,7 +6814,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(v3d->flag2 & V3D_RENDER_OVERRIDE) return;
/* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
- if(ob!=OBACT || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ if (!is_obact || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
int do_draw_center= -1; /* defines below are zero or positive... */
if(v3d->flag2 & V3D_RENDER_OVERRIDE) {
@@ -6736,7 +6879,34 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
ListBase targets = {NULL, NULL};
bConstraintTarget *ct;
- if ((curcon->flag & CONSTRAINT_EXPAND) && (cti) && (cti->get_constraint_targets)) {
+ if(ELEM(cti->type, CONSTRAINT_TYPE_FOLLOWTRACK, CONSTRAINT_TYPE_OBJECTSOLVER)) {
+ /* special case for object solver and follow track constraints because they don't fill
+ constraint targets properly (design limitation -- scene is needed for their target
+ but it can't be accessed from get_targets callvack) */
+
+ Object *camob= NULL;
+
+ if(cti->type==CONSTRAINT_TYPE_FOLLOWTRACK) {
+ bFollowTrackConstraint *data= (bFollowTrackConstraint *)curcon->data;
+
+ camob= data->camera ? data->camera : scene->camera;
+ }
+ else if(cti->type==CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data= (bObjectSolverConstraint *)curcon->data;
+
+ camob= data->camera ? data->camera : scene->camera;
+ }
+
+ if(camob) {
+ setlinestyle(3);
+ glBegin(GL_LINES);
+ glVertex3fv(camob->obmat[3]);
+ glVertex3fv(ob->obmat[3]);
+ glEnd();
+ setlinestyle(0);
+ }
+ }
+ else if ((curcon->flag & CONSTRAINT_EXPAND) && (cti) && (cti->get_constraint_targets)) {
cti->get_constraint_targets(curcon, &targets);
for (ct= targets.first; ct; ct= ct->next) {
@@ -6770,7 +6940,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
- struct {void* offset; MVert *mvert;} *data = userData;
+ bbsObmodeMeshVerts_userData *data = userData;
MVert *mv = &data->mvert[index];
int offset = (intptr_t) data->offset;
@@ -6782,7 +6952,7 @@ static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, float *co,
static void bbs_obmode_mesh_verts(Object *ob, DerivedMesh *dm, int offset)
{
- struct {void* offset; struct MVert *mvert;} data;
+ bbsObmodeMeshVerts_userData data;
Mesh *me = ob->data;
MVert *mvert = me->mvert;
data.mvert = mvert;
@@ -6854,12 +7024,13 @@ static void bbs_mesh_solid__drawCenter(void *UNUSED(userData), int index, float
}
/* two options, facecolors or black */
-static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh *dm, int facecol)
+static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d,
+ Object *ob, DerivedMesh *dm, int facecol)
{
cpack(0);
if (facecol) {
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*)(intptr_t) 1, 0, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, GPU_enable_material, NULL, (void*)(intptr_t) 1, 0);
if(check_ob_drawface_dot(scene, v3d, ob->dt)) {
glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE));
@@ -6870,7 +7041,7 @@ static void bbs_mesh_solid_EM(Scene *scene, View3D *v3d, Object *ob, DerivedMesh
}
} else {
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*) 0, 0, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, GPU_enable_material, NULL, (void*) 0, 0);
}
}
@@ -6909,9 +7080,11 @@ static void bbs_mesh_solid(Scene *scene, Object *ob)
Mesh *me = (Mesh*)ob->data;
glColor3ub(0, 0, 0);
-
- if((me->editflag & ME_EDIT_PAINT_MASK)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0, GPU_enable_material, NULL);
- else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0, GPU_enable_material, NULL);
+
+ if((me->editflag & ME_EDIT_PAINT_MASK))
+ dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, GPU_enable_material, NULL, me, 0);
+ else
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, GPU_enable_material, NULL, me, 0);
dm->release(dm);
}
@@ -6969,7 +7142,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
glColor3ub(0, 0, 0);
- dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, me, 0, GPU_enable_material, NULL);
+ dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, GPU_enable_material, NULL, me, 0);
bbs_obmode_mesh_verts(ob, dm, 1);
@@ -7035,7 +7208,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
GPU_end_object_materials();
}
else if(edm)
- edm->drawMappedFaces(edm, NULL, NULL, 0, GPU_enable_material, NULL);
+ edm->drawMappedFaces(edm, NULL, GPU_enable_material, NULL, NULL, 0);
glDisable(GL_LIGHTING);
}
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index 6605d488d36..8308a4a9ccf 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -158,23 +158,6 @@ static int convex(float *p0, float *up, float *a, float *b)
return dot_v3v3(up, tmp) >= 0;
}
-// copied from gpu_extension.c
-static int is_pow2(int n)
-{
- return ((n)&(n-1))==0;
-}
-
-static int larger_pow2(int n)
-{
- if (is_pow2(n))
- return n;
-
- while(!is_pow2(n))
- n= n&(n-1);
-
- return n*2;
-}
-
void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
{
RegionView3D *rv3d= ar->regiondata;
@@ -379,9 +362,9 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
printf("No volume shadow\n");
if (!GPU_non_power_of_two_support()) {
- cor[0] = (float)res[0]/(float)larger_pow2(res[0]);
- cor[1] = (float)res[1]/(float)larger_pow2(res[1]);
- cor[2] = (float)res[2]/(float)larger_pow2(res[2]);
+ cor[0] = (float)res[0]/(float)power_of_2_max_i(res[0]);
+ cor[1] = (float)res[1]/(float)power_of_2_max_i(res[1]);
+ cor[2] = (float)res[2]/(float)power_of_2_max_i(res[2]);
}
// our slices are defined by the plane equation a*x + b*y +c*z + d = 0
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c493e4af944..cac5d856652 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -204,8 +204,8 @@ ARegion *ED_view3d_context_region_unlock(bContext *C)
void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
{
/* local viewmat and persmat, to calculate projections */
- mul_m4_m4m4(rv3d->viewmatob, ob->obmat, rv3d->viewmat);
- mul_m4_m4m4(rv3d->persmatob, ob->obmat, rv3d->persmat);
+ mult_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->obmat);
+ mult_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->obmat);
/* initializes object space clipping, speeds up clip tests */
ED_view3d_local_clipping(rv3d, ob->obmat);
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 15494d73ea1..1b923c7a0cd 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -59,6 +59,7 @@
#include "BKE_mesh.h"
#include "BKE_screen.h"
#include "BKE_deform.h"
+#include "BKE_object.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -688,57 +689,51 @@ static void vgroup_copy_active_to_sel(Object *ob)
}
}
-static void vgroup_copy_active_to_sel_single(Object *ob, int def_nr)
+static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
{
EditVert *eve_act;
- MDeformVert *dvert_act;
+ MDeformVert *dv_act;
- act_vert_def(ob, &eve_act, &dvert_act);
+ act_vert_def(ob, &eve_act, &dv_act);
- if(dvert_act==NULL) {
+ if(dv_act==NULL) {
return;
}
else {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
EditVert *eve;
- MDeformVert *dvert;
+ MDeformVert *dv;
MDeformWeight *dw;
- float act_weight = -1.0f;
- int i;
+ float weight_act;
int index= 0;
- for(i=0, dw=dvert_act->dw; i < dvert_act->totweight; i++, dw++) {
- if(def_nr == dw->def_nr) {
- act_weight= dw->weight;
- break;
- }
- }
+ dw= defvert_find_index(dv_act, def_nr);
- if(act_weight < -0.5f)
+ if(dw == NULL)
return;
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- if(eve->f & SELECT && eve != eve_act) {
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- if(dvert) {
- for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
- if(def_nr == dw->def_nr) {
- dw->weight= act_weight;
+ weight_act= dw->weight;
- if(me->editflag & ME_EDIT_MIRROR_X)
- editvert_mirror_update(ob, eve, -1, index);
+ for (eve= em->verts.first; eve; eve= eve->next, index++) {
+ if (eve->f & SELECT && eve != eve_act) {
+ dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ if(dv) {
+ dw= defvert_find_index(dv, def_nr);
+ if (dw) {
+ dw->weight= weight_act;
- break;
+ if (me->editflag & ME_EDIT_MIRROR_X) {
+ editvert_mirror_update(ob, eve, -1, index);
}
}
}
}
}
- if(me->editflag & ME_EDIT_MIRROR_X)
+ if (me->editflag & ME_EDIT_MIRROR_X) {
editvert_mirror_update(ob, eve_act, -1, -1);
-
+ }
}
}
@@ -808,14 +803,15 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
Object *ob= OBACT;
EditVert *eve;
- MDeformVert *dvert;
+ MDeformVert *dv;
- act_vert_def(ob, &eve, &dvert);
+ act_vert_def(ob, &eve, &dv);
- if(dvert && dvert->totweight) {
+ if(dv && dv->totweight) {
uiLayout *col;
bDeformGroup *dg;
- int i;
+ MDeformWeight *dw = dv->dw;
+ unsigned int i;
int yco = 0;
uiBlockSetHandleFunc(block, do_view3d_vgroup_buttons, NULL);
@@ -825,11 +821,11 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
uiBlockBeginAlign(block);
- for (i=0; i<dvert->totweight; i++){
- dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
+ for (i= dv->totweight; i != 0; i--, dw++) {
+ dg = BLI_findlink (&ob->defbase, dw->def_nr);
if(dg) {
- uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dvert->dw[i].def_nr, dg->name, 0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
- uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, NULL, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
+ uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dw->def_nr, dg->name, 0, yco, 180, 20, &dw->weight, 0.0, 1.0, 1, 3, "");
+ uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dw->def_nr, "C", 180,yco,20,20, NULL, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
yco -= 20;
}
}
@@ -1110,14 +1106,6 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
}
}
-/* test if 'ob' is a parent somewhere in par's parents */
-static int test_parent_loop(Object *par, Object *ob)
-{
- if(par == NULL) return 0;
- if(ob == par) return 1;
- return test_parent_loop(par->parent, ob);
-}
-
static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event)
{
Main *bmain= CTX_data_main(C);
@@ -1149,7 +1137,7 @@ static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event
/* note; this case also used for parbone */
case B_OBJECTPANELPARENT:
if(ob) {
- if(ob->id.lib || test_parent_loop(ob->parent, ob) )
+ if (ob->id.lib || BKE_object_parent_loop_check(ob->parent, ob))
ob->parent= NULL;
else {
DAG_scene_sort(bmain, scene);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 3f979787a1f..d3a0ee27256 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1521,9 +1521,6 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
clip= NULL;
if(bgpic->flag&V3D_BGPIC_CAMERACLIP) {
- if(!scene->camera)
- scene->camera= scene_find_camera(scene);
-
if(scene->camera)
clip= object_get_movieclip(scene, scene->camera, 1);
} else clip= bgpic->clip;
@@ -1993,7 +1990,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
setwinmatrixview3d(ar, v3d, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
- mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
@@ -2028,7 +2025,7 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
setwinmatrixview3d(ar, v3d, NULL); /* 0= no pick rect */
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
- mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
@@ -2219,7 +2216,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
copy_m4_m4(rv3d.winmat, winmat);
copy_m4_m4(rv3d.viewmat, viewmat);
invert_m4_m4(rv3d.viewinv, rv3d.viewmat);
- mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat);
+ mult_m4_m4m4(rv3d.persmat, rv3d.winmat, rv3d.viewmat);
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat);
@@ -2301,7 +2298,7 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
/* update utilitity matrices */
- mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
@@ -2555,7 +2552,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, Object *camera, int w
v3d.lens= params.lens;
}
- mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat);
+ mult_m4_m4m4(rv3d.persmat, rv3d.winmat, rv3d.viewmat);
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height, flag, err_out);
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 6d2a745fd67..fa970f7f9d8 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -116,9 +116,9 @@ int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
ED_view3d_to_m4(view_mat, rv3d->ofs, rv3d->viewquat, rv3d->dist);
invert_m4_m4(v3d->camera->imat, v3d->camera->obmat);
- mul_m4_m4m4(diff_mat, v3d->camera->imat, view_mat);
+ mult_m4_m4m4(diff_mat, view_mat, v3d->camera->imat);
- mul_m4_m4m4(parent_mat, root_parent->obmat, diff_mat);
+ mult_m4_m4m4(parent_mat, diff_mat, root_parent->obmat);
object_tfm_protected_backup(root_parent, &obtfm);
object_apply_mat4(root_parent, parent_mat, TRUE, FALSE);
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 0cdb7a19995..981d46774dc 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -663,8 +663,8 @@ static void move_camera(bContext* C, RegionView3D* rv3d, FlyInfo* fly, int orien
ED_view3d_to_m4(prev_view_mat, fly->rv3d->ofs, fly->rv3d->viewquat, fly->rv3d->dist);
invert_m4_m4(prev_view_imat, prev_view_mat);
ED_view3d_to_m4(view_mat, rv3d->ofs, rv3d->viewquat, rv3d->dist);
- mul_m4_m4m4(diff_mat, prev_view_imat, view_mat);
- mul_m4_m4m4(parent_mat, fly->root_parent->obmat, diff_mat);
+ mult_m4_m4m4(diff_mat, view_mat, prev_view_imat);
+ mult_m4_m4m4(parent_mat, diff_mat, fly->root_parent->obmat);
object_apply_mat4(fly->root_parent, parent_mat, TRUE, FALSE);
// where_is_object(scene, fly->root_parent);
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index b9513ab0880..315da0423d1 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -276,23 +276,23 @@ static int modeselect_addmode(char *str, const char *title, int id, int icon)
static char *view3d_modeselect_pup(Scene *scene)
{
Object *ob= OBACT;
- static char string[256];
+ static char string[512];
const char *title= IFACE_("Mode: %t");
char *str = string;
BLI_strncpy(str, title, sizeof(string));
str += modeselect_addmode(str, N_("Object Mode"), OB_MODE_OBJECT, ICON_OBJECT_DATA);
-
+
if(ob==NULL || ob->data==NULL) return string;
if(ob->id.lib) return string;
-
+
if(!((ID *)ob->data)->lib) {
/* if active object is editable */
if ( ((ob->type == OB_MESH)
|| (ob->type == OB_CURVE) || (ob->type == OB_SURF) || (ob->type == OB_FONT)
|| (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) {
-
+
str += modeselect_addmode(str, N_("Edit Mode"), OB_MODE_EDIT, ICON_EDITMODE_HLT);
}
else if (ob->type == OB_ARMATURE) {
@@ -310,13 +310,16 @@ static char *view3d_modeselect_pup(Scene *scene)
str += modeselect_addmode(str, N_("Weight Paint"), OB_MODE_WEIGHT_PAINT, ICON_WPAINT_HLT);
}
}
-
+
/* if active object is an armature */
if (ob->type==OB_ARMATURE) {
str += modeselect_addmode(str, N_("Pose Mode"), OB_MODE_POSE, ICON_POSE_HLT);
}
- if (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody)) {
+ if ( ob->particlesystem.first ||
+ modifiers_findByType(ob, eModifierType_Cloth) ||
+ modifiers_findByType(ob, eModifierType_Softbody))
+ {
str += modeselect_addmode(str, N_("Particle Mode"), OB_MODE_PARTICLE_EDIT, ICON_PARTICLEMODE);
}
(void)str;
@@ -485,10 +488,12 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiBlockSetEmboss(block, UI_EMBOSS);
/* mode */
- if(ob)
+ if(ob) {
v3d->modeselect = ob->mode;
- else
+ }
+ else {
v3d->modeselect = OB_MODE_OBJECT;
+ }
row= uiLayoutRow(layout, 1);
uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) ,
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 33f7acf2a37..551eb3cd6b5 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -135,13 +135,13 @@ int view3d_get_view_aligned_coordinate(ViewContext *vc, float fp[3], const int m
/*
* ob == NULL if you want global matrices
* */
-void view3d_get_transformation(ARegion *ar, RegionView3D *rv3d, Object *ob, bglMats *mats)
+void view3d_get_transformation(const ARegion *ar, RegionView3D *rv3d, Object *ob, bglMats *mats)
{
float cpy[4][4];
int i, j;
if (ob) {
- mul_m4_m4m4(cpy, ob->obmat, rv3d->viewmat);
+ mult_m4_m4m4(cpy, rv3d->viewmat, ob->obmat);
} else {
copy_m4_m4(cpy, rv3d->viewmat);
}
@@ -1320,6 +1320,25 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2])
return basact;
}
+static void deselect_all_tracks(MovieTracking *tracking)
+{
+ MovieTrackingObject *object;
+
+ object= tracking->objects.first;
+ while(object) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
+
+ while(track) {
+ BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
+
+ track= track->next;
+ }
+
+ object= object->next;
+ }
+}
+
/* mval is region coords */
static int mouse_select(bContext *C, const int mval[2], short extend, short obcenter, short enumerate)
{
@@ -1391,27 +1410,41 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
if(basact->object->type==OB_CAMERA) {
if(BASACT==basact) {
int i, hitresult;
- MovieTrackingTrack *track;
+ int changed= 0;
for (i=0; i< hits; i++) {
hitresult= buffer[3+(i*4)];
/* if there's bundles in buffer select bundles first,
so non-camera elements should be ignored in buffer */
- if(basact->selcol != (hitresult & 0xFFFF))
+ if(basact->selcol != (hitresult & 0xFFFF)) {
continue;
+ }
/* index of bundle is 1<<16-based. if there's no "bone" index
in hight word, this buffer value belongs to camera,. not to bundle */
if(buffer[4*i+3] & 0xFFFF0000) {
MovieClip *clip= object_get_movieclip(scene, basact->object, 0);
- int selected;
- track= BKE_tracking_indexed_track(&clip->tracking, hitresult >> 16);
+ MovieTracking *tracking= &clip->tracking;
+ ListBase *tracksbase;
+ MovieTrackingTrack *track;
+
+ track= BKE_tracking_indexed_track(&clip->tracking, hitresult >> 16, &tracksbase);
+
+ if(TRACK_SELECTED(track) && extend) {
+ changed= 0;
+ BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
+ }
+ else {
+ int oldsel= TRACK_SELECTED(track) ? 1 : 0;
+ if(!extend)
+ deselect_all_tracks(tracking);
- selected= (track->flag&SELECT) || (track->pat_flag&SELECT) || (track->search_flag&SELECT);
+ BKE_tracking_select_track(tracksbase, track, TRACK_AREA_ALL, extend);
- if(selected && extend) BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
- else BKE_tracking_select_track(&clip->tracking, track, TRACK_AREA_ALL, extend);
+ if(oldsel!=(TRACK_SELECTED(track) ? 1 : 0))
+ changed= 1;
+ }
basact->flag|= SELECT;
basact->object->flag= basact->flag;
@@ -1424,6 +1457,12 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
break;
}
}
+
+ if(!changed) {
+ /* fallback to regular object selection if no new bundles were selected,
+ allows to select object parented to reconstruction object */
+ basact= mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, 0);
+ }
}
}
else if(ED_do_pose_selectbuffer(scene, basact, buffer, hits, extend) ) { /* then bone is found */
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index b2707db806f..ad2a0da4510 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -55,6 +55,7 @@
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_scene.h"
#include "BKE_tracking.h"
#include "WM_api.h"
@@ -91,9 +92,7 @@ static int tottrans= 0;
/* copied from editobject.c, now uses (almost) proper depgraph */
static void special_transvert_update(Object *obedit)
{
-
if(obedit) {
-
DAG_id_tag_update(obedit->data, 0);
if(obedit->type==OB_MESH) {
@@ -177,7 +176,7 @@ static void special_transvert_update(Object *obedit)
}
}
}
- if(arm->flag & ARM_MIRROR_EDIT)
+ if(arm->flag & ARM_MIRROR_EDIT)
transform_armature_mirror_update(obedit);
}
else if(obedit->type==OB_LATTICE) {
@@ -193,7 +192,7 @@ static void special_transvert_update(Object *obedit)
/* mode flags: */
#define TM_ALL_JOINTS 1 /* all joints (for bones only) */
#define TM_SKIP_HANDLES 2 /* skip handles when control point is selected (for curves only) */
-static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
+static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
{
Nurb *nu;
BezTriple *bezt;
@@ -278,7 +277,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
if ((tipsel && rootsel) || (rootsel)) {
/* Don't add the tip (unless mode & TM_ALL_JOINTS, for getting all joints),
* otherwise we get zero-length bones as tips will snap to the same
- * location as heads.
+ * location as heads.
*/
if (rootok) {
copy_v3_v3(tv->oldloc, ebo->head);
@@ -296,7 +295,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tv->flag= 1;
tv++;
tottrans++;
- }
+ }
}
else if (tipsel) {
copy_v3_v3(tv->oldloc, ebo->tail);
@@ -306,7 +305,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tv++;
tottrans++;
}
- }
+ }
}
}
else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
@@ -465,7 +464,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
if(obedit) {
tottrans= 0;
- if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
+ if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(obedit, bmat[0], bmat[1], 0);
if(tottrans==0) return OPERATOR_CANCELLED;
@@ -474,7 +473,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
-
copy_v3_v3(vec, tv->loc);
mul_m3_v3(bmat, vec);
add_v3_v3(vec, obedit->obmat[3]);
@@ -491,7 +489,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
MEM_freeN(transvmain);
transvmain= NULL;
-
}
else {
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
@@ -501,34 +498,42 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
bPoseChannel *pchan;
bArmature *arm= ob->data;
+ invert_m4_m4(ob->imat, ob->obmat);
+
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone->flag & BONE_SELECTED) {
if(pchan->bone->layer & arm->layer) {
- if((pchan->bone->flag & BONE_CONNECTED)==0) {
- float vecN[3], nLoc[3];
+ if((pchan->bone->flag & BONE_CONNECTED)==0) {
+ float nLoc[3];
+ float inv_restmat[4][4];
/* get nearest grid point to snap to */
copy_v3_v3(nLoc, pchan->pose_mat[3]);
+ /* We must operate in world space! */
+ mul_m4_v3(ob->obmat, nLoc);
vec[0]= gridf * (float)(floor(0.5f+ nLoc[0]/gridf));
vec[1]= gridf * (float)(floor(0.5f+ nLoc[1]/gridf));
vec[2]= gridf * (float)(floor(0.5f+ nLoc[2]/gridf));
+ /* Back in object space... */
+ mul_m4_v3(ob->imat, vec);
- /* get bone-space location of grid point */
- armature_loc_pose_to_bone(pchan, vec, vecN);
+ /* get location of grid point in *rest* bone-space */
+ invert_m4_m4(inv_restmat, pchan->bone->arm_mat);
+ mul_m4_v3(inv_restmat, vec);
/* adjust location */
- if ((pchan->protectflag & OB_LOCK_LOCX)==0)
- pchan->loc[0]= vecN[0];
- if ((pchan->protectflag & OB_LOCK_LOCY)==0)
- pchan->loc[0]= vecN[1];
- if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
- pchan->loc[0]= vecN[2];
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= vec[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= vec[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= vec[2];
/* auto-keyframing */
ED_autokeyframe_pchan(C, scene, ob, pchan, ks);
}
- /* if the bone has a parent and is connected to the parent,
- * don't do anything - will break chain unless we do auto-ik.
+ /* if the bone has a parent and is connected to the parent,
+ * don't do anything - will break chain unless we do auto-ik.
*/
}
}
@@ -572,7 +577,6 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Selection to Grid";
ot->description= "Snap selected item(s) to nearest grid node";
@@ -603,7 +607,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
if(obedit) {
tottrans= 0;
- if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
+ if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(obedit, bmat[0], bmat[1], 0);
if(tottrans==0) return OPERATOR_CANCELLED;
@@ -621,7 +625,6 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
MEM_freeN(transvmain);
transvmain= NULL;
-
}
else {
struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
@@ -630,34 +633,34 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
if(ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
bArmature *arm= ob->data;
- float cursp[3];
invert_m4_m4(ob->imat, ob->obmat);
- copy_v3_v3(cursp, curs);
- mul_m4_v3(ob->imat, cursp);
+ copy_v3_v3(vec, curs);
+ mul_m4_v3(ob->imat, vec);
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
if(pchan->bone->flag & BONE_SELECTED) {
if(pchan->bone->layer & arm->layer) {
- if((pchan->bone->flag & BONE_CONNECTED)==0) {
- float curspn[3];
+ if((pchan->bone->flag & BONE_CONNECTED)==0) {
+ float inv_restmat[4][4];
- /* get location of cursor in bone-space */
- armature_loc_pose_to_bone(pchan, cursp, curspn);
+ /* get location of cursor in *rest* bone-space */
+ invert_m4_m4(inv_restmat, pchan->bone->arm_mat);
+ mul_m4_v3(inv_restmat, vec);
/* copy new position */
- if ((pchan->protectflag & OB_LOCK_LOCX)==0)
- pchan->loc[0]= curspn[0];
- if ((pchan->protectflag & OB_LOCK_LOCY)==0)
- pchan->loc[1]= curspn[1];
- if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
- pchan->loc[2]= curspn[2];
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= vec[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= vec[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= vec[2];
/* auto-keyframing */
ED_autokeyframe_pchan(C, scene, ob, pchan, ks);
}
- /* if the bone has a parent and is connected to the parent,
- * don't do anything - will break chain unless we do auto-ik.
+ /* if the bone has a parent and is connected to the parent,
+ * don't do anything - will break chain unless we do auto-ik.
*/
}
}
@@ -701,7 +704,6 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Selection to Cursor";
ot->description= "Snap selected item(s) to cursor";
@@ -738,7 +740,6 @@ static int snap_curs_to_grid(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Cursor to Grid";
ot->description= "Snap cursor to nearest grid node";
@@ -756,28 +757,50 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
static void bundle_midpoint(Scene *scene, Object *ob, float vec[3])
{
- MovieTrackingTrack *track;
MovieClip *clip= object_get_movieclip(scene, ob, 0);
+ MovieTracking *tracking;
+ MovieTrackingObject *object;
int ok= 0;
- float min[3], max[3], mat[4][4], pos[3];
+ float min[3], max[3], mat[4][4], pos[3], cammat[4][4] = MAT4_UNITY;
if(!clip)
return;
+ tracking= &clip->tracking;
+
+ if(scene->camera)
+ copy_m4_m4(cammat, scene->camera->obmat);
+
BKE_get_tracking_mat(scene, ob, mat);
INIT_MINMAX(min, max);
- track= clip->tracking.tracks.first;
- while(track) {
- int selected= (track->flag&SELECT) || (track->pat_flag&SELECT) || (track->search_flag&SELECT);
- if((track->flag&TRACK_HAS_BUNDLE) && selected) {
- ok= 1;
- mul_v3_m4v3(pos, mat, track->bundle_pos);
- DO_MINMAX(pos, min, max);
+ for (object= tracking->objects.first; object; object= object->next) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
+ float obmat[4][4];
+
+ if(object->flag & TRACKING_OBJECT_CAMERA) {
+ copy_m4_m4(obmat, mat);
}
+ else {
+ float imat[4][4];
+
+ BKE_tracking_get_interpolated_camera(tracking, object, scene->r.cfra, imat);
+ invert_m4(imat);
+
+ mult_m4_m4m4(obmat, cammat, imat);
+ }
+
+ while(track) {
+ if((track->flag&TRACK_HAS_BUNDLE) && TRACK_SELECTED(track)) {
+ ok= 1;
+ mul_v3_m4v3(pos, obmat, track->bundle_pos);
+ DO_MINMAX(pos, min, max);
+ }
- track= track->next;
+ track= track->next;
+ }
}
if(ok) {
@@ -803,7 +826,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
if(obedit) {
tottrans=0;
- if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
+ if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS|TM_SKIP_HANDLES);
if(tottrans==0) return OPERATOR_CANCELLED;
@@ -881,10 +904,9 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Cursor to Selected";
- ot->description= "Snap cursor to center of selected item(s)";
+ ot->description= "Snap cursor to center of selected item(s)";
ot->idname= "VIEW3D_OT_snap_cursor_to_selected";
/* api callbacks */
@@ -932,7 +954,6 @@ static int snap_curs_to_active(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Cursor to Active";
ot->description= "Snap cursor to active item";
@@ -966,13 +987,12 @@ static int snap_curs_to_center(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Snap Cursor to Center";
ot->description= "Snap cursor to the Center";
ot->idname= "VIEW3D_OT_snap_cursor_to_center";
- /* api callbacks */
+ /* api callbacks */
ot->exec= snap_curs_to_center;
ot->poll= ED_operator_view3d_active;
@@ -990,7 +1010,7 @@ int minmax_verts(Object *obedit, float *min, float *max)
int a;
tottrans=0;
- if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
+ if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS);
if(tottrans==0) return 0;
@@ -998,12 +1018,12 @@ int minmax_verts(Object *obedit, float *min, float *max)
copy_m3_m4(bmat, obedit->obmat);
tv= transvmain;
- for(a=0; a<tottrans; a++, tv++) {
+ for(a=0; a<tottrans; a++, tv++) {
copy_v3_v3(vec, tv->loc);
mul_m3_v3(bmat, vec);
add_v3_v3(vec, obedit->obmat[3]);
add_v3_v3(centroid, vec);
- DO_MINMAX(vec, min, max);
+ DO_MINMAX(vec, min, max);
}
MEM_freeN(transvmain);
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index 5d65202d7df..49b1b3f723e 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -96,6 +96,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm
}
}
+/* TODO de-duplicate redo panel functions - campbell */
static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
{
wmOperator *op= WM_operator_last_redo(C);
@@ -108,7 +109,7 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
block= uiLayoutGetBlock(pa->layout);
- if(ED_undo_valid(C, op->type->name)==0)
+ if (!WM_operator_check_ui_enabled(C, op->type->name))
uiLayoutSetEnabled(pa->layout, 0);
/* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 90f617513a5..aa444125287 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -512,7 +512,7 @@ void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
/* ********************************** */
-void ED_view3d_calc_clipping(BoundBox *bb, float planes[4][4], bglMats *mats, rcti *rect)
+void ED_view3d_calc_clipping(BoundBox *bb, float planes[4][4], bglMats *mats, const rcti *rect)
{
float modelview[4][4];
double xs, ys, p[3];
@@ -740,8 +740,8 @@ void ED_view3d_ob_project_mat_get(RegionView3D *rv3d, Object *ob, float pmat[4][
{
float vmat[4][4];
- mul_m4_m4m4(vmat, ob->obmat, rv3d->viewmat);
- mul_m4_m4m4(pmat, vmat, rv3d->winmat);
+ mult_m4_m4m4(vmat, rv3d->viewmat, ob->obmat);
+ mult_m4_m4m4(pmat, rv3d->winmat, vmat);
}
#if 0
@@ -760,7 +760,7 @@ void view3d_unproject(bglMats *mats, float out[3], const short x, const short y,
#endif
/* use view3d_get_object_project_mat to get projecting mat */
-void ED_view3d_project_float(ARegion *ar, const float vec[3], float adr[2], float mat[4][4])
+void ED_view3d_project_float(const ARegion *ar, const float vec[3], float adr[2], float mat[4][4])
{
float vec4[4];
@@ -809,7 +809,7 @@ int ED_view3d_boundbox_clip(RegionView3D *rv3d, float obmat[][4], BoundBox *bb)
if(bb==NULL) return 1;
if(bb->flag & OB_BB_DISABLED) return 1;
- mul_m4_m4m4(mat, obmat, rv3d->persmat);
+ mult_m4_m4m4(mat, rv3d->persmat, obmat);
for(a=0; a<8; a++) {
copy_v3_v3(vec, bb->vec[a]);
@@ -1196,7 +1196,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
}
setwinmatrixview3d(ar, v3d, &rect);
- mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->viewmat, vc->rv3d->winmat);
+ mult_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat);
if(v3d->drawtype > OB_WIRE) {
v3d->zbuf= TRUE;
@@ -1274,7 +1274,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
G.f &= ~G_PICKSEL;
setwinmatrixview3d(ar, v3d, NULL);
- mul_m4_m4m4(vc->rv3d->persmat, vc->rv3d->viewmat, vc->rv3d->winmat);
+ mult_m4_m4m4(vc->rv3d->persmat, vc->rv3d->winmat, vc->rv3d->viewmat);
if(v3d->drawtype > OB_WIRE) {
v3d->zbuf= 0;
@@ -1715,6 +1715,10 @@ static int game_engine_exec(bContext *C, wmOperator *op)
if(!ED_view3d_context_activate(C))
return OPERATOR_CANCELLED;
+ /* redraw to hide any menus/popups, we don't go back to
+ the window manager until after this operator exits */
+ WM_redraw_windows(C);
+
rv3d= CTX_wm_region_view3d(C);
/* sa= CTX_wm_area(C); */ /* UNUSED */
ar= CTX_wm_region(C);
@@ -1723,7 +1727,11 @@ static int game_engine_exec(bContext *C, wmOperator *op)
game_set_commmandline_options(&startscene->gm);
- if(rv3d->persp==RV3D_CAMOB && startscene->gm.framing.type == SCE_GAMEFRAMING_BARS && startscene->gm.stereoflag != STEREO_DOME) { /* Letterbox */
+ if((rv3d->persp == RV3D_CAMOB) &&
+ (startscene->gm.framing.type == SCE_GAMEFRAMING_BARS) &&
+ (startscene->gm.stereoflag != STEREO_DOME))
+ {
+ /* Letterbox */
rctf cam_framef;
ED_view3d_calc_camera_border(startscene, ar, CTX_wm_view3d(C), rv3d, &cam_framef, FALSE);
cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin;
@@ -1750,6 +1758,8 @@ static int game_engine_exec(bContext *C, wmOperator *op)
CTX_wm_window_set(C, NULL);
}
+ ED_area_tag_redraw(CTX_wm_area(C));
+
if(prevwin) {
/* restore context, in case it changed in the meantime, for
example by working in another window or closing it */
@@ -1763,8 +1773,6 @@ static int game_engine_exec(bContext *C, wmOperator *op)
//XXX restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(CTX_data_main(C), startscene);
//XXX scene_update_for_newframe(bmain, scene, scene->lay);
-
- ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
#else
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index cee7b19470b..30337551fe5 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -376,7 +376,8 @@ static void viewRedrawPost(bContext *C, TransInfo *t)
/* ************************** TRANSFORMATIONS **************************** */
-void BIF_selectOrientation(void) {
+void BIF_selectOrientation(void)
+{
#if 0 // TRANSFORM_FIX_ME
short val;
char *str_menu = BIF_menustringTransformOrientation("Orientation");
@@ -584,6 +585,9 @@ int transformEvent(TransInfo *t, wmEvent *event)
}
applyMouseInput(t, &t->mouse, t->mval, t->values);
+
+ // Snapping mouse move events
+ t->redraw |= handleSnapping(t, event);
}
/* handle modal keymap first */
@@ -1026,7 +1030,7 @@ int transformEvent(TransInfo *t, wmEvent *event)
// Numerical input events
t->redraw |= handleNumInput(&(t->num), event);
- // Snapping events
+ // Snapping key events
t->redraw |= handleSnapping(t, event);
}
@@ -2547,7 +2551,8 @@ void initResize(TransInfo *t)
t->num.increment = t->snap[1];
}
-static void headerResize(TransInfo *t, float vec[3], char *str) {
+static void headerResize(TransInfo *t, float vec[3], char *str)
+{
char tvec[60];
char *spos= str;
if (hasNumInput(&t->num)) {
@@ -2607,7 +2612,8 @@ static void TransMat3ToSize( float mat[][3], float smat[][3], float *size)
}
-static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
+static void ElementResize(TransInfo *t, TransData *td, float mat[3][3])
+{
float tmat[3][3], smat[3][3], center[3];
float vec[3];
@@ -2904,7 +2910,8 @@ void initRotation(TransInfo *t)
copy_v3_v3(t->axis_orig, t->axis);
}
-static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short around) {
+static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short around)
+{
float vec[3], totmat[3][3], smat[3][3];
float eul[3], fmat[3][3], quat[4];
float *center = t->center;
@@ -3344,7 +3351,8 @@ void initTranslation(TransInfo *t)
t->num.increment = t->snap[1];
}
-static void headerTranslation(TransInfo *t, float vec[3], char *str) {
+static void headerTranslation(TransInfo *t, float vec[3], char *str)
+{
char *spos= str;
char tvec[60];
char distvec[20];
@@ -3418,7 +3426,8 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
(void)spos;
}
-static void applyTranslation(TransInfo *t, float vec[3]) {
+static void applyTranslation(TransInfo *t, float vec[3])
+{
TransData *td = t->data;
float tvec[3];
int i;
@@ -4099,7 +4108,8 @@ void initBoneSize(TransInfo *t)
t->num.increment = t->snap[1];
}
-static void headerBoneSize(TransInfo *t, float vec[3], char *str) {
+static void headerBoneSize(TransInfo *t, float vec[3], char *str)
+{
char tvec[60];
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
@@ -5302,7 +5312,8 @@ static void headerSeqSlide(TransInfo *t, float val[2], char *str)
sprintf(str, "Sequence Slide: %s%s", &tvec[0], t->con.text);
}
-static void applySeqSlide(TransInfo *t, float val[2]) {
+static void applySeqSlide(TransInfo *t, float val[2])
+{
TransData *td = t->data;
int i;
@@ -5826,7 +5837,8 @@ void initTimeScale(TransInfo *t)
t->num.increment = t->snap[1];
}
-static void headerTimeScale(TransInfo *t, char *str) {
+static void headerTimeScale(TransInfo *t, char *str)
+{
char tvec[60];
if (hasNumInput(&t->num))
@@ -5837,7 +5849,8 @@ static void headerTimeScale(TransInfo *t, char *str) {
sprintf(str, "ScaleX: %s", &tvec[0]);
}
-static void applyTimeScale(TransInfo *t) {
+static void applyTimeScale(TransInfo *t)
+{
Scene *scene = t->scene;
TransData *td = t->data;
TransData2D *td2d = t->data2d;
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 8b8ae95631c..2233aeda92e 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -65,15 +65,6 @@ struct wmTimer;
struct ARegion;
struct ReportList;
-/*
- The ctrl value has different meaning:
- 0 : No value has been typed
-
- otherwise, |value| - 1 is where the cursor is located after the period
- Positive : number is positive
- Negative : number is negative
-*/
-
typedef struct TransSnapPoint {
struct TransSnapPoint *next,*prev;
float co[3];
@@ -94,6 +85,7 @@ typedef struct TransSnap {
float snapNormal[3];
float snapTangent[3];
ListBase points;
+ TransSnapPoint *selectedPoint;
float dist; // Distance from snapPoint to snapTarget
double last;
void (*applySnap)(struct TransInfo *, float *);
@@ -130,7 +122,7 @@ typedef struct TransDataExtension {
// float drotAngle; /* Initial object drotAngle, TODO: not yet implimented */
// float drotAxis[3]; /* Initial object drotAxis, TODO: not yet implimented */
float dquat[4]; /* Initial object dquat */
- float dsize[3]; /* Initial object dsize */
+ float dscale[3]; /* Initial object dscale */
float *rot; /* Rotation of the data to transform (Faculative) */
float irot[3]; /* Initial rotation */
float *quat; /* Rotation quaternion of the data to transform (Faculative) */
@@ -618,6 +610,7 @@ int validSnappingNormal(TransInfo *t);
void getSnapPoint(TransInfo *t, float vec[3]);
void addSnapPoint(TransInfo *t);
+int updateSelectedSnapPoint(TransInfo *t);
void removeSnapPoint(TransInfo *t);
/********************** Mouse Input ******************************/
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index bfb96149ed3..b88e57e1861 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -138,7 +138,8 @@ void constraintNumInput(TransInfo *t, float vec[3])
}
}
-static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
+static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3])
+{
int i = 0;
mul_m3_v3(t->con.imtx, vec);
@@ -209,7 +210,8 @@ static void viewAxisCorrectCenter(TransInfo *t, float t_con_center[3])
}
}
-static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3]) {
+static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3])
+{
float norm[3], vec[3], factor, angle;
float t_con_center[3];
@@ -284,7 +286,8 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
}
}
-static void planeProjection(TransInfo *t, float in[3], float out[3]) {
+static void planeProjection(TransInfo *t, float in[3], float out[3])
+{
float vec[3], factor, norm[3];
add_v3_v3v3(vec, in, t->con.center);
@@ -547,7 +550,8 @@ static void applyObjectConstraintRot(TransInfo *t, TransData *td, float vec[3],
/*--------------------- INTERNAL SETUP CALLS ------------------*/
-void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]) {
+void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[])
+{
strncpy(t->con.text + 1, text, 48);
copy_m3_m3(t->con.mtx, space);
t->con.mode = mode;
@@ -562,7 +566,8 @@ void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[])
t->redraw = 1;
}
-void setLocalConstraint(TransInfo *t, int mode, const char text[]) {
+void setLocalConstraint(TransInfo *t, int mode, const char text[])
+{
if (t->flag & T_EDIT) {
float obmat[3][3];
copy_m3_m4(obmat, t->scene->obedit->obmat);
@@ -596,7 +601,8 @@ void setLocalConstraint(TransInfo *t, int mode, const char text[]) {
ftext is a format string passed to sprintf. It will add the name of
the orientation where %s is (logically).
*/
-void setUserConstraint(TransInfo *t, short orientation, int mode, const char ftext[]) {
+void setUserConstraint(TransInfo *t, short orientation, int mode, const char ftext[])
+{
char text[40];
switch(orientation) {
@@ -744,7 +750,8 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
}
}
-static void drawObjectConstraint(TransInfo *t) {
+static void drawObjectConstraint(TransInfo *t)
+{
int i;
TransData * td = t->data;
@@ -781,13 +788,15 @@ static void drawObjectConstraint(TransInfo *t) {
/*--------------------- START / STOP CONSTRAINTS ---------------------- */
-void startConstraint(TransInfo *t) {
+void startConstraint(TransInfo *t)
+{
t->con.mode |= CON_APPLY;
*t->con.text = ' ';
t->num.idx_max = MIN2(getConstraintSpaceDimension(t) - 1, t->idx_max);
}
-void stopConstraint(TransInfo *t) {
+void stopConstraint(TransInfo *t)
+{
t->con.mode &= ~(CON_APPLY|CON_SELECT);
*t->con.text = '\0';
t->num.idx_max = t->idx_max;
@@ -836,7 +845,8 @@ void initSelectConstraint(TransInfo *t, float mtx[3][3])
t->con.applyRot = applyAxisConstraintRot;
}
-void selectConstraint(TransInfo *t) {
+void selectConstraint(TransInfo *t)
+{
if (t->con.mode & CON_SELECT) {
setNearestAxis(t);
startConstraint(t);
@@ -970,7 +980,8 @@ void setNearestAxis(TransInfo *t)
/*-------------- HELPER FUNCTIONS ----------------*/
-char constraintModeToChar(TransInfo *t) {
+char constraintModeToChar(TransInfo *t)
+{
if ((t->con.mode & CON_APPLY)==0) {
return '\0';
}
@@ -990,7 +1001,8 @@ char constraintModeToChar(TransInfo *t) {
}
-int isLockConstraint(TransInfo *t) {
+int isLockConstraint(TransInfo *t)
+{
int mode = t->con.mode;
if ( (mode & (CON_AXIS0|CON_AXIS1)) == (CON_AXIS0|CON_AXIS1))
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index e19c115b194..bc7514b4c9a 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -118,7 +118,8 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list);
/* ************************** Functions *************************** */
-static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, TransData *temp) {
+static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, TransData *temp)
+{
TransData *ihead = head;
TransData *itail = tail;
*temp = *head;
@@ -165,7 +166,8 @@ static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, Tra
}
}
-void sort_trans_data_dist(TransInfo *t) {
+void sort_trans_data_dist(TransInfo *t)
+{
TransData temp;
TransData *start = t->data;
int i = 1;
@@ -294,7 +296,8 @@ static void createTransTexspace(TransInfo *t)
/* ********************* edge (for crease) ***** */
-static void createTransEdge(TransInfo *t) {
+static void createTransEdge(TransInfo *t)
+{
EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
TransData *td = NULL;
EditEdge *eed;
@@ -440,14 +443,14 @@ static short apply_targetless_ik(Object *ob)
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
mul_m4_v3(parchan->parent->pose_mat, rmat[3]);
- mul_m4_m4m4(tmat, offs_bone, rmat);
+ mult_m4_m4m4(tmat, rmat, offs_bone);
}
else if(parchan->bone->flag & BONE_NO_SCALE) {
- mul_m4_m4m4(tmat, offs_bone, parchan->parent->pose_mat);
+ mult_m4_m4m4(tmat, parchan->parent->pose_mat, offs_bone);
normalize_m4(tmat);
}
else
- mul_m4_m4m4(tmat, offs_bone, parchan->parent->pose_mat);
+ mult_m4_m4m4(tmat, parchan->parent->pose_mat, offs_bone);
invert_m4_m4(imat, tmat);
}
@@ -458,7 +461,7 @@ static short apply_targetless_ik(Object *ob)
invert_m4_m4(imat, tmat);
}
/* result matrix */
- mul_m4_m4m4(rmat, parchan->pose_mat, imat);
+ mult_m4_m4m4(rmat, imat, parchan->pose_mat);
/* apply and decompose, doesn't work for constraints or non-uniform scale well */
{
@@ -1325,7 +1328,8 @@ static void createTransMBallVerts(TransInfo *t)
/* ********************* curve/surface ********* */
-static void calc_distanceCurveVerts(TransData *head, TransData *tail) {
+static void calc_distanceCurveVerts(TransData *head, TransData *tail)
+{
TransData *td, *td_near = NULL;
for (td = head; td<=tail; td++) {
if (td->flag & TD_SELECTED) {
@@ -1370,7 +1374,8 @@ static void calc_distanceCurveVerts(TransData *head, TransData *tail) {
}
/* Utility function for getting the handle data from bezier's */
-static TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt) {
+static TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt)
+{
TransDataCurveHandleFlags *hdata;
td->flag |= TD_BEZTRIPLE;
hdata = td->hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
@@ -1543,8 +1548,10 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
/* TODO - in the case of tilt and radius we can also avoid allocating the initTransDataCurveHandles
* but for now just dont change handle types */
- if (ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT) == 0)
- testhandlesNurb(nu); /* sets the handles based on their selection, do this after the data is copied to the TransData */
+ if (ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT) == 0) {
+ /* sets the handles based on their selection, do this after the data is copied to the TransData */
+ testhandlesNurb(nu);
+ }
}
else {
TransData *head, *tail;
@@ -1919,8 +1926,8 @@ static void get_face_center(float *cent, EditMesh *em, EditVert *eve)
}
}
-//way to overwrite what data is edited with transform
-//static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key)
+/* way to overwrite what data is edited with transform
+ * static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key) */
static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert *eve)
{
td->flag = 0;
@@ -1952,33 +1959,6 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
}
}
-#if 0
-static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) {
- BME_Vert *v;
- BME_TransData *vtd;
- TransData *tob;
- int i;
-
- tob = t->data = MEM_callocN(td->len*sizeof(TransData), "TransObData(Bevel tool)");
-
- for (i=0,v=bm->verts.first;v;v=v->next) {
- if ( (vtd = BME_get_transdata(td,v)) ) {
- tob->loc = vtd->loc;
- tob->val = &vtd->factor;
- copy_v3_v3(tob->iloc,vtd->co);
- copy_v3_v3(tob->center,vtd->org);
- copy_v3_v3(tob->axismtx[0],vtd->vec);
- tob->axismtx[1][0] = vtd->max ? *vtd->max : 0;
- tob++;
- i++;
- }
- }
- /* since td is a memarena, it can hold more transdata than actual elements
- * (i.e. we can't depend on td->len to determine the number of actual elements) */
- t->total = i;
-}
-#endif
-
static void createTransEditVerts(bContext *C, TransInfo *t)
{
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -3470,7 +3450,10 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
* then check if we're using auto-handles.
* - If so, change them auto-handles to aligned handles so that handles get affected too
*/
- if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM) && ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM) && ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) {
+ if ( ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM) &&
+ ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM) &&
+ ELEM(t->mode, TFM_ROTATION, TFM_RESIZE))
+ {
if (hdata && (sel1) && (sel3)) {
bezt->h1= HD_ALIGN;
bezt->h2= HD_ALIGN;
@@ -4166,7 +4149,10 @@ static void createTransSeqData(bContext *C, TransInfo *t)
int i;
for(i=0; i<3; i++) {
seq_user= *((&seq->seq1) + i);
- if (seq_user && (seq_user->flag & SELECT) && !(seq_user->flag & SEQ_LOCK) && !(seq_user->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL))) {
+ if ( seq_user && (seq_user->flag & SELECT) &&
+ !(seq_user->flag & SEQ_LOCK) &&
+ !(seq_user->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)))
+ {
seq->flag |= SELECT;
}
}
@@ -4222,6 +4208,7 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
+ if (con->type == CONSTRAINT_TYPE_OBJECTSOLVER) return 1;
/* constraints that require this only under special conditions */
if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
@@ -4314,7 +4301,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->size = ob->size;
copy_v3_v3(td->ext->isize, ob->size);
- copy_v3_v3(td->ext->dsize, ob->dsize);
+ copy_v3_v3(td->ext->dscale, ob->dscale);
copy_v3_v3(td->center, ob->obmat[3]);
@@ -4465,7 +4452,8 @@ static int count_proportional_objects(TransInfo *t)
/* mark all children */
for (base= scene->base.first; base; base= base->next) {
/* all base not already selected or marked that is editable */
- if ((base->object->flag & (SELECT|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT)) == 0 && BASE_EDITABLE_BGMODE(v3d, scene, base))
+ if ( (base->object->flag & (SELECT|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT)) == 0 &&
+ (BASE_EDITABLE_BGMODE(v3d, scene, base)))
{
mark_children(base->object);
}
@@ -4476,7 +4464,8 @@ static int count_proportional_objects(TransInfo *t)
Object *ob= base->object;
/* if base is not selected, not a parent of selection or not a child of selection and it is editable */
- if ((ob->flag & (SELECT|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT)) == 0 && BASE_EDITABLE_BGMODE(v3d, scene, base))
+ if ( (ob->flag & (SELECT|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT)) == 0 &&
+ (BASE_EDITABLE_BGMODE(v3d, scene, base)))
{
/* used for flush, depgraph will change recalcs if needed :) */
@@ -4552,7 +4541,9 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
if (adt && adt->action) {
for (fcu= adt->action->curves.first; fcu; fcu= fcu->next) {
fcu->flag &= ~FCURVE_SELECTED;
- insert_keyframe(reports, id, adt->action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, adt->action,
+ (fcu->grp ? fcu->grp->name : NULL),
+ fcu->rna_path, fcu->array_index, cfra, flag);
}
}
}
@@ -5070,8 +5061,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
- else if(t->scene->basact && (ob = t->scene->basact->object) && (ob->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(t->scene, ob)) {
- ;
+ else if ( (t->scene->basact) &&
+ (ob = t->scene->basact->object) &&
+ (ob->mode & OB_MODE_PARTICLE_EDIT) &&
+ PE_get_current(t->scene, ob))
+ {
+ /* do nothing */ ;
}
else { /* Objects */
int i, recalcObPaths=0;
@@ -5391,6 +5386,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
TransData2D *td2d;
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
MovieTrackingMarker *marker;
TransDataTracking *tdt;
@@ -5404,7 +5400,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
/* count */
t->total = 0;
- track = clip->tracking.tracks.first;
+ track = tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_LOCKED)==0) {
marker= BKE_tracking_get_marker(track, framenr);
@@ -5431,7 +5427,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
t->customFree= transDataTrackingFree;
/* create actual data */
- track = clip->tracking.tracks.first;
+ track = tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track) && (track->flag&TRACK_LOCKED)==0) {
marker= BKE_tracking_get_marker(track, framenr);
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 72f10a532d7..f6aca0336be 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -171,7 +171,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
float obinv[4][4];
invert_m4_m4(obinv, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, ob->obmat, obinv);
+ mult_m4_m4m4(mtx, obinv, ob->obmat);
invert_m4_m4(imtx, mtx);
}
@@ -641,10 +641,11 @@ static void recalcData_clip(TransInfo *t)
{
SpaceClip *sc= t->sa->spacedata.first;
MovieClip *clip= ED_space_clip(sc);
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
MovieTrackingTrack *track;
if(t->state == TRANS_CANCEL) {
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
MovieTrackingMarker *marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
@@ -658,7 +659,7 @@ static void recalcData_clip(TransInfo *t)
flushTransTracking(t);
- track= clip->tracking.tracks.first;
+ track= tracksbase->first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
if (t->mode == TFM_TRANSLATION) {
@@ -1552,7 +1553,7 @@ void calculateCenter(TransInfo *t)
if(t->obedit->type == OB_MESH) {
EditSelection ese;
EditMesh *em = BKE_mesh_get_editmesh(t->obedit->data);
-
+
if (EM_get_actSelection(em, &ese)) {
EM_editselection_center(t->center, &ese);
calculateCenter2D(t);
@@ -1570,7 +1571,7 @@ void calculateCenter(TransInfo *t)
}
}
} /* END EDIT MODE ACTIVE ELEMENT */
-
+
calculateCenterMedian(t);
if((t->flag & (T_EDIT|T_POSE))==0)
{
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 3de68a6e312..a4f03e76fd1 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -189,16 +189,16 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, int start[2], int end
static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const int mval[2], float output[3])
{
- float length;
- float distance;
+ double length;
+ double distance;
+ double dx, dy;
int *data = mi->data;
- int dx, dy;
if (data) {
dx = data[2] - data[0];
dy = data[3] - data[1];
- length = (float)sqrtf(dx*dx + dy*dy);
+ length = sqrt(dx*dx + dy*dy);
if (mi->precision) {
/* deal with Shift key by adding motion / 10 to motion before shift press */
@@ -216,7 +216,7 @@ static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, const int mva
distance = (length != 0.0f)? (mdx*dx + mdy*dy) / length: 0.0f;
}
- output[0] = (length != 0.0f)? distance / length: 0.0f;
+ output[0] = (float)((length != 0.0f)? distance / length: 0.0f);
}
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 63495d54cf1..5578ea754df 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1564,7 +1564,7 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl
rect.ymax= mval[1]+hotspot;
setwinmatrixview3d(ar, v3d, &rect);
- mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
glSelectBuffer( 64, buffer);
glRenderMode(GL_SELECT);
@@ -1586,7 +1586,7 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl
G.f &= ~G_PICKSEL;
setwinmatrixview3d(ar, v3d, NULL);
- mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+ mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
if(hits==1) return buffer[3];
else if(hits>1) {
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 7951fe0ee02..90f95bea696 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -632,7 +632,7 @@ void TRANSFORM_OT_warp(struct wmOperatorType *ot)
ot->cancel = transform_cancel;
ot->poll = ED_operator_screenactive;
- RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", 0, 1);
+ RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI*2, M_PI*2);
Transform_Properties(ot, P_PROPORTIONAL|P_MIRROR|P_SNAP);
// XXX Warp axis?
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 442ad662813..3cb35c48f39 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -127,7 +127,8 @@ void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name
}
}
-TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite) {
+TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite)
+{
Base *base = CTX_data_active_base(C);
Object *ob;
float mat[3][3];
@@ -150,7 +151,8 @@ TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports)
return addMatrixSpace(C, mat, name, overwrite);
}
-TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *name, int overwrite) {
+TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *name, int overwrite)
+{
float mat[3][3];
float normal[3], plane[3];
@@ -169,7 +171,8 @@ TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *na
return addMatrixSpace(C, mat, name, overwrite);
}
-TransformOrientation *createMeshSpace(bContext *C, ReportList *reports, char *name, int overwrite) {
+TransformOrientation *createMeshSpace(bContext *C, ReportList *reports, char *name, int overwrite)
+{
float mat[3][3];
float normal[3], plane[3];
int type;
@@ -267,7 +270,8 @@ int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3])
return 1;
}
-TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[], int overwrite) {
+TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[], int overwrite)
+{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts = NULL;
@@ -294,7 +298,8 @@ TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[],
return ts;
}
-void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
+void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target)
+{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
int i;
@@ -321,7 +326,8 @@ void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
}
}
-void BIF_removeTransformOrientationIndex(bContext *C, int index) {
+void BIF_removeTransformOrientationIndex(bContext *C, int index)
+{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts= BLI_findlink(transform_spaces, index);
@@ -344,7 +350,8 @@ void BIF_removeTransformOrientationIndex(bContext *C, int index) {
}
}
-void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
+void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target)
+{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
View3D *v3d = CTX_wm_view3d(C);
TransformOrientation *ts;
@@ -358,7 +365,8 @@ void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
}
}
-void BIF_selectTransformOrientationValue(bContext *C, int orientation) {
+void BIF_selectTransformOrientationValue(bContext *C, int orientation)
+{
View3D *v3d = CTX_wm_view3d(C);
if(v3d) /* currently using generic poll */
v3d->twmode = orientation;
@@ -407,7 +415,8 @@ EnumPropertyItem *BIF_enumTransformOrientation(bContext *C)
return item;
}
-const char * BIF_menustringTransformOrientation(const bContext *C, const char *title) {
+const char * BIF_menustringTransformOrientation(const bContext *C, const char *title)
+{
const char* menu = IFACE_("%t|Global%x0|Local%x1|Gimbal%x4|Normal%x2|View%x3");
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
@@ -429,7 +438,8 @@ const char * BIF_menustringTransformOrientation(const bContext *C, const char *t
return str_menu;
}
-int BIF_countTransformOrientation(const bContext *C) {
+int BIF_countTransformOrientation(const bContext *C)
+{
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
int count = 0;
@@ -441,7 +451,8 @@ int BIF_countTransformOrientation(const bContext *C) {
return count;
}
-void applyTransformOrientation(const bContext *C, float mat[3][3], char *name) {
+void applyTransformOrientation(const bContext *C, float mat[3][3], char *name)
+{
TransformOrientation *ts;
View3D *v3d = CTX_wm_view3d(C);
int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 4635411dcdf..ed3e949c8a0 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -141,11 +141,16 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
if (validSnap(t) && activeSnap(t))
{
- unsigned char col[4];
+ unsigned char col[4], selectedCol[4], activeCol[4];
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
col[3]= 128;
- glColor4ubv(col);
+ UI_GetThemeColor3ubv(TH_SELECT, selectedCol);
+ selectedCol[3]= 128;
+
+ UI_GetThemeColor3ubv(TH_ACTIVE, activeCol);
+ activeCol[3]= 192;
+
if (t->spacetype == SPACE_VIEW3D) {
TransSnapPoint *p;
View3D *v3d = CTX_wm_view3d(C);
@@ -160,16 +165,26 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
invert_m4_m4(imat, rv3d->viewmat);
for (p = t->tsnap.points.first; p; p = p->next) {
- drawcircball(GL_LINE_LOOP, p->co, ED_view3d_pixel_size(rv3d, p->co) * size, imat);
+ if (p == t->tsnap.selectedPoint) {
+ glColor4ubv(selectedCol);
+ } else {
+ glColor4ubv(col);
+ }
+
+ drawcircball(GL_LINE_LOOP, p->co, ED_view3d_pixel_size(rv3d, p->co) * size * 0.75f, imat);
}
if (t->tsnap.status & POINT_INIT) {
+ glColor4ubv(activeCol);
+
drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, ED_view3d_pixel_size(rv3d, t->tsnap.snapPoint) * size, imat);
}
/* draw normal if needed */
if (usingSnappingNormal(t) && validSnappingNormal(t))
{
+ glColor4ubv(activeCol);
+
glBegin(GL_LINES);
glVertex3f(t->tsnap.snapPoint[0], t->tsnap.snapPoint[1], t->tsnap.snapPoint[2]);
glVertex3f( t->tsnap.snapPoint[0] + t->tsnap.snapNormal[0],
@@ -219,7 +234,7 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
}
}
-int handleSnapping(TransInfo *UNUSED(t), wmEvent *UNUSED(event))
+int handleSnapping(TransInfo *t, wmEvent *event)
{
int status = 0;
@@ -232,6 +247,10 @@ int handleSnapping(TransInfo *UNUSED(t), wmEvent *UNUSED(event))
status = 1;
}
#endif
+ if (event->type == MOUSEMOVE)
+ {
+ status |= updateSelectedSnapPoint(t);
+ }
return status;
}
@@ -541,6 +560,8 @@ void addSnapPoint(TransInfo *t)
if (t->tsnap.status & POINT_INIT) {
TransSnapPoint *p = MEM_callocN(sizeof(TransSnapPoint), "SnapPoint");
+ t->tsnap.selectedPoint = p;
+
copy_v3_v3(p->co, t->tsnap.snapPoint);
BLI_addtail(&t->tsnap.points, p);
@@ -549,13 +570,55 @@ void addSnapPoint(TransInfo *t)
}
}
+int updateSelectedSnapPoint(TransInfo *t)
+{
+ int status = 0;
+ if (t->tsnap.status & MULTI_POINTS) {
+ TransSnapPoint *p, *closest_p = NULL;
+ int closest_dist = 0;
+ int screen_loc[2];
+
+ for( p = t->tsnap.points.first; p; p = p->next ) {
+ int dx, dy;
+ int dist;
+
+ project_int(t->ar, p->co, screen_loc);
+
+ dx = t->mval[0] - screen_loc[0];
+ dy = t->mval[1] - screen_loc[1];
+
+ dist = dx * dx + dy * dy;
+
+ if (dist < 100 && (closest_p == NULL || closest_dist > dist)) {
+ closest_p = p;
+ closest_dist = dist;
+ }
+ }
+
+ if (closest_p) {
+ status = t->tsnap.selectedPoint == closest_p ? 0 : 1;
+ t->tsnap.selectedPoint = closest_p;
+ }
+ }
+
+ return status;
+}
+
void removeSnapPoint(TransInfo *t)
{
if (t->tsnap.status & MULTI_POINTS) {
- BLI_freelinkN(&t->tsnap.points, t->tsnap.points.last);
+ updateSelectedSnapPoint(t);
+
+ if (t->tsnap.selectedPoint) {
+ BLI_freelinkN(&t->tsnap.points, t->tsnap.selectedPoint);
+
+ if (t->tsnap.points.first == NULL) {
+ t->tsnap.status &= ~MULTI_POINTS;
+ }
+
+ t->tsnap.selectedPoint = NULL;
+ }
- if (t->tsnap.points.first == NULL)
- t->tsnap.status &= ~MULTI_POINTS;
}
}
@@ -680,7 +743,7 @@ static float RotationBetween(TransInfo *t, float p1[3], float p2[3])
static float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
{
- float d1[3], d2[3], center[3];
+ float d1[3], d2[3], center[3], len_d1;
copy_v3_v3(center, t->center);
if(t->flag & (T_EDIT|T_POSE)) {
@@ -696,7 +759,9 @@ static float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
mul_m3_v3(t->con.pmtx, d2);
}
- return len_v3(d2) / len_v3(d1);
+ len_d1 = len_v3(d1);
+
+ return len_d1 != 0.0f ? len_v3(d2) / len_d1 : 1;
}
/********************** CALC **************************/
@@ -1622,7 +1687,12 @@ static int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, c
}
for ( base = FIRSTBASE; base != NULL; base = base->next ) {
- if ( BASE_VISIBLE(v3d, base) && (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) ) {
+ if ( (BASE_VISIBLE(v3d, base)) &&
+ (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 &&
+
+ ( (mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) ||
+ (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) )
+ {
Object *ob = base->object;
if (ob->transflag & OB_DUPLI)
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index f0055bd6008..3ec99ca7508 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -126,8 +126,8 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
ScrArea *sa= CTX_wm_area(C);
/* undo during jobs are running can easily lead to freeing data using by jobs,
- or they can just lead to freezing job in some other cases */
- if(WM_jobs_has_running(CTX_wm_manager(C))) {
+ * or they can just lead to freezing job in some other cases */
+ if (WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
return OPERATOR_CANCELLED;
}
@@ -341,13 +341,24 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
int ret= 0;
if(op) {
+ wmWindowManager *wm= CTX_wm_manager(C);
+ struct Scene *scene= CTX_data_scene(C);
+
ARegion *ar= CTX_wm_region(C);
ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
if(ar1)
CTX_wm_region_set(C, ar1);
- if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) {
+ if ( (WM_operator_repeat_check(C, op)) &&
+ (WM_operator_poll(C, op->type)) &&
+ /* note, undo/redo cant run if there are jobs active,
+ * check for screen jobs only so jobs like material/texture/world preview
+ * (which copy their data), wont stop redo, see [#29579]],
+ *
+ * note, - WM_operator_check_ui_enabled() jobs test _must_ stay in sync with this */
+ (WM_jobs_test(wm, scene) == 0))
+ {
int retval;
if (G.f & G_DEBUG)
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 92bd74db68a..1f71cd8a4c6 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -590,8 +590,7 @@ static void find_nearest_uv_face(Scene *scene, Image *ima, EditMesh *em, float c
cent[0]= cent[1]= 0.0f;
for(i=0; i<nverts; i++) {
- cent[0] += tf->uv[i][0];
- cent[1] += tf->uv[i][1];
+ add_v2_v2(cent, tf->uv[i]);
}
cent[0] /= nverts;
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index c565e2fc305..830dc224c94 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1342,16 +1342,9 @@ static int cube_project_exec(bContext *C, wmOperator *op)
if(efa->f & SELECT) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
normal_tri_v3( no,efa->v1->co, efa->v2->co, efa->v3->co);
-
- no[0]= fabs(no[0]);
- no[1]= fabs(no[1]);
- no[2]= fabs(no[2]);
-
- cox=0; coy= 1;
- if(no[2]>=no[0] && no[2]>=no[1]);
- else if(no[1]>=no[0] && no[1]>=no[2]) coy= 2;
- else { cox= 1; coy= 2; }
-
+
+ axis_dominant_v3(&cox, &coy, no);
+
tf->uv[0][0]= 0.5f+0.5f*cube_size*(loc[cox] + efa->v1->co[cox]);
tf->uv[0][1]= 0.5f+0.5f*cube_size*(loc[coy] + efa->v1->co[coy]);
dx = floor(tf->uv[0][0]);
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 9e551f637de..a72c79a1e62 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -167,7 +167,7 @@ void GPU_update_mesh_buffers(GPU_Buffers *buffers, struct MVert *mvert,
int *vert_indices, int totvert);
GPU_Buffers *GPU_build_grid_buffers(struct DMGridData **grids,
int *grid_indices, int totgrid, int gridsize);
-void GPU_update_grid_buffers(GPU_Buffers *buffers_v, struct DMGridData **grids,
+void GPU_update_grid_buffers(GPU_Buffers *buffers, struct DMGridData **grids,
int *grid_indices, int totgrid, int gridsize, int smooth);
void GPU_draw_buffers(GPU_Buffers *buffers);
void GPU_free_buffers(GPU_Buffers *buffers);
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index dc1f80ca903..f73bd402167 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -69,7 +69,7 @@ void GPU_state_print(void);
* - after drawing, the material must be disabled again */
void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d,
- struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_pass);
+ struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_after);
void GPU_end_object_materials(void);
int GPU_enable_material(int nr, void *attribs);
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index d827fda0844..1dbe9ed7371 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -61,6 +61,8 @@ int GPU_print_error(const char *str);
int GPU_glsl_support(void);
int GPU_non_power_of_two_support(void);
int GPU_color_depth(void);
+void GPU_code_generate_glsl_lib(void);
+int GPU_bicubic_bump_support(void);
/* GPU Types */
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 418bea5fe9c..5689f02d2d7 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -83,7 +83,8 @@ typedef enum GPUBuiltin {
GPU_INVERSE_OBJECT_MATRIX = 8,
GPU_VIEW_POSITION = 16,
GPU_VIEW_NORMAL = 32,
- GPU_OBCOLOR = 64
+ GPU_OBCOLOR = 64,
+ GPU_AUTO_BUMPSCALE = 128
} GPUBuiltin;
typedef enum GPUBlendMode {
@@ -129,7 +130,7 @@ void GPU_material_free(struct Material *ma);
void GPU_materials_free(void);
void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale);
void GPU_material_unbind(GPUMaterial *material);
int GPU_material_bound(GPUMaterial *material);
@@ -162,6 +163,7 @@ typedef enum GPUDynamicType {
GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
GPU_DYNAMIC_OBJECT_IMAT = 4,
GPU_DYNAMIC_OBJECT_COLOR = 5,
+ GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE = 15,
GPU_DYNAMIC_LAMP_FIRST = 6,
GPU_DYNAMIC_LAMP_DYNVEC = 6,
GPU_DYNAMIC_LAMP_DYNCO = 7,
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index bba8786b092..99dd3987937 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -701,8 +701,8 @@ static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int *
static void GPU_buffer_copy_color3(DerivedMesh *dm, float *varray_, int *index, int *mat_orig_to_new, void *user)
{
int i, totface;
- unsigned char *varray = (unsigned char *)varray_;
- unsigned char *mcol = (unsigned char *)user;
+ char *varray = (char *)varray_;
+ char *mcol = (char *)user;
MFace *f = dm->getFaceArray(dm);
totface= dm->getNumFaces(dm);
@@ -710,16 +710,16 @@ static void GPU_buffer_copy_color3(DerivedMesh *dm, float *varray_, int *index,
int start = index[mat_orig_to_new[f->mat_nr]];
/* v1 v2 v3 */
- VECCOPY(&varray[start], &mcol[i*12]);
- VECCOPY(&varray[start+3], &mcol[i*12+3]);
- VECCOPY(&varray[start+6], &mcol[i*12+6]);
+ copy_v3_v3_char(&varray[start], &mcol[i*12]);
+ copy_v3_v3_char(&varray[start+3], &mcol[i*12+3]);
+ copy_v3_v3_char(&varray[start+6], &mcol[i*12+6]);
index[mat_orig_to_new[f->mat_nr]] += 9;
if(f->v4) {
/* v3 v4 v1 */
- VECCOPY(&varray[start+9], &mcol[i*12+6]);
- VECCOPY(&varray[start+12], &mcol[i*12+9]);
- VECCOPY(&varray[start+15], &mcol[i*12]);
+ copy_v3_v3_char(&varray[start+9], &mcol[i*12+6]);
+ copy_v3_v3_char(&varray[start+12], &mcol[i*12+9]);
+ copy_v3_v3_char(&varray[start+15], &mcol[i*12]);
index[mat_orig_to_new[f->mat_nr]] += 9;
}
}
@@ -1296,10 +1296,9 @@ struct GPU_Buffers {
unsigned int tot_tri, tot_quad;
};
-void GPU_update_mesh_buffers(GPU_Buffers *buffers_v, MVert *mvert,
+void GPU_update_mesh_buffers(GPU_Buffers *buffers, MVert *mvert,
int *vert_indices, int totvert)
{
- GPU_Buffers *buffers = buffers_v;
VertexBufferFormat *vert_data;
int i;
@@ -1413,10 +1412,9 @@ GPU_Buffers *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
return buffers;
}
-void GPU_update_grid_buffers(GPU_Buffers *buffers_v, DMGridData **grids,
+void GPU_update_grid_buffers(GPU_Buffers *buffers, DMGridData **grids,
int *grid_indices, int totgrid, int gridsize, int smooth)
{
- GPU_Buffers *buffers = buffers_v;
DMGridData *vert_data;
int i, j, k, totvert;
@@ -1465,7 +1463,7 @@ void GPU_update_grid_buffers(GPU_Buffers *buffers_v, DMGridData **grids,
buffers->totgrid = totgrid;
buffers->gridsize = gridsize;
- //printf("node updated %p\n", buffers_v);
+ //printf("node updated %p\n", buffers);
}
GPU_Buffers *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indices),
@@ -1558,10 +1556,8 @@ GPU_Buffers *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid
return buffers;
}
-void GPU_draw_buffers(GPU_Buffers *buffers_v)
+void GPU_draw_buffers(GPU_Buffers *buffers)
{
- GPU_Buffers *buffers = buffers_v;
-
if(buffers->vert_buf && buffers->index_buf) {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
@@ -1632,11 +1628,9 @@ void GPU_draw_buffers(GPU_Buffers *buffers_v)
}
}
-void GPU_free_buffers(GPU_Buffers *buffers_v)
+void GPU_free_buffers(GPU_Buffers *buffers)
{
- if(buffers_v) {
- GPU_Buffers *buffers = buffers_v;
-
+ if(buffers) {
if(buffers->vert_buf)
glDeleteBuffersARB(1, &buffers->vert_buf);
if(buffers->index_buf)
@@ -1645,4 +1639,3 @@ void GPU_free_buffers(GPU_Buffers *buffers_v)
MEM_freeN(buffers);
}
}
-
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 185f9eb185e..d623697921c 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -59,6 +59,10 @@
extern char datatoc_gpu_shader_material_glsl[];
extern char datatoc_gpu_shader_vertex_glsl[];
+
+static char *glsl_material_library = NULL;
+
+
/* structs and defines */
static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
@@ -229,7 +233,7 @@ GPUFunction *GPU_lookup_function(const char *name)
{
if(!FUNCTION_HASH) {
FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "GPU_lookup_function gh");
- gpu_parse_functions_string(FUNCTION_HASH, datatoc_gpu_shader_material_glsl);
+ gpu_parse_functions_string(FUNCTION_HASH, glsl_material_library);
/*FUNCTION_PROTOTYPES = gpu_generate_function_prototyps(FUNCTION_HASH);
FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);*/
}
@@ -237,7 +241,12 @@ GPUFunction *GPU_lookup_function(const char *name)
return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, (void *)name);
}
-void GPU_extensions_exit(void)
+void GPU_codegen_init(void)
+{
+ GPU_code_generate_glsl_lib();
+}
+
+void GPU_codegen_exit(void)
{
extern Material defmaterial; // render module abuse...
@@ -248,6 +257,12 @@ void GPU_extensions_exit(void)
BLI_ghash_free(FUNCTION_HASH, NULL, (GHashValFreeFP)MEM_freeN);
FUNCTION_HASH = NULL;
}
+
+ if(glsl_material_library) {
+ MEM_freeN(glsl_material_library);
+ glsl_material_library = NULL;
+ }
+
/*if(FUNCTION_PROTOTYPES) {
MEM_freeN(FUNCTION_PROTOTYPES);
FUNCTION_PROTOTYPES = NULL;
@@ -344,6 +359,8 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
return "varnormal";
else if(builtin == GPU_OBCOLOR)
return "unfobcolor";
+ else if(builtin == GPU_AUTO_BUMPSCALE)
+ return "unfobautobumpscale";
else
return "";
}
@@ -529,12 +546,8 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_appendf(ds, ", gl_TexCoord[%d].st", input->texid);
}
else if (input->source == GPU_SOURCE_TEX_PIXEL) {
- if (input->link && input->link->output)
- codegen_convert_datatype(ds, input->link->output->type, input->type,
- "tmp", input->link->output->id);
- else
- codegen_convert_datatype(ds, input->link->output->type, input->type,
- "tex", input->texid);
+ codegen_convert_datatype(ds, input->link->output->type, input->type,
+ "tmp", input->link->output->id);
}
else if(input->source == GPU_SOURCE_BUILTIN)
BLI_dynstr_appendf(ds, "%s", GPU_builtin_name(input->builtin));
@@ -638,6 +651,37 @@ static char *code_generate_vertex(ListBase *nodes)
return code;
}
+int GPU_bicubic_bump_support(void)
+{
+ return GLEW_ARB_texture_gather && GLEW_ARB_texture_query_lod && GLEW_VERSION_3_0;
+}
+
+void GPU_code_generate_glsl_lib(void)
+{
+ DynStr *ds;
+
+ /* only initialize the library once */
+ if(glsl_material_library)
+ return;
+
+ ds = BLI_dynstr_new();
+
+ if(GPU_bicubic_bump_support()){
+ BLI_dynstr_append(ds, "/* These are needed for high quality bump mapping */\n"
+ "#version 130\n"
+ "#extension GL_ARB_texture_gather: enable\n"
+ "#extension GL_ARB_texture_query_lod: enable\n"
+ "#define BUMP_BICUBIC\n");
+ }
+ BLI_dynstr_append(ds, datatoc_gpu_shader_material_glsl);
+
+
+ glsl_material_library = BLI_dynstr_get_cstring(ds);
+
+ BLI_dynstr_free(ds);
+}
+
+
/* GPU pass binding/unbinding */
GPUShader *GPU_pass_shader(GPUPass *pass)
@@ -1316,7 +1360,7 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
/* generate code and compile with opengl */
fragmentcode = code_generate_fragment(nodes, outlink->output, name);
vertexcode = code_generate_vertex(nodes);
- shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
+ shader = GPU_shader_create(vertexcode, fragmentcode, glsl_material_library); /*FUNCTION_LIB);*/
/* failed? */
if (!shader) {
@@ -1333,7 +1377,7 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
pass->shader = shader;
pass->fragmentcode = fragmentcode;
pass->vertexcode = vertexcode;
- pass->libcode = datatoc_gpu_shader_material_glsl;
+ pass->libcode = glsl_material_library;
/* extract dynamic inputs and throw away nodes */
GPU_nodes_extract_dynamic_inputs(pass, nodes);
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index f52b5bb627e..85bf65232c1 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -178,6 +178,9 @@ void GPU_pass_unbind(GPUPass *pass);
void GPU_pass_free(GPUPass *pass);
+void GPU_codegen_init(void);
+void GPU_codegen_exit(void);
+
/* Material calls */
const char *GPU_builtin_name(GPUBuiltin builtin);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index afd22fb70a0..5d36ba169f3 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -60,6 +60,7 @@
#include "BKE_node.h"
#include "BKE_object.h"
#include "BKE_scene.h"
+#include "BKE_DerivedMesh.h"
#include "BLI_threads.h"
#include "BLI_blenlib.h"
@@ -188,20 +189,6 @@ void GPU_render_text(MTFace *tface, int mode,
/* Checking powers of two for images since opengl 1.x requires it */
-static int is_pow2(int num)
-{
- /* (n&(n-1)) zeros the least significant bit of n */
- return ((num)&(num-1))==0;
-}
-
-static int smaller_pow2(int num)
-{
- while (!is_pow2(num))
- num= num&(num-1);
-
- return num;
-}
-
static int is_pow2_limit(int num)
{
/* take texture clamping into account */
@@ -213,7 +200,7 @@ static int is_pow2_limit(int num)
if (U.glreslimit != 0 && num > U.glreslimit)
return 0;
- return ((num)&(num-1))==0;
+ return is_power_of_2_i(num);
}
static int smaller_pow2_limit(int num)
@@ -226,7 +213,7 @@ static int smaller_pow2_limit(int num)
if (U.glreslimit != 0 && num > U.glreslimit)
return U.glreslimit;
- return smaller_pow2(num);
+ return power_of_2_min_i(num);
}
/* Current OpenGL state caching for GPU_set_tpage */
@@ -691,7 +678,7 @@ void GPU_paint_update_image(Image *ima, int x, int y, int w, int h, int mipmap)
ibuf = BKE_image_get_ibuf(ima, NULL);
if (ima->repbind || (gpu_get_mipmap() && mipmap) || !ima->bindcode || !ibuf ||
- (!is_pow2(ibuf->x) || !is_pow2(ibuf->y)) ||
+ (!is_power_of_2_i(ibuf->x) || !is_power_of_2_i(ibuf->y)) ||
(w == 0) || (h == 0)) {
/* these cases require full reload still */
GPU_free_image(ima);
@@ -942,7 +929,7 @@ static struct GPUMaterialState {
GPUBlendMode *alphablend;
GPUBlendMode alphablend_fixed[FIXEDMAT];
- int alphapass;
+ int use_alpha_pass, is_alpha_pass;
int lastmatnr, lastretval;
GPUBlendMode lastalphablend;
@@ -993,7 +980,7 @@ static Material *gpu_active_node_material(Material *ma)
return ma;
}
-void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
+void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_after)
{
Material *ma;
GPUMaterial *gpumat;
@@ -1015,9 +1002,15 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
GMS.gviewmat= rv3d->viewmat;
GMS.gviewinv= rv3d->viewinv;
- GMS.alphapass = (v3d && v3d->transp);
- if(do_alpha_pass)
- *do_alpha_pass = 0;
+ /* alpha pass setup. there's various cases to handle here:
+ * object transparency on: only solid materials draw in the first pass,
+ and only transparent in the second 'alpha' pass.
+ * object transparency off: for glsl we draw both in a single pass, and
+ for solid we don't use transparency at all. */
+ GMS.use_alpha_pass = (do_alpha_after != NULL);
+ GMS.is_alpha_pass = (v3d && v3d->transp);
+ if(GMS.use_alpha_pass)
+ *do_alpha_after = 0;
if(GMS.totmat > FIXEDMAT) {
GMS.matbuf= MEM_callocN(sizeof(GPUMaterialFixed)*GMS.totmat, "GMS.matbuf");
@@ -1064,20 +1057,23 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
/* fixed function opengl materials */
gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob, new_shading_nodes);
- alphablend = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA;
- if(do_alpha_pass && GMS.alphapass)
+ if(GMS.use_alpha_pass) {
GMS.matbuf[a].diff[3]= ma->alpha;
- else
+ alphablend = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA;
+ }
+ else {
GMS.matbuf[a].diff[3]= 1.0f;
+ alphablend = GPU_BLEND_SOLID;
+ }
}
- /* setting do_alpha_pass = 1 indicates this object needs to be
+ /* setting do_alpha_after = 1 indicates this object needs to be
* drawn in a second alpha pass for improved blending */
- if(do_alpha_pass) {
- GMS.alphablend[a]= alphablend;
- if(ELEM3(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ADD, GPU_BLEND_ALPHA_SORT) && !GMS.alphapass)
- *do_alpha_pass= 1;
- }
+ if(do_alpha_after && !GMS.is_alpha_pass)
+ if(ELEM3(alphablend, GPU_BLEND_ALPHA, GPU_BLEND_ADD, GPU_BLEND_ALPHA_SORT))
+ *do_alpha_after= 1;
+
+ GMS.alphablend[a]= alphablend;
}
/* let's start with a clean state */
@@ -1122,29 +1118,38 @@ int GPU_enable_material(int nr, void *attribs)
/* unbind glsl material */
if(GMS.gboundmat) {
- if(GMS.alphapass) glDepthMask(0);
+ if(GMS.is_alpha_pass) glDepthMask(0);
GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat));
GMS.gboundmat= NULL;
}
/* draw materials with alpha in alpha pass */
GMS.lastmatnr = nr;
- GMS.lastretval = ELEM(GMS.alphablend[nr], GPU_BLEND_SOLID, GPU_BLEND_CLIP);
- if(GMS.alphapass)
- GMS.lastretval = !GMS.lastretval;
+ GMS.lastretval = 1;
+
+ if(GMS.use_alpha_pass) {
+ GMS.lastretval = ELEM(GMS.alphablend[nr], GPU_BLEND_SOLID, GPU_BLEND_CLIP);
+ if(GMS.is_alpha_pass)
+ GMS.lastretval = !GMS.lastretval;
+ }
+ else
+ GMS.lastretval = !GMS.is_alpha_pass;
if(GMS.lastretval) {
/* for alpha pass, use alpha blend */
- alphablend = (GMS.alphapass)? GPU_BLEND_ALPHA: GPU_BLEND_SOLID;
+ alphablend = GMS.alphablend[nr];
if(gattribs && GMS.gmatbuf[nr]) {
/* bind glsl material and get attributes */
Material *mat = GMS.gmatbuf[nr];
+ float auto_bump_scale;
gpumat = GPU_material_from_blender(GMS.gscene, mat);
GPU_material_vertex_attributes(gpumat, gattribs);
GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
- GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
+
+ auto_bump_scale = GMS.gob->derivedFinal != NULL ? GMS.gob->derivedFinal->auto_bump_scale : 1.0f;
+ GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, auto_bump_scale);
GMS.gboundmat= mat;
/* for glsl use alpha blend mode, unless it's set to solid and
@@ -1152,7 +1157,7 @@ int GPU_enable_material(int nr, void *attribs)
if(mat->game.alpha_blend != GPU_BLEND_SOLID)
alphablend= mat->game.alpha_blend;
- if(GMS.alphapass) glDepthMask(1);
+ if(GMS.is_alpha_pass) glDepthMask(1);
}
else {
/* or do fixed function opengl material */
@@ -1188,7 +1193,7 @@ void GPU_disable_material(void)
GMS.lastretval= 1;
if(GMS.gboundmat) {
- if(GMS.alphapass) glDepthMask(0);
+ if(GMS.is_alpha_pass) glDepthMask(0);
GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat));
GMS.gboundmat= NULL;
}
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 79db125c21f..c4ed88635b7 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -41,9 +41,11 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
+#include "BLI_math_base.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
+#include "gpu_codegen.h"
#include <stdlib.h>
#include <stdio.h>
@@ -84,6 +86,8 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver)
/* GPU Extensions */
+static int gpu_extensions_init = 0;
+
void GPU_extensions_disable(void)
{
GG.extdisabled = 1;
@@ -95,11 +99,11 @@ void GPU_extensions_init(void)
const char *vendor, *renderer;
/* can't avoid calling this multiple times, see wm_window_add_ghostwindow */
- static char init= 0;
- if(init) return;
- init= 1;
+ if(gpu_extensions_init) return;
+ gpu_extensions_init= 1;
glewInit();
+ GPU_codegen_init();
/* glewIsSupported("GL_VERSION_2_0") */
@@ -185,6 +189,12 @@ void GPU_extensions_init(void)
#endif
}
+void GPU_extensions_exit(void)
+{
+ gpu_extensions_init = 0;
+ GPU_codegen_exit();
+}
+
int GPU_glsl_support(void)
{
return !GG.extdisabled && GG.glslsupport;
@@ -292,22 +302,6 @@ static unsigned char *GPU_texture_convert_pixels(int length, float *fpixels)
return pixels;
}
-static int is_pow2(int n)
-{
- return ((n)&(n-1))==0;
-}
-
-static int larger_pow2(int n)
-{
- if (is_pow2(n))
- return n;
-
- while(!is_pow2(n))
- n= n&(n-1);
-
- return n*2;
-}
-
static void GPU_glTexSubImageEmpty(GLenum target, GLenum format, int x, int y, int w, int h)
{
void *pixels = MEM_callocN(sizeof(char)*4*w*h, "GPUTextureEmptyPixels");
@@ -353,8 +347,8 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
}
if (!GPU_non_power_of_two_support()) {
- tex->w = larger_pow2(tex->w);
- tex->h = larger_pow2(tex->h);
+ tex->w = power_of_2_max_i(tex->w);
+ tex->h = power_of_2_max_i(tex->h);
}
tex->number = 0;
@@ -462,9 +456,9 @@ GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels)
}
if (!GPU_non_power_of_two_support()) {
- tex->w = larger_pow2(tex->w);
- tex->h = larger_pow2(tex->h);
- tex->depth = larger_pow2(tex->depth);
+ tex->w = power_of_2_max_i(tex->w);
+ tex->h = power_of_2_max_i(tex->h);
+ tex->depth = power_of_2_max_i(tex->depth);
}
tex->number = 0;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 397c0e32c69..fb1d10b5491 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -94,7 +94,7 @@ struct GPUMaterial {
/* for passing uniforms */
int viewmatloc, invviewmatloc;
int obmatloc, invobmatloc;
- int obcolloc;
+ int obcolloc, obautobumpscaleloc;
ListBase lamps;
};
@@ -212,7 +212,8 @@ static int GPU_material_construct_end(GPUMaterial *material)
material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX));
if(material->builtins & GPU_OBCOLOR)
material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR));
-
+ if(material->builtins & GPU_AUTO_BUMPSCALE)
+ material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE));
return 1;
}
@@ -273,7 +274,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
}
}
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4])
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale)
{
if(material->pass) {
GPUShader *shader = GPU_pass_shader(material->pass);
@@ -300,7 +301,9 @@ void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float v
CLAMP(col[3], 0.0f, 1.0f);
GPU_shader_uniform_vector(shader, material->obcolloc, 4, 1, col);
}
-
+ if(material->builtins & GPU_AUTO_BUMPSCALE) {
+ GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale);
+ }
/* update lamps */
for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
lamp= nlink->data;
@@ -318,9 +321,9 @@ void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float v
}
if(material->dynproperty & DYN_LAMP_IMAT)
- mul_m4_m4m4(lamp->dynimat, viewinv, lamp->imat);
+ mult_m4_m4m4(lamp->dynimat, lamp->imat, viewinv);
if(material->dynproperty & DYN_LAMP_PERSMAT)
- mul_m4_m4m4(lamp->dynpersmat, viewinv, lamp->persmat);
+ mult_m4_m4m4(lamp->dynpersmat, lamp->persmat, viewinv);
}
GPU_pass_update_uniforms(material->pass);
@@ -969,7 +972,6 @@ static void do_material_tex(GPUShadeInput *shi)
GPU_link(mat, "mtex_mapping_ofs", texco, GPU_uniform(ofs), &texco);
talpha = 0;
- rgbnor = 0;
if(tex && tex->type == TEX_IMAGE && tex->ima) {
GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser), &tin, &trgb);
@@ -1083,12 +1085,11 @@ static void do_material_tex(GPUShadeInput *shi)
GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
}
- } else if( (mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) || found_deriv_map) {
+ } else if( (mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP|MTEX_BICUBIC_BUMP)) || found_deriv_map) {
/* ntap bumpmap image */
int iBumpSpace;
float ima_x, ima_y;
- float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types
- float hScaleTex = 13.0f; // factor for scaling texspace bumps
+ float hScale;
float imag_tspace_dimension_x = 1024.0f; // only used for texture space variant
float aspect = 1.0f;
@@ -1096,16 +1097,35 @@ static void do_material_tex(GPUShadeInput *shi)
GPUNodeLink *surf_pos = GPU_builtin(GPU_VIEW_POSITION);
GPUNodeLink *vR1, *vR2;
GPUNodeLink *dBs, *dBt, *fDet;
-
+
+ hScale = 0.1; // compatibility adjustment factor for all bumpspace types
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
- hScale = hScaleTex;
+ hScale = 13.0f; // factor for scaling texspace bumps
+ else if(found_deriv_map!=0)
+ hScale = 1.0f;
+
+ // resolve texture resolution
+ if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) {
+ ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
+ ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
+ if(ibuf) {
+ ima_x= ibuf->x;
+ ima_y= ibuf->y;
+ aspect = ((float) ima_y) / ima_x;
+ }
+ }
// The negate on norfac is done because the
// normal in the renderer points inward which corresponds
// to inverting the bump map. Should this ever change
// this negate must be removed.
norfac = -hScale * mtex->norfac;
+ if(found_deriv_map) norfac /= sqrtf(ima_x*ima_y);
+
tnorfac = GPU_uniform(&norfac);
+
+ if(found_deriv_map)
+ GPU_link(mat, "math_multiply", tnorfac, GPU_builtin(GPU_AUTO_BUMPSCALE), &tnorfac);
if(GPU_link_changed(stencil))
GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
@@ -1152,17 +1172,6 @@ static void do_material_tex(GPUShadeInput *shi)
iBumpSpacePrev = iBumpSpace;
}
-
- // resolve texture resolution
- if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) {
- ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
- ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
- if(ibuf) {
- ima_x= ibuf->x;
- ima_y= ibuf->y;
- aspect = ((float) ima_y) / ima_x;
- }
- }
if(found_deriv_map) {
@@ -1174,10 +1183,21 @@ static void do_material_tex(GPUShadeInput *shi)
GPU_link( mat, "mtex_bump_tap3",
texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
&dBs, &dBt );
- else
- GPU_link( mat, "mtex_bump_tap5",
+ else if( mtex->texflag & MTEX_5TAP_BUMP )
+ GPU_link( mat, "mtex_bump_tap5",
texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
&dBs, &dBt );
+ else if( mtex->texflag & MTEX_BICUBIC_BUMP ){
+ if(GPU_bicubic_bump_support()){
+ GPU_link( mat, "mtex_bump_bicubic",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+ }else{
+ GPU_link( mat, "mtex_bump_tap5",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+ }
+ }
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
@@ -1650,7 +1670,7 @@ void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize
normalize_v3(lamp->viewmat[2]);
/* makeshadowbuf */
- mul_m4_m4m4(persmat, lamp->viewmat, lamp->winmat);
+ mult_m4_m4m4(persmat, lamp->winmat, lamp->viewmat);
/* opengl depth buffer is range 0.0..1.0 instead of -1.0..1.0 in blender */
unit_m4(rangemat);
@@ -1661,7 +1681,7 @@ void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize
rangemat[3][1] = 0.5f;
rangemat[3][2] = 0.5f;
- mul_m4_m4m4(lamp->persmat, persmat, rangemat);
+ mult_m4_m4m4(lamp->persmat, rangemat, persmat);
/* opengl */
glDisable(GL_SCISSOR_TEST);
@@ -1703,6 +1723,7 @@ GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
{ GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F },
{ GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F },
{ GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F },
+ { GPU_AUTO_BUMPSCALE, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE, GPU_DATA_1F },
{ 0 }
};
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index 5d2da31ac5f..2241c0182fa 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -306,7 +306,7 @@ void vec_math_negate(vec3 v, out vec3 outv)
void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
{
- outnor = dir;
+ outnor = nor;
outdot = -dot(dir, nor);
}
@@ -1152,8 +1152,8 @@ void mtex_bump_init_objspace( vec3 surf_pos, vec3 surf_norm,
out float fPrevMagnitude_out, out vec3 vNacc_out,
out vec3 vR1, out vec3 vR2, out float fDet )
{
- mat3 obj2view = to_mat3(mView * mObj);
- mat3 view2obj = to_mat3(mObjInv * mViewInv);
+ mat3 obj2view = to_mat3(gl_ModelViewMatrix);
+ mat3 view2obj = to_mat3(gl_ModelViewMatrixInverse);
vec3 vSigmaS = view2obj * dFdx( surf_pos );
vec3 vSigmaT = view2obj * dFdy( surf_pos );
@@ -1225,6 +1225,84 @@ void mtex_bump_tap3( vec3 texco, sampler2D ima, float hScale,
dBt = hScale * (Hul - Hll);
}
+#ifdef BUMP_BICUBIC
+
+void mtex_bump_bicubic( vec3 texco, sampler2D ima, float hScale,
+ out float dBs, out float dBt )
+{
+ vec2 TexDx = dFdx(texco.xy);
+ vec2 TexDy = dFdy(texco.xy);
+
+ vec2 STl = texco.xy - 0.5 * TexDx ;
+ vec2 STr = texco.xy + 0.5 * TexDx ;
+ vec2 STd = texco.xy - 0.5 * TexDy ;
+ vec2 STu = texco.xy + 0.5 * TexDy ;
+
+ float Hl = texture2D(ima, STl).x;
+ float Hr = texture2D(ima, STr).x;
+ float Hd = texture2D(ima, STd).x;
+ float Hu = texture2D(ima, STu).x;
+
+ vec2 dHdxy = vec2(Hr - Hl, Hu - Hd);
+ float fBlend = clamp(1.0-textureQueryLOD(ima, texco.xy).x, 0.0, 1.0);
+ if(fBlend!=0.0)
+ {
+ // the derivative of the bicubic sampling of level 0
+ ivec2 vDim;
+ vDim = textureSize(ima, 0);
+
+ vec2 fTexLoc = vDim*texco.xy-vec2(0.5,0.5);
+ ivec2 iTexLoc = ivec2(floor(fTexLoc));
+ vec2 t = clamp(fTexLoc - iTexLoc, 0.0, 1.0); // sat just to be pedantic
+
+ ivec2 iTexLocMod = iTexLoc + ivec2(-1, -1);
+
+/*******************************************************************************************
+ * This block will replace the one below when one channel textures are properly supported. *
+ *******************************************************************************************
+ vec4 vSamplesUL = textureGather(ima, (iTexLoc+ivec2(-1,-1) + vec2(0.5,0.5))/vDim );
+ vec4 vSamplesUR = textureGather(ima, (iTexLoc+ivec2(1,-1) + vec2(0.5,0.5))/vDim );
+ vec4 vSamplesLL = textureGather(ima, (iTexLoc+ivec2(-1,1) + vec2(0.5,0.5))/vDim );
+ vec4 vSamplesLR = textureGather(ima, (iTexLoc+ivec2(1,1) + vec2(0.5,0.5))/vDim );
+
+ mat4 H = mat4(vSamplesUL.w, vSamplesUL.x, vSamplesLL.w, vSamplesLL.x,
+ vSamplesUL.z, vSamplesUL.y, vSamplesLL.z, vSamplesLL.y,
+ vSamplesUR.w, vSamplesUR.x, vSamplesLR.w, vSamplesLR.x,
+ vSamplesUR.z, vSamplesUR.y, vSamplesLR.z, vSamplesLR.y);
+*/
+ mat4 H;
+
+ for(int i = 0; i < 4; i++){
+ for(int j = 0; j < 4; j++){
+ mtex_rgbtoint(texelFetch(ima, (iTexLocMod + ivec2(i,j)), 0), H[i][j]);
+ }
+ }
+
+ float x = t.x, y = t.y;
+ float x2 = x * x, x3 = x2 * x, y2 = y * y, y3 = y2 * y;
+
+ vec4 X = vec4(-0.5*(x3+x)+x2, 1.5*x3-2.5*x2+1, -1.5*x3+2*x2+0.5*x, 0.5*(x3-x2));
+ vec4 Y = vec4(-0.5*(y3+y)+y2, 1.5*y3-2.5*y2+1, -1.5*y3+2*y2+0.5*y, 0.5*(y3-y2));
+ vec4 dX = vec4(-1.5*x2+2*x-0.5, 4.5*x2-5*x, -4.5*x2+4*x+0.5, 1.5*x2-x);
+ vec4 dY = vec4(-1.5*y2+2*y-0.5, 4.5*y2-5*y, -4.5*y2+4*y+0.5, 1.5*y2-y);
+
+ // complete derivative in normalized coordinates (mul by vDim)
+ vec2 dHdST = vDim * vec2(dot(Y, H * dX), dot(dY, H * X));
+
+ // transform derivative to screen-space
+ vec2 dHdxy_bicubic = vec2( dHdST.x * TexDx.x + dHdST.y * TexDx.y,
+ dHdST.x * TexDy.x + dHdST.y * TexDy.y );
+
+ // blend between the two
+ dHdxy = dHdxy*(1-fBlend) + dHdxy_bicubic*fBlend;
+ }
+
+ dBs = hScale * dHdxy.x;
+ dBt = hScale * dHdxy.y;
+}
+
+#endif
+
void mtex_bump_tap5( vec3 texco, sampler2D ima, float hScale,
out float dBs, out float dBt )
{
@@ -2127,6 +2205,7 @@ void node_light_path(
out float is_shadow_ray,
out float is_diffuse_ray,
out float is_glossy_ray,
+ out float is_singular_ray,
out float is_reflection_ray,
out float is_transmission_ray)
{
@@ -2134,6 +2213,7 @@ void node_light_path(
is_shadow_ray = 0.0;
is_diffuse_ray = 0.0;
is_glossy_ray = 0.0;
+ is_singular_ray = 0.0;
is_reflection_ray = 0.0;
is_transmission_ray = 0.0;
}
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index 0b7bd5d48bf..8ddb7bb5b95 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,1466 +1,1556 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 46865;
+int datatoc_gpu_shader_material_glsl_size= 49753;
char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,
-114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56,
- 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,
-101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111,
- 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,
- 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,
-120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,
-114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,
-100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,
-105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120,
- 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10,
- 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10,
- 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,
-120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,
-102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59,
- 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48,
- 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32,
- 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,
-102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,
-111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52,
- 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44,
- 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48,
- 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,
-102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118,
- 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32,
- 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,
-114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,
-102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61,
- 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,
- 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103,
- 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32,
- 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,
-108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,
-118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32,
- 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61,
- 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,
-101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,
-111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,
-115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102,
- 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41,
- 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
-114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53,
- 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,
-115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48,
- 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32,
- 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,
-119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,
-114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,
-111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,
-102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
-101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32,
- 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
- 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,
-108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
- 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,
-105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,
-111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
-102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59,
- 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55,
- 57, 51, 50, 51, 56, 52, 54, 10, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56,
- 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32,
- 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,
-108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,
-120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,
-108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,
-105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123,
- 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48,
- 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32,
- 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,
-101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,
-116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51,
- 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109,
- 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 99,111,
-108, 95, 97,108,112,104, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,
- 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,
-111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99,
- 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,
-114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,
-110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,
-110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47,
- 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59,
- 10, 9,118, 99,111,108, 95, 97,108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 59, 10, 9,102,114,111,110,116,
- 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51,
- 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99,
- 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109,
- 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61,
- 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102,
- 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,
-116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41,
- 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32,
- 97, 98,115, 40, 99,111, 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41,
- 59, 10, 9,111,117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
- 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108,
- 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,
-116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49,
- 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,
-108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49,
- 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10, 9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48,
- 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110,
- 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116,
+ 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,
+102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,
+102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44,
+ 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44,
+ 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59,
+ 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93,
+ 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,
+109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32,
+ 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120,
+ 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,
+123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32,
+ 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101,
+ 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41,
+ 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120,
+ 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,
+105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32,
+ 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45,
+ 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48,
+ 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99,
+ 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,
+111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
+ 10,123, 10, 9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118,
+ 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,
+104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48,
+ 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,
+108,115,101, 32,123, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,
+ 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,
+102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41,
+ 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,
+ 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41,
+ 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51,
+ 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,
+114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,
+105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9,
+ 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112,
+ 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103,
+ 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,
+118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99,
+ 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,
+108,105,110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48,
+ 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99,
+ 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,
+111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41,
+ 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111,
+ 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,
+117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,
+101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48,
+ 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,
+105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,
+105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32,
+ 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59,
+ 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,
+111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109,
+ 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101,
+ 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,
+ 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,
+108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98,
+ 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32,
+ 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59,
+ 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,
+105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10,
+ 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48,
+ 54, 57, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,
+117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41,
+ 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44,
+ 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46,
+ 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101,
+ 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,
+101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32,
+ 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51,
+ 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,
+114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 99,111,108, 95, 97,108,112,104, 97, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61,
+ 32, 99,111, 59, 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,
+103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44,
+ 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118,
+ 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61,
+ 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,
+100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,
+116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,118, 99,111,108, 95, 97,
+108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,
+116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99,
+ 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,
+118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110, 32, 61,
+ 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,
+110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101,
+ 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,
+119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122,
+ 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,118,105,
+101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
+ 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32,
+ 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,
+111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108,
+ 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,
+100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,
+118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118,
+ 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,
+101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,
+100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,
+118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,116,
32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,
-110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
-123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
-116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61,
- 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,
-115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
- 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49,
- 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10,
- 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,
-110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10, 9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
-116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32,
- 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59,
- 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,
- 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48,
- 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103,
- 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,
-116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,
-102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
- 9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32,
- 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,
+108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110, 40,
+102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
+105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9,
+ 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
+118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111,
+ 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32,
+ 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,
+116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108,
+ 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116, 32,
+118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108,
+ 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,102,
108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,
-116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,
-116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,
-108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125,
- 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,
-119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,
-119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,
-116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51,
- 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32,
- 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32,
- 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93,
- 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99,
- 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49,
- 32, 45, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41,
- 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50,
- 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,
-101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
-118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99,
- 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,
-118,101, 99, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44,
- 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44,
- 32, 48, 44, 32, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
-101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44,
- 32,118, 50, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,
-118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,
-116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99,
- 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,118, 41, 10,123, 10, 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108,
- 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,
-114, 32, 61, 32,100,105,114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
- 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,
-120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32,
- 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,
-101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43,
- 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,
-116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32,
- 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33,
- 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43,
- 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,
-115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,
-101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
- 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
- 99,111,108, 46,114, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108,
- 46,103, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,
-120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46,
- 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,
-117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,
-117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46,
- 48, 41, 41, 46, 98, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,
-108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99,
- 41, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,
-114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,
-117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,
-118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101,
- 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49,
- 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 52, 32,118, 97,108, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,
-111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 51, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100,
- 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 50, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 50, 32,111,117,116,
-118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,
-112,121, 95,114, 97,119, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
- 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32,
- 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32,
- 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,
- 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44,
- 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
- 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102,
- 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48,
- 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,
-108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108,
- 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97,
- 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
- 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102,
- 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,
-118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,
-111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116,
- 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
- 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
-102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,
-108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32,
- 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114,
- 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,
- 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,
-111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97,
- 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
- 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49,
- 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10,
- 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32,
- 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101, 10,
- 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102,
- 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108,
- 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
- 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45,
- 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,
+117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9,
+ 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,
+102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118,
+ 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32,
+ 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46,
+ 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,
+102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
+ 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,
+108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32,
+ 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
+114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
+108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108,
+ 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49,
+ 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
+100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,
+102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
+ 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59,
+ 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,
+108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50,
+ 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99,
+ 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,
+117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,
+116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,
+125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101,
+ 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10, 9,
+111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,
+117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118,
+ 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,
+118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10, 9,111,
+117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10,
+ 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,
+101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
+108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10, 9,111,
+117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
+ 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,
+111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,
+103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,111,
+117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,
+114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,110,111,114, 59,
+ 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101,
+ 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
+ 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53,
+ 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
+ 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
+ 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 50,
+ 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48,
+ 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9,
+ 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49,
+ 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,
+118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,
+108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,
+101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32, 48,
+ 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,
+116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40,
+ 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48,
+ 46, 48, 41, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,
+114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44,
+ 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 10, 10,
+ 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116,
+ 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,
+116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,
+101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,
+118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,
+116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99,
+ 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,
+108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46,
+ 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,
+111,112,121, 95,114, 97,119, 40,118,101, 99, 52, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,
+108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,112,121,
+ 95,114, 97,119, 40,118,101, 99, 51, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,
+119, 40,118,101, 99, 50, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 50, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
+111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,102,
+108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,
+117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,102,
+108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
+102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,
+108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
+ 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
+ 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, 32,
+ 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41,
- 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,
-111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,
-117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46,
- 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97,
- 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43,
- 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
-120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32,
- 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32,
- 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97,
- 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97,
- 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,
-108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102,
- 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
- 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
-102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116,
- 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98,
- 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
- 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
- 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,
-117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48,
- 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,
-108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108,
- 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,
-108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46,
- 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,
- 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,
-109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, 32,
- 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,
-101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41,
- 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,
-116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42,
- 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,
-111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116,
- 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
- 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, 9,
-125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
+ 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,108,
+ 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
+ 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,102,
+ 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48,
+ 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
- 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32,
- 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,
-111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,
- 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32,
- 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,
-116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,
-115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,
-109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
- 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32,
- 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32,
- 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,
-102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9,
-101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102,
- 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
- 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,
-112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41,
- 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101,
- 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59,
- 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
+ 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46,
+ 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42,
+ 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41, 41,
+ 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103,
+ 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
+ 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108,
+ 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116,
+ 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32,
+ 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108,
+ 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32,
+ 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
+ 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
+ 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,102,
+ 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,
101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97,
99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116,
32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,
-108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,
-116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32,
- 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
-115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, 95,
+108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,114,
+ 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, 47,
+ 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,
+108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108,
+ 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,
+116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,116,
+ 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,102,
+108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
+102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,
+108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116,
+ 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,107,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,
+109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,
+116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,103,
+104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,
+108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108,
+ 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32,
+ 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,
+111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,
+111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32,
+ 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
+ 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
+102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9, 9,
+105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48,
+ 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112, 41,
+ 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,
+101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,
+111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
+ 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,
+112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,
+111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61,
+ 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
+ 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,
+ 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49,
+ 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,109,
+112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,
+108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,
+100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
+102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111,
+ 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,
+108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114,
+ 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40,
+ 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,
+117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46,
+ 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
+ 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42,
+ 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108,
+ 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45,
+ 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9,
+ 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32,
+ 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
+117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97,
+ 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,
+111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48,
+ 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41,
+ 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32,
+ 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9,
+ 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,101,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101,
+ 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,
+111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,
+123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,
+115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44,
+ 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,
+116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,
+ 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
+ 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
+ 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
+ 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10,
+ 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,105,102, 40,104,
+115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50,
+ 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, 43,
+ 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,
+117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,116,
+ 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
+102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,
+115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44,
+ 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,102,
+ 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,
+111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97, 99,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
+ 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59,
+ 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,
+118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41,
+ 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111,
+ 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118,
+ 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,
114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,
111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
- 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116,
+ 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, 97,
+116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
+ 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,118,101,
+ 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101, 32,
+ 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,102,
+ 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,108,
+ 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,116,
32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
- 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
-102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118,
- 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41,
- 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,
-104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109,
- 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103,
- 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118,
- 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,
-108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108,
- 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32,
- 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,
-114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,
-115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,
-115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,
-115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,
-108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
-102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52,
- 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108,
- 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
- 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118,
- 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9,
- 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,
-108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116,
- 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,
-111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,
-108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109,
- 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49,
- 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108,
- 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,
- 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,
-108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101,
- 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,
-108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108,
- 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
-111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108,
- 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32,
- 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32,
- 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102,
- 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,
-103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,
-108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46,
- 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62,
- 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40,
- 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
- 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98,
- 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116,
- 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123,
- 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,118,
-101, 99, 50, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,
-111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32,
- 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32,
- 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,
-114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66,
- 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116,
- 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44,
- 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116,
- 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,
-108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101,
- 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,
-118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32,
- 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46,
- 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32,
- 49, 46, 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62,
- 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93,
- 60, 48, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,
-108,117,101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48,
- 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46,
- 48, 59, 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10,
- 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,
-102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,
-101, 99, 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32,
- 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,
-103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98,
- 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104,
- 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112,
- 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99,
- 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,
-101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101,
- 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,
-113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48,
- 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,
-105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,
-116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101,
- 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53,
- 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,
-108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,
-114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,
-108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,
- 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43,
- 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32,
- 49, 46, 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45,
- 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,
-108,111,114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98,
- 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,
-114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41,
- 10,123, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,
-111, 95,117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,
- 9, 47, 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,
-116,104,101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,
-112,112,105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,
-118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,
-101, 99, 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,
-111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,
-109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,
-114,110, 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10,
- 9, 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32,
- 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,
-110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,
-117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,
-122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,
-101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98,
- 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52,
- 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,
-106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,
-109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123,
- 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116,
- 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,
-120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,
-111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,
-111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,
-109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108,
- 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,
-109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,
- 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42,
- 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,
-108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125,
- 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44,
- 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102,
- 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
- 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,
-120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,
- 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61,
- 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108,
- 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,
-116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46,
- 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,
-118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42,
- 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,
-117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,
-108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10,
- 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,
- 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32,
- 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53,
- 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50,
- 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108,
- 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48,
- 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10,
- 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61,
- 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102,
- 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41,
- 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
-114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108,
- 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,
-116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
- 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120,
- 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,
-105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111,
- 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97,
- 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,
-108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,
-108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,
-102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,
-109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,
-108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,
- 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,
- 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,
-102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,
-103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102,
- 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,
-117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,
+102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49,
+ 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,
+101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50,
+ 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32,
+ 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42,
+ 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
+116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,
+103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,
+111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108,
+ 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,
+111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, 97,
+109,112,108,101,114, 50, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
+108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123, 10, 9,111,117,116, 99,111,108,
+ 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,118,101, 99, 50, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 41, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10,
+ 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,
+114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42,
+ 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,
+110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,
+118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44,
+ 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32,
+ 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46,
+ 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32,
+ 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101,
+ 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,
+102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
+123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,
+115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,
+102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,
+105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,
+118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118,
+ 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,
+118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102,
+ 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,
+102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118,
+ 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61,
+ 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10,
+ 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108,
+ 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44,
+ 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41,
+ 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,
+116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,
+114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,
+101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,
+118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,
+108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48,
+ 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99,
+ 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
+ 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,
+ 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,
+114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,
+118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,
+122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,
+105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101,
+ 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,
+101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,
+117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109,
+ 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,
+111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,
+116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46,
+ 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,
+111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,
+110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10,
+ 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59,
+ 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51,
+ 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111,
+ 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99,
+ 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97,
+ 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,
+104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32,
+ 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48,
+ 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,
+118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51,
+ 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,
+ 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,
+104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32,
+ 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,
+111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,
+116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116,
+ 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,
+108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48,
+ 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116,
+ 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99,
+ 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116,
+ 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111,
+ 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108,
+ 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,
+102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,
+105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51,
+ 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,
+ 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,
+116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,
+111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,
+101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41,
+ 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,
+ 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116,
+ 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102,
+ 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,
+ 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,
+116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101,
99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97,
- 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41,
- 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,
-117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,
-105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108,
- 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32,
- 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,
-108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98,
- 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,
-103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
-111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
-110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116,
- 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,
-108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116,
- 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108,
- 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103,
- 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59,
- 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62,
- 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
-110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
-114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108,
- 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101,
- 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,
-101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,
-103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,
- 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111,
- 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116,
- 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,
-101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32,
- 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101,
+123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,
+102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40,
+ 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40,
+ 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116,
+ 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,
+101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41,
+ 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,
+ 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32,
+ 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,
+109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
+105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116,
+ 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108,
+ 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,
+108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,
+116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,
+108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116,
+ 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46,
+ 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,
+108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
+ 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
+111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,
+118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
+102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
+ 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43,
+ 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101,
99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103,
- 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108,
- 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,
-103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,
+123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,
+116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,
111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
-118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44,
- 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44,
- 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103,
- 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116,
- 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,
-102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48,
- 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61,
- 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,
-109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,
-108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102,
- 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103,
- 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43,
- 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
- 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,
+109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48,
+ 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97,
+ 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108,
+ 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108,
+ 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102,
+ 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109,
+ 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108,
+ 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,
+117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,
+108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109,
+ 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
+111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,
+108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
+116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116,
+ 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,
+109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
+108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114,
+ 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59,
+ 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60,
+ 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,
+110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,
+101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,
+111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,
+108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51,
+ 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
+ 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
+ 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116,
+ 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,
+110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116,
+ 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102,
+ 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,
+101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,
+102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,
+ 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61,
+ 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,
+118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
+102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
+ 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97,
+ 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,
+111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108,
+ 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,
+101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49,
+ 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,
+108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
+116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,
+ 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
+117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
+ 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,
+118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108,
+ 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,
+116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,
+111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102,
+ 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41,
+ 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49,
+ 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,
+111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9,
+ 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
+117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,
+101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59,
+ 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,
+116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111,
+ 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108,
+ 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,
+115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
+ 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,
+116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
+117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
+116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
+ 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,
+ 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108,
+ 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
+118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
+116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
+ 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
+116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
+108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,
+120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
+ 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120,
+ 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
+ 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118,
- 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,
- 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109,
- 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,
-103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,
-105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32,
- 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,
-103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108,
- 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
-111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97,
- 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
- 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,
-102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
+ 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,
+102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,
+111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,
+115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118,
+ 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
+116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
+ 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97,
+ 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
+120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44,
32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97,
- 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108,
- 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120,
- 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,
-103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32,
- 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
-108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
- 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
- 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,
-102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32,
- 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
-108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
- 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
- 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,
-102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,
-116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32,
- 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,
-111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,
-116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,
-105,118,105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,
-114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,
-104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61,
- 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61,
- 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104,
- 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52,
- 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32,
- 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,
-111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,
-114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,
-110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121,
- 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32,
- 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61,
- 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,
- 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
-114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32,
- 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44,
- 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,
-116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,
-110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,
-117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108,
- 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116,
- 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98,
- 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,
-115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,
-110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,
-120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,
-115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,
-101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103,
- 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,
-117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48,
- 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,
-109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41,
- 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111,
- 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109,
- 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,
-118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,
-107,101, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,
-119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,
-101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,
-101,114, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,
-119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,
-101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32,
- 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,
-101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,
-111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51,
- 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
- 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32,
- 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,
-100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,
-111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,
-114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111,
- 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48,
- 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,
-122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109,
- 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97,
- 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,
-109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,
-101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32,
- 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,
-110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,
-108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,
-118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,
-116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,
-109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,
-116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,
-118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,
-115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119,
- 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118,
- 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,
-105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118,
- 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41,
- 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59,
- 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,
-101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,118,101,114,115,101,
- 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119,
- 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78,
- 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,
-105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10,
- 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,
-117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118,
- 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40,
- 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32,
- 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
-105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116,
- 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101,
- 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,
-115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121,
- 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,
-114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,
-101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83,
- 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44,
- 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97,
- 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32,
- 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,
-110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,
-116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,
-119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102,
- 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,
-110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9,
- 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,
- 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61,
- 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84,
- 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,
-115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,
-108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,
- 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,
-115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32,
- 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,
-105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,
-118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,
-103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116,
- 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112,
- 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97,
- 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,
- 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,
-118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,
-111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,
-100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,
-114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,
- 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50,
- 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,
-101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100,
- 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32,
- 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
-109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,
-108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100,
- 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,
-121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,
-120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42,
- 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,
- 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,
-120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,
-101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116,
- 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,
-114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,
-116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,
-111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10,
- 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,
-100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,
-117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32,
- 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,100,101,114,105,118, 40, 32,118,101, 99, 51, 32,
-116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,
-120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,
-115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,102,108,111, 97,116, 32,115, 32, 61,
- 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,104,105,115, 32,105,102, 32,102,108,105,112,112,101,100,
- 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32,
- 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,
-100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10, 9, 47, 47, 32,116,104,105,115, 32,118, 97,114,105, 97,
-110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,105,118,101, 32,109, 97,112, 32,105,115, 32,100,101,115,
- 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116,116,112, 58, 47, 47,109,109,105,107,107,101,108,115,101,
-110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, 48, 49, 49, 47, 48, 55, 47,100,101,114,105,118, 97,116,
-105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99, 50, 32,100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,
-109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99, 50, 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,
-108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111,
- 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,
-101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,120, 46,121, 59, 10, 9,100, 66,116,
- 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,
-101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40,
- 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,
-116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99,
- 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,
-101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100,
- 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99,
- 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,
-114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,
-111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,
-101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,
-102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,
-109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,
-109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110,
- 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101,
+ 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,
+ 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,
+108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
+ 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97,
+ 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10,
+ 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,
+108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109,
+ 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
+ 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102,
+ 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
+ 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,
+111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,
+116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104,
+ 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10,
+ 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,
+108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49,
+ 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
+108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,
+104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,
+114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,
+101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46,
+ 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
+ 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,
+110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,
+118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,
+111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,
+114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
+101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,
+110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116,
+ 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121,
+ 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,
+108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
+103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,
+103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97,
+ 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,
+115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,
+102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,
+101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
+116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,
+115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99,
+ 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101,
+ 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,
+118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41,
+ 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99,
+ 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,
+114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,
+ 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,
+118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,118,101,114,116, 32,111,102, 32,
+116,104,101, 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,107,101, 10, 9, 47, 47, 32,116,
+104,101, 32,110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,119,105,116,104, 32,116,104,101,
+ 32,111,117,116,115,105,100,101, 32,119,111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32,
+ 98,101, 32,100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,101,114, 10, 9, 47, 47, 32,116,
+104,101, 32,110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,119, 97,114,100, 46, 10, 9, 47,
+ 47, 32, 83,104,111,117,108,100, 32,116,104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,
+101,103, 97,116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32,
+ 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41,
+ 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32,
+ 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48,
+ 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,
+109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,
+114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,
+114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118,
+ 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48,
+ 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,
+116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109,
+ 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,
+116, 52, 32,109, 52, 41, 10,123, 10, 9,109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48,
+ 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50,
+ 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51,
+ 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9,
+ 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109,
+ 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9,
+ 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,
+118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,
+101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,
+111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,
+109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,103,108, 95, 77,111,100,101,108,
+ 86,105,101,119, 77, 97,116,114,105,120, 41, 59, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111,
+ 95,109, 97,116, 51, 40,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 73,110,118,101,114,115,101, 41,
+ 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100,
+ 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61,
+ 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,
+101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,
+111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109,
+ 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,
+109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118,
+ 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,
+105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,
+118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42,
+ 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106,
+ 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,
+102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,
+118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77,
+ 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,
+102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,
+112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,
+111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,
+116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9,
+ 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,
+117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100,
+ 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61,
+ 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,
+114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,
+116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,110,111,
+114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59,
+ 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,
+105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,
+103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,
+101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99,
+ 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,
+117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102,
+ 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,
+116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51,
+ 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,
+101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9,
+ 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
+101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9,
+ 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,
+109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,
+105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,
+118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,
+116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118,
+ 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32,
+ 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61,
+ 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,
+102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,
+117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,
+114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
+101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50,
+ 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,
+120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120,
+ 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,
+120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72,
+108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,
+105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,
+116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,114,103, 98,116,111,
+ 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59,
+ 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10,
+ 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,
+ 35,105,102,100,101,102, 32, 66, 85, 77, 80, 95, 66, 73, 67, 85, 66, 73, 67, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,
+117,109,112, 95, 98,105, 99,117, 98,105, 99, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114,
+ 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120,
+ 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,
+101,120, 99,111, 46,120,121, 41, 59, 10, 32, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121,
+ 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120,
+ 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32,
+ 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,118,101, 99, 50,
+ 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10,
+ 9, 10, 9,102,108,111, 97,116, 32, 72,108, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,
+ 41, 46,120, 59, 10, 9,102,108,111, 97,116, 32, 72,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,
+ 83, 84,114, 41, 46,120, 59, 10, 9,102,108,111, 97,116, 32, 72,100, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84,100, 41, 46,120, 59, 10, 9,102,108,111, 97,116, 32, 72,117, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
+ 40,105,109, 97, 44, 32, 83, 84,117, 41, 46,120, 59, 10, 9, 10, 9,118,101, 99, 50, 32,100, 72,100,120,121, 32, 61, 32,118,101,
+ 99, 50, 40, 72,114, 32, 45, 32, 72,108, 44, 32, 72,117, 32, 45, 32, 72,100, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 66,108,
+101,110,100, 32, 61, 32, 99,108, 97,109,112, 40, 49, 46, 48, 45,116,101,120,116,117,114,101, 81,117,101,114,121, 76, 79, 68, 40,
+105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102,
+ 40,102, 66,108,101,110,100, 33, 61, 48, 46, 48, 41, 10, 9,123, 10, 9, 9, 47, 47, 32,116,104,101, 32,100,101,114,105,118, 97,
+116,105,118,101, 32,111,102, 32,116,104,101, 32, 98,105, 99,117, 98,105, 99, 32,115, 97,109,112,108,105,110,103, 32,111,102, 32,
+108,101,118,101,108, 32, 48, 10, 9, 9,105,118,101, 99, 50, 32,118, 68,105,109, 59, 10, 9, 9,118, 68,105,109, 32, 61, 32,116,
+101,120,116,117,114,101, 83,105,122,101, 40,105,109, 97, 44, 32, 48, 41, 59, 10, 10, 9, 9,118,101, 99, 50, 32,102, 84,101,120,
+ 76,111, 99, 32, 61, 32,118, 68,105,109, 42,116,101,120, 99,111, 46,120,121, 45,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53,
+ 41, 59, 10, 9, 9,105,118,101, 99, 50, 32,105, 84,101,120, 76,111, 99, 32, 61, 32,105,118,101, 99, 50, 40,102,108,111,111,114,
+ 40,102, 84,101,120, 76,111, 99, 41, 41, 59, 10, 9, 9,118,101, 99, 50, 32,116, 32, 61, 32, 99,108, 97,109,112, 40,102, 84,101,
+120, 76,111, 99, 32, 45, 32,105, 84,101,120, 76,111, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 9, 9, 47, 47, 32,115,
+ 97,116, 32,106,117,115,116, 32,116,111, 32, 98,101, 32,112,101,100, 97,110,116,105, 99, 10, 10, 9, 9,105,118,101, 99, 50, 32,
+105, 84,101,120, 76,111, 99, 77,111,100, 32, 61, 32,105, 84,101,120, 76,111, 99, 32, 43, 32,105,118,101, 99, 50, 40, 45, 49, 44,
+ 32, 45, 49, 41, 59, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 10, 32, 42, 32, 84,104,105,115, 32, 98,108,111, 99,107, 32,119,105,108,108, 32,114,101,112,108, 97, 99,101, 32,116,
+104,101, 32,111,110,101, 32, 98,101,108,111,119, 32,119,104,101,110, 32,111,110,101, 32, 99,104, 97,110,110,101,108, 32,116,101,
+120,116,117,114,101,115, 32, 97,114,101, 32,112,114,111,112,101,114,108,121, 32,115,117,112,112,111,114,116,101,100, 46, 32, 42,
+ 10, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 9, 9,
+118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 85, 76, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,
+105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 45, 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99,
+ 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112,
+108,101,115, 85, 82, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120,
+ 76,111, 99, 43,105,118,101, 99, 50, 40, 49, 44, 45, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41,
+ 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 76, 76, 32, 61, 32,116,101,120,
+116,117,114,101, 71, 97,116,104,101,114, 40,105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 45,
+ 49, 44, 49, 41, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9,
+118,101, 99, 52, 32,118, 83, 97,109,112,108,101,115, 76, 82, 32, 61, 32,116,101,120,116,117,114,101, 71, 97,116,104,101,114, 40,
+105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 43,105,118,101, 99, 50, 40, 49, 44, 49, 41, 32, 43, 32,118,101, 99, 50, 40,
+ 48, 46, 53, 44, 48, 46, 53, 41, 41, 47,118, 68,105,109, 32, 41, 59, 10, 9, 9, 10, 9, 9,109, 97,116, 52, 32, 72, 32, 61, 32,
+109, 97,116, 52, 40,118, 83, 97,109,112,108,101,115, 85, 76, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,120, 44,
+ 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,120, 44, 10, 9, 9, 9,
+ 9, 9,118, 83, 97,109,112,108,101,115, 85, 76, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 85, 76, 46,121, 44, 32,118, 83,
+ 97,109,112,108,101,115, 76, 76, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 76, 76, 46,121, 44, 10, 9, 9, 9, 9, 9,118,
+ 83, 97,109,112,108,101,115, 85, 82, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 85, 82, 46,120, 44, 32,118, 83, 97,109,112,
+108,101,115, 76, 82, 46,119, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,120, 44, 10, 9, 9, 9, 9, 9,118, 83, 97,109,
+112,108,101,115, 85, 82, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 85, 82, 46,121, 44, 32,118, 83, 97,109,112,108,101,115,
+ 76, 82, 46,122, 44, 32,118, 83, 97,109,112,108,101,115, 76, 82, 46,121, 41, 59, 10, 42, 47, 9, 10, 9, 9,109, 97,116, 52, 32,
+ 72, 59, 10, 9, 9, 10, 9, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 52, 59, 32,105, 43,
+ 43, 41,123, 10, 9, 9, 9,102,111,114, 40,105,110,116, 32,106, 32, 61, 32, 48, 59, 32,106, 32, 60, 32, 52, 59, 32,106, 43, 43,
+ 41,123, 10, 9, 9, 9, 9,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,116,101,120,101,108, 70,101,116, 99,104, 40,
+105,109, 97, 44, 32, 40,105, 84,101,120, 76,111, 99, 77,111,100, 32, 43, 32,105,118,101, 99, 50, 40,105, 44,106, 41, 41, 44, 32,
+ 48, 41, 44, 32, 72, 91,105, 93, 91,106, 93, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9, 9, 10, 9, 9,102,108,111, 97,
+116, 32,120, 32, 61, 32,116, 46,120, 44, 32,121, 32, 61, 32,116, 46,121, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 50, 32, 61,
+ 32,120, 32, 42, 32,120, 44, 32,120, 51, 32, 61, 32,120, 50, 32, 42, 32,120, 44, 32,121, 50, 32, 61, 32,121, 32, 42, 32,121, 44,
+ 32,121, 51, 32, 61, 32,121, 50, 32, 42, 32,121, 59, 10, 10, 9, 9,118,101, 99, 52, 32, 88, 32, 61, 32,118,101, 99, 52, 40, 45,
+ 48, 46, 53, 42, 40,120, 51, 43,120, 41, 43,120, 50, 44, 9, 9, 49, 46, 53, 42,120, 51, 45, 50, 46, 53, 42,120, 50, 43, 49, 44,
+ 9, 45, 49, 46, 53, 42,120, 51, 43, 50, 42,120, 50, 43, 48, 46, 53, 42,120, 44, 9, 9, 48, 46, 53, 42, 40,120, 51, 45,120, 50,
+ 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32, 89, 32, 61, 32,118,101, 99, 52, 40, 45, 48, 46, 53, 42, 40,121, 51, 43,121, 41, 43,
+121, 50, 44, 9, 9, 49, 46, 53, 42,121, 51, 45, 50, 46, 53, 42,121, 50, 43, 49, 44, 9, 45, 49, 46, 53, 42,121, 51, 43, 50, 42,
+121, 50, 43, 48, 46, 53, 42,121, 44, 9, 9, 48, 46, 53, 42, 40,121, 51, 45,121, 50, 41, 41, 59, 10, 9, 9,118,101, 99, 52, 32,
+100, 88, 32, 61, 32,118,101, 99, 52, 40, 45, 49, 46, 53, 42,120, 50, 43, 50, 42,120, 45, 48, 46, 53, 44, 9, 9, 52, 46, 53, 42,
+120, 50, 45, 53, 42,120, 44, 9, 9, 9, 45, 52, 46, 53, 42,120, 50, 43, 52, 42,120, 43, 48, 46, 53, 44, 9, 9, 49, 46, 53, 42,
+120, 50, 45,120, 41, 59, 10, 9, 9,118,101, 99, 52, 32,100, 89, 32, 61, 32,118,101, 99, 52, 40, 45, 49, 46, 53, 42,121, 50, 43,
+ 50, 42,121, 45, 48, 46, 53, 44, 9, 9, 52, 46, 53, 42,121, 50, 45, 53, 42,121, 44, 9, 9, 9, 45, 52, 46, 53, 42,121, 50, 43,
+ 52, 42,121, 43, 48, 46, 53, 44, 9, 9, 49, 46, 53, 42,121, 50, 45,121, 41, 59, 10, 9, 10, 9, 9, 47, 47, 32, 99,111,109,112,
+108,101,116,101, 32,100,101,114,105,118, 97,116,105,118,101, 32,105,110, 32,110,111,114,109, 97,108,105,122,101,100, 32, 99,111,
+111,114,100,105,110, 97,116,101,115, 32, 40,109,117,108, 32, 98,121, 32,118, 68,105,109, 41, 10, 9, 9,118,101, 99, 50, 32,100,
+ 72,100, 83, 84, 32, 61, 32,118, 68,105,109, 32, 42, 32,118,101, 99, 50, 40,100,111,116, 40, 89, 44, 32, 72, 32, 42, 32,100, 88,
+ 41, 44, 32,100,111,116, 40,100, 89, 44, 32, 72, 32, 42, 32, 88, 41, 41, 59, 10, 10, 9, 9, 47, 47, 32,116,114, 97,110,115,102,
+111,114,109, 32,100,101,114,105,118, 97,116,105,118,101, 32,116,111, 32,115, 99,114,101,101,110, 45,115,112, 97, 99,101, 10, 9,
+ 9,118,101, 99, 50, 32,100, 72,100,120,121, 95, 98,105, 99,117, 98,105, 99, 32, 61, 32,118,101, 99, 50, 40, 32,100, 72,100, 83,
+ 84, 46,120, 32, 42, 32, 84,101,120, 68,120, 46,120, 32, 43, 32,100, 72,100, 83, 84, 46,121, 32, 42, 32, 84,101,120, 68,120, 46,
+121, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,100, 72,100, 83, 84, 46,120, 32, 42, 32, 84,101,120, 68,121, 46,120, 32,
+ 43, 32,100, 72,100, 83, 84, 46,121, 32, 42, 32, 84,101,120, 68,121, 46,121, 32, 41, 59, 10, 10, 9, 9, 47, 47, 32, 98,108,101,
+110,100, 32, 98,101,116,119,101,101,110, 32,116,104,101, 32,116,119,111, 10, 9, 9,100, 72,100,120,121, 32, 61, 32,100, 72,100,
+120,121, 42, 40, 49, 45,102, 66,108,101,110,100, 41, 32, 43, 32,100, 72,100,120,121, 95, 98,105, 99,117, 98,105, 99, 42,102, 66,
+108,101,110,100, 59, 10, 9,125, 10, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32,100, 72,100,120,121, 46,
+120, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32,100, 72,100,120,121, 46,121, 59, 10,125, 10, 10, 35,
+101,110,100,105,102, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99,
+ 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,
+108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101,
99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50,
- 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,
-118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,
-120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82,
- 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,
-118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,
-121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,
-118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100,
- 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101,
- 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123,
- 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,
-111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101,
- 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,
-110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122,
- 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,
-103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,
-114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109,
- 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,
-108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,
-111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45,
- 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109,
- 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,
-114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110,
- 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102,
- 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48,
- 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,
-105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,
-109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,
-116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111,
- 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,
-108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49,
- 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101,
- 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108,
- 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,
-108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,
-108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108,
- 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,
-115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,
-100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,
-116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116,
- 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116,
- 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,
-115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,
-111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112,
- 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41,
- 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
- 44, 32,118,101, 99, 50, 40,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10,125,
- 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114,101, 40,102,108,
-111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108,111, 97,116, 32,
-118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123,
- 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, 10, 9,111,117,
-116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, 41, 47,108, 97,
-109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,
-115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,116, 52, 32,108,
- 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114,
- 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32,
-123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, 99, 52, 40,
-108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97,
- 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,116, 46,121,
- 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49,
- 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, 32, 48, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95, 99,
-105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, 44, 32,108,
- 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121,
- 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,116, 98,108,
- 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32,
-115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,111,117,116,118,
-105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 32, 61, 32,105,
-110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, 9, 9,105,102,
- 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,109,111,111,116,
-104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, 9, 9,111,117,
-116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 10,125, 10, 10,118,
-111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,
+ 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 50, 32,
+ 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,
+111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61,
+ 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32,
+ 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,
+118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,
+121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,114,103,
+ 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41,
+ 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44,
+ 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,
+ 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,
+105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,
+114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104,
+ 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101,
+ 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,
+100,101,114,105,118, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97,
+ 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,111, 97,
+116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,
+123, 10, 9,102,108,111, 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,104,105,
+115, 32,105,102, 32,102,108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 10,
+ 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,
+101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10, 9, 47,
+ 47, 32,116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,105,118,
+101, 32,109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116,116,112,
+ 58, 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, 48, 49,
+ 49, 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99, 50, 32,
+100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99, 50, 32,
+100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,101, 50,
+ 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100, 66,115,
+ 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,
+101,120, 68,120, 46,121, 59, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120, 32, 43,
+ 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100,
+ 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82,
+ 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99,
+ 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,
+110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110,
+ 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50,
+ 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,
+117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,
+108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
+ 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44,
+ 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44,
+ 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,
+120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,
+101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51,
+ 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,
+111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,
+111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,
+120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,
+116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,
+104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120,
+ 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,
+116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,
+105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, 10, 9,
+118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100,
+ 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118,
+ 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,
+116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,
+110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52,
+ 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,
+111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,118,101,
+ 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97,108, 44,
+ 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116,101,120,
+110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109, 97,108,
+ 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,
+111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32,110,111,
+114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114,109, 97,
+108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,
+109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,110,111,
+114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,
+109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 32, 77,
+ 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,
+115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, 99, 59,
+ 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10,
+ 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, 99, 51,
+ 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99,
+ 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61, 32,108,
+101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10,
+ 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,
+108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,
+108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10,
+ 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,
+100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,118,115,
+113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32,
+ 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105,115,116,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114,115, 40,
+102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111, 97,116,
+ 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,
+102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,112,100,
+105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,
+115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115,105,102,
+ 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, 32,108,
+100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,
+111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,108,101,
+114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,117,114,
+101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,100,105,115,116, 47,108, 97,109,112,100,105,115,116,
+ 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,
+116,121, 95,115,112,104,101,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,
+100,105,115,116, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32,
+ 45, 32,100,105,115,116, 59, 10, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,
+120, 40,116, 44, 32, 48, 46, 48, 41, 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112,
+ 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,
+112,118,101, 99, 44, 32,109, 97,116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,
+118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,
+109,112,105,109, 97,116, 42,118,101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111,
+ 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44,
+ 32, 97, 98,115, 40,108,118,114,111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32,
+ 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10,
+ 9, 9,105,110,112,114, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,
+105,108,105,116,121, 95,115,112,111,116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,
+118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114,
+ 32, 61, 32,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,
+112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,
+102,108,111, 97,116, 32,115,112,111,116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,
118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123,
- 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41,
- 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,
-101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, 10, 9, 47, 42,
- 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,104,105, 99,
- 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120,
- 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 58, 32,118,
-101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40,
-108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44,
- 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,114, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51,
- 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, 32,100,111,116,
- 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,111, 95,100,105,
-102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 48, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, 32,105,110,112,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32,
- 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121,
- 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10,
- 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, 97,100, 91, 52,
- 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111,
- 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,
-108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 50, 93, 32,
- 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, 59, 10, 9,
-118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46,
-120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,
-101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, 99, 91, 50, 93,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51,
- 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99,
- 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40,100,
-111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, 32, 61, 32, 97,
- 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 50,
- 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9,
-114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93,
- 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 48, 93, 41,
- 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, 41, 59, 10, 9,
-102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, 9,102, 97, 99,
- 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,101,116,117,114,
-110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,
-110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,108, 97,109,112,
- 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32,
- 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,107, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,115,105,116,
-105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 10, 9,
-105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
-105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,105,110,
-116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, 32, 99,111,
- 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,101, 97,115,
-105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,
-101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,
-101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
-118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104,
- 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,
-118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, 40,110, 44,
- 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61,
- 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
-105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,118,104, 32,
- 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 76,
-105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 86,105,101,
-119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32,
-110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,101, 99, 51, 32,
- 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, 10, 10, 9,
- 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66,
- 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,102, 40, 76,105,
-116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,
- 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 97, 32, 61,
- 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, 9, 9,102,108,
-111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104,
- 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, 9, 9,102,108,
-111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111,
-117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, 32, 48, 46, 57,
- 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105,110, 40, 97,
- 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,
-105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51,
- 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116,
- 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59,
- 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,
-101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,
-115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,
-115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,101,114,116,
- 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116,
- 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,102, 40,110,
-108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101,
- 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48,
- 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, 9, 9, 9,105,
-115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107,
-110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,
-111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59,
- 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105,
-101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,102,102, 97, 99,
- 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59,
- 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,118,110, 41, 59,
- 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, 9,101,108,115,
-101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48,
- 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46,
- 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41,
- 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, 59, 10, 9,
-125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,
-105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44,
- 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,116, 32,102,
- 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,101,115,110,101,
-108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48,
- 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,
-105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,111,105,100, 32,
-115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,118,105,115,
-105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,
- 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, 61, 32,109, 97,
-120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,108,115,101, 10,
- 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97,110,103,
-101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,
-110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,
-100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, 97,109,112,
- 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, 97,109,112,
- 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 48,
- 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,104,101,109,
-105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,
-101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,102,108,111, 97,
-116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,108,118, 32, 43, 61,
- 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 10, 9,116, 32,
- 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59,
- 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,114,100, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,101, 99, 51, 32,
-110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,
-114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,109, 97,
-120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,112,
-111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,111,
-111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51,
- 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97,
- 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59,
- 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, 40,110,104, 32,
- 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,
-115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44,
- 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,114,100, 41,
- 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61,
- 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,101, 99, 40,
-118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,101,
-102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123,
- 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,115,112,
-101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48,
- 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 60, 49,
- 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, 48, 47,115,112,
-101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61,
- 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,
-114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116,
- 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,115,112,101, 99,
-102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,108,111, 97,116,
- 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 9, 9, 9,102,
-108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61,
- 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9,125,
- 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,
-116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49,
- 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, 47,118,104,
- 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,104, 59, 10,
- 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32,
- 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 98,
- 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,
-102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, 9, 9,102,108,
-111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, 97, 99, 41, 43,
- 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, 32, 40, 40, 40,
-112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, 41, 41, 42, 40,
- 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 43,
-118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 42, 40, 40,
-118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97,110,
-103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,109, 97,120,
- 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, 47, 40, 50, 46,
- 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, 48, 46, 48, 41,
- 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119, 97,114,100,
-105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44,
- 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123,
- 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,
-111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10,
- 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49,
- 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46,
- 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, 40,110,104,
- 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48,
- 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95,
- 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, 40, 45, 40,
- 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,115,113,114,
-116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,110, 95,115,
-112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,
-116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
-108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59,
- 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,
-110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,
- 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,
-116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,114,115,108,
-116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41,
- 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,102,
-108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, 97, 99, 41, 10,
-123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, 10,125, 10, 10,
-118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44,
- 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,
-116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, 32, 61, 32,115,
-104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, 10,125, 10, 10,
-118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,118,101, 99,
- 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 99,111,108, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116, 42,108, 97,109,112, 99,111,108, 42,
-115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,118,101, 99, 52, 32,
- 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
- 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32, 99,111,108,
+ 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61,
+ 32,116, 41, 32,123, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,
+115,101, 32,123, 10, 9, 9,116, 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32,
+ 97,114,101, 97, 32, 42, 47, 10, 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,
+110,112,114, 32, 42, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,
+111,116, 98,108, 41, 59, 10, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,
+110,112,114, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,
+ 99,108, 97,109,112, 40,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,
+102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,118,105,101,119, 41, 10,123, 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,
+111,114,116,104,111,103,114, 97,112,104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,
+101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109,
+ 97,108,105,122,101, 40, 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118,
+ 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99,
+ 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,
+114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109,
+ 97,108,105,122,101, 40,118,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,
+101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,
+123, 10, 9,105,110,112, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104,
+ 97,100,101, 95,105,115, 95,110,111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,
+123, 10, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,
+109,105, 40,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,
+115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97,
+ 95,108, 97,109,112, 95,101,110,101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44,
+ 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10,
+ 9,102,108,111, 97,116, 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,
+110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101,
+ 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,
+122, 41, 59, 10, 9,118,101, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101,
+ 97, 91, 50, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,
+111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,
+108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91,
+ 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99,
+ 91, 50, 93, 41, 41, 59, 10, 9, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,
+101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,
+122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100,
+ 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59,
+ 10, 9,114, 97,100, 91, 49, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91,
+ 50, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44,
+ 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101,
+ 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,
+111,116, 40,118,110, 44, 32, 99, 91, 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,
+118,110, 44, 32, 99, 91, 49, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44,
+ 32, 99, 91, 50, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91,
+ 51, 93, 41, 59, 10, 10, 9,114,101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,
+110, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101,
+ 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101,
+ 44, 32,102,108,111, 97,116, 32,107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99,
+ 51, 32, 99,111, 32, 61, 32,112,111,115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32,
+ 45, 32,108, 97,109,112, 99,111, 59, 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41,
+ 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,
+123, 10, 9, 9,102,108,111, 97,116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,
+114,103,121, 40, 97,114,101, 97, 44, 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,
+105,110,116,101,110,115, 42, 97,114,101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,
+115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,
+108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116,
+ 32,114,111,117,103,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32,
+ 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,
+109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61,
+ 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,
+108,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48,
+ 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108,
+ 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123,
+ 10, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48,
+ 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59,
+ 10, 9, 9,102,108,111, 97,116, 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,
+101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108,
+ 42,110, 41, 59, 10, 9, 9,118,101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118,
+ 32, 45, 32,110,118, 42,110, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,
+105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44,
+ 32, 98, 59, 10, 10, 9, 9,105,102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97,
+ 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,
+108,115,101, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95,
+ 65, 59, 10, 9, 9,125, 10, 10, 9, 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40,
+ 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48,
+ 46, 51, 51, 41, 41, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104,
+ 42,114,111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59,
+ 10, 10, 9, 9, 98, 32, 42, 61, 32, 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66,
+ 32, 42, 32,116, 32, 42, 32,115,105,110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,
+118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,
+116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,
+116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61,
+ 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115,
+ 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,
+115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32,
+ 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,
+122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,
+117,115,101, 95,109,105,110,110, 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,
+101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,105,115, 41, 10,123, 10, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48,
+ 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,
+100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32,
+ 60, 61, 32, 49, 46, 48, 41, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108,
+ 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10,
+ 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,
+110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108,
+ 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,
+114, 97,100, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59,
+ 10, 9,102,108,111, 97,116, 32,102,102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9,
+ 9,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,
+116, 40,118,105,101,119, 44, 32,118,110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49,
+ 46, 48, 43,116, 49, 59, 10, 9, 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61,
+ 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59,
+ 10, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,
+101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,
+102,102, 97, 99, 32, 61, 32,116, 50, 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,
+118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99, 95,105, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10,
+ 9,105,115, 32, 61, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44,
+ 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116,
+ 32,105,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48,
+ 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,
+112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,
+105,115, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,
+105, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47,
+ 10, 9, 9,111,117,116,105, 32, 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46,
+ 48, 41, 59, 10, 9, 47, 42,101,108,115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,
+100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,
+105, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,
+ 99,111,108, 32, 61, 32,105, 42,108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
+ 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,115,104, 97,100,101, 95,104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51,
+ 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,
+116, 32,104, 97,114,100, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,116, 41, 10,123, 10, 9,108,118, 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,
+122,101, 40,108,118, 41, 59, 10, 10, 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32,
+ 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,
+112,111,119, 40,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,
+103, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,
+108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10,
+ 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111,
+ 97,116, 32,114,115,108,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10,
+ 9,115,112,101, 99,102, 97, 99, 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,
+118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,
+108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,
+104, 41, 59, 10, 10, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61,
+ 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,
+120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,
+111,119, 40,110,104, 44, 32,104, 97,114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59,
+ 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95, 98,108,105,110,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51,
+ 32,118, 44, 32,102,108,111, 97,116, 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,
+101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,
+114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125,
+ 10, 9,101,108,115,101, 32,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9,
+ 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,
+115,112,101, 99, 95,112,111,119,101,114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61,
+ 32,115,113,114,116, 40, 49, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9,
+ 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9,
+ 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,
+111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46,
+ 48, 41, 32,123, 10, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,
+101, 32,123, 10, 9, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44,
+ 32, 48, 46, 48, 49, 41, 59, 10, 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59,
+ 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99,
+ 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116,
+ 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9,
+ 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50,
+ 46, 48, 42,110,104, 42,110,118, 41, 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48,
+ 42,110,104, 42,110,108, 41, 47,118,104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10,
+ 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9,
+ 9, 9, 9,101,108,115,101, 32,105,102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98,
+ 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32,
+ 61, 32, 99, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97,
+ 99, 32, 42, 32,114,101,102,114, 97, 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,
+108,111, 97,116, 32,102, 32, 61, 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104,
+ 41, 42, 40,112, 43,118,104, 41, 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49,
+ 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,
+118,104, 41, 41, 43, 49, 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10,
+ 9, 9, 9, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,
+112,101, 99,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40,
+ 97,110,103, 42, 97,110,103, 41, 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,
+119,101,114, 41, 41, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,
+100, 32,115,104, 97,100,101, 95,119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99,
+ 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101,
+ 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,
+104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,
+110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,
+111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61,
+ 32,116, 97,110, 40, 97, 99,111,115, 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109,
+ 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32,
+ 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,
+112, 95, 98,108,101,110,100,101,114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42,
+ 97,108,112,104, 97, 41, 41, 47, 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,104, 97,100,101, 95,116,111,111,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,
+118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,
+104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32,
+ 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32,
+ 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,
+115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46,
+ 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,
+116,104, 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46,
+ 48, 59, 10, 9,101,108,115,101, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,
+122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,
+125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,
+116, 32,115,112,101, 99,102, 97, 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,
+102, 97, 99, 42,105,110,112, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,
+111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,
+105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,116, 41, 10,123, 10, 9,116, 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,
+115,112,101, 99,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,
+102,108,111, 97,116, 32,116, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99,
+ 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32,
+ 61, 32,116, 42,108, 97,109,112, 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43,
+ 32, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,
+111,108, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108,
+ 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,
+100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40,
+ 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52,
+ 32, 99,111,108, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109,
+ 97,120, 40, 99,111,108, 49, 42, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48,
+ 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99,
+ 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,
+101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42,
+ 99,111,108, 49, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,111,108,
49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
- 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,
-111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 49, 44,
- 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48,
- 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
- 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, 49, 42, 99,111,108, 50,
- 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
-123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,104, 97,100,101, 95,109,117,108, 40,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
-111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, 97,108,117,
-101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10,125, 10, 10,
-118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99,
- 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111,
-108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, 99, 51, 32,
- 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
- 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32,
- 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,
-108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99,
- 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,104, 97,
-100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103,121, 42, 40,
- 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,
-108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44,
- 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118,101, 99, 52,
- 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32,115,104, 97,
-100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61, 32,115,112,
-101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,114, 99,111,
- 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116,
- 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,
-115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,
-123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48,
- 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,
-119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47, 47,102,108,
-111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, 97,100,111,
-119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,111, 46,119,
- 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,
-119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,101,120,
-112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,108,
-105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,
-101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
-109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105,115,116,115,
-116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115,116,116,121,
-112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99,
- 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 10, 10, 9,122, 99,111,114, 32, 61, 32, 40,
-103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48,
- 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 10, 9, 10, 9,102, 97, 99, 32, 61, 32,
- 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41, 47,109,105,115,116,100,105,115,116, 44, 32, 48,
- 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102,
- 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 10, 9,101,108,115,101, 32,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32,
- 49, 46, 48, 41, 59, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32,115,113,114,116, 40,102, 97, 99, 41, 59, 10, 10, 9,111,
-117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,
-105, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,101, 99, 51,
- 32,104,111,114, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
- 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48,
- 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,114, 44, 32,
- 99,111,108, 46,114,103, 98, 44, 32,102, 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95, 97,108,112,104, 97, 95,111,112, 97,113,117,101, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,
-108, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97,
- 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52,
- 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10, 47, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, 69, 87, 32, 83, 72, 65, 68, 69, 82, 32, 85, 84, 73, 76, 73, 84, 73, 69, 83, 32, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,100,105,
-101,108,101, 99,116,114,105, 99, 40,118,101, 99, 51, 32, 73,110, 99,111,109,105,110,103, 44, 32,118,101, 99, 51, 32, 78,111,114,
-109, 97,108, 44, 32,102,108,111, 97,116, 32,101,116, 97, 41, 10,123, 10, 32, 32, 32, 32, 47, 42, 32, 99,111,109,112,117,116,101,
- 32,102,114,101,115,110,101,108, 32,114,101,102,108,101, 99,116, 97,110, 99,101, 32,119,105,116,104,111,117,116, 32,101,120,112,
-108,105, 99,105,116,108,121, 32, 99,111,109,112,117,116,105,110,103, 10, 32, 32, 32, 32, 32, 32, 32,116,104,101, 32,114,101,102,
-114, 97, 99,116,101,100, 32,100,105,114,101, 99,116,105,111,110, 32, 42, 47, 10, 32, 32, 32, 32,102,108,111, 97,116, 32, 99, 32,
- 61, 32, 97, 98,115, 40,100,111,116, 40, 73,110, 99,111,109,105,110,103, 44, 32, 78,111,114,109, 97,108, 41, 41, 59, 10, 32, 32,
- 32, 32,102,108,111, 97,116, 32,103, 32, 61, 32,101,116, 97, 32, 42, 32,101,116, 97, 32, 45, 32, 49, 46, 48, 32, 43, 32, 99, 32,
- 42, 32, 99, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 59, 10, 10, 32, 32, 32, 32,105,102, 40,103,
- 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103, 32, 61, 32,115,113,114,116, 40,103, 41, 59, 10, 32,
- 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, 32, 65, 32, 61, 40,103, 32, 45, 32, 99, 41, 47, 40,103, 32, 43, 32, 99, 41, 59,
- 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, 32, 66, 32, 61, 40, 99, 32, 42, 40,103, 32, 43, 32, 99, 41, 45, 32, 49,
- 46, 48, 41, 47, 40, 99, 32, 42, 40,103, 32, 45, 32, 99, 41, 43, 32, 49, 46, 48, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,
-101,115,117,108,116, 32, 61, 32, 48, 46, 53, 32, 42, 32, 65, 32, 42, 32, 65, 32, 42, 40, 49, 46, 48, 32, 43, 32, 66, 32, 42, 32,
- 66, 41, 59, 10, 32, 32, 32, 32,125, 10, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,
-116, 32, 61, 32, 49, 46, 48, 59, 32, 32, 47, 42, 32, 84, 73, 82, 32, 40,110,111, 32,114,101,102,114, 97, 99,116,101,100, 32, 99,
-111,109,112,111,110,101,110,116, 41, 32, 42, 47, 10, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,114,101,115,117,108,116, 59,
- 10,125, 10, 10,102,108,111, 97,116, 32,104,121,112,111,116, 40,102,108,111, 97,116, 32,120, 44, 32,102,108,111, 97,116, 32,121,
- 41, 10,123, 10, 9,114,101,116,117,114,110, 32,115,113,114,116, 40,120, 42,120, 32, 43, 32,121, 42,121, 41, 59, 10,125, 10, 10,
- 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, 69, 87, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10, 35,100,101,102,105,110,101, 32, 78, 85, 77, 95, 76, 73, 71, 72,
- 84, 83, 32, 51, 10, 10, 47, 42, 32, 98,115,100,102,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,
-102, 95,100,105,102,102,117,115,101, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,
-104,110,101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,
-123, 10, 9, 47, 42, 32, 97,109, 98,105,101,110,116, 32,108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61,
- 32,118,101, 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,
-104,116,115, 32, 42, 47, 10, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76,
- 73, 71, 72, 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,
-105,111,110, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110,
- 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 32, 61, 32,103,108, 95,
- 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, 10, 10, 9, 9,102,
-108,111, 97,116, 32, 98,115,100,102, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,
-105,116,105,111,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,100,105,102,102,117,
-115,101, 42, 98,115,100,102, 59, 10, 9,125, 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,
-108,111,114, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102,
- 95,103,108,111,115,115,121, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,
-101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,
-115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, 98,105,101,110,116, 32,108,105,103,104,116, 32, 42, 47, 10, 9,118,101,
- 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,101, 99,116,105,111,110,
- 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60,
- 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116,
- 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,112,111,
-115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32, 72, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,
-111,117,114, 99,101, 91,105, 93, 46,104, 97,108,102, 86,101, 99,116,111,114, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,
-108,105,103,104,116, 95,100,105,102,102,117,115,101, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105,
- 93, 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,115,112,101, 99,
-117,108, 97,114, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,115,112,101, 99,117,108, 97,
-114, 46,114,103, 98, 59, 10, 10, 9, 9, 47, 42, 32,119,101, 32,109,105,120, 32,105,110, 32,115,111,109,101, 32,100,105,102,102,
-117,115,101, 32,115,111, 32,108,111,119, 32,114,111,117,103,104,110,101,115,115, 32,115,116,105,108,108, 32,115,104,111,119,115,
- 32,117,112, 32, 42, 47, 10, 9, 9,102,108,111, 97,116, 32, 98,115,100,102, 32, 61, 32, 48, 46, 53, 42,112,111,119, 40,109, 97,
-120, 40,100,111,116, 40, 78, 44, 32, 72, 41, 44, 32, 48, 46, 48, 41, 44, 32, 49, 46, 48, 47,114,111,117,103,104,110,101,115,115,
- 41, 59, 10, 9, 9, 98,115,100,102, 32, 43, 61, 32, 48, 46, 53, 42,109, 97,120, 40,100,111,116, 40, 78, 44, 32,108,105,103,104,
-116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,
-115,112,101, 99,117,108, 97,114, 42, 98,115,100,102, 59, 10, 9,125, 10, 10, 9,114,101,115,117,108,116, 32, 61, 32,118,101, 99,
- 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,
-101, 95, 98,115,100,102, 95, 97,110,105,115,111,116,114,111,112,105, 99, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,
-108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 85, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115,
- 86, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,
-108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32,
- 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,
-100,102, 95,103,108, 97,115,115, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,
-110,101,115,115, 44, 32,102,108,111, 97,116, 32,105,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,
-105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,116,114, 97,110,115,108,117, 99,101,110,116, 40,118,101, 99,
- 52, 32, 99,111,108,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116,
- 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46,
- 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102,
- 95,116,114, 97,110,115,112, 97,114,101,110,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32,116,104,105,115, 32,105,115,110, 39,116, 32,114,105,103,104,116,
- 32, 42, 47, 10, 9,114,101,115,117,108,116, 46,114, 32, 61, 32, 99,111,108,111,114, 46,114, 59, 10, 9,114,101,115,117,108,116,
- 46,103, 32, 61, 32, 99,111,108,111,114, 46,103, 59, 10, 9,114,101,115,117,108,116, 46, 98, 32, 61, 32, 99,111,108,111,114, 46,
- 98, 59, 10, 9,114,101,115,117,108,116, 46, 97, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101,
- 95, 98,115,100,102, 95,118,101,108,118,101,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,
-105,103,109, 97, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123,
- 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32,
- 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10, 47, 42, 32,101,109,105,115,115,105,111,110, 32, 42, 47, 10, 10,118,
-111,105,100, 32,110,111,100,101, 95,101,109,105,115,115,105,111,110, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,
-111, 97,116, 32,115,116,114,101,110,103,116,104, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,
-101,115,117,108,116, 41, 10,123, 10, 9,114,101,115,117,108,116, 32, 61, 32, 99,111,108,111,114, 42,115,116,114,101,110,103,116,
-104, 59, 10,125, 10, 10, 47, 42, 32, 99,108,111,115,117,114,101,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,
-109,105,120, 95,115,104, 97,100,101,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,
-114, 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,
-114, 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, 32,109,105,120, 40,115,104, 97,100,101,114, 49, 44, 32,115,104, 97,100,
-101,114, 50, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 97,100,100, 95,115,104, 97,100,
-101,114, 40,118,101, 99, 52, 32,115,104, 97,100,101,114, 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, 32,115,104, 97,100,
-101,114, 49, 32, 43, 32,115,104, 97,100,101,114, 50, 59, 10,125, 10, 10, 47, 42, 32,102,114,101,115,110,101,108, 32, 42, 47, 10,
- 10,118,111,105,100, 32,110,111,100,101, 95,102,114,101,115,110,101,108, 40,102,108,111, 97,116, 32,105,111,114, 44, 32,118,101,
- 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,101,116, 97, 32, 61, 32,109, 97,120, 40,105,111,114, 44, 32, 48, 46, 48, 48, 48, 48, 49, 41,
- 59, 10, 9,114,101,115,117,108,116, 32, 61, 32,102,114,101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40, 73,
- 44, 32, 78, 44, 32,101,116, 97, 41, 59, 32, 47, 47, 98, 97, 99,107,102, 97, 99,105,110,103, 40, 41, 63, 32, 49, 46, 48, 47,101,
-116, 97, 58, 32,101,116, 97, 41, 59, 10,125, 10, 10, 47, 42, 32,103,101,111,109,101,116,114,121, 32, 42, 47, 10, 10,118,111,105,
-100, 32,110,111,100,101, 95,103,101,111,109,101,116,114,121, 40,118,101, 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,
-109, 97,116, 52, 32,116,111,119,111,114,108,100, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,112,111,115,105,116,105,111,110,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,116, 97,110,103,
-101,110,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,116,114,117,101, 95,110,111,114,109, 97,108, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,105,110, 99,111,109,105,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112, 97,114, 97,109,101,116,114,
-105, 99, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32, 98, 97, 99,107,102, 97, 99,105,110,103, 41, 10,123, 10, 9,112,111,
-115,105,116,105,111,110, 32, 61, 32, 40,116,111,119,111,114,108,100, 42,118,101, 99, 52, 40, 73, 44, 32, 49, 46, 48, 41, 41, 46,
-120,121,122, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 78, 59, 10, 9,116, 97,110,103,101,110,116, 32, 61, 32,118,101, 99,
- 51, 40, 48, 46, 48, 41, 59, 10, 9,116,114,117,101, 95,110,111,114,109, 97,108, 32, 61, 32, 78, 59, 10, 9,105,110, 99,111,109,
-105,110,103, 32, 61, 32, 73, 59, 10, 9,112, 97,114, 97,109,101,116,114,105, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41,
- 59, 10, 9, 98, 97, 99,107,102, 97, 99,105,110,103, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,
-101, 95,116,101,120, 95, 99,111,111,114,100, 40,118,101, 99, 51, 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,109, 97,116, 52,
- 32,116,111,119,111,114,108,100, 44, 10, 9,118,101, 99, 51, 32, 97,116,116,114, 95,111,114, 99,111, 44, 32,118,101, 99, 51, 32,
- 97,116,116,114, 95,117,118, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,103,101,110,101,114, 97,116,101,100, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 44, 10, 9,111,117,116,
- 32,118,101, 99, 51, 32, 99, 97,109,101,114, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,119,105,110,100,111,119, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,114,101,102,108,101, 99,116,105,111,110, 41, 10,123, 10, 9,103,101,110,101,114, 97,116,101,100,
- 32, 61, 32, 97,116,116,114, 95,111,114, 99,111, 59, 10, 9,117,118, 32, 61, 32, 97,116,116,114, 95,117,118, 59, 10, 9,111, 98,
-106,101, 99,116, 32, 61, 32, 73, 59, 10, 9, 99, 97,109,101,114, 97, 32, 61, 32, 73, 59, 10, 9,119,105,110,100,111,119, 32, 61,
- 32,103,108, 95, 70,114, 97,103, 67,111,111,114,100, 46,120,121,122, 59, 10, 9,114,101,102,108,101, 99,116,105,111,110, 32, 61,
- 32,114,101,102,108,101, 99,116, 40, 78, 44, 32, 73, 41, 59, 10, 10,125, 10, 10, 47, 42, 32,116,101,120,116,117,114,101,115, 32,
- 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32, 99,111, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10,
- 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,108,111,117,100,115, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,
-108,111, 97,116, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,
+ 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104,
+ 97,100,101, 95,109,117,108, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
+108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,
+ 99,111,108, 42,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,
+101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111,
+ 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,
+103, 98,116,111, 98,119, 40,118,101, 99, 51, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,
+111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,
+108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,111,117,116,115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32,
+ 61, 32,105, 42,101,110,101,114,103,121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,
+111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61,
+ 32,100,105,102,102, 32, 45, 32,118,101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108,
+ 97,114, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,
+118,101, 99, 52, 32,115,112,101, 99, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,
+111,117,116,115,112,101, 99, 32, 61, 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104,
+ 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119,
+ 98,117,102, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104,
+ 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111,
+ 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10,
+ 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99,
+ 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49,
+ 46, 48, 41, 59, 10, 10, 9, 9, 47, 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,
+112, 42,105,110,112, 41, 42,115,104, 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,
+100,111,119, 98,105, 97,115, 42, 99,111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119,
+ 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,108,105,
+110,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44,
+ 32,102,108,111, 97,116, 32,109,105,115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,
+102,108,111, 97,116, 32,109,105,115,116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114,
+ 59, 10, 10, 9,122, 99,111,114, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91,
+ 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50,
+ 93, 59, 10, 9, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41,
+ 47,109,105,115,116,100,105,115,116, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40,109,105,115,116,116,121,
+112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 10, 9,101,108,115,101, 32,105,102, 40,
+109,105,115,116,116,121,112,101, 32, 61, 61, 32, 49, 46, 48, 41, 59, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32,115,113,
+114,116, 40,102, 97, 99, 41, 59, 10, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 45,102,
+ 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,105, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119,111,
+114,108,100, 95,109,105,120, 40,118,101, 99, 51, 32,104,111,114, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 32, 61, 32, 99,108, 97,109,
+112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101,
+ 99, 52, 40,109,105,120, 40,104,111,114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102, 97, 99, 41, 44, 32, 99,111,108, 46, 97,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111,112, 97,113,117,101, 40,118,101,
+ 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,
+101, 99, 52, 32,111, 98, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,
+108, 46, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, 69, 87, 32, 83, 72, 65, 68, 69, 82,
+ 32, 85, 84, 73, 76, 73, 84, 73, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,102,108,111, 97,
+116, 32,102,114,101,115,110,101,108, 95,100,105,101,108,101, 99,116,114,105, 99, 40,118,101, 99, 51, 32, 73,110, 99,111,109,105,
+110,103, 44, 32,118,101, 99, 51, 32, 78,111,114,109, 97,108, 44, 32,102,108,111, 97,116, 32,101,116, 97, 41, 10,123, 10, 32, 32,
+ 32, 32, 47, 42, 32, 99,111,109,112,117,116,101, 32,102,114,101,115,110,101,108, 32,114,101,102,108,101, 99,116, 97,110, 99,101,
+ 32,119,105,116,104,111,117,116, 32,101,120,112,108,105, 99,105,116,108,121, 32, 99,111,109,112,117,116,105,110,103, 10, 32, 32,
+ 32, 32, 32, 32, 32,116,104,101, 32,114,101,102,114, 97, 99,116,101,100, 32,100,105,114,101, 99,116,105,111,110, 32, 42, 47, 10,
+ 32, 32, 32, 32,102,108,111, 97,116, 32, 99, 32, 61, 32, 97, 98,115, 40,100,111,116, 40, 73,110, 99,111,109,105,110,103, 44, 32,
+ 78,111,114,109, 97,108, 41, 41, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, 32,103, 32, 61, 32,101,116, 97, 32, 42, 32,101,116,
+ 97, 32, 45, 32, 49, 46, 48, 32, 43, 32, 99, 32, 42, 32, 99, 59, 10, 32, 32, 32, 32,102,108,111, 97,116, 32,114,101,115,117,108,
+116, 59, 10, 10, 32, 32, 32, 32,105,102, 40,103, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103, 32,
+ 61, 32,115,113,114,116, 40,103, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, 32, 65, 32, 61, 40,103, 32, 45,
+ 32, 99, 41, 47, 40,103, 32, 43, 32, 99, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,108,111, 97,116, 32, 66, 32, 61, 40, 99,
+ 32, 42, 40,103, 32, 43, 32, 99, 41, 45, 32, 49, 46, 48, 41, 47, 40, 99, 32, 42, 40,103, 32, 45, 32, 99, 41, 43, 32, 49, 46, 48,
+ 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 48, 46, 53, 32, 42, 32, 65, 32, 42, 32, 65, 32,
+ 42, 40, 49, 46, 48, 32, 43, 32, 66, 32, 42, 32, 66, 41, 59, 10, 32, 32, 32, 32,125, 10, 32, 32, 32, 32,101,108,115,101, 10, 32,
+ 32, 32, 32, 32, 32, 32, 32,114,101,115,117,108,116, 32, 61, 32, 49, 46, 48, 59, 32, 32, 47, 42, 32, 84, 73, 82, 32, 40,110,111,
+ 32,114,101,102,114, 97, 99,116,101,100, 32, 99,111,109,112,111,110,101,110,116, 41, 32, 42, 47, 10, 10, 32, 32, 32, 32,114,101,
+116,117,114,110, 32,114,101,115,117,108,116, 59, 10,125, 10, 10,102,108,111, 97,116, 32,104,121,112,111,116, 40,102,108,111, 97,
+116, 32,120, 44, 32,102,108,111, 97,116, 32,121, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,115,113,114,116, 40,120, 42,120,
+ 32, 43, 32,121, 42,121, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 78, 69, 87, 32, 83, 72, 65,
+ 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10, 35,100,101,102,
+105,110,101, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 32, 51, 10, 10, 47, 42, 32, 98,115,100,102,115, 32, 42, 47, 10, 10,118,
+111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40,118,101, 99, 52, 32, 99,111,108,111,114,
+ 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,
+101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, 98,105,101,110,116, 32,108,105,103,104,116, 32,
+ 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9, 47, 42, 32,100,105,114,
+101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9,102,111,114, 40,105,110,116, 32,105, 32, 61, 32,
+ 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10, 9, 9,118,101, 99, 51,
+ 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101,
+ 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,100,
+105,102,102,117,115,101, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,100,105,102,102,117,
+115,101, 46,114,103, 98, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 98,115,100,102, 32, 61, 32,109, 97,120, 40,100,111,116, 40,
+ 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 76, 32, 43, 61,
+ 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 42, 98,115,100,102, 59, 10, 9,125, 10, 10, 9,114,101,115,117,108,116,
+ 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108,111,115,115,121, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,
+102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44,
+ 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32, 97,109, 98,105,101,110,116, 32,
+108,105,103,104,116, 32, 42, 47, 10, 9,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 50, 41, 59, 10, 10, 9,
+ 47, 42, 32,100,105,114,101, 99,116,105,111,110, 97,108, 32,108,105,103,104,116,115, 32, 42, 47, 10, 9,102,111,114, 40,105,110,
+116, 32,105, 32, 61, 32, 48, 59, 32,105, 32, 60, 32, 78, 85, 77, 95, 76, 73, 71, 72, 84, 83, 59, 32,105, 43, 43, 41, 32,123, 10,
+ 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 32, 61, 32,103,108, 95, 76,105,103,104,116,
+ 83,111,117,114, 99,101, 91,105, 93, 46,112,111,115,105,116,105,111,110, 46,120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32, 72,
+ 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,104, 97,108,102, 86,101, 99,116,111,114, 46,
+120,121,122, 59, 10, 9, 9,118,101, 99, 51, 32,108,105,103,104,116, 95,100,105,102,102,117,115,101, 32, 61, 32,103,108, 95, 76,
+105,103,104,116, 83,111,117,114, 99,101, 91,105, 93, 46,100,105,102,102,117,115,101, 46,114,103, 98, 59, 10, 9, 9,118,101, 99,
+ 51, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 32, 61, 32,103,108, 95, 76,105,103,104,116, 83,111,117,114, 99,
+101, 91,105, 93, 46,115,112,101, 99,117,108, 97,114, 46,114,103, 98, 59, 10, 10, 9, 9, 47, 42, 32,119,101, 32,109,105,120, 32,
+105,110, 32,115,111,109,101, 32,100,105,102,102,117,115,101, 32,115,111, 32,108,111,119, 32,114,111,117,103,104,110,101,115,115,
+ 32,115,116,105,108,108, 32,115,104,111,119,115, 32,117,112, 32, 42, 47, 10, 9, 9,102,108,111, 97,116, 32, 98,115,100,102, 32,
+ 61, 32, 48, 46, 53, 42,112,111,119, 40,109, 97,120, 40,100,111,116, 40, 78, 44, 32, 72, 41, 44, 32, 48, 46, 48, 41, 44, 32, 49,
+ 46, 48, 47,114,111,117,103,104,110,101,115,115, 41, 59, 10, 9, 9, 98,115,100,102, 32, 43, 61, 32, 48, 46, 53, 42,109, 97,120,
+ 40,100,111,116, 40, 78, 44, 32,108,105,103,104,116, 95,112,111,115,105,116,105,111,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,
+ 9, 76, 32, 43, 61, 32,108,105,103,104,116, 95,115,112,101, 99,117,108, 97,114, 42, 98,115,100,102, 59, 10, 9,125, 10, 10, 9,
+114,101,115,117,108,116, 32, 61, 32,118,101, 99, 52, 40, 76, 42, 99,111,108,111,114, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95, 97,110,105,115,111,116,114,111,112,105, 99, 40,118,
+101, 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 85, 44, 32,102,108,111,
+ 97,116, 32,114,111,117,103,104,110,101,115,115, 86, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,
+102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,103,108, 97,115,115, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44,
+ 32,102,108,111, 97,116, 32,114,111,117,103,104,110,101,115,115, 44, 32,102,108,111, 97,116, 32,105,111,114, 44, 32,118,101, 99,
+ 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10,
+ 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78,
+ 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,116,114, 97,
+110,115,108,117, 99,101,110,116, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,
+115,101, 40, 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,116,114, 97,110,115,112, 97,114,101,110,116, 40,118,101, 99, 52, 32, 99,111,
+108,111,114, 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9, 47, 42, 32,116,104,105,115,
+ 32,105,115,110, 39,116, 32,114,105,103,104,116, 32, 42, 47, 10, 9,114,101,115,117,108,116, 46,114, 32, 61, 32, 99,111,108,111,
+114, 46,114, 59, 10, 9,114,101,115,117,108,116, 46,103, 32, 61, 32, 99,111,108,111,114, 46,103, 59, 10, 9,114,101,115,117,108,
+116, 46, 98, 32, 61, 32, 99,111,108,111,114, 46, 98, 59, 10, 9,114,101,115,117,108,116, 46, 97, 32, 61, 32, 48, 46, 48, 59, 10,
+125, 10, 10,118,111,105,100, 32,110,111,100,101, 95, 98,115,100,102, 95,118,101,108,118,101,116, 40,118,101, 99, 52, 32, 99,111,
+108,111,114, 44, 32,102,108,111, 97,116, 32,115,105,103,109, 97, 44, 32,118,101, 99, 51, 32, 78, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,110,111,100,101, 95, 98,115,100,102, 95,100,105,102,102,117,115,101, 40,
+ 99,111,108,111,114, 44, 32, 48, 46, 48, 44, 32, 78, 44, 32,114,101,115,117,108,116, 41, 59, 10,125, 10, 10, 47, 42, 32,101,109,
+105,115,115,105,111,110, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,101,109,105,115,115,105,111,110, 40,118,101,
+ 99, 52, 32, 99,111,108,111,114, 44, 32,102,108,111, 97,116, 32,115,116,114,101,110,103,116,104, 44, 32,118,101, 99, 51, 32, 78,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,114,101,115,117,108,116, 32, 61, 32, 99,
+111,108,111,114, 42,115,116,114,101,110,103,116,104, 59, 10,125, 10, 10, 47, 42, 32, 99,108,111,115,117,114,101,115, 32, 42, 47,
+ 10, 10,118,111,105,100, 32,110,111,100,101, 95,109,105,120, 95,115,104, 97,100,101,114, 40,102,108,111, 97,116, 32,102, 97, 99,
+ 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 49, 44, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,117,
+116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 41, 10,123, 10, 9,115,104, 97,100,101,114, 32, 61, 32,109,105,120, 40,115,
+104, 97,100,101,114, 49, 44, 32,115,104, 97,100,101,114, 50, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,
+111,100,101, 95, 97,100,100, 95,115,104, 97,100,101,114, 40,118,101, 99, 52, 32,115,104, 97,100,101,114, 49, 44, 32,118,101, 99,
+ 52, 32,115,104, 97,100,101,114, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,115,104, 97,100,101,114, 41, 10,123, 10, 9,115,
+104, 97,100,101,114, 32, 61, 32,115,104, 97,100,101,114, 49, 32, 43, 32,115,104, 97,100,101,114, 50, 59, 10,125, 10, 10, 47, 42,
+ 32,102,114,101,115,110,101,108, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,102,114,101,115,110,101,108, 40,102,
+108,111, 97,116, 32,105,111,114, 44, 32,118,101, 99, 51, 32, 78, 44, 32,118,101, 99, 51, 32, 73, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,114,101,115,117,108,116, 41, 10,123, 10, 9,102,108,111, 97,116, 32,101,116, 97, 32, 61, 32,109, 97,120, 40,105,
+111,114, 44, 32, 48, 46, 48, 48, 48, 48, 49, 41, 59, 10, 9,114,101,115,117,108,116, 32, 61, 32,102,114,101,115,110,101,108, 95,
+100,105,101,108,101, 99,116,114,105, 99, 40, 73, 44, 32, 78, 44, 32,101,116, 97, 41, 59, 32, 47, 47, 98, 97, 99,107,102, 97, 99,
+105,110,103, 40, 41, 63, 32, 49, 46, 48, 47,101,116, 97, 58, 32,101,116, 97, 41, 59, 10,125, 10, 10, 47, 42, 32,103,101,111,109,
+101,116,114,121, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,103,101,111,109,101,116,114,121, 40,118,101, 99, 51,
+ 32, 73, 44, 32,118,101, 99, 51, 32, 78, 44, 32,109, 97,116, 52, 32,116,111,119,111,114,108,100, 44, 10, 9,111,117,116, 32,118,
+101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,116, 97,110,103,101,110,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,116,114,117,101, 95,
+110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,109,105,110,103, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,112, 97,114, 97,109,101,116,114,105, 99, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32, 98, 97, 99,107,102,
+ 97, 99,105,110,103, 41, 10,123, 10, 9,112,111,115,105,116,105,111,110, 32, 61, 32, 40,116,111,119,111,114,108,100, 42,118,101,
+ 99, 52, 40, 73, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 78, 59, 10, 9,116,
+ 97,110,103,101,110,116, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9,116,114,117,101, 95,110,111,114,109, 97,108,
+ 32, 61, 32, 78, 59, 10, 9,105,110, 99,111,109,105,110,103, 32, 61, 32, 73, 59, 10, 9,112, 97,114, 97,109,101,116,114,105, 99,
+ 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, 9, 98, 97, 99,107,102, 97, 99,105,110,103, 32, 61, 32, 48, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,111,111,114,100, 40,118,101, 99, 51, 32, 73, 44, 32,
+118,101, 99, 51, 32, 78, 44, 32,109, 97,116, 52, 32,116,111,119,111,114,108,100, 44, 10, 9,118,101, 99, 51, 32, 97,116,116,114,
+ 95,111,114, 99,111, 44, 32,118,101, 99, 51, 32, 97,116,116,114, 95,117,118, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32,103,
+101,110,101,114, 97,116,101,100, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111, 98,106,101, 99,116, 44, 10, 9,111,117,116, 32,118,101, 99, 51, 32, 99, 97,109,101,114, 97, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,119,105,110,100,111,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102,108,101, 99,116,105,111,110, 41, 10,
+123, 10, 9,103,101,110,101,114, 97,116,101,100, 32, 61, 32, 97,116,116,114, 95,111,114, 99,111, 59, 10, 9,117,118, 32, 61, 32,
+ 97,116,116,114, 95,117,118, 59, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 73, 59, 10, 9, 99, 97,109,101,114, 97, 32, 61, 32,
+ 73, 59, 10, 9,119,105,110,100,111,119, 32, 61, 32,103,108, 95, 70,114, 97,103, 67,111,111,114,100, 46,120,121,122, 59, 10, 9,
+114,101,102,108,101, 99,116,105,111,110, 32, 61, 32,114,101,102,108,101, 99,116, 40, 78, 44, 32, 73, 41, 59, 10, 10,125, 10, 10,
+ 47, 42, 32,116,101,120,116,117,114,101,115, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 98,108,
+101,110,100, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,
+ 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95, 99,108,111,117,100,
+115, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+ 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61,
+ 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
+110,111,100,101, 95,116,101,120, 95,100,105,115,116,110,111,105,115,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,
+116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,
+111,100,101, 95,116,101,120, 95,101,110,118,105,114,111,110,109,101,110,116, 40,118,101, 99, 51, 32, 99,111, 44, 32,115, 97,109,
+112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,
+108,111, 97,116, 32,117, 32, 61, 32, 40, 97,116, 97,110, 40, 99,111, 46,121, 44, 32, 99,111, 46,120, 41, 32, 43, 32, 77, 95, 80,
+ 73, 41, 47, 40, 50, 46, 48, 42, 77, 95, 80, 73, 41, 59, 10, 9,102,108,111, 97,116, 32,118, 32, 61, 32, 97,116, 97,110, 40, 99,
+111, 46,122, 44, 32,104,121,112,111,116, 40, 99,111, 46,120, 44, 32, 99,111, 46,121, 41, 41, 47, 77, 95, 80, 73, 32, 43, 32, 48,
+ 46, 53, 59, 10, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,118,101, 99,
+ 50, 40,117, 44, 32,118, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101,
+ 40,118,101, 99, 51, 32, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99,
+ 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 99,111, 46,120,121, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109, 97,103,105,
+ 99, 40,118,101, 99, 51, 32,112, 44, 32,102,108,111, 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,102,108,111, 97,
+116, 32,110, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116,117,
+114, 98, 32, 61, 32,116,117,114, 98,117,108,101,110, 99,101, 47, 53, 46, 48, 59, 10, 10, 9,102,108,111, 97,116, 32,120, 32, 61,
+ 32,115,105,110, 40, 40,112, 46,120, 32, 43, 32,112, 46,121, 32, 43, 32,112, 46,122, 41, 42, 53, 46, 48, 41, 59, 10, 9,102,108,
+111, 97,116, 32,121, 32, 61, 32, 99,111,115, 40, 40, 45,112, 46,120, 32, 43, 32,112, 46,121, 32, 45, 32,112, 46,122, 41, 42, 53,
+ 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,122, 32, 61, 32, 45, 99,111,115, 40, 40, 45,112, 46,120, 32, 45, 32,112, 46,121,
+ 32, 43, 32,112, 46,122, 41, 42, 53, 46, 48, 41, 59, 10, 10, 9,105,102, 40,110, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
+120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9, 9,122, 32, 42, 61, 32,116,
+117,114, 98, 59, 10, 9, 9,121, 32, 61, 32, 45, 99,111,115, 40,120, 45,121, 43,122, 41, 59, 10, 9, 9,121, 32, 42, 61, 32,116,
+117,114, 98, 59, 10, 10, 9, 9,105,102, 40,110, 32, 62, 32, 49, 46, 48, 41, 32,123, 10, 9, 9, 9,120, 61, 32, 99,111,115, 40,
+120, 45,121, 45,122, 41, 59, 10, 9, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9,105,102, 40,110, 32, 62,
+ 32, 50, 46, 48, 41, 32,123, 10, 9, 9, 9, 9,122, 61, 32,115,105,110, 40, 45,120, 45,121, 45,122, 41, 59, 10, 9, 9, 9, 9,
+122, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 51, 46, 48, 41, 32,123, 10, 9, 9,
+ 9, 9, 9,120, 61, 32, 45, 99,111,115, 40, 45,120, 43,121, 45,122, 41, 59, 10, 9, 9, 9, 9, 9,120, 32, 42, 61, 32,116,117,
+114, 98, 59, 10, 10, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 52, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9,121, 61,
+ 32, 45,115,105,110, 40, 45,120, 43,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10,
+ 10, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 53, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9,121, 61, 32, 45,
+ 99,111,115, 40, 45,120, 43,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10,
+ 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 54, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9,120, 61, 32,
+ 99,111,115, 40,120, 43,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10,
+ 9, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 55, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,122,
+ 61, 32,115,105,110, 40,120, 43,121, 45,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,122, 32, 42, 61, 32,116,117,114, 98,
+ 59, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 56, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9,120, 61, 32, 45, 99,111,115, 40, 45,120, 45,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,120,
+ 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 57, 46, 48, 41,
+ 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,121, 61, 32, 45,115,105,110, 40,120, 45,121, 43,122, 41, 59, 10, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,125, 10,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9,
+ 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9,125, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10, 10,
+ 9,105,102, 40,116,117,114, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,116,117,114, 98, 32, 42, 61, 32, 50, 46, 48,
+ 59, 10, 9, 9,120, 32, 47, 61, 32,116,117,114, 98, 59, 10, 9, 9,121, 32, 47, 61, 32,116,117,114, 98, 59, 10, 9, 9,122, 32,
+ 47, 61, 32,116,117,114, 98, 59, 10, 9,125, 10, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 53, 32, 45,
+ 32,120, 44, 32, 48, 46, 53, 32, 45, 32,121, 44, 32, 48, 46, 53, 32, 45, 32,122, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109, 97,114, 98,108,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111,
+ 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
+110,111,100,101, 95,116,101,120, 95,109,117,115,103,114, 97,118,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116,
+ 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,100,105,109,101,110,115,105,111,110, 44, 32,102,108,111, 97,116, 32,108, 97,
+ 99,117,110, 97,114,105,116,121, 44, 32,102,108,111, 97,116, 32,111, 99,116, 97,118,101,115, 44, 32,102,108,111, 97,116, 32,111,
+102,102,115,101,116, 44, 32,102,108,111, 97,116, 32,103, 97,105,110, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,
+ 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120,
+ 95,110,111,105,115,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49,
+ 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,
+120, 95,115,107,121, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123,
+ 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,
+101, 95,116,101,120, 95,115,116,117, 99, 99,105, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101,
+ 44, 32,102,108,111, 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97,
+ 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,
+120, 95,118,111,114,111,110,111,105, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,
+108,111, 97,116, 32,119,101,105,103,104,116, 49, 44, 32,102,108,111, 97,116, 32,119,101,105,103,104,116, 50, 44, 32,102,108,111,
+ 97,116, 32,119,101,105,103,104,116, 51, 44, 32,102,108,111, 97,116, 32,119,101,105,103,104,116, 52, 44, 32,102,108,111, 97,116,
+ 32,101,120,112,111,110,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,
108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,
- 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,100,105,115,
-116,110,111,105,115,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,
-116, 32,100,105,115,116,111,114,116,105,111,110, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,
-102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,101,110,118,105,
-114,111,110,109,101,110,116, 40,118,101, 99, 51, 32, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,108,111, 97,116, 32,117, 32, 61, 32, 40, 97,116,
- 97,110, 40, 99,111, 46,121, 44, 32, 99,111, 46,120, 41, 32, 43, 32, 77, 95, 80, 73, 41, 47, 40, 50, 46, 48, 42, 77, 95, 80, 73,
- 41, 59, 10, 9,102,108,111, 97,116, 32,118, 32, 61, 32, 97,116, 97,110, 40, 99,111, 46,122, 44, 32,104,121,112,111,116, 40, 99,
-111, 46,120, 44, 32, 99,111, 46,121, 41, 41, 47, 77, 95, 80, 73, 32, 43, 32, 48, 46, 53, 59, 10, 10, 9, 99,111,108,111,114, 32,
- 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,118,101, 99, 50, 40,117, 44, 32,118, 41, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,115, 97,
-109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,
- 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 99,111, 46,120,121, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109, 97,103,105, 99, 40,118,101, 99, 51, 32,112, 44, 32,102,108,
-111, 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,102,108,111, 97,116, 32,110, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116,117,114, 98, 32, 61, 32,116,117,114, 98,117,108,101,
-110, 99,101, 47, 53, 46, 48, 59, 10, 10, 9,102,108,111, 97,116, 32,120, 32, 61, 32,115,105,110, 40, 40,112, 46,120, 32, 43, 32,
-112, 46,121, 32, 43, 32,112, 46,122, 41, 42, 53, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,121, 32, 61, 32, 99,111,115, 40,
- 40, 45,112, 46,120, 32, 43, 32,112, 46,121, 32, 45, 32,112, 46,122, 41, 42, 53, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,
-122, 32, 61, 32, 45, 99,111,115, 40, 40, 45,112, 46,120, 32, 45, 32,112, 46,121, 32, 43, 32,112, 46,122, 41, 42, 53, 46, 48, 41,
- 59, 10, 10, 9,105,102, 40,110, 32, 62, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9,
- 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9, 9,122, 32, 42, 61, 32,116,117,114, 98, 59, 10, 9, 9,121, 32, 61, 32, 45,
- 99,111,115, 40,120, 45,121, 43,122, 41, 59, 10, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9,105,102, 40,110,
- 32, 62, 32, 49, 46, 48, 41, 32,123, 10, 9, 9, 9,120, 61, 32, 99,111,115, 40,120, 45,121, 45,122, 41, 59, 10, 9, 9, 9,120,
- 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9,105,102, 40,110, 32, 62, 32, 50, 46, 48, 41, 32,123, 10, 9, 9, 9, 9,
-122, 61, 32,115,105,110, 40, 45,120, 45,121, 45,122, 41, 59, 10, 9, 9, 9, 9,122, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10,
- 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 51, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9,120, 61, 32, 45, 99,111,115, 40, 45,
-120, 43,121, 45,122, 41, 59, 10, 9, 9, 9, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9,105,102,
- 40,110, 32, 62, 32, 52, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9,121, 61, 32, 45,115,105,110, 40, 45,120, 43,121, 43,122,
- 41, 59, 10, 9, 9, 9, 9, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32,
- 62, 32, 53, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9,121, 61, 32, 45, 99,111,115, 40, 45,120, 43,121, 43,122, 41, 59,
- 10, 9, 9, 9, 9, 9, 9, 9,121, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32,
- 62, 32, 54, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9,120, 61, 32, 99,111,115, 40,120, 43,121, 43,122, 41, 59, 10,
- 9, 9, 9, 9, 9, 9, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110,
- 32, 62, 32, 55, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,122, 61, 32,115,105,110, 40,120, 43,121, 45,122, 41,
- 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,122, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,
-105,102, 40,110, 32, 62, 32, 56, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,120, 61, 32, 45, 99,111,115, 40,
- 45,120, 45,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,120, 32, 42, 61, 32,116,117,114, 98, 59, 10, 10, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,105,102, 40,110, 32, 62, 32, 57, 46, 48, 41, 32,123, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9,121, 61, 32, 45,115,105,110, 40,120, 45,121, 43,122, 41, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,121, 32, 42,
- 61, 32,116,117,114, 98, 59, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,125, 10, 9,
- 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9, 9,125, 10, 9, 9, 9, 9, 9,125,
- 10, 9, 9, 9, 9,125, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10, 10, 9,105,102, 40,116,117,114, 98, 32, 33, 61, 32,
- 48, 46, 48, 41, 32,123, 10, 9, 9,116,117,114, 98, 32, 42, 61, 32, 50, 46, 48, 59, 10, 9, 9,120, 32, 47, 61, 32,116,117,114,
- 98, 59, 10, 9, 9,121, 32, 47, 61, 32,116,117,114, 98, 59, 10, 9, 9,122, 32, 47, 61, 32,116,117,114, 98, 59, 10, 9,125, 10,
- 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 53, 32, 45, 32,120, 44, 32, 48, 46, 53, 32, 45, 32,121, 44,
- 32, 48, 46, 53, 32, 45, 32,122, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120,
- 95,109, 97,114, 98,108,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111,
- 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10,
- 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,109,117,115,
-103,114, 97,118,101, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116,
- 32,100,105,109,101,110,115,105,111,110, 44, 32,102,108,111, 97,116, 32,108, 97, 99,117,110, 97,114,105,116,121, 44, 32,102,108,
-111, 97,116, 32,111, 99,116, 97,118,101,115, 44, 32,102,108,111, 97,116, 32,111,102,102,115,101,116, 44, 32,102,108,111, 97,116,
- 32,103, 97,105,110, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49,
- 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,110,111,105,115,101, 40,118,101, 99, 51, 32,
- 99,111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97,
- 99, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32,
- 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,115,107,121, 40,118,101, 99, 51, 32, 99,
-111, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101,
- 99, 52, 40, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,115,116,117, 99, 99,105,
- 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,117,114, 98,
-117,108,101,110, 99,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32,
- 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,118,111,114,111,110,111,105, 40,118,101,
- 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,119,101,105,103,104,116, 49,
- 44, 32,102,108,111, 97,116, 32,119,101,105,103,104,116, 50, 44, 32,102,108,111, 97,116, 32,119,101,105,103,104,116, 51, 44, 32,
-102,108,111, 97,116, 32,119,101,105,103,104,116, 52, 44, 32,102,108,111, 97,116, 32,101,120,112,111,110,101,110,116, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10,
- 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,
-125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,119,111,111,100, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,
-108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,117,114, 98,117,108,101,110, 99,101, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 32,
-108,105,103,104,116, 32,112, 97,116,104, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,108,105,103,104,116, 95,112,
- 97,116,104, 40, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95, 99, 97,109,101,114, 97, 95,114, 97,121, 44, 10, 9,
-111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,115,104, 97,100,111,119, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,
-111, 97,116, 32,105,115, 95,100,105,102,102,117,115,101, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,
-115, 95,103,108,111,115,115,121, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,114,101,102,108,
-101, 99,116,105,111,110, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,116,114, 97,110,115,109,
-105,115,115,105,111,110, 95,114, 97,121, 41, 10,123, 10, 9,105,115, 95, 99, 97,109,101,114, 97, 95,114, 97,121, 32, 61, 32, 49,
- 46, 48, 59, 10, 9,105,115, 95,115,104, 97,100,111,119, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,100,105,
-102,102,117,115,101, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,103,108,111,115,115,121, 95,114, 97,121, 32,
+ 9,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,100,101, 95,116,101,120, 95,119,111,111,
+100, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,117,114,
+ 98,117,108,101,110, 99,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
+ 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 32,108,105,103,104,116, 32,112, 97,116,104, 32, 42, 47, 10, 10,118,111,105,100, 32,
+110,111,100,101, 95,108,105,103,104,116, 95,112, 97,116,104, 40, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95, 99,
+ 97,109,101,114, 97, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,115,104, 97,100,111,119, 95,
+114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,100,105,102,102,117,115,101, 95,114, 97,121, 44, 10,
+ 9,111,117,116, 32,102,108,111, 97,116, 32,105,115, 95,103,108,111,115,115,121, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,
+108,111, 97,116, 32,105,115, 95,115,105,110,103,117,108, 97,114, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116,
+ 32,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97,121, 44, 10, 9,111,117,116, 32,102,108,111, 97,116, 32,105,
+115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 41, 10,123, 10, 9,105,115, 95, 99, 97,109,101,114, 97,
+ 95,114, 97,121, 32, 61, 32, 49, 46, 48, 59, 10, 9,105,115, 95,115,104, 97,100,111,119, 95,114, 97,121, 32, 61, 32, 48, 46, 48,
+ 59, 10, 9,105,115, 95,100,105,102,102,117,115,101, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,103,108,111,
+115,115,121, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,115,105,110,103,117,108, 97,114, 95,114, 97,121, 32,
61, 32, 48, 46, 48, 59, 10, 9,105,115, 95,114,101,102,108,101, 99,116,105,111,110, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59,
10, 9,105,115, 95,116,114, 97,110,115,109,105,115,115,105,111,110, 95,114, 97,121, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,
47, 42, 32,111,117,116,112,117,116, 32, 42, 47, 10, 10,118,111,105,100, 32,110,111,100,101, 95,111,117,116,112,117,116, 95,109,
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index eb3695ea217..34656daaa19 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -199,7 +199,7 @@ static void make_dmats(bPoseChannel *pchan)
if (pchan->parent) {
float iR_parmat[4][4];
invert_m4_m4(iR_parmat, pchan->parent->pose_mat);
- mul_m4_m4m4(pchan->chan_mat, pchan->pose_mat, iR_parmat); // delta mat
+ mult_m4_m4m4(pchan->chan_mat, iR_parmat, pchan->pose_mat); // delta mat
}
else copy_m4_m4(pchan->chan_mat, pchan->pose_mat);
}
@@ -216,7 +216,7 @@ static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[][3]) // nr = t
if (pchan->parent)
mul_serie_m4(pchan->pose_mat, pchan->parent->pose_mat, pchan->chan_mat, ikmat, NULL, NULL, NULL, NULL, NULL);
else
- mul_m4_m4m4(pchan->pose_mat, ikmat, pchan->chan_mat);
+ mult_m4_m4m4(pchan->pose_mat, pchan->chan_mat, ikmat);
/* calculate head */
copy_v3_v3(pchan->pose_head, pchan->pose_mat[3]);
@@ -356,7 +356,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
unit_m4(rootmat);
copy_v3_v3(rootmat[3], pchan->pose_head);
- mul_m4_m4m4(imat, rootmat, ob->obmat);
+ mult_m4_m4m4(imat, ob->obmat, rootmat);
invert_m4_m4(goalinv, imat);
for (target=tree->targets.first; target; target=target->next) {
@@ -371,7 +371,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
get_constraint_target_matrix(scene, target->con, 0, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
/* and set and transform goal */
- mul_m4_m4m4(goal, rootmat, goalinv);
+ mult_m4_m4m4(goal, goalinv, rootmat);
copy_v3_v3(goalpos, goal[3]);
copy_m3_m4(goalrot, goal);
@@ -385,7 +385,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
break;
}
else {
- mul_m4_m4m4(goal, rootmat, goalinv);
+ mult_m4_m4m4(goal, goalinv, rootmat);
copy_v3_v3(polepos, goal[3]);
poleconstrain= 1;
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
index f4720b7fc41..f605441282b 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.cpp
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -570,7 +570,7 @@ static bool target_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Fram
mul_serie_m4(restmat, target->owner->obmat, chanmat, target->eeRest, NULL, NULL, NULL, NULL, NULL);
}
else {
- mul_m4_m4m4(restmat, target->eeRest, target->owner->obmat);
+ mult_m4_m4m4(restmat, target->owner->obmat, target->eeRest);
}
// blend the target
blend_m4_m4m4(tarmat, restmat, tarmat, constraint->enforce);
@@ -597,7 +597,7 @@ static bool base_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Frame&
// save the base as a frame too so that we can compute deformation
// after simulation
ikscene->baseFrame.setValue(&chanmat[0][0]);
- mul_m4_m4m4(rootmat, chanmat, ikscene->blArmature->obmat);
+ mult_m4_m4m4(rootmat, ikscene->blArmature->obmat, chanmat);
}
else {
copy_m4_m4(rootmat, ikscene->blArmature->obmat);
@@ -622,11 +622,11 @@ static bool base_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Frame&
// get polar target matrix in world space
get_constraint_target_matrix(ikscene->blscene, ikscene->polarConstraint, 1, CONSTRAINT_OBTYPE_OBJECT, ikscene->blArmature, mat, 1.0);
// convert to armature space
- mul_m4_m4m4(polemat, mat, imat);
+ mult_m4_m4m4(polemat, imat, mat);
// get the target in world space (was computed before as target object are defined before base object)
iktarget->target->getPose().getValue(mat[0]);
// convert to armature space
- mul_m4_m4m4(goalmat, mat, imat);
+ mult_m4_m4m4(goalmat, imat, mat);
// take position of target, polar target, end effector, in armature space
KDL::Vector goalpos(goalmat[3]);
KDL::Vector polepos(polemat[3]);
@@ -1003,7 +1003,7 @@ static void convert_pose(IK_Scene *ikscene)
copy_m4_m4(bmat, bone->arm_mat);
}
invert_m4_m4(rmat, bmat);
- mul_m4_m4m4(bmat, pchan->pose_mat, rmat);
+ mult_m4_m4m4(bmat, rmat, pchan->pose_mat);
normalize_m4(bmat);
boneRot.setValue(bmat[0]);
GetJointRotation(boneRot, ikchan->jointType, rot);
@@ -1419,7 +1419,7 @@ static IK_Scene* convert_tree(Scene *blscene, Object *ob, bPoseChannel *pchan)
copy_m4_m4(mat, pchan->bone->arm_mat);
copy_v3_v3(mat[3], pchan->bone->arm_tail);
// get the rest pose relative to the armature base
- mul_m4_m4m4(iktarget->eeRest, mat, invBaseFrame);
+ mult_m4_m4m4(iktarget->eeRest, invBaseFrame, mat);
iktarget->eeBlend = (!ikscene->polarConstraint && condata->type==CONSTRAINT_IK_COPYPOSE) ? true : false;
// use target_callback to make sure the initPose includes enforce coefficient
target_callback(iTaSC::Timestamp(), iTaSC::F_identity, initPose, iktarget);
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index a03d6ce280d..4c8a79e6372 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -53,7 +53,6 @@ set(SRC
intern/indexer_dv.c
intern/iris.c
intern/jpeg.c
- intern/md5.c
intern/metadata.c
intern/module.c
intern/moviecache.c
@@ -96,7 +95,6 @@ set(SRC
intern/dds/Stream.h
intern/dds/dds_api.h
intern/imbuf.h
- intern/md5.h
intern/openexr/openexr_api.h
intern/openexr/openexr_multi.h
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 3586e8f1b5e..7f99fc3ffc7 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -198,7 +198,8 @@ typedef enum IMB_Timecode_Type {
record date and time written by recording
device (*every* consumer camcorder can do
that :) )*/
- IMB_TC_MAX_SLOT = 3
+ IMB_TC_RECORD_RUN_NO_GAPS = 8,
+ IMB_TC_MAX_SLOT = 8
} IMB_Timecode_Type;
typedef enum IMB_Proxy_Size {
@@ -377,6 +378,20 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile);
float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc);
void IMB_color_to_bw(struct ImBuf *ibuf);
+/* converting pixel buffers */
+void IMB_buffer_byte_from_float(unsigned char *rect_to, const float *rect_from,
+ int channels_from, int dither, int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from);
+void IMB_buffer_float_from_byte(float *rect_to, const unsigned char *rect_from,
+ int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from);
+void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
+ int channels_from, int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from);
+void IMB_buffer_byte_from_byte(unsigned char *rect_to, const unsigned char *rect_from,
+ int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from);
+
/**
* Change the ordering of the color bytes pointed to by rect from
* rgba to abgr. size * 4 color bytes are reordered.
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 5ce3d63fe86..adf6f4a143b 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -158,6 +158,7 @@ typedef struct ImBuf {
#define IB_tiles (1 << 10)
#define IB_tilecache (1 << 11)
#define IB_premul (1 << 12)
+#define IB_cm_predivide (1 << 13)
/*
* The bit flag is stored in the ImBuf.ftype variable.
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index d08c86aacbc..d85251a8ccb 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -1,7 +1,4 @@
/*
- * allocimbuf.c
- *
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -47,8 +44,8 @@
#include "imbuf.h"
-#include "MEM_CacheLimiterC-Api.h"
#include "MEM_guardedalloc.h"
+#include "MEM_CacheLimiterC-Api.h"
void imb_freemipmapImBuf(ImBuf *ibuf)
{
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index 8928774dcb4..45264fa862b 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -110,7 +110,8 @@
#endif
#endif
-int ismovie(const char *UNUSED(filepath)) {
+int ismovie(const char *UNUSED(filepath))
+{
return 0;
}
@@ -126,7 +127,8 @@ static void free_anim_movie(struct anim *UNUSED(anim)) { ; }
# define PATHSEPERATOR '/'
#endif
-static int an_stringdec(const char *string, char* head, char *tail, unsigned short *numlen) {
+static int an_stringdec(const char *string, char* head, char *tail, unsigned short *numlen)
+{
unsigned short len,nume,nums=0;
short i,found=FALSE;
@@ -161,11 +163,13 @@ static int an_stringdec(const char *string, char* head, char *tail, unsigned sho
}
-static void an_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic) {
+static void an_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic)
+{
BLI_stringenc(string, head, tail, numlen, pic);
}
-static void free_anim_avi (struct anim *anim) {
+static void free_anim_avi (struct anim *anim)
+{
#if defined(_WIN32) && !defined(FREE_WINDOWS)
int i;
#endif
@@ -206,7 +210,8 @@ static void free_anim_ffmpeg(struct anim * anim);
static void free_anim_redcode(struct anim * anim);
#endif
-void IMB_free_anim(struct anim * anim) {
+void IMB_free_anim(struct anim * anim)
+{
if (anim == NULL) {
printf("free anim, anim == NULL\n");
return;
@@ -229,14 +234,16 @@ void IMB_free_anim(struct anim * anim) {
MEM_freeN(anim);
}
-void IMB_close_anim(struct anim * anim) {
+void IMB_close_anim(struct anim * anim)
+{
if (anim == NULL) return;
IMB_free_anim(anim);
}
-struct anim * IMB_open_anim( const char * name, int ib_flags, int streamindex) {
+struct anim * IMB_open_anim( const char * name, int ib_flags, int streamindex)
+{
struct anim * anim;
anim = (struct anim*)MEM_callocN(sizeof(struct anim), "anim struct");
@@ -249,7 +256,8 @@ struct anim * IMB_open_anim( const char * name, int ib_flags, int streamindex) {
}
-static int startavi (struct anim *anim) {
+static int startavi (struct anim *anim)
+{
AviError avierror;
#if defined(_WIN32) && !defined(FREE_WINDOWS)
@@ -355,7 +363,8 @@ static int startavi (struct anim *anim) {
return 0;
}
-static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
+static ImBuf * avi_fetchibuf (struct anim *anim, int position)
+{
ImBuf *ibuf = NULL;
int *tmp;
int y;
@@ -405,7 +414,8 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
extern void do_init_ffmpeg(void);
-static int startffmpeg(struct anim * anim) {
+static int startffmpeg(struct anim * anim)
+{
int i, videoStream;
AVCodec *pCodec;
@@ -693,7 +703,6 @@ static void ffmpeg_postprocess(struct anim * anim)
int dstStride2[4] = { -dstStride[0], 0, 0, 0 };
uint8_t* dst2[4] = { dst[0] + (anim->y - 1)*dstStride[0],
0, 0, 0 };
- int i;
sws_scale(anim->img_convert_ctx,
(const uint8_t * const *)input->data,
@@ -1032,7 +1041,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
return anim->last_frame;
}
-static void free_anim_ffmpeg(struct anim * anim) {
+static void free_anim_ffmpeg(struct anim * anim)
+{
if (anim == NULL) return;
if (anim->pCodecCtx) {
@@ -1058,7 +1068,8 @@ static void free_anim_ffmpeg(struct anim * anim) {
#ifdef WITH_REDCODE
-static int startredcode(struct anim * anim) {
+static int startredcode(struct anim * anim)
+{
anim->redcodeCtx = redcode_open(anim->name);
if (!anim->redcodeCtx) {
return -1;
@@ -1068,7 +1079,8 @@ static int startredcode(struct anim * anim) {
return 0;
}
-static ImBuf * redcode_fetchibuf(struct anim * anim, int position) {
+static ImBuf * redcode_fetchibuf(struct anim * anim, int position)
+{
struct ImBuf * ibuf;
struct redcode_frame * frame;
struct redcode_frame_raw * raw_frame;
@@ -1099,7 +1111,8 @@ static ImBuf * redcode_fetchibuf(struct anim * anim, int position) {
return ibuf;
}
-static void free_anim_redcode(struct anim * anim) {
+static void free_anim_redcode(struct anim * anim)
+{
if (anim->redcodeCtx) {
redcode_close(anim->redcodeCtx);
anim->redcodeCtx = 0;
@@ -1113,7 +1126,8 @@ static void free_anim_redcode(struct anim * anim) {
/* Geen plaatje, probeer dan volgende animatie te openen */
/* gelukt, haal dan eerste plaatje van animatie */
-static struct ImBuf * anim_getnew(struct anim * anim) {
+static struct ImBuf * anim_getnew(struct anim * anim)
+{
struct ImBuf *ibuf = NULL;
if (anim == NULL) return(NULL);
@@ -1175,7 +1189,8 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
return(ibuf);
}
-struct ImBuf * IMB_anim_previewframe(struct anim * anim) {
+struct ImBuf * IMB_anim_previewframe(struct anim * anim)
+{
struct ImBuf * ibuf = NULL;
int position = 0;
@@ -1282,7 +1297,8 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position,
/***/
-int IMB_anim_get_duration(struct anim *anim, IMB_Timecode_Type tc) {
+int IMB_anim_get_duration(struct anim *anim, IMB_Timecode_Type tc)
+{
struct anim_index * idx;
if (tc == IMB_TC_NONE) {
return anim->duration;
diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c
index a9c2d72b188..77fc6bdf856 100644
--- a/source/blender/imbuf/intern/bmp.c
+++ b/source/blender/imbuf/intern/bmp.c
@@ -185,14 +185,16 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
}
/* Couple of helper functions for writing our data */
-static int putIntLSB(unsigned int ui,FILE *ofile) {
+static int putIntLSB(unsigned int ui,FILE *ofile)
+{
putc((ui>>0)&0xFF,ofile);
putc((ui>>8)&0xFF,ofile);
putc((ui>>16)&0xFF,ofile);
return putc((ui>>24)&0xFF,ofile);
}
-static int putShortLSB(unsigned short us,FILE *ofile) {
+static int putShortLSB(unsigned short us,FILE *ofile)
+{
putc((us>>0)&0xFF,ofile);
return putc((us>>8)&0xFF,ofile);
}
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 8c5f2dcafd6..0dfc1852e29 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -42,10 +42,10 @@
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#include "BKE_colortools.h"
-
#include "MEM_guardedalloc.h"
+/**************************** Interlace/Deinterlace **************************/
+
void IMB_de_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
@@ -100,347 +100,502 @@ void IMB_interlace(struct ImBuf *ibuf)
}
}
+/************************* Generic Buffer Conversion *************************/
-/* assume converting from linear float to sRGB byte */
-void IMB_rect_from_float(struct ImBuf *ibuf)
+MINLINE void byte_to_float_v4(float f[4], const uchar b[4])
{
- /* quick method to convert floatbuf to byte */
- float *tof = (float *)ibuf->rect_float;
-// int do_dither = ibuf->dither != 0.f;
- float dither= ibuf->dither / 255.0f;
- float srgb[4];
- int i, channels= ibuf->channels;
- short profile= ibuf->profile;
- unsigned char *to = (unsigned char *) ibuf->rect;
-
- if(tof==NULL) return;
- if(to==NULL) {
- imb_addrectImBuf(ibuf);
- to = (unsigned char *) ibuf->rect;
- }
-
- if(channels==1) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof++)
- to[1]= to[2]= to[3]= to[0] = FTOCHAR(tof[0]);
+ f[0] = b[0] * (1.0f/255.0f);
+ f[1] = b[1] * (1.0f/255.0f);
+ f[2] = b[2] * (1.0f/255.0f);
+ f[3] = b[3] * (1.0f/255.0f);
+}
+
+MINLINE void float_to_byte_v4(uchar b[4], const float f[4])
+{
+ F4TOCHAR4(f, b);
+}
+
+MINLINE void float_to_byte_dither_v4(uchar b[4], const float f[4], float dither)
+{
+ float tmp[4] = {f[0]+dither, f[1]+dither, f[2]+dither, f[3]+dither};
+ float_to_byte_v4(b, tmp);
+}
+
+/* float to byte pixels, output 4-channel RGBA */
+void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
+ int channels_from, int dither, int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from)
+{
+ float tmp[4];
+ float dither_fac = dither/255.0f;
+ int x, y;
+
+ /* we need valid profiles */
+ BLI_assert(profile_to != IB_PROFILE_NONE);
+ BLI_assert(profile_from != IB_PROFILE_NONE);
+
+ if(channels_from==1) {
+ /* single channel input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y;
+ uchar *to = rect_to + stride_to*y*4;
+
+ for(x = 0; x < width; x++, from++, to+=4)
+ to[0] = to[1] = to[2] = to[3] = FTOCHAR(from[0]);
+ }
}
- else if (profile == IB_PROFILE_LINEAR_RGB) {
- if(channels == 3) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=3) {
- srgb[0]= linearrgb_to_srgb(tof[0]);
- srgb[1]= linearrgb_to_srgb(tof[1]);
- srgb[2]= linearrgb_to_srgb(tof[2]);
-
- to[0] = FTOCHAR(srgb[0]);
- to[1] = FTOCHAR(srgb[1]);
- to[2] = FTOCHAR(srgb[2]);
- to[3] = 255;
+ else if(channels_from == 3) {
+ /* RGB input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y*3;
+ uchar *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* no color space conversion */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ F3TOCHAR3(from, to);
+ to[3] = 255;
+ }
+ }
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert from linear to sRGB */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ linearrgb_to_srgb_v3_v3(tmp, from);
+ F3TOCHAR3(tmp, to);
+ to[3] = 255;
+ }
+ }
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert from sRGB to linear */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ srgb_to_linearrgb_v3_v3(tmp, from);
+ F3TOCHAR3(tmp, to);
+ to[3] = 255;
+ }
}
}
- else if (channels == 4) {
- if (dither != 0.f) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
- const float d = (BLI_frand()-0.5f)*dither;
-
- srgb[0]= d + linearrgb_to_srgb(tof[0]);
- srgb[1]= d + linearrgb_to_srgb(tof[1]);
- srgb[2]= d + linearrgb_to_srgb(tof[2]);
- srgb[3]= d + tof[3];
-
- to[0] = FTOCHAR(srgb[0]);
- to[1] = FTOCHAR(srgb[1]);
- to[2] = FTOCHAR(srgb[2]);
- to[3] = FTOCHAR(srgb[3]);
+ }
+ else if(channels_from == 4) {
+ /* RGBA input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y*4;
+ uchar *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* no color space conversion */
+ if(dither) {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ float_to_byte_dither_v4(to, from, (BLI_frand()-0.5f)*dither_fac);
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ float_to_byte_v4(to, from);
+ }
+ }
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert from linear to sRGB */
+ if(dither && predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ linearrgb_to_srgb_predivide_v4(tmp, from);
+ float_to_byte_dither_v4(to, tmp, (BLI_frand()-0.5f)*dither_fac);
+ }
+ }
+ else if(dither) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ linearrgb_to_srgb_v4(tmp, from);
+ float_to_byte_dither_v4(to, tmp, (BLI_frand()-0.5f)*dither_fac);
+ }
+ }
+ else if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ linearrgb_to_srgb_predivide_v4(tmp, from);
+ float_to_byte_v4(to, tmp);
+ }
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ linearrgb_to_srgb_v4(tmp, from);
+ float_to_byte_v4(to, tmp);
+ }
+ }
+ }
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert from sRGB to linear */
+ if(dither && predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ srgb_to_linearrgb_predivide_v4(tmp, from);
+ float_to_byte_dither_v4(to, tmp, (BLI_frand()-0.5f)*dither_fac);
+ }
+ }
+ else if(dither) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ srgb_to_linearrgb_v4(tmp, from);
+ float_to_byte_dither_v4(to, tmp, (BLI_frand()-0.5f)*dither_fac);
+ }
+ }
+ else if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ srgb_to_linearrgb_predivide_v4(tmp, from);
+ float_to_byte_v4(to, tmp);
+ }
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ srgb_to_linearrgb_v4(tmp, from);
+ float_to_byte_v4(to, tmp);
+ }
}
- } else {
- floatbuf_to_srgb_byte(tof, to, 0, ibuf->x, 0, ibuf->y, ibuf->x);
}
}
}
- else if(ELEM(profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) {
- if(channels==3) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=3) {
- to[0] = FTOCHAR(tof[0]);
- to[1] = FTOCHAR(tof[1]);
- to[2] = FTOCHAR(tof[2]);
- to[3] = 255;
+}
+
+/* byte to float pixels, input and output 4-channel RGBA */
+void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
+ int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from)
+{
+ float tmp[4];
+ int x, y;
+
+ /* we need valid profiles */
+ BLI_assert(profile_to != IB_PROFILE_NONE);
+ BLI_assert(profile_from != IB_PROFILE_NONE);
+
+ /* RGBA input */
+ for(y = 0; y < height; y++) {
+ const uchar *from = rect_from + stride_from*y*4;
+ float *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* no color space conversion */
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ byte_to_float_v4(to, from);
+ }
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert sRGB to linear */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ srgb_to_linearrgb_predivide_v4(to, tmp);
+ }
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ srgb_to_linearrgb_v4(to, tmp);
+ }
}
}
- else {
- if (dither != 0.f) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
- const float d = (BLI_frand()-0.5f)*dither;
- float col[4];
-
- col[0]= d + tof[0];
- col[1]= d + tof[1];
- col[2]= d + tof[2];
- col[3]= d + tof[3];
-
- to[0] = FTOCHAR(col[0]);
- to[1] = FTOCHAR(col[1]);
- to[2] = FTOCHAR(col[2]);
- to[3] = FTOCHAR(col[3]);
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert linear to sRGB */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ linearrgb_to_srgb_predivide_v4(to, tmp);
}
- } else {
- for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
- to[0] = FTOCHAR(tof[0]);
- to[1] = FTOCHAR(tof[1]);
- to[2] = FTOCHAR(tof[2]);
- to[3] = FTOCHAR(tof[3]);
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ linearrgb_to_srgb_v4(to, tmp);
}
}
}
}
- /* ensure user flag is reset */
- ibuf->userflags &= ~IB_RECT_INVALID;
}
-
-
-/* converts from linear float to sRGB byte for part of the texture, buffer will hold the changed part */
-void IMB_partial_rect_from_float(struct ImBuf *ibuf,float *buffer, int x, int y, int w, int h)
+/* float to float pixels, output 4-channel RGBA */
+void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
+ int channels_from, int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from)
{
- /* indices to source and destination image pixels */
- float *srcFloatPxl;
- unsigned char *dstBytePxl;
- /* buffer index will fill buffer */
- float *bufferIndex;
-
- /* convenience pointers to start of image buffers */
- float *init_srcFloatPxl = (float *)ibuf->rect_float;
- unsigned char *init_dstBytePxl = (unsigned char *) ibuf->rect;
-
- /* Dithering factor */
- float dither= ibuf->dither / 255.0f;
- /* respective attributes of image */
- short profile= ibuf->profile;
- int channels= ibuf->channels;
-
- int i, j;
-
- /*
- if called -only- from GPU_paint_update_image this test will never fail
- but leaving it here for better or worse
- */
- if(init_srcFloatPxl==NULL || (buffer == NULL)){
- return;
- }
- if(init_dstBytePxl==NULL) {
- imb_addrectImBuf(ibuf);
- init_dstBytePxl = (unsigned char *) ibuf->rect;
+ int x, y;
+
+ /* we need valid profiles */
+ BLI_assert(profile_to != IB_PROFILE_NONE);
+ BLI_assert(profile_from != IB_PROFILE_NONE);
+
+ if(channels_from==1) {
+ /* single channel input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y;
+ float *to = rect_to + stride_to*y*4;
+
+ for(x = 0; x < width; x++, from++, to+=4)
+ to[0] = to[1] = to[2] = to[3] = from[0];
+ }
}
- if(channels==1) {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x);
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl++, bufferIndex+=4) {
- dstBytePxl[1]= dstBytePxl[2]= dstBytePxl[3]= dstBytePxl[0] = FTOCHAR(srcFloatPxl[0]);
- bufferIndex[0] = bufferIndex[1] = bufferIndex[2] = bufferIndex[3] = srcFloatPxl[0];
+ else if(channels_from == 3) {
+ /* RGB input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y*3;
+ float *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* no color space conversion */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ copy_v3_v3(to, from);
+ to[3] = 1.0f;
}
}
- }
- else if (profile == IB_PROFILE_LINEAR_RGB) {
- if(channels == 3) {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*3;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=3, bufferIndex += 4) {
- linearrgb_to_srgb_v3_v3(bufferIndex, srcFloatPxl);
- F3TOCHAR4(bufferIndex, dstBytePxl);
- bufferIndex[3]= 1.0;
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert from sRGB to linear */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ srgb_to_linearrgb_v3_v3(to, from);
+ to[3] = 1.0f;
+ }
+ }
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert from linear to sRGB */
+ for(x = 0; x < width; x++, from+=3, to+=4) {
+ linearrgb_to_srgb_v3_v3(to, from);
+ to[3] = 1.0f;
}
}
}
- else if (channels == 4) {
- if (dither != 0.f) {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*4;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=4, bufferIndex+=4) {
- const float d = (BLI_frand()-0.5f)*dither;
- linearrgb_to_srgb_v3_v3(bufferIndex, srcFloatPxl);
- bufferIndex[3] = srcFloatPxl[3];
- add_v4_fl(bufferIndex, d);
- F4TOCHAR4(bufferIndex, dstBytePxl);
- }
+ }
+ else if(channels_from == 4) {
+ /* RGBA input */
+ for(y = 0; y < height; y++) {
+ const float *from = rect_from + stride_from*y*4;
+ float *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* same profile, copy */
+ memcpy(to, from, sizeof(float)*4*width);
+ }
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert to sRGB to linear */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ srgb_to_linearrgb_predivide_v4(to, from);
}
- } else {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*4;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=4, bufferIndex+=4) {
- linearrgb_to_srgb_v3_v3(bufferIndex, srcFloatPxl);
- bufferIndex[3]= srcFloatPxl[3];
- F4TOCHAR4(bufferIndex, dstBytePxl);
- }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ srgb_to_linearrgb_v4(to, from);
+ }
+ }
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert from linear to sRGB */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ linearrgb_to_srgb_predivide_v4(to, from);
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4)
+ linearrgb_to_srgb_v4(to, from);
}
}
}
}
- else if(ELEM(profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) {
- if(channels==3) {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*3;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=3, bufferIndex+=4) {
- copy_v3_v3(bufferIndex, srcFloatPxl);
- F3TOCHAR4(bufferIndex, dstBytePxl);
- bufferIndex[3] = 1.0;
+}
+
+/* byte to byte pixels, input and output 4-channel RGBA */
+void IMB_buffer_byte_from_byte(uchar *rect_to, const uchar *rect_from,
+ int profile_to, int profile_from, int predivide,
+ int width, int height, int stride_to, int stride_from)
+{
+ float tmp[4];
+ int x, y;
+
+ /* we need valid profiles */
+ BLI_assert(profile_to != IB_PROFILE_NONE);
+ BLI_assert(profile_from != IB_PROFILE_NONE);
+
+ /* always RGBA input */
+ for(y = 0; y < height; y++) {
+ const uchar *from = rect_from + stride_from*y*4;
+ uchar *to = rect_to + stride_to*y*4;
+
+ if(profile_to == profile_from) {
+ /* same profile, copy */
+ memcpy(to, from, sizeof(uchar)*4*width);
+ }
+ else if(profile_to == IB_PROFILE_LINEAR_RGB) {
+ /* convert to sRGB to linear */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ srgb_to_linearrgb_predivide_v4(tmp, tmp);
+ float_to_byte_v4(to, tmp);
+ }
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ srgb_to_linearrgb_v4(tmp, tmp);
+ float_to_byte_v4(to, tmp);
}
}
}
- else {
- if (dither != 0.f) {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*4;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=4, bufferIndex+=4) {
- const float d = (BLI_frand()-0.5f)*dither;
- copy_v4_v4(bufferIndex, srcFloatPxl);
- add_v4_fl(bufferIndex,d);
- F4TOCHAR4(bufferIndex, dstBytePxl);
- }
+ else if(profile_to == IB_PROFILE_SRGB) {
+ /* convert from linear to sRGB */
+ if(predivide) {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ linearrgb_to_srgb_predivide_v4(tmp, tmp);
+ float_to_byte_v4(to, tmp);
}
- } else {
- for (j = 0; j < h; j++){
- bufferIndex = buffer + w*j*4;
- dstBytePxl = init_dstBytePxl + (ibuf->x*(y + j) + x)*4;
- srcFloatPxl = init_srcFloatPxl + (ibuf->x*(y + j) + x)*4;
- for(i = 0; i < w; i++, dstBytePxl+=4, srcFloatPxl+=4, bufferIndex+=4) {
- copy_v4_v4(bufferIndex, srcFloatPxl);
- F4TOCHAR4(bufferIndex, dstBytePxl);
- }
+ }
+ else {
+ for(x = 0; x < width; x++, from+=4, to+=4) {
+ byte_to_float_v4(tmp, from);
+ linearrgb_to_srgb_v4(tmp, tmp);
+ float_to_byte_v4(to, tmp);
}
}
}
}
+}
+
+/****************************** ImBuf Conversion *****************************/
+
+void IMB_rect_from_float(struct ImBuf *ibuf)
+{
+ int predivide= (ibuf->flags & IB_cm_predivide);
+ int profile_from;
+
+ /* verify we have a float buffer */
+ if(ibuf->rect_float==NULL)
+ return;
+
+ /* create byte rect if it didn't exist yet */
+ if(ibuf->rect==NULL)
+ imb_addrectImBuf(ibuf);
+
+ /* determine profiles */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ profile_from = IB_PROFILE_LINEAR_RGB;
+ else if(ELEM(ibuf->profile, IB_PROFILE_SRGB, IB_PROFILE_NONE))
+ profile_from = IB_PROFILE_SRGB;
+ else
+ BLI_assert(0);
+
+ /* do conversion */
+ IMB_buffer_byte_from_float((uchar*)ibuf->rect, ibuf->rect_float,
+ ibuf->channels, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
+
/* ensure user flag is reset */
ibuf->userflags &= ~IB_RECT_INVALID;
}
-static void imb_float_from_rect_nonlinear(struct ImBuf *ibuf, float *fbuf)
+/* converts from linear float to sRGB byte for part of the texture, buffer will hold the changed part */
+void IMB_partial_rect_from_float(struct ImBuf *ibuf, float *buffer, int x, int y, int w, int h)
{
- float *tof = fbuf;
- int i;
- unsigned char *to = (unsigned char *) ibuf->rect;
-
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = ((float)to[0])*(1.0f/255.0f);
- tof[1] = ((float)to[1])*(1.0f/255.0f);
- tof[2] = ((float)to[2])*(1.0f/255.0f);
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
-}
+ float *rect_float;
+ uchar *rect_byte;
+ int predivide= (ibuf->flags & IB_cm_predivide);
+ int profile_from;
+
+ /* verify we have a float buffer */
+ if(ibuf->rect_float==NULL || buffer==NULL)
+ return;
+ /* create byte rect if it didn't exist yet */
+ if(ibuf->rect==NULL)
+ imb_addrectImBuf(ibuf);
-static void imb_float_from_rect_linear(struct ImBuf *ibuf, float *fbuf)
-{
- float *tof = fbuf;
- int i;
- unsigned char *to = (unsigned char *) ibuf->rect;
-
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = srgb_to_linearrgb(((float)to[0])*(1.0f/255.0f));
- tof[1] = srgb_to_linearrgb(((float)to[1])*(1.0f/255.0f));
- tof[2] = srgb_to_linearrgb(((float)to[2])*(1.0f/255.0f));
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
+ /* determine profiles */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ profile_from = IB_PROFILE_LINEAR_RGB;
+ else if(ELEM(ibuf->profile, IB_PROFILE_SRGB, IB_PROFILE_NONE))
+ profile_from = IB_PROFILE_SRGB;
+ else
+ BLI_assert(0);
+
+ /* do conversion */
+ rect_float= ibuf->rect_float + (x + y*ibuf->x)*ibuf->channels;
+ rect_byte= (uchar*)ibuf->rect + (x + y*ibuf->x)*4;
+
+ IMB_buffer_float_from_float(buffer, rect_float,
+ ibuf->channels, IB_PROFILE_SRGB, profile_from, predivide,
+ w, h, w, ibuf->x);
+
+ IMB_buffer_byte_from_float(rect_byte, buffer,
+ 4, ibuf->dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB, 0,
+ w, h, ibuf->x, w);
+
+ /* ensure user flag is reset */
+ ibuf->userflags &= ~IB_RECT_INVALID;
}
void IMB_float_from_rect(struct ImBuf *ibuf)
{
- /* quick method to convert byte to floatbuf */
- if(ibuf->rect==NULL) return;
- if(ibuf->rect_float==NULL) {
- if (imb_addrectfloatImBuf(ibuf) == 0) return;
- }
+ int predivide= (ibuf->flags & IB_cm_predivide);
+ int profile_from;
+
+ /* verify if we byte and float buffers */
+ if(ibuf->rect==NULL)
+ return;
+
+ if(ibuf->rect_float==NULL)
+ if(imb_addrectfloatImBuf(ibuf) == 0)
+ return;
- /* Float bufs should be stored linear */
-
- if (ibuf->profile != IB_PROFILE_NONE) {
- /* if the image has been given a profile then we're working
- * with color management in mind, so convert it to linear space */
- imb_float_from_rect_linear(ibuf, ibuf->rect_float);
- } else {
- imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
- }
+ /* determine profiles */
+ if(ibuf->profile == IB_PROFILE_NONE)
+ profile_from = IB_PROFILE_LINEAR_RGB;
+ else
+ profile_from = IB_PROFILE_SRGB;
+
+ /* do conversion */
+ IMB_buffer_float_from_byte(ibuf->rect_float, (uchar*)ibuf->rect,
+ IB_PROFILE_LINEAR_RGB, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
/* no profile conversion */
void IMB_float_from_rect_simple(struct ImBuf *ibuf)
{
+ int predivide= (ibuf->flags & IB_cm_predivide);
+
if(ibuf->rect_float==NULL)
imb_addrectfloatImBuf(ibuf);
- imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
+
+ IMB_buffer_float_from_byte(ibuf->rect_float, (uchar*)ibuf->rect,
+ IB_PROFILE_SRGB, IB_PROFILE_SRGB, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
void IMB_convert_profile(struct ImBuf *ibuf, int profile)
{
- int ok= FALSE;
- int i;
-
- unsigned char *rct= (unsigned char *)ibuf->rect;
- float *rctf= ibuf->rect_float;
+ int predivide= (ibuf->flags & IB_cm_predivide);
+ int profile_from, profile_to;
if(ibuf->profile == profile)
return;
- if(ELEM(ibuf->profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) { /* from */
- if(profile == IB_PROFILE_LINEAR_RGB) { /* to */
- if(ibuf->rect_float) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) {
- rctf[0]= srgb_to_linearrgb(rctf[0]);
- rctf[1]= srgb_to_linearrgb(rctf[1]);
- rctf[2]= srgb_to_linearrgb(rctf[2]);
- }
- }
- if(ibuf->rect) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rct[0]= (unsigned char)((srgb_to_linearrgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
- rct[1]= (unsigned char)((srgb_to_linearrgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
- rct[2]= (unsigned char)((srgb_to_linearrgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
- }
- }
- ok= TRUE;
- }
- }
- else if (ibuf->profile == IB_PROFILE_LINEAR_RGB) { /* from */
- if(ELEM(profile, IB_PROFILE_NONE, IB_PROFILE_SRGB)) { /* to */
- if(ibuf->rect_float) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) {
- rctf[0]= linearrgb_to_srgb(rctf[0]);
- rctf[1]= linearrgb_to_srgb(rctf[1]);
- rctf[2]= linearrgb_to_srgb(rctf[2]);
- }
- }
- if(ibuf->rect) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rct[0]= (unsigned char)((linearrgb_to_srgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
- rct[1]= (unsigned char)((linearrgb_to_srgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
- rct[2]= (unsigned char)((linearrgb_to_srgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
- }
- }
- ok= TRUE;
- }
+ /* determine profiles */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ profile_from = IB_PROFILE_LINEAR_RGB;
+ else if(ELEM(ibuf->profile, IB_PROFILE_SRGB, IB_PROFILE_NONE))
+ profile_from = IB_PROFILE_SRGB;
+ else
+ BLI_assert(0);
+
+ if(profile == IB_PROFILE_LINEAR_RGB)
+ profile_to = IB_PROFILE_LINEAR_RGB;
+ else if(ELEM(profile, IB_PROFILE_SRGB, IB_PROFILE_NONE))
+ profile_to = IB_PROFILE_SRGB;
+ else
+ BLI_assert(0);
+
+ /* do conversion */
+ if(ibuf->rect_float) {
+ IMB_buffer_float_from_float(ibuf->rect_float, ibuf->rect_float,
+ 4, profile_to, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
- if(ok==FALSE){
- printf("IMB_convert_profile: failed profile conversion %d -> %d\n", ibuf->profile, profile);
- return;
+ if(ibuf->rect) {
+ IMB_buffer_byte_from_byte((uchar*)ibuf->rect, (uchar*)ibuf->rect,
+ profile_to, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
+ /* set new profile */
ibuf->profile= profile;
}
@@ -448,18 +603,26 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
* if the return */
float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc)
{
- /* stupid but it works like this everywhere now */
- const short is_lin_from= (ibuf->profile != IB_PROFILE_NONE);
- const short is_lin_to= (profile != IB_PROFILE_NONE);
-
+ int predivide= (ibuf->flags & IB_cm_predivide);
+ int profile_from, profile_to;
+
+ /* determine profiles */
+ if(ibuf->profile == IB_PROFILE_NONE)
+ profile_from = IB_PROFILE_LINEAR_RGB;
+ else
+ profile_from = IB_PROFILE_SRGB;
+
+ if(profile == IB_PROFILE_NONE)
+ profile_to = IB_PROFILE_LINEAR_RGB;
+ else
+ profile_to = IB_PROFILE_SRGB;
- if(is_lin_from == is_lin_to) {
+ if(profile_from == profile_to) {
+ /* simple case, just allocate the buffer and return */
*alloc= 0;
- /* simple case, just allocate the buffer and return */
- if(ibuf->rect_float == NULL) {
+ if(ibuf->rect_float == NULL)
IMB_float_from_rect(ibuf);
- }
return ibuf->rect_float;
}
@@ -469,42 +632,36 @@ float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc)
*alloc= 1;
if(ibuf->rect_float == NULL) {
- if(is_lin_to) {
- imb_float_from_rect_linear(ibuf, fbuf);
- }
- else {
- imb_float_from_rect_nonlinear(ibuf, fbuf);
- }
+ IMB_buffer_float_from_byte(fbuf, (uchar*)ibuf->rect,
+ profile_to, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
else {
- if(is_lin_to) { /* lin -> nonlin */
- linearrgb_to_srgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
- }
- else { /* nonlin -> lin */
- srgb_to_linearrgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
- }
+ IMB_buffer_float_from_float(fbuf, ibuf->rect_float,
+ 4, profile_to, profile_from, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
}
return fbuf;
}
}
+/**************************** Color to Grayscale *****************************/
/* no profile conversion */
void IMB_color_to_bw(struct ImBuf *ibuf)
{
float *rctf= ibuf->rect_float;
- unsigned char *rct= (unsigned char *)ibuf->rect;
+ uchar *rct= (uchar*)ibuf->rect;
int i;
+
if(rctf) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4) {
+ for(i = ibuf->x * ibuf->y; i > 0; i--, rctf+=4)
rctf[0]= rctf[1]= rctf[2]= rgb_to_grayscale(rctf);
- }
}
if(rct) {
- for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
+ for(i = ibuf->x * ibuf->y; i > 0; i--, rct+=4)
rct[0]= rct[1]= rct[2]= rgb_to_grayscale_byte(rct);
- }
}
}
diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c
index 4088cf861e7..ce14951b5fb 100644
--- a/source/blender/imbuf/intern/indexer.c
+++ b/source/blender/imbuf/intern/indexer.c
@@ -52,8 +52,11 @@ static int proxy_sizes[] = { IMB_PROXY_25, IMB_PROXY_50, IMB_PROXY_75,
static float proxy_fac[] = { 0.25, 0.50, 0.75, 1.00 };
#ifdef WITH_FFMPEG
-static int tc_types[] = { IMB_TC_RECORD_RUN, IMB_TC_FREE_RUN,
- IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN };
+static int tc_types[] = { IMB_TC_RECORD_RUN,
+ IMB_TC_FREE_RUN,
+ IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN,
+ IMB_TC_RECORD_RUN_NO_GAPS,
+ };
#endif
#define INDEX_FILE_VERSION 1
@@ -102,7 +105,7 @@ anim_index_builder * IMB_index_builder_create(const char * name)
}
void IMB_index_builder_add_entry(anim_index_builder * fp,
- int frameno,unsigned long long seek_pos,
+ int frameno, unsigned long long seek_pos,
unsigned long long seek_pos_dts,
unsigned long long pts)
{
@@ -344,6 +347,8 @@ int IMB_timecode_to_array_index(IMB_Timecode_Type tc)
return 1;
case IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN:
return 2;
+ case IMB_TC_RECORD_RUN_NO_GAPS:
+ return 3;
default:
return 0;
};
@@ -401,8 +406,10 @@ static void get_tc_filename(struct anim * anim, IMB_Timecode_Type tc,
char index_dir[FILE_MAXDIR];
int i = IMB_timecode_to_array_index(tc);
const char * index_names[] = {
- "record_run%s.blen_tc", "free_run%s.blen_tc",
- "interp_free_run%s.blen_tc" };
+ "record_run%s.blen_tc",
+ "free_run%s.blen_tc",
+ "interp_free_run%s.blen_tc",
+ "record_run_no_gaps%s.blen_tc"};
char stream_suffix[20];
char index_name[256];
@@ -696,7 +703,7 @@ static int index_rebuild_ffmpeg(struct anim * anim,
unsigned long long start_pts = 0;
double frame_rate;
double pts_time_base;
- int frameno = 0;
+ int frameno = 0, frameno_gapless = 0;
int start_pts_set = FALSE;
AVFormatContext *iFormatCtx;
@@ -858,13 +865,21 @@ static int index_rebuild_ffmpeg(struct anim * anim,
for (i = 0; i < num_indexers; i++) {
if (tcs_in_use & tc_types[i]) {
+ int tc_frameno = frameno;
+
+ if(tc_types[i] == IMB_TC_RECORD_RUN_NO_GAPS)
+ tc_frameno = frameno_gapless;
+
IMB_index_builder_proc_frame(
indexer[i],
next_packet.data,
next_packet.size,
- frameno, s_pos, s_dts, pts);
+ tc_frameno,
+ s_pos, s_dts, pts);
}
}
+
+ frameno_gapless++;
}
av_free_packet(&next_packet);
}
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index 568dd7a9fb7..f8082c95f84 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -70,21 +70,24 @@ int imb_is_a_jp2(unsigned char *buf)
/**
sample error callback expecting a FILE* client object
*/
-static void error_callback(const char *msg, void *client_data) {
+static void error_callback(const char *msg, void *client_data)
+{
FILE *stream = (FILE*)client_data;
fprintf(stream, "[ERROR] %s", msg);
}
/**
sample warning callback expecting a FILE* client object
*/
-static void warning_callback(const char *msg, void *client_data) {
+static void warning_callback(const char *msg, void *client_data)
+{
FILE *stream = (FILE*)client_data;
fprintf(stream, "[WARNING] %s", msg);
}
/**
sample debug callback expecting no client object
*/
-static void info_callback(const char *msg, void *client_data) {
+static void info_callback(const char *msg, void *client_data)
+{
(void)client_data;
fprintf(stdout, "[INFO] %s", msg);
}
@@ -305,7 +308,8 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
#define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/
-static int initialise_4K_poc(opj_poc_t *POC, int numres){
+static int initialise_4K_poc(opj_poc_t *POC, int numres)
+{
POC[0].tile = 1;
POC[0].resno0 = 0;
POC[0].compno0 = 0;
@@ -323,7 +327,8 @@ static int initialise_4K_poc(opj_poc_t *POC, int numres){
return 2;
}
-static void cinema_parameters(opj_cparameters_t *parameters){
+static void cinema_parameters(opj_cparameters_t *parameters)
+{
parameters->tile_size_on = false;
parameters->cp_tdx=1;
parameters->cp_tdy=1;
@@ -356,7 +361,8 @@ static void cinema_parameters(opj_cparameters_t *parameters){
}
-static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
+static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol)
+{
int i;
float temp_rate;
@@ -442,8 +448,8 @@ static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *imag
}
-static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
-
+static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters)
+{
unsigned char *rect;
float *rect_float;
@@ -662,8 +668,8 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags) {
-
+int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags)
+{
int quality = ibuf->ftype & 0xff;
int bSuccess;
diff --git a/source/blender/imbuf/intern/md5.h b/source/blender/imbuf/intern/md5.h
deleted file mode 100644
index 79c480d8152..00000000000
--- a/source/blender/imbuf/intern/md5.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/** \file blender/imbuf/intern/md5.h
- * \ingroup imbuf
- */
-/* md5.h - Declaration of functions and data types used for MD5 sum
- computing library functions.
- Copyright (C) 1995 Free Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#ifndef _MD5_H
-#define _MD5_H
-
-#include <stdio.h>
-
-#if defined HAVE_LIMITS_H || defined _LIBC
-# include <limits.h>
-#endif
-
-/* The following contortions are an attempt to use the C preprocessor
- to determine an unsigned integral type that is 32 bits wide. An
- alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
- doing that would require that the configure script compile and *run*
- the resulting executable. Locally running cross-compiled executables
- is usually not possible. */
-
-#if defined __STDC__ && __STDC__
-# define UINT_MAX_32_BITS 4294967295U
-#else
-# define UINT_MAX_32_BITS 0xFFFFFFFF
-#endif
-
-/* If UINT_MAX isn't defined, assume it's a 32-bit type.
- This should be valid for all systems GNU cares about because
- that doesn't include 16-bit systems, and only modern systems
- (that certainly have <limits.h>) have 64+-bit integral types. */
-
-#ifndef UINT_MAX
-# define UINT_MAX UINT_MAX_32_BITS
-#endif
-
-#if UINT_MAX == UINT_MAX_32_BITS
- typedef unsigned int md5_uint32;
-#else
-# if USHRT_MAX == UINT_MAX_32_BITS
- typedef unsigned short md5_uint32;
-# else
-# if ULONG_MAX == UINT_MAX_32_BITS
- typedef unsigned long md5_uint32;
-# else
- /* The following line is intended to evoke an error.
- Using #error is not portable enough. */
- "Cannot determine unsigned 32-bit data type."
-# endif
-# endif
-#endif
-
-#undef __P
-#if defined (__STDC__) && __STDC__
-#define __P(x) x
-#else
-#define __P(x) ()
-#endif
-
-/* Structure to save state of computation between the single steps. */
-struct md5_ctx
-{
- md5_uint32 A;
- md5_uint32 B;
- md5_uint32 C;
- md5_uint32 D;
-};
-
-/*
- * The following three functions are build up the low level used in
- * the functions `md5_stream' and `md5_buffer'.
- */
-
-/* Initialize structure containing state of computation.
- (RFC 1321, 3.3: Step 3) */
-void md5_init_ctx __P ((struct md5_ctx *ctx));
-
-/* Starting with the result of former calls of this function (or the
- initialzation function update the context for the next LEN bytes
- starting at BUFFER.
- It is necessary that LEN is a multiple of 64!!! */
-void md5_process_block __P ((const void *buffer, size_t len,
- struct md5_ctx *ctx));
-
-/* Put result from CTX in first 16 bytes following RESBUF. The result is
- always in little endian byte order, so that a byte-wise output yields
- to the wanted ASCII representation of the message digest. */
-void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf));
-
-
-/* Compute MD5 message digest for bytes read from STREAM. The
- resulting message digest number will be written into the 16 bytes
- beginning at RESBLOCK. */
-int md5_stream __P ((FILE *stream, void *resblock));
-
-/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
- result is always in little endian byte order, so that a byte-wise
- output yields to the wanted ASCII representation of the message
- digest. */
-void *md5_buffer __P ((const char *buffer, size_t len, void *resblock));
-
-#endif
-
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 41278e8381a..808bcbed751 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -32,17 +32,18 @@
#include <stdio.h>
-#include "BKE_utildefines.h"
-#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_md5.h"
+
+#include "BKE_utildefines.h"
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_thumbs.h"
#include "IMB_metadata.h"
-#include "md5.h"
-
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -309,7 +310,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
if (img != NULL) {
stat(path, &info);
- BLI_snprintf(mtime, sizeof(mtime), "%ld", info.st_mtime);
+ BLI_snprintf(mtime, sizeof(mtime), "%ld", (long int)info.st_mtime);
BLI_snprintf(cwidth, sizeof(cwidth), "%d", img->x);
BLI_snprintf(cheight, sizeof(cheight), "%d", img->y);
}
@@ -327,7 +328,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
IMB_free_anim(anim);
}
stat(path, &info);
- BLI_snprintf(mtime, sizeof(mtime), "%ld", info.st_mtime);
+ BLI_snprintf(mtime, sizeof(mtime), "%ld", (long int)info.st_mtime);
}
if (!img) return NULL;
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index 872b78743be..47dad378eb7 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -199,12 +199,14 @@ int IMB_ispic(const char *filename)
-static int isavi (const char *name) {
+static int isavi (const char *name)
+{
return AVI_is_avi (name);
}
#ifdef WITH_QUICKTIME
-static int isqtime (const char *name) {
+static int isqtime (const char *name)
+{
return anim_is_quicktime (name);
}
#endif
@@ -240,7 +242,8 @@ void do_init_ffmpeg(void)
}
}
-static int isffmpeg (const char *filename) {
+static int isffmpeg (const char *filename)
+{
AVFormatContext *pFormatCtx;
unsigned int i;
int videoStream;
@@ -323,7 +326,8 @@ static int isredcode(const char * filename)
#endif
-int imb_get_anim_type(const char * name) {
+int imb_get_anim_type(const char * name)
+{
int type;
struct stat st;
@@ -364,7 +368,8 @@ int imb_get_anim_type(const char * name) {
return(0);
}
-int IMB_isanim(const char *filename) {
+int IMB_isanim(const char *filename)
+{
int type;
if(U.uiflag & USER_FILTERFILEEXTS) {
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 97ea7592d04..f0e126db813 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -24,14 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_ID_H
-#define DNA_ID_H
/** \file DNA_ID.h
* \ingroup DNA
* \brief ID and Library types, which are fundamental for sdna.
*/
+#ifndef DNA_ID_H
+#define DNA_ID_H
+
#include "DNA_listBase.h"
#ifdef __cplusplus
@@ -57,7 +58,7 @@ typedef struct IDProperty {
seemed like a good idea as a pad var was needed anyway :)*/
IDPropertyData data; /* note, alignment for 64 bits */
int len; /* array length, also (this is important!) string length + 1.
- the idea is to be able to reuse array realloc functions on strings.*/
+ * the idea is to be able to reuse array realloc functions on strings.*/
/* totallen is total length of allocated array/string, including a buffer.
* Note that the buffering is mild; the code comes from python's list implementation.*/
int totallen; /*strings and arrays are both buffered, though the buffer isn't
@@ -74,7 +75,7 @@ typedef struct IDProperty {
#define IDP_ARRAY 5
#define IDP_GROUP 6
/* the ID link property type hasn't been implemented yet, this will require
- some cleanup of blenkernel, most likely.*/
+ * some cleanup of blenkernel, most likely.*/
#define IDP_ID 7
#define IDP_DOUBLE 8
#define IDP_IDPARRAY 9
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index b198231df3a..9cee4e188ff 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -1,4 +1,4 @@
-/*
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +29,6 @@
* \ingroup DNA
*/
-
#ifndef DNA_ACTION_TYPES_H
#define DNA_ACTION_TYPES_H
@@ -204,7 +203,9 @@ typedef struct bPoseChannel {
bMotionPath *mpath; /* motion path cache for this bone */
struct Object *custom; /* draws custom object instead of default bone shape */
- struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
+ struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform.
+ * needed in rare cases for advanced rigs,
+ * since the alternative is highly complicated - campbell */
/* transforms - written in by actions or transform */
float loc[3];
@@ -219,7 +220,8 @@ typedef struct bPoseChannel {
float chan_mat[4][4]; /* matrix result of loc/quat/size , and where we put deform in, see next line */
float pose_mat[4][4]; /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat */
- float constinv[4][4]; /* inverse result of constraints. doesn't include effect of restposition, parent, and local transform*/
+ float constinv[4][4]; /* inverse result of constraints.
+ * doesn't include effect of restposition, parent, and local transform*/
float pose_head[3]; /* actually pose_mat[3] */
float pose_tail[3]; /* also used for drawing help lines... */
@@ -582,7 +584,7 @@ typedef struct SpaceAction {
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* copied to region */
bAction *action; /* the currently active action */
bDopeSheet ads; /* the currently active context (when not showing action) */
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 20a2c36166f..a4280a6e463 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -194,7 +194,7 @@ typedef struct bVisibilityActuator {
int flag;
} bVisibilityActuator;
-typedef struct bTwoDFilterActuator{
+typedef struct bTwoDFilterActuator {
char pad[4];
/* Tells what type of 2D Filter */
short type;
@@ -205,7 +205,7 @@ typedef struct bTwoDFilterActuator{
/* a float argument */
float float_arg;
struct Text *text;
-}bTwoDFilterActuator;
+} bTwoDFilterActuator;
typedef struct bParentActuator {
char pad[2];
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index e1dfd652900..2233da86385 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -23,13 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_ANIM_TYPES_H
-#define DNA_ANIM_TYPES_H
-
/** \file DNA_anim_types.h
* \ingroup DNA
*/
+#ifndef DNA_ANIM_TYPES_H
+#define DNA_ANIM_TYPES_H
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index 442fc3ddcce..45c30315575 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -23,13 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_ARMATURE_TYPES_H
-#define DNA_ARMATURE_TYPES_H
-
/** \file DNA_armature_types.h
* \ingroup DNA
*/
+#ifndef DNA_ARMATURE_TYPES_H
+#define DNA_ARMATURE_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h
index 4de03f55077..53ff5179049 100644
--- a/source/blender/makesdna/DNA_boid_types.h
+++ b/source/blender/makesdna/DNA_boid_types.h
@@ -26,13 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_BOID_TYPES_H
-#define DNA_BOID_TYPES_H
-
/** \file DNA_boid_types.h
* \ingroup DNA
*/
+#ifndef DNA_BOID_TYPES_H
+#define DNA_BOID_TYPES_H
+
#include "DNA_listBase.h"
typedef enum BoidRuleType {
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index e9290a92493..e5c500f1fea 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -25,13 +25,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_BRUSH_TYPES_H
-#define DNA_BRUSH_TYPES_H
-
/** \file DNA_brush_types.h
* \ingroup DNA
*/
+#ifndef DNA_BRUSH_TYPES_H
+#define DNA_BRUSH_TYPES_H
+
#include "DNA_ID.h"
#include "DNA_texture_types.h" /* for MTex */
@@ -132,7 +132,7 @@ typedef struct Brush {
#define BRUSH_CUSTOM_ICON (1<<28)
/* temporary flag which sets up autmatically for correct
- brush drawing when inverted modal operator is running */
+ * brush drawing when inverted modal operator is running */
#define BRUSH_INVERTED (1<<29)
/* Brush.sculpt_tool */
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 292f920da66..a46be730d6c 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -24,13 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_CAMERA_TYPES_H
-#define DNA_CAMERA_TYPES_H
/** \file DNA_camera_types.h
* \ingroup DNA
*/
+#ifndef DNA_CAMERA_TYPES_H
+#define DNA_CAMERA_TYPES_H
+
+#include "DNA_defs.h"
+
#include "DNA_ID.h"
#ifdef __cplusplus
@@ -59,7 +62,7 @@ typedef struct Camera {
The name was not changed so that no other files need to be modified */
float YF_dofdist;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Object *dof_ob;
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
index 7b2fb292d27..5c333c3fc1f 100644
--- a/source/blender/makesdna/DNA_cloth_types.h
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_CLOTH_TYPES_H
-#define DNA_CLOTH_TYPES_H
/** \file DNA_cloth_types.h
* \ingroup DNA
*/
+#ifndef DNA_CLOTH_TYPES_H
+#define DNA_CLOTH_TYPES_H
+
/**
* This struct contains all the global data required to run a simulation.
* At the time of this writing, this structure contains data appropriate
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index f3cfab4503b..f5762f8b49f 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-#ifndef DNA_COLOR_TYPES_H
-#define DNA_COLOR_TYPES_H
/** \file DNA_color_types.h
* \ingroup DNA
*/
+#ifndef DNA_COLOR_TYPES_H
+#define DNA_COLOR_TYPES_H
+
#include "DNA_vec_types.h"
/* general defines for kernel functions */
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index c85ef72d337..8fdbde60bab 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -26,13 +26,14 @@
* Constraint DNA data
*/
-#ifndef DNA_CONSTRAINT_TYPES_H
-#define DNA_CONSTRAINT_TYPES_H
-
/** \file DNA_constraint_types.h
* \ingroup DNA
*/
+#ifndef DNA_CONSTRAINT_TYPES_H
+#define DNA_CONSTRAINT_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
#include "DNA_listBase.h"
@@ -66,7 +67,7 @@ typedef struct bConstraint {
float headtail; /* Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail*/
int pad;
- struct Ipo *ipo; /* local influence ipo or driver */ // XXX depreceated for 2.5... old animation system hack
+ struct Ipo *ipo DNA_DEPRECATED; /* local influence ipo or driver */ /* old animation system, deprecated for 2.5 */
/* below are readonly fields that are set at runtime by the solver for use in the GE (only IK atm) */
float lin_error; /* residual error on constraint expressed in blender unit*/
@@ -125,10 +126,10 @@ typedef struct bPythonConstraint {
/* Inverse-Kinematics (IK) constraint
- This constraint supports a variety of mode determine by the type field
- according to B_CONSTRAINT_IK_TYPE.
- Some fields are used by all types, some are specific to some types
- This is indicated in the comments for each field
+ * This constraint supports a variety of mode determine by the type field
+ * according to B_CONSTRAINT_IK_TYPE.
+ * Some fields are used by all types, some are specific to some types
+ * This is indicated in the comments for each field
*/
typedef struct bKinematicConstraint {
struct Object *tar; /* All: target object in case constraint needs a target */
@@ -179,7 +180,10 @@ typedef struct bSplineIKConstraint {
/* Track To Constraint */
typedef struct bTrackToConstraint {
struct Object *tar;
- int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags, not sure if that's what they were intented for anyway. Not sure either if it would create backward incompatibility if I were to rename them. - theeth*/
+ int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags,
+ * not sure if that's what they were intented for anyway.
+ * Not sure either if it would create backward incompatibility if I were to rename them.
+ * - theeth*/
int reserved2;
int flags;
int pad;
@@ -411,6 +415,8 @@ typedef struct bFollowTrackConstraint {
struct MovieClip *clip;
char track[24];
int flag, pad;
+ char object[24];
+ struct Object *camera;
} bFollowTrackConstraint;
/* Camera Solver constraints */
@@ -419,6 +425,15 @@ typedef struct bCameraSolverConstraint {
int flag, pad;
} bCameraSolverConstraint;
+/* Camera Solver constraints */
+typedef struct bObjectSolverConstraint {
+ struct MovieClip *clip;
+ int flag, pad;
+ char object[24];
+ float invmat[4][4]; /* parent-inverse matrix to use */
+ struct Object *camera;
+} bObjectSolverConstraint;
+
/* ------------------------------------------ */
/* bConstraint->type
@@ -454,6 +469,7 @@ typedef enum eBConstraint_Types {
CONSTRAINT_TYPE_PIVOT, /* Pivot Constraint */
CONSTRAINT_TYPE_FOLLOWTRACK, /* Follow Track Constraint */
CONSTRAINT_TYPE_CAMERASOLVER, /* Camera Solver Constraint */
+ CONSTRAINT_TYPE_OBJECTSOLVER, /* Object Solver Constraint */
/* NOTE: no constraints are allowed to be added after this */
NUM_CONSTRAINT_TYPES
@@ -761,6 +777,11 @@ typedef enum eCameraSolver_Flags {
CAMERASOLVER_ACTIVECLIP = (1<<0)
} eCameraSolver_Flags;
+/* ObjectSolver Constraint -> flag */
+typedef enum eObjectSolver_Flags {
+ OBJECTSOLVER_ACTIVECLIP = (1<<0)
+} eObjectSolver_Flags;
+
/* Rigid-Body Constraint */
#define CONSTRAINT_DRAW_PIVOT 0x40
#define CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
diff --git a/source/blender/makesdna/DNA_controller_types.h b/source/blender/makesdna/DNA_controller_types.h
index 049e7bd4886..c8f4325d717 100644
--- a/source/blender/makesdna/DNA_controller_types.h
+++ b/source/blender/makesdna/DNA_controller_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_CONTROLLER_TYPES_H
-#define DNA_CONTROLLER_TYPES_H
/** \file DNA_controller_types.h
* \ingroup DNA
*/
+#ifndef DNA_CONTROLLER_TYPES_H
+#define DNA_CONTROLLER_TYPES_H
+
struct bActuator;
struct Text;
struct bSensor;
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 236d6dd4732..ffcc516f393 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -24,13 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_CURVE_TYPES_H
-#define DNA_CURVE_TYPES_H
/** \file DNA_curve_types.h
* \ingroup DNA
*/
+#ifndef DNA_CURVE_TYPES_H
+#define DNA_CURVE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
#include "DNA_ID.h"
@@ -174,7 +176,7 @@ typedef struct Curve {
EditNurb *editnurb; /* edited data, not in file, use pointer so we can check for it */
struct Object *bevobj, *taperobj, *textoncurve;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
Path *path;
struct Key *key;
struct Material **mat;
@@ -254,7 +256,7 @@ typedef struct Curve {
#define CU_STRETCH 128
#define CU_OFFS_PATHDIST 256
#define CU_FAST 512 /* Font: no filling inside editmode */
-#define CU_RETOPO 1024
+/* #define CU_RETOPO 1024 */ /* DEPRECATED */
#define CU_DS_EXPAND 2048
#define CU_PATH_RADIUS 4096 /* make use of the path radius if this is enabled (default for new curves) */
#define CU_DEFORM_FILL 8192 /* fill 2d curve after deformation */
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index d98e5200d21..8259eea42ce 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -36,6 +36,8 @@
extern "C" {
#endif
+#include "DNA_defs.h" /* USE_BMESH_FORWARD_COMPAT */
+
/** descriptor and storage for a custom data layer */
typedef struct CustomDataLayer {
int type; /* type of data in layer */
@@ -59,6 +61,9 @@ typedef struct CustomDataExternal {
* layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */
typedef struct CustomData {
CustomDataLayer *layers; /* CustomDataLayers, ordered by type */
+ int typemap[32]; /* runtime only! - maps types to indices of first layer of that type,
+ * MUST be >= CD_NUMTYPES, but we cant use a define here.
+ * Correct size is ensured in CustomData_update_typemap assert() */
int totlayer, maxlayer; /* number of layers, size of layers array */
int totsize, pad; /* in editmode, total size of all data layers */
void *pool; /* Bmesh: Memory pool for allocation of blocks */
@@ -75,7 +80,7 @@ typedef struct CustomData {
#define CD_MCOL 6
#define CD_ORIGINDEX 7
#define CD_NORMAL 8
-#define CD_FLAGS 9
+#define CD_POLYINDEX 9
#define CD_PROP_FLT 10
#define CD_PROP_INT 11
#define CD_PROP_STR 12
@@ -91,8 +96,27 @@ typedef struct CustomData {
#define CD_TEXTURE_MCOL 22
#define CD_CLOTH_ORCO 23
#define CD_RECAST 24
+
+#ifdef USE_BMESH_FORWARD_COMPAT
+
+/* BMESH ONLY START */
+#define CD_MPOLY 25
+#define CD_MLOOP 26
+#define CD_SHAPE_KEYINDEX 27
+#define CD_SHAPEKEY 28
+#define CD_BWEIGHT 29
+#define CD_CREASE 30
+#define CD_WEIGHT_MLOOPCOL 31
+/* BMESH ONLY END */
+
+#define CD_NUMTYPES 32
+
+#else
+
#define CD_NUMTYPES 25
+#endif
+
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
#define CD_MASK_MSTICKY (1 << CD_MSTICKY)
@@ -103,7 +127,7 @@ typedef struct CustomData {
#define CD_MASK_MCOL (1 << CD_MCOL)
#define CD_MASK_ORIGINDEX (1 << CD_ORIGINDEX)
#define CD_MASK_NORMAL (1 << CD_NORMAL)
-#define CD_MASK_FLAGS (1 << CD_FLAGS)
+#define CD_MASK_POLYINDEX (1 << CD_POLYINDEX)
#define CD_MASK_PROP_FLT (1 << CD_PROP_FLT)
#define CD_MASK_PROP_INT (1 << CD_PROP_INT)
#define CD_MASK_PROP_STR (1 << CD_PROP_STR)
@@ -118,6 +142,20 @@ typedef struct CustomData {
#define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO)
#define CD_MASK_RECAST (1 << CD_RECAST)
+#ifdef USE_BMESH_FORWARD_COMPAT
+
+/* BMESH ONLY START */
+#define CD_MASK_MPOLY (1 << CD_MPOLY)
+#define CD_MASK_MLOOP (1 << CD_MLOOP)
+#define CD_MASK_SHAPE_KEYINDEX (1 << CD_SHAPE_KEYINDEX)
+#define CD_MASK_SHAPEKEY (1 << CD_SHAPEKEY)
+#define CD_MASK_BWEIGHT (1 << CD_BWEIGHT)
+#define CD_MASK_CREASE (1 << CD_CREASE)
+#define CD_MASK_WEIGHT_MLOOPCOL (1 << CD_WEIGHT_MLOOPCOL)
+/* BMESH ONLY END */
+
+#endif
+
/* CustomData.flag */
/* indicates layer should not be copied by CustomData_from_template or
diff --git a/source/blender/makesdna/DNA_defs.h b/source/blender/makesdna/DNA_defs.h
new file mode 100644
index 00000000000..575938da653
--- /dev/null
+++ b/source/blender/makesdna/DNA_defs.h
@@ -0,0 +1,50 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file DNA_defs.h
+ * \ingroup DNA
+ */
+
+#ifndef DNA_DEFS_H
+#define DNA_DEFS_H
+
+/* makesdna ignores */
+#ifdef DNA_DEPRECATED_ALLOW
+ /* allow use of deprecated items */
+# define DNA_DEPRECATED
+#else
+# ifndef DNA_DEPRECATED
+# ifdef __GNUC__
+# define DNA_DEPRECATED __attribute__ ((deprecated))
+# else
+ /* TODO, msvc & others */
+# define DNA_DEPRECATED
+# endif
+# endif
+#endif
+
+/* hrmf, we need a better include then this */
+#include "../blenloader/BLO_sys_types.h" /* needed for int64_t only! */
+
+#define USE_BMESH_FORWARD_COMPAT
+
+#endif /* DNA_DEFS_H */
diff --git a/source/blender/makesdna/DNA_documentation.h b/source/blender/makesdna/DNA_documentation.h
index 206a45fad5d..c1d6ee4aec3 100644
--- a/source/blender/makesdna/DNA_documentation.h
+++ b/source/blender/makesdna/DNA_documentation.h
@@ -63,14 +63,12 @@
* \section dnanote NOTE
- PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN
-
- intern/dna_genfile.c
- (ton)
+ * PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN
+ *
+ * intern/dna_genfile.c
+ * (ton)
*/
-
/* This file has intentionally no definitions or implementation. */
-
diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h
index fdfd1e2b754..d58e11d9640 100644
--- a/source/blender/makesdna/DNA_dynamicpaint_types.h
+++ b/source/blender/makesdna/DNA_dynamicpaint_types.h
@@ -1,15 +1,30 @@
-/**
-* ***** BEGIN GPL LICENSE BLOCK *****
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* Contributor(s): Miika Hämäläinen
-*
-* ***** END GPL LICENSE BLOCK *****
-*/
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Miika Hämäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file DNA_dynamicpaint_types.h
+ * \ingroup DNA
+ */
+
#ifndef DNA_DYNAMICPAINT_TYPES_H
#define DNA_DYNAMICPAINT_TYPES_H
diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h
index 237360f003e..b7437b5e973 100644
--- a/source/blender/makesdna/DNA_effect_types.h
+++ b/source/blender/makesdna/DNA_effect_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_EFFECT_TYPES_H
-#define DNA_EFFECT_TYPES_H
/** \file DNA_effect_types.h
* \ingroup DNA
*/
+#ifndef DNA_EFFECT_TYPES_H
+#define DNA_EFFECT_TYPES_H
+
/* don't forget, new effects also in writefile.c for dna!!! */
#define PAF_MAXMULT 4
diff --git a/source/blender/makesdna/DNA_fileglobal_types.h b/source/blender/makesdna/DNA_fileglobal_types.h
index c606e5132d2..31ad628d630 100644
--- a/source/blender/makesdna/DNA_fileglobal_types.h
+++ b/source/blender/makesdna/DNA_fileglobal_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_FILEGLOBAL_TYPES_H
-#define DNA_FILEGLOBAL_TYPES_H
/** \file DNA_fileglobal_types.h
* \ingroup DNA
*/
+#ifndef DNA_FILEGLOBAL_TYPES_H
+#define DNA_FILEGLOBAL_TYPES_H
+
struct bScreen;
struct Scene;
diff --git a/source/blender/makesdna/DNA_genfile.h b/source/blender/makesdna/DNA_genfile.h
index 4f8b2343a9f..6516b50402d 100644
--- a/source/blender/makesdna/DNA_genfile.h
+++ b/source/blender/makesdna/DNA_genfile.h
@@ -25,19 +25,37 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef GENFILE_H
-#define GENFILE_H
-
/** \file DNA_genfile.h
* \ingroup DNA
* \brief blenloader genfile private function prototypes
*/
+#ifndef DNA_GENFILE_H
+#define DNA_GENFILE_H
+
struct SDNA;
extern unsigned char DNAstr[]; /* DNA.c */
extern int DNAlen;
+typedef enum eSDNA_Type {
+ SDNA_TYPE_CHAR = 0,
+ SDNA_TYPE_UCHAR = 1,
+ SDNA_TYPE_SHORT = 2,
+ SDNA_TYPE_USHORT = 3,
+ SDNA_TYPE_INT = 4,
+ SDNA_TYPE_LONG = 5,
+ SDNA_TYPE_ULONG = 6,
+ SDNA_TYPE_FLOAT = 7,
+ SDNA_TYPE_DOUBLE = 8,
+ SDNA_TYPE_INT64 = 9,
+ SDNA_TYPE_UINT64 = 10
+ /* ,SDNA_TYPE_VOID = 11 */ /* nothing uses yet */
+} eSDNA_Type;
+
+/* define so switch statements don't complain */
+#define SDNA_TYPE_VOID 11
+
struct SDNA *DNA_sdna_from_data(void *data, int datalen, int do_endian_swap);
void DNA_sdna_free(struct SDNA *sdna);
@@ -49,6 +67,7 @@ void *DNA_struct_reconstruct(struct SDNA *newsdna, struct SDNA *oldsdna, char *c
int DNA_elem_array_size(const char *astr, int len);
int DNA_elem_offset(struct SDNA *sdna, const char *stype, const char *vartype, const char *name);
-#endif
+int DNA_elem_type_size(const eSDNA_Type elem_nr);
+#endif
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index a4d0b3685e3..71f0dbb60b1 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -22,13 +22,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_GPENCIL_TYPES_H
-#define DNA_GPENCIL_TYPES_H
/** \file DNA_gpencil_types.h
* \ingroup DNA
*/
+#ifndef DNA_GPENCIL_TYPES_H
+#define DNA_GPENCIL_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_group_types.h b/source/blender/makesdna/DNA_group_types.h
index e174900aa8d..ab42086d6d0 100644
--- a/source/blender/makesdna/DNA_group_types.h
+++ b/source/blender/makesdna/DNA_group_types.h
@@ -27,13 +27,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_GROUP_TYPES_H
-#define DNA_GROUP_TYPES_H
/** \file DNA_group_types.h
* \ingroup DNA
*/
+#ifndef DNA_GROUP_TYPES_H
+#define DNA_GROUP_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 4c3cc0ac0eb..a1b0ab06ecd 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_IMAGE_TYPES_H
-#define DNA_IMAGE_TYPES_H
/** \file DNA_image_types.h
* \ingroup DNA
*/
+#ifndef DNA_IMAGE_TYPES_H
+#define DNA_IMAGE_TYPES_H
+
#include "DNA_ID.h"
struct PackedFile;
@@ -111,14 +112,14 @@ typedef struct Image {
/* **************** IMAGE ********************* */
/* Image.flag */
-#define IMA_FIELDS 1
-#define IMA_STD_FIELD 2
-#define IMA_DO_PREMUL 4
-
-#define IMA_REFLECT 16
-#define IMA_NOCOLLECT 32
-#define IMA_DEPRECATED 64
-#define IMA_OLD_PREMUL 128
+#define IMA_FIELDS 1
+#define IMA_STD_FIELD 2
+#define IMA_DO_PREMUL 4
+#define IMA_REFLECT 16
+#define IMA_NOCOLLECT 32
+#define IMA_DEPRECATED 64
+#define IMA_OLD_PREMUL 128
+#define IMA_CM_PREDIVIDE 256
/* Image.tpageflag */
#define IMA_TILES 1
diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h
index 105aa4280ef..12fb9b92602 100644
--- a/source/blender/makesdna/DNA_key_types.h
+++ b/source/blender/makesdna/DNA_key_types.h
@@ -31,6 +31,7 @@
* \ingroup DNA
*/
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -62,10 +63,10 @@ typedef struct Key {
KeyBlock *refkey;
char elemstr[32];
int elemsize;
- float curval;
+ float curval DNA_DEPRECATED;
ListBase block;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
ID *from;
@@ -93,4 +94,3 @@ typedef struct Key {
#define KEYBLOCK_LOCKED (1<<2)
#endif
-
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 91930f5766e..18fbde8a3c3 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -24,13 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_LAMP_TYPES_H
-#define DNA_LAMP_TYPES_H
/** \file DNA_lamp_types.h
* \ingroup DNA
*/
+#ifndef DNA_LAMP_TYPES_H
+#define DNA_LAMP_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
#ifndef MAX_MTEX
@@ -97,7 +99,7 @@ typedef struct Lamp {
short sky_colorspace;
char pad4[6];
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct MTex *mtex[18]; /* MAX_MTEX */
short pr_texture, use_nodes;
char pad6[4];
diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h
index f694e611089..2a67afb5708 100644
--- a/source/blender/makesdna/DNA_lattice_types.h
+++ b/source/blender/makesdna/DNA_lattice_types.h
@@ -24,13 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_LATTICE_TYPES_H
-#define DNA_LATTICE_TYPES_H
/** \file DNA_lattice_types.h
* \ingroup DNA
*/
+#ifndef DNA_LATTICE_TYPES_H
+#define DNA_LATTICE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
struct AnimData;
@@ -60,7 +62,7 @@ typedef struct Lattice {
struct BPoint *def;
- struct Ipo *ipo; /* XXX: depreceated... old animation system */
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Key *key;
struct MDeformVert *dvert;
diff --git a/source/blender/makesdna/DNA_listBase.h b/source/blender/makesdna/DNA_listBase.h
index 6a472272382..99ad6f41e96 100644
--- a/source/blender/makesdna/DNA_listBase.h
+++ b/source/blender/makesdna/DNA_listBase.h
@@ -27,15 +27,15 @@
*
*/
-#ifndef DNA_LISTBASE_H
-#define DNA_LISTBASE_H
-
/** \file DNA_listBase.h
* \ingroup DNA
* \brief These structs are the foundation for all linked lists in the
* library system.
*/
+#ifndef DNA_LISTBASE_H
+#define DNA_LISTBASE_H
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index ea168d953bc..55e9328a72a 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -24,13 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_MATERIAL_TYPES_H
-#define DNA_MATERIAL_TYPES_H
/** \file DNA_material_types.h
* \ingroup DNA
*/
+#ifndef DNA_MATERIAL_TYPES_H
+#define DNA_MATERIAL_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
#include "DNA_listBase.h"
@@ -150,7 +152,7 @@ typedef struct Material {
struct MTex *mtex[18]; /* MAX_MTEX */
struct bNodeTree *nodetree;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Group *group; /* light group */
struct PreviewImage * preview;
@@ -167,8 +169,8 @@ typedef struct Material {
short sss_flag, sss_preset;
int mapto_textured; /* render-time cache to optimise texture lookups */
- short shadowonly_flag; /* "shadowsonly" type */
- short index; /* custom index for render passes */
+ short shadowonly_flag; /* "shadowsonly" type */
+ short index; /* custom index for render passes */
ListBase gpumaterial; /* runtime */
} Material;
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index bb67b46a7e5..1dc96190c67 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -24,17 +24,21 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_MESH_TYPES_H
-#define DNA_MESH_TYPES_H
/** \file DNA_mesh_types.h
* \ingroup DNA
*/
+#ifndef DNA_MESH_TYPES_H
+#define DNA_MESH_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
#include "DNA_customdata_types.h"
+#include "DNA_defs.h" /* USE_BMESH_FORWARD_COMPAT */
+
struct DerivedMesh;
struct Ipo;
struct Key;
@@ -46,8 +50,12 @@ struct MCol;
struct MSticky;
struct Mesh;
struct OcInfo;
+struct MPoly;
+struct MTexPoly;
+struct MLoop;
+struct MLoopUV;
+struct MLoopCol;
struct Multires;
-struct PartialVisibility;
struct EditMesh;
struct AnimData;
@@ -57,10 +65,21 @@ typedef struct Mesh {
struct BoundBox *bb;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Key *key;
struct Material **mat;
+/*#ifdef USE_BMESH_FORWARD_COMPAT*/ /* XXX - ifdefs dont work here! */
+/* BMESH ONLY */
+ /*new face structures*/
+ struct MPoly *mpoly;
+ struct MTexPoly *mtpoly;
+ struct MLoop *mloop;
+ struct MLoopUV *mloopuv;
+ struct MLoopCol *mloopcol;
+/* END BMESH ONLY */
+/*#endif*/
+
struct MFace *mface; /* array of mesh object mode faces */
struct MTFace *mtface; /* store face UV's and texture here */
struct TFace *tface; /* depecrated, use mtface */
@@ -76,8 +95,20 @@ typedef struct Mesh {
struct CustomData vdata, edata, fdata;
+/*#ifdef USE_BMESH_FORWARD_COMPAT*/ /* XXX - ifdefs dont work here! */
+/* BMESH ONLY */
+ struct CustomData pdata, ldata;
+/* END BMESH ONLY */
+/*#endif*/
+
int totvert, totedge, totface, totselect;
-
+
+/*#ifdef USE_BMESH_FORWARD_COMPAT*/
+/* BMESH ONLY */
+ int totpoly, totloop;
+/* END BMESH ONLY */
+/*#endif*/ /* XXX - ifdefs dont work here! */
+
/* the last selected vertex/edge/face are used for the active face however
* this means the active face must always be selected, this is to keep track
* of the last selected face and is similar to the old active face flag where
@@ -92,14 +123,13 @@ typedef struct Mesh {
short texflag, drawflag;
short smoothresh, flag;
- short subdiv, subdivr;
- char subsurftype; /* only kept for backwards compat, not used anymore */
+ short subdiv DNA_DEPRECATED, subdivr DNA_DEPRECATED;
+ char subsurftype DNA_DEPRECATED; /* only kept for backwards compat, not used anymore */
char editflag;
short totcol;
- struct Multires *mr; /* deprecated multiresolution modeling data, only keep for loading old files */
- struct PartialVisibility *pv;
+ struct Multires *mr DNA_DEPRECATED; /* deprecated multiresolution modeling data, only keep for loading old files */
} Mesh;
/* deprecated by MTFace, only here for file reading */
@@ -163,6 +193,9 @@ typedef struct TFace {
#define ME_DRAWEXTRA_FACEAREA (1 << 11)
#define ME_DRAWEXTRA_FACEANG (1 << 12)
+/* debug only option */
+#define ME_DRAWEXTRA_INDICES (1 << 13)
+
/* old global flags:
#define G_DRAWEDGES (1 << 18)
#define G_DRAWFACES (1 << 7)
@@ -190,4 +223,12 @@ typedef struct TFace {
#define MESH_MAX_VERTS 2000000000L
+/* this is so we can save bmesh files that load in trunk, ignoring NGons
+ * will eventually be removed */
+
+#if 0 /* enable in bmesh branch only for now */
+#define USE_BMESH_SAVE_AS_COMPAT
+#endif
+
+
#endif
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index be7b985412f..ce9d1538fed 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_MESHDATA_TYPES_H
-#define DNA_MESHDATA_TYPES_H
/** \file DNA_meshdata_types.h
* \ingroup DNA
*/
+#ifndef DNA_MESHDATA_TYPES_H
+#define DNA_MESHDATA_TYPES_H
+
#include "DNA_customdata_types.h"
#include "DNA_listBase.h"
@@ -72,21 +73,41 @@ typedef struct MCol {
char a, r, g, b;
} MCol;
+#ifdef USE_BMESH_FORWARD_COMPAT
+
+/*new face structure, replaces MFace, which is now
+ only used for storing tesselations.*/
+typedef struct MPoly {
+ /* offset into loop array and number of loops in the face */
+ int loopstart;
+ int totloop; /* keep signed since we need to subtract when getting the previous loop */
+ short mat_nr;
+ char flag, pad;
+} MPoly;
+
+/*the e here is because we want to move away from
+ relying on edge hashes.*/
+typedef struct MLoop {
+ unsigned int v; /*vertex index*/
+ unsigned int e; /*edge index*/
+} MLoop;
+
+#endif /* USE_BMESH_FORWARD_COMPAT */
+
/*bmesh custom data stuff*/
-typedef struct MTexPoly{
+typedef struct MTexPoly {
struct Image *tpage;
char flag, transp;
short mode,tile,unwrap;
-}MTexPoly;
+} MTexPoly;
-typedef struct MLoopUV{
+typedef struct MLoopUV {
float uv[2];
-}MLoopUV;
+} MLoopUV;
-typedef struct MLoopCol{
+typedef struct MLoopCol {
char a, r, g, b;
- int pad; /*waste!*/
-}MLoopCol;
+} MLoopCol;
typedef struct MSticky {
float co[2];
@@ -94,7 +115,7 @@ typedef struct MSticky {
typedef struct MSelect {
int index;
- int type;
+ int type; /* EDITVERT/EDITEDGE/EDITFACE */
} MSelect;
typedef struct MTFace {
@@ -105,13 +126,13 @@ typedef struct MTFace {
} MTFace;
/*Custom Data Properties*/
-typedef struct MFloatProperty{
+typedef struct MFloatProperty {
float f;
} MFloatProperty;
-typedef struct MIntProperty{
+typedef struct MIntProperty {
int i;
} MIntProperty;
-typedef struct MStringProperty{
+typedef struct MStringProperty {
char s[256];
} MStringProperty;
@@ -174,15 +195,7 @@ typedef struct Multires {
/** End Multires **/
-typedef struct PartialVisibility {
- unsigned int *vert_map; /* vert_map[Old Index]= New Index */
- int *edge_map; /* edge_map[Old Index]= New Index, -1= hidden */
- MFace *old_faces;
- MEdge *old_edges;
- unsigned int totface, totedge, totvert, pad;
-} PartialVisibility;
-
-typedef struct MRecast{
+typedef struct MRecast {
int i;
} MRecast;
@@ -200,15 +213,10 @@ typedef struct MRecast{
/* reserve 16 for ME_HIDE */
#define ME_EDGERENDER (1<<5)
#define ME_LOOSEEDGE (1<<7)
-#define ME_SEAM_LAST (1<<8)
-#define ME_SHARP (1<<9)
+/* #define ME_SEAM_LAST (1<<8) */ /* UNUSED */
+#define ME_SHARP (1<<9) /* only reason this flag remains a 'short' */
/* puno = vertexnormal (mface) */
-/* render assumes flips to be ordered like this */
-#define ME_FLIPV1 1
-#define ME_FLIPV2 2
-#define ME_FLIPV3 4
-#define ME_FLIPV4 8
#define ME_PROJXY 16
#define ME_PROJXZ 32
#define ME_PROJYZ 64
@@ -224,11 +232,6 @@ typedef struct MRecast{
#define ME_SMOOTH 1
#define ME_FACE_SEL 2
/* flag ME_HIDE==16 is used here too */
-/* mselect->type */
-#define ME_VSEl 0
-#define ME_ESEl 1
-#define ME_FSEL 2
-
/* mtface->flag */
#define TF_SELECT 1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
#define TF_ACTIVE 2 /* deprecated! */
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index 12345ede3c4..ae658cee8f5 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_META_TYPES_H
-#define DNA_META_TYPES_H
/** \file DNA_meta_types.h
* \ingroup DNA
*/
+#ifndef DNA_META_TYPES_H
+#define DNA_META_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -70,7 +71,7 @@ typedef struct MetaBall {
ListBase elems;
ListBase disp;
ListBase *editelems; /* not saved in files, note we use pointer for editmode check */
- struct Ipo *ipo; // XXX... depreceated (old animation system)
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
/* material of the mother ball will define the material used of all others */
struct Material **mat;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 4abbbd7146d..5fe9851738a 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -18,13 +18,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_MODIFIER_TYPES_H
-#define DNA_MODIFIER_TYPES_H
-
/** \file DNA_modifier_types.h
* \ingroup DNA
*/
+#ifndef DNA_MODIFIER_TYPES_H
+#define DNA_MODIFIER_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
@@ -75,6 +76,7 @@ typedef enum ModifierType {
eModifierType_WeightVGProximity,
eModifierType_Ocean,
eModifierType_DynamicPaint,
+ eModifierType_Remesh,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -238,7 +240,7 @@ typedef struct ArrayModifierData {
typedef struct MirrorModifierData {
ModifierData modifier;
- short axis; /* deprecated, use flag instead */
+ short axis DNA_DEPRECATED; /* deprecated, use flag instead */
short flag;
float tolerance;
struct Object *mirror_ob;
@@ -703,7 +705,7 @@ typedef struct SimpleDeformModifierData {
#define MOD_SIMPLEDEFORM_LOCK_AXIS_Y (1<<1)
/* indicates whether simple deform should use the local
- coordinates or global coordinates of origin */
+ * coordinates or global coordinates of origin */
#define MOD_SIMPLEDEFORM_ORIGIN_LOCAL (1<<0)
#define MOD_UVPROJECT_MAX 10
@@ -1031,4 +1033,39 @@ typedef struct DynamicPaintModifierData {
int pad;
} DynamicPaintModifierData;
+/* Remesh modifier */
+
+typedef enum RemeshModifierFlags {
+ MOD_REMESH_FLOOD_FILL = 1,
+} RemeshModifierFlags;
+
+typedef enum RemeshModifierMode {
+ /* blocky */
+ MOD_REMESH_CENTROID = 0,
+ /* smooth */
+ MOD_REMESH_MASS_POINT = 1,
+ /* keeps sharp edges */
+ MOD_REMESH_SHARP_FEATURES = 2,
+} RemeshModifierMode;
+
+typedef struct RemeshModifierData {
+ ModifierData modifier;
+
+ /* floodfill option, controls how small components can be
+ before they are removed */
+ float threshold;
+
+ /* ratio between size of model and grid */
+ float scale;
+
+ float hermite_num;
+
+ /* octree depth */
+ char depth;
+
+ char flag;
+ char mode;
+ char pad;
+} RemeshModifierData;
+
#endif
diff --git a/source/blender/makesdna/DNA_movieclip_types.h b/source/blender/makesdna/DNA_movieclip_types.h
index fc21f26fa32..5d2f2f5978f 100644
--- a/source/blender/makesdna/DNA_movieclip_types.h
+++ b/source/blender/makesdna/DNA_movieclip_types.h
@@ -26,15 +26,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_MOVIECLIP_TYPES_H
-#define DNA_MOVIECLIP_TYPES_H
-
/** \file DNA_movieclip_types.h
* \ingroup DNA
* \since may-2011
* \author Sergey Sharybin
*/
+#ifndef DNA_MOVIECLIP_TYPES_H
+#define DNA_MOVIECLIP_TYPES_H
+
#include "DNA_ID.h"
#include "DNA_tracking_types.h"
@@ -113,6 +113,8 @@ typedef struct MovieClipScopes {
#define MCLIP_USE_PROXY (1<<0)
#define MCLIP_USE_PROXY_CUSTOM_DIR (1<<1)
+#define MCLIP_TIMECODE_FLAGS (MCLIP_USE_PROXY|MCLIP_USE_PROXY_CUSTOM_DIR)
+
/* MovieClip->render_size */
#define MCLIP_PROXY_RENDER_SIZE_FULL 0
#define MCLIP_PROXY_RENDER_SIZE_25 1
diff --git a/source/blender/makesdna/DNA_nla_types.h b/source/blender/makesdna/DNA_nla_types.h
index b92cf5c67e4..a28097e8449 100644
--- a/source/blender/makesdna/DNA_nla_types.h
+++ b/source/blender/makesdna/DNA_nla_types.h
@@ -25,13 +25,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_NLA_TYPES_H
-#define DNA_NLA_TYPES_H
-
/** \file DNA_nla_types.h
* \ingroup DNA
*/
+#ifndef DNA_NLA_TYPES_H
+#define DNA_NLA_TYPES_H
+
#include "DNA_listBase.h"
struct bAction;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index a97d7c057de..757a3268df4 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -25,13 +25,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_NODE_TYPES_H
-#define DNA_NODE_TYPES_H
-
/** \file DNA_node_types.h
* \ingroup DNA
*/
+#ifndef DNA_NODE_TYPES_H
+#define DNA_NODE_TYPES_H
+
#include "DNA_ID.h"
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
@@ -102,7 +102,7 @@ typedef struct bNodeSocket {
/* internal data to retrieve relations and groups */
int own_index; /* group socket identifiers, to find matching pairs after reading files */
- int to_index; /* XXX deprecated, only used for restoring old group node links */
+ int to_index DNA_DEPRECATED; /* XXX deprecated, only used for restoring old group node links */
struct bNodeSocket *groupsock;
struct bNodeLink *link; /* a link pointer, set in ntreeUpdateTree */
@@ -439,12 +439,12 @@ typedef struct NodeChroma {
float t1,t2,t3;
float fsize,fstrength,falpha;
float key[4];
- short algorithm, channel;
+ short algorithm, channel;
} NodeChroma;
typedef struct NodeTwoXYs {
short x1, x2, y1, y2;
- float fac_x1, fac_x2, fac_y1, fac_y2;
+ float fac_x1, fac_x2, fac_y1, fac_y2;
} NodeTwoXYs;
typedef struct NodeTwoFloats {
@@ -513,7 +513,7 @@ typedef struct NodeColorspill {
short limchan, unspill;
float limscale;
float uspillr, uspillg, uspillb;
-}NodeColorspill;
+} NodeColorspill;
typedef struct NodeTexBase {
TexMapping tex_mapping;
diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h
index fd6f4afd593..022dc53848f 100644
--- a/source/blender/makesdna/DNA_object_fluidsim.h
+++ b/source/blender/makesdna/DNA_object_fluidsim.h
@@ -26,13 +26,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_OBJECT_FLUIDSIM_H
-#define DNA_OBJECT_FLUIDSIM_H
/** \file DNA_object_fluidsim.h
* \ingroup DNA
*/
+#ifndef DNA_OBJECT_FLUIDSIM_H
+#define DNA_OBJECT_FLUIDSIM_H
+
#include "DNA_ID.h"
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index d45a8f83f76..5875ff30bcc 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -26,13 +26,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_OBJECT_FORCE_H
-#define DNA_OBJECT_FORCE_H
/** \file DNA_object_force.h
* \ingroup DNA
*/
+#ifndef DNA_OBJECT_FORCE_H
+#define DNA_OBJECT_FORCE_H
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -421,8 +422,8 @@ typedef struct SoftBody {
#define OB_SB_SELF 512
#define OB_SB_FACECOLL 1024
#define OB_SB_EDGECOLL 2048
-#define OB_SB_COLLFINAL 4096 /* deprecated */
-#define OB_SB_BIG_UI 8192
+/* #define OB_SB_COLLFINAL 4096 */ /* deprecated */
+/* #define OB_SB_BIG_UI 8192 */ /* deprecated */
#define OB_SB_AERO_ANGLE 16384
/* sb->solverflags */
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 29568fdd0fb..7f1239195ec 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -24,14 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_OBJECT_TYPES_H
-#define DNA_OBJECT_TYPES_H
/** \file DNA_object_types.h
* \ingroup DNA
* \brief Object is a sort of wrapper for general info.
*/
+#ifndef DNA_OBJECT_TYPES_H
+#define DNA_OBJECT_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
#include "DNA_action_types.h" /* bAnimVizSettings */
@@ -110,10 +112,10 @@ typedef struct Object {
/* if ob->proxy (or proxy_group), this object is proxy for object ob->proxy */
/* proxy_from is set in target back to the proxy. */
struct Object *proxy, *proxy_group, *proxy_from;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
/* struct Path *path; */
struct BoundBox *bb;
- struct bAction *action; // XXX depreceated... old animation system
+ struct bAction *action DNA_DEPRECATED; // XXX depreceated... old animation system
struct bAction *poselib;
struct bPose *pose; /* pose data, armature objects only */
void *data; /* pointer to objects data - an 'ID' or NULL */
@@ -123,8 +125,8 @@ typedef struct Object {
bAnimVizSettings avs; /* settings for visualisation of object-transform animation */
bMotionPath *mpath; /* motion path cache for this object */
- ListBase constraintChannels; // XXX depreceated... old animation system
- ListBase effect; // XXX depreceated... keep for readfile
+ ListBase constraintChannels DNA_DEPRECATED; // XXX depreceated... old animation system
+ ListBase effect DNA_DEPRECATED; // XXX depreceated... keep for readfile
ListBase disp; /* list of DispList, used by lattice, metaballs curve & surfaces */
ListBase defbase; /* list of bDeformGroup (vertex groups) names and flag only */
ListBase modifiers; /* list of ModifierData structures */
@@ -134,13 +136,15 @@ typedef struct Object {
/* materials */
struct Material **mat; /* material slots */
- char *matbits; /* 1 if material linked to object */
+ char *matbits; /* a boolean field, with each byte 1 if corrusponding material is linked to object */
int totcol; /* copy of mesh or curve or meta */
int actcol; /* currently selected material in the UI */
/* rot en drot have to be together! (transform('r' en 's')) */
float loc[3], dloc[3], orig[3];
- float size[3], dsize[3]; /* scale and delta scale */
+ float size[3]; /* scale infact */
+ float dsize[3] DNA_DEPRECATED ; /* DEPRECATED, 2.60 and older only */
+ float dscale[3]; /* ack!, changing */
float rot[3], drot[3]; /* euler rotation */
float quat[4], dquat[4]; /* quaternion rotation */
float rotAxis[3], drotAxis[3]; /* axis angle rotation - axis part */
@@ -158,8 +162,10 @@ typedef struct Object {
unsigned int lay; /* copy of Base's layer in the scene */
+ int pad6;
+
short flag; /* copy of Base */
- short colbits; /* deprecated */
+ short colbits DNA_DEPRECATED; /* deprecated */
short transflag, protectflag; /* transformation settings and transform locks */
short trackflag, upflag;
@@ -214,7 +220,7 @@ typedef struct Object {
ListBase controllers; /* game logic controllers */
ListBase actuators; /* game logic actuators */
- float bbsize[3];
+ float bbsize[3] DNA_DEPRECATED;
short index; /* custom index, for renderpasses */
unsigned short actdef; /* current deformation group, note: index starts at 1 */
float col[4]; /* object color */
@@ -229,8 +235,8 @@ typedef struct Object {
float anisotropicFriction[3];
ListBase constraints; /* object constraints */
- ListBase nlastrips; // XXX depreceated... old animation system
- ListBase hooks; // XXX depreceated... old animation system
+ ListBase nlastrips DNA_DEPRECATED; // XXX depreceated... old animation system
+ ListBase hooks DNA_DEPRECATED; // XXX depreceated... old animation system
ListBase particlesystem; /* particle systems */
struct PartDeflect *pd; /* particle deflector/attractor/collision data */
@@ -245,8 +251,8 @@ typedef struct Object {
struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
struct DerivedMesh *derivedDeform, *derivedFinal;
- unsigned int lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
- unsigned int customdata_mask; /* (extra) custom data layer mask to use for creating derivedmesh, set by depsgraph */
+ uint64_t lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
+ uint64_t customdata_mask; /* (extra) custom data layer mask to use for creating derivedmesh, set by depsgraph */
unsigned int state; /* bit masks of game controllers that are active */
unsigned int init_state; /* bit masks of initial state as recorded by the users */
diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h
index ec8f85ea91f..ee3903c3b40 100644
--- a/source/blender/makesdna/DNA_outliner_types.h
+++ b/source/blender/makesdna/DNA_outliner_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_OUTLINER_TYPES_H
-#define DNA_OUTLINER_TYPES_H
/** \file DNA_outliner_types.h
* \ingroup DNA
*/
+#ifndef DNA_OUTLINER_TYPES_H
+#define DNA_OUTLINER_TYPES_H
+
#include "DNA_listBase.h"
struct ID;
diff --git a/source/blender/makesdna/DNA_packedFile_types.h b/source/blender/makesdna/DNA_packedFile_types.h
index bbbbf39619b..91134c2c575 100644
--- a/source/blender/makesdna/DNA_packedFile_types.h
+++ b/source/blender/makesdna/DNA_packedFile_types.h
@@ -25,15 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_PACKEDFILE_TYPES_H
-#define DNA_PACKEDFILE_TYPES_H
-
/** \file DNA_packedFile_types.h
* \ingroup DNA
* \author nzc
* \since 12-oct-2000 nzc
*/
+#ifndef DNA_PACKEDFILE_TYPES_H
+#define DNA_PACKEDFILE_TYPES_H
+
typedef struct PackedFile {
int size;
int seek;
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 11a6460b1fc..07efd17df7f 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -25,13 +25,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_PARTICLE_TYPES_H
-#define DNA_PARTICLE_TYPES_H
-
/** \file DNA_particle_types.h
* \ingroup DNA
*/
+#ifndef DNA_PARTICLE_TYPES_H
+#define DNA_PARTICLE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
#include "DNA_boid_types.h"
@@ -64,7 +65,7 @@ typedef struct BoidParticle {
typedef struct ParticleSpring {
float rest_length;
unsigned int particle_index[2], delete_flag;
-}ParticleSpring;
+} ParticleSpring;
/* Child particles are created around or between parent particles */
typedef struct ChildParticle {
@@ -225,10 +226,10 @@ typedef struct ParticleSettings {
struct Group *dup_group;
struct ListBase dupliweights;
- struct Group *eff_group; // deprecated
+ struct Group *eff_group DNA_DEPRECATED; // deprecated
struct Object *dup_ob;
struct Object *bb_ob;
- struct Ipo *ipo; // xxx depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct PartDeflect *pd;
struct PartDeflect *pd2;
} ParticleSettings;
@@ -294,7 +295,7 @@ typedef struct ParticleSystem
float dt_frac; /* current time step, as a fraction of a frame */
float _pad; /* spare capacity */
-}ParticleSystem;
+} ParticleSystem;
/* part->type */
/* hair is allways baked static in object/geometry space */
diff --git a/source/blender/makesdna/DNA_property_types.h b/source/blender/makesdna/DNA_property_types.h
index 004016606a5..e74ae41a421 100644
--- a/source/blender/makesdna/DNA_property_types.h
+++ b/source/blender/makesdna/DNA_property_types.h
@@ -27,8 +27,6 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_PROPERTY_TYPES_H
-#define DNA_PROPERTY_TYPES_H
/** \file DNA_property_types.h
* \ingroup DNA
@@ -38,6 +36,9 @@
* hierarchy here is a bit strange, and not desirable.
*/
+#ifndef DNA_PROPERTY_TYPES_H
+#define DNA_PROPERTY_TYPES_H
+
/* ********************* PROPERTY ************************ */
typedef struct bProperty {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index faacde9e44f..9b49bc53ef3 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -24,13 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SCENE_TYPES_H
-#define DNA_SCENE_TYPES_H
/** \file DNA_scene_types.h
* \ingroup DNA
*/
+#ifndef DNA_SCENE_TYPES_H
+#define DNA_SCENE_TYPES_H
+
+#include "DNA_defs.h"
+
// XXX, temp feature - campbell
#define DURIAN_CAMERA_SWITCH
@@ -330,12 +333,18 @@ typedef struct RenderData {
/** For UR edge rendering: give the edges this color */
float edgeR, edgeG, edgeB;
-
- short fullscreen, xplay, yplay, freqplay; /* standalone player */ // XXX deprecated since 2.5
- short depth, attrib; /* standalone player */ // XXX deprecated since 2.5
+
+
+ /* standalone player */ // XXX deprecated since 2.5
+ short fullscreen DNA_DEPRECATED, xplay DNA_DEPRECATED, yplay DNA_DEPRECATED;
+ short freqplay DNA_DEPRECATED;
+ /* standalone player */ // XXX deprecated since 2.5
+ short depth DNA_DEPRECATED, attrib DNA_DEPRECATED;
+
+
int frame_step; /* frames to jump during render/playback */
- short stereomode; /* standalone player stereo settings */ // XXX deprecated since 2.5
+ short stereomode DNA_DEPRECATED; /* standalone player stereo settings */ // XXX deprecated since 2.5
short dimensionspreset; /* for the dimensions presets menu */
@@ -360,7 +369,7 @@ typedef struct RenderData {
*/
short yparts;
- short planes, imtype, subimtype, quality; /*deprecated!*/
+ short planes DNA_DEPRECATED, imtype DNA_DEPRECATED, subimtype DNA_DEPRECATED, quality DNA_DEPRECATED; /*deprecated!*/
/**
* Render to image editor, fullscreen or to new window.
@@ -387,8 +396,7 @@ typedef struct RenderData {
*/
short raytrace_structure;
- /* renderer (deprecated) */
- short renderer;
+ short pad1;
/* octree resolution */
short ocres;
@@ -434,7 +442,7 @@ typedef struct RenderData {
/* color management settings - color profiles, gamma correction, etc */
int color_mgt_flag;
- /** post-production settings. Depricated, but here for upwards compat (initialized to 1) */
+ /** post-production settings. deprecated, but here for upwards compat (initialized to 1) */
float postgamma, posthue, postsat;
/* Dither noise intensity */
@@ -473,19 +481,19 @@ typedef struct RenderData {
float simplify_aosss;
/* cineon */
- short cineonwhite, cineonblack; /*deprecated*/
- float cineongamma; /*deprecated*/
+ short cineonwhite DNA_DEPRECATED, cineonblack DNA_DEPRECATED; /*deprecated*/
+ float cineongamma DNA_DEPRECATED; /*deprecated*/
/* jpeg2000 */
- short jp2_preset, jp2_depth; /*deprecated*/
+ short jp2_preset DNA_DEPRECATED, jp2_depth DNA_DEPRECATED; /*deprecated*/
int rpad3;
/* Dome variables */ // XXX deprecated since 2.5
- short domeres, domemode; // XXX deprecated since 2.5
- short domeangle, dometilt; // XXX deprecated since 2.5
- float domeresbuf; // XXX deprecated since 2.5
- float pad2; // XXX deprecated since 2.5
- struct Text *dometext; // XXX deprecated since 2.5
+ short domeres DNA_DEPRECATED, domemode DNA_DEPRECATED; // XXX deprecated since 2.5
+ short domeangle DNA_DEPRECATED, dometilt DNA_DEPRECATED; // XXX deprecated since 2.5
+ float domeresbuf DNA_DEPRECATED; // XXX deprecated since 2.5
+ float pad2;
+ struct Text *dometext DNA_DEPRECATED; // XXX deprecated since 2.5
/* render engine */
char engine[32];
@@ -575,7 +583,7 @@ typedef struct GameData {
short mode, matmode;
short occlusionRes; /* resolution of occlusion Z buffer in pixel */
short physicsEngine;
- short pad[2];
+ short exitkey, pad;
short ticrate, maxlogicstep, physubstep, maxphystep;
short obstacleSimulation, pad1;
float levelHeight;
@@ -744,7 +752,7 @@ typedef struct VPaint {
#define VP_NORMALS 8
#define VP_SPRAY 16
-// #define VP_MIRROR_X 32 // depricated in 2.5x use (me->editflag & ME_EDIT_MIRROR_X)
+// #define VP_MIRROR_X 32 // deprecated in 2.5x use (me->editflag & ME_EDIT_MIRROR_X)
#define VP_ONLYVGROUP 128
@@ -914,8 +922,6 @@ typedef struct Scene {
unsigned int lay; /* bitflags for layer visibility */
int layact; /* active layer */
unsigned int lay_updated; /* runtime flag, has layer ever been updated since load? */
- unsigned int customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
- unsigned int customdata_mask_modal; /* XXX. same as above but for temp operator use (gl renders) */
short flag; /* various settings */
@@ -956,7 +962,7 @@ typedef struct Scene {
ListBase keyingsets; /* KeyingSets for the given frame */
/* Game Settings */
- struct GameFraming framing; // XXX deprecated since 2.5
+ struct GameFraming framing DNA_DEPRECATED; // XXX deprecated since 2.5
struct GameData gm;
/* Units */
@@ -970,6 +976,9 @@ typedef struct Scene {
/* Movie Tracking */
struct MovieClip *clip; /* active movie clip */
+
+ uint64_t customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
+ uint64_t customdata_mask_modal; /* XXX. same as above but for temp operator use (gl renders) */
} Scene;
@@ -1034,10 +1043,6 @@ typedef struct Scene {
#define R_FILTER_MITCH 6
#define R_FILTER_FAST_GAUSS 7 /* note, this is only used for nodes at the moment */
-/* yafray: renderer flag (not only exclusive to yafray) */
-#define R_INTERN 0
-#define R_YAFRAY 1
-
/* raytrace structure */
#define R_RAYSTRUCTURE_AUTO 0
#define R_RAYSTRUCTURE_OCTREE 1
@@ -1085,7 +1090,9 @@ typedef struct Scene {
#define R_STAMP_SEQSTRIP 0x0200
#define R_STAMP_RENDERTIME 0x0400
#define R_STAMP_CAMERALENS 0x0800
-#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP|R_STAMP_RENDERTIME|R_STAMP_CAMERALENS)
+#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE| \
+ R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP| \
+ R_STAMP_RENDERTIME|R_STAMP_CAMERALENS)
/* alphamode */
#define R_ADDSKY 0
@@ -1093,7 +1100,8 @@ typedef struct Scene {
#define R_ALPHAKEY 2
/* color_mgt_flag */
-#define R_COLOR_MANAGEMENT 1
+#define R_COLOR_MANAGEMENT (1 << 0)
+#define R_COLOR_MANAGEMENT_PREDIVIDE (1 << 1)
/* subimtype, flag options for imtype */
#define R_OPENEXR_HALF 1 /*deprecated*/
@@ -1143,12 +1151,31 @@ typedef struct Scene {
#define MINAFRAMEF -300000.0f
/* depricate this! */
-#define TESTBASE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
-#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define TESTBASELIB_BGMODE(v3d, scene, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define BASE_EDITABLE_BGMODE(v3d, scene, base) (((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
-#define BASE_VISIBLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & OB_RESTRICT_VIEW)==0)
+#define TESTBASE(v3d, base) ( \
+ ((base)->flag & SELECT) && \
+ ((base)->lay & v3d->lay) && \
+ (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
+#define TESTBASELIB(v3d, base) ( \
+ ((base)->flag & SELECT) && \
+ ((base)->lay & v3d->lay) && \
+ ((base)->object->id.lib==NULL) && \
+ (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
+#define TESTBASELIB_BGMODE(v3d, scene, base) ( \
+ ((base)->flag & SELECT) && \
+ ((base)->lay & (v3d ? v3d->lay : scene->lay)) && \
+ ((base)->object->id.lib==NULL) && \
+ (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
+#define BASE_EDITABLE_BGMODE(v3d, scene, base) ( \
+ ((base)->lay & (v3d ? v3d->lay : scene->lay)) && \
+ ((base)->object->id.lib==NULL) && \
+ (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
+#define BASE_SELECTABLE(v3d, base) ( \
+ (base->lay & v3d->lay) && \
+ (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0 )
+#define BASE_VISIBLE(v3d, base) ( \
+ (base->lay & v3d->lay) && \
+ (base->object->restrictflag & OB_RESTRICT_VIEW)==0 )
+
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last
#define BASACT (scene->basact)
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index c90a0acc273..504c8da7612 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -22,13 +22,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SCREEN_TYPES_H
-#define DNA_SCREEN_TYPES_H
/** \file DNA_screen_types.h
* \ingroup DNA
*/
+#ifndef DNA_SCREEN_TYPES_H
+#define DNA_SCREEN_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_view2d_types.h"
#include "DNA_vec_types.h"
diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index b3419a77aab..462ff8ce045 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SDNA_H
-#define DNA_SDNA_H
/**
* \file DNA_sdna_types.h
* \ingroup DNA
*/
+#ifndef DNA_SDNA_H
+#define DNA_SDNA_H
+
#
#
typedef struct SDNA {
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index 451774b1abb..e7444b06898 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -24,15 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SENSOR_TYPES_H
-#define DNA_SENSOR_TYPES_H
+
/** \file DNA_sensor_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
- *
*/
+#ifndef DNA_SENSOR_TYPES_H
+#define DNA_SENSOR_TYPES_H
+
struct Object;
struct Material;
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 399ae0208bd..aab20dbeee1 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -24,14 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SEQUENCE_TYPES_H
-#define DNA_SEQUENCE_TYPES_H
/** \file DNA_sequence_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
*/
+#ifndef DNA_SEQUENCE_TYPES_H
+#define DNA_SEQUENCE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
@@ -142,7 +144,7 @@ typedef struct Sequence {
Strip *strip;
- struct Ipo *ipo; // xxx depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Scene *scene;
struct Object *scene_camera; /* override scene camera */
@@ -308,7 +310,8 @@ typedef struct SpeedControlVars {
#define SEQ_PROXY_TC_RECORD_RUN 1
#define SEQ_PROXY_TC_FREE_RUN 2
#define SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN 4
-#define SEQ_PROXY_TC_ALL 7
+#define SEQ_PROXY_TC_RECORD_RUN_NO_GAPS 8
+#define SEQ_PROXY_TC_ALL 15
/* seq->type WATCH IT: SEQ_EFFECT BIT is used to determine if this is an effect strip!!! */
#define SEQ_IMAGE 0
@@ -345,9 +348,9 @@ typedef struct SpeedControlVars {
#define SEQ_BLEND_REPLACE 0
/* all other BLEND_MODEs are simple SEQ_EFFECT ids and therefore identical
- to the table above. (Only those effects that handle _exactly_ two inputs,
- otherwise, you can't really blend, right :) !)
-*/
+ * to the table above. (Only those effects that handle _exactly_ two inputs,
+ * otherwise, you can't really blend, right :) !)
+ */
#define SEQ_HAS_PATH(_seq) (ELEM5((_seq)->type, SEQ_MOVIE, SEQ_IMAGE, SEQ_SOUND, SEQ_RAM_SOUND, SEQ_HD_SOUND))
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index 5b3aae6e4a8..ed764c4f644 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SMOKE_TYPES_H
-#define DNA_SMOKE_TYPES_H
/** \file DNA_smoke_types.h
* \ingroup DNA
*/
+#ifndef DNA_SMOKE_TYPES_H
+#define DNA_SMOKE_TYPES_H
+
/* flags */
#define MOD_SMOKE_HIGHRES (1<<1) /* enable high resolution */
#define MOD_SMOKE_DISSOLVE (1<<2) /* let smoke dissolve */
diff --git a/source/blender/makesdna/DNA_sound_types.h b/source/blender/makesdna/DNA_sound_types.h
index b83ab0f9f75..f530730a544 100644
--- a/source/blender/makesdna/DNA_sound_types.h
+++ b/source/blender/makesdna/DNA_sound_types.h
@@ -24,14 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SOUND_TYPES_H
-#define DNA_SOUND_TYPES_H
/** \file DNA_sound_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
*/
+#ifndef DNA_SOUND_TYPES_H
+#define DNA_SOUND_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 01bb6a5235e..d502e56bf10 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -24,14 +24,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SPACE_TYPES_H
-#define DNA_SPACE_TYPES_H
/** \file DNA_space_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
*/
+#ifndef DNA_SPACE_TYPES_H
+#define DNA_SPACE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_color_types.h" /* for Histogram */
#include "DNA_vec_types.h"
@@ -76,17 +78,17 @@ typedef struct SpaceLink {
struct SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale; /* XXX depricate this */
- short blockhandler[8]; /* XXX depricate this */
+ float blockscale DNA_DEPRECATED; /* XXX make deprecated */
+ short blockhandler[8] DNA_DEPRECATED; /* XXX make deprecated */
} SpaceLink;
typedef struct SpaceInfo {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8]; /* XXX depricate this */
+ short blockhandler[8] DNA_DEPRECATED; /* XXX make deprecated */
char rpt_mask;
char pad[7];
@@ -107,10 +109,10 @@ typedef struct SpaceIpo {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
- View2D v2d; /* deprecated, copied to region */
+ short blockhandler[8] DNA_DEPRECATED;
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
struct bDopeSheet *ads; /* settings for filtering animation data (NOTE: we use a pointer due to code-linking issues) */
@@ -128,13 +130,13 @@ typedef struct SpaceButs {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
struct RenderInfo *ri;
- View2D v2d; /* deprecated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
short mainb, mainbo, mainbuser; /* context tabs */
short re_align, align; /* align for panels */
@@ -153,19 +155,19 @@ typedef struct SpaceSeq {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
- View2D v2d; /* deprecated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
- float xof, yof; /* deprecated: offset for drawing the image preview */
+ float xof DNA_DEPRECATED, yof DNA_DEPRECATED; /* deprecated: offset for drawing the image preview */
short mainb; /* weird name for the sequencer subtype (seq, image, luma... etc) */
short render_size;
short chanshown;
short zebra;
int flag;
- float zoom; /* deprecated, handled by View2D now */
+ float zoom DNA_DEPRECATED; /* deprecated, handled by View2D now */
int view; /* see SEQ_VIEW_* below */
int pad;
@@ -232,11 +234,11 @@ typedef struct SpaceOops {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
- View2D v2d; /* deprecated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
ListBase tree;
struct TreeStore *treestore;
@@ -283,25 +285,25 @@ typedef struct SpaceNla {
struct SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
short autosnap; /* this uses the same settings as autosnap for Action Editor */
short flag;
int pad;
struct bDopeSheet *ads;
- View2D v2d; /* deprecated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
} SpaceNla;
typedef struct SpaceText {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
struct Text *text;
@@ -352,7 +354,7 @@ typedef struct SpaceScript {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
struct Script *script;
short flags, menunr;
@@ -372,31 +374,29 @@ typedef struct SpaceTime {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
-
- View2D v2d; /* deprecated, copied to region */
+ float blockscale DNA_DEPRECATED;
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
+
ListBase caches;
- int cache_display, pad;
-
- int flag, redraws; /* redraws is deprecated... moved to screen */
-
+
+ int cache_display;
+ int flag;
} SpaceTime;
typedef struct SpaceNode {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
- View2D v2d; /* deprecated, copied to region */
+ View2D v2d DNA_DEPRECATED; /* deprecated, copied to region */
struct ID *id, *from; /* context, no need to save in file? well... pinning... */
- short flag, menunr; /* menunr: browse id block in header */
+ short flag, pad1; /* menunr: browse id block in header */
float aspect;
- void *curfont;
float xof, yof; /* offset for drawing the backdrop */
float zoom, padf; /* zoom for backdrop */
@@ -433,9 +433,9 @@ typedef struct SpaceLogic {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
+ float blockscale DNA_DEPRECATED;
- short blockhandler[8];
+ short blockhandler[8] DNA_DEPRECATED;
short flag, scaflag;
int pad;
@@ -467,9 +467,9 @@ typedef struct SpaceConsole {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale; // XXX are these needed?
+ float blockscale DNA_DEPRECATED; // XXX are these needed?
- short blockhandler[8]; // XXX are these needed?
+ short blockhandler[8] DNA_DEPRECATED; // XXX are these needed?
/* space vars */
int lheight, pad;
@@ -554,23 +554,6 @@ typedef struct SpaceClip {
#define BUTS_CONSTRAINT 13
#define BUTS_EFFECTS 14
-/* sbuts->tab new (deprecated) */
-#define TAB_SHADING_MAT 0
-#define TAB_SHADING_TEX 1
-#define TAB_SHADING_RAD 2
-#define TAB_SHADING_WORLD 3
-#define TAB_SHADING_LAMP 4
-
-#define TAB_OBJECT_OBJECT 0
-#define TAB_OBJECT_PHYSICS 1
-#define TAB_OBJECT_PARTICLE 2
-
-#define TAB_SCENE_RENDER 0
-#define TAB_SCENE_WORLD 1
-#define TAB_SCENE_ANIM 2
-#define TAB_SCENE_SOUND 3
-#define TAB_SCENE_SEQUENCER 4
-
/* buts->mainb new */
#define BCONTEXT_RENDER 0
#define BCONTEXT_SCENE 1
@@ -685,7 +668,7 @@ enum FileSortTypeE {
/* Selection Flags in filesel: struct direntry, unsigned char selflag */
-#define ACTIVE_FILE (1<<1)
+/* #define ACTIVE_FILE (1<<1) */ /* UNUSED */
#define HILITED_FILE (1<<2)
#define SELECTED_FILE (1<<3)
#define EDITING_FILE (1<<4)
diff --git a/source/blender/makesdna/DNA_speaker_types.h b/source/blender/makesdna/DNA_speaker_types.h
index 02106fa45ad..2e8227f4f92 100644
--- a/source/blender/makesdna/DNA_speaker_types.h
+++ b/source/blender/makesdna/DNA_speaker_types.h
@@ -19,13 +19,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_SPEAKER_TYPES_H
-#define DNA_SPEAKER_TYPES_H
/** \file DNA_speaker_types.h
* \ingroup DNA
*/
+#ifndef DNA_SPEAKER_TYPES_H
+#define DNA_SPEAKER_TYPES_H
+
#include "DNA_ID.h"
struct AnimData;
diff --git a/source/blender/makesdna/DNA_text_types.h b/source/blender/makesdna/DNA_text_types.h
index 18622cfe75f..67f3c5288f6 100644
--- a/source/blender/makesdna/DNA_text_types.h
+++ b/source/blender/makesdna/DNA_text_types.h
@@ -24,14 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_TEXT_TYPES_H
-#define DNA_TEXT_TYPES_H
/** \file DNA_text_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
*/
+#ifndef DNA_TEXT_TYPES_H
+#define DNA_TEXT_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index 6a4a9970b40..82ffa82cf60 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -24,8 +24,6 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_TEXTURE_TYPES_H
-#define DNA_TEXTURE_TYPES_H
/** \file DNA_texture_types.h
* \ingroup DNA
@@ -33,6 +31,10 @@
* \author nzc
*/
+#ifndef DNA_TEXTURE_TYPES_H
+#define DNA_TEXTURE_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
#include "DNA_image_types.h" /* ImageUser */
@@ -263,7 +265,7 @@ typedef struct Tex {
struct ImageUser iuser;
struct bNodeTree *nodetree;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct Image *ima;
struct PluginTex *plugin;
struct ColorBand *coba;
@@ -493,6 +495,7 @@ typedef struct ColorMapping {
#define MTEX_BUMP_OBJECTSPACE 1024
#define MTEX_BUMP_TEXTURESPACE 2048
/* #define MTEX_BUMP_FLIPPED 4096 */ /* UNUSED */
+#define MTEX_BICUBIC_BUMP 8192
/* blendtype */
#define MTEX_BLEND 0
@@ -509,7 +512,7 @@ typedef struct ColorMapping {
#define MTEX_BLEND_SAT 11
#define MTEX_BLEND_VAL 12
#define MTEX_BLEND_COLOR 13
-#define MTEX_NUM_BLENDTYPES 14
+/* free for use */
#define MTEX_SOFT_LIGHT 15
#define MTEX_LIN_LIGHT 16
diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h
index c4e6fcc4dc8..131c540ac47 100644
--- a/source/blender/makesdna/DNA_tracking_types.h
+++ b/source/blender/makesdna/DNA_tracking_types.h
@@ -26,15 +26,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_TRACKING_TYPES_H
-#define DNA_TRACKING_TYPES_H
-
/** \file DNA_tracking_types.h
* \ingroup DNA
* \since may-2011
* \author Sergey Sharybin
*/
+#ifndef DNA_TRACKING_TYPES_H
+#define DNA_TRACKING_TYPES_H
+
#include "DNA_listBase.h"
/* match-moving data */
@@ -142,7 +142,10 @@ typedef struct MovieTrackingSettings {
/* cleanup */
int clean_frames, clean_action;
- float clean_error, pad;
+ float clean_error;
+
+ /* set object scale */
+ float object_distance; /* distance between two bundles used for object scaling */
} MovieTrackingSettings;
typedef struct MovieTrackingStabilization {
@@ -172,6 +175,17 @@ typedef struct MovieTrackingReconstruction {
struct MovieReconstructedCamera *cameras; /* reconstructed cameras */
} MovieTrackingReconstruction;
+typedef struct MovieTrackingObject {
+ struct MovieTrackingObject *next, *prev;
+
+ char name[24]; /* Name of tracking object */
+ int flag;
+ float scale; /* scale of object solution in amera space */
+
+ ListBase tracks; /* list of tracks use to tracking this object */
+ MovieTrackingReconstruction reconstruction; /* reconstruction data for this object */
+} MovieTrackingObject;
+
typedef struct MovieTrackingStats {
char message[256];
} MovieTrackingStats;
@@ -179,11 +193,14 @@ typedef struct MovieTrackingStats {
typedef struct MovieTracking {
MovieTrackingSettings settings; /* different tracking-related settings */
MovieTrackingCamera camera; /* camera intrinsics */
- ListBase tracks; /* all tracks */
- MovieTrackingReconstruction reconstruction; /* reconstruction data */
+ ListBase tracks; /* list of tracks used for camera object */
+ MovieTrackingReconstruction reconstruction; /* reconstruction data for camera object */
MovieTrackingStabilization stabilization; /* stabilization data */
MovieTrackingTrack *act_track; /* active track */
+ ListBase objects;
+ int objectnr, tot_object; /* index of active object and total number of objects */
+
MovieTrackingStats *stats; /* statistics displaying in clip editor */
} MovieTracking;
@@ -207,10 +224,12 @@ enum {
#define TRACK_LOCKED (1<<6)
#define TRACK_CUSTOMCOLOR (1<<7)
#define TRACK_USE_2D_STAB (1<<8)
+#define TRACK_PREVIEW_GRAYSCALE (1<<9)
/* MovieTrackingTrack->tracker */
#define TRACKER_KLT 0
#define TRACKER_SAD 1
+#define TRACKER_HYBRID 2
/* MovieTrackingTrack->adjframes */
#define TRACK_MATCH_KEYFRAME 0
@@ -240,6 +259,9 @@ enum {
/* MovieTrackingReconstruction->flag */
#define TRACKING_RECONSTRUCTED (1<<0)
+/* MovieTrackingObject->flag */
+#define TRACKING_OBJECT_CAMERA (1<<0)
+
#define TRACKING_CLEAN_SELECT 0
#define TRACKING_CLEAN_DELETE_TRACK 1
#define TRACKING_CLEAN_DELETE_SEGMENT 2
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 6c359f2c040..b3398460500 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -25,15 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_USERDEF_TYPES_H
-#define DNA_USERDEF_TYPES_H
/** \file DNA_userdef_types.h
* \ingroup DNA
* \since mar-2001
* \author nzc
- *
*/
+#ifndef DNA_USERDEF_TYPES_H
+#define DNA_USERDEF_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_texture_types.h" /* ColorBand */
@@ -356,7 +356,7 @@ typedef struct UserDef {
struct ListBase themes;
struct ListBase uifonts;
struct ListBase uistyles;
- struct ListBase keymaps; /* deprecated in favor of user_keymaps */
+ struct ListBase keymaps DNA_DEPRECATED; /* deprecated in favor of user_keymaps */
struct ListBase user_keymaps;
struct ListBase addons;
char keyconfigstr[64];
@@ -408,7 +408,9 @@ typedef struct UserDef {
struct ColorBand coba_weight; /* from texture.h */
float sculpt_paint_overlay_col[3];
- int pad3;
+
+ short tweak_threshold;
+ short pad3;
char author[80]; /* author name for file formats supporting it */
} UserDef;
@@ -601,20 +603,20 @@ extern UserDef U; /* from blenkernel blender.c */
#define NDOF_FLY_HELICOPTER (1 << 1)
#define NDOF_LOCK_HORIZON (1 << 2)
/* the following might not need to be saved between sessions,
- but they do need to live somewhere accessible... */
+ * but they do need to live somewhere accessible... */
#define NDOF_SHOULD_PAN (1 << 3)
#define NDOF_SHOULD_ZOOM (1 << 4)
#define NDOF_SHOULD_ROTATE (1 << 5)
/* orbit navigation modes
- only two options, so it's sort of a hyrbrid bool/enum
- if ((U.ndof_flag & NDOF_ORBIT_MODE) == NDOF_OM_OBJECT)... */
+ * only two options, so it's sort of a hyrbrid bool/enum
+ * if ((U.ndof_flag & NDOF_ORBIT_MODE) == NDOF_OM_OBJECT)... */
/*
#define NDOF_ORBIT_MODE (1 << 6)
#define NDOF_OM_TARGETCAMERA 0
#define NDOF_OM_OBJECT NDOF_ORBIT_MODE
*/
/* actually... users probably don't care about what the mode
- is called, just that it feels right */
+ * is called, just that it feels right */
/* zoom is up/down if this flag is set (otherwise forward/backward) */
#define NDOF_ZOOM_UPDOWN (1 << 7)
#define NDOF_ZOOM_INVERT (1 << 8)
diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h
index 75ac69cb379..10135ba85e9 100644
--- a/source/blender/makesdna/DNA_vec_types.h
+++ b/source/blender/makesdna/DNA_vec_types.h
@@ -26,14 +26,15 @@
*
*/
-#ifndef DNA_VEC_TYPES_H
-#define DNA_VEC_TYPES_H
/** \file DNA_vec_types.h
* \ingroup DNA
* \since dec-2000
* \author nzc
*/
+#ifndef DNA_VEC_TYPES_H
+#define DNA_VEC_TYPES_H
+
/* types */
/** vector of two shorts. */
diff --git a/source/blender/makesdna/DNA_vfont_types.h b/source/blender/makesdna/DNA_vfont_types.h
index d51b59b966e..7132751848d 100644
--- a/source/blender/makesdna/DNA_vfont_types.h
+++ b/source/blender/makesdna/DNA_vfont_types.h
@@ -24,8 +24,6 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_VFONT_TYPES_H
-#define DNA_VFONT_TYPES_H
/** \file DNA_vfont_types.h
* \ingroup DNA
@@ -33,6 +31,9 @@
* \author nzc
*/
+#ifndef DNA_VFONT_TYPES_H
+#define DNA_VFONT_TYPES_H
+
#include "DNA_ID.h"
struct PackedFile;
diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h
index 8f64246db31..0581cad4170 100644
--- a/source/blender/makesdna/DNA_view2d_types.h
+++ b/source/blender/makesdna/DNA_view2d_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_VIEW2D_TYPES_H
-#define DNA_VIEW2D_TYPES_H
/** \file DNA_view2d_types.h
* \ingroup DNA
*/
+#ifndef DNA_VIEW2D_TYPES_H
+#define DNA_VIEW2D_TYPES_H
+
#include "DNA_vec_types.h"
/* ---------------------------------- */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 50136fdcc99..ae026b0bcc9 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -24,13 +24,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_VIEW3D_TYPES_H
-#define DNA_VIEW3D_TYPES_H
/** \file DNA_view3d_types.h
* \ingroup DNA
*/
+#ifndef DNA_VIEW3D_TYPES_H
+#define DNA_VIEW3D_TYPES_H
+
struct ViewDepths;
struct Object;
struct Image;
@@ -55,6 +56,7 @@ struct wmTimer;
#define far clipend
#endif
+#include "DNA_defs.h"
#include "DNA_listBase.h"
#include "DNA_image_types.h"
#include "DNA_movieclip_types.h"
@@ -150,8 +152,9 @@ typedef struct View3D {
int spacetype;
float blockscale;
short blockhandler[8];
-
- float viewquat[4], dist; /* XXX depricated */
+
+ float viewquat[4] DNA_DEPRECATED;
+ float dist DNA_DEPRECATED;
float bundle_size; /* size of bundles in reconstructed data */
short bundle_drawtype; /* display style for bundle */
@@ -160,13 +163,13 @@ typedef struct View3D {
unsigned int lay_used; /* used while drawing */
- short persp; /* XXX depricated */
- short view; /* XXX depricated */
+ short persp DNA_DEPRECATED;
+ short view DNA_DEPRECATED;
struct Object *camera, *ob_centre;
struct ListBase bgpicbase;
- struct BGpic *bgpic; /* deprecated, use bgpicbase, only kept for do_versions(...) */
+ struct BGpic *bgpic DNA_DEPRECATED; /* deprecated, use bgpicbase, only kept for do_versions(...) */
struct View3D *localvd; /* allocated backup of its self while in localview */
@@ -185,7 +188,7 @@ typedef struct View3D {
float lens, grid;
float near, far;
- float ofs[3]; /* XXX deprecated */
+ float ofs[3] DNA_DEPRECATED; /* XXX deprecated */
float cursor[3];
short modeselect;
@@ -208,8 +211,8 @@ typedef struct View3D {
void *properties_storage; /* Nkey panel stores stuff here (runtime only!) */
- /* XXX depricated? */
- struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
+ /* XXX deprecated? */
+ struct bGPdata *gpd DNA_DEPRECATED; /* Grease-Pencil Data (annotation layers) */
} View3D;
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 0065fc110c3..57989424d4a 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -23,13 +23,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_WINDOWMANAGER_TYPES_H
-#define DNA_WINDOWMANAGER_TYPES_H
/** \file DNA_windowmanager_types.h
* \ingroup DNA
*/
+#ifndef DNA_WINDOWMANAGER_TYPES_H
+#define DNA_WINDOWMANAGER_TYPES_H
+
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 0c455022db4..a04ea89a291 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -24,13 +24,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DNA_WORLD_TYPES_H
-#define DNA_WORLD_TYPES_H
/** \file DNA_world_types.h
* \ingroup DNA
*/
+#ifndef DNA_WORLD_TYPES_H
+#define DNA_WORLD_TYPES_H
+
+#include "DNA_defs.h"
#include "DNA_ID.h"
struct AnimData;
@@ -96,7 +98,7 @@ typedef struct World {
float misi, miststa, mistdist, misthi;
- float starr, starg, starb, stark; /* Deprecated */
+ float starr DNA_DEPRECATED, starg DNA_DEPRECATED, starb DNA_DEPRECATED, stark DNA_DEPRECATED; /* Deprecated */
float starsize, starmindist;
float stardist, starcolnoise;
@@ -119,7 +121,7 @@ typedef struct World {
float *aosphere, *aotables;
- struct Ipo *ipo; // XXX depreceated... old animation system
+ struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct MTex *mtex[18]; /* MAX_MTEX */
short pr_texture, use_nodes, pad[2];
@@ -180,6 +182,7 @@ typedef struct World {
#define TEXCO_ANGMAP 64
#define TEXCO_H_SPHEREMAP 256
#define TEXCO_H_TUBEMAP 1024
+#define TEXCO_EQUIRECTMAP 2048
/* mapto */
#define WOMAP_BLEND 1
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index 2186a067c10..5b115a404ce 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -491,7 +491,7 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap)
for(nr=0; nr<sdna->nr_structs; nr++) {
sp= sdna->structs[nr];
if(strcmp(sdna->types[sp[0]], "ClothSimSettings") == 0)
- sp[10]= 9;
+ sp[10]= SDNA_TYPE_VOID;
}
}
@@ -655,92 +655,92 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
return compflags;
}
-static void cast_elem(char *ctype, char *otype, const char *name, char *curdata, char *olddata)
+static eSDNA_Type sdna_type_nr(const char *dna_type)
+{
+ if ((strcmp(dna_type, "char")==0) || (strcmp(dna_type, "const char")==0)) return SDNA_TYPE_CHAR;
+ else if((strcmp(dna_type, "uchar")==0) || (strcmp(dna_type, "unsigned char")==0)) return SDNA_TYPE_UCHAR;
+ else if( strcmp(dna_type, "short")==0) return SDNA_TYPE_SHORT;
+ else if((strcmp(dna_type, "ushort")==0)||(strcmp(dna_type, "unsigned short")==0)) return SDNA_TYPE_USHORT;
+ else if( strcmp(dna_type, "int")==0) return SDNA_TYPE_INT;
+ else if( strcmp(dna_type, "long")==0) return SDNA_TYPE_LONG;
+ else if((strcmp(dna_type, "ulong")==0)||(strcmp(dna_type, "unsigned long")==0)) return SDNA_TYPE_ULONG;
+ else if( strcmp(dna_type, "float")==0) return SDNA_TYPE_FLOAT;
+ else if( strcmp(dna_type, "double")==0) return SDNA_TYPE_DOUBLE;
+ else if( strcmp(dna_type, "int64_t")==0) return SDNA_TYPE_INT64;
+ else if( strcmp(dna_type, "uint64_t")==0) return SDNA_TYPE_UINT64;
+ else return -1; /* invalid! */
+}
+
+static void cast_elem(const char *ctype, const char *otype, const char *name, char *curdata, char *olddata)
{
double val = 0.0;
- int arrlen, curlen=1, oldlen=1, ctypenr, otypenr;
-
+ int arrlen, curlen=1, oldlen=1;
+
+ eSDNA_Type ctypenr, otypenr;
+
arrlen= DNA_elem_array_size(name, strlen(name));
-
- /* define otypenr */
- if(strcmp(otype, "char")==0 || (strcmp(otype, "const char")==0)) otypenr= 0;
- else if((strcmp(otype, "uchar")==0) || (strcmp(otype, "unsigned char")==0)) otypenr= 1;
- else if(strcmp(otype, "short")==0) otypenr= 2;
- else if((strcmp(otype, "ushort")==0)||(strcmp(otype, "unsigned short")==0)) otypenr= 3;
- else if(strcmp(otype, "int")==0) otypenr= 4;
- else if(strcmp(otype, "long")==0) otypenr= 5;
- else if((strcmp(otype, "ulong")==0)||(strcmp(otype, "unsigned long")==0)) otypenr= 6;
- else if(strcmp(otype, "float")==0) otypenr= 7;
- else if(strcmp(otype, "double")==0) otypenr= 8;
- else return;
-
- /* define ctypenr */
- if(strcmp(ctype, "char")==0) ctypenr= 0;
- else if(strcmp(ctype, "const char")==0) ctypenr= 0;
- else if((strcmp(ctype, "uchar")==0)||(strcmp(ctype, "unsigned char")==0)) ctypenr= 1;
- else if(strcmp(ctype, "short")==0) ctypenr= 2;
- else if((strcmp(ctype, "ushort")==0)||(strcmp(ctype, "unsigned short")==0)) ctypenr= 3;
- else if(strcmp(ctype, "int")==0) ctypenr= 4;
- else if(strcmp(ctype, "long")==0) ctypenr= 5;
- else if((strcmp(ctype, "ulong")==0)||(strcmp(ctype, "unsigned long")==0)) ctypenr= 6;
- else if(strcmp(ctype, "float")==0) ctypenr= 7;
- else if(strcmp(ctype, "double")==0) ctypenr= 8;
- else return;
+
+ if ( (otypenr= sdna_type_nr(otype)) == -1 ||
+ (ctypenr= sdna_type_nr(ctype)) == -1 )
+ {
+ return;
+ }
/* define lengths */
- if(otypenr < 2) oldlen= 1;
- else if(otypenr < 4) oldlen= 2;
- else if(otypenr < 8) oldlen= 4;
- else oldlen= 8;
-
- if(ctypenr < 2) curlen= 1;
- else if(ctypenr < 4) curlen= 2;
- else if(ctypenr < 8) curlen= 4;
- else curlen= 8;
-
+ oldlen= DNA_elem_type_size(otypenr);
+ curlen= DNA_elem_type_size(ctypenr);
+
while(arrlen>0) {
switch(otypenr) {
- case 0:
+ case SDNA_TYPE_CHAR:
val= *olddata; break;
- case 1:
+ case SDNA_TYPE_UCHAR:
val= *( (unsigned char *)olddata); break;
- case 2:
+ case SDNA_TYPE_SHORT:
val= *( (short *)olddata); break;
- case 3:
+ case SDNA_TYPE_USHORT:
val= *( (unsigned short *)olddata); break;
- case 4:
+ case SDNA_TYPE_INT:
val= *( (int *)olddata); break;
- case 5:
+ case SDNA_TYPE_LONG:
val= *( (int *)olddata); break;
- case 6:
+ case SDNA_TYPE_ULONG:
val= *( (unsigned int *)olddata); break;
- case 7:
+ case SDNA_TYPE_FLOAT:
val= *( (float *)olddata); break;
- case 8:
+ case SDNA_TYPE_DOUBLE:
val= *( (double *)olddata); break;
+ case SDNA_TYPE_INT64:
+ val= *( (int64_t *)olddata); break;
+ case SDNA_TYPE_UINT64:
+ val= *( (uint64_t *)olddata); break;
}
switch(ctypenr) {
- case 0:
+ case SDNA_TYPE_CHAR:
*curdata= val; break;
- case 1:
+ case SDNA_TYPE_UCHAR:
*( (unsigned char *)curdata)= val; break;
- case 2:
+ case SDNA_TYPE_SHORT:
*( (short *)curdata)= val; break;
- case 3:
+ case SDNA_TYPE_USHORT:
*( (unsigned short *)curdata)= val; break;
- case 4:
+ case SDNA_TYPE_INT:
*( (int *)curdata)= val; break;
- case 5:
+ case SDNA_TYPE_LONG:
*( (int *)curdata)= val; break;
- case 6:
+ case SDNA_TYPE_ULONG:
*( (unsigned int *)curdata)= val; break;
- case 7:
+ case SDNA_TYPE_FLOAT:
if(otypenr<2) val/= 255;
*( (float *)curdata)= val; break;
- case 8:
+ case SDNA_TYPE_DOUBLE:
if(otypenr<2) val/= 255;
*( (double *)curdata)= val; break;
+ case SDNA_TYPE_INT64:
+ *( (int64_t *)curdata)= val; break;
+ case SDNA_TYPE_UINT64:
+ *( (uint64_t *)curdata)= val; break;
}
olddata+= oldlen;
@@ -804,7 +804,6 @@ static int elem_strcmp(const char *name, const char *oname)
if(name[a]==0) break;
a++;
}
- if(name[a] != oname[a]) return 1;
return 0;
}
@@ -839,7 +838,8 @@ static char *find_elem(SDNA *sdna, const char *type, const char *name, short *ol
return NULL;
}
-static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, const char *name, char *curdata, short *old, char *olddata)
+static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna,
+ char *type, const char *name, char *curdata, short *old, char *olddata)
{
/* rules: test for NAME:
- name equal:
@@ -913,7 +913,8 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, const cha
}
}
-static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna, char *compflags, int oldSDNAnr, char *data, int curSDNAnr, char *cur)
+static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna,
+ char *compflags, int oldSDNAnr, char *data, int curSDNAnr, char *cur)
{
/* Recursive!
* Per element from cur_struct, read data from old_struct.
@@ -1055,7 +1056,9 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
}
else {
- if( spc[0]==2 || spc[0]==3 ) { /* short-ushort */
+ if ( spc[0]==SDNA_TYPE_SHORT ||
+ spc[0]==SDNA_TYPE_USHORT )
+ {
/* exception: variable called blocktype/ipowin: derived from ID_ */
skip= 0;
@@ -1077,7 +1080,11 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
}
}
}
- else if(spc[0]>3 && spc[0]<8) { /* int-long-ulong-float */
+ else if ( (spc[0]==SDNA_TYPE_INT ||
+ spc[0]==SDNA_TYPE_LONG ||
+ spc[0]==SDNA_TYPE_ULONG ||
+ spc[0]==SDNA_TYPE_FLOAT))
+ {
mul= DNA_elem_array_size(name, strlen(name));
cpo= cur;
@@ -1091,6 +1098,20 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
cpo+= 4;
}
}
+ else if ( (spc[0]==SDNA_TYPE_INT64) ||
+ (spc[0]==SDNA_TYPE_UINT64))
+ {
+ mul= DNA_elem_array_size(name, strlen(name));
+ cpo= cur;
+ while(mul--) {
+ cval= cpo[0]; cpo[0]= cpo[7]; cpo[7]= cval;
+ cval= cpo[1]; cpo[1]= cpo[6]; cpo[6]= cval;
+ cval= cpo[2]; cpo[2]= cpo[5]; cpo[5]= cval;
+ cval= cpo[3]; cpo[3]= cpo[4]; cpo[4]= cval;
+
+ cpo+= 8;
+ }
+ }
}
}
cur+= elen;
@@ -1139,3 +1160,27 @@ int DNA_elem_offset(SDNA *sdna, const char *stype, const char *vartype, const ch
return (int)((intptr_t)cp);
}
+int DNA_elem_type_size(const eSDNA_Type elem_nr)
+{
+ /* should containt all enum types */
+ switch (elem_nr) {
+ case SDNA_TYPE_CHAR:
+ case SDNA_TYPE_UCHAR:
+ return 1;
+ case SDNA_TYPE_SHORT:
+ case SDNA_TYPE_USHORT:
+ return 2;
+ case SDNA_TYPE_INT:
+ case SDNA_TYPE_LONG:
+ case SDNA_TYPE_ULONG:
+ case SDNA_TYPE_FLOAT:
+ return 4;
+ case SDNA_TYPE_DOUBLE:
+ case SDNA_TYPE_INT64:
+ case SDNA_TYPE_UINT64:
+ return 8;
+ }
+
+ /* weak */
+ return 8;
+}
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index b9bd2c073bf..2fa52776453 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -475,6 +475,13 @@ static int preprocess_include(char *maindata, int len)
if(comment);
else if( cp[0]==' ' && cp[1]==' ' );
else if( cp[-1]=='*' && cp[0]==' ' ); /* pointers with a space */
+
+ /* skip special keywords */
+ else if (strncmp("DNA_DEPRECATED", cp, 14)==0) {
+ /* single values are skipped already, so decrement 1 less */
+ a -= 13;
+ cp += 13;
+ }
else {
md[0]= cp[0];
md++;
@@ -921,16 +928,19 @@ static int make_structDNA(char *baseDirectory, FILE *file)
/* insertion of all known types */
/* watch it: uint is not allowed! use in structs an unsigned int */
- add_type("char", 1); /* 0 */
- add_type("uchar", 1); /* 1 */
- add_type("short", 2); /* 2 */
- add_type("ushort", 2); /* 3 */
- add_type("int", 4); /* 4 */
- add_type("long", 4); /* 5 */ /* should it be 8 on 64 bits? */
- add_type("ulong", 4); /* 6 */
- add_type("float", 4); /* 7 */
- add_type("double", 8); /* 8 */
- add_type("void", 0); /* 9 */
+ /* watch it: sizes must match DNA_elem_type_size() */
+ add_type("char", 1); /* SDNA_TYPE_CHAR */
+ add_type("uchar", 1); /* SDNA_TYPE_UCHAR */
+ add_type("short", 2); /* SDNA_TYPE_SHORT */
+ add_type("ushort", 2); /* SDNA_TYPE_USHORT */
+ add_type("int", 4); /* SDNA_TYPE_INT */
+ add_type("long", 4); /* SDNA_TYPE_LONG */ /* should it be 8 on 64 bits? */
+ add_type("ulong", 4); /* SDNA_TYPE_ULONG */
+ add_type("float", 4); /* SDNA_TYPE_FLOAT */
+ add_type("double", 8); /* SDNA_TYPE_DOUBLE */
+ add_type("int64_t", 8); /* SDNA_TYPE_INT64 */
+ add_type("uint64_t", 8); /* SDNA_TYPE_UINT64 */
+ add_type("void", 0); /* SDNA_TYPE_VOID */
// the defines above shouldn't be output in the padding file...
firststruct = nr_types;
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 35549b613ea..9e708a0a5d7 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -87,7 +87,7 @@ extern StructRNA RNA_BoidState;
extern StructRNA RNA_Bone;
extern StructRNA RNA_BoneGroup;
extern StructRNA RNA_BooleanModifier;
-extern StructRNA RNA_BooleanProperty;
+extern StructRNA RNA_BoolProperty;
extern StructRNA RNA_Brush;
extern StructRNA RNA_BrushTextureSlot;
extern StructRNA RNA_BuildModifier;
@@ -329,6 +329,7 @@ extern StructRNA RNA_MotionPath;
extern StructRNA RNA_MotionPathVert;
extern StructRNA RNA_MouseSensor;
extern StructRNA RNA_MovieSequence;
+extern StructRNA RNA_MovieTrackingObject;
extern StructRNA RNA_MulticamSequence;
extern StructRNA RNA_MultiresModifier;
extern StructRNA RNA_MusgraveTexture;
@@ -579,9 +580,9 @@ extern StructRNA RNA_VoxelData;
extern StructRNA RNA_VoxelDataTexture;
extern StructRNA RNA_WarpModifier;
extern StructRNA RNA_WaveModifier;
-extern StructRNA RNA_WeightVGEditModifier;
-extern StructRNA RNA_WeightVGMixModifier;
-extern StructRNA RNA_WeightVGProximityModifier;
+extern StructRNA RNA_VertexWeightEditModifier;
+extern StructRNA RNA_VertexWeightMixModifier;
+extern StructRNA RNA_VertexWeightProximityModifier;
extern StructRNA RNA_Window;
extern StructRNA RNA_WindowManager;
extern StructRNA RNA_WipeSequence;
@@ -996,7 +997,7 @@ StructRNA *ID_code_to_RNA_type(short idcode);
#ifdef __GNUC__
# define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
#else
-# define RNA_warning(format, args, ...) _RNA_warning("%s: " format "\n", __FUNCTION__, __VA_ARGS__)
+# define RNA_warning(format, ...) _RNA_warning("%s: " format "\n", __FUNCTION__, __VA_ARGS__)
#endif
void _RNA_warning(const char *format, ...)
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 8e8dd559fb1..4fb08227fb6 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -175,6 +175,8 @@ void RNA_def_property_collection_funcs(PropertyRNA *prop, const char *begin, con
void RNA_def_property_srna(PropertyRNA *prop, const char *type);
void RNA_def_py_data(PropertyRNA *prop, void *py_data);
+void RNA_def_property_translation_context(PropertyRNA *prop, const char *context);
+
/* Function */
FunctionRNA *RNA_def_function(StructRNA *srna, const char *identifier, const char *call);
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 1fcc8072f9b..8258ef5b753 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -43,9 +43,14 @@
#define RNA_VERSION_DATE "FIXME-RNA_VERSION_DATE"
#ifdef _WIN32
-#ifndef snprintf
-#define snprintf _snprintf
+# ifndef snprintf
+# define snprintf _snprintf
+# endif
#endif
+
+/* so we can use __func__ everywhere */
+#if defined(_MSC_VER)
+# define __func__ __FUNCTION__
#endif
/* Replace if different */
@@ -448,11 +453,9 @@ static int rna_enum_bitmask(PropertyRNA *prop)
static int rna_color_quantize(PropertyRNA *prop, PropertyDefRNA *dp)
{
- if(prop->type == PROP_FLOAT && (prop->subtype==PROP_COLOR || prop->subtype==PROP_COLOR_GAMMA))
- if(strcmp(dp->dnatype, "float") != 0 && strcmp(dp->dnatype, "double") != 0)
- return 1;
-
- return 0;
+ return ( (prop->type == PROP_FLOAT) &&
+ (prop->subtype==PROP_COLOR || prop->subtype==PROP_COLOR_GAMMA) &&
+ (IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) );
}
static const char *rna_function_string(void *func)
@@ -484,7 +487,8 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
if(!manualfunc) {
if(!dp->dnastructname || !dp->dnaname) {
- fprintf(stderr, "rna_def_property_get_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s (0): %s.%s has no valid dna info.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
return NULL;
}
@@ -495,7 +499,8 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
if(prop->type == PROP_FLOAT) {
if(IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) {
if(prop->subtype != PROP_COLOR_GAMMA) { /* colors are an exception. these get translated */
- fprintf(stderr, "rna_def_property_get_func1: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ fprintf(stderr, "%s (1): %s.%s is a '%s' but wrapped as type '%s'.\n",
+ __func__, srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
DefRNA.error= 1;
return NULL;
}
@@ -503,7 +508,8 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
}
else if(prop->type == PROP_INT || prop->type == PROP_BOOLEAN || prop->type == PROP_ENUM) {
if(IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
- fprintf(stderr, "rna_def_property_get_func2: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ fprintf(stderr, "%s (2): %s.%s is a '%s' but wrapped as type '%s'.\n",
+ __func__, srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
DefRNA.error= 1;
return NULL;
}
@@ -724,7 +730,8 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
if(!manualfunc) {
if(!dp->dnastructname || !dp->dnaname) {
if(prop->flag & PROP_EDITABLE) {
- fprintf(stderr, "rna_def_property_set_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s has no valid dna info.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
return NULL;
@@ -902,7 +909,8 @@ static char *rna_def_property_length_func(FILE *f, StructRNA *srna, PropertyRNA
if(prop->type == PROP_STRING) {
if(!manualfunc) {
if(!dp->dnastructname || !dp->dnaname) {
- fprintf(stderr, "rna_def_property_length_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s has no valid dna info.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
return NULL;
}
@@ -924,7 +932,8 @@ static char *rna_def_property_length_func(FILE *f, StructRNA *srna, PropertyRNA
else if(prop->type == PROP_COLLECTION) {
if(!manualfunc) {
if(prop->type == PROP_COLLECTION && (!(dp->dnalengthname || dp->dnalengthfixed)|| !dp->dnaname)) {
- fprintf(stderr, "rna_def_property_length_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s has no valid dna info.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
return NULL;
}
@@ -959,7 +968,8 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *
if(!manualfunc) {
if(!dp->dnastructname || !dp->dnaname) {
- fprintf(stderr, "rna_def_property_begin_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s has no valid dna info.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
return NULL;
}
@@ -1196,7 +1206,7 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
if(!prop->arraydimension) {
if(!bprop->get && !bprop->set && !dp->booleanbit)
@@ -1270,7 +1280,8 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
pprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (const char*)pprop->get);
pprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (const char*)pprop->set);
if(!pprop->type) {
- fprintf(stderr, "rna_def_property_funcs: %s.%s, pointer must have a struct type.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s, pointer must have a struct type.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
break;
@@ -1298,20 +1309,24 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
if(!(prop->flag & PROP_IDPROPERTY)) {
if(!cprop->begin) {
- fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a begin function.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s, collection must have a begin function.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
if(!cprop->next) {
- fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a next function.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s, collection must have a next function.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
if(!cprop->get) {
- fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a get function.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s, collection must have a get function.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
}
if(!cprop->item_type) {
- fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a struct type.\n", srna->identifier, prop->identifier);
+ fprintf(stderr, "%s: %s.%s, collection must have a struct type.\n",
+ __func__, srna->identifier, prop->identifier);
DefRNA.error= 1;
}
break;
@@ -1812,7 +1827,7 @@ static void rna_sort(BlenderRNA *brna)
static const char *rna_property_structname(PropertyType type)
{
switch(type) {
- case PROP_BOOLEAN: return "BooleanPropertyRNA";
+ case PROP_BOOLEAN: return "BoolPropertyRNA";
case PROP_INT: return "IntPropertyRNA";
case PROP_FLOAT: return "FloatPropertyRNA";
case PROP_STRING: return "StringPropertyRNA";
@@ -2136,25 +2151,28 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
if(prop->flag & PROP_ENUM_FLAG) {
if(eprop->defaultvalue & ~totflag) {
- fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default includes unused bits (%d).\n", srna->identifier, errnest, prop->identifier, eprop->defaultvalue & ~totflag);
+ fprintf(stderr, "%s: %s%s.%s, enum default includes unused bits (%d).\n",
+ __func__, srna->identifier, errnest, prop->identifier, eprop->defaultvalue & ~totflag);
DefRNA.error= 1;
}
}
else {
if(!defaultfound) {
- fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
+ fprintf(stderr, "%s: %s%s.%s, enum default is not in items.\n",
+ __func__, srna->identifier, errnest, prop->identifier);
DefRNA.error= 1;
}
}
}
else {
- fprintf(stderr, "rna_generate_structs: %s%s.%s, enum must have items defined.\n", srna->identifier, errnest, prop->identifier);
+ fprintf(stderr, "%s: %s%s.%s, enum must have items defined.\n",
+ __func__, srna->identifier, errnest, prop->identifier);
DefRNA.error= 1;
}
break;
}
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
unsigned int i;
if(prop->arraydimension && prop->totarraylength) {
@@ -2229,6 +2247,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
rna_print_c_string(f, prop->description); fprintf(f, ",\n\t");
fprintf(f, "%d,\n", prop->icon);
+ rna_print_c_string(f, prop->translation_context); fprintf(f, ",\n\t");
fprintf(f, "\t%s, %s|%s, %s, %u, {%u, %u, %u}, %u,\n", RNA_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
fprintf(f, "\t%s%s, %d, %s, %s,\n", (prop->flag & PROP_CONTEXT_UPDATE)? "(UpdateFunc)": "", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable), rna_function_string(prop->itemeditable));
@@ -2243,7 +2262,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %d, ", rna_function_string(bprop->get), rna_function_string(bprop->set), rna_function_string(bprop->getarray), rna_function_string(bprop->setarray), bprop->defaultvalue);
if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
@@ -2261,7 +2280,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_FLOAT: {
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %s, ", rna_function_string(fprop->get), rna_function_string(fprop->set), rna_function_string(fprop->getarray), rna_function_string(fprop->setarray), rna_function_string(fprop->range));
@@ -2275,7 +2294,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_STRING: {
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %d, ", rna_function_string(sprop->get), rna_function_string(sprop->length), rna_function_string(sprop->set), sprop->maxlength);
@@ -2298,7 +2317,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
if(pprop->type) fprintf(f, "&RNA_%s\n", (const char*)pprop->type);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_COLLECTION: {
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, %s, ", rna_function_string(cprop->begin), rna_function_string(cprop->next), rna_function_string(cprop->end), rna_function_string(cprop->get), rna_function_string(cprop->length), rna_function_string(cprop->lookupint), rna_function_string(cprop->lookupstring), rna_function_string(cprop->assignint));
@@ -2420,7 +2439,8 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
fprintf(f, "\t%s,\n", rna_function_string(srna->idproperties));
if(srna->reg && !srna->refine) {
- fprintf(stderr, "rna_generate_struct: %s has a register function, must also have refine function.\n", srna->identifier);
+ fprintf(stderr, "%s: %s has a register function, must also have refine function.\n",
+ __func__, srna->identifier);
DefRNA.error= 1;
}
@@ -2629,6 +2649,7 @@ static void rna_generate_header(BlenderRNA *brna, FILE *f)
static const char *cpp_classes = ""
"\n"
"#include <string>\n"
+"#include <string.h> /* for memcpy */\n"
"\n"
"namespace BL {\n"
"\n"
@@ -2754,6 +2775,7 @@ static void rna_generate_header_cpp(BlenderRNA *brna, FILE *f)
fprintf(f, "#include \"RNA_blender.h\"\n");
fprintf(f, "#include \"RNA_types.h\"\n");
+ fprintf(f, "#include \"RNA_access.h\"\n");
fprintf(f, "%s", cpp_classes);
@@ -2840,7 +2862,7 @@ static int rna_preprocess(const char *outfile)
file = fopen(deffile, "w");
if(!file) {
- printf ("Unable to open file: %s\n", deffile);
+ fprintf(stderr, "Unable to open file: %s\n", deffile);
status = 1;
}
else {
@@ -2868,7 +2890,7 @@ static int rna_preprocess(const char *outfile)
file = fopen(deffile, "w");
if(!file) {
- printf ("Unable to open file: %s\n", deffile);
+ fprintf(stderr, "Unable to open file: %s\n", deffile);
status = 1;
}
else {
@@ -2897,7 +2919,7 @@ static int rna_preprocess(const char *outfile)
file = fopen(deffile, "w");
if(!file) {
- printf ("Unable to open file: %s\n", deffile);
+ fprintf(stderr, "Unable to open file: %s\n", deffile);
status = 1;
}
else {
@@ -2927,18 +2949,18 @@ int main(int argc, char **argv)
int totblock, return_status = 0;
if(argc<2) {
- printf("Usage: %s outdirectory/\n", argv[0]);
+ fprintf(stderr, "Usage: %s outdirectory/\n", argv[0]);
return_status = 1;
}
else {
- printf("Running makesrna, program versions %s\n", RNA_VERSION_DATE);
+ fprintf(stderr, "Running makesrna, program versions %s\n", RNA_VERSION_DATE);
makesrna_path= argv[0];
return_status= rna_preprocess(argv[1]);
}
totblock= MEM_get_memory_blocks_in_use();
if(totblock!=0) {
- printf("Error Totblock: %d\n",totblock);
+ fprintf(stderr, "Error Totblock: %d\n",totblock);
MEM_set_error_callback(mem_error_cb);
MEM_printmemlist();
}
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index d3666e28338..c50e233c43f 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -469,7 +469,7 @@ static const char *rna_ensure_property_description(PropertyRNA *prop)
}
#ifdef WITH_INTERNATIONAL
- if((U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS))
+ if(description && (U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS))
description= BLF_gettext(description);
#endif
@@ -486,8 +486,12 @@ static const char *rna_ensure_property_name(PropertyRNA *prop)
name= ((IDProperty*)prop)->name;
#ifdef WITH_INTERNATIONAL
- if((U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_IFACE))
- name= BLF_gettext(name);
+ if((U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_IFACE)) {
+ if(prop->translation_context)
+ name = BLF_pgettext(prop->translation_context, name);
+ else
+ name = BLF_gettext(name);
+ }
#endif
return name;
@@ -837,12 +841,17 @@ char RNA_property_array_item_char(PropertyRNA *prop, int index)
PropertySubType subtype= rna_ensure_property(prop)->subtype;
/* get string to use for array index */
- if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE))
+ if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) {
return quatitem[index];
- else if((index < 4) && ELEM8(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION, PROP_COORDS))
+ }
+ else if((index < 4) && ELEM8(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH,
+ PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION, PROP_COORDS))
+ {
return vectoritem[index];
- else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA))
+ }
+ else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) {
return coloritem[index];
+ }
return '\0';
}
@@ -865,7 +874,9 @@ int RNA_property_array_item_index(PropertyRNA *prop, char name)
return 3;
}
}
- else if(ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION)) {
+ else if(ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ,
+ PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
+ {
switch (name) {
case 'x':
return 0;
@@ -1187,8 +1198,12 @@ void RNA_property_enum_items_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA
}
for(i=0; nitem[i].identifier; i++) {
- if( nitem[i].name )
- nitem[i].name = BLF_gettext(nitem[i].name);
+ if( nitem[i].name ) {
+ if(prop->translation_context)
+ nitem[i].name = BLF_pgettext(prop->translation_context, nitem[i].name);
+ else
+ nitem[i].name = BLF_gettext(nitem[i].name);
+ }
if( nitem[i].description )
nitem[i].description = BLF_gettext(nitem[i].description);
}
@@ -1519,7 +1534,8 @@ void RNA_property_update_cache_add(PointerRNA *ptr, PropertyRNA *prop)
/* find cache element for which key matches... */
for (uce = rna_updates_cache.first; uce; uce = uce->next) {
/* just match by id only for now, since most update calls that we'll encounter only really care about this */
- // TODO: later, the cache might need to have some nesting on L1 to cope better with these problems + some tagging to indicate we need this
+ /* TODO: later, the cache might need to have some nesting on L1 to cope better
+ * with these problems + some tagging to indicate we need this */
if (uce->ptr.id.data == ptr->id.data)
break;
}
@@ -1580,7 +1596,7 @@ void RNA_property_update_cache_free(void)
int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
IDProperty *idprop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
@@ -1596,7 +1612,7 @@ int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
IDProperty *idprop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
@@ -1623,7 +1639,7 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
IDProperty *idprop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
@@ -1671,7 +1687,7 @@ int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
IDProperty *idprop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
@@ -1729,7 +1745,7 @@ void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int inde
int RNA_property_boolean_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
BLI_assert(RNA_property_array_check(prop) == 0);
@@ -1739,7 +1755,7 @@ int RNA_property_boolean_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
void RNA_property_boolean_get_default_array(PointerRNA *UNUSED(ptr), PropertyRNA *prop, int *values)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
BLI_assert(RNA_property_array_check(prop) != 0);
@@ -3751,7 +3767,7 @@ char *RNA_path_append(const char *path, PointerRNA *UNUSED(ptr), PropertyRNA *pr
BLI_dynstr_append(dynstr, ".");
}
- BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop));
+ BLI_dynstr_append(dynstr, RNA_property_identifier(prop));
if(RNA_property_type(prop) == PROP_COLLECTION) {
/* add ["strkey"] or [intkey] */
@@ -4682,8 +4698,8 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) {
switch(parm->type) {
case PROP_BOOLEAN:
- if(parm->arraydimension) memcpy(data, ((BooleanPropertyRNA*)parm)->defaultarray, size);
- else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
+ if(parm->arraydimension) memcpy(data, ((BoolPropertyRNA*)parm)->defaultarray, size);
+ else memcpy(data, &((BoolPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_INT:
if(parm->arraydimension) memcpy(data, ((IntPropertyRNA*)parm)->defaultarray, size);
@@ -4969,7 +4985,9 @@ static int rna_function_format_array_length(const char *format, int ofs, int fle
return 0;
}
-static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, PropertyType type, char ftype, int len, void *dest, void *src, StructRNA *srna, const char *tid, const char *fid, const char *pid)
+static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, PropertyType type,
+ char ftype, int len, void *dest, void *src, StructRNA *srna,
+ const char *tid, const char *fid, const char *pid)
{
/* ptr is always a function pointer, prop always a parameter */
@@ -5055,7 +5073,9 @@ static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, Prop
}
if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
- fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
+ fprintf(stderr, "%s.%s: wrong type for parameter %s, "
+ "an object of type %s was expected, passed an object of type %s\n",
+ tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
return -1;
}
@@ -5080,7 +5100,10 @@ static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, Prop
ptype= RNA_property_pointer_type(ptr, prop);
if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
- fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection of objects of type %s was expected, passed a collection of objects of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
+ fprintf(stderr, "%s.%s: wrong type for parameter %s, "
+ "a collection of objects of type %s was expected, "
+ "passed a collection of objects of type %s\n",
+ tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
return -1;
}
@@ -5159,7 +5182,10 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
if (len!=alen) {
err= -1;
- fprintf(stderr, "%s.%s: for parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);
+ fprintf(stderr, "%s.%s: for parameter %s, "
+ "was expecting an array of %i elements, "
+ "passed %i elements instead\n",
+ tid, fid, pid, len, alen);
break;
}
@@ -5224,7 +5250,9 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
if (len!=alen) {
err= -1;
- fprintf(stderr, "%s.%s: for return parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);
+ fprintf(stderr, "%s.%s: for return parameter %s, "
+ "was expecting an array of %i elements, passed %i elements instead\n",
+ tid, fid, pid, len, alen);
}
else {
switch (type) {
@@ -5278,7 +5306,8 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
return err;
}
-int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, va_list args)
+int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, PointerRNA *ptr,
+ const char *identifier, const char *format, va_list args)
{
FunctionRNA *func;
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 392aa6a7f5a..612c34d1c92 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -1404,7 +1404,7 @@ static void rna_def_scene_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Scene", "");
+ RNA_def_property_ui_text(prop, "Mode", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX filter only camera objects
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 60658e98c8d..4fb672fd203 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -336,7 +336,7 @@ static void rna_def_brush_texture_slot(BlenderRNA *brna)
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_range(prop, 0, M_PI*2);
- RNA_def_property_ui_text(prop, "Angle", "Defines brush texture rotation");
+ RNA_def_property_ui_text(prop, "Angle", "Brush texture rotation");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
prop= RNA_def_property(srna, "map_mode", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 4ab14550fd1..6439d22e808 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -45,6 +45,7 @@
EnumPropertyItem constraint_type_items[] ={
{0, "", 0, "Motion Tracking", ""},
{CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT_DATA, "Camera Solver", ""},
+ {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT_DATA, "Object Solver", ""},
{CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT_DATA, "Follow Track", ""},
{0, "", 0, "Transform", ""},
{CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT_DATA, "Copy Location", ""},
@@ -163,6 +164,8 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
return &RNA_FollowTrackConstraint;
case CONSTRAINT_TYPE_CAMERASOLVER:
return &RNA_CameraSolverConstraint;
+ case CONSTRAINT_TYPE_OBJECTSOLVER:
+ return &RNA_ObjectSolverConstraint;
default:
return &RNA_UnknownType;
}
@@ -327,6 +330,49 @@ static void rna_SplineIKConstraint_joint_bindings_set(PointerRNA *ptr, const flo
memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
}
+static int rna_Constraint_cameraObject_poll(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object*)value.data;
+
+ if (ob) {
+ if (ob->type == OB_CAMERA && ob != (Object*)ptr->id.data) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void rna_Constraint_followTrack_camera_set(PointerRNA *ptr, PointerRNA value)
+{
+ bConstraint *con= (bConstraint*)ptr->data;
+ bFollowTrackConstraint *data= (bFollowTrackConstraint*)con->data;
+ Object *ob= (Object*)value.data;
+
+ if (ob) {
+ if (ob->type == OB_CAMERA && ob != (Object*)ptr->id.data) {
+ data->camera= ob;
+ }
+ } else {
+ data->camera= NULL;
+ }
+}
+
+static void rna_Constraint_objectSolver_camera_set(PointerRNA *ptr, PointerRNA value)
+{
+ bConstraint *con= (bConstraint*)ptr->data;
+ bObjectSolverConstraint *data= (bObjectSolverConstraint*)con->data;
+ Object *ob= (Object*)value.data;
+
+ if (ob) {
+ if (ob->type == OB_CAMERA && ob != (Object*)ptr->id.data) {
+ data->camera= ob;
+ }
+ } else {
+ data->camera= NULL;
+ }
+}
+
#else
EnumPropertyItem constraint_distance_items[] = {
@@ -2066,6 +2112,20 @@ static void rna_def_constraint_follow_track(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", FOLLOWTRACK_USE_3D_POSITION);
RNA_def_property_ui_text(prop, "3D Position", "Use 3D position of track to parent to");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ /* object */
+ prop= RNA_def_property(srna, "object", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "object");
+ RNA_def_property_ui_text(prop, "Object", "Movie tracking object to follow (if empty, camera object is used)");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ /* camera */
+ prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "camera");
+ RNA_def_property_ui_text(prop, "Camera", "Camera to which motion is parented (if empty active scene camera is used)");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Constraint_followTrack_camera_set", NULL, "rna_Constraint_cameraObject_poll");
}
static void rna_def_constraint_camera_solver(BlenderRNA *brna)
@@ -2074,7 +2134,7 @@ static void rna_def_constraint_camera_solver(BlenderRNA *brna)
PropertyRNA *prop;
srna= RNA_def_struct(brna, "CameraSolverConstraint", "Constraint");
- RNA_def_struct_ui_text(srna, "Follow Track Constraint", "Lock motion to the reconstructed camera movement");
+ RNA_def_struct_ui_text(srna, "Camera Solver Constraint", "Lock motion to the reconstructed camera movement");
RNA_def_struct_sdna_from(srna, "bCameraSolverConstraint", "data");
/* movie clip */
@@ -2091,6 +2151,43 @@ static void rna_def_constraint_camera_solver(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}
+static void rna_def_constraint_object_solver(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "ObjectSolverConstraint", "Constraint");
+ RNA_def_struct_ui_text(srna, "Object Solver Constraint", "Lock motion to the reconstructed object movement");
+ RNA_def_struct_sdna_from(srna, "bObjectSolverConstraint", "data");
+
+ /* movie clip */
+ prop= RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "clip");
+ RNA_def_property_ui_text(prop, "Movie Clip", "Movie Clip to get tracking data from");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ /* use default clip */
+ prop= RNA_def_property(srna, "use_active_clip", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CAMERASOLVER_ACTIVECLIP);
+ RNA_def_property_ui_text(prop, "Active Clip", "Use active clip defined in scene");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ /* object */
+ prop= RNA_def_property(srna, "object", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "object");
+ RNA_def_property_ui_text(prop, "Object", "Movie tracking object to follow");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ /* camera */
+ prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "camera");
+ RNA_def_property_ui_text(prop, "Camera", "Camera to which motion is parented (if empty active scene camera is used)");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Constraint_objectSolver_camera_set", NULL, "rna_Constraint_cameraObject_poll");
+}
+
/* base struct for constraints */
void RNA_def_constraint(BlenderRNA *brna)
{
@@ -2203,6 +2300,7 @@ void RNA_def_constraint(BlenderRNA *brna)
rna_def_constraint_pivot(brna);
rna_def_constraint_follow_track(brna);
rna_def_constraint_camera_solver(brna);
+ rna_def_constraint_object_solver(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index 4afe0da85fa..5fd67efba1d 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -1286,21 +1286,21 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Bevel Resolution", "Bevel resolution when depth is non-zero and no specific bevel object has been defined");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "width");
RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3);
RNA_def_property_float_funcs(prop, "rna_Curve_offset_get", "rna_Curve_offset_set", NULL);
RNA_def_property_ui_text(prop, "Offset", "Offset the curve to adjust the width of a text");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "ext1");
RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
RNA_def_property_range(prop, 0.0, FLT_MAX);
RNA_def_property_ui_text(prop, "Extrude", "Amount of curve extrusion when not using a bevel object");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "ext2");
RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 3);
RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object");
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index e911c936df8..53944f7ec5c 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -580,7 +580,7 @@ void RNA_free(BlenderRNA *brna)
static size_t rna_property_type_sizeof(PropertyType type)
{
switch(type) {
- case PROP_BOOLEAN: return sizeof(BooleanPropertyRNA);
+ case PROP_BOOLEAN: return sizeof(BoolPropertyRNA);
case PROP_INT: return sizeof(IntPropertyRNA);
case PROP_FLOAT: return sizeof(FloatPropertyRNA);
case PROP_STRING: return sizeof(StringPropertyRNA);
@@ -1308,7 +1308,7 @@ void RNA_def_property_boolean_default(PropertyRNA *prop, int value)
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
bprop->defaultvalue= value;
break;
}
@@ -1325,7 +1325,7 @@ void RNA_def_property_boolean_array_default(PropertyRNA *prop, const int *array)
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
bprop->defaultarray= array;
break;
}
@@ -1628,6 +1628,7 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
PropertyDefRNA *dp;
+ FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1652,6 +1653,11 @@ void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, cons
}
}
}
+
+ if(dp->dnatype && strcmp(dp->dnatype, "char") == 0) {
+ fprop->hardmin= fprop->softmin= 0.0f;
+ fprop->hardmax= fprop->softmax= 1.0f;
+ }
}
rna_def_property_sdna(prop, structname, propname);
@@ -1824,6 +1830,11 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
}
}
+void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
+{
+ prop->translation_context= context;
+}
+
/* Functions */
void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable)
@@ -1889,7 +1900,7 @@ void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const ch
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
if(prop->arraydimension) {
if(get) bprop->getarray= (PropBooleanArrayGetFunc)get;
@@ -2806,7 +2817,7 @@ void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, PropertyRNA
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
if(bprop->defaultarray) {
iarray= MEM_callocN(sizeof(int)*prop->totarraylength, "RNA_def_property_store");
@@ -2875,7 +2886,7 @@ void RNA_def_property_free_pointers(PropertyRNA *prop)
switch(prop->type) {
case PROP_BOOLEAN: {
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *bprop= (BoolPropertyRNA*)prop;
if(bprop->defaultarray) MEM_freeN((void*)bprop->defaultarray);
break;
}
diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c
index d06ab63ca8a..4886a4f30b1 100644
--- a/source/blender/makesrna/intern/rna_dynamicpaint.c
+++ b/source/blender/makesrna/intern/rna_dynamicpaint.c
@@ -433,7 +433,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
prop= RNA_def_property(srna, "frame_substeps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "substeps");
- RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_range(prop, 0.0, 20.0);
RNA_def_property_ui_range(prop, 0.0, 10, 1, 0);
RNA_def_property_ui_text(prop, "Sub-Steps", "Do extra frames between scene frames to ensure smooth motion");
@@ -618,7 +618,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
/* wave simulator settings */
prop= RNA_def_property(srna, "wave_damping", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.001, 1.0);
+ RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_range(prop, 0.01, 1.0, 1, 2);
RNA_def_property_ui_text(prop, "Damping", "Wave damping factor");
@@ -633,7 +633,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Timescale", "Wave time scaling factor");
prop= RNA_def_property(srna, "wave_spring", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.001, 1.0);
+ RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_range(prop, 0.01, 1.0, 1, 2);
RNA_def_property_ui_text(prop, "Spring", "Spring force that pulls water level back to zero");
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 56f1efe3fed..98c6b269b5f 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -1080,7 +1080,7 @@ static void rna_def_fmodifier(BlenderRNA *brna)
prop= RNA_def_property(srna, "blend_out", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "blendout");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifier_blending_range");
- RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from start frame for influence to fade out");
+ RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from end frame for influence to fade out");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
/* influence */
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 6f6a27abe7c..9e7f4a349e7 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -40,6 +40,7 @@
#include "BKE_image.h"
#include "WM_types.h"
+#include "WM_api.h"
static EnumPropertyItem image_source_items[]= {
{IMA_SRC_FILE, "FILE", 0, "Single Image", "Single image file"},
@@ -110,6 +111,7 @@ static void rna_Image_reload_update(Main *UNUSED(bmain), Scene *UNUSED(scene), P
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
+ WM_main_add_notifier(NC_IMAGE|NA_EDITED, &ima->id);
DAG_id_tag_update(&ima->id, 0);
}
@@ -475,6 +477,11 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_DO_PREMUL);
RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
+
+ prop= RNA_def_property(srna, "use_color_unpremultiply", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_CM_PREDIVIDE);
+ RNA_def_property_ui_text(prop, "Color Unpremultiply", "For premultiplied alpha images, do color space conversion on colors without alpha, to avoid fringing for images with light backgrounds");
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_Image_dirty_get", NULL);
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index ec6504fbbcb..40157d390bc 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -147,6 +147,8 @@ struct PropertyRNA {
const char *description;
/* icon ID */
int icon;
+ /* context for translation */
+ const char *translation_context;
/* property type as it appears to the outside */
PropertyType type;
@@ -185,7 +187,7 @@ struct PropertyRNA {
/* Property Types */
-typedef struct BooleanPropertyRNA {
+typedef struct BoolPropertyRNA {
PropertyRNA property;
PropBooleanGetFunc get;
@@ -196,7 +198,7 @@ typedef struct BooleanPropertyRNA {
int defaultvalue;
const int *defaultarray;
-} BooleanPropertyRNA;
+} BoolPropertyRNA;
typedef struct IntPropertyRNA {
PropertyRNA property;
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index c783fc2238c..7de2d550875 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -172,9 +172,9 @@ static void rna_def_lamp_mtex(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_texture_coordinates_items[] = {
- {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates"},
- {TEXCO_VIEW, "VIEW", 0, "View", "Uses view coordinates for the texture coordinates"},
- {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
+ {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates"},
+ {TEXCO_VIEW, "VIEW", 0, "View", "Use view coordinates for the texture coordinates"},
+ {TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "LampTextureSlot", "TextureSlot");
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 1809a5313c5..a62da4c3f7e 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -572,7 +572,7 @@ void rna_Main_armatures_tag(Main *bmain, int value) { tag_main_lb(&bmain->armatu
void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action, value); }
void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); }
void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); }
-void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->text, value); }
+void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->movieclip, value); }
static int rna_Main_cameras_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CA); }
static int rna_Main_scenes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCE); }
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 6400946d582..8794914e727 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -413,8 +413,10 @@ static void rna_def_material_mtex(BlenderRNA *brna)
static EnumPropertyItem prop_bump_method_items[] = {
{0, "BUMP_ORIGINAL", 0, "Original", ""},
{MTEX_COMPAT_BUMP, "BUMP_COMPATIBLE", 0, "Compatible", ""},
- {MTEX_3TAP_BUMP, "BUMP_DEFAULT", 0, "Default", ""},
- {MTEX_5TAP_BUMP, "BUMP_BEST_QUALITY", 0, "Best Quality", ""},
+ {MTEX_3TAP_BUMP, "BUMP_LOW_QUALITY", 0, "Low Quality", "Use 3 tap filtering"},
+ {MTEX_5TAP_BUMP, "BUMP_MEDIUM_QUALITY", 0, "Medium Quality", "Use 5 tap filtering"},
+ {MTEX_BICUBIC_BUMP, "BUMP_BEST_QUALITY", 0, "Best Quality", "Use bicubic filtering (requires OpenGL 3.0+, "
+ "it will fall back on medium setting for other systems)"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_bump_space_items[] = {
@@ -480,12 +482,12 @@ static void rna_def_material_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_map_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REF);
- RNA_def_property_ui_text(prop, "Diffuse", "The texture to affects the value of the materials diffuse reflectivity");
+ RNA_def_property_ui_text(prop, "Diffuse", "The texture affects the value of diffuse reflectivity");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "use_map_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SPEC);
- RNA_def_property_ui_text(prop, "Specular", "The texture to affects the value of specular reflectivity");
+ RNA_def_property_ui_text(prop, "Specular", "The texture affects the value of specular reflectivity");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "use_map_ambient", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 02be3183f2c..f6e958ab1f5 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -2132,6 +2132,11 @@ static void rna_def_mesh(BlenderRNA *brna)
"Display the area of selected faces, using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+ prop= RNA_def_property(srna, "show_extra_indices", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_INDICES);
+ RNA_def_property_ui_text(prop, "Indices", "Displays the index numbers of selected vertices, edges, and faces");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
/* editflag */
prop= RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_MIRROR_X);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index b426afe972d..9474c572d88 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -69,6 +69,7 @@ EnumPropertyItem modifier_type_items[] ={
{eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
{eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
{eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
+ {eModifierType_Remesh, "REMESH", ICON_MOD_REMESH, "Remesh", ""},
{eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
{eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
{eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
@@ -199,6 +200,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_VertexWeightProximityModifier;
case eModifierType_DynamicPaint:
return &RNA_DynamicPaintModifier;
+ case eModifierType_Remesh:
+ return &RNA_RemeshModifier;
default:
return &RNA_Modifier;
}
@@ -2867,6 +2870,57 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
rna_def_modifier_weightvg_mask(brna, srna);
}
+static void rna_def_modifier_remesh(BlenderRNA *brna)
+{
+ static EnumPropertyItem mode_items[]= {
+ {MOD_REMESH_CENTROID, "BLOCKS", 0, "Blocks", "Output a blocky surface with no smoothing"},
+ {MOD_REMESH_MASS_POINT, "SMOOTH", 0, "Smooth", "Output a smooth surface with no sharp-features detection"},
+ {MOD_REMESH_SHARP_FEATURES, "SHARP", 0, "Sharp", "Output a surface that reproduces sharp edges and corners from the input mesh"},
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "RemeshModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Remesh Modifier", "Generate a new surface with regular topology that follows the shape of the input mesh");
+ RNA_def_struct_sdna(srna, "RemeshModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_REMESH);
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, mode_items);
+ RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_range(prop, 0, 0.99, 0.01, 3);
+ RNA_def_property_range(prop, 0, 0.99);
+ RNA_def_property_ui_text(prop, "Scale", "The ratio of the largest dimension of the model over the size of the grid");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_range(prop, 0, 1, 0.1, 3);
+ RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_text(prop, "Threshold", "If removing disconnected pieces, minimum size of components to preserve as a ratio of the number of polygons in the largest component");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "octree_depth", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "depth");
+ RNA_def_property_range(prop, 1, 10);
+ RNA_def_property_ui_text(prop, "Octree Depth", "Resolution of the octree; higher values give finer details");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "sharpness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "hermite_num");
+ RNA_def_property_ui_range(prop, 0, 2, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Sharpness", "Tolerance for outliers; lower values filter noise while higher values will reproduce edges closer to the input");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "remove_disconnected_pieces", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_REMESH_FLOOD_FILL);
+ RNA_def_property_ui_text(prop, "Remove Disconnected Pieces", "");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+}
+
static void rna_def_modifier_ocean(BlenderRNA *brna)
{
StructRNA *srna;
@@ -3148,6 +3202,7 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_weightvgproximity(brna);
rna_def_modifier_dynamic_paint(brna);
rna_def_modifier_ocean(brna);
+ rna_def_modifier_remesh(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_movieclip.c b/source/blender/makesrna/intern/rna_movieclip.c
index 3b1ac8f22c3..fbc6a0155f2 100644
--- a/source/blender/makesrna/intern/rna_movieclip.c
+++ b/source/blender/makesrna/intern/rna_movieclip.c
@@ -78,6 +78,7 @@ static void rna_def_movieclip_proxy(BlenderRNA *brna)
{IMB_TC_RECORD_RUN, "RECORD_RUN", 0, "Record Run", "Use images in the order they are recorded"},
{IMB_TC_FREE_RUN, "FREE_RUN", 0, "Free Run", "Use global timestamp written by recording device"},
{IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN, "FREE_RUN_REC_DATE", 0, "Free Run (rec date)", "Interpolate a global timestamp using the record date and time written by recording device"},
+ {IMB_TC_RECORD_RUN_NO_GAPS, "FREE_RUN_NO_GAPS", 0, "Free Run No Gaps", "Record run, but ignore timecode, changes in framerate or dropouts"},
{0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "MovieClipProxy", NULL);
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 2e8fe021623..43345721cd2 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -69,9 +69,13 @@ EnumPropertyItem node_quality_items[] = {
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem node_socket_type_items[] = {
- {SOCK_FLOAT, "VALUE", 0, "Value", ""},
- {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
- {SOCK_RGBA, "RGBA", 0, "RGBA", ""},
+ {SOCK_FLOAT, "VALUE", 0, "Value", ""},
+ {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
+ {SOCK_RGBA, "RGBA", 0, "RGBA", ""},
+ {SOCK_SHADER, "SHADER", 0, "Shader", ""},
+ {SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
+ {SOCK_MESH, "MESH", 0, "Mesh", ""},
+ {SOCK_INT, "INT", 0, "Int", ""},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem node_math_items[] = {
@@ -370,6 +374,17 @@ static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
node_update(bmain, scene, ntree, node);
}
+static void rna_Node_material_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+ bNode *node= (bNode*)ptr->data;
+
+ if(node->id)
+ nodeSetActive(ntree, node);
+
+ node_update(bmain, scene, ntree, node);
+}
+
static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -1124,7 +1139,7 @@ static void def_sh_material(StructRNA *srna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Material", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_material_update");
prop = RNA_def_property(srna, "use_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_DIFF);
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index bd4a4e89d45..9c4d3e98492 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -40,6 +40,7 @@ DefNode( ShaderNode, SH_NODE_VALTORGB, def_colorramp, "VALTO
DefNode( ShaderNode, SH_NODE_RGBTOBW, 0, "RGBTOBW", RGBToBW, "RGB to BW", "" )
DefNode( ShaderNode, SH_NODE_TEXTURE, def_texture, "TEXTURE", Texture, "Texture", "" )
DefNode( ShaderNode, SH_NODE_NORMAL, 0, "NORMAL", Normal, "Normal", "" )
+DefNode( ShaderNode, SH_NODE_GAMMA, 0, "GAMMA", Gamma, "Gamma", "" )
DefNode( ShaderNode, SH_NODE_GEOMETRY, def_sh_geometry, "GEOMETRY", Geometry, "Geometry", "" )
DefNode( ShaderNode, SH_NODE_MAPPING, def_sh_mapping, "MAPPING", Mapping, "Mapping", "" )
DefNode( ShaderNode, SH_NODE_CURVE_VEC, def_vector_curve, "CURVE_VEC", VectorCurve, "Vector Curve", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 11c248adac7..f9bb0b36a3f 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -174,7 +174,7 @@ static void rna_Object_matrix_local_get(PointerRNA *ptr, float values[16])
if(ob->parent) {
float invmat[4][4]; /* for inverse of parent's matrix */
invert_m4_m4(invmat, ob->parent->obmat);
- mul_m4_m4m4((float(*)[4])values, ob->obmat, invmat);
+ mult_m4_m4m4((float(*)[4])values, invmat, ob->obmat);
}
else {
copy_m4_m4((float(*)[4])values, ob->obmat);
@@ -191,7 +191,7 @@ static void rna_Object_matrix_local_set(PointerRNA *ptr, const float values[16])
if(ob->parent) {
float invmat[4][4];
invert_m4_m4(invmat, ob->parentinv);
- mul_m4_m4m4(ob->obmat, (float(*)[4])values, invmat);
+ mult_m4_m4m4(ob->obmat, invmat, (float(*)[4])values);
}
else {
copy_m4_m4(ob->obmat, (float(*)[4])values);
@@ -809,11 +809,11 @@ static void rna_MaterialSlot_link_set(PointerRNA *ptr, int value)
if(value) {
ob->matbits[index]= 1;
- ob->colbits |= (1<<index);
+ /* ob->colbits |= (1<<index); */ /* DEPRECATED */
}
else {
ob->matbits[index]= 0;
- ob->colbits &= ~(1<<index);
+ /* ob->colbits &= ~(1<<index); */ /* DEPRECATED */
}
}
@@ -2071,7 +2071,9 @@ static void rna_def_object(BlenderRNA *brna)
#endif
prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_float_sdna(prop, NULL, "dsize");
+ RNA_def_property_float_sdna(prop, NULL, "dscale");
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
+ RNA_def_property_float_array_default(prop, default_scale);
RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 5b8b9d9a6b2..877da130357 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -130,7 +130,7 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
case OB_MBALL: {
/* metaballs don't have modifiers, so just convert to mesh */
- Object *basis_ob = find_basis_mball( sce, ob );
+ Object *basis_ob = find_basis_mball(sce, ob);
/* todo, re-generatre for render-res */
/* metaball_polygonize(scene, ob) */
@@ -138,7 +138,15 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
return NULL; /* only do basis metaball */
tmpmesh = add_mesh("Mesh");
- mball_to_mesh( &ob->disp, tmpmesh );
+
+ if(render) {
+ ListBase disp = {NULL, NULL};
+ makeDispListMBall_forRender(sce, ob, &disp);
+ mball_to_mesh(&disp, tmpmesh);
+ freedisplist(&disp);
+ }
+ else
+ mball_to_mesh(&ob->disp, tmpmesh);
break;
}
@@ -183,13 +191,12 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
if( tmpcu->mat ) {
for( i = tmpcu->totcol; i-- > 0; ) {
/* are we an object material or data based? */
- if (ob->colbits & 1<<i)
- tmpmesh->mat[i] = ob->mat[i];
- else
- tmpmesh->mat[i] = tmpcu->mat[i];
- if (tmpmesh->mat[i])
+ tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i];
+
+ if (tmpmesh->mat[i]) {
tmpmesh->mat[i]->id.us++;
+ }
}
}
break;
@@ -222,12 +229,11 @@ Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_
if( origmesh->mat ) {
for( i = origmesh->totcol; i-- > 0; ) {
/* are we an object material or data based? */
- if (ob->colbits & 1<<i)
- tmpmesh->mat[i] = ob->mat[i];
- else
- tmpmesh->mat[i] = origmesh->mat[i];
- if (tmpmesh->mat[i])
+ tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i];
+
+ if (tmpmesh->mat[i]) {
tmpmesh->mat[i]->id.us++;
+ }
}
}
}
@@ -351,7 +357,7 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
}
Mesh *me = (Mesh*)ob->data;
- int group_index = defgroup_find_index(ob, group);
+ int group_index = BLI_findlink(&ob->defbase, group);
if (group_index == -1) {
BKE_report(reports, RPT_ERROR, "No deform groups assigned to mesh");
return;
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index fb6e837365d..2c71fffb5b5 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -1233,18 +1233,18 @@ static void rna_def_particle_settings_mtex(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem texco_items[] = {
- {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates"},
- {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
- {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates"},
- {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object"},
- {TEXCO_STRAND, "STRAND", 0, "Strand / Particle", "Uses normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)"},
+ {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates"},
+ {TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
+ {TEXCO_UV, "UV", 0, "UV", "Use UV coordinates for texture coordinates"},
+ {TEXCO_ORCO, "ORCO", 0, "Generated", "Use the original undeformed coordinates of the object"},
+ {TEXCO_STRAND, "STRAND", 0, "Strand / Particle", "Use normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_mapping_items[] = {
- {MTEX_FLAT, "FLAT", 0, "Flat", "Maps X and Y coordinates directly"},
- {MTEX_CUBE, "CUBE", 0, "Cube", "Maps using the normal vector"},
- {MTEX_TUBE, "TUBE", 0, "Tube", "Maps with Z as central axis"},
- {MTEX_SPHERE, "SPHERE", 0, "Sphere", "Maps with Z as central axis"},
+ {MTEX_FLAT, "FLAT", 0, "Flat", "Map X and Y coordinates directly"},
+ {MTEX_CUBE, "CUBE", 0, "Cube", "Map using the normal vector"},
+ {MTEX_TUBE, "TUBE", 0, "Tube", "Map with Z as central axis"},
+ {MTEX_SPHERE, "SPHERE", 0, "Sphere", "Map with Z as central axis"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_x_mapping_items[] = {
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 940e2e749e3..676d5f2c44f 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -413,7 +413,7 @@ static StructRNA *rna_Property_refine(PointerRNA *ptr)
rna_idproperty_check(&prop, ptr); /* XXX ptr? */
switch(prop->type) {
- case PROP_BOOLEAN: return &RNA_BooleanProperty;
+ case PROP_BOOLEAN: return &RNA_BoolProperty;
case PROP_INT: return &RNA_IntProperty;
case PROP_FLOAT: return &RNA_FloatProperty;
case PROP_STRING: return &RNA_StringProperty;
@@ -465,6 +465,20 @@ static int rna_Property_description_length(PointerRNA *ptr)
return prop->description ? strlen(prop->description) : 0;
}
+static void rna_Property_translation_context_get(PointerRNA *ptr, char *value)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ strcpy(value, prop->translation_context ? prop->translation_context:"");
+}
+
+static int rna_Property_translation_context_length(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return prop->translation_context ? strlen(prop->translation_context) : 0;
+}
+
static int rna_Property_type_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -578,7 +592,7 @@ static int rna_BoolProperty_default_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
rna_idproperty_check(&prop, ptr);
- return ((BooleanPropertyRNA*)prop)->defaultvalue;
+ return ((BoolPropertyRNA*)prop)->defaultvalue;
}
static int rna_IntProperty_default_get(PointerRNA *ptr)
@@ -615,7 +629,7 @@ static void rna_IntProperty_default_array_get(PointerRNA *ptr, int *values)
static void rna_BoolProperty_default_array_get(PointerRNA *ptr, int *values)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
- BooleanPropertyRNA *nprop= (BooleanPropertyRNA*)prop;
+ BoolPropertyRNA *nprop= (BoolPropertyRNA*)prop;
rna_idproperty_check(&prop, ptr);
if(nprop->defaultarray) {
@@ -1047,6 +1061,11 @@ static void rna_def_property(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, "rna_Property_description_get", "rna_Property_description_length", NULL);
RNA_def_property_ui_text(prop, "Description", "Description of the property for tooltips");
+ prop= RNA_def_property(srna, "translation_context", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_string_funcs(prop, "rna_Property_translation_context_get", "rna_Property_translation_context_length", NULL);
+ RNA_def_property_ui_text(prop, "Translation Context", "Translation context of the property");
+
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_enum_items(prop, property_type_items);
@@ -1355,8 +1374,8 @@ void RNA_def_rna(BlenderRNA *brna)
/* Property */
rna_def_property(brna);
- /* BooleanProperty */
- srna= RNA_def_struct(brna, "BooleanProperty", "Property");
+ /* BoolProperty */
+ srna= RNA_def_struct(brna, "BoolProperty", "Property");
RNA_def_struct_ui_text(srna, "Boolean Definition", "RNA boolean property definition");
rna_def_number_property(srna, PROP_BOOLEAN);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index a682c329444..b69ca64773c 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -659,10 +659,10 @@ static void rna_ImageFormatSettings_file_format_set(PointerRNA *ptr, int value)
Scene *scene= ptr->id.data;
RenderData *rd= &scene->r;
#ifdef WITH_FFMPEG
- ffmpeg_verify_image_type(rd);
+ ffmpeg_verify_image_type(rd, imf);
#endif
#ifdef WITH_QUICKTIME
- quicktime_verify_image_type(rd);
+ quicktime_verify_image_type(rd, imf);
#endif
(void)rd;
}
@@ -1213,6 +1213,13 @@ static void rna_GameSettings_auto_start_set(PointerRNA *UNUSED(ptr), int value)
G.fileflags &= ~G_FILE_AUTOPLAY;
}
+static void rna_GameSettings_exit_key_set(PointerRNA *ptr, int value)
+{
+ GameData *gm = (GameData*)ptr->data;
+
+ if(ISKEYBOARD(value))
+ gm->exitkey=value;
+}
static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
{
@@ -2103,6 +2110,13 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_range(prop, 8, 32);
RNA_def_property_ui_text(prop, "Bits", "Display bit depth of full screen display");
RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "exit_key", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "exitkey");
+ RNA_def_property_enum_items(prop, event_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_GameSettings_exit_key_set", NULL);
+ RNA_def_property_ui_text(prop, "Exit Key", "The key that exits the Game Engine");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
// Do we need it here ? (since we already have it in World
prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE);
@@ -3214,7 +3228,11 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "color_mgt_flag", R_COLOR_MANAGEMENT);
RNA_def_property_ui_text(prop, "Color Management", "Use linear workflow - gamma corrected imaging pipeline");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_RenderSettings_color_management_update");
-
+
+ prop= RNA_def_property(srna, "use_color_unpremultiply", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "color_mgt_flag", R_COLOR_MANAGEMENT_PREDIVIDE);
+ RNA_def_property_ui_text(prop, "Color Unpremultipy", "For premultiplied alpha render output, do color space conversion on colors without alpha, to avoid fringing on light backgrounds");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "use_file_extension", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXTENSION);
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index d0a50ba6bad..a15ca5de5c1 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -304,7 +304,7 @@ static void rna_def_vertex_paint(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS);
- RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting");
+ RNA_def_property_ui_text(prop, "Normals", "Apply the vertex normal before painting");
prop= RNA_def_property(srna, "use_spray", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY);
@@ -348,7 +348,7 @@ static void rna_def_image_paint(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_clone_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_CLONE);
RNA_def_property_ui_text(prop, "Clone Map",
- "Use another UV map as clone source, otherwise use 3D the cursor as the source");
+ "Use another UV map as clone source, otherwise use the 3D cursor as the source");
/* integers */
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index ba58a66a2d6..6459c145a3a 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -387,7 +387,7 @@ static void rna_def_mouse_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "mouse_event", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, mouse_event_items);
- RNA_def_property_ui_text(prop, "Mouse Event", "Specify the type of event this mouse sensor should trigger on");
+ RNA_def_property_ui_text(prop, "Mouse Event", "Type of event this mouse sensor should trigger on");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -442,7 +442,7 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "target", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "targetName");
- RNA_def_property_ui_text(prop, "Target", "Property that receive the keystrokes in case a string is logged");
+ RNA_def_property_ui_text(prop, "Target", "Property that receives the keystrokes in case a string is logged");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "log", PROP_STRING, PROP_NONE);
@@ -490,12 +490,12 @@ static void rna_def_property_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "value_min", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "value");
- RNA_def_property_ui_text(prop, "Minimum Value", "Specify minimum value in Interval type");
+ RNA_def_property_ui_text(prop, "Minimum Value", "Minimum value in Interval type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "value_max", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "maxvalue");
- RNA_def_property_ui_text(prop, "Maximum Value", "Specify maximum value in Interval type");
+ RNA_def_property_ui_text(prop, "Maximum Value", "Maximum value in Interval type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -533,7 +533,7 @@ static void rna_def_armature_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "value");
- RNA_def_property_ui_text(prop, "Compare Value", "Specify value to be used in comparison");
+ RNA_def_property_ui_text(prop, "Compare Value", "Value to be used in comparison");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -574,7 +574,7 @@ static void rna_def_delay_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_repeat", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_DELAY_REPEAT);
- RNA_def_property_ui_text(prop, "Repeat", "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics");
+ RNA_def_property_ui_text(prop, "Repeat", "Toggle repeat option (if selected, the sensor restarts after Delay+Duration logic tics)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -589,7 +589,7 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_pulse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", SENS_COLLISION_PULSE);
- RNA_def_property_ui_text(prop, "Pulse", "Changes to the set of colliding objects generates pulse");
+ RNA_def_property_ui_text(prop, "Pulse", "Change to the set of colliding objects generates pulse");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
@@ -599,13 +599,13 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX to make a setFunction to create a lookup with all materials in Blend File (not only this object mat.)
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "materialName");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/*//XXX either use a datablock look up to store the string name (material)
@@ -614,7 +614,7 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
*/
}
@@ -637,12 +637,12 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, axis_items);
- RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the radar cone is cast");
+ RNA_def_property_ui_text(prop, "Axis", "Along which axis the radar cone is cast");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX TODO - use radians internally then change to PROP_ANGLE
@@ -669,7 +669,7 @@ static void rna_def_random_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 1000);
- RNA_def_property_ui_text(prop, "Seed", "Initial seed of the generator. (Choose 0 for not random)");
+ RNA_def_property_ui_text(prop, "Seed", "Initial seed of the generator (choose 0 for not random)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -703,12 +703,12 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "propname");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "matname");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* //XXX either use a datablock look up to store the string name (material)
@@ -717,7 +717,7 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
*/
prop= RNA_def_property(srna, "use_x_ray", PROP_BOOLEAN, PROP_NONE);
@@ -733,7 +733,7 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "axisflag");
RNA_def_property_enum_items(prop, axis_items);
- RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the ray is cast");
+ RNA_def_property_ui_text(prop, "Axis", "Along which axis the ray is cast");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -747,7 +747,7 @@ static void rna_def_message_sensor(BlenderRNA *brna)
RNA_def_struct_sdna_from(srna, "bMessageSensor", "data");
prop= RNA_def_property(srna, "subject", PROP_STRING, PROP_NONE);
- RNA_def_property_ui_text(prop, "Subject", "Optional subject filter: only accept messages with this subject, or empty for all");
+ RNA_def_property_ui_text(prop, "Subject", "Optional subject filter: only accept messages with this subject, or empty to accept all");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -788,7 +788,7 @@ static void rna_def_joystick_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "joystick_index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "joyindex");
- RNA_def_property_ui_text(prop, "Index", "Specify which joystick to use");
+ RNA_def_property_ui_text(prop, "Index", "Which joystick to use");
RNA_def_property_range(prop, 0, SENS_JOY_MAXINDEX-1);
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -800,26 +800,26 @@ static void rna_def_joystick_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_all_events", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SENS_JOY_ANY_EVENT);
- RNA_def_property_ui_text(prop, "All Events", "Triggered by all events on this joysticks current type (axis/button/hat)");
+ RNA_def_property_ui_text(prop, "All Events", "Triggered by all events on this joystick's current type (axis/button/hat)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Button */
prop= RNA_def_property(srna, "button_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "button");
- RNA_def_property_ui_text(prop, "Button Number", "Specify which button to use");
+ RNA_def_property_ui_text(prop, "Button Number", "Which button to use");
RNA_def_property_range(prop, 0, 18);
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Axis */
prop= RNA_def_property(srna, "axis_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "axis");
- RNA_def_property_ui_text(prop, "Axis Number", "Specify which axis pair to use, 1 is usually the main direction input");
+ RNA_def_property_ui_text(prop, "Axis Number", "Which axis pair to use, 1 is usually the main direction input");
RNA_def_property_range(prop, 1, 8);
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "axis_threshold", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "precision");
- RNA_def_property_ui_text(prop, "Axis Threshold", "Specify the precision of the axis");
+ RNA_def_property_ui_text(prop, "Axis Threshold", "Precision of the axis");
RNA_def_property_range(prop, 0, 32768);
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -832,21 +832,21 @@ static void rna_def_joystick_sensor(BlenderRNA *brna)
/* Single Axis */
prop= RNA_def_property(srna, "single_axis_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "axis_single");
- RNA_def_property_ui_text(prop, "Axis Number", "Specify a single axis (verticle/horizontal/other) to detect");
+ RNA_def_property_ui_text(prop, "Axis Number", "Single axis (vertical/horizontal/other) to detect");
RNA_def_property_range(prop, 1, 16);
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Hat */
prop= RNA_def_property(srna, "hat_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "hat");
- RNA_def_property_ui_text(prop, "Hat Number", "Specify which hat to use");
+ RNA_def_property_ui_text(prop, "Hat Number", "Which hat to use");
RNA_def_property_range(prop, 1, 2);
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "hat_direction", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "hatf");
RNA_def_property_enum_items(prop, hat_direction_items);
- RNA_def_property_ui_text(prop, "Hat Direction", "Specify hat direction");
+ RNA_def_property_ui_text(prop, "Hat Direction", "Hat direction");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index 4db23443895..4da4e6573f7 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -822,6 +822,9 @@ static void rna_def_strip_proxy(BlenderRNA *brna)
{SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN, "FREE_RUN_REC_DATE", 0, "Free Run (rec date)",
"Interpolate a global timestamp using the "
"record date and time written by recording device"},
+ {SEQ_PROXY_TC_RECORD_RUN_NO_GAPS, "FREE_RUN_NO_GAPS", 0, "Free Run No Gaps",
+ "Record run, but ignore timecode, "
+ "changes in framerate or dropouts"},
{0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "SequenceProxy", NULL);
@@ -1618,7 +1621,7 @@ static void rna_def_glow(BlenderRNA *brna)
prop= RNA_def_property(srna, "clamp", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fClamp");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Clamp", "rightness limit of intensity");
+ RNA_def_property_ui_text(prop, "Clamp", "Brightness limit of intensity");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
prop= RNA_def_property(srna, "boost_factor", PROP_FLOAT, PROP_NONE);
@@ -1722,7 +1725,7 @@ static void rna_def_solid_color(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "ColorSequence", "EffectSequence");
- RNA_def_struct_ui_text(srna, "Color Sequence", "Sequence strip creating an image filled with a single g");
+ RNA_def_struct_ui_text(srna, "Color Sequence", "Sequence strip creating an image filled with a single color");
RNA_def_struct_sdna_from(srna, "SolidColorVars", "effectdata");
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index f0a008b4939..a7f45d867dd 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2000,23 +2000,6 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
RNA_def_property_enum_items(prop, proxy_render_size_items);
RNA_def_property_ui_text(prop, "Proxy render size", "Draw preview using full resolution or different proxy resolutions");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
-
-
- /* not sure we need rna access to these but adding anyway */
- prop= RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "xof");
- RNA_def_property_ui_text(prop, "X Offset", "Offset image horizontally from the view center");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
-
- prop= RNA_def_property(srna, "offset_y", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "yof");
- RNA_def_property_ui_text(prop, "Y Offset", "Offset image vertically from the view center");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
-
- prop= RNA_def_property(srna, "zoom", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "zoom");
- RNA_def_property_ui_text(prop, "Zoom", "Display zoom level");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
}
static void rna_def_space_text(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c
index 89c17819265..bbec6484c5f 100644
--- a/source/blender/makesrna/intern/rna_tracking.c
+++ b/source/blender/makesrna/intern/rna_tracking.c
@@ -90,43 +90,87 @@ static void rna_tracking_defaultSettings_searchUpdate(Main *UNUSED(bmain), Scene
static void rna_tracking_tracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
MovieClip *clip= (MovieClip*)ptr->id.data;
+
rna_iterator_listbase_begin(iter, &clip->tracking.tracks, NULL);
}
-static void rna_tracking_tracks_add(MovieTracking *tracking, int frame, int number)
+static void rna_tracking_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
- int a;
+ MovieClip *clip= (MovieClip*)ptr->id.data;
- for(a= 0; a<number; a++)
- BKE_tracking_add_track(tracking, 0, 0, frame, 1, 1);
+ rna_iterator_listbase_begin(iter, &clip->tracking.objects, NULL);
+}
- WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
+static int rna_tracking_active_object_index_get(PointerRNA *ptr)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+
+ return clip->tracking.objectnr;
+}
+
+static void rna_tracking_active_object_index_set(PointerRNA *ptr, int value)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+
+ clip->tracking.objectnr= value;
+}
+
+static void rna_tracking_active_object_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+
+ *min= 0;
+ *max= clip->tracking.tot_object-1;
+ *max= MAX2(0, *max);
}
static PointerRNA rna_tracking_active_track_get(PointerRNA *ptr)
{
MovieClip *clip= (MovieClip*)ptr->id.data;
+ MovieTrackingTrack *act_track= BKE_tracking_active_track(&clip->tracking);
- return rna_pointer_inherit_refine(ptr, &RNA_MovieTrackingTrack, clip->tracking.act_track);
+ return rna_pointer_inherit_refine(ptr, &RNA_MovieTrackingTrack, act_track);
}
static void rna_tracking_active_track_set(PointerRNA *ptr, PointerRNA value)
{
MovieClip *clip= (MovieClip*)ptr->id.data;
MovieTrackingTrack *track= (MovieTrackingTrack *)value.data;
- int index= BLI_findindex(&clip->tracking.tracks, track);
+ ListBase *tracksbase= BKE_tracking_get_tracks(&clip->tracking);
+ int index= BLI_findindex(tracksbase, track);
- if(index>=0) clip->tracking.act_track= track;
- else clip->tracking.act_track= NULL;
+ if(index>=0)
+ clip->tracking.act_track= track;
+ else
+ clip->tracking.act_track= NULL;
}
void rna_trackingTrack_name_set(PointerRNA *ptr, const char *value)
{
MovieClip *clip= (MovieClip *)ptr->id.data;
+ MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
+ ListBase *tracksbase= &tracking->tracks;
+
BLI_strncpy(track->name, value, sizeof(track->name));
- BKE_track_unique_name(&clip->tracking, track);
+ /* TODO: it's a bit difficult to find list track came from knowing just
+ movie clip ID and MovieTracking structure, so keep this naive
+ search for a while */
+ if(BLI_findindex(tracksbase, track) < 0) {
+ MovieTrackingObject *object= tracking->objects.first;
+
+ while(object) {
+ if(BLI_findindex(&object->tracks, track)) {
+ tracksbase= &object->tracks;
+ break;
+ }
+
+ object= object->next;
+ }
+ }
+
+ BKE_track_unique_name(tracksbase, track);
}
static int rna_trackingTrack_select_get(PointerRNA *ptr)
@@ -257,8 +301,102 @@ static void rna_tracking_flushUpdate(Main *UNUSED(bmain), Scene *scene, PointerR
DAG_id_tag_update(&clip->id, 0);
}
+static void rna_trackingObject_tracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ MovieTrackingObject *object= (MovieTrackingObject* )ptr->data;
+
+ rna_iterator_listbase_begin(iter, &object->tracks, NULL);
+}
+
+static PointerRNA rna_tracking_active_object_get(PointerRNA *ptr)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+ MovieTrackingObject *object= BLI_findlink(&clip->tracking.objects, clip->tracking.objectnr);
+
+ return rna_pointer_inherit_refine(ptr, &RNA_MovieTrackingObject, object);
+}
+
+static void rna_tracking_active_object_set(PointerRNA *ptr, PointerRNA value)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+ MovieTrackingObject *object= (MovieTrackingObject *)value.data;
+ int index= BLI_findindex(&clip->tracking.objects, object);
+
+ if(index>=0) clip->tracking.objectnr= index;
+ else clip->tracking.objectnr= 0;
+}
+
+void rna_trackingObject_name_set(PointerRNA *ptr, const char *value)
+{
+ MovieClip *clip= (MovieClip *)ptr->id.data;
+ MovieTrackingObject *object= (MovieTrackingObject *)ptr->data;
+
+ BLI_strncpy(object->name, value, sizeof(object->name));
+
+ BKE_tracking_object_unique_name(&clip->tracking, object);
+}
+
+static void rna_trackingObject_flushUpdate(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+{
+ MovieClip *clip= (MovieClip*)ptr->id.data;
+
+ WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, NULL);
+ DAG_id_tag_update(&clip->id, 0);
+}
+
/* API */
+static void add_tracks_to_base(MovieClip *clip, MovieTracking *tracking, ListBase *tracksbase, int frame, int number)
+{
+ int a, width, height;
+ MovieClipUser user= {0};
+
+ user.framenr= 1;
+
+ BKE_movieclip_get_size(clip, &user, &width, &height);
+
+ for(a= 0; a<number; a++)
+ BKE_tracking_add_track(tracking, tracksbase, 0, 0, frame, width, height);
+}
+
+static void rna_tracking_tracks_add(ID *id, MovieTracking *tracking, int frame, int number)
+{
+ MovieClip *clip= (MovieClip *) id;
+
+ add_tracks_to_base(clip, tracking, &tracking->tracks, frame, number);
+
+ WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
+}
+
+static void rna_trackingObject_tracks_add(ID *id, MovieTrackingObject *object, int frame, int number)
+{
+ MovieClip *clip= (MovieClip *) id;
+ ListBase *tracksbase= &object->tracks;
+
+ if(object->flag&TRACKING_OBJECT_CAMERA)
+ tracksbase= &clip->tracking.tracks;
+
+ add_tracks_to_base(clip, &clip->tracking, tracksbase, frame, number);
+
+ WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
+}
+
+static MovieTrackingObject *rna_tracking_object_new(MovieTracking *tracking, const char *name)
+{
+ MovieTrackingObject *object= BKE_tracking_new_object(tracking, name);
+
+ WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
+
+ return object;
+}
+
+void rna_tracking_object_remove(MovieTracking *tracking, MovieTrackingObject *object)
+{
+ BKE_tracking_remove_object(tracking, object);
+
+ WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
+}
+
static MovieTrackingMarker *rna_trackingTrack_marker_find_frame(MovieTrackingTrack *track, int framenr)
{
return BKE_tracking_get_marker(track, framenr);
@@ -269,6 +407,7 @@ static MovieTrackingMarker *rna_trackingTrack_marker_find_frame(MovieTrackingTra
static EnumPropertyItem tracker_items[] = {
{TRACKER_KLT, "KLT", 0, "KLT", "Kanade–Lucas–Tomasi tracker which works with most of video clips, a bit slower than SAD"},
{TRACKER_SAD, "SAD", 0, "SAD", "Sum of Absolute Differences tracker which can be used when KLT tracker fails"},
+ {TRACKER_HYBRID, "Hybrid", 0, "Hybrid", "A hybrid tracker that uses SAD for rough tracking, KLT for refinement."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem pattern_match_items[] = {
@@ -301,17 +440,17 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
static EnumPropertyItem refine_items[] = {
{0, "NONE", 0, "Nothing", "Do not refine camera intrinsics"},
{REFINE_FOCAL_LENGTH, "FOCAL_LENGTH", 0, "Focal Length", "Refine focal length"},
+ {REFINE_FOCAL_LENGTH|REFINE_RADIAL_DISTORTION_K1, "FOCAL_LENGTH_RADIAL_K1", 0, "Focal length, K1", "Refine focal length and radial distortion K1"},
{REFINE_FOCAL_LENGTH|
- REFINE_PRINCIPAL_POINT, "FOCAL_LENGTH_PRINCIPAL_POINT", 0, "Focal Length, Optical Center", "Refine focal length and optical center"},
+ REFINE_RADIAL_DISTORTION_K1|
+ REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_RADIAL_K1_K2", 0, "Focal length, K1, K2", "Refine focal length and radial distortion K1 and K2"},
{REFINE_FOCAL_LENGTH|
REFINE_PRINCIPAL_POINT|
REFINE_RADIAL_DISTORTION_K1|
REFINE_RADIAL_DISTORTION_K2,
"FOCAL_LENGTH_PRINCIPAL_POINT_RADIAL_K1_K2", 0, "Focal Length, Optical Center, K1, K2", "Refine focal length, optical center and radial distortion K1 and K2"},
{REFINE_FOCAL_LENGTH|
- REFINE_RADIAL_DISTORTION_K1|
- REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_RADIAL_K1_K2", 0, "Focal length, K1. K2", "Refine focal length and radial distortion K1 and K2"},
- {REFINE_FOCAL_LENGTH|REFINE_RADIAL_DISTORTION_K1, "FOCAL_LENGTH_RADIAL_K1", 0, "Focal length, K1", "Refine focal length and radial distortion K1"},
+ REFINE_PRINCIPAL_POINT, "FOCAL_LENGTH_PRINCIPAL_POINT", 0, "Focal Length, Optical Center", "Refine focal length and optical center"},
{0, NULL, 0, NULL, NULL}
};
@@ -441,6 +580,14 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
RNA_def_property_range(prop, 5, 1000);
RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_searchUpdate");
RNA_def_property_ui_text(prop, "Search Size", "Size of search area for newly created tracks");
+
+ /* object distance */
+ prop= RNA_def_property(srna, "object_distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_float_sdna(prop, NULL, "object_distance");
+ RNA_def_property_ui_text(prop, "Distance", "Distance between two bundles used for object scaling");
+ RNA_def_property_range(prop, 0.001, 10000);
+ RNA_def_property_ui_range(prop, 0.001, 10000.0, 1, 3);
}
static void rna_def_trackingCamera(BlenderRNA *brna)
@@ -672,6 +819,12 @@ static void rna_def_trackingTrack(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Blue Channel", "Use blue channel from footage for tracking");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+ /* preview_grayscale */
+ prop= RNA_def_property(srna, "use_grayscale_preview", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_PREVIEW_GRAYSCALE);
+ RNA_def_property_ui_text(prop, "Grayscale", "Display what the tracking algorithm sees in the preview");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+
/* has bundle */
prop= RNA_def_property(srna, "has_bundle", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_HAS_BUNDLE);
@@ -882,18 +1035,18 @@ static void rna_def_trackingReconstruction(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Cameras", "Collection of solved cameras");
}
-static void rna_def_trackingTracks(BlenderRNA *brna, PropertyRNA *cprop)
+static void rna_def_trackingTracks(BlenderRNA *brna)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *prop;
- RNA_def_property_srna(cprop, "MovieTrackingTracks");
srna= RNA_def_struct(brna, "MovieTrackingTracks", NULL);
RNA_def_struct_sdna(srna, "MovieTracking");
RNA_def_struct_ui_text(srna, "Movie Tracks", "Collection of movie tracking tracks");
func= RNA_def_function(srna, "add", "rna_tracking_tracks_add");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID);
RNA_def_function_ui_description(func, "Add a number of tracks to this movie clip");
RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to add tracks on", MINFRAME, MAXFRAME);
RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of tracks to add to the movie clip", 0, INT_MAX);
@@ -906,6 +1059,105 @@ static void rna_def_trackingTracks(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object");
}
+static void rna_def_trackingObjectTracks(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "MovieTrackingObjectTracks", NULL);
+ RNA_def_struct_sdna(srna, "MovieTrackingObject");
+ RNA_def_struct_ui_text(srna, "Movie Tracks", "Collection of movie tracking tracks");
+
+ func= RNA_def_function(srna, "add", "rna_trackingObject_tracks_add");
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+ RNA_def_function_ui_description(func, "Add a number of tracks to this movie clip");
+ RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to add tracks on", MINFRAME, MAXFRAME);
+ RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of tracks to add to the movie clip", 0, INT_MAX);
+
+ /* active track */
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "MovieTrackingTrack");
+ RNA_def_property_pointer_funcs(prop, "rna_tracking_active_track_get", "rna_tracking_active_track_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
+ RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object");
+}
+
+static void rna_def_trackingObject(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "MovieTrackingObject", NULL);
+ RNA_def_struct_ui_text(srna, "Movie tracking object data", "Match-moving object tracking and reconstruction data");
+
+ /* name */
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "Unique name of object");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_trackingObject_name_set");
+ RNA_def_property_string_maxlength(prop, MAX_ID_NAME);
+ RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
+ RNA_def_struct_name_property(srna, prop);
+
+ /* is_camera */
+ prop= RNA_def_property(srna, "is_camera", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_OBJECT_CAMERA);
+ RNA_def_property_ui_text(prop, "Camera", "Object is used for camera tracking");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+
+ /* tracks */
+ prop= RNA_def_property(srna, "tracks", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_funcs(prop, "rna_trackingObject_tracks_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
+ RNA_def_property_struct_type(prop, "MovieTrackingTrack");
+ RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks in this tracking data object");
+ RNA_def_property_srna(prop, "MovieTrackingObjectTracks");
+
+ /* reconstruction */
+ prop= RNA_def_property(srna, "reconstruction", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "MovieTrackingReconstruction");
+
+ /* scale */
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_range(prop, 0.0001f, 10000.0f);
+ RNA_def_property_ui_range(prop, 0.0001f, 10000.0, 1, 4);
+ RNA_def_property_ui_text(prop, "Scale", "Scale of object solution in camera space");
+ RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_trackingObject_flushUpdate");
+}
+
+static void rna_def_trackingObjects(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "MovieTrackingObjects");
+ srna= RNA_def_struct(brna, "MovieTrackingObjects", NULL);
+ RNA_def_struct_sdna(srna, "MovieTracking");
+ RNA_def_struct_ui_text(srna, "Movie Objects", "Collection of movie trackingobjects");
+
+ func= RNA_def_function(srna, "new", "rna_tracking_object_new");
+ RNA_def_function_ui_description(func, "Add tracking object to this movie clip");
+ RNA_def_string(func, "name", "", 0, "", "Name of new object");
+ parm= RNA_def_pointer(func, "object", "MovieTrackingObject", "", "New motion tracking object");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_tracking_object_remove");
+ RNA_def_function_ui_description(func, "Remove tracking object from this movie clip");
+ parm= RNA_def_pointer(func, "object", "MovieTrackingObject", "", "Motion tracking object to be removed");
+
+ /* active object */
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "MovieTrackingObject");
+ RNA_def_property_pointer_funcs(prop, "rna_tracking_active_object_get", "rna_tracking_active_object_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
+ RNA_def_property_ui_text(prop, "Active Object", "Active object in this tracking data object");
+}
+
static void rna_def_tracking(BlenderRNA *brna)
{
StructRNA *srna;
@@ -914,8 +1166,11 @@ static void rna_def_tracking(BlenderRNA *brna)
rna_def_trackingSettings(brna);
rna_def_trackingCamera(brna);
rna_def_trackingTrack(brna);
+ rna_def_trackingTracks(brna);
+ rna_def_trackingObjectTracks(brna);
rna_def_trackingStabilization(brna);
rna_def_trackingReconstruction(brna);
+ rna_def_trackingObject(brna);
srna= RNA_def_struct(brna, "MovieTracking", NULL);
RNA_def_struct_ui_text(srna, "Movie tracking data", "Match-moving data for tracking");
@@ -933,7 +1188,7 @@ static void rna_def_tracking(BlenderRNA *brna)
RNA_def_property_collection_funcs(prop, "rna_tracking_tracks_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
RNA_def_property_struct_type(prop, "MovieTrackingTrack");
RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks in this tracking data object");
- rna_def_trackingTracks(brna, prop);
+ RNA_def_property_srna(prop, "MovieTrackingTracks");
/* stabilization */
prop= RNA_def_property(srna, "stabilization", PROP_POINTER, PROP_NONE);
@@ -942,6 +1197,20 @@ static void rna_def_tracking(BlenderRNA *brna)
/* reconstruction */
prop= RNA_def_property(srna, "reconstruction", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "MovieTrackingReconstruction");
+
+ /* objects */
+ prop= RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_funcs(prop, "rna_tracking_objects_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
+ RNA_def_property_struct_type(prop, "MovieTrackingObject");
+ RNA_def_property_ui_text(prop, "Objects", "Collection of objects in this tracking data object");
+ rna_def_trackingObjects(brna, prop);
+
+ /* active object index */
+ prop= RNA_def_property(srna, "active_object_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "objectnr");
+ RNA_def_property_int_funcs(prop, "rna_tracking_active_object_index_get", "rna_tracking_active_object_index_set", "rna_tracking_active_object_index_range");
+ RNA_def_property_ui_text(prop, "Active Object Index", "Index of active object");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
}
void RNA_def_tracking(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 0ea6b902150..164f8e4f0d0 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -2607,40 +2607,43 @@ static void rna_def_userdef_system(BlenderRNA *brna)
/* hardcoded here, could become dynamic somehow */
/* locale according to http://www.roseindia.net/tutorials/I18N/locales-list.shtml */
/* if you edit here, please also edit the source/blender/blenfont/intern/blf_lang.c 's locales */
+ /* Note: As this list is in alphabetical order, and not defined order,
+ * here is the highest define currently in use: 28 (serbian latin). */
static EnumPropertyItem language_items[] = {
- {0, "", 0, "Nearly done", ""},
- {0, "DEFAULT", 0, "Default (Default)", ""},
- {1, "ENGLISH", 0, "English (English)", "en_US"},
- {8, "FRENCH", 0, "French (Français)", "fr_FR"},
- {4, "ITALIAN", 0, "Italian (Italiano)", "it_IT"},
+ { 0, "", 0, "Nearly done", ""},
+ { 0, "DEFAULT", 0, "Default (Default)", ""},
+ { 1, "ENGLISH", 0, "English (English)", "en_US"},
+ { 8, "FRENCH", 0, "French (Français)", "fr_FR"},
+ { 4, "ITALIAN", 0, "Italian (Italiano)", "it_IT"},
{15, "RUSSIAN", 0, "Russian (Русский)", "ru_RU"},
{13, "SIMPLIFIED_CHINESE", 0, "Simplified Chinese (简体中文)", "zh_CN"},
- {9, "SPANISH", 0, "Spanish (Español)", "es"},
+ { 9, "SPANISH", 0, "Spanish (Español)", "es"},
{14, "TRADITIONAL_CHINESE", 0, "Traditional Chinese (繁體中文)", "zh_TW"},
- {0, "", 0, "In progress", ""},
- {2, "JAPANESE", 0, "Japanese (日本語)", "ja_JP"},
- {3, "DUTCH", 0, "Dutch (Nederlandse taal)", "nl_NL"},
- {5, "GERMAN", 0, "German (Deutsch)", "de_DE"},
- {6, "FINNISH", 0, "Finnish (Suomi)", "fi_FI"},
- {7, "SWEDISH", 0, "Swedish (Svenska)", "sv_SE"},
- {10, "CATALAN", 0, "Catalan (Català)", "ca_AD"},
- {11, "CZECH", 0, "Czech (Český)", "cs_CZ"},
- {12, "BRAZILIAN_PORTUGUESE", 0, "Brazilian Portuguese (Português do Brasil)", "pt_BR"},
- {16, "CROATIAN", 0, "Croatian (Hrvatski)", "hr_HR"},
- {17, "SERBIAN", 0, "Serbian (Српском језику)", "sr_RS"},
- {18, "UKRAINIAN", 0, "Ukrainian (Український)", "uk_UA"},
- {19, "POLISH", 0, "Polish (Polski)", "pl_PL"},
- {20, "ROMANIAN", 0, "Romanian (Român)", "ro_RO"},
+ { 0, "", 0, "In progress", ""},
/* using the utf8 flipped form of Arabic (العربية) */
{21, "ARABIC", 0, "Arabic (ﺔﻴﺑﺮﻌﻟﺍ)", "ar_EG"},
+ {12, "BRAZILIAN_PORTUGUESE", 0, "Brazilian Portuguese (Português do Brasil)", "pt_BR"},
{22, "BULGARIAN", 0, "Bulgarian (Български)", "bg_BG"},
+ {10, "CATALAN", 0, "Catalan (Català)", "ca_AD"},
+ {16, "CROATIAN", 0, "Croatian (Hrvatski)", "hr_HR"},
+ {11, "CZECH", 0, "Czech (Český)", "cs_CZ"},
+ { 3, "DUTCH", 0, "Dutch (Nederlandse taal)", "nl_NL"},
+ { 6, "FINNISH", 0, "Finnish (Suomi)", "fi_FI"},
+ { 5, "GERMAN", 0, "German (Deutsch)", "de_DE"},
{23, "GREEK", 0, "Greek (Ελληνικά)", "el_GR"},
+ {27, "INDONESIAN", 0, "Indonesian (Bahasa indonesia)", "id_ID"},
+ { 2, "JAPANESE", 0, "Japanese (日本語)", "ja_JP"},
{24, "KOREAN", 0, "Korean (한국 언어)", "ko_KR"},
{25, "NEPALI", 0, "Nepali (नेपाली)", "ne_NP"},
/* using the utf8 flipped form of Persian (فارسی) */
{26, "PERSIAN", 0, "Persian (ﯽﺳﺭﺎﻓ)", "fa_PE"},
- {27, "INDONESIAN", 0, "Indonesian (Bahasa indonesia)", "id_ID"},
- {0, NULL, 0, NULL, NULL}};
+ {19, "POLISH", 0, "Polish (Polski)", "pl_PL"},
+ {20, "ROMANIAN", 0, "Romanian (Român)", "ro_RO"},
+ {17, "SERBIAN", 0, "Serbian (Српски)", "sr_RS"},
+ {28, "SERBIAN_LATIN", 0, "Serbian latin (Srpski latinica)", "sr_RS@latin"},
+ { 7, "SWEDISH", 0, "Swedish (Svenska)", "sv_SE"},
+ {18, "UKRAINIAN", 0, "Ukrainian (Український)", "uk_UA"},
+ { 0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "UserPreferencesSystem", NULL);
RNA_def_struct_sdna(srna, "UserDef");
@@ -2929,6 +2932,11 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_range(prop, 3, 40);
RNA_def_property_ui_text(prop, "Drag Threshold", "Amount of pixels you have to drag before dragging UI items happens");
+ prop= RNA_def_property(srna, "tweak_threshold", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "tweak_threshold");
+ RNA_def_property_range(prop, 3, 1024);
+ RNA_def_property_ui_text(prop, "Tweak Threshold", "Number of pixels you have to drag before tweak event is triggered");
+
/* 3D mouse settings */
/* global options */
prop= RNA_def_property(srna, "ndof_sensitivity", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index 840498249ea..087716adbe3 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -143,6 +143,7 @@ static void rna_def_world_mtex(BlenderRNA *brna)
{TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates (interior mist)"},
{TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Use 360 degree angular coordinates, e.g. for spherical light probes"},
{TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"},
+ {TEXCO_EQUIRECTMAP, "EQUIRECT", 0, "Equirectangular", "For 360 degree panorama sky, equirectangular mapping"},
{TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"},
{TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
{0, NULL, 0, NULL, NULL}};
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 87498b3bb63..c6cb6584973 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -40,7 +40,7 @@ set(INC
set(INC_SYS
${ZLIB_INCLUDE_DIRS}
- ${GLEW_INCLUDE_PATH}
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
@@ -70,6 +70,7 @@ set(SRC
intern/MOD_ocean.c
intern/MOD_particleinstance.c
intern/MOD_particlesystem.c
+ intern/MOD_remesh.c
intern/MOD_screw.c
intern/MOD_shapekey.c
intern/MOD_shrinkwrap.c
@@ -106,6 +107,13 @@ if(WITH_MOD_BOOLEAN)
)
endif()
+if(WITH_MOD_REMESH)
+ add_definitions(-DWITH_MOD_REMESH)
+ list(APPEND INC
+ ../../../intern/dualcon
+ )
+endif()
+
if(WITH_MOD_DECIMATE)
add_definitions(-DWITH_MOD_DECIMATE)
list(APPEND INC
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index 3208f0d3aab..fec6545678a 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -73,6 +73,7 @@ extern ModifierTypeInfo modifierType_WeightVGEdit;
extern ModifierTypeInfo modifierType_WeightVGMix;
extern ModifierTypeInfo modifierType_WeightVGProximity;
extern ModifierTypeInfo modifierType_DynamicPaint;
+extern ModifierTypeInfo modifierType_Remesh;
/* MOD_util.c */
void modifier_type_init(ModifierTypeInfo *types[]);
diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript
index 8273ab0d1fe..03fcee399bd 100644
--- a/source/blender/modifiers/SConscript
+++ b/source/blender/modifiers/SConscript
@@ -16,6 +16,10 @@ defs = []
if env ['WITH_BF_BOOLEAN']:
defs.append('WITH_MOD_BOOLEAN')
+if env['WITH_BF_REMESH']:
+ incs += ' #/intern/dualcon'
+ defs.append('WITH_MOD_REMESH')
+
if env ['WITH_BF_DECIMATE']:
defs.append('WITH_MOD_DECIMATE')
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index ce052b2c1bd..4602600889c 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -338,7 +338,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
unit_m4(final_offset);
for(j=0; j < count - 1; j++) {
- mul_m4_m4m4(tmp_mat, final_offset, offset);
+ mult_m4_m4m4(tmp_mat, offset, final_offset);
copy_m4_m4(final_offset, tmp_mat);
}
@@ -679,7 +679,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
cap_medge = end_cap->getEdgeArray(end_cap);
cap_mface = end_cap->getFaceArray(end_cap);
- mul_m4_m4m4(endoffset, final_offset, offset);
+ mult_m4_m4m4(endoffset, offset, final_offset);
vert_map = MEM_callocN(sizeof(*vert_map) * capVerts,
"arrayModifier_doArray vert_map");
diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c
index 843501133c5..afd16b41131 100644
--- a/source/blender/modifiers/intern/MOD_boolean_util.c
+++ b/source/blender/modifiers/intern/MOD_boolean_util.c
@@ -474,7 +474,7 @@ static DerivedMesh *NewBooleanDerivedMesh_intern(
// we need to compute the inverse transform from global to ob (inv_mat),
// and the transform from ob to ob_select for use in interpolation (map_mat)
invert_m4_m4(inv_mat, ob->obmat);
- mul_m4_m4m4(map_mat, ob_select->obmat, inv_mat);
+ mult_m4_m4m4(map_mat, inv_mat, ob_select->obmat);
invert_m4_m4(inv_mat, ob_select->obmat);
{
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index c91cabd4a37..16d57a2400f 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -159,7 +159,7 @@ static void sphere_do(
if (ctrl_ob) {
if(flag & MOD_CAST_USE_OB_TRANSFORM) {
invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat);
- mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat);
+ mult_m4_m4m4(mat, ctrl_ob->imat, ob->obmat);
invert_m4_m4(imat, mat);
}
@@ -200,11 +200,11 @@ static void sphere_do(
* with or w/o a vgroup. With lots of if's in the code below,
* further optimizations are possible, if needed */
if (dvert) { /* with a vgroup */
+ MDeformVert *dv= dvert;
float fac_orig = fac;
- for (i = 0; i < numVerts; i++) {
- MDeformWeight *dw = NULL;
- int j;
+ for (i = 0; i < numVerts; i++, dv++) {
float tmp_co[3];
+ float weight;
copy_v3_v3(tmp_co, vertexCos[i]);
if(ctrl_ob) {
@@ -224,15 +224,10 @@ static void sphere_do(
if (len_v3(vec) > cmd->radius) continue;
}
- for (j = 0; j < dvert[i].totweight; ++j) {
- if(dvert[i].dw[j].def_nr == defgrp_index) {
- dw = &dvert[i].dw[j];
- break;
- }
- }
- if (!dw) continue;
+ weight= defvert_find_weight(dv, defgrp_index);
+ if (weight <= 0.0f) continue;
- fac = fac_orig * dw->weight;
+ fac = fac_orig * weight;
facm = 1.0f - fac;
normalize_v3(vec);
@@ -336,7 +331,7 @@ static void cuboid_do(
if (ctrl_ob) {
if(flag & MOD_CAST_USE_OB_TRANSFORM) {
invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat);
- mul_m4_m4m4(mat, ob->obmat, ctrl_ob->imat);
+ mult_m4_m4m4(mat, ctrl_ob->imat, ob->obmat);
invert_m4_m4(imat, mat);
}
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index aba68dc9edc..d1092345930 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -38,13 +38,13 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "MEM_guardedalloc.h"
-#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
+#include "BKE_cdderivedmesh.h"
-#include "MEM_guardedalloc.h"
#ifdef WITH_MOD_DECIMATE
#include "LOD_decimation.h"
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
index 29ff5975e85..773e93a22ad 100644
--- a/source/blender/modifiers/intern/MOD_dynamicpaint.c
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -1,16 +1,29 @@
/*
-* ***** BEGIN GPL LICENSE BLOCK *****
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* Contributor(s): Miika Hämäläinen
-*
-* ***** END GPL LICENSE BLOCK *****
-*
-*/
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Miika Hämäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/modifiers/intern/MOD_dynamicpaint.c
+ * \ingroup modifiers
+ */
#include <stddef.h>
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index a4097d8967b..32ab2c82f90 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -47,12 +47,12 @@
#include "BLI_utildefines.h"
#include "BLI_linklist.h"
+#include "MEM_guardedalloc.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
-#include "MEM_guardedalloc.h"
#include "MOD_util.h"
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index 9821c0b3836..b18be28ac7f 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -556,10 +556,11 @@ static DerivedMesh * cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2");
int *facepa = emd->facepa;
int *fs, totesplit=0,totfsplit=0,curdupface=0;
- int i,j,v1,v2,v3,v4,esplit,
+ int i, v1, v2, v3, v4, esplit,
v[4] = {0, 0, 0, 0}, /* To quite gcc barking... */
uv[4] = {0, 0, 0, 0}; /* To quite gcc barking... */
int numlayer;
+ unsigned int ed_v1, ed_v2;
edgehash= BLI_edgehash_new();
@@ -650,16 +651,16 @@ static DerivedMesh * cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
/* create new verts */
ehi= BLI_edgehashIterator_new(edgehash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- BLI_edgehashIterator_getKey(ehi, &i, &j);
+ BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2);
esplit= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
- mv=CDDM_get_vert(splitdm,j);
+ mv=CDDM_get_vert(splitdm, ed_v2);
dupve=CDDM_get_vert(splitdm,esplit);
- DM_copy_vert_data(splitdm,splitdm,j,esplit,1);
+ DM_copy_vert_data(splitdm,splitdm, ed_v2, esplit,1);
*dupve=*mv;
- mv=CDDM_get_vert(splitdm,i);
+ mv=CDDM_get_vert(splitdm, ed_v1);
add_v3_v3(dupve->co, mv->co);
mul_v3_fl(dupve->co, 0.5f);
@@ -789,7 +790,8 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
/* float timestep; */
int *facepa=emd->facepa;
int totdup=0,totvert=0,totface=0,totpart=0;
- int i, j, v, mindex=0;
+ int i, v;
+ unsigned int ed_v1, ed_v2, mindex=0;
MTFace *mtface = NULL, *mtf;
totface= dm->getNumFaces(dm);
@@ -852,24 +854,24 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
MVert *dest;
/* get particle + vertex from hash */
- BLI_edgehashIterator_getKey(ehi, &j, &i);
- i -= totvert;
+ BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2);
+ ed_v2 -= totvert;
v= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
- dm->getVert(dm, j, &source);
+ dm->getVert(dm, ed_v1, &source);
dest = CDDM_get_vert(explode,v);
- DM_copy_vert_data(dm,explode,j,v,1);
+ DM_copy_vert_data(dm, explode, ed_v1, v, 1);
*dest = source;
- if(i!=totpart) {
+ if(ed_v2 != totpart) {
/* get particle */
- pa= pars+i;
+ pa= pars + ed_v2;
psys_get_birth_coordinates(&sim, pa, &birth, 0, 0);
state.time=cfra;
- psys_get_particle_state(&sim, i, &state, 1);
+ psys_get_particle_state(&sim, ed_v2, &state, 1);
vertco=CDDM_get_vert(explode,v)->co;
mul_m4_v3(ob->obmat,vertco);
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c
index 6541b15f66e..0452c6a4e73 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c
@@ -499,16 +499,20 @@ static DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, Fluidsim
}
// assign material + flags to new dm
+ // if there's no faces in original dm, keep materials and flags unchanged
mface = orgdm->getFaceArray(orgdm);
- mat_nr = mface[0].mat_nr;
- flag = mface[0].flag;
- mface = dm->getFaceArray(dm);
- numfaces = dm->getNumFaces(dm);
- for(i=0; i<numfaces; i++)
- {
- mface[i].mat_nr = mat_nr;
- mface[i].flag = flag;
+ if(mface) {
+ mat_nr = mface[0].mat_nr;
+ flag = mface[0].flag;
+
+ mface = dm->getFaceArray(dm);
+ numfaces = dm->getNumFaces(dm);
+ for(i=0; i<numfaces; i++)
+ {
+ mface[i].mat_nr = mat_nr;
+ mface[i].flag = flag;
+ }
}
// load vertex velocities, if they exist...
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index 30e801c9b42..f5e4ebfd449 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -143,14 +143,9 @@ static float hook_falloff(float *co_1, float *co_2, const float falloff_squared,
return fac;
}
-static void deformVerts(ModifierData *md, Object *ob,
- DerivedMesh *dm,
- float (*vertexCos)[3],
- int numVerts,
- int UNUSED(useRenderParams),
- int UNUSED(isFinalCalc))
+static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm,
+ float (*vertexCos)[3], int numVerts)
{
- HookModifierData *hmd = (HookModifierData*) md;
bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
float vec[3], mat[4][4], dmat[4][4];
int i, *index_pt;
@@ -162,7 +157,7 @@ static void deformVerts(ModifierData *md, Object *ob,
/* get world-space matrix of target, corrected for the space the verts are in */
if (hmd->subtarget[0] && pchan) {
/* bone target if there's a matching pose-channel */
- mul_m4_m4m4(dmat, pchan->pose_mat, hmd->object->obmat);
+ mult_m4_m4m4(dmat, hmd->object->obmat, pchan->pose_mat);
}
else {
/* just object target */
@@ -190,22 +185,20 @@ static void deformVerts(ModifierData *md, Object *ob,
const float fac_orig= hmd->force;
float fac;
const int *origindex_ar;
-
- /* if DerivedMesh is present and has original index data,
- * use it
- */
+
+ /* if DerivedMesh is present and has original index data, use it */
if(dm && (origindex_ar= dm->getVertDataArray(dm, CD_ORIGINDEX))) {
for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
if(*index_pt < numVerts) {
int j;
-
+
for(j = 0; j < numVerts; j++) {
if(origindex_ar[j] == *index_pt) {
float *co = vertexCos[j];
if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
if(dvert)
fac *= defvert_find_weight(dvert+j, defgrp_index);
-
+
if(fac) {
mul_v3_m4v3(vec, mat, co);
interp_v3_v3v3(co, co, vec, fac);
@@ -223,7 +216,7 @@ static void deformVerts(ModifierData *md, Object *ob,
if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
if(dvert)
fac *= defvert_find_weight(dvert+(*index_pt), defgrp_index);
-
+
if(fac) {
mul_v3_m4v3(vec, mat, co);
interp_v3_v3v3(co, co, vec, fac);
@@ -235,11 +228,11 @@ static void deformVerts(ModifierData *md, Object *ob,
}
else if(dvert) { /* vertex group hook */
const float fac_orig= hmd->force;
-
+
for(i = 0; i < max_dvert; i++, dvert++) {
float fac;
float *co = vertexCos[i];
-
+
if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
fac *= defvert_find_weight(dvert, defgrp_index);
if(fac) {
@@ -251,17 +244,35 @@ static void deformVerts(ModifierData *md, Object *ob,
}
}
-static void deformVertsEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], int numVerts,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
+ HookModifierData *hmd = (HookModifierData*) md;
DerivedMesh *dm = derivedData;
+ /* We need a valid dm for meshes when a vgroup is set... */
+ if(!dm && ob->type == OB_MESH && hmd->name[0] != '\0')
+ dm = get_dm(ob, NULL, dm, NULL, 0);
+
+ deformVerts_do(hmd, ob, dm, vertexCos, numVerts);
+
+ if(derivedData != dm)
+ dm->release(dm);
+}
- if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
+static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData,
+ DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+ HookModifierData *hmd = (HookModifierData*) md;
+ DerivedMesh *dm = derivedData;
+ /* We need a valid dm for meshes when a vgroup is set... */
+ if(!dm && ob->type == OB_MESH && hmd->name[0] != '\0')
+ dm = get_dm(ob, editData, dm, NULL, 0);
- deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
+ deformVerts_do(hmd, ob, dm, vertexCos, numVerts);
- if(!derivedData) dm->release(dm);
+ if(derivedData != dm)
+ dm->release(dm);
}
diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c
index 4145dafce7b..1fbe0eef6f3 100644
--- a/source/blender/modifiers/intern/MOD_mask.c
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -137,12 +137,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
bDeformGroup *def;
char *bone_select_array;
int bone_select_tot= 0;
+ const int defbase_tot= BLI_countlist(&ob->defbase);
/* check that there is armature object with bones to use, otherwise return original mesh */
if (ELEM3(NULL, mmd->ob_arm, mmd->ob_arm->pose, ob->defbase.first))
return derivedData;
- bone_select_array= MEM_mallocN(BLI_countlist(&ob->defbase) * sizeof(char), "mask array");
+ bone_select_array= MEM_mallocN(defbase_tot * sizeof(char), "mask array");
for (i = 0, def = ob->defbase.first; def; def = def->next, i++)
{
@@ -194,12 +195,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
MDeformWeight *dw= dv->dw;
int j;
- for (j= dv->totweight; j > 0; j--, dw++)
- {
- if (bone_select_array[dw->def_nr])
- {
- if(dw->weight != 0.0f) {
- break;
+ for (j= dv->totweight; j > 0; j--, dw++) {
+ if (dw->def_nr < defbase_tot) {
+ if (bone_select_array[dw->def_nr]) {
+ if(dw->weight != 0.0f) {
+ break;
+ }
}
}
}
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index c211efd64b8..e6e2c0fd621 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -188,7 +188,6 @@ static void meshdeformModifier_do(
struct EditMesh *em = (me)? BKE_mesh_get_editmesh(me): NULL;
DerivedMesh *tmpdm, *cagedm;
MDeformVert *dvert = NULL;
- MDeformWeight *dw;
MDefInfluence *influences;
int *offsets;
float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
@@ -224,8 +223,8 @@ static void meshdeformModifier_do(
/* compute matrices to go in and out of cage object space */
invert_m4_m4(imat, mmd->object->obmat);
- mul_m4_m4m4(cagemat, ob->obmat, imat);
- mul_m4_m4m4(cmat, cagemat, mmd->bindmat);
+ mult_m4_m4m4(cagemat, imat, ob->obmat);
+ mult_m4_m4m4(cmat, mmd->bindmat, cagemat);
invert_m4_m4(iobmat, cmat);
copy_m3_m4(icagemat, iobmat);
@@ -293,21 +292,14 @@ static void meshdeformModifier_do(
continue;
if(dvert) {
- for(dw=NULL, a=0; a<dvert[b].totweight; a++) {
- if(dvert[b].dw[a].def_nr == defgrp_index) {
- dw = &dvert[b].dw[a];
- break;
- }
- }
+ fac= defvert_find_weight(&dvert[b], defgrp_index);
- if(mmd->flag & MOD_MDEF_INVERT_VGROUP) {
- if(!dw) fac= 1.0f;
- else if(dw->weight == 1.0f) continue;
- else fac=1.0f-dw->weight;
+ if (mmd->flag & MOD_MDEF_INVERT_VGROUP) {
+ fac= 1.0f - fac;
}
- else {
- if(!dw) continue;
- else fac= dw->weight;
+
+ if (fac <= 0.0) {
+ continue;
}
}
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index 2e744337b97..c130af158bb 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -64,7 +64,6 @@ static void copyData(ModifierData *md, ModifierData *target)
MirrorModifierData *mmd = (MirrorModifierData*) md;
MirrorModifierData *tmmd = (MirrorModifierData*) target;
- tmmd->axis = mmd->axis;
tmmd->flag = mmd->flag;
tmmd->tolerance = mmd->tolerance;
tmmd->mirror_ob = mmd->mirror_ob;
@@ -96,10 +95,9 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
}
static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
- Object *ob,
- DerivedMesh *dm,
- int initFlags,
- int axis)
+ Object *ob,
+ DerivedMesh *dm,
+ int axis)
{
int i;
float tolerance = mmd->tolerance;
@@ -110,7 +108,7 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
int maxFaces = dm->getNumFaces(dm);
int *flip_map= NULL, flip_map_len= 0;
int do_vgroup_mirr= (mmd->flag & MOD_MIR_VGROUP);
- int (*indexMap)[2];
+ unsigned int (*indexMap)[2];
float mtx[4][4], imtx[4][4];
numVerts = numEdges = numFaces = 0;
@@ -130,7 +128,7 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
float obinv[4][4];
invert_m4_m4(obinv, mmd->mirror_ob->obmat);
- mul_m4_m4m4(mtx, ob->obmat, obinv);
+ mult_m4_m4m4(mtx, obinv, ob->obmat);
invert_m4_m4(imtx, mtx);
}
@@ -154,25 +152,27 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
isShared = ABS(co[axis])<=tolerance;
/* Because the topology result (# of vertices) must be the same if
- * the mesh data is overridden by vertex cos, have to calc sharedness
- * based on original coordinates. This is why we test before copy.
- */
+ * the mesh data is overridden by vertex cos, have to calc sharedness
+ * based on original coordinates. This is why we test before copy.
+ */
DM_copy_vert_data(dm, result, i, numVerts, 1);
*mv = inMV;
- numVerts++;
-
- indexMap[i][0] = numVerts - 1;
+
+ indexMap[i][0] = numVerts;
indexMap[i][1] = !isShared;
- //
+
+ numVerts++;
+
if(isShared ) {
- co[axis] = 0;
+ co[axis] = 0.0f;
if (mmd->mirror_ob) {
mul_m4_v3(imtx, co);
}
copy_v3_v3(mv->co, co);
mv->flag |= ME_VERT_MERGED;
- } else {
+ }
+ else {
MVert *mv2 = CDDM_get_vert(result, numVerts);
DM_copy_vert_data(dm, result, i, numVerts, 1);
@@ -207,8 +207,6 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
med->v1 = indexMap[inMED.v1][0];
med->v2 = indexMap[inMED.v2][0];
- if(initFlags)
- med->flag |= ME_EDGEDRAW | ME_EDGERENDER;
if(indexMap[inMED.v1][1] || indexMap[inMED.v2][1]) {
MEdge *med2 = CDDM_get_edge(result, numEdges);
@@ -237,10 +235,11 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
mf->v3 = indexMap[inMF.v3][0];
mf->v4 = indexMap[inMF.v4][0];
- if(indexMap[inMF.v1][1]
- || indexMap[inMF.v2][1]
- || indexMap[inMF.v3][1]
- || (mf->v4 && indexMap[inMF.v4][1])) {
+ if ( indexMap[inMF.v1][1] ||
+ indexMap[inMF.v2][1] ||
+ indexMap[inMF.v3][1] ||
+ (mf->v4 && indexMap[inMF.v4][1]))
+ {
MFace *mf2 = CDDM_get_face(result, numFaces);
static int corner_indices[4] = {2, 1, 0, 3};
@@ -267,7 +266,7 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
}
/* Flip face normal */
- SWAP(int, mf2->v1, mf2->v3);
+ SWAP(unsigned int, mf2->v1, mf2->v3);
DM_swap_face_data(result, numFaces, corner_indices);
test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
@@ -287,23 +286,22 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
}
static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
- Object *ob, DerivedMesh *dm,
- int initFlags)
+ Object *ob, DerivedMesh *dm)
{
DerivedMesh *result = dm;
/* check which axes have been toggled and mirror accordingly */
if(mmd->flag & MOD_MIR_AXIS_X) {
- result = doMirrorOnAxis(mmd, ob, result, initFlags, 0);
+ result = doMirrorOnAxis(mmd, ob, result, 0);
}
if(mmd->flag & MOD_MIR_AXIS_Y) {
DerivedMesh *tmp = result;
- result = doMirrorOnAxis(mmd, ob, result, initFlags, 1);
+ result = doMirrorOnAxis(mmd, ob, result, 1);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
if(mmd->flag & MOD_MIR_AXIS_Z) {
DerivedMesh *tmp = result;
- result = doMirrorOnAxis(mmd, ob, result, initFlags, 2);
+ result = doMirrorOnAxis(mmd, ob, result, 2);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
@@ -318,7 +316,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DerivedMesh *result;
MirrorModifierData *mmd = (MirrorModifierData*) md;
- result = mirrorModifier__doMirror(mmd, ob, derivedData, 0);
+ result = mirrorModifier__doMirror(mmd, ob, derivedData);
if(result != derivedData)
CDDM_calc_normals(result);
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 8bcaf8802b5..55f29137eb9 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -35,14 +35,14 @@
#include <stddef.h>
+#include "DNA_mesh_types.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_multires.h"
#include "BKE_modifier.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
-#include "DNA_mesh_types.h"
-
#include "MOD_util.h"
static void initData(ModifierData *md)
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
new file mode 100644
index 00000000000..bc67237fb40
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -0,0 +1,227 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Nicholas Bishop.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/modifiers/intern/MOD_remesh.c
+ * \ingroup modifiers
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math_vector.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_mesh.h"
+
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "MOD_modifiertypes.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WITH_MOD_REMESH
+# include "dualcon.h"
+#endif
+
+static void initData(ModifierData *md)
+{
+ RemeshModifierData *rmd = (RemeshModifierData*) md;
+
+ rmd->scale = 0.9;
+ rmd->depth = 4;
+ rmd->hermite_num = 1;
+ rmd->flag = MOD_REMESH_FLOOD_FILL;
+ rmd->mode = MOD_REMESH_SHARP_FEATURES;
+ rmd->threshold = 1;
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ RemeshModifierData *rmd = (RemeshModifierData*) md;
+ RemeshModifierData *trmd = (RemeshModifierData*) target;
+
+ trmd->threshold = rmd->threshold;
+ trmd->scale = rmd->scale;
+ trmd->hermite_num = rmd->hermite_num;
+ trmd->depth = rmd->depth;
+ trmd->flag = rmd->flag;
+ trmd->mode = rmd->mode;
+}
+
+#ifdef WITH_MOD_REMESH
+
+static void init_dualcon_mesh(DualConInput *mesh, DerivedMesh *dm)
+{
+ memset(mesh, 0, sizeof(DualConInput));
+
+ mesh->co = (void*)dm->getVertArray(dm);
+ mesh->co_stride = sizeof(MVert);
+ mesh->totco = dm->getNumVerts(dm);
+
+ mesh->faces = (void*)dm->getFaceArray(dm);
+ mesh->face_stride = sizeof(MFace);
+ mesh->totface = dm->getNumFaces(dm);
+
+ dm->getMinMax(dm, mesh->min, mesh->max);
+}
+
+/* simple structure to hold the output: a CDDM and two counters to
+ keep track of the current elements */
+typedef struct {
+ DerivedMesh *dm;
+ int curvert, curface;
+} DualConOutput;
+
+/* allocate and initialize a DualConOutput */
+static void *dualcon_alloc_output(int totvert, int totquad)
+{
+ DualConOutput *output;
+
+ if(!(output = MEM_callocN(sizeof(DualConOutput),
+ "DualConOutput")))
+ return NULL;
+
+ output->dm = CDDM_new(totvert, 0, totquad);
+ return output;
+}
+
+static void dualcon_add_vert(void *output_v, const float co[3])
+{
+ DualConOutput *output = output_v;
+ DerivedMesh *dm = output->dm;
+
+ assert(output->curvert < dm->getNumVerts(dm));
+
+ copy_v3_v3(CDDM_get_verts(dm)[output->curvert].co, co);
+ output->curvert++;
+}
+
+static void dualcon_add_quad(void *output_v, const int vert_indices[4])
+{
+ DualConOutput *output = output_v;
+ DerivedMesh *dm = output->dm;
+ MFace *mface;
+
+ assert(output->curface < dm->getNumFaces(dm));
+
+ mface = &CDDM_get_faces(dm)[output->curface];
+ mface->v1 = vert_indices[0];
+ mface->v2 = vert_indices[1];
+ mface->v3 = vert_indices[2];
+ mface->v4 = vert_indices[3];
+
+ if(test_index_face(mface, NULL, 0, 4))
+ output->curface++;
+}
+
+static DerivedMesh *applyModifier(ModifierData *md,
+ Object *UNUSED(ob),
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ RemeshModifierData *rmd;
+ DualConOutput *output;
+ DualConInput input;
+ DerivedMesh *result;
+ DualConFlags flags = 0;
+ DualConMode mode = 0;
+
+ rmd = (RemeshModifierData*)md;
+
+ init_dualcon_mesh(&input, dm);
+
+ if(rmd->flag & MOD_REMESH_FLOOD_FILL)
+ flags |= DUALCON_FLOOD_FILL;
+
+ switch(rmd->mode) {
+ case MOD_REMESH_CENTROID:
+ mode = DUALCON_CENTROID;
+ break;
+ case MOD_REMESH_MASS_POINT:
+ mode = DUALCON_MASS_POINT;
+ break;
+ case MOD_REMESH_SHARP_FEATURES:
+ mode = DUALCON_SHARP_FEATURES;
+ break;
+ }
+
+ output = dualcon(&input,
+ dualcon_alloc_output,
+ dualcon_add_vert,
+ dualcon_add_quad,
+ flags,
+ mode,
+ rmd->threshold,
+ rmd->hermite_num,
+ rmd->scale,
+ rmd->depth);
+ result = output->dm;
+ CDDM_lower_num_faces(result, output->curface);
+ MEM_freeN(output);
+
+ CDDM_calc_edges(result);
+ CDDM_calc_normals(result);
+
+ return result;
+}
+
+#else /* !WITH_MOD_REMESH */
+
+static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ return derivedData;
+}
+
+#endif /* !WITH_MOD_REMESH */
+
+ModifierTypeInfo modifierType_Remesh = {
+ /* name */ "Remesh",
+ /* structName */ "RemeshModifierData",
+ /* structSize */ sizeof(RemeshModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode,
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ NULL,
+ /* initData */ initData,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
+};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 5dc233c78b1..93abbb1780c 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -145,12 +145,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int mface_index=0;
int step;
int i, j;
- int i1,i2;
+ unsigned int i1, i2;
int step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
const int do_flip = ltmd->flag & MOD_SCREW_NORMAL_FLIP ? 1 : 0;
int maxVerts=0, maxEdges=0, maxFaces=0;
- int totvert= dm->getNumVerts(dm);
- int totedge= dm->getNumEdges(dm);
+ const unsigned int totvert= dm->getNumVerts(dm);
+ const unsigned int totedge= dm->getNumEdges(dm);
char axis_char= 'X', close;
float angle= ltmd->angle;
@@ -197,7 +197,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* calc the matrix relative to the axis object */
invert_m4_m4(mtx_tmp_a, ob->obmat);
copy_m4_m4(mtx_tx_inv, ltmd->ob_axis->obmat);
- mul_m4_m4m4(mtx_tx, mtx_tx_inv, mtx_tmp_a);
+ mult_m4_m4m4(mtx_tx, mtx_tmp_a, mtx_tx_inv);
/* calc the axis vec */
mul_mat3_m4_v3(mtx_tx, axis_vec); /* only rotation component */
@@ -571,7 +571,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (lt_iter.v == lt_iter.e->v1) {
if (ed_loop_flip == 0) {
/*printf("\t\t\tFlipping 0\n");*/
- SWAP(int, lt_iter.e->v1, lt_iter.e->v2);
+ SWAP(unsigned int, lt_iter.e->v1, lt_iter.e->v2);
}/* else {
printf("\t\t\tFlipping Not 0\n");
}*/
@@ -579,7 +579,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
else if (lt_iter.v == lt_iter.e->v2) {
if (ed_loop_flip == 1) {
/*printf("\t\t\tFlipping 1\n");*/
- SWAP(int, lt_iter.e->v1, lt_iter.e->v2);
+ SWAP(unsigned int, lt_iter.e->v1, lt_iter.e->v2);
}/* else {
printf("\t\t\tFlipping Not 1\n");
}*/
@@ -771,8 +771,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
if( !mf_new->v3 || !mf_new->v4 ) {
- SWAP(int, mf_new->v1, mf_new->v3);
- SWAP(int, mf_new->v2, mf_new->v4);
+ SWAP(unsigned int, mf_new->v1, mf_new->v3);
+ SWAP(unsigned int, mf_new->v2, mf_new->v4);
}
mf_new->flag= ME_SMOOTH;
origindex[mface_index]= ORIGINDEX_NONE;
@@ -807,8 +807,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
if( !mf_new->v3 || !mf_new->v4 ) {
- SWAP(int, mf_new->v1, mf_new->v3);
- SWAP(int, mf_new->v2, mf_new->v4);
+ SWAP(unsigned int, mf_new->v1, mf_new->v3);
+ SWAP(unsigned int, mf_new->v2, mf_new->v4);
}
mf_new->flag= ME_SMOOTH;
origindex[mface_index]= ORIGINDEX_NONE;
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index 6c047a81fa5..e8f099785f9 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -35,6 +35,8 @@
#include <string.h>
+#include "DNA_object_types.h"
+
#include "BLI_string.h"
#include "BLI_utildefines.h"
@@ -42,8 +44,6 @@
#include "BKE_modifier.h"
#include "BKE_shrinkwrap.h"
-#include "DNA_object_types.h"
-
#include "depsgraph_private.h"
#include "MOD_util.h"
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index 2eaa142db47..1bd5b2e78dd 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -39,13 +39,12 @@
#include "BLI_utildefines.h"
#include "BLI_string.h"
+#include "MEM_guardedalloc.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
-
-#include "MEM_guardedalloc.h"
-
#include "MOD_modifiertypes.h"
#include "MOD_util.h"
@@ -154,24 +153,19 @@ static void smoothModifier_do(
}
if (dvert) {
- for (i = 0; i < numVerts; i++) {
- MDeformWeight *dw = NULL;
+ MDeformVert *dv= dvert;
+ for (i = 0; i < numVerts; i++, dv++) {
float f, fm, facw, *fp, *v;
- int k;
short flag = smd->flag;
v = vertexCos[i];
fp = &ftmp[i*3];
- for (k = 0; k < dvert[i].totweight; ++k) {
- if(dvert[i].dw[k].def_nr == defgrp_index) {
- dw = &dvert[i].dw[k];
- break;
- }
- }
- if (!dw) continue;
- f = fac * dw->weight;
+ f= defvert_find_weight(dv, defgrp_index);
+ if (f <= 0.0f) continue;
+
+ f *= fac;
fm = 1.0f - f;
/* fp is the sum of uctmp[i] verts, so must be averaged */
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 347af0066c6..ad47e3fe569 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -40,16 +40,16 @@
#include "BLI_utildefines.h"
#include "BLI_string.h"
+#include "MEM_guardedalloc.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
-
#include "MOD_modifiertypes.h"
#include "MOD_util.h"
-#include "MEM_guardedalloc.h"
typedef struct EdgeFaceRef {
int f1; /* init as -1 */
@@ -75,8 +75,8 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
/* we don't want to overwrite any referenced layers */
/*
- Dosnt work here!
- mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ Doesn't work here!
+ mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, numVerts);
cddm->mvert = mv;
*/
@@ -93,22 +93,28 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
EdgeHash *edge_hash = BLI_edgehash_new();
EdgeHashIterator *edge_iter;
int edge_ref_count = 0;
- int ed_v1, ed_v2; /* use when getting the key */
+ unsigned int ed_v1, ed_v2; /* use when getting the key */
EdgeFaceRef *edge_ref_array = MEM_callocN(numEdges * sizeof(EdgeFaceRef), "Edge Connectivity");
EdgeFaceRef *edge_ref;
float edge_normal[3];
/* This function adds an edge hash if its not there, and adds the face index */
#define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \
- edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, EDV1, EDV2); \
+ { \
+ const unsigned int ml_v1 = EDV1; \
+ const unsigned int ml_v2 = EDV2; \
+ edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ml_v1, ml_v2); \
if (!edge_ref) { \
edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \
- edge_ref->f1=i; \
- edge_ref->f2=-1; \
- BLI_edgehash_insert(edge_hash, EDV1, EDV2, edge_ref); \
- } else { \
- edge_ref->f2=i; \
- }
+ edge_ref->f1 = i; \
+ edge_ref->f2 =- 1; \
+ BLI_edgehash_insert(edge_hash, ml_v1, ml_v2, edge_ref); \
+ } \
+ else { \
+ edge_ref->f2 = i; \
+ } \
+ }
+ /* --- end define --- */
for(i = 0; i < numFaces; i++, mf++) {
f_no = face_nors[i];
@@ -133,7 +139,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
/* Get the edge vert indices, and edge value (the face indices that use it)*/
- BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
+ BLI_edgehashIterator_getKey(edge_iter, &ed_v1, &ed_v2);
edge_ref = BLI_edgehashIterator_getValue(edge_iter);
if (edge_ref->f2 != -1) {
@@ -250,7 +256,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if(smd->flag & MOD_SOLIDIFY_RIM) {
EdgeHash *edgehash = BLI_edgehash_new();
EdgeHashIterator *ehi;
- int v1, v2;
+ unsigned int v1, v2;
int eidx;
for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) {
@@ -265,14 +271,19 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
#define INVALID_PAIR -2
#define ADD_EDGE_USER(_v1, _v2, edge_ord) \
- eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, _v1, _v2)); \
- if(edge_users[eidx] == INVALID_UNUSED) { \
- ed= orig_medge + eidx; \
- edge_users[eidx]= (_v1 < _v2) == (ed->v1 < ed->v2) ? i:(i+numFaces); \
- edge_order[eidx]= edge_ord; \
- } else { \
- edge_users[eidx]= INVALID_PAIR; \
- } \
+ { \
+ const unsigned int ml_v1 = _v1; \
+ const unsigned int ml_v2 = _v2; \
+ eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); \
+ if(edge_users[eidx] == INVALID_UNUSED) { \
+ ed= orig_medge + eidx; \
+ edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces); \
+ edge_order[eidx] = edge_ord; \
+ } \
+ else { \
+ edge_users[eidx] = INVALID_PAIR; \
+ } \
+ }
edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges");
@@ -350,7 +361,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
{
static int corner_indices[4] = {2, 1, 0, 3};
- int is_quad;
+ unsigned int is_quad;
for(i=0, mf=mface+numFaces; i<numFaces; i++, mf++) {
mf->v1 += numVerts;
@@ -362,7 +373,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* Flip face normal */
{
is_quad = mf->v4;
- SWAP(int, mf->v1, mf->v3);
+ SWAP(unsigned int, mf->v1, mf->v3);
DM_swap_face_data(result, i+numFaces, corner_indices);
test_index_face(mf, &result->faceData, numFaces, is_quad ? 4:3);
}
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index 0521b45c863..cc7a5e54fbd 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -276,5 +276,6 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(WeightVGMix);
INIT_TYPE(WeightVGProximity);
INIT_TYPE(DynamicPaint);
+ INIT_TYPE(Remesh);
#undef INIT_TYPE
}
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 584aa6dc206..38c2073b6a5 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -222,11 +222,11 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
if(cam->type == CAM_PERSP) {
float perspmat[4][4];
perspective_m4( perspmat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
- mul_m4_m4m4(tmpmat, projectors[i].projmat, perspmat);
+ mult_m4_m4m4(tmpmat, perspmat, projectors[i].projmat);
} else { /* if(cam->type == CAM_ORTHO) */
float orthomat[4][4];
orthographic_m4( orthomat,xmin, xmax, ymin, ymax, cam->clipsta, cam->clipend);
- mul_m4_m4m4(tmpmat, projectors[i].projmat, orthomat);
+ mult_m4_m4m4(tmpmat, orthomat, projectors[i].projmat);
}
}
} else {
@@ -250,7 +250,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
}
}
- mul_m4_m4m4(projectors[i].projmat, tmpmat, offsetmat);
+ mult_m4_m4m4(projectors[i].projmat, offsetmat, tmpmat);
/* calculate worldspace projector normal (for best projector test) */
projectors[i].normal[0] = 0;
@@ -259,11 +259,12 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal);
}
+ numFaces = dm->getNumFaces(dm);
+
/* make sure we are not modifying the original UV map */
tface = CustomData_duplicate_referenced_layer_named(&dm->faceData,
- CD_MTFACE, uvname);
+ CD_MTFACE, uvname, numFaces);
-
numVerts = dm->getNumVerts(dm);
coords = MEM_callocN(sizeof(*coords) * numVerts,
@@ -280,7 +281,6 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
mul_project_m4_v3(projectors[0].projmat, *co);
mface = dm->getFaceArray(dm);
- numFaces = dm->getNumFaces(dm);
/* apply coords as UVs, and apply image if tfaces are new */
for(i = 0, mf = mface; i < numFaces; ++i, ++mf, ++tface) {
@@ -290,20 +290,16 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
project_from_camera(tface->uv[0], coords[mf->v1], projectors[0].uci);
project_from_camera(tface->uv[1], coords[mf->v2], projectors[0].uci);
project_from_camera(tface->uv[2], coords[mf->v3], projectors[0].uci);
- if(mf->v3)
+ if(mf->v4)
project_from_camera(tface->uv[3], coords[mf->v4], projectors[0].uci);
}
else {
/* apply transformed coords as UVs */
- tface->uv[0][0] = coords[mf->v1][0];
- tface->uv[0][1] = coords[mf->v1][1];
- tface->uv[1][0] = coords[mf->v2][0];
- tface->uv[1][1] = coords[mf->v2][1];
- tface->uv[2][0] = coords[mf->v3][0];
- tface->uv[2][1] = coords[mf->v3][1];
- if(mf->v4) {
- tface->uv[3][0] = coords[mf->v4][0];
- tface->uv[3][1] = coords[mf->v4][1];
+ copy_v2_v2(tface->uv[0], coords[mf->v1]);
+ copy_v2_v2(tface->uv[1], coords[mf->v2]);
+ copy_v2_v2(tface->uv[2], coords[mf->v3]);
+ if (mf->v4) {
+ copy_v2_v2(tface->uv[3], coords[mf->v4]);
}
}
} else {
@@ -347,7 +343,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
project_from_camera(tface->uv[0], coords[mf->v1], best_projector->uci);
project_from_camera(tface->uv[1], coords[mf->v2], best_projector->uci);
project_from_camera(tface->uv[2], coords[mf->v3], best_projector->uci);
- if(mf->v3)
+ if(mf->v4)
project_from_camera(tface->uv[3], coords[mf->v4], best_projector->uci);
}
else {
@@ -358,15 +354,11 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
mul_project_m4_v3(best_projector->projmat, co4);
/* apply transformed coords as UVs */
- tface->uv[0][0] = co1[0];
- tface->uv[0][1] = co1[1];
- tface->uv[1][0] = co2[0];
- tface->uv[1][1] = co2[1];
- tface->uv[2][0] = co3[0];
- tface->uv[2][1] = co3[1];
- if(mf->v4) {
- tface->uv[3][0] = co4[0];
- tface->uv[3][1] = co4[1];
+ copy_v2_v2(tface->uv[0], co1);
+ copy_v2_v2(tface->uv[1], co2);
+ copy_v2_v2(tface->uv[2], co3);
+ if (mf->v4) {
+ copy_v2_v2(tface->uv[3], co4);
}
}
}
@@ -415,7 +407,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* name */ "UVProject",
/* structName */ "UVProjectModifierData",
/* structSize */ sizeof(UVProjectModifierData),
- /* type */ eModifierTypeType_Nonconstructive,
+ /* type */ eModifierTypeType_NonGeometrical,
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_SupportsMapping
| eModifierTypeFlag_SupportsEditmode
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index 8422916e450..41702a74cc1 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -197,11 +197,11 @@ static void warpModifier_do(WarpModifierData *wmd, Object *ob,
invert_m4_m4(obinv, ob->obmat);
- mul_m4_m4m4(mat_from, wmd->object_from->obmat, obinv);
- mul_m4_m4m4(mat_to, wmd->object_to->obmat, obinv);
+ mult_m4_m4m4(mat_from, obinv, wmd->object_from->obmat);
+ mult_m4_m4m4(mat_to, obinv, wmd->object_to->obmat);
invert_m4_m4(tmat, mat_from); // swap?
- mul_m4_m4m4(mat_final, mat_to, tmat);
+ mult_m4_m4m4(mat_final, tmat, mat_to);
invert_m4_m4(mat_from_inv, mat_from);
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 80dd0c0a720..398a078bf38 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -279,7 +279,7 @@ static void waveModifier_do(WaveModifierData *md,
float mat[4][4];
/* get the control object's location in local coordinates */
invert_m4_m4(ob->imat, ob->obmat);
- mul_m4_m4m4(mat, wmd->objectcenter->obmat, ob->imat);
+ mult_m4_m4m4(mat, ob->imat, wmd->objectcenter->obmat);
wmd->startx = mat[3][0];
wmd->starty = mat[3][1];
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c
index e206000f41d..5631b7e716a 100644
--- a/source/blender/modifiers/intern/MOD_weightvg_util.c
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.c
@@ -222,23 +222,7 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne
}
}
-/* Adds the given vertex to the specified vertex group, with given weight. */
-static void defvert_add_to_group(MDeformVert *dv, int defgrp_idx, const float weight)
-{
- /* TODO, move into deform.c as a generic function. This assumes the vertex
- * groups have already been checked, so this has to remain low level. */
- MDeformWeight *newdw;
- newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "defvert_add_to group, new deformWeight");
- if(dv->dw) {
- memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
- MEM_freeN(dv->dw);
- }
- dv->dw = newdw;
- dv->dw[dv->totweight].weight = weight;
- dv->dw[dv->totweight].def_nr = defgrp_idx;
- dv->totweight++;
-}
/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group.
@@ -264,7 +248,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws,
/* If the vertex is in this vgroup, remove it if needed, or just update it. */
if(dw != NULL) {
if(do_rem && w < rem_thresh) {
- defvert_remove_index(dv, defgrp_idx, dw);
+ defvert_remove_group(dv, dw);
}
else {
dw->weight = w;
@@ -272,7 +256,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws,
}
/* Else, add it if needed! */
else if(do_add && w > add_thresh) {
- defvert_add_to_group(dv, defgrp_idx, w);
+ defvert_add_index_notest(dv, defgrp_idx, w);
}
}
}
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
index 24d80fe847c..bdd7ab7486b 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -177,10 +177,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
- DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
- Mesh *ob_m = NULL;
-#endif
+ DerivedMesh *dm = derivedData;
MDeformVert *dvert = NULL;
MDeformWeight **dw = NULL;
float *org_w; /* Array original weights. */
@@ -188,7 +185,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int numVerts;
int defgrp_idx;
int i;
- char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
/* Flags. */
int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
@@ -207,49 +203,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
if (defgrp_idx < 0)
return dm;
- /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
- * time! See scene 5 of the WeighVG test file...
- */
-#if 0
- /* Get actual dverts (ie vertex group data). */
- dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
- /* If no dverts, return unmodified data... */
- if (dvert == NULL)
- return dm;
-
- /* Get org mesh, only to test whether affected cdata layer has already been copied
- * somewhere up in the modifiers stack.
- */
- ob_m = get_mesh(ob);
- if (ob_m == NULL)
- return dm;
-
- /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
- if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
- /* XXX Seems to create problems with weightpaint mode???
- * I'm missing something here, I guess...
- */
-// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
- ret = CDDM_copy(dm);
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- ret->release(ret);
- return dm;
- }
- rel_ret = 1;
- }
- else
- ret = dm;
-#else
- ret = CDDM_copy(dm);
- rel_ret = 1;
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- if (rel_ret)
- ret->release(ret);
- return dm;
- }
-#endif
+ dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
/* Get org weights, assuming 0.0 for vertices not in given vgroup. */
org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
@@ -271,7 +225,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
}
/* Do masking. */
- weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant,
+ weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@@ -285,7 +239,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(dw);
/* Return the vgroup-modified mesh. */
- return ret;
+ return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
@@ -300,7 +254,7 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* name */ "VertexWeightEdit",
/* structName */ "WeightVGEditModifierData",
/* structSize */ sizeof(WeightVGEditModifierData),
- /* type */ eModifierTypeType_Nonconstructive,
+ /* type */ eModifierTypeType_NonGeometrical,
/* flags */ eModifierTypeFlag_AcceptsMesh
/* |eModifierTypeFlag_SupportsMapping*/
|eModifierTypeFlag_SupportsEditmode,
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
index 221deeef1a6..17316d891da 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -219,10 +219,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
- DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
- Mesh *ob_m = NULL;
-#endif
+ DerivedMesh *dm = derivedData;
MDeformVert *dvert = NULL;
MDeformWeight **dw1, **tdw1, **dw2, **tdw2;
int numVerts;
@@ -232,7 +229,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int *tidx, *indices = NULL;
int numIdx = 0;
int i;
- char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
/* Get number of verts. */
numVerts = dm->getNumVerts(dm);
@@ -254,49 +250,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return dm;
}
- /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
- * time! See scene 5 of the WeighVG test file...
- */
-#if 0
- /* Get actual dverts (ie vertex group data). */
- dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
- /* If no dverts, return unmodified data... */
- if (dvert == NULL)
- return dm;
-
- /* Get org mesh, only to test whether affected cdata layer has already been copied
- * somewhere up in the modifiers stack.
- */
- ob_m = get_mesh(ob);
- if (ob_m == NULL)
- return dm;
-
- /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
- if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
- /* XXX Seems to create problems with weightpaint mode???
- * I'm missing something here, I guess...
- */
-// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
- ret = CDDM_copy(dm);
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- ret->release(ret);
- return dm;
- }
- rel_ret = 1;
- }
- else
- ret = dm;
-#else
- ret = CDDM_copy(dm);
- rel_ret = 1;
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- if (rel_ret)
- ret->release(ret);
- return dm;
- }
-#endif
+ dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
/* Find out which vertices to work on. */
tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
@@ -364,8 +318,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(tdw1);
MEM_freeN(tdw2);
MEM_freeN(tidx);
- if (rel_ret)
- ret->release(ret);
return dm;
}
if (numIdx != -1) {
@@ -400,7 +352,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
}
/* Do masking. */
- weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@@ -419,7 +371,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(indices);
/* Return the vgroup-modified mesh. */
- return ret;
+ return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
@@ -434,7 +386,7 @@ ModifierTypeInfo modifierType_WeightVGMix = {
/* name */ "VertexWeightMix",
/* structName */ "WeightVGMixModifierData",
/* structSize */ sizeof(WeightVGMixModifierData),
- /* type */ eModifierTypeType_Nonconstructive,
+ /* type */ eModifierTypeType_NonGeometrical,
/* flags */ eModifierTypeFlag_AcceptsMesh
/* |eModifierTypeFlag_SupportsMapping*/
|eModifierTypeFlag_SupportsEditmode,
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index a30c5da07c8..8e0949f2a22 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -28,11 +28,17 @@
* \ingroup modifiers
*/
+#define DO_PROFILE 0
+
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
+#if DO_PROFILE
+ #include "PIL_time.h"
+#endif
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -334,10 +340,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
- DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
- Mesh *ob_m = NULL;
-#endif
+ DerivedMesh *dm = derivedData;
MDeformVert *dvert = NULL;
MDeformWeight **dw, **tdw;
int numVerts;
@@ -350,7 +353,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int *tidx, *indices = NULL;
int numIdx = 0;
int i;
- char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+
+#if DO_PROFILE
+ TIMEIT_START(perf)
+#endif
/* Get number of verts. */
numVerts = dm->getNumVerts(dm);
@@ -371,49 +377,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
if (defgrp_idx < 0)
return dm;
- /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
- * time! See scene 5 of the WeighVG test file...
- */
-#if 0
- /* Get actual dverts (ie vertex group data). */
- dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
- /* If no dverts, return unmodified data... */
- if (dvert == NULL)
- return dm;
-
- /* Get org mesh, only to test whether affected cdata layer has already been copied
- * somewhere up in the modifiers stack.
- */
- ob_m = get_mesh(ob);
- if (ob_m == NULL)
- return dm;
-
- /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
- if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
- /* XXX Seems to create problems with weightpaint mode???
- * I'm missing something here, I guess...
- */
-// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
- ret = CDDM_copy(dm);
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- ret->release(ret);
- return dm;
- }
- rel_ret = 1;
- }
- else
- ret = dm;
-#else
- ret = CDDM_copy(dm);
- rel_ret = 1;
- dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
- if (dvert == NULL) {
- if (rel_ret)
- ret->release(ret);
- return dm;
- }
-#endif
+ dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
/* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
*/
@@ -433,25 +397,39 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(tidx);
MEM_freeN(tw);
MEM_freeN(tdw);
- if (rel_ret)
- ret->release(ret);
return dm;
}
- indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
- memcpy(indices, tidx, sizeof(int) * numIdx);
- org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
+ if(numIdx != numVerts) {
+ indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
+ memcpy(indices, tidx, sizeof(int) * numIdx);
+ org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
+ memcpy(org_w, tw, sizeof(float) * numIdx);
+ dw = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGProximity Modifier, dw");
+ memcpy(dw, tdw, sizeof(MDeformWeight*) * numIdx);
+ MEM_freeN(tw);
+ MEM_freeN(tdw);
+ }
+ else {
+ org_w = tw;
+ dw = tdw;
+ }
new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w");
- memcpy(org_w, tw, sizeof(float) * numIdx);
- dw = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGProximity Modifier, dw");
- memcpy(dw, tdw, sizeof(MDeformWeight*) * numIdx);
MEM_freeN(tidx);
- MEM_freeN(tw);
- MEM_freeN(tdw);
/* Get our vertex coordinates. */
v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
- for (i = 0; i < numIdx; i++)
- ret->getVertCo(ret, indices[i], v_cos[i]);
+ if(numIdx != numVerts) {
+ /* XXX In some situations, this code can be up to about 50 times more performant
+ * than simply using getVertCo for each affected vertex...
+ */
+ float (*tv_cos)[3] = MEM_mallocN(sizeof(float[3]) * numVerts, "WeightVGProximity Modifier, tv_cos");
+ dm->getVertCos(dm, tv_cos);
+ for (i = 0; i < numIdx; i++)
+ copy_v3_v3(v_cos[i], tv_cos[indices[i]]);
+ MEM_freeN(tv_cos);
+ }
+ else
+ dm->getVertCos(dm, v_cos);
/* Compute wanted distances. */
if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) {
@@ -516,7 +494,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type);
/* Do masking. */
- weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@@ -527,11 +505,16 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(org_w);
MEM_freeN(new_w);
MEM_freeN(dw);
- MEM_freeN(indices);
+ if(indices)
+ MEM_freeN(indices);
MEM_freeN(v_cos);
+#if DO_PROFILE
+ TIMEIT_END(perf)
+#endif
+
/* Return the vgroup-modified mesh. */
- return ret;
+ return dm;
}
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
@@ -546,7 +529,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
/* name */ "VertexWeightProximity",
/* structName */ "WeightVGProximityModifierData",
/* structSize */ sizeof(WeightVGProximityModifierData),
- /* type */ eModifierTypeType_Nonconstructive,
+ /* type */ eModifierTypeType_NonGeometrical,
/* flags */ eModifierTypeFlag_AcceptsMesh
/* |eModifierTypeFlag_SupportsMapping*/
|eModifierTypeFlag_SupportsEditmode,
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index db45ffe2c41..f6e72f53f6b 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -121,6 +121,7 @@ set(SRC
shader/nodes/node_shader_common.c
shader/nodes/node_shader_curves.c
shader/nodes/node_shader_dynamic.c
+ shader/nodes/node_shader_gamma.c
shader/nodes/node_shader_geom.c
shader/nodes/node_shader_hueSatVal.c
shader/nodes/node_shader_invert.c
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index ae255517733..2cabdd33971 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -54,6 +54,7 @@ void register_node_type_sh_valtorgb(struct bNodeTreeType *ttype);
void register_node_type_sh_rgbtobw(struct bNodeTreeType *ttype);
void register_node_type_sh_texture(struct bNodeTreeType *ttype);
void register_node_type_sh_normal(struct bNodeTreeType *ttype);
+void register_node_type_sh_gamma(struct bNodeTreeType *ttype);
void register_node_type_sh_geom(struct bNodeTreeType *ttype);
void register_node_type_sh_mapping(struct bNodeTreeType *ttype);
void register_node_type_sh_curve_vec(struct bNodeTreeType *ttype);
diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c
index 99a36691b10..72037f232ad 100644
--- a/source/blender/nodes/composite/node_composite_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -606,7 +606,9 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf)
RenderData *rd= data;
bNodePreview *preview= node->preview;
int xsize, ysize;
- int color_manage= rd->color_mgt_flag & R_COLOR_MANAGEMENT;
+ int profile_from= (rd->color_mgt_flag & R_COLOR_MANAGEMENT)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB;
+ int predivide= (rd->color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);
+ int dither= 0;
unsigned char *rect;
if(preview && stackbuf) {
@@ -633,10 +635,9 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf)
/* convert to byte for preview */
rect= MEM_callocN(sizeof(unsigned char)*4*xsize*ysize, "bNodePreview.rect");
- if(color_manage)
- floatbuf_to_srgb_byte(cbuf->rect, rect, 0, xsize, 0, ysize, xsize);
- else
- floatbuf_to_byte(cbuf->rect, rect, 0, xsize, 0, ysize, xsize);
+ IMB_buffer_byte_from_float(rect, cbuf->rect,
+ 4, dither, IB_PROFILE_SRGB, profile_from, predivide,
+ xsize, ysize, xsize, xsize);
free_compbuf(cbuf);
if(stackbuf_use!=stackbuf)
diff --git a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
index cad85d33a66..3a783f0f32d 100644
--- a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
+++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
@@ -47,7 +47,8 @@ static bNodeSocketTemplate cmp_node_alphaover_out[]= {
static void do_alphaover_premul(bNode *UNUSED(node), float *out, float *src, float *over, float *fac)
{
- if(over[3]<=0.0f) {
+ /* Zero alpha values should still permit an add of RGB data */
+ if(over[3]<0.0f) {
copy_v4_v4(out, src);
}
else if(fac[0]==1.0f && over[3]>=1.0f) {
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index 93353604fdd..7984ef9466e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -62,6 +62,7 @@ static bNodeSocketTemplate cmp_node_rlayers_out[]= {
float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc)
{
float *rect;
+ int predivide= (ibuf->flags & IB_cm_predivide);
*alloc= FALSE;
@@ -71,7 +72,11 @@ float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc)
}
else {
rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
- srgb_to_linearrgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+
+ IMB_buffer_float_from_float(rect, ibuf->rect_float,
+ 4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_SRGB, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
+
*alloc= TRUE;
}
}
@@ -81,7 +86,11 @@ float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc)
}
else {
rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
- linearrgb_to_srgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+
+ IMB_buffer_float_from_float(rect, ibuf->rect_float,
+ 4, IB_PROFILE_SRGB, IB_PROFILE_LINEAR_RGB, predivide,
+ ibuf->x, ibuf->y, ibuf->x, ibuf->x);
+
*alloc= TRUE;
}
}
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
index 87585c35e6a..8b8afc3d846 100644
--- a/source/blender/nodes/shader/node_shader_util.c
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -134,8 +134,6 @@ void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mo
bNodeSocket *sock;
int a;
- ntreeSocketUseFlags(ntree);
-
for(node= ntree->nodes.first; node; node= node->next) {
if(node->type==SH_NODE_TEXTURE) {
if((r_mode & R_OSA) && node->id) {
diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c
index d95cc1460df..3ec75dfa4fd 100644
--- a/source/blender/nodes/shader/nodes/node_shader_camera.c
+++ b/source/blender/nodes/shader/nodes/node_shader_camera.c
@@ -62,7 +62,7 @@ void register_node_type_sh_camera(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, NULL, sh_node_camera_out);
node_type_size(&ntype, 95, 95, 120);
node_type_storage(&ntype, "node_camera", NULL, NULL);
diff --git a/source/blender/nodes/shader/nodes/node_shader_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
index 5e7c99f7276..e55b1b164df 100644
--- a/source/blender/nodes/shader/nodes/node_shader_dynamic.c
+++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
@@ -61,7 +61,8 @@ static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNode
static void node_dynamic_free_storage_cb(bNode *node);
#ifdef WITH_PYTHON
-static PyObject *init_dynamicdict(void) {
+static PyObject *init_dynamicdict(void)
+{
PyObject *newscriptdict, *item;
PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -329,7 +330,8 @@ static void node_dynamic_reset_loaded(bNode *node)
node->typeinfo = node_dynamic_find_typeinfo(&node_all_shaders, NULL);
}
-int nodeDynamicUnlinkText(ID *txtid) {
+int nodeDynamicUnlinkText(ID *txtid)
+{
Material *ma;
bNode *nd;
@@ -653,7 +655,8 @@ static void node_dynamic_setup(bNode *node)
* NODE_DYNAMIC_MENU: for the default Dynamic node type
* > NODE_DYNAMIC_MENU: for the new types defined by scripts
*/
-static void node_dynamic_init_cb(bNode *node) {
+static void node_dynamic_init_cb(bNode *node)
+{
int type = node->custom2;
node->custom2 = 0;
@@ -700,7 +703,8 @@ static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
/* node_dynamic_exec_cb: the execution callback called per pixel
* during rendering. */
-static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) {
+static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
#ifndef WITH_PYTHON
return;
#else
diff --git a/source/blender/nodes/shader/nodes/node_shader_gamma.c b/source/blender/nodes/shader/nodes/node_shader_gamma.c
new file mode 100644
index 00000000000..1d525d71698
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_gamma.c
@@ -0,0 +1,63 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+
+*/
+
+/** \file blender/nodes/composite/nodes/node_composite_gamma.c
+ * \ingroup cmpnodes
+ */
+
+
+#include "node_shader_util.h"
+
+/* **************** Gamma Tools ******************** */
+
+static bNodeSocketTemplate sh_node_gamma_in[]= {
+ { SOCK_RGBA, 1, "Color", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_gamma_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { -1, 0, "" }
+};
+
+void register_node_type_sh_gamma(bNodeTreeType *ttype)
+{
+ static bNodeType ntype;
+
+ node_type_base(ttype, &ntype, SH_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_gamma_in, sh_node_gamma_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(ttype, &ntype);
+}
diff --git a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
index bfdcb5d0917..0f85196a45d 100644
--- a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
@@ -85,7 +85,7 @@ void register_node_type_sh_hue_sat(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, sh_node_hue_sat_in, sh_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, node_shader_exec_hue_sat);
diff --git a/source/blender/nodes/shader/nodes/node_shader_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c
index 6d21b93fb65..2c20df2274d 100644
--- a/source/blender/nodes/shader/nodes/node_shader_invert.c
+++ b/source/blender/nodes/shader/nodes/node_shader_invert.c
@@ -77,7 +77,7 @@ void register_node_type_sh_invert(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, sh_node_invert_in, sh_node_invert_out);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, node_shader_exec_invert);
diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c
index f699268e939..8515c99ba81 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal.c
@@ -84,7 +84,7 @@ void register_node_type_sh_normal(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out);
node_type_init(&ntype, node_shader_init_normal);
node_type_exec(&ntype, node_shader_exec_normal);
diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
index 09371a8a5ae..bd4f084d156 100644
--- a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
+++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
@@ -61,7 +61,7 @@ void register_node_type_sh_seprgb(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, sh_node_seprgb_in, sh_node_seprgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_seprgb);
@@ -101,7 +101,7 @@ void register_node_type_sh_combrgb(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
- node_type_compatibility(&ntype, NODE_OLD_SHADING);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
node_type_socket_templates(&ntype, sh_node_combrgb_in, sh_node_combrgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_combrgb);
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index 7075b0592b8..cd1666d0eed 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -46,5 +46,9 @@ if env['WITH_BF_INTERNATIONAL']:
if env['WITH_BF_CYCLES']:
defs.append('WITH_CYCLES')
+if env['WITH_BF_FFMPEG']:
+ defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
+
sources = env.Glob('intern/*.c')
env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core'], priority = [361])
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 03d66e918d5..e32444976dd 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -453,7 +453,7 @@ static int Buffer_ass_item(Buffer *self, int i, PyObject *v)
}
}
- switch(self->type) {
+ switch (self->type) {
case GL_BYTE:
return PyArg_Parse(v, "b:Expected ints", &self->buf.asbyte[i]) ? 0:-1;
case GL_SHORT:
@@ -595,7 +595,7 @@ static PyObject *Buffer_repr(Buffer *self)
PyObject *repr;
const char *typestr= "UNKNOWN";
- switch(self->type) {
+ switch (self->type) {
case GL_BYTE: typestr= "GL_BYTE"; break;
case GL_SHORT: typestr= "GL_SHORT"; break;
case GL_INT: typestr= "GL_BYTE"; break;
@@ -1304,6 +1304,7 @@ PyObject *BPyInit_bgl(void)
PyModule_AddObject(submodule, "Buffer", (PyObject *)&BGL_bufferType);
+ Py_INCREF((PyObject *)&BGL_bufferType);
#define EXPP_ADDCONST(x) PyDict_SetItemString(dict, #x, item=PyLong_FromLong((int)x)); Py_DECREF(item)
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index 88e2da16eb5..db3519a3056 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -51,7 +51,7 @@
#include "BKE_text.h" /* txt_to_buf */
#include "BKE_main.h"
-static Main *bpy_import_main= NULL;
+static Main *bpy_import_main = NULL;
/* 'builtins' is most likely PyEval_GetBuiltins() */
void bpy_import_init(PyObject *builtins)
@@ -59,13 +59,13 @@ void bpy_import_init(PyObject *builtins)
PyObject *item;
PyObject *mod;
- PyDict_SetItemString(builtins, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(builtins, "__import__", item = PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
/* move reload here
* XXX, use import hooks */
- mod= PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
+ mod = PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
if (mod) {
- PyDict_SetItemString(PyModule_GetDict(mod), "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(PyModule_GetDict(mod), "reload", item = PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
Py_DECREF(mod);
}
else {
@@ -79,7 +79,7 @@ static void free_compiled_text(Text *text)
if (text->compiled) {
Py_DECREF((PyObject *)text->compiled);
}
- text->compiled= NULL;
+ text->compiled = NULL;
}
struct Main *bpy_import_main_get(void)
@@ -89,18 +89,18 @@ struct Main *bpy_import_main_get(void)
void bpy_import_main_set(struct Main *maggie)
{
- bpy_import_main= maggie;
+ bpy_import_main = maggie;
}
/* returns a dummy filename for a textblock so we can tell what file a text block comes from */
void bpy_text_filename_get(char *fn, size_t fn_len, Text *text)
{
- BLI_snprintf(fn, fn_len, "%s%c%s", ID_BLEND_PATH(bpy_import_main, &text->id), SEP, text->id.name+2);
+ BLI_snprintf(fn, fn_len, "%s%c%s", ID_BLEND_PATH(bpy_import_main, &text->id), SEP, text->id.name + 2);
}
PyObject *bpy_text_import(Text *text)
{
- char *buf= NULL;
+ char *buf = NULL;
char modulename[24];
int len;
@@ -108,8 +108,8 @@ PyObject *bpy_text_import(Text *text)
char fn_dummy[256];
bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
- buf= txt_to_buf(text);
- text->compiled= Py_CompileString(buf, fn_dummy, Py_file_input);
+ buf = txt_to_buf(text);
+ text->compiled = Py_CompileString(buf, fn_dummy, Py_file_input);
MEM_freeN(buf);
if (PyErr_Occurred()) {
@@ -121,38 +121,39 @@ PyObject *bpy_text_import(Text *text)
}
}
- len= strlen(text->id.name+2);
- BLI_strncpy(modulename, text->id.name+2, len);
- modulename[len - 3]= '\0'; /* remove .py */
+ len = strlen(text->id.name + 2);
+ BLI_strncpy(modulename, text->id.name + 2, len);
+ modulename[len - 3] = '\0'; /* remove .py */
return PyImport_ExecCodeModule(modulename, text->compiled);
}
PyObject *bpy_text_import_name(const char *name, int *found)
{
Text *text;
- char txtname[MAX_ID_NAME-2];
- int namelen= strlen(name);
-//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
- Main *maggie= bpy_import_main;
+ char txtname[MAX_ID_NAME - 2];
+ int namelen = strlen(name);
+//XXX Main *maggie = bpy_import_main ? bpy_import_main:G.main;
+ Main *maggie = bpy_import_main;
- *found= 0;
+ *found = 0;
if (!maggie) {
printf("ERROR: bpy_import_main_set() was not called before running python. this is a bug.\n");
return NULL;
}
-
- if (namelen >= (MAX_ID_NAME-2) - 3) return NULL; /* we know this cant be importable, the name is too long for blender! */
-
+
+ /* we know this cant be importable, the name is too long for blender! */
+ if (namelen >= (MAX_ID_NAME - 2) - 3) return NULL;
+
memcpy(txtname, name, namelen);
memcpy(&txtname[namelen], ".py", 4);
- text= BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2);
+ text = BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2);
if (!text)
return NULL;
else
- *found= 1;
+ *found = 1;
return bpy_text_import(text);
}
@@ -167,32 +168,32 @@ PyObject *bpy_text_reimport(PyObject *module, int *found)
Text *text;
const char *name;
char *filepath;
- char *buf= NULL;
-//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
- Main *maggie= bpy_import_main;
+ char *buf = NULL;
+//XXX Main *maggie = bpy_import_main ? bpy_import_main:G.main;
+ Main *maggie = bpy_import_main;
if (!maggie) {
printf("ERROR: bpy_import_main_set() was not called before running python. this is a bug.\n");
return NULL;
}
- *found= 0;
+ *found = 0;
/* get name, filename from the module itself */
- if ((name= PyModule_GetName(module)) == NULL)
+ if ((name = PyModule_GetName(module)) == NULL)
return NULL;
- if ((filepath= (char *)PyModule_GetFilename(module)) == NULL)
+ if ((filepath = (char *)PyModule_GetFilename(module)) == NULL)
return NULL;
/* look up the text object */
- text= BLI_findstring(&maggie->text, BLI_path_basename(filepath), offsetof(ID, name) + 2);
+ text = BLI_findstring(&maggie->text, BLI_path_basename(filepath), offsetof(ID, name) + 2);
/* uh-oh.... didn't find it */
if (!text)
return NULL;
else
- *found= 1;
+ *found = 1;
/* if previously compiled, free the object */
/* (can't see how could be NULL, but check just in case) */
@@ -201,8 +202,8 @@ PyObject *bpy_text_reimport(PyObject *module, int *found)
}
/* compile the buffer */
- buf= txt_to_buf(text);
- text->compiled= Py_CompileString(buf, text->id.name+2, Py_file_input);
+ buf = txt_to_buf(text);
+ text->compiled = Py_CompileString(buf, text->id.name + 2, Py_file_input);
MEM_freeN(buf);
/* if compile failed.... return this error */
@@ -223,20 +224,22 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject
{
PyObject *exception, *err, *tb;
char *name;
- int found= 0;
- PyObject *globals= NULL, *locals= NULL, *fromlist= NULL;
- int level= -1; /* relative imports */
+ int found = 0;
+ PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
+ int level = -1; /* relative imports */
PyObject *newmodule;
//PyObject_Print(args, stderr, 0);
- static const char *kwlist[]= {"name", "globals", "locals", "fromlist", "level", NULL};
+ static const char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kw, "s|OOOi:bpy_import_meth", (char **)kwlist,
- &name, &globals, &locals, &fromlist, &level))
+ &name, &globals, &locals, &fromlist, &level))
+ {
return NULL;
+ }
/* import existing builtin modules or modules that have been imported already */
- newmodule= PyImport_ImportModuleLevel(name, globals, locals, fromlist, level);
+ newmodule = PyImport_ImportModuleLevel(name, globals, locals, fromlist, level);
if (newmodule)
return newmodule;
@@ -244,7 +247,7 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject
PyErr_Fetch(&exception, &err, &tb); /* get the python error incase we cant import as blender text either */
/* importing from existing modules failed, see if we have this module as blender text */
- newmodule= bpy_text_import_name(name, &found);
+ newmodule = bpy_text_import_name(name, &found);
if (newmodule) {/* found module as blender text, ignore above exception */
PyErr_Clear();
@@ -253,7 +256,7 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject
Py_XDECREF(tb);
/* printf("imported from text buffer...\n"); */
}
- else if (found==1) { /* blender text module failed to execute but was found, use its error message */
+ else if (found == 1) { /* blender text module failed to execute but was found, use its error message */
Py_XDECREF(exception);
Py_XDECREF(err);
Py_XDECREF(tb);
@@ -275,18 +278,18 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject
static PyObject *blender_reload(PyObject *UNUSED(self), PyObject *module)
{
PyObject *exception, *err, *tb;
- PyObject *newmodule= NULL;
- int found= 0;
+ PyObject *newmodule = NULL;
+ int found = 0;
/* try reimporting from file */
- newmodule= PyImport_ReloadModule(module);
+ newmodule = PyImport_ReloadModule(module);
if (newmodule)
return newmodule;
/* no file, try importing from memory */
PyErr_Fetch(&exception, &err, &tb); /*restore for probable later use */
- newmodule= bpy_text_reimport(module, &found);
+ newmodule = bpy_text_reimport(module, &found);
if (newmodule) {/* found module as blender text, ignore above exception */
PyErr_Clear();
Py_XDECREF(exception);
@@ -294,7 +297,7 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject *module)
Py_XDECREF(tb);
/* printf("imported from text buffer...\n"); */
}
- else if (found==1) { /* blender text module failed to execute but was found, use its error message */
+ else if (found == 1) { /* blender text module failed to execute but was found, use its error message */
Py_XDECREF(exception);
Py_XDECREF(err);
Py_XDECREF(tb);
@@ -309,5 +312,5 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject *module)
return newmodule;
}
-PyMethodDef bpy_import_meth= {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
-PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
+PyMethodDef bpy_import_meth = {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
+PyMethodDef bpy_reload_meth = {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index c31dadff3e1..c058ee1d4f0 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -405,7 +405,7 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *name_obj, IDProperty
val.array.len = PySequence_Size(ob);
- switch(val.array.type) {
+ switch (val.array.type) {
case IDP_DOUBLE:
prop = IDP_New(IDP_ARRAY, &val, name);
for (i=0; i<val.array.len; i++) {
@@ -565,7 +565,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
return NULL;
}
- switch(prop->subtype) {
+ switch (prop->subtype) {
case IDP_FLOAT:
{
float *array= (float*)IDP_Array(prop);
@@ -976,7 +976,7 @@ static PyObject *BPy_IDArray_repr(BPy_IDArray *self)
static PyObject *BPy_IDArray_GetType(BPy_IDArray *self)
{
- switch(self->prop->subtype) {
+ switch (self->prop->subtype) {
case IDP_FLOAT:
return PyUnicode_FromString("f");
case IDP_DOUBLE:
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index 8d68a407e62..43b8dc21300 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -191,7 +191,7 @@ void PyC_FileAndNum(const char **filename, int *lineno)
void PyC_FileAndNum_Safe(const char **filename, int *lineno)
{
- if(!PYC_INTERPRETER_ACTIVE) {
+ if (!PYC_INTERPRETER_ACTIVE) {
return;
}
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 63ccdea3f0d..f110576a297 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -33,7 +33,7 @@ set(INC
../../makesdna
../../makesrna
../../windowmanager
- ../../gpu
+ ../../gpu
../../../../intern/guardedalloc
)
@@ -42,9 +42,10 @@ set(INC_SYS
)
set(SRC
- gpu.c
+ gpu.c
bpy.c
bpy_app.c
+ bpy_app_ffmpeg.c
bpy_app_handlers.c
bpy_driver.c
bpy_interface.c
@@ -62,9 +63,10 @@ set(SRC
bpy_util.c
stubs.c
- gpu.h
+ gpu.h
bpy.h
bpy_app.h
+ bpy_app_ffmpeg.h
bpy_app_handlers.h
bpy_driver.h
bpy_intern_string.h
@@ -101,7 +103,15 @@ if(WITH_CYCLES)
endif()
if(WITH_INTERNATIONAL)
- add_definitions(-DWITH_INTERNATIONAL)
+ add_definitions(-DWITH_INTERNATIONAL)
+endif()
+
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC_SYS
+ ${FFMPEG_INCLUDE_DIRS}
+ )
+
+ add_definitions(-DWITH_FFMPEG)
endif()
blender_add_lib(bf_python "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 4a49b9bc1c3..e0e3dd5519c 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -58,7 +58,7 @@
#include "../generic/blf_py_api.h"
#include "../mathutils/mathutils.h"
-PyObject *bpy_package_py= NULL;
+PyObject *bpy_package_py = NULL;
PyDoc_STRVAR(bpy_script_paths_doc,
".. function:: script_paths()\n"
@@ -70,12 +70,12 @@ PyDoc_STRVAR(bpy_script_paths_doc,
);
static PyObject *bpy_script_paths(PyObject *UNUSED(self))
{
- PyObject *ret= PyTuple_New(2);
+ PyObject *ret = PyTuple_New(2);
char *path;
- path= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, NULL);
+ path = BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, NULL);
PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:""));
- path= BLI_get_folder(BLENDER_USER_SCRIPTS, NULL);
+ path = BLI_get_folder(BLENDER_USER_SCRIPTS, NULL);
PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:""));
return ret;
@@ -83,8 +83,8 @@ static PyObject *bpy_script_paths(PyObject *UNUSED(self))
static int bpy_blend_paths_visit_cb(void *userdata, char *UNUSED(path_dst), const char *path_src)
{
- PyObject *list= (PyObject *)userdata;
- PyObject *item= PyUnicode_DecodeFSDefault(path_src);
+ PyObject *list = (PyObject *)userdata;
+ PyObject *item = PyUnicode_DecodeFSDefault(path_src);
PyList_Append(list, item);
Py_DECREF(item);
return FALSE; /* never edits the path */
@@ -106,13 +106,13 @@ PyDoc_STRVAR(bpy_blend_paths_doc,
);
static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- int flag= 0;
+ int flag = 0;
PyObject *list;
- int absolute= FALSE;
- int packed= FALSE;
- int local= FALSE;
- static const char *kwlist[]= {"absolute", "packed", "local", NULL};
+ int absolute = FALSE;
+ int packed = FALSE;
+ int local = FALSE;
+ static const char *kwlist[] = {"absolute", "packed", "local", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kw, "|ii:blend_paths",
(char **)kwlist, &absolute, &packed))
@@ -124,7 +124,7 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
if (!packed) flag |= BPATH_TRAVERSE_SKIP_PACKED;
if (local) flag |= BPATH_TRAVERSE_SKIP_LIBRARY;
- list= PyList_New(0);
+ list = PyList_New(0);
bpath_traverse_main(G.main, bpy_blend_paths_visit_cb, flag, (void *)list);
@@ -132,13 +132,13 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
}
-// PyDoc_STRVAR(bpy_user_resource_doc[]= // now in bpy/utils.py
+// PyDoc_STRVAR(bpy_user_resource_doc[] = // now in bpy/utils.py
static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
char *type;
- char *subdir= NULL;
+ char *subdir = NULL;
int folder_id;
- static const char *kwlist[]= {"type", "subdir", NULL};
+ static const char *kwlist[] = {"type", "subdir", NULL};
char *path;
@@ -146,20 +146,20 @@ static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObj
return NULL;
/* stupid string compare */
- if (!strcmp(type, "DATAFILES")) folder_id= BLENDER_USER_DATAFILES;
- else if (!strcmp(type, "CONFIG")) folder_id= BLENDER_USER_CONFIG;
- else if (!strcmp(type, "SCRIPTS")) folder_id= BLENDER_USER_SCRIPTS;
- else if (!strcmp(type, "AUTOSAVE")) folder_id= BLENDER_USER_AUTOSAVE;
+ if (!strcmp(type, "DATAFILES")) folder_id = BLENDER_USER_DATAFILES;
+ else if (!strcmp(type, "CONFIG")) folder_id = BLENDER_USER_CONFIG;
+ else if (!strcmp(type, "SCRIPTS")) folder_id = BLENDER_USER_SCRIPTS;
+ else if (!strcmp(type, "AUTOSAVE")) folder_id = BLENDER_USER_AUTOSAVE;
else {
PyErr_SetString(PyExc_ValueError, "invalid resource argument");
return NULL;
}
/* same logic as BLI_get_folder_create(), but best leave it up to the script author to create */
- path= BLI_get_folder(folder_id, subdir);
+ path = BLI_get_folder(folder_id, subdir);
if (!path)
- path= BLI_get_user_folder_notest(folder_id, subdir);
+ path = BLI_get_user_folder_notest(folder_id, subdir);
return PyUnicode_DecodeFSDefault(path ? path : "");
}
@@ -181,8 +181,8 @@ PyDoc_STRVAR(bpy_resource_path_doc,
static PyObject *bpy_resource_path(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
char *type;
- int major= BLENDER_VERSION/100, minor= BLENDER_VERSION%100;
- static const char *kwlist[]= {"type", "major", "minor", NULL};
+ int major = BLENDER_VERSION / 100, minor = BLENDER_VERSION % 100;
+ static const char *kwlist[] = {"type", "major", "minor", NULL};
int folder_id;
char *path;
@@ -190,32 +190,32 @@ static PyObject *bpy_resource_path(PyObject *UNUSED(self), PyObject *args, PyObj
return NULL;
/* stupid string compare */
- if (!strcmp(type, "USER")) folder_id= BLENDER_RESOURCE_PATH_USER;
- else if (!strcmp(type, "LOCAL")) folder_id= BLENDER_RESOURCE_PATH_LOCAL;
- else if (!strcmp(type, "SYSTEM")) folder_id= BLENDER_RESOURCE_PATH_SYSTEM;
+ if (!strcmp(type, "USER")) folder_id = BLENDER_RESOURCE_PATH_USER;
+ else if (!strcmp(type, "LOCAL")) folder_id = BLENDER_RESOURCE_PATH_LOCAL;
+ else if (!strcmp(type, "SYSTEM")) folder_id = BLENDER_RESOURCE_PATH_SYSTEM;
else {
PyErr_SetString(PyExc_ValueError, "invalid resource argument");
return NULL;
}
- path= BLI_get_folder_version(folder_id, (major * 100) + minor, FALSE);
+ path = BLI_get_folder_version(folder_id, (major * 100) + minor, FALSE);
return PyUnicode_DecodeFSDefault(path);
}
-static PyMethodDef meth_bpy_script_paths=
+static PyMethodDef meth_bpy_script_paths =
{"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
-static PyMethodDef meth_bpy_blend_paths=
+static PyMethodDef meth_bpy_blend_paths =
{"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
-static PyMethodDef meth_bpy_user_resource=
+static PyMethodDef meth_bpy_user_resource =
{"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
-static PyMethodDef meth_bpy_resource_path=
+static PyMethodDef meth_bpy_resource_path =
{"resource_path", (PyCFunction)bpy_resource_path, METH_VARARGS|METH_KEYWORDS, bpy_resource_path_doc};
static PyObject *bpy_import_test(const char *modname)
{
- PyObject *mod= PyImport_ImportModuleLevel((char *)modname, NULL, NULL, NULL, 0);
+ PyObject *mod = PyImport_ImportModuleLevel((char *)modname, NULL, NULL, NULL, 0);
if (mod) {
Py_DECREF(mod);
}
@@ -238,11 +238,11 @@ void BPy_init_modules(void)
PyObject *mod;
/* Needs to be first since this dir is needed for future modules */
- char *modpath= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, "modules");
+ char *modpath = BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, "modules");
if (modpath) {
// printf("bpy: found module path '%s'.\n", modpath);
- PyObject *sys_path= PySys_GetObject("path"); /* borrow */
- PyObject *py_modpath= PyUnicode_FromString(modpath);
+ PyObject *sys_path = PySys_GetObject("path"); /* borrow */
+ PyObject *py_modpath = PyUnicode_FromString(modpath);
PyList_Insert(sys_path, 0, py_modpath); /* add first */
Py_DECREF(py_modpath);
}
@@ -252,7 +252,7 @@ void BPy_init_modules(void)
/* stand alone utility modules not related to blender directly */
IDProp_Init_Types(); /* not actually a submodule, just types */
- mod= PyModule_New("_bpy");
+ mod = PyModule_New("_bpy");
/* add the module so we can import it */
PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy", mod);
@@ -280,7 +280,7 @@ void BPy_init_modules(void)
/* bpy context */
RNA_pointer_create(NULL, &RNA_Context, (void *)BPy_GetContext(), &ctx_ptr);
- bpy_context_module= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ctx_ptr);
+ bpy_context_module = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ctx_ptr);
/* odd that this is needed, 1 ref on creation and another for the module
* but without we get a crash on exit */
Py_INCREF(bpy_context_module);
@@ -298,5 +298,5 @@ void BPy_init_modules(void)
PyModule_AddObject(mod, meth_bpy_unregister_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_unregister_class, NULL));
/* add our own modules dir, this is a python package */
- bpy_package_py= bpy_import_test("bpy");
+ bpy_package_py = bpy_import_test("bpy");
}
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 1f99503202a..ea95c4ebd85 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -32,6 +32,9 @@
#include <Python.h>
#include "bpy_app.h"
+
+#include "bpy_app_ffmpeg.h"
+
#include "bpy_app_handlers.h"
#include "bpy_driver.h"
@@ -59,7 +62,7 @@ extern char build_system[];
static PyTypeObject BlenderAppType;
-static PyStructSequence_Field app_info_fields[]= {
+static PyStructSequence_Field app_info_fields[] = {
{(char *)"version", (char *)"The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
{(char *)"version_string", (char *)"The Blender version formatted as a string"},
{(char *)"version_char", (char *)"The Blender version character (for minor releases)"},
@@ -79,15 +82,16 @@ static PyStructSequence_Field app_info_fields[]= {
{(char *)"build_system", (char *)"Build system used"},
/* submodules */
+ {(char *)"ffmpeg", (char *)"FFmpeg library information backend"},
{(char *)"handlers", (char *)"Application handler callbacks"},
{NULL}
};
-static PyStructSequence_Desc app_info_desc= {
+static PyStructSequence_Desc app_info_desc = {
(char *)"bpy.app", /* name */
(char *)"This module contains application values that remain unchanged during runtime.", /* doc */
app_info_fields, /* fields */
- (sizeof(app_info_fields)/sizeof(PyStructSequence_Field)) - 1
+ (sizeof(app_info_fields) / sizeof(PyStructSequence_Field)) - 1
};
#define DO_EXPAND(VAL) VAL ## 1
@@ -96,9 +100,9 @@ static PyStructSequence_Desc app_info_desc= {
static PyObject *make_app_info(void)
{
PyObject *app_info;
- int pos= 0;
+ int pos = 0;
- app_info= PyStructSequence_New(&BlenderAppType);
+ app_info = PyStructSequence_New(&BlenderAppType);
if (app_info == NULL) {
return NULL;
}
@@ -110,8 +114,11 @@ static PyObject *make_app_info(void)
#define SetObjItem(obj) \
PyStructSequence_SET_ITEM(app_info, pos++, obj)
- SetObjItem(Py_BuildValue("(iii)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
- SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
+ SetObjItem(Py_BuildValue("(iii)",
+ BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION));
+ SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)",
+ BLENDER_VERSION / 100, BLENDER_VERSION % 100, BLENDER_SUBVERSION));
+
#if defined(BLENDER_VERSION_CHAR) && EXPAND(BLENDER_VERSION_CHAR) != 1
SetStrItem(STRINGIFY(BLENDER_VERSION_CHAR));
#else
@@ -144,6 +151,7 @@ static PyObject *make_app_info(void)
SetStrItem("Unknown");
#endif
+ SetObjItem(BPY_app_ffmpeg_struct());
SetObjItem(BPY_app_handlers_struct());
#undef SetIntItem
@@ -170,7 +178,7 @@ static PyObject *bpy_app_debug_get(PyObject *UNUSED(self), void *UNUSED(closure)
static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
{
- int param= PyObject_IsTrue(value);
+ int param = PyObject_IsTrue(value);
if (param < 0) {
PyErr_SetString(PyExc_TypeError, "bpy.app.debug can only be True/False");
@@ -193,14 +201,14 @@ static PyObject *bpy_app_debug_value_get(PyObject *UNUSED(self), void *UNUSED(cl
static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
{
- int param= PyLong_AsSsize_t(value);
+ int param = PyLong_AsSsize_t(value);
if (param == -1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "bpy.app.debug_value can only be set to a whole number");
return -1;
}
- G.rt= param;
+ G.rt = param;
return 0;
}
@@ -229,7 +237,7 @@ static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(cl
}
-static PyGetSetDef bpy_app_getsets[]= {
+static PyGetSetDef bpy_app_getsets[] = {
{(char *)"debug", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, NULL},
{(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL},
{(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL},
@@ -242,7 +250,7 @@ static void py_struct_seq_getset_init(void)
/* tricky dynamic members, not to py-spec! */
PyGetSetDef *getset;
- for (getset= bpy_app_getsets; getset->name; getset++) {
+ for (getset = bpy_app_getsets; getset->name; getset++) {
PyDict_SetItemString(BlenderAppType.tp_dict, getset->name, PyDescr_NewGetSet(&BlenderAppType, getset));
}
}
@@ -255,11 +263,12 @@ PyObject *BPY_app_struct(void)
PyStructSequence_InitType(&BlenderAppType, &app_info_desc);
- ret= make_app_info();
+ ret = make_app_info();
/* prevent user from creating new instances */
- BlenderAppType.tp_init= NULL;
- BlenderAppType.tp_new= NULL;
+ BlenderAppType.tp_init = NULL;
+ BlenderAppType.tp_new = NULL;
+ BlenderAppType.tp_hash = (hashfunc)_Py_HashPointer; /* without this we can't do set(sys.modules) [#29635] */
/* kindof a hack ontop of PyStructSequence */
py_struct_seq_getset_init();
diff --git a/source/blender/python/intern/bpy_app_ffmpeg.c b/source/blender/python/intern/bpy_app_ffmpeg.c
new file mode 100644
index 00000000000..778334c9600
--- /dev/null
+++ b/source/blender/python/intern/bpy_app_ffmpeg.c
@@ -0,0 +1,143 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_app_ffmpeg.c
+ * \ingroup pythonintern
+ */
+
+#include <Python.h>
+#include "BLI_utildefines.h"
+#include "BLI_callbacks.h"
+
+#include "RNA_types.h"
+#include "RNA_access.h"
+#include "bpy_rna.h"
+
+#ifdef WITH_FFMPEG
+#include <libavcodec/avcodec.h>
+#include <libavdevice/avdevice.h>
+#include <libavformat/avformat.h>
+#include <libavutil/avutil.h>
+#include <libswscale/swscale.h>
+#endif
+
+static PyTypeObject BlenderAppFFmpegType;
+
+#define DEF_FFMPEG_LIB_VERSION(lib) \
+ {(char *)(#lib "_version"), (char *)("The " #lib " version as a tuple of 3 numbers")}, \
+ {(char *)(#lib "_version_string"), (char *)("The " #lib " version formatted as a string")},
+
+static PyStructSequence_Field app_ffmpeg_info_fields[] = {
+ {(char *)"supported", (char *)("Boolean, True when Blender is built with FFmpeg support")},
+
+ DEF_FFMPEG_LIB_VERSION(avcodec)
+ DEF_FFMPEG_LIB_VERSION(avdevice)
+ DEF_FFMPEG_LIB_VERSION(avformat)
+ DEF_FFMPEG_LIB_VERSION(avutil)
+ DEF_FFMPEG_LIB_VERSION(swscale)
+ {NULL}
+};
+
+#undef DEF_FFMPEG_LIB_VERSION
+
+static PyStructSequence_Desc app_ffmpeg_info_desc = {
+ (char *)"bpy.app.ffmpeg", /* name */
+ (char *)"This module contains information about FFmpeg blender is linked against", /* doc */
+ app_ffmpeg_info_fields, /* fields */
+ (sizeof(app_ffmpeg_info_fields) / sizeof(PyStructSequence_Field)) - 1
+};
+
+static PyObject *make_ffmpeg_info(void)
+{
+ PyObject *ffmpeg_info;
+ int pos = 0;
+
+#ifdef WITH_FFMPEG
+ int curversion;
+#endif
+
+ ffmpeg_info = PyStructSequence_New(&BlenderAppFFmpegType);
+ if (ffmpeg_info == NULL) {
+ return NULL;
+ }
+
+#define SetIntItem(flag) \
+ PyStructSequence_SET_ITEM(ffmpeg_info, pos++, PyLong_FromLong(flag))
+#define SetStrItem(str) \
+ PyStructSequence_SET_ITEM(ffmpeg_info, pos++, PyUnicode_FromString(str))
+#define SetObjItem(obj) \
+ PyStructSequence_SET_ITEM(ffmpeg_info, pos++, obj)
+
+#ifdef WITH_FFMPEG
+ #define FFMPEG_LIB_VERSION(lib) \
+ curversion = lib ## _version(); \
+ SetObjItem(Py_BuildValue("(iii)", \
+ curversion >> 16, (curversion >> 8) % 256, curversion % 256)); \
+ SetObjItem(PyUnicode_FromFormat("%2d, %2d, %2d", \
+ curversion >> 16, (curversion >> 8) % 256, curversion % 256));
+#else
+ #define FFMPEG_LIB_VERSION(lib) \
+ SetStrItem("Unknown"); \
+ SetStrItem("Unknown");
+#endif
+
+#ifdef WITH_FFMPEG
+ SetObjItem(PyBool_FromLong(1));
+#else
+ SetObjItem(PyBool_FromLong(0));
+#endif
+
+ FFMPEG_LIB_VERSION(avcodec);
+ FFMPEG_LIB_VERSION(avdevice);
+ FFMPEG_LIB_VERSION(avformat);
+ FFMPEG_LIB_VERSION(avutil);
+ FFMPEG_LIB_VERSION(swscale);
+
+#undef FFMPEG_LIB_VERSION
+
+ if (PyErr_Occurred()) {
+ Py_CLEAR(ffmpeg_info);
+ return NULL;
+ }
+
+#undef SetIntItem
+#undef SetStrItem
+#undef SetObjItem
+
+ return ffmpeg_info;
+}
+
+PyObject *BPY_app_ffmpeg_struct(void)
+{
+ PyObject *ret;
+
+ PyStructSequence_InitType(&BlenderAppFFmpegType, &app_ffmpeg_info_desc);
+
+ ret = make_ffmpeg_info();
+
+ /* prevent user from creating new instances */
+ BlenderAppFFmpegType.tp_init = NULL;
+ BlenderAppFFmpegType.tp_new = NULL;
+ BlenderAppFFmpegType.tp_hash = (hashfunc)_Py_HashPointer; /* without this we can't do set(sys.modules) [#29635] */
+
+ return ret;
+}
diff --git a/source/blender/python/intern/bpy_app_ffmpeg.h b/source/blender/python/intern/bpy_app_ffmpeg.h
new file mode 100644
index 00000000000..4ed89cd7902
--- /dev/null
+++ b/source/blender/python/intern/bpy_app_ffmpeg.h
@@ -0,0 +1,32 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_app_ffmpeg.h
+ * \ingroup pythonintern
+ */
+
+#ifndef BPY_APP_FFMPEG_H
+#define BPY_APP_FFMPEG_H
+
+PyObject *BPY_app_ffmpeg_struct(void);
+
+#endif // BPY_APP_FFMPEG_H
diff --git a/source/blender/python/intern/bpy_app_handlers.c b/source/blender/python/intern/bpy_app_handlers.c
index edab92b295b..721bce51693 100644
--- a/source/blender/python/intern/bpy_app_handlers.c
+++ b/source/blender/python/intern/bpy_app_handlers.c
@@ -41,7 +41,7 @@ void bpy_app_generic_callback(struct Main *main, struct ID *id, void *arg);
static PyTypeObject BlenderAppCbType;
-static PyStructSequence_Field app_cb_info_fields[]= {
+static PyStructSequence_Field app_cb_info_fields[] = {
{(char *)"frame_change_pre", (char *)"Callback list - on frame change for playback and rendering (before)"},
{(char *)"frame_change_post", (char *)"Callback list - on frame change for playback and rendering (after)"},
{(char *)"render_pre", (char *)"Callback list - on render (before)"},
@@ -61,11 +61,11 @@ static PyStructSequence_Field app_cb_info_fields[]= {
{NULL}
};
-static PyStructSequence_Desc app_cb_info_desc= {
+static PyStructSequence_Desc app_cb_info_desc = {
(char *)"bpy.app.handlers", /* name */
(char *)"This module contains callbacks", /* doc */
app_cb_info_fields, /* fields */
- (sizeof(app_cb_info_fields)/sizeof(PyStructSequence_Field)) - 1
+ (sizeof(app_cb_info_fields) / sizeof(PyStructSequence_Field)) - 1
};
/*
@@ -82,11 +82,11 @@ static PyObject *bpy_app_handlers_persistent_new(PyTypeObject *UNUSED(type), PyO
{
PyObject *value;
- if(!PyArg_ParseTuple(args, "O:bpy.app.handlers.persistent", &value))
+ if (!PyArg_ParseTuple(args, "O:bpy.app.handlers.persistent", &value))
return NULL;
if (PyFunction_Check(value)) {
- PyObject **dict_ptr= _PyObject_GetDictPtr(value);
+ PyObject **dict_ptr = _PyObject_GetDictPtr(value);
if (dict_ptr == NULL) {
PyErr_SetString(PyExc_ValueError,
"bpy.app.handlers.persistent wasn't able to "
@@ -96,7 +96,7 @@ static PyObject *bpy_app_handlers_persistent_new(PyTypeObject *UNUSED(type), PyO
else {
/* set id */
if (*dict_ptr == NULL) {
- *dict_ptr= PyDict_New();
+ *dict_ptr = PyDict_New();
}
PyDict_SetItemString(*dict_ptr, PERMINENT_CB_ID, Py_None);
@@ -163,23 +163,23 @@ static PyTypeObject BPyPersistent_Type = {
0, /* tp_free */
};
-static PyObject *py_cb_array[BLI_CB_EVT_TOT]= {NULL};
+static PyObject *py_cb_array[BLI_CB_EVT_TOT] = {NULL};
static PyObject *make_app_cb_info(void)
{
PyObject *app_cb_info;
- int pos= 0;
+ int pos = 0;
- app_cb_info= PyStructSequence_New(&BlenderAppCbType);
+ app_cb_info = PyStructSequence_New(&BlenderAppCbType);
if (app_cb_info == NULL) {
return NULL;
}
- for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
+ for (pos = 0; pos < BLI_CB_EVT_TOT; pos++) {
if (app_cb_info_fields[pos].name == NULL) {
Py_FatalError("invalid callback slots 1");
}
- PyStructSequence_SET_ITEM(app_cb_info, pos, (py_cb_array[pos]= PyList_New(0)));
+ PyStructSequence_SET_ITEM(app_cb_info, pos, (py_cb_array[pos] = PyList_New(0)));
}
if (app_cb_info_fields[pos + APP_CB_OTHER_FIELDS].name != NULL) {
Py_FatalError("invalid callback slots 2");
@@ -196,7 +196,7 @@ PyObject *BPY_app_handlers_struct(void)
PyObject *ret;
#if defined(_MSC_VER) || defined(FREE_WINDOWS)
- BPyPersistent_Type.ob_base.ob_base.ob_type= &PyType_Type;
+ BPyPersistent_Type.ob_base.ob_base.ob_type = &PyType_Type;
#endif
if (PyType_Ready(&BPyPersistent_Type) < 0) {
@@ -205,23 +205,24 @@ PyObject *BPY_app_handlers_struct(void)
PyStructSequence_InitType(&BlenderAppCbType, &app_cb_info_desc);
- ret= make_app_cb_info();
+ ret = make_app_cb_info();
/* prevent user from creating new instances */
- BlenderAppCbType.tp_init= NULL;
- BlenderAppCbType.tp_new= NULL;
+ BlenderAppCbType.tp_init = NULL;
+ BlenderAppCbType.tp_new = NULL;
+ BlenderAppCbType.tp_hash = (hashfunc)_Py_HashPointer; /* without this we can't do set(sys.modules) [#29635] */
/* assign the C callbacks */
if (ret) {
- static bCallbackFuncStore funcstore_array[BLI_CB_EVT_TOT]= {{NULL}};
+ static bCallbackFuncStore funcstore_array[BLI_CB_EVT_TOT] = {{NULL}};
bCallbackFuncStore *funcstore;
- int pos= 0;
+ int pos = 0;
- for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
- funcstore= &funcstore_array[pos];
- funcstore->func= bpy_app_generic_callback;
- funcstore->alloc= 0;
- funcstore->arg= SET_INT_IN_POINTER(pos);
+ for (pos = 0; pos < BLI_CB_EVT_TOT; pos++) {
+ funcstore = &funcstore_array[pos];
+ funcstore->func = bpy_app_generic_callback;
+ funcstore->alloc = 0;
+ funcstore->arg = SET_INT_IN_POINTER(pos);
BLI_add_cb(funcstore, pos);
}
}
@@ -231,32 +232,32 @@ PyObject *BPY_app_handlers_struct(void)
void BPY_app_handlers_reset(const short do_all)
{
- int pos= 0;
+ int pos = 0;
if (do_all) {
- for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
+ for (pos = 0; pos < BLI_CB_EVT_TOT; pos++) {
/* clear list */
PyList_SetSlice(py_cb_array[pos], 0, PY_SSIZE_T_MAX, NULL);
}
}
else {
/* save string conversion thrashing */
- PyObject *perm_id_str= PyUnicode_FromString(PERMINENT_CB_ID);
+ PyObject *perm_id_str = PyUnicode_FromString(PERMINENT_CB_ID);
- for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
+ for (pos = 0; pos < BLI_CB_EVT_TOT; pos++) {
/* clear only items without PERMINENT_CB_ID */
- PyObject *ls= py_cb_array[pos];
+ PyObject *ls = py_cb_array[pos];
Py_ssize_t i;
PyObject *item;
PyObject **dict_ptr;
- for(i= PyList_GET_SIZE(ls) - 1; i >= 0; i--) {
+ for (i = PyList_GET_SIZE(ls) - 1; i >= 0; i--) {
- if ( (PyFunction_Check((item= PyList_GET_ITEM(ls, i)))) &&
- (dict_ptr= _PyObject_GetDictPtr(item)) &&
- (*dict_ptr) &&
- (PyDict_GetItem(*dict_ptr, perm_id_str) != NULL))
+ if ( (PyFunction_Check((item = PyList_GET_ITEM(ls, i)))) &&
+ (dict_ptr = _PyObject_GetDictPtr(item)) &&
+ (*dict_ptr) &&
+ (PyDict_GetItem(*dict_ptr, perm_id_str) != NULL))
{
/* keep */
}
@@ -275,12 +276,12 @@ void BPY_app_handlers_reset(const short do_all)
/* the actual callback - not necessarily called from py */
void bpy_app_generic_callback(struct Main *UNUSED(main), struct ID *id, void *arg)
{
- PyObject *cb_list= py_cb_array[GET_INT_FROM_POINTER(arg)];
+ PyObject *cb_list = py_cb_array[GET_INT_FROM_POINTER(arg)];
Py_ssize_t cb_list_len;
- if ((cb_list_len= PyList_GET_SIZE(cb_list)) > 0) {
- PyGILState_STATE gilstate= PyGILState_Ensure();
+ if ((cb_list_len = PyList_GET_SIZE(cb_list)) > 0) {
+ PyGILState_STATE gilstate = PyGILState_Ensure();
- PyObject* args= PyTuple_New(1); // save python creating each call
+ PyObject* args = PyTuple_New(1); // save python creating each call
PyObject* func;
PyObject* ret;
Py_ssize_t pos;
@@ -297,10 +298,10 @@ void bpy_app_generic_callback(struct Main *UNUSED(main), struct ID *id, void *ar
}
// Iterate the list and run the callbacks
- for (pos=0; pos < cb_list_len; pos++) {
- func= PyList_GET_ITEM(cb_list, pos);
- ret= PyObject_Call(func, args, NULL);
- if (ret==NULL) {
+ for (pos = 0; pos < cb_list_len; pos++) {
+ func = PyList_GET_ITEM(cb_list, pos);
+ ret = PyObject_Call(func, args, NULL);
+ if (ret == NULL) {
PyErr_Print();
PyErr_Clear();
}
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index 34270c832ea..95b00b18f43 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -47,7 +47,7 @@ extern void BPY_update_rna_module(void);
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
-PyObject *bpy_pydriver_Dict= NULL;
+PyObject *bpy_pydriver_Dict = NULL;
/* For faster execution we keep a special dictionary for pydrivers, with
* the needed modules and aliases.
@@ -59,32 +59,33 @@ int bpy_pydriver_create_dict(void)
/* validate namespace for driver evaluation */
if (bpy_pydriver_Dict) return -1;
- d= PyDict_New();
+ d = PyDict_New();
if (d == NULL)
return -1;
else
- bpy_pydriver_Dict= d;
+ bpy_pydriver_Dict = d;
/* import some modules: builtins, bpy, math, (Blender.noise)*/
PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins());
- mod= PyImport_ImportModule("math");
+ mod = PyImport_ImportModule("math");
if (mod) {
PyDict_Merge(d, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
Py_DECREF(mod);
}
/* add bpy to global namespace */
- mod= PyImport_ImportModuleLevel((char *)"bpy", NULL, NULL, NULL, 0);
+ mod = PyImport_ImportModuleLevel((char *)"bpy", NULL, NULL, NULL, 0);
if (mod) {
PyDict_SetItemString(bpy_pydriver_Dict, "bpy", mod);
Py_DECREF(mod);
}
/* add noise to global namespace */
- mod= PyImport_ImportModuleLevel((char *)"mathutils.noise", NULL, NULL, NULL, 0);
+ mod = PyImport_ImportModuleLevel((char *)"mathutils", NULL, NULL, NULL, 0);
if (mod) {
- PyDict_SetItemString(bpy_pydriver_Dict, "noise", mod);
+ PyObject *modsub = PyDict_GetItemString(PyModule_GetDict(mod), "noise");
+ PyDict_SetItemString(bpy_pydriver_Dict, "noise", modsub);
Py_DECREF(mod);
}
@@ -92,25 +93,24 @@ int bpy_pydriver_create_dict(void)
}
/* note, this function should do nothing most runs, only when changing frame */
-static PyObject *bpy_pydriver_InternStr__frame= NULL;
+static PyObject *bpy_pydriver_InternStr__frame = NULL;
+/* not thread safe but neither is python */
+static float bpy_pydriver_evaltime_prev = FLT_MAX;
static void bpy_pydriver_update_dict(const float evaltime)
{
- /* not thread safe but neither is python */
- static float evaltime_prev= FLT_MAX;
-
- if (evaltime_prev != evaltime) {
+ if (bpy_pydriver_evaltime_prev != evaltime) {
/* currently only update the frame */
if (bpy_pydriver_InternStr__frame == NULL) {
- bpy_pydriver_InternStr__frame= PyUnicode_FromString("frame");
+ bpy_pydriver_InternStr__frame = PyUnicode_FromString("frame");
}
PyDict_SetItem(bpy_pydriver_Dict,
bpy_pydriver_InternStr__frame,
PyFloat_FromDouble(evaltime));
- evaltime_prev= evaltime;
+ bpy_pydriver_evaltime_prev = evaltime;
}
}
@@ -122,20 +122,21 @@ static void bpy_pydriver_update_dict(const float evaltime)
void BPY_driver_reset(void)
{
PyGILState_STATE gilstate;
- int use_gil= 1; /* !PYC_INTERPRETER_ACTIVE; */
+ int use_gil = 1; /* !PYC_INTERPRETER_ACTIVE; */
if (use_gil)
- gilstate= PyGILState_Ensure();
+ gilstate = PyGILState_Ensure();
if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
PyDict_Clear(bpy_pydriver_Dict);
Py_DECREF(bpy_pydriver_Dict);
- bpy_pydriver_Dict= NULL;
+ bpy_pydriver_Dict = NULL;
}
if (bpy_pydriver_InternStr__frame) {
Py_DECREF(bpy_pydriver_InternStr__frame);
- bpy_pydriver_InternStr__frame= NULL;
+ bpy_pydriver_InternStr__frame = NULL;
+ bpy_pydriver_evaltime_prev = FLT_MAX;
}
if (use_gil)
@@ -169,22 +170,22 @@ static void pydriver_error(ChannelDriver *driver)
*/
float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
{
- PyObject *driver_vars=NULL;
- PyObject *retval= NULL;
+ PyObject *driver_vars = NULL;
+ PyObject *retval = NULL;
PyObject *expr_vars; /* speed up by pre-hashing string & avoids re-converting unicode strings for every execution */
PyObject *expr_code;
PyGILState_STATE gilstate;
int use_gil;
DriverVar *dvar;
- double result= 0.0; /* default return */
- char *expr= NULL;
- short targets_ok= 1;
+ double result = 0.0; /* default return */
+ char *expr = NULL;
+ short targets_ok = 1;
int i;
/* get the py expression to be evaluated */
- expr= driver->expression;
- if ((expr == NULL) || (expr[0]=='\0'))
+ expr = driver->expression;
+ if ((expr == NULL) || (expr[0] == '\0'))
return 0.0f;
if (!(G.f & G_SCRIPT_AUTOEXEC)) {
@@ -192,10 +193,10 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
return 0.0f;
}
- use_gil= 1; /* !PYC_INTERPRETER_ACTIVE; */
+ use_gil = 1; /* !PYC_INTERPRETER_ACTIVE; */
if (use_gil)
- gilstate= PyGILState_Ensure();
+ gilstate = PyGILState_Ensure();
/* needed since drivers are updated directly after undo where 'main' is
* re-allocated [#28807] */
@@ -215,51 +216,51 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
bpy_pydriver_update_dict(evaltime);
- if (driver->expr_comp==NULL)
+ if (driver->expr_comp == NULL)
driver->flag |= DRIVER_FLAG_RECOMPILE;
/* compile the expression first if it hasn't been compiled or needs to be rebuilt */
if (driver->flag & DRIVER_FLAG_RECOMPILE) {
Py_XDECREF(driver->expr_comp);
- driver->expr_comp= PyTuple_New(2);
+ driver->expr_comp = PyTuple_New(2);
- expr_code= Py_CompileString(expr, "<bpy driver>", Py_eval_input);
+ expr_code = Py_CompileString(expr, "<bpy driver>", Py_eval_input);
PyTuple_SET_ITEM(((PyObject *)driver->expr_comp), 0, expr_code);
driver->flag &= ~DRIVER_FLAG_RECOMPILE;
driver->flag |= DRIVER_FLAG_RENAMEVAR; /* maybe this can be removed but for now best keep until were sure */
}
else {
- expr_code= PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 0);
+ expr_code = PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 0);
}
if (driver->flag & DRIVER_FLAG_RENAMEVAR) {
/* may not be set */
- expr_vars= PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 1);
+ expr_vars = PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 1);
Py_XDECREF(expr_vars);
- expr_vars= PyTuple_New(BLI_countlist(&driver->variables));
+ expr_vars = PyTuple_New(BLI_countlist(&driver->variables));
PyTuple_SET_ITEM(((PyObject *)driver->expr_comp), 1, expr_vars);
- for (dvar= driver->variables.first, i=0; dvar; dvar= dvar->next) {
+ for (dvar = driver->variables.first, i = 0; dvar; dvar = dvar->next) {
PyTuple_SET_ITEM(expr_vars, i++, PyUnicode_FromString(dvar->name));
}
driver->flag &= ~DRIVER_FLAG_RENAMEVAR;
}
else {
- expr_vars= PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 1);
+ expr_vars = PyTuple_GET_ITEM(((PyObject *)driver->expr_comp), 1);
}
/* add target values to a dict that will be used as '__locals__' dict */
- driver_vars= PyDict_New(); // XXX do we need to decref this?
- for (dvar= driver->variables.first, i=0; dvar; dvar= dvar->next) {
- PyObject *driver_arg= NULL;
- float tval= 0.0f;
+ driver_vars = PyDict_New(); // XXX do we need to decref this?
+ for (dvar = driver->variables.first, i = 0; dvar; dvar = dvar->next) {
+ PyObject *driver_arg = NULL;
+ float tval = 0.0f;
/* try to get variable value */
- tval= driver_get_variable_value(driver, dvar);
- driver_arg= PyFloat_FromDouble((double)tval);
+ tval = driver_get_variable_value(driver, dvar);
+ driver_arg = PyFloat_FromDouble((double)tval);
/* try to add to dictionary */
/* if (PyDict_SetItemString(driver_vars, dvar->name, driver_arg)) { */
@@ -268,7 +269,7 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
if (targets_ok) {
/* first one - print some extra info for easier identification */
fprintf(stderr, "\nBPY_driver_eval() - Error while evaluating PyDriver:\n");
- targets_ok= 0;
+ targets_ok = 0;
}
fprintf(stderr, "\tBPY_driver_eval() - couldn't add variable '%s' to namespace\n", dvar->name);
@@ -281,11 +282,11 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
#if 0 // slow, with this can avoid all Py_CompileString above.
/* execute expression to get a value */
- retval= PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, driver_vars);
+ retval = PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, driver_vars);
#else
/* evaluate the compiled expression */
if (expr_code)
- retval= PyEval_EvalCode((void *)expr_code, bpy_pydriver_Dict, driver_vars);
+ retval = PyEval_EvalCode((void *)expr_code, bpy_pydriver_Dict, driver_vars);
#endif
/* decref the driver vars first... */
@@ -295,10 +296,10 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
if (retval == NULL) {
pydriver_error(driver);
}
- else if ((result= PyFloat_AsDouble(retval)) == -1.0 && PyErr_Occurred()) {
+ else if ((result = PyFloat_AsDouble(retval)) == -1.0 && PyErr_Occurred()) {
pydriver_error(driver);
Py_DECREF(retval);
- result= 0.0;
+ result = 0.0;
}
else {
/* all fine, make sure the "invalid expression" flag is cleared */
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 14d74bcf5d0..7d91438e4f7 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -76,14 +76,14 @@
/* for internal use, when starting and ending python scripts */
/* incase a python script triggers another python call, stop bpy_context_clear from invalidating */
-static int py_call_level= 0;
-BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
+static int py_call_level = 0;
+BPy_StructRNA *bpy_context_module = NULL; /* for fast access */
// #define TIME_PY_RUN // simple python tests. prints on exit.
#ifdef TIME_PY_RUN
#include "PIL_time.h"
-static int bpy_timer_count= 0;
+static int bpy_timer_count = 0;
static double bpy_timer; /* time since python starts */
static double bpy_timer_run; /* time for each python script run */
static double bpy_timer_run_tot; /* accumulate python runs */
@@ -102,18 +102,18 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
py_call_level++;
if (gilstate)
- *gilstate= PyGILState_Ensure();
+ *gilstate = PyGILState_Ensure();
- if (py_call_level==1) {
+ if (py_call_level == 1) {
bpy_context_update(C);
#ifdef TIME_PY_RUN
- if (bpy_timer_count==0) {
+ if (bpy_timer_count == 0) {
/* record time from the beginning */
- bpy_timer= PIL_check_seconds_timer();
- bpy_timer_run= bpy_timer_run_tot= 0.0;
+ bpy_timer = PIL_check_seconds_timer();
+ bpy_timer_run = bpy_timer_run_tot = 0.0;
}
- bpy_timer_run= PIL_check_seconds_timer();
+ bpy_timer_run = PIL_check_seconds_timer();
bpy_timer_count++;
@@ -132,7 +132,7 @@ void bpy_context_clear(bContext *UNUSED(C), PyGILState_STATE *gilstate)
if (py_call_level < 0) {
fprintf(stderr, "ERROR: Python context internal state bug. this should not happen!\n");
}
- else if (py_call_level==0) {
+ else if (py_call_level == 0) {
/* XXX - Calling classes currently wont store the context :\,
* cant set NULL because of this. but this is very flakey still. */
#if 0
@@ -152,21 +152,21 @@ void BPY_text_free_code(Text *text)
{
if (text->compiled) {
Py_DECREF((PyObject *)text->compiled);
- text->compiled= NULL;
+ text->compiled = NULL;
}
}
void BPY_modules_update(bContext *C)
{
#if 0 // slow, this runs all the time poll, draw etc 100's of time a sec.
- PyObject *mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
+ PyObject *mod = PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
PyModule_AddObject(mod, "data", BPY_rna_module());
PyModule_AddObject(mod, "types", BPY_rna_types()); // atm this does not need updating
#endif
/* refreshes the main struct */
BPY_update_rna_module();
- bpy_context_module->ptr.data= (void *)C;
+ bpy_context_module->ptr.data = (void *)C;
}
void BPY_context_set(bContext *C)
@@ -179,7 +179,7 @@ extern PyObject *AUD_initPython(void);
/* defined in cycles/blender */
extern PyObject *CYCLES_initPython(void);
-static struct _inittab bpy_internal_modules[]= {
+static struct _inittab bpy_internal_modules[] = {
{(char *)"mathutils", PyInit_mathutils},
// {(char *)"mathutils.geometry", PyInit_mathutils_geometry},
// {(char *)"mathutils.noise", PyInit_mathutils_noise},
@@ -189,7 +189,7 @@ static struct _inittab bpy_internal_modules[]= {
{(char *)"aud", AUD_initPython},
#endif
#ifdef WITH_CYCLES
- {(char *)"bcycles", CYCLES_initPython},
+ {(char *)"_cycles", CYCLES_initPython},
#endif
{(char *)"gpu", GPU_initPython},
{NULL, NULL}
@@ -199,7 +199,7 @@ static struct _inittab bpy_internal_modules[]= {
void BPY_python_start(int argc, const char **argv)
{
#ifndef WITH_PYTHON_MODULE
- PyThreadState *py_tstate= NULL;
+ PyThreadState *py_tstate = NULL;
/* not essential but nice to set our name */
static wchar_t program_path_wchar[FILE_MAX]; /* python holds a reference */
@@ -222,7 +222,7 @@ void BPY_python_start(int argc, const char **argv)
/* Python 3.2 now looks for '2.xx/python/include/python3.2d/pyconfig.h' to
* parse from the 'sysconfig' module which is used by 'site',
* so for now disable site. alternatively we could copy the file. */
- Py_NoSiteFlag= 1;
+ Py_NoSiteFlag = 1;
Py_Initialize();
@@ -230,8 +230,8 @@ void BPY_python_start(int argc, const char **argv)
/* sigh, why do python guys not have a char** version anymore? :( */
{
int i;
- PyObject *py_argv= PyList_New(argc);
- for (i=0; i<argc; i++) {
+ PyObject *py_argv = PyList_New(argc);
+ for (i = 0; i < argc; i++) {
/* should fix bug #20021 - utf path name problems, by replacing
* PyUnicode_FromString, with this one */
PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
@@ -263,7 +263,7 @@ void BPY_python_start(int argc, const char **argv)
BPY_atexit_register(); /* this can init any time */
#ifndef WITH_PYTHON_MODULE
- py_tstate= PyGILState_GetThisThreadState();
+ py_tstate = PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
#endif
}
@@ -287,16 +287,16 @@ void BPY_python_end(void)
#ifdef TIME_PY_RUN
// measure time since py started
- bpy_timer= PIL_check_seconds_timer() - bpy_timer;
+ bpy_timer = PIL_check_seconds_timer() - bpy_timer;
printf("*bpy stats* - ");
printf("tot exec: %d, ", bpy_timer_count);
printf("tot run: %.4fsec, ", bpy_timer_run_tot);
- if (bpy_timer_count>0)
+ if (bpy_timer_count > 0)
printf("average run: %.6fsec, ", (bpy_timer_run_tot/bpy_timer_count));
- if (bpy_timer>0.0)
- printf("tot usage %.4f%%", (bpy_timer_run_tot/bpy_timer)*100.0);
+ if (bpy_timer > 0.0)
+ printf("tot usage %.4f%%", (bpy_timer_run_tot/bpy_timer) * 100.0);
printf("\n");
@@ -310,7 +310,7 @@ static void python_script_error_jump_text(struct Text *text)
{
int lineno;
int offset;
- python_script_error_jump(text->id.name+2, &lineno, &offset);
+ python_script_error_jump(text->id.name + 2, &lineno, &offset);
if (lineno != -1) {
/* select the line with the error */
txt_move_to(text, lineno - 1, INT_MAX, FALSE);
@@ -334,13 +334,13 @@ typedef struct {
static int python_script_exec(bContext *C, const char *fn, struct Text *text,
struct ReportList *reports, const short do_jump)
{
- PyObject *main_mod= NULL;
- PyObject *py_dict= NULL, *py_result= NULL;
+ PyObject *main_mod = NULL;
+ PyObject *py_dict = NULL, *py_result = NULL;
PyGILState_STATE gilstate;
BLI_assert(fn || text);
- if (fn==NULL && text==NULL) {
+ if (fn == NULL && text == NULL) {
return 0;
}
@@ -353,9 +353,9 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
if (text->compiled == NULL) { /* if it wasn't already compiled, do it now */
- char *buf= txt_to_buf(text);
+ char *buf = txt_to_buf(text);
- text->compiled= Py_CompileString(buf, fn_dummy, Py_file_input);
+ text->compiled = Py_CompileString(buf, fn_dummy, Py_file_input);
MEM_freeN(buf);
@@ -368,16 +368,16 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
}
if (text->compiled) {
- py_dict= PyC_DefaultNameSpace(fn_dummy);
- py_result= PyEval_EvalCode(text->compiled, py_dict, py_dict);
+ py_dict = PyC_DefaultNameSpace(fn_dummy);
+ py_result = PyEval_EvalCode(text->compiled, py_dict, py_dict);
}
}
else {
- FILE *fp= fopen(fn, "r");
+ FILE *fp = fopen(fn, "r");
if (fp) {
- py_dict= PyC_DefaultNameSpace(fn);
+ py_dict = PyC_DefaultNameSpace(fn);
#ifdef _WIN32
/* Previously we used PyRun_File to run directly the code on a FILE
@@ -390,14 +390,14 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
fclose(fp);
- pystring= MEM_mallocN(strlen(fn) + 32, "pystring");
- pystring[0]= '\0';
+ pystring = MEM_mallocN(strlen(fn) + 32, "pystring");
+ pystring[0] = '\0';
sprintf(pystring, "exec(open(r'%s').read())", fn);
- py_result= PyRun_String(pystring, Py_file_input, py_dict, py_dict);
+ py_result = PyRun_String(pystring, Py_file_input, py_dict, py_dict);
MEM_freeN(pystring);
}
#else
- py_result= PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
+ py_result = PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
fclose(fp);
#endif
}
@@ -405,7 +405,7 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
PyErr_Format(PyExc_IOError,
"Python file \"%s\" could not be opened: %s",
fn, strerror(errno));
- py_result= NULL;
+ py_result = NULL;
}
}
@@ -423,11 +423,11 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text,
if (py_dict) {
#ifdef PYMODULE_CLEAR_WORKAROUND
- PyModuleObject *mmod= (PyModuleObject *)PyDict_GetItemString(PyThreadState_GET()->interp->modules, "__main__");
- PyObject *dict_back= mmod->md_dict;
+ PyModuleObject *mmod = (PyModuleObject *)PyDict_GetItemString(PyThreadState_GET()->interp->modules, "__main__");
+ PyObject *dict_back = mmod->md_dict;
/* freeing the module will clear the namespace,
* gives problems running classes defined in this namespace being used later. */
- mmod->md_dict= NULL;
+ mmod->md_dict = NULL;
Py_DECREF(dict_back);
#endif
@@ -455,7 +455,7 @@ int BPY_text_exec(bContext *C, struct Text *text, struct ReportList *reports, co
void BPY_DECREF(void *pyob_ptr)
{
- PyGILState_STATE gilstate= PyGILState_Ensure();
+ PyGILState_STATE gilstate = PyGILState_Ensure();
Py_DECREF((PyObject *)pyob_ptr);
PyGILState_Release(gilstate);
}
@@ -465,13 +465,13 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const short ve
{
PyGILState_STATE gilstate;
PyObject *py_dict, *mod, *retval;
- int error_ret= 0;
- PyObject *main_mod= NULL;
+ int error_ret = 0;
+ PyObject *main_mod = NULL;
if (!value || !expr) return -1;
- if (expr[0]=='\0') {
- *value= 0.0;
+ if (expr[0] == '\0') {
+ *value = 0.0;
return error_ret;
}
@@ -479,9 +479,9 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const short ve
PyC_MainModule_Backup(&main_mod);
- py_dict= PyC_DefaultNameSpace("<blender button>");
+ py_dict = PyC_DefaultNameSpace("<blender button>");
- mod= PyImport_ImportModule("math");
+ mod = PyImport_ImportModule("math");
if (mod) {
PyDict_Merge(py_dict, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
Py_DECREF(mod);
@@ -491,10 +491,10 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const short ve
PyErr_Clear();
}
- retval= PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+ retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
if (retval == NULL) {
- error_ret= -1;
+ error_ret = -1;
}
else {
double val;
@@ -503,25 +503,25 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const short ve
/* Users my have typed in 10km, 2m
* add up all values */
int i;
- val= 0.0;
+ val = 0.0;
- for (i=0; i<PyTuple_GET_SIZE(retval); i++) {
- val+= PyFloat_AsDouble(PyTuple_GET_ITEM(retval, i));
+ for (i = 0; i < PyTuple_GET_SIZE(retval); i++) {
+ val += PyFloat_AsDouble(PyTuple_GET_ITEM(retval, i));
}
}
else {
- val= PyFloat_AsDouble(retval);
+ val = PyFloat_AsDouble(retval);
}
Py_DECREF(retval);
- if (val==-1 && PyErr_Occurred()) {
- error_ret= -1;
+ if (val == -1 && PyErr_Occurred()) {
+ error_ret = -1;
}
else if (!finite(val)) {
- *value= 0.0;
+ *value = 0.0;
}
else {
- *value= val;
+ *value = val;
}
}
@@ -544,14 +544,14 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const short ve
int BPY_string_exec(bContext *C, const char *expr)
{
PyGILState_STATE gilstate;
- PyObject *main_mod= NULL;
+ PyObject *main_mod = NULL;
PyObject *py_dict, *retval;
- int error_ret= 0;
+ int error_ret = 0;
Main *bmain_back; /* XXX, quick fix for release (Copy Settings crash), needs further investigation */
if (!expr) return -1;
- if (expr[0]=='\0') {
+ if (expr[0] == '\0') {
return error_ret;
}
@@ -559,17 +559,17 @@ int BPY_string_exec(bContext *C, const char *expr)
PyC_MainModule_Backup(&main_mod);
- py_dict= PyC_DefaultNameSpace("<blender string>");
+ py_dict = PyC_DefaultNameSpace("<blender string>");
- bmain_back= bpy_import_main_get();
+ bmain_back = bpy_import_main_get();
bpy_import_main_set(CTX_data_main(C));
- retval= PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+ retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
bpy_import_main_set(bmain_back);
if (retval == NULL) {
- error_ret= -1;
+ error_ret = -1;
BPy_errors_to_report(CTX_wm_reports(C));
}
@@ -588,11 +588,11 @@ int BPY_string_exec(bContext *C, const char *expr)
void BPY_modules_load_user(bContext *C)
{
PyGILState_STATE gilstate;
- Main *bmain= CTX_data_main(C);
+ Main *bmain = CTX_data_main(C);
Text *text;
/* can happen on file load */
- if (bmain==NULL)
+ if (bmain == NULL)
return;
/* update pointers since this can run from a nested script
@@ -603,15 +603,15 @@ void BPY_modules_load_user(bContext *C)
bpy_context_set(C, &gilstate);
- for (text=CTX_data_main(C)->text.first; text; text= text->id.next) {
- if (text->flags & TXT_ISSCRIPT && BLI_testextensie(text->id.name+2, ".py")) {
+ for (text = CTX_data_main(C)->text.first; text; text = text->id.next) {
+ if (text->flags & TXT_ISSCRIPT && BLI_testextensie(text->id.name + 2, ".py")) {
if (!(G.f & G_SCRIPT_AUTOEXEC)) {
- printf("scripts disabled for \"%s\", skipping '%s'\n", bmain->name, text->id.name+2);
+ printf("scripts disabled for \"%s\", skipping '%s'\n", bmain->name, text->id.name + 2);
}
else {
- PyObject *module= bpy_text_import(text);
+ PyObject *module = bpy_text_import(text);
- if (module==NULL) {
+ if (module == NULL) {
PyErr_Print();
PyErr_Clear();
}
@@ -626,43 +626,43 @@ void BPY_modules_load_user(bContext *C)
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
{
- PyObject *pyctx= (PyObject *)CTX_py_dict_get(C);
- PyObject *item= PyDict_GetItemString(pyctx, member);
- PointerRNA *ptr= NULL;
- int done= 0;
+ PyObject *pyctx = (PyObject *)CTX_py_dict_get(C);
+ PyObject *item = PyDict_GetItemString(pyctx, member);
+ PointerRNA *ptr = NULL;
+ int done = 0;
- if (item==NULL) {
+ if (item == NULL) {
/* pass */
}
- else if (item==Py_None) {
+ else if (item == Py_None) {
/* pass */
}
else if (BPy_StructRNA_Check(item)) {
- ptr= &(((BPy_StructRNA *)item)->ptr);
+ ptr = &(((BPy_StructRNA *)item)->ptr);
- //result->ptr= ((BPy_StructRNA *)item)->ptr;
+ //result->ptr = ((BPy_StructRNA *)item)->ptr;
CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
- done= 1;
+ done = 1;
}
else if (PySequence_Check(item)) {
- PyObject *seq_fast= PySequence_Fast(item, "bpy_context_get sequence conversion");
- if (seq_fast==NULL) {
+ PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion");
+ if (seq_fast == NULL) {
PyErr_Print();
PyErr_Clear();
}
else {
- int len= PySequence_Fast_GET_SIZE(seq_fast);
+ int len = PySequence_Fast_GET_SIZE(seq_fast);
int i;
- for (i= 0; i < len; i++) {
- PyObject *list_item= PySequence_Fast_GET_ITEM(seq_fast, i);
+ for (i = 0; i < len; i++) {
+ PyObject *list_item = PySequence_Fast_GET_ITEM(seq_fast, i);
if (BPy_StructRNA_Check(list_item)) {
/*
- CollectionPointerLink *link= MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
- link->ptr= ((BPy_StructRNA *)item)->ptr;
+ CollectionPointerLink *link = MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
+ link->ptr = ((BPy_StructRNA *)item)->ptr;
BLI_addtail(&result->list, link);
*/
- ptr= &(((BPy_StructRNA *)list_item)->ptr);
+ ptr = &(((BPy_StructRNA *)list_item)->ptr);
CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data);
}
else {
@@ -672,11 +672,11 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
}
Py_DECREF(seq_fast);
- done= 1;
+ done = 1;
}
}
- if (done==0) {
+ if (done == 0) {
if (item) printf("PyContext '%s' not a valid type\n", member);
else printf("PyContext '%s' not found\n", member);
}
@@ -697,7 +697,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
static void bpy_module_free(void *mod);
extern int main_python_enter(int argc, const char **argv);
extern void main_python_exit(void);
-static struct PyModuleDef bpy_proxy_def= {
+static struct PyModuleDef bpy_proxy_def = {
PyModuleDef_HEAD_INIT,
"bpy", /* m_name */
NULL, /* m_doc */
@@ -718,20 +718,20 @@ typedef struct {
/* call once __file__ is set */
void bpy_module_delay_init(PyObject *bpy_proxy)
{
- const int argc= 1;
+ const int argc = 1;
const char *argv[2];
/* updating the module dict below will loose the reference to __file__ */
- PyObject *filename_obj= PyModule_GetFilenameObject(bpy_proxy);
+ PyObject *filename_obj = PyModule_GetFilenameObject(bpy_proxy);
- const char *filename_rel= _PyUnicode_AsString(filename_obj); /* can be relative */
+ const char *filename_rel = _PyUnicode_AsString(filename_obj); /* can be relative */
char filename_abs[1024];
BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs));
BLI_path_cwd(filename_abs);
- argv[0]= filename_abs;
- argv[1]= NULL;
+ argv[0] = filename_abs;
+ argv[1] = NULL;
// printf("module found %s\n", argv[0]);
@@ -743,7 +743,7 @@ void bpy_module_delay_init(PyObject *bpy_proxy)
static void dealloc_obj_dealloc(PyObject *self);
-static PyTypeObject dealloc_obj_Type= {{{0}}};
+static PyTypeObject dealloc_obj_Type = {{{0}}};
/* use our own dealloc so we can free a property if we use one */
static void dealloc_obj_dealloc(PyObject *self)
@@ -757,7 +757,7 @@ static void dealloc_obj_dealloc(PyObject *self)
PyMODINIT_FUNC
PyInit_bpy(void)
{
- PyObject *bpy_proxy= PyModule_Create(&bpy_proxy_def);
+ PyObject *bpy_proxy = PyModule_Create(&bpy_proxy_def);
/* Problem:
* 1) this init function is expected to have a private member defined - 'md_def'
@@ -777,16 +777,16 @@ PyInit_bpy(void)
dealloc_obj *dob;
/* assign dummy type */
- dealloc_obj_Type.tp_name= "dealloc_obj";
- dealloc_obj_Type.tp_basicsize= sizeof(dealloc_obj);
- dealloc_obj_Type.tp_dealloc= dealloc_obj_dealloc;
- dealloc_obj_Type.tp_flags= Py_TPFLAGS_DEFAULT;
+ dealloc_obj_Type.tp_name = "dealloc_obj";
+ dealloc_obj_Type.tp_basicsize = sizeof(dealloc_obj);
+ dealloc_obj_Type.tp_dealloc = dealloc_obj_dealloc;
+ dealloc_obj_Type.tp_flags = Py_TPFLAGS_DEFAULT;
if (PyType_Ready(&dealloc_obj_Type) < 0)
return NULL;
- dob= (dealloc_obj *) dealloc_obj_Type.tp_alloc(&dealloc_obj_Type, 0);
- dob->mod= bpy_proxy; /* borrow */
+ dob = (dealloc_obj *) dealloc_obj_Type.tp_alloc(&dealloc_obj_Type, 0);
+ dob->mod = bpy_proxy; /* borrow */
PyModule_AddObject(bpy_proxy, "__file__", (PyObject *)dob); /* borrow */
return bpy_proxy;
diff --git a/source/blender/python/intern/bpy_interface_atexit.c b/source/blender/python/intern/bpy_interface_atexit.c
index a0cf3c38503..53775e7d893 100644
--- a/source/blender/python/intern/bpy_interface_atexit.c
+++ b/source/blender/python/intern/bpy_interface_atexit.c
@@ -40,15 +40,15 @@
static PyObject *bpy_atexit(PyObject *UNUSED(self), PyObject *UNUSED(args), PyObject *UNUSED(kw))
{
/* close down enough of blender at least not to crash */
- struct bContext *C= BPy_GetContext();
+ struct bContext *C = BPy_GetContext();
WM_exit_ext(C, 0);
Py_RETURN_NONE;
}
-static PyMethodDef meth_bpy_atexit= {"bpy_atexit", (PyCFunction)bpy_atexit, METH_NOARGS, NULL};
-static PyObject *func_bpy_atregister= NULL; /* borrowed referebce, atexit holds */
+static PyMethodDef meth_bpy_atexit = {"bpy_atexit", (PyCFunction)bpy_atexit, METH_NOARGS, NULL};
+static PyObject *func_bpy_atregister = NULL; /* borrowed referebce, atexit holds */
static void atexit_func_call(const char *func_name, PyObject *atexit_func_arg)
{
@@ -56,15 +56,15 @@ static void atexit_func_call(const char *func_name, PyObject *atexit_func_arg)
* this is intended, but if its problematic it could be changed
* - campbell */
- PyObject *atexit_mod= PyImport_ImportModuleLevel((char *)"atexit", NULL, NULL, NULL, 0);
- PyObject *atexit_func= PyObject_GetAttrString(atexit_mod, func_name);
- PyObject *args= PyTuple_New(1);
+ PyObject *atexit_mod = PyImport_ImportModuleLevel((char *)"atexit", NULL, NULL, NULL, 0);
+ PyObject *atexit_func = PyObject_GetAttrString(atexit_mod, func_name);
+ PyObject *args = PyTuple_New(1);
PyObject *ret;
PyTuple_SET_ITEM(args, 0, atexit_func_arg);
Py_INCREF(atexit_func_arg); /* only incref so we dont dec'ref along with 'args' */
- ret= PyObject_CallObject(atexit_func, args);
+ ret = PyObject_CallObject(atexit_func, args);
Py_DECREF(atexit_mod);
Py_DECREF(atexit_func);
@@ -83,7 +83,7 @@ void BPY_atexit_register(void)
/* atexit module owns this new function reference */
BLI_assert(func_bpy_atregister == NULL);
- func_bpy_atregister= (PyObject *)PyCFunction_New(&meth_bpy_atexit, NULL);
+ func_bpy_atregister = (PyObject *)PyCFunction_New(&meth_bpy_atexit, NULL);
atexit_func_call("register", func_bpy_atregister);
}
@@ -92,5 +92,5 @@ void BPY_atexit_unregister(void)
BLI_assert(func_bpy_atregister != NULL);
atexit_func_call("unregister", func_bpy_atregister);
- func_bpy_atregister= NULL; /* don't really need to set but just incase */
+ func_bpy_atregister = NULL; /* don't really need to set but just incase */
}
diff --git a/source/blender/python/intern/bpy_intern_string.c b/source/blender/python/intern/bpy_intern_string.c
index 4f206c4c365..7c8291d62d3 100644
--- a/source/blender/python/intern/bpy_intern_string.c
+++ b/source/blender/python/intern/bpy_intern_string.c
@@ -41,12 +41,12 @@ PyObject *bpy_intern_str___slots__;
void bpy_intern_string_init(void)
{
- bpy_intern_str_register= PyUnicode_FromString("register");
- bpy_intern_str_unregister= PyUnicode_FromString("unregister");
- bpy_intern_str_bl_rna= PyUnicode_FromString("bl_rna");
- bpy_intern_str_order= PyUnicode_FromString("order");
- bpy_intern_str_attr= PyUnicode_FromString("attr");
- bpy_intern_str___slots__= PyUnicode_FromString("__slots__");
+ bpy_intern_str_register = PyUnicode_FromString("register");
+ bpy_intern_str_unregister = PyUnicode_FromString("unregister");
+ bpy_intern_str_bl_rna = PyUnicode_FromString("bl_rna");
+ bpy_intern_str_order = PyUnicode_FromString("order");
+ bpy_intern_str_attr = PyUnicode_FromString("attr");
+ bpy_intern_str___slots__ = PyUnicode_FromString("__slots__");
}
void bpy_intern_string_exit(void)
diff --git a/source/blender/python/intern/bpy_library.c b/source/blender/python/intern/bpy_library.c
index a6426a02e18..ed3b758a6b4 100644
--- a/source/blender/python/intern/bpy_library.c
+++ b/source/blender/python/intern/bpy_library.c
@@ -76,7 +76,7 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *args);
static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *args);
static PyObject *bpy_lib_dir(BPy_Library *self);
-static PyMethodDef bpy_lib_methods[]= {
+static PyMethodDef bpy_lib_methods[] = {
{"__enter__", (PyCFunction)bpy_lib_enter, METH_NOARGS},
{"__exit__", (PyCFunction)bpy_lib_exit, METH_VARARGS},
{"__dir__", (PyCFunction)bpy_lib_dir, METH_NOARGS},
@@ -90,7 +90,7 @@ static void bpy_lib_dealloc(BPy_Library *self)
}
-static PyTypeObject bpy_lib_Type= {
+static PyTypeObject bpy_lib_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_lib", /* tp_name */
sizeof(BPy_Library), /* tp_basicsize */
@@ -184,25 +184,25 @@ PyDoc_STRVAR(bpy_lib_load_doc,
);
static PyObject *bpy_lib_load(PyObject *UNUSED(self), PyObject *args, PyObject *kwds)
{
- static const char *kwlist[]= {"filepath", "link", "relative", NULL};
+ static const char *kwlist[] = {"filepath", "link", "relative", NULL};
BPy_Library *ret;
- const char* filename= NULL;
- int is_rel= 0, is_link= 0;
+ const char* filename = NULL;
+ int is_rel = 0, is_link = 0;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|ii:load", (char **)kwlist, &filename, &is_link, &is_rel))
return NULL;
- ret= PyObject_New(BPy_Library, &bpy_lib_Type);
+ ret = PyObject_New(BPy_Library, &bpy_lib_Type);
BLI_strncpy(ret->relpath, filename, sizeof(ret->relpath));
BLI_strncpy(ret->abspath, filename, sizeof(ret->abspath));
BLI_path_abs(ret->abspath, G.main->name);
- ret->blo_handle= NULL;
+ ret->blo_handle = NULL;
ret->flag= (is_link ? FILE_LINK : 0) |
(is_rel ? FILE_RELPATH : 0);
- ret->dict= PyDict_New();
+ ret->dict = PyDict_New();
return (PyObject *)ret;
}
@@ -213,19 +213,19 @@ static PyObject *_bpy_names(BPy_Library *self, int blocktype)
LinkNode *l, *names;
int totnames;
- names= BLO_blendhandle_get_datablock_names(self->blo_handle, blocktype, &totnames);
+ names = BLO_blendhandle_get_datablock_names(self->blo_handle, blocktype, &totnames);
if (names) {
- int counter= 0;
- list= PyList_New(totnames);
- for (l= names; l; l= l->next) {
+ int counter = 0;
+ list = PyList_New(totnames);
+ for (l = names; l; l = l->next) {
PyList_SET_ITEM(list, counter, PyUnicode_FromString((char *)l->link));
counter++;
}
BLI_linklist_free(names, free); /* free linklist *and* each node's data */
}
else {
- list= PyList_New(0);
+ list = PyList_New(0);
}
return list;
@@ -235,12 +235,12 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
{
PyObject *ret;
BPy_Library *self_from;
- PyObject *from_dict= PyDict_New();
+ PyObject *from_dict = PyDict_New();
ReportList reports;
BKE_reports_init(&reports, RPT_STORE);
- self->blo_handle= BLO_blendhandle_from_file(self->abspath, &reports);
+ self->blo_handle = BLO_blendhandle_from_file(self->abspath, &reports);
if (self->blo_handle == NULL) {
if (BPy_reports_to_error(&reports, PyExc_IOError, TRUE) != -1) {
@@ -251,11 +251,11 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
return NULL;
}
else {
- int i= 0, code;
- while ((code= BKE_idcode_iter_step(&i))) {
+ int i = 0, code;
+ while ((code = BKE_idcode_iter_step(&i))) {
if (BKE_idcode_is_linkable(code)) {
- const char *name_plural= BKE_idcode_to_name_plural(code);
- PyObject *str= PyUnicode_FromString(name_plural);
+ const char *name_plural = BKE_idcode_to_name_plural(code);
+ PyObject *str = PyUnicode_FromString(name_plural);
PyDict_SetItem(self->dict, str, PyList_New(0));
PyDict_SetItem(from_dict, str, _bpy_names(self, code));
Py_DECREF(str);
@@ -264,16 +264,16 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
}
/* create a dummy */
- self_from= PyObject_New(BPy_Library, &bpy_lib_Type);
+ self_from = PyObject_New(BPy_Library, &bpy_lib_Type);
BLI_strncpy(self_from->relpath, self->relpath, sizeof(self_from->relpath));
BLI_strncpy(self_from->abspath, self->abspath, sizeof(self_from->abspath));
- self_from->blo_handle= NULL;
- self_from->flag= 0;
- self_from->dict= from_dict; /* owns the dict */
+ self_from->blo_handle = NULL;
+ self_from->flag = 0;
+ self_from->dict = from_dict; /* owns the dict */
/* return pair */
- ret= PyTuple_New(2);
+ ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, (PyObject *)self_from);
@@ -317,43 +317,43 @@ static void bpy_lib_exit_warn_type(BPy_Library *self, PyObject *item)
static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
{
- Main *bmain= CTX_data_main(BPy_GetContext());
- Main *mainl= NULL;
- int err= 0;
+ Main *bmain = CTX_data_main(BPy_GetContext());
+ Main *mainl = NULL;
+ int err = 0;
flag_all_listbases_ids(LIB_PRE_EXISTING, 1);
/* here appending/linking starts */
- mainl= BLO_library_append_begin(bmain, &(self->blo_handle), self->relpath);
+ mainl = BLO_library_append_begin(bmain, &(self->blo_handle), self->relpath);
{
- int i= 0, code;
- while ((code= BKE_idcode_iter_step(&i))) {
+ int i = 0, code;
+ while ((code = BKE_idcode_iter_step(&i))) {
if (BKE_idcode_is_linkable(code)) {
- const char *name_plural= BKE_idcode_to_name_plural(code);
- PyObject *ls= PyDict_GetItemString(self->dict, name_plural);
+ const char *name_plural = BKE_idcode_to_name_plural(code);
+ PyObject *ls = PyDict_GetItemString(self->dict, name_plural);
// printf("lib: %s\n", name_plural);
if (ls && PyList_Check(ls)) {
/* loop */
- Py_ssize_t size= PyList_GET_SIZE(ls);
+ Py_ssize_t size = PyList_GET_SIZE(ls);
Py_ssize_t i;
PyObject *item;
const char *item_str;
- for (i= 0; i < size; i++) {
- item= PyList_GET_ITEM(ls, i);
- item_str= _PyUnicode_AsString(item);
+ for (i = 0; i < size; i++) {
+ item = PyList_GET_ITEM(ls, i);
+ item_str = _PyUnicode_AsString(item);
// printf(" %s\n", item_str);
if (item_str) {
- ID *id= BLO_library_append_named_part(mainl, &(self->blo_handle), item_str, code);
+ ID *id = BLO_library_append_named_part(mainl, &(self->blo_handle), item_str, code);
if (id) {
#ifdef USE_RNA_DATABLOCKS
PointerRNA id_ptr;
RNA_id_pointer_create(id, &id_ptr);
Py_DECREF(item);
- item= pyrna_struct_CreatePyObject(&id_ptr);
+ item = pyrna_struct_CreatePyObject(&id_ptr);
#endif
}
else {
@@ -361,7 +361,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
/* just warn for now */
/* err = -1; */
#ifdef USE_RNA_DATABLOCKS
- item= Py_None;
+ item = Py_None;
Py_INCREF(item);
#endif
}
@@ -374,7 +374,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
PyErr_Clear();
#ifdef USE_RNA_DATABLOCKS
- item= Py_None;
+ item = Py_None;
Py_INCREF(item);
#endif
}
@@ -391,22 +391,22 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
if (err == -1) {
/* exception raised above, XXX, this leaks some memory */
BLO_blendhandle_close(self->blo_handle);
- self->blo_handle= NULL;
+ self->blo_handle = NULL;
flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
return NULL;
}
else {
- Library *lib= mainl->curlib; /* newly added lib, assign before append end */
+ Library *lib = mainl->curlib; /* newly added lib, assign before append end */
BLO_library_append_end(NULL, mainl, &(self->blo_handle), 0, self->flag);
BLO_blendhandle_close(self->blo_handle);
- self->blo_handle= NULL;
+ self->blo_handle = NULL;
{ /* copied from wm_operator.c */
/* mark all library linked objects to be updated */
recalc_all_library_objects(G.main);
/* append, rather than linking */
- if ((self->flag & FILE_LINK)==0) {
+ if ((self->flag & FILE_LINK) == 0) {
BKE_library_make_local(bmain, lib, 1);
}
}
@@ -425,14 +425,14 @@ static PyObject *bpy_lib_dir(BPy_Library *self)
int bpy_lib_init(PyObject *mod_par)
{
- static PyMethodDef load_meth= {"load", (PyCFunction)bpy_lib_load,
+ static PyMethodDef load_meth = {"load", (PyCFunction)bpy_lib_load,
METH_STATIC|METH_VARARGS|METH_KEYWORDS,
bpy_lib_load_doc};
PyModule_AddObject(mod_par, "_library_load", PyCFunction_New(&load_meth, NULL));
/* some compilers dont like accessing this directly, delay assignment */
- bpy_lib_Type.tp_getattro= PyObject_GenericGetAttr;
+ bpy_lib_Type.tp_getattro = PyObject_GenericGetAttr;
if (PyType_Ready(&bpy_lib_Type) < 0)
return -1;
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 70346a65bf9..6a6e6595ed4 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -66,18 +66,18 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
char *opname;
- PyObject *context_dict= NULL; /* optional args */
+ PyObject *context_dict = NULL; /* optional args */
PyObject *context_dict_back;
- char *context_str= NULL;
+ char *context_str = NULL;
PyObject *ret;
- int context= WM_OP_EXEC_DEFAULT;
+ int context = WM_OP_EXEC_DEFAULT;
/* XXX Todo, work out a better solution for passing on context,
* could make a tuple from self and pack the name and Context into it... */
- bContext *C= (bContext *)BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
- if (C==NULL) {
+ if (C == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators");
return NULL;
}
@@ -85,7 +85,7 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str))
return NULL;
- ot= WM_operatortype_find(opname, TRUE);
+ ot = WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
PyErr_Format(PyExc_AttributeError,
@@ -95,8 +95,8 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
}
if (context_str) {
- if (RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
- char *enum_str= BPy_enum_as_string(operator_context_items);
+ if (RNA_enum_value_from_id(operator_context_items, context_str, &context) == 0) {
+ char *enum_str = BPy_enum_as_string(operator_context_items);
PyErr_Format(PyExc_TypeError,
"Calling operator \"bpy.ops.%s.poll\" error, "
"expected a string enum in (%.200s)",
@@ -106,8 +106,8 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
}
}
- if (context_dict==NULL || context_dict==Py_None) {
- context_dict= NULL;
+ if (context_dict == NULL || context_dict == Py_None) {
+ context_dict = NULL;
}
else if (!PyDict_Check(context_dict)) {
PyErr_Format(PyExc_TypeError,
@@ -117,12 +117,12 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
return NULL;
}
- context_dict_back= CTX_py_dict_get(C);
+ context_dict_back = CTX_py_dict_get(C);
CTX_py_dict_set(C, (void *)context_dict);
Py_XINCREF(context_dict); /* so we done loose it */
/* main purpose of thsi function */
- ret= WM_operator_poll_context((bContext*)C, ot, context) ? Py_True : Py_False;
+ ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False;
/* restore with original context dict, probably NULL but need this for nested operator calls */
Py_XDECREF(context_dict);
@@ -135,24 +135,24 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
- int error_val= 0;
+ int error_val = 0;
PointerRNA ptr;
- int operator_ret= OPERATOR_CANCELLED;
+ int operator_ret = OPERATOR_CANCELLED;
char *opname;
- char *context_str= NULL;
- PyObject *kw= NULL; /* optional args */
- PyObject *context_dict= NULL; /* optional args */
+ char *context_str = NULL;
+ PyObject *kw = NULL; /* optional args */
+ PyObject *context_dict = NULL; /* optional args */
PyObject *context_dict_back;
/* note that context is an int, python does the conversion in this case */
- int context= WM_OP_EXEC_DEFAULT;
+ int context = WM_OP_EXEC_DEFAULT;
/* XXX Todo, work out a better solution for passing on context,
* could make a tuple from self and pack the name and Context into it... */
- bContext *C= (bContext *)BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
- if (C==NULL) {
+ if (C == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators");
return NULL;
}
@@ -160,7 +160,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
if (!PyArg_ParseTuple(args, "sO|O!s:_bpy.ops.call", &opname, &context_dict, &PyDict_Type, &kw, &context_str))
return NULL;
- ot= WM_operatortype_find(opname, TRUE);
+ ot = WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
PyErr_Format(PyExc_AttributeError,
@@ -178,8 +178,8 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
}
if (context_str) {
- if (RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
- char *enum_str= BPy_enum_as_string(operator_context_items);
+ if (RNA_enum_value_from_id(operator_context_items, context_str, &context) == 0) {
+ char *enum_str = BPy_enum_as_string(operator_context_items);
PyErr_Format(PyExc_TypeError,
"Calling operator \"bpy.ops.%s\" error, "
"expected a string enum in (%.200s)",
@@ -189,8 +189,8 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
}
}
- if (context_dict==NULL || context_dict==Py_None) {
- context_dict= NULL;
+ if (context_dict == NULL || context_dict == Py_None) {
+ context_dict = NULL;
}
else if (!PyDict_Check(context_dict)) {
PyErr_Format(PyExc_TypeError,
@@ -200,31 +200,31 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
return NULL;
}
- context_dict_back= CTX_py_dict_get(C);
+ context_dict_back = CTX_py_dict_get(C);
CTX_py_dict_set(C, (void *)context_dict);
Py_XINCREF(context_dict); /* so we done loose it */
- if (WM_operator_poll_context((bContext*)C, ot, context) == FALSE) {
- const char *msg= CTX_wm_operator_poll_msg_get(C);
+ if (WM_operator_poll_context((bContext *)C, ot, context) == FALSE) {
+ const char *msg = CTX_wm_operator_poll_msg_get(C);
PyErr_Format(PyExc_RuntimeError,
"Operator bpy.ops.%.200s.poll() %.200s",
opname, msg ? msg : "failed, context is incorrect");
CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */
- error_val= -1;
+ error_val = -1;
}
else {
WM_operator_properties_create_ptr(&ptr, ot);
WM_operator_properties_sanitize(&ptr, 0);
if (kw && PyDict_Size(kw))
- error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
+ error_val = pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
- if (error_val==0) {
+ if (error_val == 0) {
ReportList *reports;
- reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
+ reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD); /* own so these dont move into global reports */
#ifdef BPY_RELEASE_GIL
@@ -233,10 +233,10 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
/* note: I havve not seen any examples of code that does this
* so it may not be officially supported but seems to work ok. */
{
- PyThreadState *ts= PyEval_SaveThread();
+ PyThreadState *ts = PyEval_SaveThread();
#endif
- operator_ret= WM_operator_call_py(C, ot, context, &ptr, reports);
+ operator_ret = WM_operator_call_py(C, ot, context, &ptr, reports);
#ifdef BPY_RELEASE_GIL
/* regain GIL */
@@ -244,11 +244,11 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
}
#endif
- error_val= BPy_reports_to_error(reports, PyExc_RuntimeError, FALSE);
+ error_val = BPy_reports_to_error(reports, PyExc_RuntimeError, FALSE);
/* operator output is nice to have in the terminal/console too */
if (reports->list.first) {
- char *report_str= BKE_reports_string(reports, 0); /* all reports */
+ char *report_str = BKE_reports_string(reports, 0); /* all reports */
if (report_str) {
PySys_WriteStdout("%s\n", report_str);
@@ -285,7 +285,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
Py_XDECREF(context_dict);
CTX_py_dict_set(C, (void *)context_dict_back);
- if (error_val==-1) {
+ if (error_val == -1) {
return NULL;
}
@@ -308,16 +308,16 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
PointerRNA ptr;
char *opname;
- PyObject *kw= NULL; /* optional args */
- int all_args= 1;
- int error_val= 0;
+ PyObject *kw = NULL; /* optional args */
+ int all_args = 1;
+ int error_val = 0;
- char *buf= NULL;
+ char *buf = NULL;
PyObject *pybuf;
- bContext *C= (bContext *)BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
- if (C==NULL) {
+ if (C == NULL) {
PyErr_SetString(PyExc_RuntimeError, "Context is None, cant get the string representation of this object.");
return NULL;
}
@@ -325,7 +325,7 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
if (!PyArg_ParseTuple(args, "s|O!i:_bpy.ops.as_string", &opname, &PyDict_Type, &kw, &all_args))
return NULL;
- ot= WM_operatortype_find(opname, TRUE);
+ ot = WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
PyErr_Format(PyExc_AttributeError,
@@ -339,23 +339,23 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
if (kw && PyDict_Size(kw))
- error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
+ error_val = pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
- if (error_val==0)
- buf= WM_operator_pystring(C, ot, &ptr, all_args);
+ if (error_val == 0)
+ buf = WM_operator_pystring(C, ot, &ptr, all_args);
WM_operator_properties_free(&ptr);
- if (error_val==-1) {
+ if (error_val == -1) {
return NULL;
}
if (buf) {
- pybuf= PyUnicode_FromString(buf);
+ pybuf = PyUnicode_FromString(buf);
MEM_freeN(buf);
}
else {
- pybuf= PyUnicode_FromString("");
+ pybuf = PyUnicode_FromString("");
}
return pybuf;
@@ -363,13 +363,13 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
static PyObject *pyop_dir(PyObject *UNUSED(self))
{
- GHashIterator *iter= WM_operatortype_iter();
- PyObject *list= PyList_New(0), *name;
+ GHashIterator *iter = WM_operatortype_iter();
+ PyObject *list = PyList_New(0), *name;
for ( ; !BLI_ghashIterator_isDone(iter); BLI_ghashIterator_step(iter)) {
- wmOperatorType *ot= BLI_ghashIterator_getValue(iter);
+ wmOperatorType *ot = BLI_ghashIterator_getValue(iter);
- name= PyUnicode_FromString(ot->idname);
+ name = PyUnicode_FromString(ot->idname);
PyList_Append(list, name);
Py_DECREF(name);
}
@@ -382,15 +382,15 @@ static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
{
wmOperatorType *ot;
PointerRNA ptr;
- const char *opname= _PyUnicode_AsString(value);
- BPy_StructRNA *pyrna= NULL;
+ const char *opname = _PyUnicode_AsString(value);
+ BPy_StructRNA *pyrna = NULL;
- if (opname==NULL) {
+ if (opname == NULL) {
PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_rna() expects a string argument");
return NULL;
}
- ot= WM_operatortype_find(opname, TRUE);
- if (ot==NULL) {
+ ot = WM_operatortype_find(opname, TRUE);
+ if (ot == NULL) {
PyErr_Format(PyExc_KeyError, "_bpy.ops.get_rna(\"%s\") not found", opname);
return NULL;
}
@@ -403,9 +403,9 @@ static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
WM_operator_properties_sanitize(&ptr, 0);
- pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
+ pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
#ifdef PYRNA_FREE_SUPPORT
- pyrna->freeptr= TRUE;
+ pyrna->freeptr = TRUE;
#endif
return (PyObject *)pyrna;
}
@@ -415,40 +415,40 @@ static PyObject *pyop_getinstance(PyObject *UNUSED(self), PyObject *value)
wmOperatorType *ot;
wmOperator *op;
PointerRNA ptr;
- const char *opname= _PyUnicode_AsString(value);
- BPy_StructRNA *pyrna= NULL;
+ const char *opname = _PyUnicode_AsString(value);
+ BPy_StructRNA *pyrna = NULL;
- if (opname==NULL) {
+ if (opname == NULL) {
PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_instance() expects a string argument");
return NULL;
}
- ot= WM_operatortype_find(opname, TRUE);
- if (ot==NULL) {
+ ot = WM_operatortype_find(opname, TRUE);
+ if (ot == NULL) {
PyErr_Format(PyExc_KeyError, "_bpy.ops.get_instance(\"%s\") not found", opname);
return NULL;
}
#ifdef PYRNA_FREE_SUPPORT
- op= MEM_callocN(sizeof(wmOperator), __func__);
+ op = MEM_callocN(sizeof(wmOperator), __func__);
#else
- op= PyMem_MALLOC(sizeof(wmOperator));
+ op = PyMem_MALLOC(sizeof(wmOperator));
memset(op, 0, sizeof(wmOperator));
#endif
BLI_strncpy(op->idname, op->idname, sizeof(op->idname)); /* incase its needed */
- op->type= ot;
+ op->type = ot;
RNA_pointer_create(NULL, &RNA_Operator, op, &ptr);
- pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
+ pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
#ifdef PYRNA_FREE_SUPPORT
- pyrna->freeptr= TRUE;
+ pyrna->freeptr = TRUE;
#endif
- op->ptr= &pyrna->ptr;
+ op->ptr = &pyrna->ptr;
return (PyObject *)pyrna;
}
-static struct PyMethodDef bpy_ops_methods[]= {
+static struct PyMethodDef bpy_ops_methods[] = {
{"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL},
{"call", (PyCFunction) pyop_call, METH_VARARGS, NULL},
{"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL},
@@ -459,7 +459,7 @@ static struct PyMethodDef bpy_ops_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyModuleDef bpy_ops_module= {
+static struct PyModuleDef bpy_ops_module = {
PyModuleDef_HEAD_INIT,
"_bpy.ops",
NULL,
@@ -472,7 +472,7 @@ PyObject *BPY_operator_module(void)
{
PyObject *submodule;
- submodule= PyModule_Create(&bpy_ops_module);
+ submodule = PyModule_Create(&bpy_ops_module);
return submodule;
}
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index aa458925202..7860762059c 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -45,7 +45,7 @@
static void operator_properties_init(wmOperatorType *ot)
{
- PyObject *py_class= ot->ext.data;
+ PyObject *py_class = ot->ext.data;
RNA_struct_blender_type_set(ot->ext.srna, ot);
/* only call this so pyrna_deferred_register_class gives a useful error
@@ -63,9 +63,9 @@ void operator_wrapper(wmOperatorType *ot, void *userdata)
{
/* take care not to overwrite anything set in
* WM_operatortype_append_ptr before opfunc() is called */
- StructRNA *srna= ot->srna;
- *ot= *((wmOperatorType *)userdata);
- ot->srna= srna; /* restore */
+ StructRNA *srna = ot->srna;
+ *ot = *((wmOperatorType *)userdata);
+ ot->srna = srna; /* restore */
operator_properties_init(ot);
@@ -74,25 +74,25 @@ void operator_wrapper(wmOperatorType *ot, void *userdata)
PropertyRNA *prop;
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- prop= RNA_struct_find_property(&ptr, "type");
+ prop = RNA_struct_find_property(&ptr, "type");
if (prop) {
- ot->prop= prop;
+ ot->prop = prop;
}
}
}
void macro_wrapper(wmOperatorType *ot, void *userdata)
{
- wmOperatorType *data= (wmOperatorType *)userdata;
+ wmOperatorType *data = (wmOperatorType *)userdata;
/* only copy a couple of things, the rest is set by the macro registration */
- ot->name= data->name;
- ot->idname= data->idname;
- ot->description= data->description;
+ ot->name = data->name;
+ ot->idname = data->idname;
+ ot->description = data->description;
ot->flag |= data->flag; /* append flags to the one set by registration */
- ot->pyop_poll= data->pyop_poll;
- ot->ui= data->ui;
- ot->ext= data->ext;
+ ot->pyop_poll = data->pyop_poll;
+ ot->ui = data->ui;
+ ot->ext = data->ext;
operator_properties_init(ot);
}
@@ -117,17 +117,17 @@ PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args)
}
/* identifiers */
- srna= srna_from_self(macro, "Macro Define:");
- macroname= RNA_struct_identifier(srna);
+ srna = srna_from_self(macro, "Macro Define:");
+ macroname = RNA_struct_identifier(srna);
- ot= WM_operatortype_find(macroname, TRUE);
+ ot = WM_operatortype_find(macroname, TRUE);
if (!ot) {
PyErr_Format(PyExc_ValueError, "Macro Define: '%s' is not a valid macro or hasn't been registered yet", macroname);
return NULL;
}
- otmacro= WM_operatortype_macro_define(ot, opname);
+ otmacro = WM_operatortype_macro_define(ot, opname);
RNA_pointer_create(NULL, &RNA_OperatorMacro, otmacro, &ptr_otmacro);
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index c0d796669d6..81eb81e90fa 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -56,13 +56,13 @@
extern BPy_StructRNA *bpy_context_module;
-static EnumPropertyItem property_flag_items[]= {
+static EnumPropertyItem property_flag_items[] = {
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
{PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""},
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_flag_enum_items[]= {
+static EnumPropertyItem property_flag_enum_items[] = {
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
{PROP_SKIP_SAVE, "SKIP_SAVE", 0, "Skip Save", ""},
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
@@ -70,7 +70,7 @@ static EnumPropertyItem property_flag_enum_items[]= {
{0, NULL, 0, NULL, NULL}};
/* subtypes */
-static EnumPropertyItem property_subtype_string_items[]= {
+static EnumPropertyItem property_subtype_string_items[] = {
{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
{PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""},
{PROP_FILENAME, "FILENAME", 0, "Filename", ""},
@@ -80,7 +80,7 @@ static EnumPropertyItem property_subtype_string_items[]= {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_subtype_number_items[]= {
+static EnumPropertyItem property_subtype_number_items[] = {
{PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
{PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
{PROP_FACTOR, "FACTOR", 0, "Factor", ""},
@@ -91,7 +91,7 @@ static EnumPropertyItem property_subtype_number_items[]= {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_subtype_array_items[]= {
+static EnumPropertyItem property_subtype_array_items[] = {
{PROP_COLOR, "COLOR", 0, "Color", ""},
{PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
{PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
@@ -109,29 +109,29 @@ static EnumPropertyItem property_subtype_array_items[]= {
{0, NULL, 0, NULL, NULL}};
/* PyObject's */
-static PyObject *pymeth_BoolProperty= NULL;
-static PyObject *pymeth_BoolVectorProperty= NULL;
-static PyObject *pymeth_IntProperty= NULL;
-static PyObject *pymeth_IntVectorProperty= NULL;
-static PyObject *pymeth_FloatProperty= NULL;
-static PyObject *pymeth_FloatVectorProperty= NULL;
-static PyObject *pymeth_StringProperty= NULL;
-static PyObject *pymeth_EnumProperty= NULL;
-static PyObject *pymeth_PointerProperty= NULL;
-static PyObject *pymeth_CollectionProperty= NULL;
-static PyObject *pymeth_RemoveProperty= NULL;
+static PyObject *pymeth_BoolProperty = NULL;
+static PyObject *pymeth_BoolVectorProperty = NULL;
+static PyObject *pymeth_IntProperty = NULL;
+static PyObject *pymeth_IntVectorProperty = NULL;
+static PyObject *pymeth_FloatProperty = NULL;
+static PyObject *pymeth_FloatVectorProperty = NULL;
+static PyObject *pymeth_StringProperty = NULL;
+static PyObject *pymeth_EnumProperty = NULL;
+static PyObject *pymeth_PointerProperty = NULL;
+static PyObject *pymeth_CollectionProperty = NULL;
+static PyObject *pymeth_RemoveProperty = NULL;
static PyObject *pyrna_struct_as_instance(PointerRNA *ptr)
{
- PyObject *self= NULL;
+ PyObject *self = NULL;
/* first get self */
/* operators can store their own instance for later use */
if (ptr->data) {
- void **instance= RNA_struct_instance(ptr);
+ void **instance = RNA_struct_instance(ptr);
if (instance) {
if (*instance) {
- self= *instance;
+ self = *instance;
Py_INCREF(self);
}
}
@@ -139,7 +139,7 @@ static PyObject *pyrna_struct_as_instance(PointerRNA *ptr)
/* in most cases this will run */
if (self == NULL) {
- self= pyrna_struct_CreatePyObject(ptr);
+ self = pyrna_struct_CreatePyObject(ptr);
}
return self;
@@ -149,7 +149,7 @@ static PyObject *pyrna_struct_as_instance(PointerRNA *ptr)
static void printf_func_error(PyObject *py_func)
{
/* since we return to C code we can't leave the error */
- PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(py_func);
+ PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(py_func);
PyErr_Print();
PyErr_Clear();
@@ -166,12 +166,12 @@ static void printf_func_error(PyObject *py_func)
* the default args for that operator instance */
static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
{
- PyObject *ret= PyTuple_New(2);
+ PyObject *ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, func);
Py_INCREF(func);
- if (kw==NULL)
- kw= PyDict_New();
+ if (kw == NULL)
+ kw = PyDict_New();
else
Py_INCREF(kw);
@@ -184,12 +184,12 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop)
{
PyGILState_STATE gilstate;
- PyObject **py_data= (PyObject **)RNA_property_py_data_get(prop);
+ PyObject **py_data = (PyObject **)RNA_property_py_data_get(prop);
PyObject *py_func;
PyObject *args;
PyObject *self;
PyObject *ret;
- const int is_write_ok= pyrna_write_check();
+ const int is_write_ok = pyrna_write_check();
BLI_assert(py_data != NULL);
@@ -199,16 +199,16 @@ static void bpy_prop_update_cb(struct bContext *C, struct PointerRNA *ptr, struc
bpy_context_set(C, &gilstate);
- py_func= py_data[BPY_DATA_CB_SLOT_UPDATE];
+ py_func = py_data[BPY_DATA_CB_SLOT_UPDATE];
- args= PyTuple_New(2);
- self= pyrna_struct_as_instance(ptr);
+ args = PyTuple_New(2);
+ self = pyrna_struct_as_instance(ptr);
PyTuple_SET_ITEM(args, 0, self);
PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module);
Py_INCREF(bpy_context_module);
- ret= PyObject_CallObject(py_func, args);
+ ret = PyObject_CallObject(py_func, args);
Py_DECREF(args);
@@ -241,7 +241,7 @@ static int bpy_prop_callback_check(PyObject *py_func, int argcount)
return -1;
}
else {
- PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(py_func);
+ PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(py_func);
if (f_code->co_argcount != argcount) {
PyErr_Format(PyExc_TypeError,
"update keyword: expected a function taking %d arguments, not %d",
@@ -259,9 +259,9 @@ static int bpy_prop_callback_assign(struct PropertyRNA *prop, PyObject *update_c
{
/* assume this is already checked for type and arg length */
if (update_cb) {
- PyObject **py_data= MEM_callocN(sizeof(PyObject *) * BPY_DATA_CB_SLOT_SIZE, __func__);
+ PyObject **py_data = MEM_callocN(sizeof(PyObject *) * BPY_DATA_CB_SLOT_SIZE, __func__);
RNA_def_property_update_runtime(prop, (void *)bpy_prop_update_cb);
- py_data[BPY_DATA_CB_SLOT_UPDATE]= update_cb;
+ py_data[BPY_DATA_CB_SLOT_UPDATE] = update_cb;
RNA_def_py_data(prop, py_data);
RNA_def_property_flag(prop, PROP_CONTEXT_PROPERTY_UPDATE);
@@ -274,7 +274,7 @@ static int bpy_prop_callback_assign(struct PropertyRNA *prop, PyObject *update_c
static int py_long_as_int(PyObject *py_long, int *r_int)
{
if (PyLong_CheckExact(py_long)) {
- *r_int= (int)PyLong_AS_LONG(py_long);
+ *r_int = (int)PyLong_AS_LONG(py_long);
return 0;
}
else {
@@ -287,9 +287,9 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
#define BPY_PROPDEF_HEAD(_func) \
if (PyTuple_GET_SIZE(args) == 1) { \
PyObject *ret; \
- self= PyTuple_GET_ITEM(args, 0); \
- args= PyTuple_New(0); \
- ret= BPy_##_func(self, args, kw); \
+ self = PyTuple_GET_ITEM(args, 0); \
+ args = PyTuple_New(0); \
+ ret = BPy_##_func(self, args, kw); \
Py_DECREF(args); \
return ret; \
} \
@@ -297,8 +297,8 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
return NULL; \
} \
- srna= srna_from_self(self, #_func"(...):"); \
- if (srna==NULL) { \
+ srna = srna_from_self(self, #_func"(...):"); \
+ if (srna == NULL) { \
if (PyErr_Occurred()) \
return NULL; \
return bpy_prop_deferred_return(pymeth_##_func, kw); \
@@ -310,7 +310,7 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
if (id_len >= MAX_IDPROP_NAME) { \
PyErr_Format(PyExc_TypeError, \
#_func"(): '%.200s' too long, max length is %d", \
- id, MAX_IDPROP_NAME-1); \
+ id, MAX_IDPROP_NAME - 1); \
return NULL; \
} \
if (RNA_def_property_free_identifier(srna, id) == -1) { \
@@ -322,7 +322,7 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
if (pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, \
pyopts, \
&opts, \
- #_func"(options={...}):")) \
+ #_func"(options={ ...}):")) \
{ \
return NULL; \
} \
@@ -331,7 +331,7 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
BPY_PROPDEF_CHECK(_func, _property_flag_items) \
if (pysubtype && RNA_enum_value_from_id(_subtype, \
pysubtype, \
- &subtype)==0) \
+ &subtype) == 0) \
{ \
PyErr_Format(PyExc_TypeError, \
#_func"(subtype='%s'): invalid subtype", \
@@ -393,17 +393,17 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(BoolProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"options", "subtype", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- int def=0;
+ int def = 0;
PropertyRNA *prop;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssiO!sO:BoolProperty",
@@ -421,13 +421,13 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
+ prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
RNA_def_property_boolean_default(prop, def);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -461,19 +461,19 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(BoolVectorProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"options", "subtype", "size", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- int def[PYRNA_STACK_ARRAY]={0};
- int size=3;
+ int def[PYRNA_STACK_ARRAY] = {0};
+ int size = 3;
PropertyRNA *prop;
- PyObject *pydef= NULL;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pydef = NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssOO!siO:BoolVectorProperty",
@@ -501,15 +501,15 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject
return NULL;
}
- // prop= RNA_def_boolean_array(srna, id, size, pydef ? def:NULL, name, description);
- prop= RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
+ // prop = RNA_def_boolean_array(srna, id, size, pydef ? def:NULL, name ? name : id, description);
+ prop = RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
RNA_def_property_array(prop, size);
if (pydef) RNA_def_property_boolean_array_default(prop, def);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -539,17 +539,17 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(IntProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"min", "max", "soft_min", "soft_max", "step", "options", "subtype", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def=0;
+ int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1, def = 0;
PropertyRNA *prop;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssiiiiiiO!sO:IntProperty",
@@ -568,15 +568,15 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_INT, subtype);
+ prop = RNA_def_property(srna, id, PROP_INT, subtype);
RNA_def_property_int_default(prop, def);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
RNA_def_property_range(prop, min, max);
- RNA_def_property_ui_text(prop, name, description);
RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -609,20 +609,21 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(IntVectorProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"min", "max", "soft_min", "soft_max",
"step", "options", "subtype", "size", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def[PYRNA_STACK_ARRAY]={0};
- int size=3;
+ int min = INT_MIN, max = INT_MAX, soft_min = INT_MIN, soft_max = INT_MAX, step = 1;
+ int def[PYRNA_STACK_ARRAY] = {0};
+ int size = 3;
PropertyRNA *prop;
- PyObject *pydef= NULL;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pydef = NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssOiiiiiO!siO:IntVectorProperty",
@@ -652,16 +653,16 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_INT, subtype);
+ prop = RNA_def_property(srna, id, PROP_INT, subtype);
RNA_def_property_array(prop, size);
if (pydef) RNA_def_property_int_array_default(prop, def);
RNA_def_property_range(prop, min, max);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, 3);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -692,21 +693,21 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(FloatProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"min", "max", "soft_min", "soft_max",
"step", "precision", "options", "subtype", "unit", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def=0.0f;
- int precision= 2;
+ float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3, def = 0.0f;
+ int precision = 2;
PropertyRNA *prop;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- char *pyunit= NULL;
- int unit= PROP_UNIT_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ char *pyunit = NULL;
+ int unit = PROP_UNIT_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssffffffiO!ssO:FloatProperty",
@@ -722,7 +723,7 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_SUBTYPE_CHECK(FloatProperty, property_flag_items, property_subtype_number_items)
- if (pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit)==0) {
+ if (pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit) == 0) {
PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit", pyunit);
return NULL;
}
@@ -731,15 +732,15 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_FLOAT, subtype | unit);
+ prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit);
RNA_def_property_float_default(prop, def);
RNA_def_property_range(prop, min, max);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -773,22 +774,22 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
BPY_PROPDEF_HEAD(FloatVectorProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"min", "max", "soft_min", "soft_max",
"step", "precision", "options", "subtype", "unit", "size", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
- float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def[PYRNA_STACK_ARRAY]={0.0f};
- int precision= 2, size=3;
+ float min = -FLT_MAX, max = FLT_MAX, soft_min = -FLT_MAX, soft_max = FLT_MAX, step = 3, def[PYRNA_STACK_ARRAY] = {0.0f};
+ int precision = 2, size = 3;
PropertyRNA *prop;
- PyObject *pydef= NULL;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- char *pyunit= NULL;
- int unit= PROP_UNIT_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pydef = NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ char *pyunit = NULL;
+ int unit = PROP_UNIT_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|ssOfffffiO!ssiO:FloatVectorProperty",
@@ -804,7 +805,7 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
BPY_PROPDEF_SUBTYPE_CHECK(FloatVectorProperty, property_flag_items, property_subtype_array_items)
- if (pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit)==0) {
+ if (pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit) == 0) {
PyErr_Format(PyExc_TypeError, "FloatVectorProperty(unit='%s'): invalid unit", pyunit);
return NULL;
}
@@ -823,16 +824,16 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_FLOAT, subtype | unit);
+ prop = RNA_def_property(srna, id, PROP_FLOAT, subtype | unit);
RNA_def_property_array(prop, size);
if (pydef) RNA_def_property_float_array_default(prop, def);
RNA_def_property_range(prop, min, max);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
RNA_def_property_ui_range(prop, MAX2(soft_min, min), MIN2(soft_max, max), step, precision);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -861,17 +862,17 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
BPY_PROPDEF_HEAD(StringProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "name", "description", "default",
"maxlen", "options", "subtype", "update", NULL};
- const char *id=NULL, *name="", *description="", *def="";
+ const char *id = NULL, *name = NULL, *description = "", *def = "";
int id_len;
- int maxlen=0;
+ int maxlen = 0;
PropertyRNA *prop;
- PyObject *pyopts= NULL;
- int opts=0;
- char *pysubtype= NULL;
- int subtype= PROP_NONE;
- PyObject *update_cb= NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ char *pysubtype = NULL;
+ int subtype = PROP_NONE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#|sssiO!sO:StringProperty",
@@ -889,14 +890,14 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
return NULL;
}
- prop= RNA_def_property(srna, id, PROP_STRING, subtype);
+ prop = RNA_def_property(srna, id, PROP_STRING, subtype);
if (maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen + 1); /* +1 since it includes null terminator */
if (def) RNA_def_property_string_default(prop, def);
- RNA_def_property_ui_text(prop, name, description);
+ RNA_def_property_ui_text(prop, name ? name : id, description);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -909,11 +910,11 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
/* copies orig to buf, then sets orig to buf, returns copy length */
static size_t strswapbufcpy(char *buf, const char **orig)
{
- const char *src= *orig;
- char *dst= buf;
- size_t i= 0;
- *orig= buf;
- while ((*dst= *src)) { dst++; src++; i++; }
+ const char *src = *orig;
+ char *dst = buf;
+ size_t i = 0;
+ *orig = buf;
+ while ((*dst = *src)) { dst++; src++; i++; }
return i + 1; /* include '\0' */
}
#endif
@@ -922,11 +923,11 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
{
EnumPropertyItem *items;
PyObject *item;
- const Py_ssize_t seq_len= PySequence_Fast_GET_SIZE(seq_fast);
- Py_ssize_t totbuf= 0;
+ const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast);
+ Py_ssize_t totbuf = 0;
int i;
- short def_used= 0;
- const char *def_cmp= NULL;
+ short def_used = 0;
+ const char *def_cmp = NULL;
if (is_enum_flag) {
if (seq_len > RNA_ENUM_BITFLAG_SIZE) {
@@ -946,8 +947,8 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
}
else {
if (def) {
- def_cmp= _PyUnicode_AsString(def);
- if (def_cmp==NULL) {
+ def_cmp = _PyUnicode_AsString(def);
+ if (def_cmp == NULL) {
PyErr_Format(PyExc_TypeError,
"EnumProperty(...): default option must be a 'str' "
"type when ENUM_FLAG is disabled, not a '%.200s'",
@@ -958,30 +959,30 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
}
/* blank value */
- *defvalue= 0;
+ *defvalue = 0;
- items= MEM_callocN(sizeof(EnumPropertyItem) * (seq_len + 1), "enum_items_from_py1");
+ items = MEM_callocN(sizeof(EnumPropertyItem) * (seq_len + 1), "enum_items_from_py1");
- for (i=0; i<seq_len; i++) {
- EnumPropertyItem tmp= {0, "", 0, "", ""};
+ for (i = 0; i < seq_len; i++) {
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
Py_ssize_t item_size;
Py_ssize_t id_str_size;
Py_ssize_t name_str_size;
Py_ssize_t desc_str_size;
- item= PySequence_Fast_GET_ITEM(seq_fast, i);
+ item = PySequence_Fast_GET_ITEM(seq_fast, i);
- if ( (PyTuple_CheckExact(item)) &&
- (item_size= PyTuple_GET_SIZE(item)) &&
- (item_size == 3 || item_size == 4) &&
- (tmp.identifier= _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) &&
- (tmp.name= _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) &&
- (tmp.description= _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) &&
- (item_size < 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value) != -1) /* TODO, number isnt ensured to be unique from the script author */
- ) {
+ if ( (PyTuple_CheckExact(item)) &&
+ (item_size = PyTuple_GET_SIZE(item)) &&
+ (item_size == 3 || item_size == 4) &&
+ (tmp.identifier = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 0), &id_str_size)) &&
+ (tmp.name = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 1), &name_str_size)) &&
+ (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) &&
+ (item_size < 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value) != -1)) /* TODO, number isnt ensured to be unique from the script author */
+ {
if (is_enum_flag) {
if (item_size < 4) {
- tmp.value= 1<<i;
+ tmp.value = 1 << i;
}
if (def && PySet_Contains(def, PyTuple_GET_ITEM(item, 0))) {
@@ -991,16 +992,16 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
}
else {
if (item_size < 4) {
- tmp.value= i;
+ tmp.value = i;
}
- if (def && def_used == 0 && strcmp(def_cmp, tmp.identifier)==0) {
- *defvalue= tmp.value;
+ if (def && def_used == 0 && strcmp(def_cmp, tmp.identifier) == 0) {
+ *defvalue = tmp.value;
def_used++; /* only ever 1 */
}
}
- items[i]= tmp;
+ items[i] = tmp;
/* calculate combine string length */
totbuf += id_str_size + name_str_size + desc_str_size + 3; /* 3 is for '\0's */
@@ -1046,18 +1047,18 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
* immediately after use, so we need to duplicate them, ugh.
* annoying because it works most of the time without this. */
{
- EnumPropertyItem *items_dup= MEM_mallocN((sizeof(EnumPropertyItem) * (seq_len + 1)) + (sizeof(char) * totbuf),
+ EnumPropertyItem *items_dup = MEM_mallocN((sizeof(EnumPropertyItem) * (seq_len + 1)) + (sizeof(char) * totbuf),
"enum_items_from_py2");
- EnumPropertyItem *items_ptr= items_dup;
- char *buf= ((char *)items_dup) + (sizeof(EnumPropertyItem) * (seq_len + 1));
+ EnumPropertyItem *items_ptr = items_dup;
+ char *buf = ((char *)items_dup) + (sizeof(EnumPropertyItem) * (seq_len + 1));
memcpy(items_dup, items, sizeof(EnumPropertyItem) * (seq_len + 1));
- for (i=0; i<seq_len; i++, items_ptr++) {
+ for (i = 0; i < seq_len; i++, items_ptr++) {
buf += strswapbufcpy(buf, &items_ptr->identifier);
buf += strswapbufcpy(buf, &items_ptr->name);
buf += strswapbufcpy(buf, &items_ptr->description);
}
MEM_freeN(items);
- items=items_dup;
+ items = items_dup;
}
/* end string duplication */
#endif
@@ -1069,47 +1070,47 @@ static EnumPropertyItem *bpy_props_enum_itemf(struct bContext *C, PointerRNA *pt
{
PyGILState_STATE gilstate;
- PyObject *py_func= RNA_property_enum_py_data_get(prop);
- PyObject *self= NULL;
+ PyObject *py_func = RNA_property_enum_py_data_get(prop);
+ PyObject *self = NULL;
PyObject *args;
PyObject *items; /* returned from the function call */
- EnumPropertyItem *eitems= NULL;
- int err= 0;
+ EnumPropertyItem *eitems = NULL;
+ int err = 0;
bpy_context_set(C, &gilstate);
- args= PyTuple_New(2);
- self= pyrna_struct_as_instance(ptr);
+ args = PyTuple_New(2);
+ self = pyrna_struct_as_instance(ptr);
PyTuple_SET_ITEM(args, 0, self);
/* now get the context */
PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module);
Py_INCREF(bpy_context_module);
- items= PyObject_CallObject(py_func, args);
+ items = PyObject_CallObject(py_func, args);
Py_DECREF(args);
- if (items==NULL) {
- err= -1;
+ if (items == NULL) {
+ err = -1;
}
else {
PyObject *items_fast;
- int defvalue_dummy=0;
+ int defvalue_dummy = 0;
- if (!(items_fast= PySequence_Fast(items, "EnumProperty(...): "
+ if (!(items_fast = PySequence_Fast(items, "EnumProperty(...): "
"return value from the callback was not a sequence")))
{
- err= -1;
+ err = -1;
}
else {
- eitems= enum_items_from_py(items_fast, NULL, &defvalue_dummy, (RNA_property_flag(prop) & PROP_ENUM_FLAG)!=0);
+ eitems = enum_items_from_py(items_fast, NULL, &defvalue_dummy, (RNA_property_flag(prop) & PROP_ENUM_FLAG) != 0);
Py_DECREF(items_fast);
if (!eitems) {
- err= -1;
+ err = -1;
}
}
@@ -1117,12 +1118,12 @@ static EnumPropertyItem *bpy_props_enum_itemf(struct bContext *C, PointerRNA *pt
}
if (err != -1) { /* worked */
- *free= 1;
+ *free = 1;
}
else {
printf_func_error(py_func);
- eitems= DummyRNA_NULL_items;
+ eitems = DummyRNA_NULL_items;
}
@@ -1160,19 +1161,19 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(EnumProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "items", "name", "description", "default",
+ static const char *kwlist[] = {"attr", "items", "name", "description", "default",
"options", "update", NULL};
- const char *id=NULL, *name="", *description="";
- PyObject *def= NULL;
+ const char *id = NULL, *name = NULL, *description = "";
+ PyObject *def = NULL;
int id_len;
- int defvalue=0;
+ int defvalue = 0;
PyObject *items, *items_fast;
EnumPropertyItem *eitems;
PropertyRNA *prop;
- PyObject *pyopts= NULL;
- int opts=0;
- short is_itemf= FALSE;
- PyObject *update_cb= NULL;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ short is_itemf = FALSE;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#O|ssOO!O:EnumProperty",
@@ -1192,7 +1193,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
/* items can be a list or a callable */
if (PyFunction_Check(items)) { /* dont use PyCallable_Check because we need the function code for errors */
- PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(items);
+ PyCodeObject *f_code = (PyCodeObject *)PyFunction_GET_CODE(items);
if (f_code->co_argcount != 2) {
PyErr_Format(PyExc_ValueError,
"EnumProperty(...): expected 'items' function to take 2 arguments, not %d",
@@ -1207,17 +1208,17 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- is_itemf= TRUE;
- eitems= DummyRNA_NULL_items;
+ is_itemf = TRUE;
+ eitems = DummyRNA_NULL_items;
}
else {
- if (!(items_fast= PySequence_Fast(items, "EnumProperty(...): "
+ if (!(items_fast = PySequence_Fast(items, "EnumProperty(...): "
"expected a sequence of tuples for the enum items or a function")))
{
return NULL;
}
- eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0);
+ eitems = enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG) != 0);
Py_DECREF(items_fast);
@@ -1226,8 +1227,8 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
}
}
- if (opts & PROP_ENUM_FLAG) prop= RNA_def_enum_flag(srna, id, eitems, defvalue, name, description);
- else prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+ if (opts & PROP_ENUM_FLAG) prop = RNA_def_enum_flag(srna, id, eitems, defvalue, name ? name : id, description);
+ else prop = RNA_def_enum(srna, id, eitems, defvalue, name ? name : id, description);
if (is_itemf) {
RNA_def_enum_funcs(prop, bpy_props_enum_itemf);
@@ -1240,7 +1241,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -1257,11 +1258,11 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix
{
StructRNA *srna;
- srna= srna_from_self(value, "");
+ srna = srna_from_self(value, "");
if (!srna) {
if (PyErr_Occurred()) {
- PyObject *msg= PyC_ExceptionBuffer();
- const char *msg_char= _PyUnicode_AsString(msg);
+ PyObject *msg = PyC_ExceptionBuffer();
+ const char *msg_char = _PyUnicode_AsString(msg);
PyErr_Format(PyExc_TypeError,
"%.200s expected an RNA type derived from PropertyGroup, failed with: %s",
error_prefix, msg_char);
@@ -1305,15 +1306,15 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k
BPY_PROPDEF_HEAD(PointerProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "type", "name", "description", "options", "update", NULL};
- const char *id=NULL, *name="", *description="";
+ static const char *kwlist[] = {"attr", "type", "name", "description", "options", "update", NULL};
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
PropertyRNA *prop;
StructRNA *ptype;
- PyObject *type= Py_None;
- PyObject *pyopts= NULL;
- int opts=0;
- PyObject *update_cb= NULL;
+ PyObject *type = Py_None;
+ PyObject *pyopts = NULL;
+ int opts = 0;
+ PyObject *update_cb = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#O|ssO!O:PointerProperty",
@@ -1327,7 +1328,7 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k
BPY_PROPDEF_CHECK(PointerProperty, property_flag_items)
- ptype= pointer_type_from_py(type, "PointerProperty(...):");
+ ptype = pointer_type_from_py(type, "PointerProperty(...):");
if (!ptype)
return NULL;
@@ -1335,10 +1336,10 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k
return NULL;
}
- prop= RNA_def_pointer_runtime(srna, id, ptype, name, description);
+ prop = RNA_def_pointer_runtime(srna, id, ptype, name ? name : id, description);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
bpy_prop_callback_assign(prop, update_cb);
@@ -1366,14 +1367,14 @@ static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(CollectionProperty)
if (srna) {
- static const char *kwlist[]= {"attr", "type", "name", "description", "options", NULL};
- const char *id=NULL, *name="", *description="";
+ static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
+ const char *id = NULL, *name = NULL, *description = "";
int id_len;
PropertyRNA *prop;
StructRNA *ptype;
- PyObject *type= Py_None;
- PyObject *pyopts= NULL;
- int opts=0;
+ PyObject *type = Py_None;
+ PyObject *pyopts = NULL;
+ int opts = 0;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s#O|ssO!:CollectionProperty",
@@ -1386,14 +1387,14 @@ static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_CHECK(CollectionProperty, property_flag_items)
- ptype= pointer_type_from_py(type, "CollectionProperty(...):");
+ ptype = pointer_type_from_py(type, "CollectionProperty(...):");
if (!ptype)
return NULL;
- prop= RNA_def_collection_runtime(srna, id, ptype, name, description);
+ prop = RNA_def_collection_runtime(srna, id, ptype, name ? name : id, description);
if (pyopts) {
if (opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
- if ((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ if ((opts & PROP_ANIMATABLE) == 0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
if (opts & PROP_SKIP_SAVE) RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
RNA_def_property_duplicate_pointers(srna, prop);
@@ -1415,9 +1416,9 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
if (PyTuple_GET_SIZE(args) == 1) {
PyObject *ret;
- self= PyTuple_GET_ITEM(args, 0);
- args= PyTuple_New(0);
- ret= BPy_RemoveProperty(self, args, kw);
+ self = PyTuple_GET_ITEM(args, 0);
+ args = PyTuple_New(0);
+ ret = BPy_RemoveProperty(self, args, kw);
Py_DECREF(args);
return ret;
}
@@ -1426,18 +1427,18 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
return NULL;
}
- srna= srna_from_self(self, "RemoveProperty(...):");
- if (srna==NULL && PyErr_Occurred()) {
+ srna = srna_from_self(self, "RemoveProperty(...):");
+ if (srna == NULL && PyErr_Occurred()) {
return NULL; /* self's type was compatible but error getting the srna */
}
- else if (srna==NULL) {
+ else if (srna == NULL) {
PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type");
return NULL;
}
else {
- static const char *kwlist[]= {"attr", NULL};
+ static const char *kwlist[] = {"attr", NULL};
- char *id=NULL;
+ char *id = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw,
"s:RemoveProperty",
@@ -1454,7 +1455,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
Py_RETURN_NONE;
}
-static struct PyMethodDef props_methods[]= {
+static struct PyMethodDef props_methods[] = {
{"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolProperty_doc},
{"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolVectorProperty_doc},
{"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, BPy_IntProperty_doc},
@@ -1470,7 +1471,7 @@ static struct PyMethodDef props_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyModuleDef props_module= {
+static struct PyModuleDef props_module = {
PyModuleDef_HEAD_INIT,
"bpy.props",
"This module defines properties to extend blenders internal data, the result of these functions"
@@ -1485,7 +1486,7 @@ PyObject *BPY_rna_props(void)
PyObject *submodule;
PyObject *submodule_dict;
- submodule= PyModule_Create(&props_module);
+ submodule = PyModule_Create(&props_module);
PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
/* INCREF since its its assumed that all these functions return the
@@ -1494,9 +1495,9 @@ PyObject *BPY_rna_props(void)
Py_INCREF(submodule);
/* api needs the PyObjects internally */
- submodule_dict= PyModule_GetDict(submodule);
+ submodule_dict = PyModule_GetDict(submodule);
-#define ASSIGN_STATIC(_name) pymeth_##_name= PyDict_GetItemString(submodule_dict, #_name)
+#define ASSIGN_STATIC(_name) pymeth_##_name = PyDict_GetItemString(submodule_dict, #_name)
ASSIGN_STATIC(BoolProperty);
ASSIGN_STATIC(BoolVectorProperty);
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index d15330ecb05..d911fcb99b1 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -120,13 +120,13 @@ int pyrna_prop_validity_check(BPy_PropertyRNA *self)
#if defined(USE_PYRNA_INVALIDATE_GC) || defined(USE_PYRNA_INVALIDATE_WEAKREF)
static void pyrna_invalidate(BPy_DummyPointerRNA *self)
{
- self->ptr.type= NULL; /* this is checked for validity */
- self->ptr.id.data= NULL; /* should not be needed but prevent bad pointer access, just incase */
+ self->ptr.type = NULL; /* this is checked for validity */
+ self->ptr.id.data = NULL; /* should not be needed but prevent bad pointer access, just incase */
}
#endif
#ifdef USE_PYRNA_INVALIDATE_GC
-#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
+#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g) + 1))
/* only for sizeof() */
struct gc_generation {
@@ -138,15 +138,15 @@ struct gc_generation {
static void id_release_gc(struct ID *id)
{
unsigned int j;
- // unsigned int i= 0;
- for (j=0; j<3; j++) {
+ // unsigned int i = 0;
+ for (j = 0; j < 3; j++) {
/* hack below to get the 2 other lists from _PyGC_generation0 that are normally not exposed */
- PyGC_Head *gen= (PyGC_Head *)(((char *)_PyGC_generation0) + (sizeof(gc_generation) * j));
- PyGC_Head *g= gen->gc.gc_next;
- while ((g= g->gc.gc_next) != gen) {
- PyObject *ob= FROM_GC(g);
+ PyGC_Head *gen = (PyGC_Head *)(((char *)_PyGC_generation0) + (sizeof(gc_generation) * j));
+ PyGC_Head *g = gen->gc.gc_next;
+ while ((g = g->gc.gc_next) != gen) {
+ PyObject *ob = FROM_GC(g);
if (PyType_IsSubtype(Py_TYPE(ob), &pyrna_struct_Type) || PyType_IsSubtype(Py_TYPE(ob), &pyrna_prop_Type)) {
- BPy_DummyPointerRNA *ob_ptr= (BPy_DummyPointerRNA *)ob;
+ BPy_DummyPointerRNA *ob_ptr = (BPy_DummyPointerRNA *)ob;
if (ob_ptr->ptr.id.data == id) {
pyrna_invalidate(ob_ptr);
// printf("freeing: %p %s, %.200s\n", (void *)ob, id->name, Py_TYPE(ob)->tp_name);
@@ -162,27 +162,27 @@ static void id_release_gc(struct ID *id)
#ifdef USE_PYRNA_INVALIDATE_WEAKREF
//#define DEBUG_RNA_WEAKREF
-struct GHash *id_weakref_pool= NULL;
+struct GHash *id_weakref_pool = NULL;
static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref);
-static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
+static PyMethodDef id_free_weakref_cb_def = {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
/* adds a reference to the list, remember to decref */
static GHash *id_weakref_pool_get(ID *id)
{
- GHash *weakinfo_hash= NULL;
+ GHash *weakinfo_hash = NULL;
if (id_weakref_pool) {
- weakinfo_hash= BLI_ghash_lookup(id_weakref_pool, (void *)id);
+ weakinfo_hash = BLI_ghash_lookup(id_weakref_pool, (void *)id);
}
else {
/* first time, allocate pool */
- id_weakref_pool= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_global_pool");
- weakinfo_hash= NULL;
+ id_weakref_pool = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_global_pool");
+ weakinfo_hash = NULL;
}
- if (weakinfo_hash==NULL) {
+ if (weakinfo_hash == NULL) {
/* we're using a ghash as a set, could use libHX's HXMAP_SINGULAR but would be an extra dep. */
- weakinfo_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_id");
+ weakinfo_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_id");
BLI_ghash_insert(id_weakref_pool, (void *)id, weakinfo_hash);
}
@@ -197,14 +197,14 @@ void id_weakref_pool_add(ID *id, BPy_DummyPointerRNA *pyrna)
PyObject *weakref_cb_py;
/* create a new function instance and insert the list as 'self' so we can remove ourself from it */
- GHash *weakinfo_hash= id_weakref_pool_get(id); /* new or existing */
+ GHash *weakinfo_hash = id_weakref_pool_get(id); /* new or existing */
- weakref_capsule= PyCapsule_New(weakinfo_hash, NULL, NULL);
- weakref_cb_py= PyCFunction_New(&id_free_weakref_cb_def, weakref_capsule);
+ weakref_capsule = PyCapsule_New(weakinfo_hash, NULL, NULL);
+ weakref_cb_py = PyCFunction_New(&id_free_weakref_cb_def, weakref_capsule);
Py_DECREF(weakref_capsule);
/* add weakref to weakinfo_hash list */
- weakref= PyWeakref_NewRef((PyObject *)pyrna, weakref_cb_py);
+ weakref = PyWeakref_NewRef((PyObject *)pyrna, weakref_cb_py);
Py_DECREF(weakref_cb_py); /* function owned by the weakref now */
@@ -218,14 +218,14 @@ void id_weakref_pool_add(ID *id, BPy_DummyPointerRNA *pyrna)
static ID *_id_tmp_ptr;
static void value_id_set(void *id)
{
- _id_tmp_ptr= (ID *)id;
+ _id_tmp_ptr = (ID *)id;
}
static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash);
static PyObject *id_free_weakref_cb(PyObject *weakinfo_capsule, PyObject *weakref)
{
/* important to search backwards */
- GHash *weakinfo_hash= PyCapsule_GetPointer(weakinfo_capsule, NULL);
+ GHash *weakinfo_hash = PyCapsule_GetPointer(weakinfo_capsule, NULL);
if (BLI_ghash_size(weakinfo_hash) > 1) {
@@ -252,8 +252,8 @@ static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash)
#endif
while (!BLI_ghashIterator_isDone(&weakinfo_hash_iter)) {
- PyObject *weakref= (PyObject *)BLI_ghashIterator_getKey(&weakinfo_hash_iter);
- PyObject *item= PyWeakref_GET_OBJECT(weakref);
+ PyObject *weakref = (PyObject *)BLI_ghashIterator_getKey(&weakinfo_hash_iter);
+ PyObject *item = PyWeakref_GET_OBJECT(weakref);
if (item != Py_None) {
#ifdef DEBUG_RNA_WEAKREF
@@ -273,7 +273,7 @@ static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash)
if (BLI_ghash_size(id_weakref_pool) == 0) {
BLI_ghash_free(id_weakref_pool, NULL, NULL);
- id_weakref_pool= NULL;
+ id_weakref_pool = NULL;
#ifdef DEBUG_RNA_WEAKREF
printf("id_release_weakref freeing pool\n");
#endif
@@ -282,7 +282,7 @@ static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash)
static void id_release_weakref(struct ID *id)
{
- GHash *weakinfo_hash= BLI_ghash_lookup(id_weakref_pool, (void *)id);
+ GHash *weakinfo_hash = BLI_ghash_lookup(id_weakref_pool, (void *)id);
if (weakinfo_hash) {
id_release_weakref_list(id, weakinfo_hash);
}
@@ -298,7 +298,7 @@ void BPY_id_release(struct ID *id)
#ifdef USE_PYRNA_INVALIDATE_WEAKREF
if (id_weakref_pool) {
- PyGILState_STATE gilstate= PyGILState_Ensure();
+ PyGILState_STATE gilstate = PyGILState_Ensure();
id_release_weakref(id);
@@ -310,25 +310,25 @@ void BPY_id_release(struct ID *id)
}
#ifdef USE_PEDANTIC_WRITE
-static short rna_disallow_writes= FALSE;
+static short rna_disallow_writes = FALSE;
static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
{
- ID *id= ptr->id.data;
+ ID *id = ptr->id.data;
if (id) {
- const short idcode= GS(id->name);
+ const short idcode = GS(id->name);
if (!ELEM(idcode, ID_WM, ID_SCR)) { /* may need more added here */
- const char *idtype= BKE_idcode_to_name(idcode);
+ const char *idtype = BKE_idcode_to_name(idcode);
const char *pyname;
- if (key && PyUnicode_Check(key)) pyname= _PyUnicode_AsString(key);
- else pyname= "<UNKNOWN>";
+ if (key && PyUnicode_Check(key)) pyname = _PyUnicode_AsString(key);
+ else pyname = "<UNKNOWN>";
/* make a nice string error */
BLI_assert(idtype != NULL);
PyErr_Format(PyExc_AttributeError,
"Writing to ID classes in this context is not allowed: "
"%.200s, %.200s datablock, error setting %.200s.%.200s",
- id->name+2, idtype, RNA_struct_identifier(ptr->type), pyname);
+ id->name + 2, idtype, RNA_struct_identifier(ptr->type), pyname);
return TRUE;
}
@@ -346,7 +346,7 @@ int pyrna_write_check(void)
void pyrna_write_set(int val)
{
- rna_disallow_writes= !val;
+ rna_disallow_writes = !val;
}
#else // USE_PEDANTIC_WRITE
int pyrna_write_check(void)
@@ -372,7 +372,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback);
/* bpyrna vector/euler/quat callbacks */
-static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
+static int mathutils_rna_array_cb_index = -1; /* index for our callbacks */
/* subtype not used much yet */
#define MATHUTILS_CB_SUBTYPE_EUL 0
@@ -382,7 +382,7 @@ static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
static int mathutils_rna_generic_check(BaseMathObject *bmo)
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
@@ -391,20 +391,20 @@ static int mathutils_rna_generic_check(BaseMathObject *bmo)
static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
/* Euler order exception */
- if (subtype==MATHUTILS_CB_SUBTYPE_EUL) {
- EulerObject *eul= (EulerObject *)bmo;
- PropertyRNA *prop_eul_order= NULL;
- eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
+ if (subtype == MATHUTILS_CB_SUBTYPE_EUL) {
+ EulerObject *eul = (EulerObject *)bmo;
+ PropertyRNA *prop_eul_order = NULL;
+ eul->order = pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
}
return 0;
@@ -412,12 +412,12 @@ static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
float min, max;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
#ifdef USE_PEDANTIC_WRITE
@@ -436,8 +436,8 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
RNA_property_float_range(&self->ptr, self->prop, &min, &max);
if (min != FLT_MIN || max != FLT_MAX) {
- int i, len= RNA_property_array_length(&self->ptr, self->prop);
- for (i=0; i<len; i++) {
+ int i, len = RNA_property_array_length(&self->ptr, self->prop);
+ for (i = 0; i < len; i++) {
CLAMP(bmo->data[i], min, max);
}
}
@@ -448,10 +448,10 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
}
/* Euler order exception */
- if (subtype==MATHUTILS_CB_SUBTYPE_EUL) {
- EulerObject *eul= (EulerObject *)bmo;
- PropertyRNA *prop_eul_order= NULL;
- short order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
+ if (subtype == MATHUTILS_CB_SUBTYPE_EUL) {
+ EulerObject *eul = (EulerObject *)bmo;
+ PropertyRNA *prop_eul_order = NULL;
+ short order = pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
if (order != eul->order) {
RNA_property_enum_set(&self->ptr, prop_eul_order, eul->order);
if (RNA_property_update_check(prop_eul_order)) {
@@ -464,24 +464,24 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
- bmo->data[index]= RNA_property_float_get_index(&self->ptr, self->prop, index);
+ bmo->data[index] = RNA_property_float_get_index(&self->ptr, self->prop, index);
return 0;
}
static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
#ifdef USE_PEDANTIC_WRITE
@@ -507,7 +507,7 @@ static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtyp
return 0;
}
-static Mathutils_Callback mathutils_rna_array_cb= {
+static Mathutils_Callback mathutils_rna_array_cb = {
(BaseMathCheckFunc) mathutils_rna_generic_check,
(BaseMathGetFunc) mathutils_rna_vector_get,
(BaseMathSetFunc) mathutils_rna_vector_set,
@@ -517,15 +517,15 @@ static Mathutils_Callback mathutils_rna_array_cb= {
/* bpyrna matrix callbacks */
-static int mathutils_rna_matrix_cb_index= -1; /* index for our callbacks */
+static int mathutils_rna_matrix_cb_index = -1; /* index for our callbacks */
static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
@@ -534,11 +534,11 @@ static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
{
- BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ BPy_PropertyRNA *self = (BPy_PropertyRNA *)bmo->cb_user;
PYRNA_PROP_CHECK_INT(self);
- if (self->prop==NULL)
+ if (self->prop == NULL)
return -1;
#ifdef USE_PEDANTIC_WRITE
@@ -563,7 +563,7 @@ static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
return 0;
}
-static Mathutils_Callback mathutils_rna_matrix_cb= {
+static Mathutils_Callback mathutils_rna_matrix_cb = {
mathutils_rna_generic_check,
mathutils_rna_matrix_get,
mathutils_rna_matrix_set,
@@ -574,11 +574,11 @@ static Mathutils_Callback mathutils_rna_matrix_cb= {
static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
{
/* attempt to get order */
- if (*prop_eul_order==NULL)
- *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
+ if (*prop_eul_order == NULL)
+ *prop_eul_order = RNA_struct_find_property(ptr, "rotation_mode");
if (*prop_eul_order) {
- short order= RNA_property_enum_get(ptr, *prop_eul_order);
+ short order = RNA_property_enum_get(ptr, *prop_eul_order);
if (order >= EULER_ORDER_XYZ && order <= EULER_ORDER_ZYX) /* could be quat or axisangle */
return order;
}
@@ -602,107 +602,107 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
{
- PyObject *ret= NULL;
+ PyObject *ret = NULL;
#ifdef USE_MATHUTILS
int subtype, totdim;
int len;
int is_thick;
- const int flag= RNA_property_flag(prop);
+ const int flag = RNA_property_flag(prop);
/* disallow dynamic sized arrays to be wrapped since the size could change
* to a size mathutils does not support */
if ((RNA_property_type(prop) != PROP_FLOAT) || (flag & PROP_DYNAMIC))
return NULL;
- len= RNA_property_array_length(ptr, prop);
- subtype= RNA_property_subtype(prop);
- totdim= RNA_property_array_dimension(ptr, prop, NULL);
- is_thick= (flag & PROP_THICK_WRAP);
+ len = RNA_property_array_length(ptr, prop);
+ subtype = RNA_property_subtype(prop);
+ totdim = RNA_property_array_dimension(ptr, prop, NULL);
+ is_thick = (flag & PROP_THICK_WRAP);
if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
if (!is_thick)
- ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
+ ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
- switch(subtype) {
+ switch (subtype) {
case PROP_ALL_VECTOR_SUBTYPES:
- if (len>=2 && len <= 4) {
+ if (len >= 2 && len <= 4) {
if (is_thick) {
- ret= Vector_CreatePyObject(NULL, len, Py_NEW, NULL);
+ ret = Vector_CreatePyObject(NULL, len, Py_NEW, NULL);
RNA_property_float_get_array(ptr, prop, ((VectorObject *)ret)->vec);
}
else {
- PyObject *vec_cb= Vector_CreatePyObject_cb(ret, len, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_VEC);
+ PyObject *vec_cb = Vector_CreatePyObject_cb(ret, len, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_VEC);
Py_DECREF(ret); /* the vector owns now */
- ret= vec_cb; /* return the vector instead */
+ ret = vec_cb; /* return the vector instead */
}
}
break;
case PROP_MATRIX:
- if (len==16) {
+ if (len == 16) {
if (is_thick) {
- ret= Matrix_CreatePyObject(NULL, 4, 4, Py_NEW, NULL);
- RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->contigPtr);
+ ret = Matrix_CreatePyObject(NULL, 4, 4, Py_NEW, NULL);
+ RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->matrix);
}
else {
- PyObject *mat_cb= Matrix_CreatePyObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
+ PyObject *mat_cb = Matrix_CreatePyObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
Py_DECREF(ret); /* the matrix owns now */
- ret= mat_cb; /* return the matrix instead */
+ ret = mat_cb; /* return the matrix instead */
}
}
- else if (len==9) {
+ else if (len == 9) {
if (is_thick) {
- ret= Matrix_CreatePyObject(NULL, 3, 3, Py_NEW, NULL);
- RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->contigPtr);
+ ret = Matrix_CreatePyObject(NULL, 3, 3, Py_NEW, NULL);
+ RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->matrix);
}
else {
- PyObject *mat_cb= Matrix_CreatePyObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
+ PyObject *mat_cb = Matrix_CreatePyObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
Py_DECREF(ret); /* the matrix owns now */
- ret= mat_cb; /* return the matrix instead */
+ ret = mat_cb; /* return the matrix instead */
}
}
break;
case PROP_EULER:
case PROP_QUATERNION:
- if (len==3) { /* euler */
+ if (len == 3) { /* euler */
if (is_thick) {
/* attempt to get order, only needed for thick types since wrapped with update via callbacks */
- PropertyRNA *prop_eul_order= NULL;
- short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, EULER_ORDER_XYZ);
+ PropertyRNA *prop_eul_order = NULL;
+ short order = pyrna_rotation_euler_order_get(ptr, &prop_eul_order, EULER_ORDER_XYZ);
- ret= Euler_CreatePyObject(NULL, order, Py_NEW, NULL); // TODO, get order from RNA
+ ret = Euler_CreatePyObject(NULL, order, Py_NEW, NULL); // TODO, get order from RNA
RNA_property_float_get_array(ptr, prop, ((EulerObject *)ret)->eul);
}
else {
/* order will be updated from callback on use */
- PyObject *eul_cb= Euler_CreatePyObject_cb(ret, EULER_ORDER_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
+ PyObject *eul_cb = Euler_CreatePyObject_cb(ret, EULER_ORDER_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
Py_DECREF(ret); /* the euler owns now */
- ret= eul_cb; /* return the euler instead */
+ ret = eul_cb; /* return the euler instead */
}
}
- else if (len==4) {
+ else if (len == 4) {
if (is_thick) {
- ret= Quaternion_CreatePyObject(NULL, Py_NEW, NULL);
+ ret = Quaternion_CreatePyObject(NULL, Py_NEW, NULL);
RNA_property_float_get_array(ptr, prop, ((QuaternionObject *)ret)->quat);
}
else {
- PyObject *quat_cb= Quaternion_CreatePyObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_QUAT);
+ PyObject *quat_cb = Quaternion_CreatePyObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_QUAT);
Py_DECREF(ret); /* the quat owns now */
- ret= quat_cb; /* return the quat instead */
+ ret = quat_cb; /* return the quat instead */
}
}
break;
case PROP_COLOR:
case PROP_COLOR_GAMMA:
- if (len==3) { /* color */
+ if (len == 3) { /* color */
if (is_thick) {
- ret= Color_CreatePyObject(NULL, Py_NEW, NULL); // TODO, get order from RNA
+ ret = Color_CreatePyObject(NULL, Py_NEW, NULL); // TODO, get order from RNA
RNA_property_float_get_array(ptr, prop, ((ColorObject *)ret)->col);
}
else {
- PyObject *col_cb= Color_CreatePyObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_COLOR);
+ PyObject *col_cb = Color_CreatePyObject_cb(ret, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_COLOR);
Py_DECREF(ret); /* the color owns now */
- ret= col_cb; /* return the color instead */
+ ret = col_cb; /* return the color instead */
}
}
default:
@@ -710,14 +710,14 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
}
}
- if (ret==NULL) {
+ if (ret == NULL) {
if (is_thick) {
/* this is an array we cant reference (since its not thin wrappable)
* and cannot be coerced into a mathutils type, so return as a list */
- ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
+ ret = pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
}
else {
- ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
+ ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
}
}
#else // USE_MATHUTILS
@@ -732,7 +732,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
{
if (RNA_enum_value_from_id(item, identifier, value) == 0) {
- const char *enum_str= BPy_enum_as_string(item);
+ const char *enum_str = BPy_enum_as_string(item);
PyErr_Format(PyExc_TypeError,
"%s: '%.200s' not found in (%s)",
error_prefix, identifier, enum_str);
@@ -745,34 +745,34 @@ int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int
static int pyrna_struct_compare(BPy_StructRNA *a, BPy_StructRNA *b)
{
- return (a->ptr.data==b->ptr.data) ? 0 : -1;
+ return (a->ptr.data == b->ptr.data) ? 0 : -1;
}
static int pyrna_prop_compare(BPy_PropertyRNA *a, BPy_PropertyRNA *b)
{
- return (a->prop==b->prop && a->ptr.data==b->ptr.data) ? 0 : -1;
+ return (a->prop == b->prop && a->ptr.data == b->ptr.data) ? 0 : -1;
}
static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (BPy_StructRNA_Check(a) && BPy_StructRNA_Check(b))
- ok= pyrna_struct_compare((BPy_StructRNA *)a, (BPy_StructRNA *)b);
+ ok = pyrna_struct_compare((BPy_StructRNA *)a, (BPy_StructRNA *)b);
switch (op) {
case Py_NE:
- ok= !ok; /* pass through */
+ ok = !ok; /* pass through */
case Py_EQ:
- res= ok ? Py_False : Py_True;
+ res = ok ? Py_False : Py_True;
break;
case Py_LT:
case Py_LE:
case Py_GT:
case Py_GE:
- res= Py_NotImplemented;
+ res = Py_NotImplemented;
break;
default:
PyErr_BadArgument();
@@ -785,23 +785,23 @@ static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (BPy_PropertyRNA_Check(a) && BPy_PropertyRNA_Check(b))
- ok= pyrna_prop_compare((BPy_PropertyRNA *)a, (BPy_PropertyRNA *)b);
+ ok = pyrna_prop_compare((BPy_PropertyRNA *)a, (BPy_PropertyRNA *)b);
switch (op) {
case Py_NE:
- ok= !ok; /* pass through */
+ ok = !ok; /* pass through */
case Py_EQ:
- res= ok ? Py_False : Py_True;
+ res = ok ? Py_False : Py_True;
break;
case Py_LT:
case Py_LE:
case Py_GT:
case Py_GE:
- res= Py_NotImplemented;
+ res = Py_NotImplemented;
break;
default:
PyErr_BadArgument();
@@ -823,9 +823,9 @@ static PyObject *pyrna_struct_str(BPy_StructRNA *self)
}
/* print name if available */
- name= RNA_struct_name_get_alloc(&self->ptr, NULL, 0, NULL);
+ name = RNA_struct_name_get_alloc(&self->ptr, NULL, 0, NULL);
if (name) {
- ret= PyUnicode_FromFormat("<bpy_struct, %.200s(\"%.200s\")>",
+ ret = PyUnicode_FromFormat("<bpy_struct, %.200s(\"%.200s\")>",
RNA_struct_identifier(self->ptr.type),
name);
MEM_freeN((void *)name);
@@ -839,32 +839,32 @@ static PyObject *pyrna_struct_str(BPy_StructRNA *self)
static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
{
- ID *id= self->ptr.id.data;
+ ID *id = self->ptr.id.data;
PyObject *tmp_str;
PyObject *ret;
if (id == NULL || !PYRNA_STRUCT_IS_VALID(self))
return pyrna_struct_str(self); /* fallback */
- tmp_str= PyUnicode_FromString(id->name+2);
+ tmp_str = PyUnicode_FromString(id->name + 2);
if (RNA_struct_is_ID(self->ptr.type)) {
- ret= PyUnicode_FromFormat("bpy.data.%s[%R]",
+ ret = PyUnicode_FromFormat("bpy.data.%s[%R]",
BKE_idcode_to_name_plural(GS(id->name)),
tmp_str);
}
else {
const char *path;
- path= RNA_path_from_ID_to_struct(&self->ptr);
+ path = RNA_path_from_ID_to_struct(&self->ptr);
if (path) {
- ret= PyUnicode_FromFormat("bpy.data.%s[%R].%s",
+ ret = PyUnicode_FromFormat("bpy.data.%s[%R].%s",
BKE_idcode_to_name_plural(GS(id->name)),
tmp_str,
path);
MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
- ret= PyUnicode_FromFormat("bpy.data.%s[%R]...%s",
+ ret = PyUnicode_FromFormat("bpy.data.%s[%R]...%s",
BKE_idcode_to_name_plural(GS(id->name)),
tmp_str,
RNA_struct_identifier(self->ptr.type));
@@ -881,30 +881,30 @@ static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
PyObject *ret;
PointerRNA ptr;
const char *name;
- const char *type_id= NULL;
- char type_fmt[64]= "";
+ const char *type_id = NULL;
+ char type_fmt[64] = "";
int type;
PYRNA_PROP_CHECK_OBJ(self);
- type= RNA_property_type(self->prop);
+ type = RNA_property_type(self->prop);
- if (RNA_enum_id_from_value(property_type_items, type, &type_id)==0) {
+ if (RNA_enum_id_from_value(property_type_items, type, &type_id) == 0) {
PyErr_SetString(PyExc_RuntimeError, "could not use property type, internal error"); /* should never happen */
return NULL;
}
else {
/* this should never fail */
- int len= -1;
- char *c= type_fmt;
+ int len = -1;
+ char *c = type_fmt;
while ((*c++= tolower(*type_id++))) {} ;
- if (type==PROP_COLLECTION) {
- len= pyrna_prop_collection_length(self);
+ if (type == PROP_COLLECTION) {
+ len = pyrna_prop_collection_length(self);
}
else if (RNA_property_array_check(self->prop)) {
- len= pyrna_prop_array_length((BPy_PropertyArrayRNA *)self);
+ len = pyrna_prop_array_length((BPy_PropertyArrayRNA *)self);
}
if (len != -1)
@@ -913,11 +913,11 @@ static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
/* if a pointer, try to print name of pointer target too */
if (type == PROP_POINTER) {
- ptr= RNA_property_pointer_get(&self->ptr, self->prop);
- name= RNA_struct_name_get_alloc(&ptr, NULL, 0, NULL);
+ ptr = RNA_property_pointer_get(&self->ptr, self->prop);
+ name = RNA_struct_name_get_alloc(&ptr, NULL, 0, NULL);
if (name) {
- ret= PyUnicode_FromFormat("<bpy_%.200s, %.200s.%.200s(\"%.200s\")>",
+ ret = PyUnicode_FromFormat("<bpy_%.200s, %.200s.%.200s(\"%.200s\")>",
type_fmt,
RNA_struct_identifier(self->ptr.type),
RNA_property_identifier(self->prop),
@@ -943,7 +943,7 @@ static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
{
- ID *id= self->ptr.id.data;
+ ID *id = self->ptr.id.data;
PyObject *tmp_str;
PyObject *ret;
const char *path;
@@ -953,18 +953,18 @@ static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
if (id == NULL)
return pyrna_prop_str(self); /* fallback */
- tmp_str= PyUnicode_FromString(id->name+2);
+ tmp_str = PyUnicode_FromString(id->name + 2);
- path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
+ path = RNA_path_from_ID_to_property(&self->ptr, self->prop);
if (path) {
- ret= PyUnicode_FromFormat("bpy.data.%s[%R].%s",
+ ret = PyUnicode_FromFormat("bpy.data.%s[%R].%s",
BKE_idcode_to_name_plural(GS(id->name)),
tmp_str,
path);
MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
- ret= PyUnicode_FromFormat("bpy.data.%s[%R]...%s",
+ ret = PyUnicode_FromFormat("bpy.data.%s[%R]...%s",
BKE_idcode_to_name_plural(GS(id->name)),
tmp_str,
RNA_property_identifier(self->prop));
@@ -995,18 +995,18 @@ static long pyrna_prop_hash(BPy_PropertyRNA *self)
{
long x, y;
if (self->ptr.data == NULL)
- x= 0;
+ x = 0;
else {
- x= _Py_HashPointer(self->ptr.data);
+ x = _Py_HashPointer(self->ptr.data);
if (x == -1)
return -1;
}
- y= _Py_HashPointer((void*)(self->prop));
+ y = _Py_HashPointer((void *)(self->prop));
if (y == -1)
return -1;
x ^= y;
if (x == -1)
- x= -2;
+ x = -2;
return x;
}
@@ -1031,7 +1031,7 @@ static void pyrna_struct_dealloc(BPy_StructRNA *self)
if (self->freeptr && self->ptr.data) {
IDP_FreeProperty(self->ptr.data);
MEM_freeN(self->ptr.data);
- self->ptr.data= NULL;
+ self->ptr.data = NULL;
}
#endif /* PYRNA_FREE_SUPPORT */
@@ -1056,15 +1056,15 @@ static void pyrna_struct_dealloc(BPy_StructRNA *self)
static void pyrna_struct_reference_set(BPy_StructRNA *self, PyObject *reference)
{
if (self->reference) {
-// PyObject_GC_UnTrack(self); /* INITIALIZED TRACKED? */
+// PyObject_GC_UnTrack(self); /* INITIALIZED TRACKED ? */
pyrna_struct_clear(self);
}
/* reference is now NULL */
if (reference) {
- self->reference= reference;
+ self->reference = reference;
Py_INCREF(reference);
-// PyObject_GC_Track(self); /* INITIALIZED TRACKED? */
+// PyObject_GC_Track(self); /* INITIALIZED TRACKED ? */
}
}
#endif /* !USE_PYRNA_STRUCT_REFERENCE */
@@ -1096,14 +1096,14 @@ static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
{
EnumPropertyItem *item;
const char *result;
- int free= FALSE;
+ int free = FALSE;
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
if (item) {
- result= BPy_enum_as_string(item);
+ result = BPy_enum_as_string(item);
}
else {
- result= "";
+ result = "";
}
if (free)
@@ -1115,15 +1115,13 @@ static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *val, const char *error_prefix)
{
- const char *param= _PyUnicode_AsString(item);
+ const char *param = _PyUnicode_AsString(item);
- if (param==NULL) {
- const char *enum_str= pyrna_enum_as_string(ptr, prop);
+ if (param == NULL) {
PyErr_Format(PyExc_TypeError,
- "%.200s expected a string enum type in (%.200s)",
- error_prefix, enum_str);
- MEM_freeN((void *)enum_str);
- return 0;
+ "%.200s expected a string enum, not %.200s",
+ error_prefix, Py_TYPE(item)->tp_name);
+ return -1;
}
else {
/* hack so that dynamic enums used for operator properties will be able to be built (i.e. context will be supplied to itemf)
@@ -1131,35 +1129,35 @@ static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *pr
RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
- const char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str = pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError,
"%.200s enum \"%.200s\" not found in (%.200s)",
error_prefix, param, enum_str);
MEM_freeN((void *)enum_str);
- return 0;
+ return -1;
}
}
- return 1;
+ return 0;
}
/* 'value' _must_ be a set type, error check before calling */
int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_value, const char *error_prefix)
{
/* set of enum items, concatenate all values with OR */
- int ret, flag= 0;
+ int ret, flag = 0;
/* set looping */
- Py_ssize_t pos= 0;
- Py_ssize_t hash= 0;
+ Py_ssize_t pos = 0;
+ Py_ssize_t hash = 0;
PyObject *key;
- *r_value= 0;
+ *r_value = 0;
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- const char *param= _PyUnicode_AsString(key);
+ const char *param = _PyUnicode_AsString(key);
- if (param==NULL) {
+ if (param == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s expected a string, not %.200s",
error_prefix, Py_TYPE(key)->tp_name);
@@ -1173,7 +1171,7 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
flag |= ret;
}
- *r_value= flag;
+ *r_value = flag;
return 0;
}
@@ -1181,9 +1179,9 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
{
EnumPropertyItem *item;
int ret;
- int free= FALSE;
+ int free = FALSE;
- *r_value= 0;
+ *r_value = 0;
if (!PyAnySet_Check(value)) {
PyErr_Format(PyExc_TypeError,
@@ -1196,17 +1194,17 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
if (item) {
- ret= pyrna_set_to_enum_bitfield(item, value, r_value, error_prefix);
+ ret = pyrna_set_to_enum_bitfield(item, value, r_value, error_prefix);
}
else {
if (PySet_GET_SIZE(value)) {
PyErr_Format(PyExc_TypeError,
"%.200s: empty enum \"%.200s\" could not have any values assigned",
error_prefix, RNA_property_identifier(prop));
- ret= -1;
+ ret = -1;
}
else {
- ret= 0;
+ ret = 0;
}
}
@@ -1218,14 +1216,14 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
PyObject *pyrna_enum_bitfield_to_py(EnumPropertyItem *items, int value)
{
- PyObject *ret= PySet_New(NULL);
+ PyObject *ret = PySet_New(NULL);
const char *identifier[RNA_ENUM_BITFLAG_SIZE + 1];
if (RNA_enum_bitflag_identifiers(items, value, identifier)) {
PyObject *item;
int index;
- for (index=0; identifier[index]; index++) {
- item= PyUnicode_FromString(identifier[index]);
+ for (index = 0; identifier[index]; index++) {
+ item = PyUnicode_FromString(identifier[index]);
PySet_Add(ret, item);
Py_DECREF(item);
}
@@ -1236,18 +1234,18 @@ PyObject *pyrna_enum_bitfield_to_py(EnumPropertyItem *items, int value)
static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
{
- PyObject *item, *ret= NULL;
+ PyObject *item, *ret = NULL;
if (RNA_property_flag(prop) & PROP_ENUM_FLAG) {
const char *identifier[RNA_ENUM_BITFLAG_SIZE + 1];
- ret= PySet_New(NULL);
+ ret = PySet_New(NULL);
if (RNA_property_enum_bitflag_identifiers(BPy_GetContext(), ptr, prop, val, identifier)) {
int index;
- for (index=0; identifier[index]; index++) {
- item= PyUnicode_FromString(identifier[index]);
+ for (index = 0; identifier[index]; index++) {
+ item = PyUnicode_FromString(identifier[index]);
PySet_Add(ret, item);
Py_DECREF(item);
}
@@ -1257,20 +1255,20 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
else {
const char *identifier;
if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) {
- ret= PyUnicode_FromString(identifier);
+ ret = PyUnicode_FromString(identifier);
}
else {
EnumPropertyItem *enum_item;
- int free= FALSE;
+ int free = FALSE;
/* don't throw error here, can't trust blender 100% to give the
* right values, python code should not generate error for that */
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &enum_item, NULL, &free);
if (enum_item && enum_item->identifier) {
- ret= PyUnicode_FromString(enum_item->identifier);
+ ret = PyUnicode_FromString(enum_item->identifier);
}
else {
- const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, 0, NULL);
+ const char *ptr_name = RNA_struct_name_get_alloc(ptr, NULL, 0, NULL);
/* prefer not fail silently incase of api errors, maybe disable it later */
printf("RNA Warning: Current value \"%d\" "
@@ -1292,7 +1290,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
if (ptr_name)
MEM_freeN((void *)ptr_name);
- ret= PyUnicode_FromString("");
+ ret = PyUnicode_FromString("");
}
if (free)
@@ -1300,7 +1298,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
/*
PyErr_Format(PyExc_AttributeError,
"RNA Error: Current value \"%d\" matches no enum", val);
- ret= NULL;
+ ret = NULL;
*/
}
}
@@ -1311,7 +1309,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
PyObject *ret;
- const int type= RNA_property_type(prop);
+ const int type = RNA_property_type(prop);
if (RNA_property_array_check(prop)) {
return pyrna_py_from_array(ptr, prop);
@@ -1320,39 +1318,39 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
- ret= PyBool_FromLong(RNA_property_boolean_get(ptr, prop));
+ ret = PyBool_FromLong(RNA_property_boolean_get(ptr, prop));
break;
case PROP_INT:
- ret= PyLong_FromSsize_t((Py_ssize_t)RNA_property_int_get(ptr, prop));
+ ret = PyLong_FromSsize_t((Py_ssize_t)RNA_property_int_get(ptr, prop));
break;
case PROP_FLOAT:
- ret= PyFloat_FromDouble(RNA_property_float_get(ptr, prop));
+ ret = PyFloat_FromDouble(RNA_property_float_get(ptr, prop));
break;
case PROP_STRING:
{
- const int subtype= RNA_property_subtype(prop);
+ const int subtype = RNA_property_subtype(prop);
const char *buf;
int buf_len;
char buf_fixed[32];
- buf= RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed), &buf_len);
+ buf = RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed), &buf_len);
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
if (subtype == PROP_BYTESTRING) {
- ret= PyBytes_FromStringAndSize(buf, buf_len);
+ ret = PyBytes_FromStringAndSize(buf, buf_len);
}
else if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
- ret= PyC_UnicodeFromByteAndSize(buf, buf_len);
+ ret = PyC_UnicodeFromByteAndSize(buf, buf_len);
}
else {
- ret= PyUnicode_FromStringAndSize(buf, buf_len);
+ ret = PyUnicode_FromStringAndSize(buf, buf_len);
}
#else // USE_STRING_COERCE
if (subtype == PROP_BYTESTRING) {
- ret= PyBytes_FromStringAndSize(buf, buf_len);
+ ret = PyBytes_FromStringAndSize(buf, buf_len);
}
else {
- ret= PyUnicode_FromStringAndSize(buf, buf_len);
+ ret = PyUnicode_FromStringAndSize(buf, buf_len);
}
#endif // USE_STRING_COERCE
if (buf_fixed != buf) {
@@ -1362,29 +1360,29 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
}
case PROP_ENUM:
{
- ret= pyrna_enum_to_py(ptr, prop, RNA_property_enum_get(ptr, prop));
+ ret = pyrna_enum_to_py(ptr, prop, RNA_property_enum_get(ptr, prop));
break;
}
case PROP_POINTER:
{
PointerRNA newptr;
- newptr= RNA_property_pointer_get(ptr, prop);
+ newptr = RNA_property_pointer_get(ptr, prop);
if (newptr.data) {
- ret= pyrna_struct_CreatePyObject(&newptr);
+ ret = pyrna_struct_CreatePyObject(&newptr);
}
else {
- ret= Py_None;
+ ret = Py_None;
Py_INCREF(ret);
}
break;
}
case PROP_COLLECTION:
- ret= pyrna_prop_CreatePyObject(ptr, prop);
+ ret = pyrna_prop_CreatePyObject(ptr, prop);
break;
default:
PyErr_Format(PyExc_TypeError,
"bpy_struct internal error: unknown type '%d' (pyrna_prop_to_py)", type);
- ret= NULL;
+ ret = NULL;
break;
}
@@ -1395,40 +1393,40 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
* Its takes keyword args and fills them with property values */
int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix)
{
- int error_val= 0;
+ int error_val = 0;
int totkw;
- const char *arg_name= NULL;
+ const char *arg_name = NULL;
PyObject *item;
- totkw= kw ? PyDict_Size(kw):0;
+ totkw = kw ? PyDict_Size(kw):0;
RNA_STRUCT_BEGIN(ptr, prop) {
- arg_name= RNA_property_identifier(prop);
+ arg_name = RNA_property_identifier(prop);
- if (strcmp(arg_name, "rna_type")==0) continue;
+ if (strcmp(arg_name, "rna_type") == 0) continue;
- if (kw==NULL) {
+ if (kw == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s: no keywords, expected \"%.200s\"",
error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val= -1;
+ error_val = -1;
break;
}
- item= PyDict_GetItemString(kw, arg_name); /* wont set an error */
+ item = PyDict_GetItemString(kw, arg_name); /* wont set an error */
if (item == NULL) {
if (all_args) {
PyErr_Format(PyExc_TypeError,
"%.200s: keyword \"%.200s\" missing",
error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val= -1; /* pyrna_py_to_prop sets the error */
+ error_val = -1; /* pyrna_py_to_prop sets the error */
break;
}
}
else {
if (pyrna_py_to_prop(ptr, prop, NULL, item, error_prefix)) {
- error_val= -1;
+ error_val = -1;
break;
}
totkw--;
@@ -1436,20 +1434,20 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
}
RNA_STRUCT_END;
- if (error_val==0 && totkw > 0) { /* some keywords were given that were not used :/ */
+ if (error_val == 0 && totkw > 0) { /* some keywords were given that were not used :/ */
PyObject *key, *value;
- Py_ssize_t pos= 0;
+ Py_ssize_t pos = 0;
while (PyDict_Next(kw, &pos, &key, &value)) {
- arg_name= _PyUnicode_AsString(key);
+ arg_name = _PyUnicode_AsString(key);
if (RNA_struct_find_property(ptr, arg_name) == NULL) break;
- arg_name= NULL;
+ arg_name = NULL;
}
PyErr_Format(PyExc_TypeError,
"%.200s: keyword \"%.200s\" unrecognized",
error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val= -1;
+ error_val = -1;
}
return error_val;
@@ -1458,9 +1456,9 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
static PyObject *pyrna_func_to_py(PointerRNA *ptr, FunctionRNA *func)
{
- BPy_FunctionRNA* pyfunc= (BPy_FunctionRNA *) PyObject_NEW(BPy_FunctionRNA, &pyrna_func_Type);
- pyfunc->ptr= *ptr;
- pyfunc->func= func;
+ BPy_FunctionRNA* pyfunc = (BPy_FunctionRNA *) PyObject_NEW(BPy_FunctionRNA, &pyrna_func_Type);
+ pyfunc->ptr = *ptr;
+ pyfunc->func = func;
return (PyObject *)pyfunc;
}
@@ -1468,7 +1466,7 @@ static PyObject *pyrna_func_to_py(PointerRNA *ptr, FunctionRNA *func)
static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix)
{
/* XXX hard limits should be checked here */
- const int type= RNA_property_type(prop);
+ const int type = RNA_property_type(prop);
if (RNA_property_array_check(prop)) {
@@ -1489,9 +1487,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
* however so many poll functions return None or a valid Object.
* its a hassle to convert these into a bool before returning, */
if (RNA_property_flag(prop) & PROP_OUTPUT)
- param= PyObject_IsTrue(value);
+ param = PyObject_IsTrue(value);
else
- param= PyLong_AsLong(value);
+ param = PyLong_AsLong(value);
if (param < 0) {
PyErr_Format(PyExc_TypeError,
@@ -1501,7 +1499,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return -1;
}
else {
- if (data) *((int*)data)= param;
+ if (data) *((int *)data)= param;
else RNA_property_boolean_set(ptr, prop, param);
}
break;
@@ -1509,7 +1507,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
case PROP_INT:
{
int overflow;
- long param= PyLong_AsLongAndOverflow(value, &overflow);
+ long param = PyLong_AsLongAndOverflow(value, &overflow);
if (overflow || (param > INT_MAX) || (param < INT_MIN)) {
PyErr_Format(PyExc_ValueError,
"%.200s %.200s.%.200s value not in 'int' range "
@@ -1518,7 +1516,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
RNA_property_identifier(prop));
return -1;
}
- else if (param==-1 && PyErr_Occurred()) {
+ else if (param == -1 && PyErr_Occurred()) {
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s expected an int type, not %.200s",
error_prefix, RNA_struct_identifier(ptr->type),
@@ -1526,16 +1524,16 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return -1;
}
else {
- int param_i= (int)param;
+ int param_i = (int)param;
RNA_property_int_clamp(ptr, prop, &param_i);
- if (data) *((int*)data)= param_i;
+ if (data) *((int *)data)= param_i;
else RNA_property_int_set(ptr, prop, param_i);
}
break;
}
case PROP_FLOAT:
{
- float param= PyFloat_AsDouble(value);
+ float param = PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s expected a float type, not %.200s",
@@ -1545,23 +1543,23 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
else {
RNA_property_float_clamp(ptr, prop, (float *)&param);
- if (data) *((float*)data)= param;
+ if (data) *((float *)data)= param;
else RNA_property_float_set(ptr, prop, param);
}
break;
}
case PROP_STRING:
{
- const int subtype= RNA_property_subtype(prop);
+ const int subtype = RNA_property_subtype(prop);
const char *param;
if (subtype == PROP_BYTESTRING) {
/* Byte String */
- param= PyBytes_AsString(value);
+ param = PyBytes_AsString(value);
- if (param==NULL) {
+ if (param == NULL) {
if (PyBytes_Check(value)) {
/* there was an error assigning a string type,
* rather than setting a new error, prefix the existing one
@@ -1582,7 +1580,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
else {
/* same as unicode */
- if (data) *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
+ if (data) *((char **)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
else RNA_property_string_set(ptr, prop, param);
}
}
@@ -1591,25 +1589,25 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
/* Unicode String */
#ifdef USE_STRING_COERCE
- PyObject *value_coerce= NULL;
+ PyObject *value_coerce = NULL;
if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
/* TODO, get size */
- param= PyC_UnicodeAsByte(value, &value_coerce);
+ param = PyC_UnicodeAsByte(value, &value_coerce);
}
else {
- param= _PyUnicode_AsString(value);
+ param = _PyUnicode_AsString(value);
#ifdef WITH_INTERNATIONAL
if (subtype == PROP_TRANSLATE) {
- param= IFACE_(param);
+ param = IFACE_(param);
}
#endif // WITH_INTERNATIONAL
}
#else // USE_STRING_COERCE
- param= _PyUnicode_AsString(value);
+ param = _PyUnicode_AsString(value);
#endif // USE_STRING_COERCE
- if (param==NULL) {
+ if (param == NULL) {
if (PyUnicode_Check(value)) {
/* there was an error assigning a string type,
* rather than setting a new error, prefix the existing one
@@ -1630,7 +1628,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
else {
/* same as bytes */
- if (data) *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
+ if (data) *((char **)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
else RNA_property_string_set(ptr, prop, param);
}
#ifdef USE_STRING_COERCE
@@ -1641,7 +1639,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
case PROP_ENUM:
{
- int val= 0;
+ int val = 0;
/* type checkins is done by each function */
if (RNA_property_flag(prop) & PROP_ENUM_FLAG) {
@@ -1652,22 +1650,22 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
else {
/* simple enum string */
- if (!pyrna_string_to_enum(value, ptr, prop, &val, error_prefix) < 0) {
+ if (pyrna_string_to_enum(value, ptr, prop, &val, error_prefix) < 0) {
return -1;
}
}
- if (data) *((int*)data)= val;
+ if (data) *((int *)data)= val;
else RNA_property_enum_set(ptr, prop, val);
break;
}
case PROP_POINTER:
{
- PyObject *value_new= NULL;
+ PyObject *value_new = NULL;
- StructRNA *ptr_type= RNA_property_pointer_type(ptr, prop);
- int flag= RNA_property_flag(prop);
+ StructRNA *ptr_type = RNA_property_pointer_type(ptr, prop);
+ int flag = RNA_property_flag(prop);
/* this is really nasty!, so we can fake the operator having direct properties eg:
* layout.prop(self, "filepath")
@@ -1675,7 +1673,8 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
* layout.prop(self.properties, "filepath")
*
* we need to do this trick.
- * if the prop is not an operator type and the pyobject is an operator, use its properties in place of its self.
+ * if the prop is not an operator type and the pyobject is an operator,
+ * use its properties in place of its self.
*
* this is so bad that its almost a good reason to do away with fake 'self.properties -> self' class mixing
* if this causes problems in the future it should be removed.
@@ -1684,24 +1683,25 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
(BPy_StructRNA_Check(value)) &&
(RNA_struct_is_a(((BPy_StructRNA *)value)->ptr.type, &RNA_Operator))
) {
- value= PyObject_GetAttrString(value, "properties");
- value_new= value;
+ value = PyObject_GetAttrString(value, "properties");
+ value_new = value;
}
- /* if property is an OperatorProperties pointer and value is a map, forward back to pyrna_pydict_to_props */
+ /* if property is an OperatorProperties pointer and value is a map,
+ * forward back to pyrna_pydict_to_props */
if (RNA_struct_is_a(ptr_type, &RNA_OperatorProperties) && PyDict_Check(value)) {
- PointerRNA opptr= RNA_property_pointer_get(ptr, prop);
+ PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
return pyrna_pydict_to_props(&opptr, value, 0, error_prefix);
}
/* another exception, allow to pass a collection as an RNA property */
- if (Py_TYPE(value)==&pyrna_prop_collection_Type) { /* ok to ignore idprop collections */
+ if (Py_TYPE(value) == &pyrna_prop_collection_Type) { /* ok to ignore idprop collections */
PointerRNA c_ptr;
- BPy_PropertyRNA *value_prop= (BPy_PropertyRNA *)value;
+ BPy_PropertyRNA *value_prop = (BPy_PropertyRNA *)value;
if (RNA_property_collection_type_get(&value_prop->ptr, value_prop->prop, &c_ptr)) {
- value= pyrna_struct_CreatePyObject(&c_ptr);
- value_new= value;
+ value = pyrna_struct_CreatePyObject(&c_ptr);
+ value_new = value;
}
else {
PyErr_Format(PyExc_TypeError,
@@ -1728,7 +1728,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
RNA_property_identifier(prop), RNA_struct_identifier(ptr_type));
Py_XDECREF(value_new); return -1;
}
- else if (value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) {
+ else if ((value != Py_None) &&
+ ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA *)value)->ptr.id.data))
+ {
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s ID type does not support assignment to its self",
error_prefix, RNA_struct_identifier(ptr->type),
@@ -1736,30 +1738,30 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
Py_XDECREF(value_new); return -1;
}
else {
- BPy_StructRNA *param= (BPy_StructRNA*)value;
- int raise_error= FALSE;
+ BPy_StructRNA *param = (BPy_StructRNA *)value;
+ int raise_error = FALSE;
if (data) {
if (flag & PROP_RNAPTR) {
if (value == Py_None)
memset(data, 0, sizeof(PointerRNA));
else
- *((PointerRNA*)data)= param->ptr;
+ *((PointerRNA *)data)= param->ptr;
}
else if (value == Py_None) {
- *((void**)data)= NULL;
+ *((void **)data)= NULL;
}
else if (RNA_struct_is_a(param->ptr.type, ptr_type)) {
- *((void**)data)= param->ptr.data;
+ *((void **)data)= param->ptr.data;
}
else {
- raise_error= TRUE;
+ raise_error = TRUE;
}
}
else {
- /* data==NULL, assign to RNA */
+ /* data == NULL, assign to RNA */
if (value == Py_None) {
- PointerRNA valueptr= {{NULL}};
+ PointerRNA valueptr = {{NULL}};
RNA_property_pointer_set(ptr, prop, valueptr);
}
else if (RNA_struct_is_a(param->ptr.type, ptr_type)) {
@@ -1801,7 +1803,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
ListBase *lb;
CollectionPointerLink *link;
- lb= (data)? (ListBase*)data: NULL;
+ lb = (data) ? (ListBase *)data : NULL;
/* convert a sequence of dict's into a collection */
if (!PySequence_Check(value)) {
@@ -1812,11 +1814,11 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return -1;
}
- seq_len= PySequence_Size(value);
- for (i=0; i < seq_len; i++) {
- item= PySequence_GetItem(value, i);
+ seq_len = PySequence_Size(value);
+ for (i = 0; i < seq_len; i++) {
+ item = PySequence_GetItem(value, i);
- if (item==NULL) {
+ if (item == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s failed to get sequence index '%d' for an RNA collection",
error_prefix, RNA_struct_identifier(ptr->type),
@@ -1825,7 +1827,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return -1;
}
- if (PyDict_Check(item)==0) {
+ if (PyDict_Check(item) == 0) {
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s expected a each sequence "
"member to be a dict for an RNA collection, not %.200s",
@@ -1836,16 +1838,16 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
if (lb) {
- link= MEM_callocN(sizeof(CollectionPointerLink), "PyCollectionPointerLink");
- link->ptr= itemptr;
+ link = MEM_callocN(sizeof(CollectionPointerLink), "PyCollectionPointerLink");
+ link->ptr = itemptr;
BLI_addtail(lb, link);
}
else
RNA_property_collection_add(ptr, prop, &itemptr);
- if (pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) {
- PyObject *msg= PyC_ExceptionBuffer();
- const char *msg_char= _PyUnicode_AsString(msg);
+ if (pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection") == -1) {
+ PyObject *msg = PyC_ExceptionBuffer();
+ const char *msg_char = _PyUnicode_AsString(msg);
PyErr_Format(PyExc_TypeError,
"%.200s %.200s.%.200s error converting a member of a collection "
@@ -1888,17 +1890,17 @@ static PyObject *pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int in
static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, PyObject *value)
{
- int ret= 0;
- PointerRNA *ptr= &self->ptr;
- PropertyRNA *prop= self->prop;
+ int ret = 0;
+ PointerRNA *ptr = &self->ptr;
+ PropertyRNA *prop = self->prop;
- const int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int totdim = RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
/* char error_str[512]; */
if (pyrna_py_to_array_index(&self->ptr, self->prop, self->arraydim, self->arrayoffset, index, value, "") == -1) {
/* error is set */
- ret= -1;
+ ret = -1;
}
}
else {
@@ -1906,11 +1908,11 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
{
- int param= PyLong_AsLong(value);
+ int param = PyLong_AsLong(value);
if (param < 0 || param > 1) {
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
- ret= -1;
+ ret = -1;
}
else {
RNA_property_boolean_set_index(ptr, prop, index, param);
@@ -1919,10 +1921,10 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
case PROP_INT:
{
- int param= PyLong_AsLong(value);
- if (param==-1 && PyErr_Occurred()) {
+ int param = PyLong_AsLong(value);
+ if (param == -1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected an int type");
- ret= -1;
+ ret = -1;
}
else {
RNA_property_int_clamp(ptr, prop, &param);
@@ -1932,10 +1934,10 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
case PROP_FLOAT:
{
- float param= PyFloat_AsDouble(value);
+ float param = PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected a float type");
- ret= -1;
+ ret = -1;
}
else {
RNA_property_float_clamp(ptr, prop, &param);
@@ -1945,7 +1947,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
default:
PyErr_SetString(PyExc_AttributeError, "not an array type");
- ret= -1;
+ ret = -1;
break;
}
}
@@ -1994,7 +1996,7 @@ static int pyrna_prop_collection_bool(BPy_PropertyRNA *self)
PYRNA_PROP_CHECK_INT(self);
RNA_property_collection_begin(&self->ptr, self->prop, &iter);
- test= iter.valid;
+ test = iter.valid;
RNA_property_collection_end(&iter);
return test;
}
@@ -2018,7 +2020,7 @@ static int pyrna_prop_collection_bool(BPy_PropertyRNA *self)
static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum)
{
PointerRNA newptr;
- Py_ssize_t keynum_abs= keynum;
+ Py_ssize_t keynum_abs = keynum;
PYRNA_PROP_CHECK_OBJ(self);
@@ -2028,7 +2030,7 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
return pyrna_struct_CreatePyObject(&newptr);
}
else {
- const int len= RNA_property_collection_length(&self->ptr, self->prop);
+ const int len = RNA_property_collection_length(&self->ptr, self->prop);
if (keynum_abs >= len) {
PyErr_Format(PyExc_IndexError,
"bpy_prop_collection[index]: "
@@ -2048,15 +2050,15 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
/* values type must have been already checked */
static int pyrna_prop_collection_ass_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum, PyObject *value)
{
- Py_ssize_t keynum_abs= keynum;
- const PointerRNA *ptr= (value == Py_None) ? (&PointerRNA_NULL) : &((BPy_StructRNA *)value)->ptr;
+ Py_ssize_t keynum_abs = keynum;
+ const PointerRNA *ptr = (value == Py_None) ? (&PointerRNA_NULL) : &((BPy_StructRNA *)value)->ptr;
PYRNA_PROP_CHECK_INT(self);
PYRNA_PROP_COLLECTION_ABS_INDEX(-1);
if (RNA_property_collection_assign_int(&self->ptr, self->prop, keynum_abs, ptr) == 0) {
- const int len= RNA_property_collection_length(&self->ptr, self->prop);
+ const int len = RNA_property_collection_length(&self->ptr, self->prop);
if (keynum_abs >= len) {
PyErr_Format(PyExc_IndexError,
"bpy_prop_collection[index] = value: "
@@ -2080,7 +2082,7 @@ static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int
PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self);
- len= pyrna_prop_array_length(self);
+ len = pyrna_prop_array_length(self);
if (keynum < 0) keynum += len;
@@ -2107,9 +2109,18 @@ static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, cons
/* static PyObject *pyrna_prop_array_subscript_str(BPy_PropertyRNA *self, char *keyname) */
/* special case: bpy.data.objects["some_id_name", "//some_lib_name.blend"]
- * also for: bpy.data.objects.get(("some_id_name", "//some_lib_name.blend"), fallback) */
-static PyObject *pyrna_prop_collection_subscript_str_lib_pair(BPy_PropertyRNA *self, PyObject *key,
- const char *err_prefix, const short err_not_found)
+ * also for: bpy.data.objects.get(("some_id_name", "//some_lib_name.blend"), fallback)
+ *
+ * note:
+ * error codes since this is not to be called directly from python,
+ * this matches pythons __contains__ values capi.
+ * -1: exception set
+ * 0: not found
+ * 1: found */
+int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *self, PyObject *key,
+ const char *err_prefix, const short err_not_found,
+ PointerRNA *r_ptr
+ )
{
char *keyname;
@@ -2118,91 +2129,114 @@ static PyObject *pyrna_prop_collection_subscript_str_lib_pair(BPy_PropertyRNA *s
PyErr_Format(PyExc_KeyError,
"%s: tuple key must be a pair, not size %d",
err_prefix, PyTuple_GET_SIZE(key));
- return NULL;
+ return -1;
}
else if (self->ptr.type != &RNA_BlendData) {
PyErr_Format(PyExc_KeyError,
"%s: is only valid for bpy.data collections, not %.200s",
err_prefix, RNA_struct_identifier(self->ptr.type));
- return NULL;
+ return -1;
}
- else if ((keyname= _PyUnicode_AsString(PyTuple_GET_ITEM(key, 0))) == NULL) {
+ else if ((keyname = _PyUnicode_AsString(PyTuple_GET_ITEM(key, 0))) == NULL) {
PyErr_Format(PyExc_KeyError,
"%s: id must be a string, not %.200s",
err_prefix, Py_TYPE(PyTuple_GET_ITEM(key, 0))->tp_name);
- return NULL;
+ return -1;
}
else {
- PyObject *keylib= PyTuple_GET_ITEM(key, 1);
+ PyObject *keylib = PyTuple_GET_ITEM(key, 1);
Library *lib;
- PyObject *ret= NULL;
+ int found = FALSE;
if (keylib == Py_None) {
- lib= NULL;
+ lib = NULL;
}
else if (PyUnicode_Check(keylib)) {
- Main *bmain= self->ptr.data;
- const char *keylib_str= _PyUnicode_AsString(keylib);
- lib= BLI_findstring(&bmain->library, keylib_str, offsetof(Library, name));
+ Main *bmain = self->ptr.data;
+ const char *keylib_str = _PyUnicode_AsString(keylib);
+ lib = BLI_findstring(&bmain->library, keylib_str, offsetof(Library, name));
if (lib == NULL) {
if (err_not_found) {
PyErr_Format(PyExc_KeyError,
"%s: lib name '%.240s' "
"does not reference a valid library",
err_prefix, keylib_str);
+ return -1;
+ }
+ else {
+ return 0;
}
- return NULL;
}
}
else {
PyErr_Format(PyExc_KeyError,
"%s: lib must be a sting or None, not %.200s",
err_prefix, Py_TYPE(keylib)->tp_name);
- return NULL;
+ return -1;
}
/* lib is either a valid poniter or NULL,
* either way can do direct comparison with id.lib */
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- ID *id= itemptr.data; /* always an ID */
- if (id->lib == lib && (strncmp(keyname, id->name+2, sizeof(id->name)-2) == 0)) {
- ret= pyrna_struct_CreatePyObject(&itemptr);
+ ID *id = itemptr.data; /* always an ID */
+ if (id->lib == lib && (strncmp(keyname, id->name + 2, sizeof(id->name) - 2) == 0)) {
+ found = TRUE;
+ if (r_ptr) {
+ *r_ptr = itemptr;
+ }
break;
}
}
RNA_PROP_END;
/* we may want to fail silently as with collection.get() */
- if ((ret == NULL) && err_not_found) {
+ if ((found == FALSE) && err_not_found) {
/* only runs for getitem access so use fixed string */
PyErr_SetString(PyExc_KeyError,
"bpy_prop_collection[key, lib]: not found");
+ return -1;
}
+ else {
+ return found; /* 1 / 0, no exception */
+ }
+ }
+}
- return ret;
+static PyObject *pyrna_prop_collection_subscript_str_lib_pair(BPy_PropertyRNA *self, PyObject *key,
+ const char *err_prefix, const short err_not_found)
+{
+ PointerRNA ptr;
+ const int contains = pyrna_prop_collection_subscript_str_lib_pair_ptr(self, key, err_prefix, err_not_found, &ptr);
+
+ if (contains == 1) {
+ return pyrna_struct_CreatePyObject(&ptr);
+ }
+ else {
+ return NULL;
}
}
+
static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
{
CollectionPropertyIterator rna_macro_iter;
- int count= 0;
+ int count = 0;
PyObject *list;
PyObject *item;
PYRNA_PROP_CHECK_OBJ(self);
- list= PyList_New(0);
+ list = PyList_New(0);
/* first loop up-until the start */
for (RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter);
rna_macro_iter.valid;
RNA_property_collection_next(&rna_macro_iter))
{
- /* PointerRNA itemptr= rna_macro_iter.ptr; */
+ /* PointerRNA itemptr = rna_macro_iter.ptr; */
if (count == start) {
break;
}
@@ -2213,7 +2247,7 @@ static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py
for (; rna_macro_iter.valid;
RNA_property_collection_next(&rna_macro_iter))
{
- item= pyrna_struct_CreatePyObject(&rna_macro_iter.ptr);
+ item = pyrna_struct_CreatePyObject(&rna_macro_iter.ptr);
PyList_Append(list, item);
Py_DECREF(item);
@@ -2240,14 +2274,14 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self);
- tuple= PyTuple_New(stop - start);
+ tuple = PyTuple_New(stop - start);
/* PYRNA_PROP_CHECK_OBJ(self); isn't needed, internal use only */
- totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ totdim = RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
- for (count= start; count < stop; count++)
+ for (count = start; count < stop; count++)
PyTuple_SET_ITEM(tuple, count - start, pyrna_prop_array_to_py_index(self, count));
}
else {
@@ -2256,11 +2290,11 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
{
float values_stack[PYRNA_STACK_ARRAY];
float *values;
- if (length > PYRNA_STACK_ARRAY) { values= PyMem_MALLOC(sizeof(float) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = PyMem_MALLOC(sizeof(float) * length); }
+ else { values = values_stack; }
RNA_property_float_get_array(ptr, prop, values);
- for (count=start; count<stop; count++)
+ for (count = start; count < stop; count++)
PyTuple_SET_ITEM(tuple, count-start, PyFloat_FromDouble(values[count]));
if (values != values_stack) {
@@ -2272,11 +2306,11 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
{
int values_stack[PYRNA_STACK_ARRAY];
int *values;
- if (length > PYRNA_STACK_ARRAY) { values= PyMem_MALLOC(sizeof(int) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = PyMem_MALLOC(sizeof(int) * length); }
+ else { values = values_stack; }
RNA_property_boolean_get_array(ptr, prop, values);
- for (count=start; count<stop; count++)
+ for (count = start; count < stop; count++)
PyTuple_SET_ITEM(tuple, count-start, PyBool_FromLong(values[count]));
if (values != values_stack) {
@@ -2288,11 +2322,11 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
{
int values_stack[PYRNA_STACK_ARRAY];
int *values;
- if (length > PYRNA_STACK_ARRAY) { values= PyMem_MALLOC(sizeof(int) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = PyMem_MALLOC(sizeof(int) * length); }
+ else { values = values_stack; }
RNA_property_int_get_array(ptr, prop, values);
- for (count=start; count<stop; count++)
+ for (count = start; count < stop; count++)
PyTuple_SET_ITEM(tuple, count-start, PyLong_FromSsize_t(values[count]));
if (values != values_stack) {
@@ -2305,7 +2339,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
PyErr_SetString(PyExc_TypeError, "not an array type");
Py_DECREF(tuple);
- tuple= NULL;
+ tuple = NULL;
}
}
return tuple;
@@ -2319,15 +2353,15 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key));
}
else if (PyIndex_Check(key)) {
- Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
return pyrna_prop_collection_subscript_int(self, i);
}
else if (PySlice_Check(key)) {
- PySliceObject *key_slice= (PySliceObject *)key;
- Py_ssize_t step= 1;
+ PySliceObject *key_slice = (PySliceObject *)key;
+ Py_ssize_t step = 1;
if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
@@ -2340,7 +2374,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
else {
- Py_ssize_t start= 0, stop= PY_SSIZE_T_MAX;
+ Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
/* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */
if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) return NULL;
@@ -2348,7 +2382,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
if (start < 0 || stop < 0) {
/* only get the length for negative values */
- Py_ssize_t len= (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
+ Py_ssize_t len = (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
if (start < 0) start += len;
if (stop < 0) start += len;
}
@@ -2399,8 +2433,8 @@ static int pyrna_prop_collection_type_check(BPy_PropertyRNA *self, PyObject *val
Py_TYPE(value)->tp_name);
return -1;
}
- else if ((prop_srna= RNA_property_pointer_type(&self->ptr, self->prop))) {
- StructRNA *value_srna= ((BPy_StructRNA *)value)->ptr.type;
+ else if ((prop_srna = RNA_property_pointer_type(&self->ptr, self->prop))) {
+ StructRNA *value_srna = ((BPy_StructRNA *)value)->ptr.type;
if (RNA_struct_is_a(value_srna, prop_srna) == 0) {
PyErr_Format(PyExc_TypeError,
"bpy_prop_collection[key] = value: invalid, "
@@ -2444,7 +2478,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, PyObject *
else
#endif
if (PyIndex_Check(key)) {
- Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return -1;
@@ -2452,8 +2486,8 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, PyObject *
}
#if 0 /* TODO, fake slice assignment */
else if (PySlice_Check(key)) {
- PySliceObject *key_slice= (PySliceObject *)key;
- Py_ssize_t step= 1;
+ PySliceObject *key_slice = (PySliceObject *)key;
+ Py_ssize_t step = 1;
if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
@@ -2466,7 +2500,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, PyObject *
return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
else {
- Py_ssize_t start= 0, stop= PY_SSIZE_T_MAX;
+ Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
/* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */
if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) return NULL;
@@ -2474,7 +2508,7 @@ static int pyrna_prop_collection_ass_subscript(BPy_PropertyRNA *self, PyObject *
if (start < 0 || stop < 0) {
/* only get the length for negative values */
- Py_ssize_t len= (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
+ Py_ssize_t len = (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
if (start < 0) start += len;
if (stop < 0) start += len;
}
@@ -2506,14 +2540,14 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject
}
else */
if (PyIndex_Check(key)) {
- Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
return pyrna_prop_array_subscript_int(self, PyLong_AsLong(key));
}
else if (PySlice_Check(key)) {
- Py_ssize_t step= 1;
- PySliceObject *key_slice= (PySliceObject *)key;
+ Py_ssize_t step = 1;
+ PySliceObject *key_slice = (PySliceObject *)key;
if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
@@ -2524,11 +2558,11 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject
}
else if (key_slice->start == Py_None && key_slice->stop == Py_None) {
/* note, no significant advantage with optimizing [:] slice as with collections but include here for consistency with collection slice func */
- Py_ssize_t len= (Py_ssize_t)pyrna_prop_array_length(self);
+ Py_ssize_t len = (Py_ssize_t)pyrna_prop_array_length(self);
return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
}
else {
- int len= pyrna_prop_array_length(self);
+ int len = pyrna_prop_array_length(self);
Py_ssize_t start, stop, slicelength;
if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0)
@@ -2554,23 +2588,23 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop,
{
PyObject *value;
int count;
- void *values_alloc= NULL;
- int ret= 0;
+ void *values_alloc = NULL;
+ int ret = 0;
if (value_orig == NULL) {
PyErr_SetString(PyExc_TypeError,
- "bpy_prop_array[slice]= value: deleting with list types is not supported by bpy_struct");
+ "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct");
return -1;
}
- if (!(value=PySequence_Fast(value_orig, "bpy_prop_array[slice]= value: assignment is not a sequence type"))) {
+ if (!(value = PySequence_Fast(value_orig, "bpy_prop_array[slice] = value: assignment is not a sequence type"))) {
return -1;
}
if (PySequence_Fast_GET_SIZE(value) != stop-start) {
Py_DECREF(value);
PyErr_SetString(PyExc_TypeError,
- "bpy_prop_array[slice]= value: resizing bpy_struct arrays isn't supported");
+ "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported");
return -1;
}
@@ -2583,18 +2617,18 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop,
float min, max;
RNA_property_float_range(ptr, prop, &min, &max);
- if (length > PYRNA_STACK_ARRAY) { values= values_alloc= PyMem_MALLOC(sizeof(float) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = values_alloc = PyMem_MALLOC(sizeof(float) * length); }
+ else { values = values_stack; }
if (start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_float_get_array(ptr, prop, values);
- for (count=start; count<stop; count++) {
- fval= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
+ for (count = start; count < stop; count++) {
+ fval = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(fval, min, max);
- values[count]= fval;
+ values[count] = fval;
}
- if (PyErr_Occurred()) ret= -1;
+ if (PyErr_Occurred()) ret = -1;
else RNA_property_float_set_array(ptr, prop, values);
break;
}
@@ -2602,16 +2636,16 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop,
{
int values_stack[PYRNA_STACK_ARRAY];
int *values;
- if (length > PYRNA_STACK_ARRAY) { values= values_alloc= PyMem_MALLOC(sizeof(int) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = values_alloc = PyMem_MALLOC(sizeof(int) * length); }
+ else { values = values_stack; }
if (start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_boolean_get_array(ptr, prop, values);
- for (count=start; count<stop; count++)
- values[count]= PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
+ for (count = start; count < stop; count++)
+ values[count] = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
- if (PyErr_Occurred()) ret= -1;
+ if (PyErr_Occurred()) ret = -1;
else RNA_property_boolean_set_array(ptr, prop, values);
break;
}
@@ -2623,25 +2657,25 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop,
int min, max;
RNA_property_int_range(ptr, prop, &min, &max);
- if (length > PYRNA_STACK_ARRAY) { values= values_alloc= PyMem_MALLOC(sizeof(int) * length); }
- else { values= values_stack; }
+ if (length > PYRNA_STACK_ARRAY) { values = values_alloc = PyMem_MALLOC(sizeof(int) * length); }
+ else { values = values_stack; }
if (start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_int_get_array(ptr, prop, values);
- for (count=start; count<stop; count++) {
- ival= PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
+ for (count = start; count < stop; count++) {
+ ival = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(ival, min, max);
- values[count]= ival;
+ values[count] = ival;
}
- if (PyErr_Occurred()) ret= -1;
+ if (PyErr_Occurred()) ret = -1;
else RNA_property_int_set_array(ptr, prop, values);
break;
}
default:
PyErr_SetString(PyExc_TypeError, "not an array type");
- ret= -1;
+ ret = -1;
}
Py_DECREF(value);
@@ -2660,7 +2694,7 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k
PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self);
- len= pyrna_prop_array_length(self);
+ len = pyrna_prop_array_length(self);
if (keynum < 0) keynum += len;
@@ -2674,8 +2708,8 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k
static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject *key, PyObject *value)
{
- /* char *keyname= NULL; */ /* not supported yet */
- int ret= -1;
+ /* char *keyname = NULL; */ /* not supported yet */
+ int ret = -1;
PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self);
@@ -2683,39 +2717,39 @@ static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject *
PyErr_Format(PyExc_AttributeError,
"bpy_prop_collection: attribute \"%.200s\" from \"%.200s\" is read-only",
RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type));
- ret= -1;
+ ret = -1;
}
else if (PyIndex_Check(key)) {
- Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred()) {
- ret= -1;
+ ret = -1;
}
else {
- ret= prop_subscript_ass_array_int(self, i, value);
+ ret = prop_subscript_ass_array_int(self, i, value);
}
}
else if (PySlice_Check(key)) {
- int len= RNA_property_array_length(&self->ptr, self->prop);
+ int len = RNA_property_array_length(&self->ptr, self->prop);
Py_ssize_t start, stop, step, slicelength;
if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0) {
- ret= -1;
+ ret = -1;
}
else if (slicelength <= 0) {
- ret= 0; /* do nothing */
+ ret = 0; /* do nothing */
}
else if (step == 1) {
- ret= prop_subscript_ass_array_slice(&self->ptr, self->prop, start, stop, len, value);
+ ret = prop_subscript_ass_array_slice(&self->ptr, self->prop, start, stop, len, value);
}
else {
PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna");
- ret= -1;
+ ret = -1;
}
}
else {
PyErr_SetString(PyExc_AttributeError, "invalid key, key must be an int");
- ret= -1;
+ ret = -1;
}
if (ret != -1) {
@@ -2728,20 +2762,20 @@ static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject *
}
/* for slice only */
-static PyMappingMethods pyrna_prop_array_as_mapping= {
+static PyMappingMethods pyrna_prop_array_as_mapping = {
(lenfunc) pyrna_prop_array_length, /* mp_length */
(binaryfunc) pyrna_prop_array_subscript, /* mp_subscript */
(objobjargproc) pyrna_prop_array_ass_subscript, /* mp_ass_subscript */
};
-static PyMappingMethods pyrna_prop_collection_as_mapping= {
+static PyMappingMethods pyrna_prop_collection_as_mapping = {
(lenfunc) pyrna_prop_collection_length, /* mp_length */
(binaryfunc) pyrna_prop_collection_subscript, /* mp_subscript */
(objobjargproc) pyrna_prop_collection_ass_subscript, /* mp_ass_subscript */
};
/* only for fast bool's, large structs, assign nb_bool on init */
-static PyNumberMethods pyrna_prop_array_as_number= {
+static PyNumberMethods pyrna_prop_array_as_number = {
NULL, /* nb_add */
NULL, /* nb_subtract */
NULL, /* nb_multiply */
@@ -2753,7 +2787,7 @@ static PyNumberMethods pyrna_prop_array_as_number= {
NULL, /* nb_absolute */
(inquiry) pyrna_prop_array_bool, /* nb_bool */
};
-static PyNumberMethods pyrna_prop_collection_as_number= {
+static PyNumberMethods pyrna_prop_collection_as_number = {
NULL, /* nb_add */
NULL, /* nb_subtract */
NULL, /* nb_multiply */
@@ -2771,28 +2805,36 @@ static int pyrna_prop_array_contains(BPy_PropertyRNA *self, PyObject *value)
return pyrna_array_contains_py(&self->ptr, self->prop, value);
}
-static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value)
+static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *key)
{
PointerRNA newptr; /* not used, just so RNA_property_collection_lookup_string runs */
- /* key in dict style check */
- const char *keyname= _PyUnicode_AsString(value);
-
- if (keyname==NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.__contains__: expected a string");
- return -1;
+ if (PyTuple_Check(key)) {
+ /* special case, for ID datablocks we */
+ return pyrna_prop_collection_subscript_str_lib_pair_ptr(self, key,
+ "(id, lib) in bpy_prop_collection", FALSE, NULL);
}
+ else {
- if (RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
- return 1;
+ /* key in dict style check */
+ const char *keyname = _PyUnicode_AsString(key);
- return 0;
+ if (keyname == NULL) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.__contains__: expected a string or a typle of strings");
+ return -1;
+ }
+
+ if (RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
+ return 1;
+
+ return 0;
+ }
}
static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
{
IDProperty *group;
- const char *name= _PyUnicode_AsString(value);
+ const char *name = _PyUnicode_AsString(value);
PYRNA_STRUCT_CHECK_INT(self);
@@ -2801,12 +2843,12 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
return -1;
}
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesn't support IDProperties");
return -1;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
if (!group)
return 0;
@@ -2814,7 +2856,7 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
return IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
-static PySequenceMethods pyrna_prop_array_as_sequence= {
+static PySequenceMethods pyrna_prop_array_as_sequence = {
(lenfunc)pyrna_prop_array_length, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -2827,7 +2869,7 @@ static PySequenceMethods pyrna_prop_array_as_sequence= {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PySequenceMethods pyrna_prop_collection_as_sequence= {
+static PySequenceMethods pyrna_prop_collection_as_sequence = {
(lenfunc)pyrna_prop_collection_length, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -2840,7 +2882,7 @@ static PySequenceMethods pyrna_prop_collection_as_sequence= {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PySequenceMethods pyrna_struct_as_sequence= {
+static PySequenceMethods pyrna_struct_as_sequence = {
NULL, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -2857,30 +2899,30 @@ static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key)
{
/* mostly copied from BPy_IDGroup_Map_GetItem */
IDProperty *group, *idprop;
- const char *name= _PyUnicode_AsString(key);
+ const char *name = _PyUnicode_AsString(key);
PYRNA_STRUCT_CHECK_OBJ(self);
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
- if (name==NULL) {
+ if (name == NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_struct[key]: only strings are allowed as keys of ID properties");
return NULL;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
- if (group==NULL) {
+ if (group == NULL) {
PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
- idprop= IDP_GetPropertyFromGroup(group, name);
+ idprop = IDP_GetPropertyFromGroup(group, name);
- if (idprop==NULL) {
+ if (idprop == NULL) {
PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
@@ -2894,7 +2936,7 @@ static int pyrna_struct_ass_subscript(BPy_StructRNA *self, PyObject *key, PyObje
PYRNA_STRUCT_CHECK_INT(self);
- group= RNA_struct_idprops(&self->ptr, 1);
+ group = RNA_struct_idprops(&self->ptr, 1);
#ifdef USE_PEDANTIC_WRITE
if (rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
@@ -2902,15 +2944,15 @@ static int pyrna_struct_ass_subscript(BPy_StructRNA *self, PyObject *key, PyObje
}
#endif // USE_PEDANTIC_WRITE
- if (group==NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_struct[key]= val: id properties not supported for this type");
+ if (group == NULL) {
+ PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id properties not supported for this type");
return -1;
}
return BPy_Wrap_SetMapItem(group, key, value);
}
-static PyMappingMethods pyrna_struct_as_mapping= {
+static PyMappingMethods pyrna_struct_as_mapping = {
(lenfunc) NULL, /* mp_length */
(binaryfunc) pyrna_struct_subscript, /* mp_subscript */
(objobjargproc) pyrna_struct_ass_subscript, /* mp_ass_subscript */
@@ -2931,14 +2973,14 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self)
{
IDProperty *group;
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
- if (group==NULL)
+ if (group == NULL)
return PyList_New(0);
return BPy_Wrap_GetKeys(group);
@@ -2959,14 +3001,14 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self)
{
IDProperty *group;
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
- if (group==NULL)
+ if (group == NULL)
return PyList_New(0);
return BPy_Wrap_GetItems(self->ptr.id.data, group);
@@ -2987,14 +3029,14 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
{
IDProperty *group;
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
- if (group==NULL)
+ if (group == NULL)
return PyList_New(0);
return BPy_Wrap_GetValues(self->ptr.id.data, group);
@@ -3020,7 +3062,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
return NULL;
- if ((prop= RNA_struct_find_property(&self->ptr, name)) == NULL) {
+ if ((prop = RNA_struct_find_property(&self->ptr, name)) == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s.is_property_set(\"%.200s\") not found",
RNA_struct_identifier(self->ptr.type), name);
@@ -3030,16 +3072,16 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
/* double property lookup, could speed up */
/* return PyBool_FromLong(RNA_property_is_set(&self->ptr, name)); */
if (RNA_property_flag(prop) & PROP_IDPROPERTY) {
- IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
+ IDProperty *group = RNA_struct_idprops(&self->ptr, 0);
if (group) {
- ret= IDP_GetPropertyFromGroup(group, name) ? 1:0;
+ ret = IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
else {
- ret= 0;
+ ret = 0;
}
}
else {
- ret= 1;
+ ret = 1;
}
return PyBool_FromLong(ret);
@@ -3063,7 +3105,7 @@ static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *
if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
return NULL;
- if ((prop= RNA_struct_find_property(&self->ptr, name)) == NULL) {
+ if ((prop = RNA_struct_find_property(&self->ptr, name)) == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s.is_property_hidden(\"%.200s\") not found",
RNA_struct_identifier(self->ptr.type), name);
@@ -3087,10 +3129,10 @@ PyDoc_STRVAR(pyrna_struct_path_resolve_doc,
static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
{
const char *path;
- PyObject *coerce= Py_True;
+ PyObject *coerce = Py_True;
PointerRNA r_ptr;
PropertyRNA *r_prop;
- int index= -1;
+ int index = -1;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -3145,7 +3187,7 @@ PyDoc_STRVAR(pyrna_struct_path_from_id_doc,
);
static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
{
- const char *name= NULL;
+ const char *name = NULL;
const char *path;
PropertyRNA *prop;
PyObject *ret;
@@ -3156,21 +3198,21 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
return NULL;
if (name) {
- prop= RNA_struct_find_property(&self->ptr, name);
- if (prop==NULL) {
+ prop = RNA_struct_find_property(&self->ptr, name);
+ if (prop == NULL) {
PyErr_Format(PyExc_AttributeError,
"%.200s.path_from_id(\"%.200s\") not found",
RNA_struct_identifier(self->ptr.type), name);
return NULL;
}
- path= RNA_path_from_ID_to_property(&self->ptr, prop);
+ path = RNA_path_from_ID_to_property(&self->ptr, prop);
}
else {
- path= RNA_path_from_ID_to_struct(&self->ptr);
+ path = RNA_path_from_ID_to_struct(&self->ptr);
}
- if (path==NULL) {
+ if (path == NULL) {
if (name) {
PyErr_Format(PyExc_ValueError,
"%.200s.path_from_id(\"%s\") found but does not support path creation",
@@ -3184,7 +3226,7 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
return NULL;
}
- ret= PyUnicode_FromString(path);
+ ret = PyUnicode_FromString(path);
MEM_freeN((void *)path);
return ret;
@@ -3201,19 +3243,19 @@ PyDoc_STRVAR(pyrna_prop_path_from_id_doc,
static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
{
const char *path;
- PropertyRNA *prop= self->prop;
+ PropertyRNA *prop = self->prop;
PyObject *ret;
- path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
+ path = RNA_path_from_ID_to_property(&self->ptr, self->prop);
- if (path==NULL) {
+ if (path == NULL) {
PyErr_Format(PyExc_ValueError,
"%.200s.%.200s.path_from_id() does not support path creation for this type",
RNA_struct_identifier(self->ptr.type), RNA_property_identifier(prop));
return NULL;
}
- ret= PyUnicode_FromString(path);
+ ret = PyUnicode_FromString(path);
MEM_freeN((void *)path);
return ret;
@@ -3244,17 +3286,17 @@ static void pyrna_dir_members_py(PyObject *list, PyObject *self)
PyObject **dict_ptr;
PyObject *list_tmp;
- dict_ptr= _PyObject_GetDictPtr((PyObject *)self);
+ dict_ptr = _PyObject_GetDictPtr((PyObject *)self);
- if (dict_ptr && (dict=*dict_ptr)) {
- list_tmp= PyDict_Keys(dict);
+ if (dict_ptr && (dict = *dict_ptr)) {
+ list_tmp = PyDict_Keys(dict);
PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
Py_DECREF(list_tmp);
}
- dict= ((PyTypeObject *)Py_TYPE(self))->tp_dict;
+ dict = ((PyTypeObject *)Py_TYPE(self))->tp_dict;
if (dict) {
- list_tmp= PyDict_Keys(dict);
+ list_tmp = PyDict_Keys(dict);
PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
Py_DECREF(list_tmp);
}
@@ -3271,12 +3313,12 @@ static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
{
RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
- iterprop= RNA_struct_find_property(&tptr, "functions");
+ iterprop = RNA_struct_find_property(&tptr, "functions");
RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
- idname= RNA_function_identifier(itemptr.data);
+ idname = RNA_function_identifier(itemptr.data);
- pystring= PyUnicode_FromString(idname);
+ pystring = PyUnicode_FromString(idname);
PyList_Append(list, pystring);
Py_DECREF(pystring);
}
@@ -3290,13 +3332,13 @@ static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
char name[256], *nameptr;
int namelen;
- iterprop= RNA_struct_iterator_property(ptr->type);
+ iterprop = RNA_struct_iterator_property(ptr->type);
RNA_PROP_BEGIN(ptr, itemptr, iterprop) {
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
+ nameptr = RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
- pystring= PyUnicode_FromStringAndSize(nameptr, namelen);
+ pystring = PyUnicode_FromStringAndSize(nameptr, namelen);
PyList_Append(list, pystring);
Py_DECREF(pystring);
@@ -3320,7 +3362,7 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
* */
- ret= PyList_New(0);
+ ret = PyList_New(0);
if (!BPy_StructRNA_CheckExact(self))
pyrna_dir_members_py(ret, (PyObject *)self);
@@ -3328,11 +3370,11 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
pyrna_dir_members_rna(ret, &self->ptr);
if (self->ptr.type == &RNA_Context) {
- ListBase lb= CTX_data_dir_get(self->ptr.data);
+ ListBase lb = CTX_data_dir_get(self->ptr.data);
LinkData *link;
- for (link=lb.first; link; link=link->next) {
- pystring= PyUnicode_FromString(link->data);
+ for (link = lb.first; link; link = link->next) {
+ pystring = PyUnicode_FromString(link->data);
PyList_Append(ret, pystring);
Py_DECREF(pystring);
}
@@ -3344,10 +3386,10 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
/* set(), this is needed to remove-doubles because the deferred
* register-props will be in both the python __dict__ and accessed as RNA */
- PyObject *set= PySet_New(ret);
+ PyObject *set = PySet_New(ret);
Py_DECREF(ret);
- ret= PySequence_List(set);
+ ret = PySequence_List(set);
Py_DECREF(set);
}
@@ -3357,7 +3399,7 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
//---------------getattr--------------------------------------------
static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
{
- const char *name= _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
@@ -3366,49 +3408,49 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
if (name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: __getattr__ must be a string");
- ret= NULL;
+ ret = NULL;
}
- else if (name[0]=='_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
+ else if (name[0] == '_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
/* annoying exception, maybe we need to have different types for this... */
- if ((strcmp(name, "__getitem__")==0 || strcmp(name, "__setitem__")==0) && !RNA_struct_idprops_check(self->ptr.type)) {
+ if ((strcmp(name, "__getitem__") == 0 || strcmp(name, "__setitem__") == 0) && !RNA_struct_idprops_check(self->ptr.type)) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: no __getitem__ support for this type");
- ret= NULL;
+ ret = NULL;
}
else {
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
}
- else if ((prop= RNA_struct_find_property(&self->ptr, name))) {
- ret= pyrna_prop_to_py(&self->ptr, prop);
+ else if ((prop = RNA_struct_find_property(&self->ptr, name))) {
+ ret = pyrna_prop_to_py(&self->ptr, prop);
}
/* RNA function only if callback is declared (no optional functions) */
- else if ((func= RNA_struct_find_function(&self->ptr, name)) && RNA_function_defined(func)) {
- ret= pyrna_func_to_py(&self->ptr, func);
+ else if ((func = RNA_struct_find_function(&self->ptr, name)) && RNA_function_defined(func)) {
+ ret = pyrna_func_to_py(&self->ptr, func);
}
else if (self->ptr.type == &RNA_Context) {
- bContext *C= self->ptr.data;
- if (C==NULL) {
+ bContext *C = self->ptr.data;
+ if (C == NULL) {
PyErr_Format(PyExc_AttributeError,
"bpy_struct: Context is 'NULL', can't get \"%.200s\" from context",
name);
- ret= NULL;
+ ret = NULL;
}
else {
PointerRNA newptr;
ListBase newlb;
short newtype;
- int done= CTX_data_get(C, name, &newptr, &newlb, &newtype);
+ int done = CTX_data_get(C, name, &newptr, &newlb, &newtype);
- if (done==1) { /* found */
- switch(newtype) {
+ if (done == 1) { /* found */
+ switch (newtype) {
case CTX_DATA_TYPE_POINTER:
if (newptr.data == NULL) {
- ret= Py_None;
+ ret = Py_None;
Py_INCREF(ret);
}
else {
- ret= pyrna_struct_CreatePyObject(&newptr);
+ ret = pyrna_struct_CreatePyObject(&newptr);
}
break;
case CTX_DATA_TYPE_COLLECTION:
@@ -3416,10 +3458,10 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
CollectionPointerLink *link;
PyObject *linkptr;
- ret= PyList_New(0);
+ ret = PyList_New(0);
- for (link=newlb.first; link; link=link->next) {
- linkptr= pyrna_struct_CreatePyObject(&link->ptr);
+ for (link = newlb.first; link; link = link->next) {
+ linkptr = pyrna_struct_CreatePyObject(&link->ptr);
PyList_Append(ret, linkptr);
Py_DECREF(linkptr);
}
@@ -3432,16 +3474,16 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
PyErr_Format(PyExc_AttributeError,
"bpy_struct: Context type invalid %d, can't get \"%.200s\" from context",
newtype, name);
- ret= NULL;
+ ret = NULL;
}
}
- else if (done==-1) { /* found but not set */
- ret= Py_None;
+ else if (done == -1) { /* found but not set */
+ ret = Py_None;
Py_INCREF(ret);
}
else { /* not found in the context */
/* lookup the subclass. raise an error if its not found */
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
BLI_freelistN(&newlb);
@@ -3452,7 +3494,7 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
PyErr_Format(PyExc_AttributeError,
"bpy_struct: attribute \"%.200s\" not found",
name);
- ret= NULL;
+ ret = NULL;
#endif
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
@@ -3461,7 +3503,7 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
* */
/* The error raised here will be displayed */
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
return ret;
@@ -3470,8 +3512,8 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
#if 0
static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname)
{
- PyObject *dict= *(_PyObject_GetDictPtr((PyObject *)self));
- if (dict==NULL) /* unlikely */
+ PyObject *dict = *(_PyObject_GetDictPtr((PyObject *)self));
+ if (dict == NULL) /* unlikely */
return 0;
return PyDict_Contains(dict, pyname);
@@ -3490,25 +3532,25 @@ static int pyrna_is_deferred_prop(const PyObject *value)
#if 0
static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr)
{
- PyObject *ret= PyType_Type.tp_getattro(cls, attr);
+ PyObject *ret = PyType_Type.tp_getattro(cls, attr);
/* Allows:
- * >>> bpy.types.Scene.foo= BoolProperty()
+ * >>> bpy.types.Scene.foo = BoolProperty()
* >>> bpy.types.Scene.foo
- * <bpy_struct, BooleanProperty("foo")>
+ * <bpy_struct, BoolProperty("foo")>
* ...rather than returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
*
* Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
#if 0
if (ret == NULL) { // || pyrna_is_deferred_prop(ret)
- StructRNA *srna= srna_from_self(cls, "StructRNA.__getattr__");
+ StructRNA *srna = srna_from_self(cls, "StructRNA.__getattr__");
if (srna) {
- PropertyRNA *prop= RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr));
+ PropertyRNA *prop = RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr));
if (prop) {
PointerRNA tptr;
PyErr_Clear(); /* clear error from tp_getattro */
RNA_pointer_create(NULL, &RNA_Property, prop, &tptr);
- ret= pyrna_struct_CreatePyObject(&tptr);
+ ret = pyrna_struct_CreatePyObject(&tptr);
}
}
}
@@ -3520,9 +3562,9 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
{
- StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
- const int is_deferred_prop= (value && pyrna_is_deferred_prop(value));
- const char *attr_str= _PyUnicode_AsString(attr);
+ StructRNA *srna = srna_from_self(cls, "StructRNA.__setattr__");
+ const int is_deferred_prop = (value && pyrna_is_deferred_prop(value));
+ const char *attr_str = _PyUnicode_AsString(attr);
if (srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, attr_str))) {
PyErr_Format(PyExc_AttributeError,
@@ -3550,7 +3592,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
if (value) {
/* check if the value is a property */
if (is_deferred_prop) {
- int ret= deferred_register_prop(srna, attr, value);
+ int ret = deferred_register_prop(srna, attr, value);
if (ret == -1) {
/* error set */
return ret;
@@ -3567,7 +3609,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
}
else { /* __delattr__ */
/* first find if this is a registered property */
- const int ret= RNA_def_property_free_identifier(srna, attr_str);
+ const int ret = RNA_def_property_free_identifier(srna, attr_str);
if (ret == -1) {
PyErr_Format(PyExc_TypeError,
"struct_meta_idprop.detattr(): '%s' not a dynamic property",
@@ -3582,8 +3624,8 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name= _PyUnicode_AsString(pyname);
- PropertyRNA *prop= NULL;
+ const char *name = _PyUnicode_AsString(pyname);
+ PropertyRNA *prop = NULL;
PYRNA_STRUCT_CHECK_INT(self);
@@ -3597,7 +3639,7 @@ static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject
PyErr_SetString(PyExc_AttributeError, "bpy_struct: __setattr__ must be a string");
return -1;
}
- else if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) {
+ else if (name[0] != '_' && (prop = RNA_struct_find_property(&self->ptr, name))) {
if (!RNA_property_editable_flag(&self->ptr, prop)) {
PyErr_Format(PyExc_AttributeError,
"bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only",
@@ -3607,8 +3649,8 @@ static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject
}
else if (self->ptr.type == &RNA_Context) {
/* code just raises correct error, context prop's cant be set, unless its apart of the py class */
- bContext *C= self->ptr.data;
- if (C==NULL) {
+ bContext *C = self->ptr.data;
+ if (C == NULL) {
PyErr_Format(PyExc_AttributeError,
"bpy_struct: Context is 'NULL', can't set \"%.200s\" from context",
name);
@@ -3619,9 +3661,9 @@ static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject
ListBase newlb;
short newtype;
- int done= CTX_data_get(C, name, &newptr, &newlb, &newtype);
+ int done = CTX_data_get(C, name, &newptr, &newlb, &newtype);
- if (done==1) {
+ if (done == 1) {
PyErr_Format(PyExc_AttributeError,
"bpy_struct: Context property \"%.200s\" is read-only",
name);
@@ -3639,7 +3681,7 @@ static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject
PyErr_SetString(PyExc_AttributeError, "bpy_struct: del not supported");
return -1;
}
- return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr= val:");
+ return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr = val:");
}
else {
return PyObject_GenericSetAttr((PyObject *)self, pyname, value);
@@ -3654,7 +3696,7 @@ static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self)
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
* */
- ret= PyList_New(0);
+ ret = PyList_New(0);
if (!BPy_PropertyRNA_CheckExact(self)) {
pyrna_dir_members_py(ret, (PyObject *)self);
@@ -3677,7 +3719,7 @@ static PyObject *pyrna_prop_array_getattro(BPy_PropertyRNA *self, PyObject *pyna
static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject *pyname)
{
- const char *name= _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
if (name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string");
@@ -3690,14 +3732,14 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject
PointerRNA r_ptr;
if (RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
- if ((prop= RNA_struct_find_property(&r_ptr, name))) {
- ret= pyrna_prop_to_py(&r_ptr, prop);
+ if ((prop = RNA_struct_find_property(&r_ptr, name))) {
+ ret = pyrna_prop_to_py(&r_ptr, prop);
return ret;
}
- else if ((func= RNA_struct_find_function(&r_ptr, name))) {
- PyObject *self_collection= pyrna_struct_CreatePyObject(&r_ptr);
- ret= pyrna_func_to_py(&((BPy_DummyPointerRNA *)self_collection)->ptr, func);
+ else if ((func = RNA_struct_find_function(&r_ptr, name))) {
+ PyObject *self_collection = pyrna_struct_CreatePyObject(&r_ptr);
+ ret = pyrna_func_to_py(&((BPy_DummyPointerRNA *)self_collection)->ptr, func);
Py_DECREF(self_collection);
return ret;
@@ -3714,7 +3756,7 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject
* so as to support 'bpy.data.library.load()'
* note, this _only_ supports static methods */
- PyObject *ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ PyObject *ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
if (ret == NULL && name[0] != '_') { /* avoid inheriting __call__ and similar */
/* since this is least common case, handle it last */
@@ -3726,8 +3768,8 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject
PyErr_Fetch(&error_type, &error_value, &error_traceback);
PyErr_Clear();
- cls= pyrna_struct_Subtype(&r_ptr); /* borrows */
- ret= PyObject_GenericGetAttr(cls, pyname);
+ cls = pyrna_struct_Subtype(&r_ptr); /* borrows */
+ ret = PyObject_GenericGetAttr(cls, pyname);
/* restore the original error */
if (ret == NULL) {
PyErr_Restore(error_type, error_value, error_traceback);
@@ -3743,7 +3785,7 @@ static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject
//--------------- setattr-------------------------------------------
static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name= _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PropertyRNA *prop;
PointerRNA r_ptr;
@@ -3762,7 +3804,7 @@ static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pynam
return -1;
}
else if (RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
- if ((prop= RNA_struct_find_property(&r_ptr, name))) {
+ if ((prop = RNA_struct_find_property(&r_ptr, name))) {
/* pyrna_py_to_prop sets its own exceptions */
return pyrna_py_to_prop(&r_ptr, prop, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
}
@@ -3791,9 +3833,9 @@ static PyObject *pyrna_prop_collection_idprop_add(BPy_PropertyRNA *self)
static PyObject *pyrna_prop_collection_idprop_remove(BPy_PropertyRNA *self, PyObject *value)
{
- int key= PyLong_AsLong(value);
+ int key = PyLong_AsLong(value);
- if (key==-1 && PyErr_Occurred()) {
+ if (key == -1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.remove(): expected one int argument");
return NULL;
}
@@ -3808,7 +3850,7 @@ static PyObject *pyrna_prop_collection_idprop_remove(BPy_PropertyRNA *self, PyOb
static PyObject *pyrna_prop_collection_idprop_move(BPy_PropertyRNA *self, PyObject *args)
{
- int key=0, pos=0;
+ int key = 0, pos = 0;
if (!PyArg_ParseTuple(args, "ii", &key, &pos)) {
PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments");
@@ -3863,14 +3905,14 @@ static PyObject *pyrna_struct_get_rna_type(BPy_PropertyRNA *self)
/* Python attributes get/set structure: */
/*****************************************************************************/
-static PyGetSetDef pyrna_prop_getseters[]= {
+static PyGetSetDef pyrna_prop_getseters[] = {
{(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)pyrna_struct_get_id_data_doc, NULL},
{(char *)"data", (getter)pyrna_struct_get_data, (setter)NULL, (char *)pyrna_struct_get_data_doc, NULL},
{(char *)"rna_type", (getter)pyrna_struct_get_rna_type, (setter)NULL, (char *)pyrna_struct_get_rna_type_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
-static PyGetSetDef pyrna_struct_getseters[]= {
+static PyGetSetDef pyrna_struct_getseters[] = {
{(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)pyrna_struct_get_id_data_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -3887,17 +3929,17 @@ PyDoc_STRVAR(pyrna_prop_collection_keys_doc,
);
static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
{
- PyObject *ret= PyList_New(0);
+ PyObject *ret = PyList_New(0);
PyObject *item;
char name[256], *nameptr;
int namelen;
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
+ nameptr = RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
/* add to python list */
- item= PyUnicode_FromStringAndSize(nameptr, namelen);
+ item = PyUnicode_FromStringAndSize(nameptr, namelen);
PyList_Append(ret, item);
Py_DECREF(item);
/* done */
@@ -3923,17 +3965,17 @@ PyDoc_STRVAR(pyrna_prop_collection_items_doc,
);
static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
{
- PyObject *ret= PyList_New(0);
+ PyObject *ret = PyList_New(0);
PyObject *item;
char name[256], *nameptr;
int namelen;
- int i= 0;
+ int i = 0;
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
if (itemptr.data) {
/* add to python list */
- item= PyTuple_New(2);
- nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
+ item = PyTuple_New(2);
+ nameptr = RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
if (nameptr) {
PyTuple_SET_ITEM(item, 0, PyUnicode_FromStringAndSize(nameptr, namelen));
if (name != nameptr)
@@ -3990,7 +4032,7 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
IDProperty *group, *idprop;
const char *key;
- PyObject* def= Py_None;
+ PyObject* def = Py_None;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -3998,14 +4040,14 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
return NULL;
/* mostly copied from BPy_IDGroup_Map_GetItem */
- if (RNA_struct_idprops_check(self->ptr.type)==0) {
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
- group= RNA_struct_idprops(&self->ptr, 0);
+ group = RNA_struct_idprops(&self->ptr, 0);
if (group) {
- idprop= IDP_GetPropertyFromGroup(group, key);
+ idprop = IDP_GetPropertyFromGroup(group, key);
if (idprop) {
return BPy_IDGroup_WrapData(self->ptr.id.data, idprop, group);
@@ -4049,7 +4091,7 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args
PointerRNA newptr;
PyObject *key_ob;
- PyObject* def= Py_None;
+ PyObject* def = Py_None;
PYRNA_PROP_CHECK_OBJ(self);
@@ -4057,13 +4099,13 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args
return NULL;
if (PyUnicode_Check(key_ob)) {
- const char *key= _PyUnicode_AsString(key_ob);
+ const char *key = _PyUnicode_AsString(key_ob);
if (RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr))
return pyrna_struct_CreatePyObject(&newptr);
}
else if (PyTuple_Check(key_ob)) {
- PyObject *ret= pyrna_prop_collection_subscript_str_lib_pair(self, key_ob,
+ PyObject *ret = pyrna_prop_collection_subscript_str_lib_pair(self, key_ob,
"bpy_prop_collection.get((id, lib))", FALSE);
if (ret) {
return ret;
@@ -4083,16 +4125,16 @@ static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
{
PropertyRNA *prop;
- *raw_type= PROP_RAW_UNSET;
- *attr_tot= 0;
- *attr_signed= FALSE;
+ *raw_type = PROP_RAW_UNSET;
+ *attr_tot = 0;
+ *attr_signed = FALSE;
/* note: this is fail with zero length lists, so dont let this get caled in that case */
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- prop= RNA_struct_find_property(&itemptr, attr);
- *raw_type= RNA_property_raw_type(prop);
- *attr_tot= RNA_property_array_length(&itemptr, prop);
- *attr_signed= (RNA_property_subtype(prop)==PROP_UNSIGNED) ? FALSE:TRUE;
+ prop = RNA_struct_find_property(&itemptr, attr);
+ *raw_type = RNA_property_raw_type(prop);
+ *attr_tot = RNA_property_array_length(&itemptr, prop);
+ *attr_signed = (RNA_property_subtype(prop) == PROP_UNSIGNED) ? FALSE:TRUE;
break;
}
RNA_PROP_END;
@@ -4112,31 +4154,31 @@ static int foreach_parse_args(
int target_tot;
#endif
- *size= *attr_tot= *attr_signed= FALSE;
- *raw_type= PROP_RAW_UNSET;
+ *size = *attr_tot = *attr_signed = FALSE;
+ *raw_type = PROP_RAW_UNSET;
if (!PyArg_ParseTuple(args, "sO", attr, seq) || (!PySequence_Check(*seq) && PyObject_CheckBuffer(*seq))) {
PyErr_SetString(PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence");
return -1;
}
- *tot= PySequence_Size(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
+ *tot = PySequence_Size(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
- if (*tot>0) {
+ if (*tot > 0) {
foreach_attr_type(self, *attr, raw_type, attr_tot, attr_signed);
- *size= RNA_raw_type_sizeof(*raw_type);
+ *size = RNA_raw_type_sizeof(*raw_type);
#if 0 // works fine but not strictly needed, we could allow RNA_property_collection_raw_* to do the checks
if ((*attr_tot) < 1)
- *attr_tot= 1;
+ *attr_tot = 1;
if (RNA_property_type(self->prop) == PROP_COLLECTION)
- array_tot= RNA_property_collection_length(&self->ptr, self->prop);
+ array_tot = RNA_property_collection_length(&self->ptr, self->prop);
else
- array_tot= RNA_property_array_length(&self->ptr, self->prop);
+ array_tot = RNA_property_array_length(&self->ptr, self->prop);
- target_tot= array_tot * (*attr_tot);
+ target_tot = array_tot * (*attr_tot);
/* rna_access.c - rna_raw_access(...) uses this same method */
if (target_tot != (*tot)) {
@@ -4159,22 +4201,22 @@ static int foreach_parse_args(
static int foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, const char *format)
{
- char f= format ? *format:'B'; /* B is assumed when not set */
+ char f = format ? *format:'B'; /* B is assumed when not set */
- switch(raw_type) {
+ switch (raw_type) {
case PROP_RAW_CHAR:
- if (attr_signed) return (f=='b') ? 1:0;
- else return (f=='B') ? 1:0;
+ if (attr_signed) return (f == 'b') ? 1:0;
+ else return (f == 'B') ? 1:0;
case PROP_RAW_SHORT:
- if (attr_signed) return (f=='h') ? 1:0;
- else return (f=='H') ? 1:0;
+ if (attr_signed) return (f == 'h') ? 1:0;
+ else return (f == 'H') ? 1:0;
case PROP_RAW_INT:
- if (attr_signed) return (f=='i') ? 1:0;
- else return (f=='I') ? 1:0;
+ if (attr_signed) return (f == 'i') ? 1:0;
+ else return (f == 'I') ? 1:0;
case PROP_RAW_FLOAT:
- return (f=='f') ? 1:0;
+ return (f == 'f') ? 1:0;
case PROP_RAW_DOUBLE:
- return (f=='d') ? 1:0;
+ return (f == 'd') ? 1:0;
case PROP_RAW_UNSET:
return 0;
}
@@ -4184,9 +4226,9 @@ static int foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, cons
static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
{
- PyObject *item= NULL;
- int i=0, ok=0, buffer_is_compat;
- void *array= NULL;
+ PyObject *item = NULL;
+ int i = 0, ok = 0, buffer_is_compat;
+ void *array = NULL;
/* get/set both take the same args currently */
const char *attr;
@@ -4197,23 +4239,23 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
if (foreach_parse_args(self, args, &attr, &seq, &tot, &size, &raw_type, &attr_tot, &attr_signed) < 0)
return NULL;
- if (tot==0)
+ if (tot == 0)
Py_RETURN_NONE;
if (set) { /* get the array from python */
- buffer_is_compat= FALSE;
+ buffer_is_compat = FALSE;
if (PyObject_CheckBuffer(seq)) {
Py_buffer buf;
PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
/* check if the buffer matches */
- buffer_is_compat= foreach_compat_buffer(raw_type, attr_signed, buf.format);
+ buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
if (buffer_is_compat) {
- ok= RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
}
PyBuffer_Release(&buf);
@@ -4221,25 +4263,25 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
/* could not use the buffer, fallback to sequence */
if (!buffer_is_compat) {
- array= PyMem_Malloc(size * tot);
+ array = PyMem_Malloc(size * tot);
- for ( ; i<tot; i++) {
- item= PySequence_GetItem(seq, i);
- switch(raw_type) {
+ for ( ; i < tot; i++) {
+ item = PySequence_GetItem(seq, i);
+ switch (raw_type) {
case PROP_RAW_CHAR:
- ((char *)array)[i]= (char)PyLong_AsLong(item);
+ ((char *)array)[i] = (char)PyLong_AsLong(item);
break;
case PROP_RAW_SHORT:
- ((short *)array)[i]= (short)PyLong_AsLong(item);
+ ((short *)array)[i] = (short)PyLong_AsLong(item);
break;
case PROP_RAW_INT:
- ((int *)array)[i]= (int)PyLong_AsLong(item);
+ ((int *)array)[i] = (int)PyLong_AsLong(item);
break;
case PROP_RAW_FLOAT:
- ((float *)array)[i]= (float)PyFloat_AsDouble(item);
+ ((float *)array)[i] = (float)PyFloat_AsDouble(item);
break;
case PROP_RAW_DOUBLE:
- ((double *)array)[i]= (double)PyFloat_AsDouble(item);
+ ((double *)array)[i] = (double)PyFloat_AsDouble(item);
break;
case PROP_RAW_UNSET:
/* should never happen */
@@ -4250,21 +4292,21 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
Py_DECREF(item);
}
- ok= RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+ ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
}
}
else {
- buffer_is_compat= FALSE;
+ buffer_is_compat = FALSE;
if (PyObject_CheckBuffer(seq)) {
Py_buffer buf;
PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
/* check if the buffer matches, TODO - signed/unsigned types */
- buffer_is_compat= foreach_compat_buffer(raw_type, attr_signed, buf.format);
+ buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
if (buffer_is_compat) {
- ok= RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
}
PyBuffer_Release(&buf);
@@ -4272,34 +4314,34 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
/* could not use the buffer, fallback to sequence */
if (!buffer_is_compat) {
- array= PyMem_Malloc(size * tot);
+ array = PyMem_Malloc(size * tot);
- ok= RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+ ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
- if (!ok) i= tot; /* skip the loop */
+ if (!ok) i = tot; /* skip the loop */
- for ( ; i<tot; i++) {
+ for ( ; i < tot; i++) {
- switch(raw_type) {
+ switch (raw_type) {
case PROP_RAW_CHAR:
- item= PyLong_FromSsize_t((Py_ssize_t) ((char *)array)[i]);
+ item = PyLong_FromSsize_t((Py_ssize_t) ((char *)array)[i]);
break;
case PROP_RAW_SHORT:
- item= PyLong_FromSsize_t((Py_ssize_t) ((short *)array)[i]);
+ item = PyLong_FromSsize_t((Py_ssize_t) ((short *)array)[i]);
break;
case PROP_RAW_INT:
- item= PyLong_FromSsize_t((Py_ssize_t) ((int *)array)[i]);
+ item = PyLong_FromSsize_t((Py_ssize_t) ((int *)array)[i]);
break;
case PROP_RAW_FLOAT:
- item= PyFloat_FromDouble((double) ((float *)array)[i]);
+ item = PyFloat_FromDouble((double) ((float *)array)[i]);
break;
case PROP_RAW_DOUBLE:
- item= PyFloat_FromDouble((double) ((double *)array)[i]);
+ item = PyFloat_FromDouble((double) ((double *)array)[i]);
break;
default: /* PROP_RAW_UNSET */
/* should never happen */
BLI_assert(!"Invalid array type - get");
- item= Py_None;
+ item = Py_None;
Py_INCREF(item);
break;
}
@@ -4337,7 +4379,7 @@ PyDoc_STRVAR(pyrna_prop_collection_foreach_get_doc,
" collection.foreach_get(someseq, attr)\n"
"\n"
" # Python equivalent\n"
-" for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n"
+" for i in range(len(seq)): someseq[i] = getattr(collection, attr)\n"
"\n"
);
static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObject *args)
@@ -4373,18 +4415,18 @@ static PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
{
/* Try get values from a collection */
PyObject *ret;
- PyObject *iter= NULL;
+ PyObject *iter = NULL;
int len;
PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self);
- len= pyrna_prop_array_length(self);
- ret= pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
+ len = pyrna_prop_array_length(self);
+ ret = pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if (ret) {
- iter= PyObject_GetIter(ret);
+ iter = PyObject_GetIter(ret);
Py_DECREF(ret);
}
@@ -4398,13 +4440,13 @@ static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
{
/* Try get values from a collection */
PyObject *ret;
- PyObject *iter= NULL;
- ret= pyrna_prop_collection_values(self);
+ PyObject *iter = NULL;
+ ret = pyrna_prop_collection_values(self);
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if (ret) {
- iter= PyObject_GetIter(ret);
+ iter = PyObject_GetIter(ret);
Py_DECREF(ret);
}
@@ -4412,7 +4454,7 @@ static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
}
#endif /* # !USE_PYRNA_ITER */
-static struct PyMethodDef pyrna_struct_methods[]= {
+static struct PyMethodDef pyrna_struct_methods[] = {
/* only for PointerRNA's with ID'props */
{"keys", (PyCFunction)pyrna_struct_keys, METH_NOARGS, pyrna_struct_keys_doc},
@@ -4442,17 +4484,17 @@ static struct PyMethodDef pyrna_struct_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_methods[]= {
+static struct PyMethodDef pyrna_prop_methods[] = {
{"path_from_id", (PyCFunction)pyrna_prop_path_from_id, METH_NOARGS, pyrna_prop_path_from_id_doc},
{"__dir__", (PyCFunction)pyrna_prop_dir, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_array_methods[]= {
+static struct PyMethodDef pyrna_prop_array_methods[] = {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_collection_methods[]= {
+static struct PyMethodDef pyrna_prop_collection_methods[] = {
{"foreach_get", (PyCFunction)pyrna_prop_collection_foreach_get, METH_VARARGS, pyrna_prop_collection_foreach_get_doc},
{"foreach_set", (PyCFunction)pyrna_prop_collection_foreach_set, METH_VARARGS, pyrna_prop_collection_foreach_set_doc},
@@ -4464,7 +4506,7 @@ static struct PyMethodDef pyrna_prop_collection_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_collection_idprop_methods[]= {
+static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
{"add", (PyCFunction)pyrna_prop_collection_idprop_add, METH_NOARGS, NULL},
{"remove", (PyCFunction)pyrna_prop_collection_idprop_remove, METH_O, NULL},
{"move", (PyCFunction)pyrna_prop_collection_idprop_move, METH_VARARGS, NULL},
@@ -4476,7 +4518,7 @@ static struct PyMethodDef pyrna_prop_collection_idprop_methods[]= {
static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
{
if (PyTuple_GET_SIZE(args) == 1) {
- BPy_StructRNA *base= (BPy_StructRNA *)PyTuple_GET_ITEM(args, 0);
+ BPy_StructRNA *base = (BPy_StructRNA *)PyTuple_GET_ITEM(args, 0);
if (Py_TYPE(base) == type) {
Py_INCREF(base);
return (PyObject *)base;
@@ -4489,15 +4531,15 @@ static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *
... def test_func(self):
... print(100)
...
- >>> myob= MyObSubclass(bpy.context.object)
+ >>> myob = MyObSubclass(bpy.context.object)
>>> myob.test_func()
100
*
* Keep this since it could be useful.
*/
BPy_StructRNA *ret;
- if ((ret= (BPy_StructRNA *)type->tp_alloc(type, 0))) {
- ret->ptr= base->ptr;
+ if ((ret = (BPy_StructRNA *)type->tp_alloc(type, 0))) {
+ ret->ptr = base->ptr;
}
/* pass on exception & NULL if tp_alloc fails */
return (PyObject *)ret;
@@ -4530,9 +4572,9 @@ static PyObject *pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UN
return (PyObject *)base;
}
else if (PyType_IsSubtype(type, &pyrna_prop_Type)) {
- BPy_PropertyRNA *ret= (BPy_PropertyRNA *) type->tp_alloc(type, 0);
- ret->ptr= base->ptr;
- ret->prop= base->prop;
+ BPy_PropertyRNA *ret = (BPy_PropertyRNA *) type->tp_alloc(type, 0);
+ ret->ptr = base->ptr;
+ ret->prop = base->prop;
return (PyObject *)ret;
}
else {
@@ -4546,19 +4588,19 @@ static PyObject *pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UN
static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
{
PyObject *ret;
- const int type= RNA_property_type(prop);
- const int flag= RNA_property_flag(prop);
+ const int type = RNA_property_type(prop);
+ const int flag = RNA_property_flag(prop);
if (RNA_property_array_check(prop)) {
int a, len;
if (flag & PROP_DYNAMIC) {
- ParameterDynAlloc *data_alloc= data;
- len= data_alloc->array_tot;
- data= data_alloc->array;
+ ParameterDynAlloc *data_alloc = data;
+ len = data_alloc->array_tot;
+ data = data_alloc->array;
}
else
- len= RNA_property_array_length(ptr, prop);
+ len = RNA_property_array_length(ptr, prop);
/* resolve the array from a new pytype */
@@ -4566,36 +4608,36 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
switch (type) {
case PROP_BOOLEAN:
- ret= PyTuple_New(len);
- for (a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyBool_FromLong(((int*)data)[a]));
+ ret = PyTuple_New(len);
+ for (a = 0; a < len; a++)
+ PyTuple_SET_ITEM(ret, a, PyBool_FromLong(((int *)data)[a]));
break;
case PROP_INT:
- ret= PyTuple_New(len);
- for (a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyLong_FromSsize_t((Py_ssize_t)((int*)data)[a]));
+ ret = PyTuple_New(len);
+ for (a = 0; a < len; a++)
+ PyTuple_SET_ITEM(ret, a, PyLong_FromSsize_t((Py_ssize_t)((int *)data)[a]));
break;
case PROP_FLOAT:
- switch(RNA_property_subtype(prop)) {
+ switch (RNA_property_subtype(prop)) {
#ifdef USE_MATHUTILS
case PROP_ALL_VECTOR_SUBTYPES:
- ret= Vector_CreatePyObject(data, len, Py_NEW, NULL);
+ ret = Vector_CreatePyObject(data, len, Py_NEW, NULL);
break;
case PROP_MATRIX:
- if (len==16) {
- ret= Matrix_CreatePyObject(data, 4, 4, Py_NEW, NULL);
+ if (len == 16) {
+ ret = Matrix_CreatePyObject(data, 4, 4, Py_NEW, NULL);
break;
}
- else if (len==9) {
- ret= Matrix_CreatePyObject(data, 3, 3, Py_NEW, NULL);
+ else if (len == 9) {
+ ret = Matrix_CreatePyObject(data, 3, 3, Py_NEW, NULL);
break;
}
/* pass through */
#endif
default:
- ret= PyTuple_New(len);
- for (a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble(((float*)data)[a]));
+ ret = PyTuple_New(len);
+ for (a = 0; a < len; a++)
+ PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble(((float *)data)[a]));
}
break;
@@ -4603,7 +4645,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
PyErr_Format(PyExc_TypeError,
"RNA Error: unknown array type \"%d\" (pyrna_param_to_py)",
type);
- ret= NULL;
+ ret = NULL;
break;
}
}
@@ -4611,41 +4653,41 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
- ret= PyBool_FromLong(*(int*)data);
+ ret = PyBool_FromLong(*(int *)data);
break;
case PROP_INT:
- ret= PyLong_FromSsize_t((Py_ssize_t)*(int*)data);
+ ret = PyLong_FromSsize_t((Py_ssize_t)*(int *)data);
break;
case PROP_FLOAT:
- ret= PyFloat_FromDouble(*(float*)data);
+ ret = PyFloat_FromDouble(*(float *)data);
break;
case PROP_STRING:
{
char *data_ch;
- PyObject *value_coerce= NULL;
- const int subtype= RNA_property_subtype(prop);
+ PyObject *value_coerce = NULL;
+ const int subtype = RNA_property_subtype(prop);
if (flag & PROP_THICK_WRAP)
- data_ch= (char *)data;
+ data_ch = (char *)data;
else
- data_ch= *(char **)data;
+ data_ch = *(char **)data;
#ifdef USE_STRING_COERCE
if (subtype == PROP_BYTESTRING) {
- ret= PyBytes_FromString(data_ch);
+ ret = PyBytes_FromString(data_ch);
}
else if (ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
- ret= PyC_UnicodeFromByte(data_ch);
+ ret = PyC_UnicodeFromByte(data_ch);
}
else {
- ret= PyUnicode_FromString(data_ch);
+ ret = PyUnicode_FromString(data_ch);
}
#else
if (subtype == PROP_BYTESTRING) {
- ret= PyBytes_FromString(buf);
+ ret = PyBytes_FromString(buf);
}
else {
- ret= PyUnicode_FromString(data_ch);
+ ret = PyUnicode_FromString(data_ch);
}
#endif
@@ -4657,50 +4699,50 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
}
case PROP_ENUM:
{
- ret= pyrna_enum_to_py(ptr, prop, *(int*)data);
+ ret = pyrna_enum_to_py(ptr, prop, *(int *)data);
break;
}
case PROP_POINTER:
{
PointerRNA newptr;
- StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
+ StructRNA *ptype = RNA_property_pointer_type(ptr, prop);
if (flag & PROP_RNAPTR) {
/* in this case we get the full ptr */
- newptr= *(PointerRNA*)data;
+ newptr = *(PointerRNA *)data;
}
else {
if (RNA_struct_is_ID(ptype)) {
- RNA_id_pointer_create(*(void**)data, &newptr);
+ RNA_id_pointer_create(*(void **)data, &newptr);
}
else {
/* note: this is taken from the function's ID pointer
* and will break if a function returns a pointer from
* another ID block, watch this! - it should at least be
* easy to debug since they are all ID's */
- RNA_pointer_create(ptr->id.data, ptype, *(void**)data, &newptr);
+ RNA_pointer_create(ptr->id.data, ptype, *(void **)data, &newptr);
}
}
if (newptr.data) {
- ret= pyrna_struct_CreatePyObject(&newptr);
+ ret = pyrna_struct_CreatePyObject(&newptr);
}
else {
- ret= Py_None;
+ ret = Py_None;
Py_INCREF(ret);
}
break;
}
case PROP_COLLECTION:
{
- ListBase *lb= (ListBase*)data;
+ ListBase *lb = (ListBase *)data;
CollectionPointerLink *link;
PyObject *linkptr;
- ret= PyList_New(0);
+ ret = PyList_New(0);
- for (link=lb->first; link; link=link->next) {
- linkptr= pyrna_struct_CreatePyObject(&link->ptr);
+ for (link = lb->first; link; link = link->next) {
+ linkptr = pyrna_struct_CreatePyObject(&link->ptr);
PyList_Append(ret, linkptr);
Py_DECREF(linkptr);
}
@@ -4711,7 +4753,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
PyErr_Format(PyExc_TypeError,
"RNA Error: unknown type \"%d\" (pyrna_param_to_py)",
type);
- ret= NULL;
+ ret = NULL;
break;
}
}
@@ -4724,13 +4766,13 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
* works on small dict's such as keyword args. */
static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_lookup)
{
- PyObject *key= NULL;
+ PyObject *key = NULL;
Py_ssize_t pos = 0;
PyObject *value = NULL;
while (PyDict_Next(dict, &pos, &key, &value)) {
if (PyUnicode_Check(key)) {
- if (strcmp(key_lookup, _PyUnicode_AsString(key))==0) {
+ if (strcmp(key_lookup, _PyUnicode_AsString(key)) == 0) {
return value;
}
}
@@ -4742,36 +4784,36 @@ static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_look
static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject *kw)
{
/* Note, both BPy_StructRNA and BPy_PropertyRNA can be used here */
- PointerRNA *self_ptr= &self->ptr;
- FunctionRNA *self_func= self->func;
+ PointerRNA *self_ptr = &self->ptr;
+ FunctionRNA *self_func = self->func;
PointerRNA funcptr;
ParameterList parms;
ParameterIterator iter;
PropertyRNA *parm;
PyObject *ret, *item;
- int i, pyargs_len, pykw_len, parms_len, ret_len, flag, err= 0, kw_tot= 0, kw_arg;
+ int i, pyargs_len, pykw_len, parms_len, ret_len, flag, err = 0, kw_tot = 0, kw_arg;
- PropertyRNA *pret_single= NULL;
- void *retdata_single= NULL;
+ PropertyRNA *pret_single = NULL;
+ void *retdata_single = NULL;
/* enable this so all strings are copied and freed after calling.
* this exposes bugs where the pointer to the string is held and re-used */
// #define DEBUG_STRING_FREE
#ifdef DEBUG_STRING_FREE
- PyObject *string_free_ls= PyList_New(0);
+ PyObject *string_free_ls = PyList_New(0);
#endif
/* Should never happen but it does in rare cases */
BLI_assert(self_ptr != NULL);
- if (self_ptr==NULL) {
+ if (self_ptr == NULL) {
PyErr_SetString(PyExc_RuntimeError, "rna functions internal rna pointer is NULL, this is a bug. aborting");
return NULL;
}
- if (self_func==NULL) {
+ if (self_func == NULL) {
PyErr_Format(PyExc_RuntimeError,
"%.200s.<unknown>(): rna function internal function is NULL, this is a bug. aborting",
RNA_struct_identifier(self_ptr->type));
@@ -4794,13 +4836,13 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
* the same ID as the functions. */
RNA_pointer_create(self_ptr->id.data, &RNA_Function, self_func, &funcptr);
- pyargs_len= PyTuple_GET_SIZE(args);
- pykw_len= kw ? PyDict_Size(kw) : 0;
+ pyargs_len = PyTuple_GET_SIZE(args);
+ pykw_len = kw ? PyDict_Size(kw) : 0;
RNA_parameter_list_create(&parms, self_ptr, self_func);
RNA_parameter_list_begin(&parms, &iter);
- parms_len= RNA_parameter_list_arg_count(&parms);
- ret_len= 0;
+ parms_len = RNA_parameter_list_arg_count(&parms);
+ ret_len = 0;
if (pyargs_len + pykw_len > parms_len) {
RNA_parameter_list_end(&iter);
@@ -4808,53 +4850,53 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
"%.200s.%.200s(): takes at most %d arguments, got %d",
RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func),
parms_len, pyargs_len + pykw_len);
- err= -1;
+ err = -1;
}
/* parse function parameters */
- for (i= 0; iter.valid && err==0; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
- flag= RNA_property_flag(parm);
+ for (i = 0; iter.valid && err == 0; RNA_parameter_list_next(&iter)) {
+ parm = iter.parm;
+ flag = RNA_property_flag(parm);
/* only useful for single argument returns, we'll need another list loop for multiple */
if (flag & PROP_OUTPUT) {
ret_len++;
- if (pret_single==NULL) {
- pret_single= parm;
- retdata_single= iter.data;
+ if (pret_single == NULL) {
+ pret_single = parm;
+ retdata_single = iter.data;
}
continue;
}
- item= NULL;
+ item = NULL;
if (i < pyargs_len) {
- item= PyTuple_GET_ITEM(args, i);
- kw_arg= FALSE;
+ item = PyTuple_GET_ITEM(args, i);
+ kw_arg = FALSE;
}
else if (kw != NULL) {
#if 0
- item= PyDict_GetItemString(kw, RNA_property_identifier(parm)); /* borrow ref */
+ item = PyDict_GetItemString(kw, RNA_property_identifier(parm)); /* borrow ref */
#else
- item= small_dict_get_item_string(kw, RNA_property_identifier(parm)); /* borrow ref */
+ item = small_dict_get_item_string(kw, RNA_property_identifier(parm)); /* borrow ref */
#endif
if (item)
kw_tot++; /* make sure invalid keywords are not given */
- kw_arg= TRUE;
+ kw_arg = TRUE;
}
i++; /* current argument */
- if (item==NULL) {
+ if (item == NULL) {
if (flag & PROP_REQUIRED) {
PyErr_Format(PyExc_TypeError,
"%.200s.%.200s(): required parameter \"%.200s\" not specified",
RNA_struct_identifier(self_ptr->type),
RNA_function_identifier(self_func),
RNA_property_identifier(parm));
- err= -1;
+ err = -1;
break;
}
else { /* PyDict_GetItemString wont raise an error */
@@ -4865,21 +4907,21 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
#ifdef DEBUG_STRING_FREE
if (item) {
if (PyUnicode_Check(item)) {
- item= PyUnicode_FromString(_PyUnicode_AsString(item));
+ item = PyUnicode_FromString(_PyUnicode_AsString(item));
PyList_Append(string_free_ls, item);
Py_DECREF(item);
}
}
#endif
- err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
+ err = pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
- if (err!=0) {
+ if (err != 0) {
/* the error generated isn't that useful, so generate it again with a useful prefix
* could also write a function to prepend to error messages */
char error_prefix[512];
PyErr_Clear(); /* re-raise */
- if (kw_arg==TRUE)
+ if (kw_arg == TRUE)
BLI_snprintf(error_prefix, sizeof(error_prefix),
"%.200s.%.200s(): error with keyword argument \"%.200s\" - ",
RNA_struct_identifier(self_ptr->type),
@@ -4908,59 +4950,59 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
*/
if (err == 0 && kw && (pykw_len > kw_tot)) {
PyObject *key, *value;
- Py_ssize_t pos= 0;
+ Py_ssize_t pos = 0;
- DynStr *bad_args= BLI_dynstr_new();
- DynStr *good_args= BLI_dynstr_new();
+ DynStr *bad_args = BLI_dynstr_new();
+ DynStr *good_args = BLI_dynstr_new();
const char *arg_name, *bad_args_str, *good_args_str;
- int found= FALSE, first= TRUE;
+ int found = FALSE, first = TRUE;
while (PyDict_Next(kw, &pos, &key, &value)) {
- arg_name= _PyUnicode_AsString(key);
- found= FALSE;
+ arg_name = _PyUnicode_AsString(key);
+ found = FALSE;
- if (arg_name==NULL) { /* unlikely the argname is not a string but ignore if it is*/
+ if (arg_name == NULL) { /* unlikely the argname is not a string but ignore if it is*/
PyErr_Clear();
}
else {
/* Search for arg_name */
RNA_parameter_list_begin(&parms, &iter);
for (; iter.valid; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
- if (strcmp(arg_name, RNA_property_identifier(parm))==0) {
- found= TRUE;
+ parm = iter.parm;
+ if (strcmp(arg_name, RNA_property_identifier(parm)) == 0) {
+ found = TRUE;
break;
}
}
RNA_parameter_list_end(&iter);
- if (found==FALSE) {
+ if (found == FALSE) {
BLI_dynstr_appendf(bad_args, first ? "%s" : ", %s", arg_name);
- first= FALSE;
+ first = FALSE;
}
}
}
/* list good args */
- first= TRUE;
+ first = TRUE;
RNA_parameter_list_begin(&parms, &iter);
for (; iter.valid; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
+ parm = iter.parm;
if (RNA_property_flag(parm) & PROP_OUTPUT)
continue;
BLI_dynstr_appendf(good_args, first ? "%s" : ", %s", RNA_property_identifier(parm));
- first= FALSE;
+ first = FALSE;
}
RNA_parameter_list_end(&iter);
- bad_args_str= BLI_dynstr_get_cstring(bad_args);
- good_args_str= BLI_dynstr_get_cstring(good_args);
+ bad_args_str = BLI_dynstr_get_cstring(bad_args);
+ good_args_str = BLI_dynstr_get_cstring(good_args);
PyErr_Format(PyExc_TypeError,
"%.200s.%.200s(): was called with invalid keyword arguments(s) (%s), expected (%s)",
@@ -4972,32 +5014,32 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
MEM_freeN((void *)bad_args_str);
MEM_freeN((void *)good_args_str);
- err= -1;
+ err = -1;
}
- ret= NULL;
- if (err==0) {
+ ret = NULL;
+ if (err == 0) {
/* call function */
ReportList reports;
- bContext *C= BPy_GetContext();
+ bContext *C = BPy_GetContext();
BKE_reports_init(&reports, RPT_STORE);
RNA_function_call(C, &reports, self_ptr, self_func, &parms);
- err= (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE));
+ err = (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE));
/* return value */
if (err != -1) {
if (ret_len > 0) {
if (ret_len > 1) {
- ret= PyTuple_New(ret_len);
- i= 0; /* arg index */
+ ret = PyTuple_New(ret_len);
+ i = 0; /* arg index */
RNA_parameter_list_begin(&parms, &iter);
for (; iter.valid; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
- flag= RNA_property_flag(parm);
+ parm = iter.parm;
+ flag = RNA_property_flag(parm);
if (flag & PROP_OUTPUT)
PyTuple_SET_ITEM(ret, i++, pyrna_param_to_py(&funcptr, parm, iter.data));
@@ -5006,11 +5048,11 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
RNA_parameter_list_end(&iter);
}
else
- ret= pyrna_param_to_py(&funcptr, pret_single, retdata_single);
+ ret = pyrna_param_to_py(&funcptr, pret_single, retdata_single);
/* possible there is an error in conversion */
- if (ret==NULL)
- err= -1;
+ if (ret == NULL)
+ err = -1;
}
}
}
@@ -5029,7 +5071,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
if (ret)
return ret;
- if (err==-1)
+ if (err == -1)
return NULL;
Py_RETURN_NONE;
@@ -5038,7 +5080,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
/* subclasses of pyrna_struct_Type which support idprop definitions use this as a metaclass */
/* note: tp_base member is set to &PyType_Type on init */
-PyTypeObject pyrna_struct_meta_idprop_Type= {
+PyTypeObject pyrna_struct_meta_idprop_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_struct_meta_idprop", /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */ // XXX, would be PyTypeObject, but subtypes of Type must be PyHeapTypeObject's
@@ -5120,7 +5162,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
/*-----------------------BPy_StructRNA method def------------------------------*/
-PyTypeObject pyrna_struct_Type= {
+PyTypeObject pyrna_struct_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_struct", /* tp_name */
sizeof(BPy_StructRNA), /* tp_basicsize */
@@ -5209,7 +5251,7 @@ PyTypeObject pyrna_struct_Type= {
};
/*-----------------------BPy_PropertyRNA method def------------------------------*/
-PyTypeObject pyrna_prop_Type= {
+PyTypeObject pyrna_prop_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -5293,7 +5335,7 @@ PyTypeObject pyrna_prop_Type= {
NULL
};
-PyTypeObject pyrna_prop_array_Type= {
+PyTypeObject pyrna_prop_array_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_array", /* tp_name */
sizeof(BPy_PropertyArrayRNA), /* tp_basicsize */
@@ -5376,7 +5418,7 @@ PyTypeObject pyrna_prop_array_Type= {
NULL
};
-PyTypeObject pyrna_prop_collection_Type= {
+PyTypeObject pyrna_prop_collection_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -5461,7 +5503,7 @@ PyTypeObject pyrna_prop_collection_Type= {
};
/* only for add/remove/move methods */
-static PyTypeObject pyrna_prop_collection_idprop_Type= {
+static PyTypeObject pyrna_prop_collection_idprop_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection_idprop", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -5546,7 +5588,7 @@ static PyTypeObject pyrna_prop_collection_idprop_Type= {
};
/*-----------------------BPy_PropertyRNA method def------------------------------*/
-PyTypeObject pyrna_func_Type= {
+PyTypeObject pyrna_func_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_func", /* tp_name */
sizeof(BPy_FunctionRNA), /* tp_basicsize */
@@ -5642,7 +5684,7 @@ PyTypeObject pyrna_func_Type= {
static void pyrna_prop_collection_iter_dealloc(BPy_PropertyCollectionIterRNA *self);
static PyObject *pyrna_prop_collection_iter_next(BPy_PropertyCollectionIterRNA *self);
-PyTypeObject pyrna_prop_collection_iter_Type= {
+PyTypeObject pyrna_prop_collection_iter_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection_iter", /* tp_name */
sizeof(BPy_PropertyCollectionIterRNA), /* tp_basicsize */
@@ -5735,10 +5777,10 @@ PyTypeObject pyrna_prop_collection_iter_Type= {
PyObject *pyrna_prop_collection_iter_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
{
- BPy_PropertyCollectionIterRNA *self= PyObject_New(BPy_PropertyCollectionIterRNA, &pyrna_prop_collection_iter_Type);
+ BPy_PropertyCollectionIterRNA *self = PyObject_New(BPy_PropertyCollectionIterRNA, &pyrna_prop_collection_iter_Type);
#ifdef USE_WEAKREFS
- self->in_weakreflist= NULL;
+ self->in_weakreflist = NULL;
#endif
RNA_property_collection_begin(ptr, prop, &self->iter);
@@ -5758,7 +5800,7 @@ static PyObject *pyrna_prop_collection_iter_next(BPy_PropertyCollectionIterRNA *
return NULL;
}
else {
- BPy_StructRNA *pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&self->iter.ptr);
+ BPy_StructRNA *pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&self->iter.ptr);
#ifdef USE_PYRNA_STRUCT_REFERENCE
if (pyrna) { /* unlikely but may fail */
@@ -5814,7 +5856,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
/* python deals with the circular ref */
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
- item= pyrna_struct_CreatePyObject(&ptr);
+ item = pyrna_struct_CreatePyObject(&ptr);
/* note, must set the class not the __dict__ else the internal slots are not updated correctly */
PyObject_SetAttr(newclass, bpy_intern_str_bl_rna, item);
@@ -5831,19 +5873,19 @@ static PyObject* pyrna_srna_PyBase(StructRNA *srna) //, PyObject *bpy_types_dict
/* Assume RNA_struct_py_type_get(srna) was already checked */
StructRNA *base;
- PyObject *py_base= NULL;
+ PyObject *py_base = NULL;
/* get the base type */
- base= RNA_struct_base(srna);
+ base = RNA_struct_base(srna);
if (base && base != srna) {
/*/printf("debug subtype %s %p\n", RNA_struct_identifier(srna), srna); */
- py_base= pyrna_srna_Subtype(base); //, bpy_types_dict);
+ py_base = pyrna_srna_Subtype(base); //, bpy_types_dict);
Py_DECREF(py_base); /* srna owns, this is only to pass as an arg */
}
- if (py_base==NULL) {
- py_base= (PyObject *)&pyrna_struct_Type;
+ if (py_base == NULL) {
+ py_base = (PyObject *)&pyrna_struct_Type;
}
return py_base;
@@ -5851,47 +5893,47 @@ static PyObject* pyrna_srna_PyBase(StructRNA *srna) //, PyObject *bpy_types_dict
/* check if we have a native python subclass, use it when it exists
* return a borrowed reference */
-static PyObject *bpy_types_dict= NULL;
+static PyObject *bpy_types_dict = NULL;
static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
{
- const char *idname= RNA_struct_identifier(srna);
+ const char *idname = RNA_struct_identifier(srna);
PyObject *newclass;
- if (bpy_types_dict==NULL) {
- PyObject *bpy_types= PyImport_ImportModuleLevel((char *)"bpy_types", NULL, NULL, NULL, 0);
+ if (bpy_types_dict == NULL) {
+ PyObject *bpy_types = PyImport_ImportModuleLevel((char *)"bpy_types", NULL, NULL, NULL, 0);
- if (bpy_types==NULL) {
+ if (bpy_types == NULL) {
PyErr_Print();
PyErr_Clear();
fprintf(stderr, "%s: failed to find 'bpy_types' module\n", __func__);
return NULL;
}
- bpy_types_dict= PyModule_GetDict(bpy_types); // borrow
+ bpy_types_dict = PyModule_GetDict(bpy_types); // borrow
Py_DECREF(bpy_types); // fairly safe to assume the dict is kept
}
- newclass= PyDict_GetItemString(bpy_types_dict, idname);
+ newclass = PyDict_GetItemString(bpy_types_dict, idname);
/* sanity check, could skip this unless in debug mode */
if (newclass) {
- PyObject *base_compare= pyrna_srna_PyBase(srna);
- //PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
- //PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
- PyObject *tp_bases= ((PyTypeObject *)newclass)->tp_bases;
- PyObject *tp_slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
+ PyObject *base_compare = pyrna_srna_PyBase(srna);
+ //PyObject *slots = PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
+ //PyObject *bases = PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
+ PyObject *tp_bases = ((PyTypeObject *)newclass)->tp_bases;
+ PyObject *tp_slots = PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
- if (tp_slots==NULL) {
+ if (tp_slots == NULL) {
fprintf(stderr, "%s: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", __func__, idname);
- newclass= NULL;
+ newclass = NULL;
}
else if (PyTuple_GET_SIZE(tp_bases)) {
- PyObject *base= PyTuple_GET_ITEM(tp_bases, 0);
+ PyObject *base = PyTuple_GET_ITEM(tp_bases, 0);
if (base_compare != base) {
fprintf(stderr, "%s: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", __func__, idname);
PyC_ObSpit("Expected! ", base_compare);
- newclass= NULL;
+ newclass = NULL;
}
else {
if (G.f & G_DEBUG)
@@ -5905,16 +5947,16 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
static PyObject* pyrna_srna_Subtype(StructRNA *srna)
{
- PyObject *newclass= NULL;
+ PyObject *newclass = NULL;
/* stupid/simple case */
if (srna == NULL) {
- newclass= NULL; /* Nothing to do */
+ newclass = NULL; /* Nothing to do */
} /* the class may have already been declared & allocated */
- else if ((newclass= RNA_struct_py_type_get(srna))) {
+ else if ((newclass = RNA_struct_py_type_get(srna))) {
Py_INCREF(newclass);
} /* check if bpy_types.py module has the class defined in it */
- else if ((newclass= pyrna_srna_ExternalType(srna))) {
+ else if ((newclass = pyrna_srna_ExternalType(srna))) {
pyrna_subtype_set_rna(newclass, srna);
Py_INCREF(newclass);
} /* create a new class instance with the C api
@@ -5922,32 +5964,32 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
else {
/* subclass equivalents
- class myClass(myBase):
- some='value' # or ...
- - myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
+ some = 'value' # or ...
+ - myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
*/
/* Assume RNA_struct_py_type_get(srna) was already checked */
- PyObject *py_base= pyrna_srna_PyBase(srna);
+ PyObject *py_base = pyrna_srna_PyBase(srna);
PyObject *metaclass;
- const char *idname= RNA_struct_identifier(srna);
+ const char *idname = RNA_struct_identifier(srna);
/* remove __doc__ for now */
- // const char *descr= RNA_struct_ui_description(srna);
- // if (!descr) descr= "(no docs)";
+ // const char *descr = RNA_struct_ui_description(srna);
+ // if (!descr) descr = "(no docs)";
// "__doc__", descr
if ( RNA_struct_idprops_check(srna) &&
!PyObject_IsSubclass(py_base, (PyObject *)&pyrna_struct_meta_idprop_Type))
{
- metaclass= (PyObject *)&pyrna_struct_meta_idprop_Type;
+ metaclass = (PyObject *)&pyrna_struct_meta_idprop_Type;
}
else {
- metaclass= (PyObject *)&PyType_Type;
+ metaclass = (PyObject *)&PyType_Type;
}
/* always use O not N when calling, N causes refcount errors */
- newclass= PyObject_CallFunction(metaclass, (char *)"s(O){sss()}",
- idname, py_base, "__module__","bpy.types", "__slots__");
+ newclass = PyObject_CallFunction(metaclass, (char *)"s(O){sss()}",
+ idname, py_base, "__module__","bpy.types", "__slots__");
/* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
@@ -5991,24 +6033,24 @@ static PyObject* pyrna_struct_Subtype(PointerRNA *ptr)
/*-----------------------CreatePyObject---------------------------------*/
PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
{
- BPy_StructRNA *pyrna= NULL;
+ BPy_StructRNA *pyrna = NULL;
/* note: don't rely on this to return None since NULL data with a valid type can often crash */
- if (ptr->data==NULL && ptr->type==NULL) { /* Operator RNA has NULL data */
+ if (ptr->data == NULL && ptr->type == NULL) { /* Operator RNA has NULL data */
Py_RETURN_NONE;
}
else {
- PyTypeObject *tp= (PyTypeObject *)pyrna_struct_Subtype(ptr);
+ PyTypeObject *tp = (PyTypeObject *)pyrna_struct_Subtype(ptr);
if (tp) {
- pyrna= (BPy_StructRNA *) tp->tp_alloc(tp, 0);
+ pyrna = (BPy_StructRNA *) tp->tp_alloc(tp, 0);
Py_DECREF(tp); /* srna owns, cant hold a ref */
}
else {
fprintf(stderr, "%s: could not make type\n", __func__);
- pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
+ pyrna = (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
#ifdef USE_WEAKREFS
- pyrna->in_weakreflist= NULL;
+ pyrna->in_weakreflist = NULL;
#endif
}
}
@@ -6018,13 +6060,13 @@ PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
return NULL;
}
- pyrna->ptr= *ptr;
+ pyrna->ptr = *ptr;
#ifdef PYRNA_FREE_SUPPORT
- pyrna->freeptr= FALSE;
+ pyrna->freeptr = FALSE;
#endif
#ifdef USE_PYRNA_STRUCT_REFERENCE
- pyrna->reference= NULL;
+ pyrna->reference = NULL;
#endif
// PyC_ObSpit("NewStructRNA: ", (PyObject *)pyrna);
@@ -6045,28 +6087,28 @@ PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
PyTypeObject *type;
if (RNA_property_type(prop) != PROP_COLLECTION) {
- type= &pyrna_prop_Type;
+ type = &pyrna_prop_Type;
}
else {
if ((RNA_property_flag(prop) & PROP_IDPROPERTY) == 0) {
- type= &pyrna_prop_collection_Type;
+ type = &pyrna_prop_collection_Type;
}
else {
- type= &pyrna_prop_collection_idprop_Type;
+ type = &pyrna_prop_collection_idprop_Type;
}
}
- pyrna= (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyRNA, type);
+ pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyRNA, type);
#ifdef USE_WEAKREFS
- pyrna->in_weakreflist= NULL;
+ pyrna->in_weakreflist = NULL;
#endif
}
else {
- pyrna= (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyArrayRNA, &pyrna_prop_array_Type);
- ((BPy_PropertyArrayRNA *)pyrna)->arraydim= 0;
- ((BPy_PropertyArrayRNA *)pyrna)->arrayoffset= 0;
+ pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyArrayRNA, &pyrna_prop_array_Type);
+ ((BPy_PropertyArrayRNA *)pyrna)->arraydim = 0;
+ ((BPy_PropertyArrayRNA *)pyrna)->arrayoffset = 0;
#ifdef USE_WEAKREFS
- ((BPy_PropertyArrayRNA *)pyrna)->in_weakreflist= NULL;
+ ((BPy_PropertyArrayRNA *)pyrna)->in_weakreflist = NULL;
#endif
}
@@ -6075,8 +6117,8 @@ PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
return NULL;
}
- pyrna->ptr= *ptr;
- pyrna->prop= prop;
+ pyrna->ptr = *ptr;
+ pyrna->prop = prop;
#ifdef USE_PYRNA_INVALIDATE_WEAKREF
if (ptr->id.data) {
@@ -6090,16 +6132,16 @@ PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
void BPY_rna_init(void)
{
#ifdef USE_MATHUTILS // register mathutils callbacks, ok to run more then once.
- mathutils_rna_array_cb_index= Mathutils_RegisterCallback(&mathutils_rna_array_cb);
- mathutils_rna_matrix_cb_index= Mathutils_RegisterCallback(&mathutils_rna_matrix_cb);
+ mathutils_rna_array_cb_index = Mathutils_RegisterCallback(&mathutils_rna_array_cb);
+ mathutils_rna_matrix_cb_index = Mathutils_RegisterCallback(&mathutils_rna_matrix_cb);
#endif
/* for some reason MSVC complains of these */
#if defined(_MSC_VER) || defined(FREE_WINDOWS)
- pyrna_struct_meta_idprop_Type.tp_base= &PyType_Type;
+ pyrna_struct_meta_idprop_Type.tp_base = &PyType_Type;
- pyrna_prop_collection_iter_Type.tp_iter= PyObject_SelfIter;
- pyrna_prop_collection_iter_Type.tp_getattro= PyObject_GenericGetAttr;
+ pyrna_prop_collection_iter_Type.tp_iter = PyObject_SelfIter;
+ pyrna_prop_collection_iter_Type.tp_getattro = PyObject_GenericGetAttr;
#endif
/* metaclass */
@@ -6131,7 +6173,7 @@ void BPY_rna_init(void)
}
/* bpy.data from python */
-static PointerRNA *rna_module_ptr= NULL;
+static PointerRNA *rna_module_ptr = NULL;
PyObject *BPY_rna_module(void)
{
BPy_StructRNA *pyrna;
@@ -6139,9 +6181,9 @@ PyObject *BPY_rna_module(void)
/* for now, return the base RNA type rather than a real module */
RNA_main_pointer_create(G.main, &ptr);
- pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
+ pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
- rna_module_ptr= &pyrna->ptr;
+ rna_module_ptr = &pyrna->ptr;
return (PyObject *)pyrna;
}
@@ -6150,7 +6192,7 @@ void BPY_update_rna_module(void)
#if 0
RNA_main_pointer_create(G.main, rna_module_ptr);
#else
- rna_module_ptr->data= G.main; /* just set data is enough */
+ rna_module_ptr->data = G.main; /* just set data is enough */
#endif
}
@@ -6176,15 +6218,15 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname
{
PointerRNA newptr;
PyObject *ret;
- const char *name= _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
if (name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string");
- ret= NULL;
+ ret = NULL;
}
else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
- ret= pyrna_struct_Subtype(&newptr);
- if (ret==NULL) {
+ ret = pyrna_struct_Subtype(&newptr);
+ if (ret == NULL) {
PyErr_Format(PyExc_RuntimeError,
"bpy.types.%.200s subtype could not be generated, this is a bug!",
_PyUnicode_AsString(pyname));
@@ -6198,7 +6240,7 @@ static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname
return NULL;
#endif
/* The error raised here will be displayed */
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
return ret;
@@ -6208,7 +6250,7 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
-static struct PyMethodDef pyrna_basetype_methods[]= {
+static struct PyMethodDef pyrna_basetype_methods[] = {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
{NULL, NULL, 0, NULL}
};
@@ -6221,11 +6263,11 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
PyMethodDef *meth;
#endif
- list= pyrna_prop_collection_keys(self); /* like calling structs.keys(), avoids looping here */
+ list = pyrna_prop_collection_keys(self); /* like calling structs.keys(), avoids looping here */
#if 0 /* for now only contains __dir__ */
- for (meth=pyrna_basetype_methods; meth->ml_name; meth++) {
- name= PyUnicode_FromString(meth->ml_name);
+ for (meth = pyrna_basetype_methods; meth->ml_name; meth++) {
+ name = PyUnicode_FromString(meth->ml_name);
PyList_Append(list, name);
Py_DECREF(name);
}
@@ -6233,53 +6275,53 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
return list;
}
-static PyTypeObject pyrna_basetype_Type= BLANK_PYTHON_TYPE;
+static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
PyObject *BPY_rna_types(void)
{
BPy_BaseTypeRNA *self;
- if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY)==0) {
- pyrna_basetype_Type.tp_name= "RNA_Types";
- pyrna_basetype_Type.tp_basicsize= sizeof(BPy_BaseTypeRNA);
- pyrna_basetype_Type.tp_getattro= (getattrofunc) pyrna_basetype_getattro;
- pyrna_basetype_Type.tp_flags= Py_TPFLAGS_DEFAULT;
- pyrna_basetype_Type.tp_methods= pyrna_basetype_methods;
+ if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY) == 0) {
+ pyrna_basetype_Type.tp_name = "RNA_Types";
+ pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA);
+ pyrna_basetype_Type.tp_getattro = (getattrofunc) pyrna_basetype_getattro;
+ pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
if (PyType_Ready(&pyrna_basetype_Type) < 0)
return NULL;
}
- self= (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type);
+ self = (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type);
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&self->ptr);
- self->prop= RNA_struct_find_property(&self->ptr, "structs");
+ self->prop = RNA_struct_find_property(&self->ptr, "structs");
#ifdef USE_WEAKREFS
- self->in_weakreflist= NULL;
+ self->in_weakreflist = NULL;
#endif
return (PyObject *)self;
}
StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_prefix)
{
- BPy_StructRNA *py_srna= NULL;
+ BPy_StructRNA *py_srna = NULL;
StructRNA *srna;
/* ack, PyObject_GetAttrString wont look up this types tp_dict first :/ */
if (PyType_Check(self)) {
- py_srna= (BPy_StructRNA *)PyDict_GetItem(((PyTypeObject *)self)->tp_dict, bpy_intern_str_bl_rna);
+ py_srna = (BPy_StructRNA *)PyDict_GetItem(((PyTypeObject *)self)->tp_dict, bpy_intern_str_bl_rna);
Py_XINCREF(py_srna);
}
if (parent) {
/* be very careful with this since it will return a parent classes srna.
* modifying this will do confusing stuff! */
- if (py_srna==NULL)
- py_srna= (BPy_StructRNA*)PyObject_GetAttr(self, bpy_intern_str_bl_rna);
+ if (py_srna == NULL)
+ py_srna = (BPy_StructRNA *)PyObject_GetAttr(self, bpy_intern_str_bl_rna);
}
- if (py_srna==NULL) {
+ if (py_srna == NULL) {
PyErr_Format(PyExc_RuntimeError,
"%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)",
error_prefix, Py_TYPE(self)->tp_name);
@@ -6303,7 +6345,7 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
return NULL;
}
- srna= py_srna->ptr.data;
+ srna = py_srna->ptr.data;
Py_DECREF(py_srna);
return srna;
@@ -6316,13 +6358,13 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
{
- if (self==NULL) {
+ if (self == NULL) {
return NULL;
}
else if (PyCapsule_CheckExact(self)) {
return PyCapsule_GetPointer(self, NULL);
}
- else if (PyType_Check(self)==0) {
+ else if (PyType_Check(self) == 0) {
return NULL;
}
else {
@@ -6335,7 +6377,7 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
PyErr_Fetch(&error_type, &error_value, &error_traceback);
PyErr_Clear();
- srna= pyrna_struct_as_srna(self, 0, error_prefix);
+ srna = pyrna_struct_as_srna(self, 0, error_prefix);
if (!PyErr_Occurred()) {
PyErr_Restore(error_type, error_value, error_traceback);
@@ -6356,22 +6398,22 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item
if (PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) {
PyObject *args_fake;
- if (*_PyUnicode_AsString(key)=='_') {
+ if (*_PyUnicode_AsString(key) == '_') {
PyErr_Format(PyExc_ValueError,
"bpy_struct \"%.200s\" registration error: "
"%.200s could not register because the property starts with an '_'\n",
RNA_struct_identifier(srna), _PyUnicode_AsString(key));
return -1;
}
- py_srna_cobject= PyCapsule_New(srna, NULL, NULL);
+ py_srna_cobject = PyCapsule_New(srna, NULL, NULL);
/* not 100% nice :/, modifies the dict passed, should be ok */
PyDict_SetItem(py_kw, bpy_intern_str_attr, key);
- args_fake= PyTuple_New(1);
+ args_fake = PyTuple_New(1);
PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
- py_ret= PyObject_Call(py_func, args_fake, py_kw);
+ py_ret = PyObject_Call(py_func, args_fake, py_kw);
Py_DECREF(args_fake); /* free's py_srna_cobject too */
@@ -6407,19 +6449,19 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
{
PyObject *item, *key;
PyObject *order;
- Py_ssize_t pos= 0;
- int ret= 0;
+ Py_ssize_t pos = 0;
+ int ret = 0;
/* in both cases PyDict_CheckExact(class_dict) will be true even
* though Operators have a metaclass dict namespace */
- if ((order= PyDict_GetItem(class_dict, bpy_intern_str_order)) && PyList_CheckExact(order)) {
- for (pos= 0; pos<PyList_GET_SIZE(order); pos++) {
- key= PyList_GET_ITEM(order, pos);
+ if ((order = PyDict_GetItem(class_dict, bpy_intern_str_order)) && PyList_CheckExact(order)) {
+ for (pos = 0; pos < PyList_GET_SIZE(order); pos++) {
+ key = PyList_GET_ITEM(order, pos);
/* however unlikely its possible
* fails in py 3.3 beta with __qualname__ */
- if ((item= PyDict_GetItem(class_dict, key))) {
- ret= deferred_register_prop(srna, key, item);
+ if ((item = PyDict_GetItem(class_dict, key))) {
+ ret = deferred_register_prop(srna, key, item);
if (ret != 0) {
break;
}
@@ -6428,7 +6470,7 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
}
else {
while (PyDict_Next(class_dict, &pos, &key, &item)) {
- ret= deferred_register_prop(srna, key, item);
+ ret = deferred_register_prop(srna, key, item);
if (ret != 0)
break;
@@ -6440,12 +6482,12 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject *py_class)
{
- const int len= PyTuple_GET_SIZE(py_class->tp_bases);
+ const int len = PyTuple_GET_SIZE(py_class->tp_bases);
int i, ret;
/* first scan base classes for registerable properties */
- for (i=0; i<len; i++) {
- PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
+ for (i = 0; i < len; i++) {
+ PyTypeObject *py_superclass = (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
/* the rules for using these base classes are not clear,
* 'object' is of course not worth looking into and
@@ -6459,7 +6501,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject
if (py_superclass != &PyBaseObject_Type &&
!PyObject_IsSubclass((PyObject *)py_superclass, (PyObject *)&pyrna_struct_Type)
) {
- ret= pyrna_deferred_register_class_recursive(srna, py_superclass);
+ ret = pyrna_deferred_register_class_recursive(srna, py_superclass);
if (ret != 0) {
return ret;
@@ -6485,13 +6527,13 @@ int pyrna_deferred_register_class(StructRNA *srna, PyObject *py_class)
static int rna_function_arg_count(FunctionRNA *func)
{
- const ListBase *lb= RNA_function_defined_parameters(func);
+ const ListBase *lb = RNA_function_defined_parameters(func);
PropertyRNA *parm;
Link *link;
- int count= (RNA_function_flag(func) & FUNC_NO_SELF) ? 0 : 1;
+ int count = (RNA_function_flag(func) & FUNC_NO_SELF) ? 0 : 1;
- for (link=lb->first; link; link=link->next) {
- parm= (PropertyRNA*)link;
+ for (link = lb->first; link; link = link->next) {
+ parm = (PropertyRNA *)link;
if (!(RNA_property_flag(parm) & PROP_OUTPUT))
count++;
}
@@ -6505,13 +6547,13 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
Link *link;
FunctionRNA *func;
PropertyRNA *prop;
- StructRNA *srna= dummyptr->type;
- const char *class_type= RNA_struct_identifier(srna);
- PyObject *py_class= (PyObject*)py_data;
- PyObject *base_class= RNA_struct_py_type_get(srna);
+ StructRNA *srna = dummyptr->type;
+ const char *class_type = RNA_struct_identifier(srna);
+ PyObject *py_class = (PyObject *)py_data;
+ PyObject *base_class = RNA_struct_py_type_get(srna);
PyObject *item;
int i, flag, arg_count, func_arg_count;
- const char *py_class_name= ((PyTypeObject *)py_class)->tp_name; // __name__
+ const char *py_class_name = ((PyTypeObject *)py_class)->tp_name; // __name__
if (base_class) {
@@ -6524,22 +6566,22 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
}
/* verify callback functions */
- lb= RNA_struct_type_functions(srna);
- i= 0;
- for (link=lb->first; link; link=link->next) {
- func= (FunctionRNA*)link;
- flag= RNA_function_flag(func);
+ lb = RNA_struct_type_functions(srna);
+ i = 0;
+ for (link = lb->first; link; link = link->next) {
+ func = (FunctionRNA *)link;
+ flag = RNA_function_flag(func);
if (!(flag & FUNC_REGISTER))
continue;
- item= PyObject_GetAttrString(py_class, RNA_function_identifier(func));
+ item = PyObject_GetAttrString(py_class, RNA_function_identifier(func));
- have_function[i]= (item != NULL);
+ have_function[i] = (item != NULL);
i++;
- if (item==NULL) {
- if ((flag & FUNC_REGISTER_OPTIONAL)==0) {
+ if (item == NULL) {
+ if ((flag & FUNC_REGISTER_OPTIONAL) == 0) {
PyErr_Format(PyExc_AttributeError,
"expected %.200s, %.200s class to have an \"%.200s\" attribute",
class_type, py_class_name,
@@ -6552,16 +6594,16 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
else {
Py_DECREF(item); /* no need to keep a ref, the class owns it (technically we should keep a ref but...) */
if (flag & FUNC_NO_SELF) {
- if (PyMethod_Check(item)==0) {
+ if (PyMethod_Check(item) == 0) {
PyErr_Format(PyExc_TypeError,
"expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s",
class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
return -1;
}
- item= ((PyMethodObject *)item)->im_func;
+ item = ((PyMethodObject *)item)->im_func;
}
else {
- if (PyFunction_Check(item)==0) {
+ if (PyFunction_Check(item) == 0) {
PyErr_Format(PyExc_TypeError,
"expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s",
class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
@@ -6569,10 +6611,10 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
}
}
- func_arg_count= rna_function_arg_count(func);
+ func_arg_count = rna_function_arg_count(func);
if (func_arg_count >= 0) { /* -1 if we dont care*/
- arg_count= ((PyCodeObject *)PyFunction_GET_CODE(item))->co_argcount;
+ arg_count = ((PyCodeObject *)PyFunction_GET_CODE(item))->co_argcount;
/* note, the number of args we check for and the number of args we give to
* @classmethods are different (quirk of python),
@@ -6592,24 +6634,24 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
}
/* verify properties */
- lb= RNA_struct_type_properties(srna);
- for (link=lb->first; link; link=link->next) {
+ lb = RNA_struct_type_properties(srna);
+ for (link = lb->first; link; link = link->next) {
const char *identifier;
- prop= (PropertyRNA*)link;
- flag= RNA_property_flag(prop);
+ prop = (PropertyRNA *)link;
+ flag = RNA_property_flag(prop);
if (!(flag & PROP_REGISTER))
continue;
- identifier= RNA_property_identifier(prop);
- item= PyObject_GetAttrString(py_class, identifier);
+ identifier = RNA_property_identifier(prop);
+ item = PyObject_GetAttrString(py_class, identifier);
- if (item==NULL) {
+ if (item == NULL) {
/* Sneaky workaround to use the class name as the bl_idname */
#define BPY_REPLACEMENT_STRING(rna_attr, py_attr) \
if (strcmp(identifier, rna_attr) == 0) { \
- item= PyObject_GetAttrString(py_class, py_attr); \
+ item = PyObject_GetAttrString(py_class, py_attr); \
if (item && item != Py_None) { \
if (pyrna_py_to_prop(dummyptr, prop, NULL, \
item, "validating class:") != 0) \
@@ -6651,36 +6693,36 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
{
PyObject *args;
- PyObject *ret= NULL, *py_srna= NULL, *py_class_instance= NULL, *parmitem;
+ PyObject *ret = NULL, *py_srna = NULL, *py_class_instance = NULL, *parmitem;
PyTypeObject *py_class;
- void **py_class_instance_store= NULL;
+ void **py_class_instance_store = NULL;
PropertyRNA *parm;
ParameterIterator iter;
PointerRNA funcptr;
- int err= 0, i, flag, ret_len=0;
- const char is_static= (RNA_function_flag(func) & FUNC_NO_SELF) != 0;
+ int err = 0, i, flag, ret_len = 0;
+ const char is_static = (RNA_function_flag(func) & FUNC_NO_SELF) != 0;
/* annoying!, need to check if the screen gets set to NULL which is a
* hint that the file was actually re-loaded. */
char is_valid_wm;
- PropertyRNA *pret_single= NULL;
- void *retdata_single= NULL;
+ PropertyRNA *pret_single = NULL;
+ void *retdata_single = NULL;
PyGILState_STATE gilstate;
#ifdef USE_PEDANTIC_WRITE
- const int is_operator= RNA_struct_is_a(ptr->type, &RNA_Operator);
- const char *func_id= RNA_function_identifier(func);
+ const int is_operator = RNA_struct_is_a(ptr->type, &RNA_Operator);
+ const char *func_id = RNA_function_identifier(func);
/* testing, for correctness, not operator and not draw function */
- const short is_readonly= ((strncmp("draw", func_id, 4) ==0) || /* draw or draw_header */
+ const short is_readonly = ((strncmp("draw", func_id, 4) == 0) || /* draw or draw_header */
/*strstr("render", func_id) ||*/
!is_operator);
#endif
- py_class= RNA_struct_py_type_get(ptr->type);
+ py_class = RNA_struct_py_type_get(ptr->type);
/* rare case. can happen when registering subclasses */
- if (py_class==NULL) {
+ if (py_class == NULL) {
fprintf(stderr, "%s: unable to get python class for rna struct '%.200s'\n",
__func__, RNA_struct_identifier(ptr->type));
return -1;
@@ -6688,10 +6730,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
/* XXX, this is needed because render engine calls without a context
* this should be supported at some point but at the moment its not! */
- if (C==NULL)
- C= BPy_GetContext();
+ if (C == NULL)
+ C = BPy_GetContext();
- is_valid_wm= (CTX_wm_manager(C) != NULL);
+ is_valid_wm = (CTX_wm_manager(C) != NULL);
bpy_context_set(C, &gilstate);
@@ -6702,29 +6744,29 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
if (instance) {
if (*instance) {
- py_class_instance= *instance;
+ py_class_instance = *instance;
Py_INCREF(py_class_instance);
}
else {
/* store the instance here once its created */
- py_class_instance_store= instance;
+ py_class_instance_store = instance;
}
}
}
/* end exception */
- if (py_class_instance==NULL)
- py_srna= pyrna_struct_CreatePyObject(ptr);
+ if (py_class_instance == NULL)
+ py_srna = pyrna_struct_CreatePyObject(ptr);
if (py_class_instance) {
/* special case, instance is cached */
}
else if (py_srna == NULL) {
- py_class_instance= NULL;
+ py_class_instance = NULL;
}
else if (py_srna == Py_None) { /* probably wont ever happen but possible */
Py_DECREF(py_srna);
- py_class_instance= NULL;
+ py_class_instance = NULL;
}
else {
#if 1
@@ -6734,106 +6776,106 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
*/
if (py_class->tp_init) {
#ifdef USE_PEDANTIC_WRITE
- const int prev_write= rna_disallow_writes;
- rna_disallow_writes= is_operator ? FALSE : TRUE; /* only operators can write on __init__ */
+ const int prev_write = rna_disallow_writes;
+ rna_disallow_writes = is_operator ? FALSE : TRUE; /* only operators can write on __init__ */
#endif
/* true in most cases even when the class its self doesn't define an __init__ function. */
- args= PyTuple_New(0);
+ args = PyTuple_New(0);
if (py_class->tp_init(py_srna, args, NULL) < 0) {
Py_DECREF(py_srna);
- py_srna= NULL;
+ py_srna = NULL;
/* err set below */
}
Py_DECREF(args);
#ifdef USE_PEDANTIC_WRITE
- rna_disallow_writes= prev_write;
+ rna_disallow_writes = prev_write;
#endif
}
- py_class_instance= py_srna;
+ py_class_instance = py_srna;
#else
- const int prev_write= rna_disallow_writes;
- rna_disallow_writes= TRUE;
+ const int prev_write = rna_disallow_writes;
+ rna_disallow_writes = TRUE;
/* 'almost' all the time calling the class isn't needed.
* We could just do...
- py_class_instance= py_srna;
+ py_class_instance = py_srna;
Py_INCREF(py_class_instance);
* This would work fine but means __init__ functions wouldnt run.
* none of blenders default scripts use __init__ but its nice to call it
* for general correctness. just to note why this is here when it could be safely removed.
*/
- args= PyTuple_New(1);
+ args = PyTuple_New(1);
PyTuple_SET_ITEM(args, 0, py_srna);
- py_class_instance= PyObject_Call(py_class, args, NULL);
+ py_class_instance = PyObject_Call(py_class, args, NULL);
Py_DECREF(args);
- rna_disallow_writes= prev_write;
+ rna_disallow_writes = prev_write;
#endif
if (py_class_instance == NULL) {
- err= -1; /* so the error is not overridden below */
+ err = -1; /* so the error is not overridden below */
}
else if (py_class_instance_store) {
- *py_class_instance_store= py_class_instance;
+ *py_class_instance_store = py_class_instance;
Py_INCREF(py_class_instance);
}
}
}
if (err != -1 && (is_static || py_class_instance)) { /* Initializing the class worked, now run its invoke function */
- PyObject *item= PyObject_GetAttrString((PyObject *)py_class, RNA_function_identifier(func));
-// flag= RNA_function_flag(func);
+ PyObject *item = PyObject_GetAttrString((PyObject *)py_class, RNA_function_identifier(func));
+// flag = RNA_function_flag(func);
if (item) {
RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
- args= PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
+ args = PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
if (is_static) {
- i= 0;
+ i = 0;
}
else {
PyTuple_SET_ITEM(args, 0, py_class_instance);
- i= 1;
+ i = 1;
}
RNA_parameter_list_begin(parms, &iter);
/* parse function parameters */
for (; iter.valid; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
- flag= RNA_property_flag(parm);
+ parm = iter.parm;
+ flag = RNA_property_flag(parm);
/* only useful for single argument returns, we'll need another list loop for multiple */
if (flag & PROP_OUTPUT) {
ret_len++;
- if (pret_single==NULL) {
- pret_single= parm;
- retdata_single= iter.data;
+ if (pret_single == NULL) {
+ pret_single = parm;
+ retdata_single = iter.data;
}
continue;
}
- parmitem= pyrna_param_to_py(&funcptr, parm, iter.data);
+ parmitem = pyrna_param_to_py(&funcptr, parm, iter.data);
PyTuple_SET_ITEM(args, i, parmitem);
i++;
}
#ifdef USE_PEDANTIC_WRITE
- rna_disallow_writes= is_readonly ? TRUE:FALSE;
+ rna_disallow_writes = is_readonly ? TRUE:FALSE;
#endif
/* *** Main Caller *** */
- ret= PyObject_Call(item, args, NULL);
+ ret = PyObject_Call(item, args, NULL);
/* *** Done Calling *** */
#ifdef USE_PEDANTIC_WRITE
- rna_disallow_writes= FALSE;
+ rna_disallow_writes = FALSE;
#endif
RNA_parameter_list_end(&iter);
@@ -6846,7 +6888,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
PyErr_Format(PyExc_TypeError,
"could not find function %.200s in %.200s to execute callback",
RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
- err= -1;
+ err = -1;
}
}
else {
@@ -6855,23 +6897,23 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
PyErr_Format(PyExc_RuntimeError,
"could not create instance of %.200s to call callback function %.200s",
RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
- err= -1;
+ err = -1;
}
}
if (ret == NULL) { /* covers py_class_instance failing too */
- err= -1;
+ err = -1;
}
else {
- if (ret_len==0 && ret != Py_None) {
+ if (ret_len == 0 && ret != Py_None) {
PyErr_Format(PyExc_RuntimeError,
"expected class %.200s, function %.200s to return None, not %.200s",
RNA_struct_identifier(ptr->type), RNA_function_identifier(func),
Py_TYPE(ret)->tp_name);
- err= -1;
+ err = -1;
}
- else if (ret_len==1) {
- err= pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "");
+ else if (ret_len == 1) {
+ err = pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "");
/* when calling operator funcs only gives Function.result with
* no line number since the func has finished calling on error,
@@ -6886,32 +6928,32 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
}
else if (ret_len > 1) {
- if (PyTuple_Check(ret)==0) {
+ if (PyTuple_Check(ret) == 0) {
PyErr_Format(PyExc_RuntimeError,
"expected class %.200s, function %.200s to return a tuple of size %d, not %.200s",
RNA_struct_identifier(ptr->type), RNA_function_identifier(func),
ret_len, Py_TYPE(ret)->tp_name);
- err= -1;
+ err = -1;
}
else if (PyTuple_GET_SIZE(ret) != ret_len) {
PyErr_Format(PyExc_RuntimeError,
"class %.200s, function %.200s to returned %d items, expected %d",
RNA_struct_identifier(ptr->type), RNA_function_identifier(func),
PyTuple_GET_SIZE(ret), ret_len);
- err= -1;
+ err = -1;
}
else {
RNA_parameter_list_begin(parms, &iter);
/* parse function parameters */
- for (i= 0; iter.valid; RNA_parameter_list_next(&iter)) {
- parm= iter.parm;
- flag= RNA_property_flag(parm);
+ for (i = 0; iter.valid; RNA_parameter_list_next(&iter)) {
+ parm = iter.parm;
+ flag = RNA_property_flag(parm);
/* only useful for single argument returns, we'll need another list loop for multiple */
if (flag & PROP_OUTPUT) {
- err= pyrna_py_to_prop(&funcptr, parm, iter.data,
+ err = pyrna_py_to_prop(&funcptr, parm, iter.data,
PyTuple_GET_ITEM(ret, i++),
"calling class function:");
if (err) {
@@ -6929,17 +6971,17 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
if (err != 0) {
ReportList *reports;
/* alert the user, else they wont know unless they see the console. */
- if ( (!is_static) &&
- (ptr->data) &&
- (RNA_struct_is_a(ptr->type, &RNA_Operator)) &&
- (is_valid_wm == (CTX_wm_manager(C) != NULL)))
+ if ( (!is_static) &&
+ (ptr->data) &&
+ (RNA_struct_is_a(ptr->type, &RNA_Operator)) &&
+ (is_valid_wm == (CTX_wm_manager(C) != NULL)))
{
- wmOperator *op= ptr->data;
- reports= op->reports;
+ wmOperator *op = ptr->data;
+ reports = op->reports;
}
else {
/* wont alert users but they can view in 'info' space */
- reports= CTX_wm_reports(C);
+ reports = CTX_wm_reports(C);
}
BPy_errors_to_report(reports);
@@ -6956,13 +6998,13 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
static void bpy_class_free(void *pyob_ptr)
{
- PyObject *self= (PyObject *)pyob_ptr;
+ PyObject *self = (PyObject *)pyob_ptr;
PyGILState_STATE gilstate;
- gilstate= PyGILState_Ensure();
+ gilstate = PyGILState_Ensure();
// breaks re-registering classes
- // PyDict_Clear(((PyTypeObject*)self)->tp_dict);
+ // PyDict_Clear(((PyTypeObject *)self)->tp_dict);
//
// remove the rna attribute instead.
PyDict_DelItem(((PyTypeObject *)self)->tp_dict, bpy_intern_str_bl_rna);
@@ -6988,14 +7030,14 @@ void pyrna_alloc_types(void)
PointerRNA ptr;
PropertyRNA *prop;
- gilstate= PyGILState_Ensure();
+ gilstate = PyGILState_Ensure();
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&ptr);
- prop= RNA_struct_find_property(&ptr, "structs");
+ prop = RNA_struct_find_property(&ptr, "structs");
RNA_PROP_BEGIN(&ptr, itemptr, prop) {
- PyObject *item= pyrna_struct_Subtype(&itemptr);
+ PyObject *item = pyrna_struct_Subtype(&itemptr);
if (item == NULL) {
if (PyErr_Occurred()) {
PyErr_Print();
@@ -7019,12 +7061,12 @@ void pyrna_free_types(void)
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&ptr);
- prop= RNA_struct_find_property(&ptr, "structs");
+ prop = RNA_struct_find_property(&ptr, "structs");
RNA_PROP_BEGIN(&ptr, itemptr, prop) {
- StructRNA *srna= srna_from_ptr(&itemptr);
- void *py_ptr= RNA_struct_py_type_get(srna);
+ StructRNA *srna = srna_from_ptr(&itemptr);
+ void *py_ptr = RNA_struct_py_type_get(srna);
if (py_ptr) {
#if 0 // XXX - should be able to do this but makes python crash on exit
@@ -7062,10 +7104,10 @@ PyDoc_STRVAR(pyrna_register_class_doc,
" subclass of a registerable blender class.\n"
"\n"
);
-PyMethodDef meth_bpy_register_class= {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
+PyMethodDef meth_bpy_register_class = {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class)
{
- bContext *C= NULL;
+ bContext *C = NULL;
ReportList reports;
StructRegisterFunc reg;
StructRNA *srna;
@@ -7073,14 +7115,14 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
const char *identifier;
PyObject *py_cls_meth;
- if (PyDict_GetItem(((PyTypeObject*)py_class)->tp_dict, bpy_intern_str_bl_rna)) {
+ if (PyDict_GetItem(((PyTypeObject *)py_class)->tp_dict, bpy_intern_str_bl_rna)) {
PyErr_SetString(PyExc_AttributeError, "register_class(...): already registered as a subclass");
return NULL;
}
/* warning: gets parent classes srna, only for the register function */
- srna= pyrna_struct_as_srna(py_class, 1, "register_class(...):");
- if (srna==NULL)
+ srna = pyrna_struct_as_srna(py_class, 1, "register_class(...):");
+ if (srna == NULL)
return NULL;
/* fails in cases, cant use this check but would like to :| */
@@ -7088,13 +7130,13 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
if (RNA_struct_py_type_get(srna)) {
PyErr_Format(PyExc_ValueError,
"register_class(...): %.200s's parent class %.200s is already registered, this is not allowed",
- ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
+ ((PyTypeObject *)py_class)->tp_name, RNA_struct_identifier(srna));
return NULL;
}
*/
/* check that we have a register callback for this type */
- reg= RNA_struct_register(srna);
+ reg = RNA_struct_register(srna);
if (!reg) {
PyErr_Format(PyExc_ValueError,
@@ -7105,15 +7147,15 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
}
/* get the context, so register callback can do necessary refreshes */
- C= BPy_GetContext();
+ C = BPy_GetContext();
/* call the register callback with reports & identifier */
BKE_reports_init(&reports, RPT_STORE);
- identifier= ((PyTypeObject*)py_class)->tp_name;
+ identifier = ((PyTypeObject *)py_class)->tp_name;
- srna_new= reg(CTX_data_main(C), &reports, py_class, identifier,
- bpy_class_validate, bpy_class_call, bpy_class_free);
+ srna_new = reg(CTX_data_main(C), &reports, py_class, identifier,
+ bpy_class_validate, bpy_class_call, bpy_class_free);
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
return NULL;
@@ -7133,18 +7175,18 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
/* Can't use this because it returns a dict proxy
*
- * item= PyObject_GetAttrString(py_class, "__dict__");
+ * item = PyObject_GetAttrString(py_class, "__dict__");
*/
- if (pyrna_deferred_register_class(srna_new, py_class)!=0)
+ if (pyrna_deferred_register_class(srna_new, py_class) != 0)
return NULL;
/* call classed register method () */
- py_cls_meth= PyObject_GetAttr(py_class, bpy_intern_str_register);
+ py_cls_meth = PyObject_GetAttr(py_class, bpy_intern_str_register);
if (py_cls_meth == NULL) {
PyErr_Clear();
}
else {
- PyObject *ret= PyObject_CallObject(py_cls_meth, NULL);
+ PyObject *ret = PyObject_CallObject(py_cls_meth, NULL);
if (ret) {
Py_DECREF(ret);
}
@@ -7163,16 +7205,16 @@ static int pyrna_srna_contains_pointer_prop_srna(StructRNA *srna_props, StructRN
LinkData *link;
/* verify properties */
- const ListBase *lb= RNA_struct_type_properties(srna);
+ const ListBase *lb = RNA_struct_type_properties(srna);
- for (link=lb->first; link; link=link->next) {
- prop= (PropertyRNA*)link;
+ for (link = lb->first; link; link = link->next) {
+ prop = (PropertyRNA *)link;
if (RNA_property_type(prop) == PROP_POINTER && !(RNA_property_flag(prop) & PROP_BUILTIN)) {
PointerRNA tptr;
RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
if (RNA_property_pointer_type(&tptr, prop) == srna) {
- *prop_identifier= RNA_property_identifier(prop);
+ *prop_identifier = RNA_property_identifier(prop);
return 1;
}
}
@@ -7189,26 +7231,28 @@ PyDoc_STRVAR(pyrna_unregister_class_doc,
" If the class has an *unregister* class method it will be called\n"
" before unregistering.\n"
);
-PyMethodDef meth_bpy_unregister_class= {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
+PyMethodDef meth_bpy_unregister_class = {
+ "unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc
+};
static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class)
{
- bContext *C= NULL;
+ bContext *C = NULL;
StructUnregisterFunc unreg;
StructRNA *srna;
PyObject *py_cls_meth;
- /*if (PyDict_GetItem(((PyTypeObject*)py_class)->tp_dict, bpy_intern_str_bl_rna)==NULL) {
+ /*if (PyDict_GetItem(((PyTypeObject *)py_class)->tp_dict, bpy_intern_str_bl_rna) == NULL) {
PWM_cursor_wait(0);
PyErr_SetString(PyExc_ValueError, "unregister_class(): not a registered as a subclass");
return NULL;
}*/
- srna= pyrna_struct_as_srna(py_class, 0, "unregister_class(...):");
- if (srna==NULL)
+ srna = pyrna_struct_as_srna(py_class, 0, "unregister_class(...):");
+ if (srna == NULL)
return NULL;
/* check that we have a unregister callback for this type */
- unreg= RNA_struct_unregister(srna);
+ unreg = RNA_struct_unregister(srna);
if (!unreg) {
PyErr_SetString(PyExc_ValueError,
@@ -7218,12 +7262,12 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
}
/* call classed unregister method */
- py_cls_meth= PyObject_GetAttr(py_class, bpy_intern_str_unregister);
+ py_cls_meth = PyObject_GetAttr(py_class, bpy_intern_str_unregister);
if (py_cls_meth == NULL) {
PyErr_Clear();
}
else {
- PyObject *ret= PyObject_CallObject(py_cls_meth, NULL);
+ PyObject *ret = PyObject_CallObject(py_cls_meth, NULL);
if (ret) {
Py_DECREF(ret);
}
@@ -7238,16 +7282,16 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
StructRNA *srna_iter;
PointerRNA ptr_rna;
PropertyRNA *prop_rna;
- const char *prop_identifier= NULL;
+ const char *prop_identifier = NULL;
RNA_blender_rna_pointer_create(&ptr_rna);
- prop_rna= RNA_struct_find_property(&ptr_rna, "structs");
+ prop_rna = RNA_struct_find_property(&ptr_rna, "structs");
/* loop over all structs */
RNA_PROP_BEGIN(&ptr_rna, itemptr, prop_rna) {
- srna_iter= itemptr.data;
+ srna_iter = itemptr.data;
if (pyrna_srna_contains_pointer_prop_srna(srna_iter, srna, &prop_identifier)) {
break;
}
@@ -7263,7 +7307,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
}
/* get the context, so register callback can do necessary refreshes */
- C= BPy_GetContext();
+ C = BPy_GetContext();
/* call unregister */
unreg(CTX_data_main(C), srna); /* calls bpy_class_free, this decref's py_class */
diff --git a/source/blender/python/intern/bpy_rna_anim.c b/source/blender/python/intern/bpy_rna_anim.c
index 8f88814b3e4..2371ca7dc50 100644
--- a/source/blender/python/intern/bpy_rna_anim.c
+++ b/source/blender/python/intern/bpy_rna_anim.c
@@ -59,11 +59,11 @@ static int pyrna_struct_anim_args_parse(
PointerRNA *ptr, const char *error_prefix, const char *path,
const char **path_full, int *index)
{
- const int is_idbase= RNA_struct_is_ID(ptr->type);
+ const int is_idbase = RNA_struct_is_ID(ptr->type);
PropertyRNA *prop;
PointerRNA r_ptr;
- if (ptr->data==NULL) {
+ if (ptr->data == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s this struct has no data, can't be animated",
error_prefix);
@@ -72,9 +72,9 @@ static int pyrna_struct_anim_args_parse(
/* full paths can only be given from ID base */
if (is_idbase) {
- int r_index= -1;
- if (RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index)==0) {
- prop= NULL;
+ int r_index = -1;
+ if (RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index) == 0) {
+ prop = NULL;
}
else if (r_index != -1) {
PyErr_Format(PyExc_ValueError,
@@ -90,11 +90,11 @@ static int pyrna_struct_anim_args_parse(
}
}
else {
- prop= RNA_struct_find_property(ptr, path);
- r_ptr= *ptr;
+ prop = RNA_struct_find_property(ptr, path);
+ r_ptr = *ptr;
}
- if (prop==NULL) {
+ if (prop == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s property \"%s\" not found",
error_prefix, path);
@@ -110,7 +110,7 @@ static int pyrna_struct_anim_args_parse(
if (RNA_property_array_check(prop) == 0) {
if ((*index) == -1) {
- *index= 0;
+ *index = 0;
}
else {
PyErr_Format(PyExc_TypeError,
@@ -120,7 +120,7 @@ static int pyrna_struct_anim_args_parse(
}
}
else {
- int array_len= RNA_property_array_length(&r_ptr, prop);
+ int array_len = RNA_property_array_length(&r_ptr, prop);
if ((*index) < -1 || (*index) >= array_len) {
PyErr_Format(PyExc_TypeError,
"%.200s index out of range \"%s\", given %d, array length is %d",
@@ -130,12 +130,12 @@ static int pyrna_struct_anim_args_parse(
}
if (is_idbase) {
- *path_full= BLI_strdup(path);
+ *path_full = BLI_strdup(path);
}
else {
- *path_full= RNA_path_from_ID_to_property(&r_ptr, prop);
+ *path_full = RNA_path_from_ID_to_property(&r_ptr, prop);
- if (*path_full==NULL) {
+ if (*path_full == NULL) {
PyErr_Format(PyExc_TypeError,
"%.200s could not make path to \"%s\"",
error_prefix, path);
@@ -148,10 +148,10 @@ static int pyrna_struct_anim_args_parse(
/* internal use for insert and delete */
static int pyrna_struct_keyframe_parse(
- PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
- const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
+ PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
+ const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
{
- static const char *kwlist[]= {"data_path", "index", "frame", "group", NULL};
+ static const char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
const char *path;
/* note, parse_str MUST start with 's|ifs' */
@@ -161,8 +161,8 @@ static int pyrna_struct_keyframe_parse(
if (pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
return -1;
- if (*cfra==FLT_MAX)
- *cfra= CTX_data_scene(BPy_GetContext())->r.cfra;
+ if (*cfra == FLT_MAX)
+ *cfra = CTX_data_scene(BPy_GetContext())->r.cfra;
return 0; /* success */
}
@@ -186,10 +186,10 @@ char pyrna_struct_keyframe_insert_doc[] =
PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
/* args, pyrna_struct_keyframe_parse handles these */
- const char *path_full= NULL;
- int index= -1;
- float cfra= FLT_MAX;
- const char *group_name= NULL;
+ const char *path_full = NULL;
+ int index = -1;
+ float cfra = FLT_MAX;
+ const char *group_name = NULL;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -205,7 +205,7 @@ PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyOb
BKE_reports_init(&reports, RPT_STORE);
- result= insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ result = insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
MEM_freeN((void *)path_full);
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
@@ -234,10 +234,10 @@ char pyrna_struct_keyframe_delete_doc[] =
PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
/* args, pyrna_struct_keyframe_parse handles these */
- const char *path_full= NULL;
- int index= -1;
- float cfra= FLT_MAX;
- const char *group_name= NULL;
+ const char *path_full = NULL;
+ int index = -1;
+ float cfra = FLT_MAX;
+ const char *group_name = NULL;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -254,7 +254,7 @@ PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyOb
BKE_reports_init(&reports, RPT_STORE);
- result= delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ result = delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
MEM_freeN((void *)path_full);
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
@@ -280,7 +280,7 @@ char pyrna_struct_driver_add_doc[] =
PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
{
const char *path, *path_full;
- int index= -1;
+ int index = -1;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -291,39 +291,39 @@ PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
return NULL;
}
else {
- PyObject *ret= NULL;
+ PyObject *ret = NULL;
ReportList reports;
int result;
BKE_reports_init(&reports, RPT_STORE);
- result= ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
+ result = ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
if (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
return NULL;
if (result) {
- ID *id= self->ptr.id.data;
- AnimData *adt= BKE_animdata_from_id(id);
+ ID *id = self->ptr.id.data;
+ AnimData *adt = BKE_animdata_from_id(id);
FCurve *fcu;
PointerRNA tptr;
PyObject *item;
if (index == -1) { /* all, use a list */
- int i= 0;
- ret= PyList_New(0);
- while ((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ int i = 0;
+ ret = PyList_New(0);
+ while ((fcu = list_find_fcurve(&adt->drivers, path_full, i++))) {
RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- item= pyrna_struct_CreatePyObject(&tptr);
+ item = pyrna_struct_CreatePyObject(&tptr);
PyList_Append(ret, item);
Py_DECREF(item);
}
}
else {
- fcu= list_find_fcurve(&adt->drivers, path_full, index);
+ fcu = list_find_fcurve(&adt->drivers, path_full, index);
RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- ret= pyrna_struct_CreatePyObject(&tptr);
+ ret = pyrna_struct_CreatePyObject(&tptr);
}
WM_event_add_notifier(BPy_GetContext(), NC_ANIMATION|ND_FCURVES_ORDER, NULL);
@@ -356,7 +356,7 @@ char pyrna_struct_driver_remove_doc[] =
PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
{
const char *path, *path_full;
- int index= -1;
+ int index = -1;
PYRNA_STRUCT_CHECK_OBJ(self);
@@ -372,7 +372,7 @@ PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
BKE_reports_init(&reports, RPT_STORE);
- result= ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
+ result = ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
MEM_freeN((void *)path_full);
diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c
index 1d1cab1c66d..a74d0417ca2 100644
--- a/source/blender/python/intern/bpy_rna_array.c
+++ b/source/blender/python/intern/bpy_rna_array.c
@@ -36,6 +36,12 @@
#include "RNA_access.h"
+#define USE_MATHUTILS
+
+#ifdef USE_MATHUTILS
+# include "../mathutils/mathutils.h" /* so we can have mathutils callbacks */
+#endif
+
#define MAX_ARRAY_DIMENSION 10
typedef void (*ItemConvertFunc)(PyObject *, char *);
@@ -49,14 +55,14 @@ typedef void (*RNA_SetIndexFunc)(PointerRNA *, PropertyRNA *, int index, void *)
*/
/*
- arr[2]= x
+ arr[2] = x
py_to_array_index(arraydim=0, arrayoffset=0, index=2)
validate_array(lvalue_dim=0)
... make real index ...
*/
-/* arr[3]=x, self->arraydim is 0, lvalue_dim is 1 */
+/* arr[3] = x, self->arraydim is 0, lvalue_dim is 1 */
/* Ensures that a python sequence has expected number of items/sub-items and items are of desired type. */
static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[],
ItemTypeCheckFunc check_item_type, const char *item_type_str, const char *error_prefix)
@@ -66,59 +72,62 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
/* not the last dimension */
if (dim + 1 < totdim) {
/* check that a sequence contains dimsize[dim] items */
- const Py_ssize_t seq_size= PySequence_Size(seq);
+ const Py_ssize_t seq_size = PySequence_Size(seq);
if (seq_size == -1) {
PyErr_Format(PyExc_ValueError, "%s sequence expected at dimension %d, not '%s'",
error_prefix, (int)dim + 1, Py_TYPE(seq)->tp_name);
return -1;
}
- for (i= 0; i < seq_size; i++) {
+ for (i = 0; i < seq_size; i++) {
PyObject *item;
- int ok= 1;
- item= PySequence_GetItem(seq, i);
+ int ok = 1;
+ item = PySequence_GetItem(seq, i);
if (item == NULL) {
PyErr_Format(PyExc_TypeError, "%s sequence type '%s' failed to retrieve index %d",
error_prefix, Py_TYPE(seq)->tp_name, i);
- ok= 0;
+ ok = 0;
}
else if (!PySequence_Check(item)) {
/* BLI_snprintf(error_str, error_str_size, "expected a sequence of %s", item_type_str); */
PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s, not %s",
error_prefix, item_type_str, Py_TYPE(item)->tp_name);
- ok= 0;
+ ok = 0;
}
/* arr[3][4][5]
- dimsize[1]=4
- dimsize[2]=5
-
- dim=0 */
+ * dimsize[1] = 4
+ * dimsize[2] = 5
+ *
+ * dim = 0 */
else if (PySequence_Size(item) != dimsize[dim + 1]) {
- /* BLI_snprintf(error_str, error_str_size, "sequences of dimension %d should contain %d items", (int)dim + 1, (int)dimsize[dim + 1]); */
+ /* BLI_snprintf(error_str, error_str_size,
+ "sequences of dimension %d should contain %d items",
+ (int)dim + 1, (int)dimsize[dim + 1]); */
PyErr_Format(PyExc_ValueError, "%s sequences of dimension %d should contain %d items",
error_prefix, (int)dim + 1, (int)dimsize[dim + 1]);
- ok= 0;
+ ok = 0;
}
else if (validate_array_type(item, dim + 1, totdim, dimsize, check_item_type, item_type_str, error_prefix) == -1) {
- ok= 0;
+ ok = 0;
}
Py_XDECREF(item);
- if (!ok)
+ if (!ok) {
return -1;
+ }
}
}
else {
/* check that items are of correct type */
- const int seq_size= PySequence_Size(seq);
+ const int seq_size = PySequence_Size(seq);
if (seq_size == -1) {
PyErr_Format(PyExc_ValueError, "%s sequence expected at dimension %d, not '%s'",
error_prefix, (int)dim + 1, Py_TYPE(seq)->tp_name);
return -1;
}
- for (i= 0; i < seq_size; i++) {
- PyObject *item= PySequence_GetItem(seq, i);
+ for (i = 0; i < seq_size; i++) {
+ PyObject *item = PySequence_GetItem(seq, i);
if (item == NULL) {
PyErr_Format(PyExc_TypeError, "%s sequence type '%s' failed to retrieve index %d",
@@ -144,32 +153,32 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
/* Returns the number of items in a single- or multi-dimensional sequence. */
static int count_items(PyObject *seq, int dim)
{
- int totitem= 0;
+ int totitem = 0;
if (dim > 1) {
- const Py_ssize_t seq_size= PySequence_Size(seq);
+ const Py_ssize_t seq_size = PySequence_Size(seq);
Py_ssize_t i;
- for (i= 0; i < seq_size; i++) {
- PyObject *item= PySequence_GetItem(seq, i);
+ for (i = 0; i < seq_size; i++) {
+ PyObject *item = PySequence_GetItem(seq, i);
if (item) {
- const int tot= count_items(item, dim - 1);
+ const int tot = count_items(item, dim - 1);
Py_DECREF(item);
if (tot != -1) {
totitem += tot;
}
else {
- totitem= -1;
+ totitem = -1;
break;
}
}
else {
- totitem= -1;
+ totitem = -1;
break;
}
}
}
else {
- totitem= PySequence_Size(seq);
+ totitem = PySequence_Size(seq);
}
return totitem;
@@ -182,8 +191,8 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
int dimsize[MAX_ARRAY_DIMENSION];
int tot, totdim, len;
- totdim= RNA_property_array_dimension(ptr, prop, dimsize);
- tot= count_items(rvalue, totdim - lvalue_dim);
+ totdim = RNA_property_array_dimension(ptr, prop, dimsize);
+ tot = count_items(rvalue, totdim - lvalue_dim);
if (tot == -1) {
PyErr_Format(PyExc_ValueError, "%s %.200s.%.200s, error validating the sequence length",
@@ -195,45 +204,47 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
#if 0
/* length is flexible */
if (!RNA_property_dynamic_array_set_length(ptr, prop, tot)) {
- /* BLI_snprintf(error_str, error_str_size, "%s.%s: array length cannot be changed to %d", RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot); */
+ /* BLI_snprintf(error_str, error_str_size,
+ "%s.%s: array length cannot be changed to %d",
+ RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot); */
PyErr_Format(PyExc_ValueError, "%s %s.%s: array length cannot be changed to %d",
error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot);
return -1;
}
#else
- *totitem= tot;
+ *totitem = tot;
return 0;
#endif
}
- len= tot;
+ len = tot;
}
else {
/* length is a constraint */
if (!lvalue_dim) {
- len= RNA_property_array_length(ptr, prop);
+ len = RNA_property_array_length(ptr, prop);
}
/* array item assignment */
else {
int i;
- len= 1;
+ len = 1;
/* arr[3][4][5]
- arr[2]= x
- dimsize={4, 5}
- dimsize[1]= 4
- dimsize[2]= 5
- lvalue_dim=0, totdim=3
+ arr[2] = x
+ dimsize = {4, 5}
+ dimsize[1] = 4
+ dimsize[2] = 5
+ lvalue_dim = 0, totdim = 3
- arr[2][3]= x
- lvalue_dim=1
+ arr[2][3] = x
+ lvalue_dim = 1
- arr[2][3][4]= x
- lvalue_dim=2 */
- for (i= lvalue_dim; i < totdim; i++)
+ arr[2][3][4] = x
+ lvalue_dim = 2 */
+ for (i = lvalue_dim; i < totdim; i++)
len *= dimsize[i];
}
@@ -245,7 +256,7 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
}
}
- *totitem= len;
+ *totitem = len;
return 0;
}
@@ -255,14 +266,51 @@ static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop,
const char *error_prefix)
{
int dimsize[MAX_ARRAY_DIMENSION];
- int totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+ int totdim = RNA_property_array_dimension(ptr, prop, dimsize);
/* validate type first because length validation may modify property array length */
- if (validate_array_type(rvalue, lvalue_dim, totdim, dimsize, check_item_type, item_type_str, error_prefix) == -1)
- return -1;
- return validate_array_length(rvalue, ptr, prop, lvalue_dim, totitem, error_prefix);
+#ifdef USE_MATHUTILS
+ if (lvalue_dim == 0) { /* only valid for first level array */
+ if (MatrixObject_Check(rvalue)) {
+ MatrixObject *pymat = (MatrixObject *)rvalue;
+
+ if (BaseMath_ReadCallback(pymat) == -1)
+ return -1;
+
+ if (RNA_property_type(prop) != PROP_FLOAT) {
+ PyErr_Format(PyExc_ValueError, "%s %.200s.%.200s, matrix assign to non float array",
+ error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ return -1;
+ }
+ else if (totdim != 2) {
+ PyErr_Format(PyExc_ValueError, "%s %.200s.%.200s, matrix assign array with %d dimensions",
+ error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), totdim);
+ return -1;
+ }
+ else if (pymat->num_col != dimsize[0] || pymat->num_row != dimsize[1]) {
+ PyErr_Format(PyExc_ValueError, "%s %.200s.%.200s, matrix assign dimension size mismatch, "
+ "is %dx%d, expected be %dx%d",
+ error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop),
+ pymat->num_col, pymat->num_row, dimsize[0], dimsize[1]);
+ return -1;
+ }
+ else {
+ *totitem = dimsize[0] * dimsize[1];
+ return 0;
+ }
+ }
+ }
+#endif /* USE_MATHUTILS */
+
+
+ {
+ if (validate_array_type(rvalue, lvalue_dim, totdim, dimsize, check_item_type, item_type_str, error_prefix) == -1)
+ return -1;
+
+ return validate_array_length(rvalue, ptr, prop, lvalue_dim, totitem, error_prefix);
+ }
}
static char *copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *prop,
@@ -274,7 +322,7 @@ static char *copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *pro
convert_item(item, value);
rna_set_index(ptr, prop, *index, value);
- *index= *index + 1;
+ *index = *index + 1;
}
else {
convert_item(item, data);
@@ -288,8 +336,8 @@ static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop,
int dim, char *data, unsigned int item_size, int *index,
ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index)
{
- int totdim= RNA_property_array_dimension(ptr, prop, NULL);
- const Py_ssize_t seq_size= PySequence_Size(seq);
+ int totdim = RNA_property_array_dimension(ptr, prop, NULL);
+ const Py_ssize_t seq_size = PySequence_Size(seq);
Py_ssize_t i;
/* Regarding PySequence_GetItem() failing.
@@ -305,14 +353,34 @@ static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop,
return NULL;
}
- for (i= 0; i < seq_size; i++) {
- PyObject *item= PySequence_GetItem(seq, i);
+
+#ifdef USE_MATHUTILS
+ if (dim == 0) {
+ if (MatrixObject_Check(seq)) {
+ MatrixObject *pymat = (MatrixObject *)seq;
+ size_t allocsize = pymat->num_col * pymat->num_row * sizeof(float);
+
+ /* read callback already done by validate */
+ /* since this is the first iteration we can assume data is allocated */
+ memcpy(data, pymat->matrix, allocsize);
+
+ /* not really needed but do for completeness */
+ data += allocsize;
+
+ return data;
+ }
+ }
+#endif /* USE_MATHUTILS */
+
+
+ for (i = 0; i < seq_size; i++) {
+ PyObject *item = PySequence_GetItem(seq, i);
if (item) {
if (dim + 1 < totdim) {
- data= copy_values(item, ptr, prop, dim + 1, data, item_size, index, convert_item, rna_set_index);
+ data = copy_values(item, ptr, prop, dim + 1, data, item_size, index, convert_item, rna_set_index);
}
else {
- data= copy_value_single(item, ptr, prop, data, item_size, index, convert_item, rna_set_index);
+ data = copy_value_single(item, ptr, prop, data, item_size, index, convert_item, rna_set_index);
}
Py_DECREF(item);
@@ -333,9 +401,9 @@ static int py_to_array(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop,
{
/*int totdim, dim_size[MAX_ARRAY_DIMENSION];*/
int totitem;
- char *data= NULL;
+ char *data = NULL;
- /*totdim= RNA_property_array_dimension(ptr, prop, dim_size);*/ /*UNUSED*/
+ /*totdim = RNA_property_array_dimension(ptr, prop, dim_size);*/ /*UNUSED*/
if (validate_array(seq, ptr, prop, 0, check_item_type, item_type_str, &totitem, error_prefix) == -1) {
return -1;
@@ -345,30 +413,30 @@ static int py_to_array(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop,
/* note: this code is confusing */
if (param_data && RNA_property_flag(prop) & PROP_DYNAMIC) {
/* not freeing allocated mem, RNA_parameter_list_free() will do this */
- ParameterDynAlloc *param_alloc= (ParameterDynAlloc *)param_data;
- param_alloc->array_tot= (int)totitem;
- param_alloc->array= MEM_callocN(item_size * totitem, "py_to_array dyn"); /* freeing param list will free */
+ ParameterDynAlloc *param_alloc = (ParameterDynAlloc *)param_data;
+ param_alloc->array_tot = (int)totitem;
+ param_alloc->array = MEM_callocN(item_size * totitem, "py_to_array dyn"); /* freeing param list will free */
- data= param_alloc->array;
+ data = param_alloc->array;
}
else if (param_data) {
- data= param_data;
+ data = param_data;
}
else {
- data= PyMem_MALLOC(item_size * totitem);
+ data = PyMem_MALLOC(item_size * totitem);
}
/* will only fail in very rare cases since we already validated the
* python data, the check here is mainly for completeness. */
if (copy_values(seq, ptr, prop, 0, data, item_size, NULL, convert_item, NULL) != NULL) {
- if (param_data==NULL) {
+ if (param_data == NULL) {
/* NULL can only pass through in case RNA property arraylength is 0 (impossible?) */
rna_set_array(ptr, prop, data);
PyMem_FREE(data);
}
}
else {
- if (param_data==NULL) {
+ if (param_data == NULL) {
PyMem_FREE(data);
}
@@ -389,21 +457,21 @@ static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop,
int totdim, dimsize[MAX_ARRAY_DIMENSION];
int totitem, i;
- totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+ totdim = RNA_property_array_dimension(ptr, prop, dimsize);
/* convert index */
/* arr[3][4][5]
- arr[2]= x
- lvalue_dim=0, index= 0 + 2 * 4 * 5
+ arr[2] = x
+ lvalue_dim = 0, index = 0 + 2 * 4 * 5
- arr[2][3]= x
- lvalue_dim=1, index= 40 + 3 * 5 */
+ arr[2][3] = x
+ lvalue_dim = 1, index = 40 + 3 * 5 */
lvalue_dim++;
- for (i= lvalue_dim; i < totdim; i++)
+ for (i = lvalue_dim; i < totdim; i++)
index *= dimsize[i];
index += arrayoffset;
@@ -432,17 +500,17 @@ static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop,
static void py_to_float(PyObject *py, char *data)
{
- *(float*)data= (float)PyFloat_AsDouble(py);
+ *(float *)data = (float)PyFloat_AsDouble(py);
}
static void py_to_int(PyObject *py, char *data)
{
- *(int*)data= (int)PyLong_AsSsize_t(py);
+ *(int *)data = (int)PyLong_AsSsize_t(py);
}
static void py_to_bool(PyObject *py, char *data)
{
- *(int*)data= (int)PyObject_IsTrue(py);
+ *(int *)data = (int)PyObject_IsTrue(py);
}
static int py_float_check(PyObject *py)
@@ -464,17 +532,17 @@ static int py_bool_check(PyObject *py)
static void float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
{
- RNA_property_float_set_index(ptr, prop, index, *(float*)value);
+ RNA_property_float_set_index(ptr, prop, index, *(float *)value);
}
static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
{
- RNA_property_int_set_index(ptr, prop, index, *(int*)value);
+ RNA_property_int_set_index(ptr, prop, index, *(int *)value);
}
static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
{
- RNA_property_boolean_set_index(ptr, prop, index, *(int*)value);
+ RNA_property_boolean_set_index(ptr, prop, index, *(int *)value);
}
int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data,
@@ -483,20 +551,20 @@ int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data,
int ret;
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
- ret= py_to_array(py, ptr, prop, param_data, py_float_check, "float", sizeof(float),
+ ret = py_to_array(py, ptr, prop, param_data, py_float_check, "float", sizeof(float),
py_to_float, (RNA_SetArrayFunc)RNA_property_float_set_array, error_prefix);
break;
case PROP_INT:
- ret= py_to_array(py, ptr, prop, param_data, py_int_check, "int", sizeof(int),
+ ret = py_to_array(py, ptr, prop, param_data, py_int_check, "int", sizeof(int),
py_to_int, (RNA_SetArrayFunc)RNA_property_int_set_array, error_prefix);
break;
case PROP_BOOLEAN:
- ret= py_to_array(py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(int),
+ ret = py_to_array(py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(int),
py_to_bool, (RNA_SetArrayFunc)RNA_property_boolean_set_array, error_prefix);
break;
default:
PyErr_SetString(PyExc_TypeError, "not an array type");
- ret= -1;
+ ret = -1;
}
return ret;
@@ -508,20 +576,20 @@ int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, in
int ret;
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
- ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
+ ret = py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
py_float_check, "float", py_to_float, float_set_index, error_prefix);
break;
case PROP_INT:
- ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
+ ret = py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
py_int_check, "int", py_to_int, int_set_index, error_prefix);
break;
case PROP_BOOLEAN:
- ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
+ ret = py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index,
py_bool_check, "boolean", py_to_bool, bool_set_index, error_prefix);
break;
default:
PyErr_SetString(PyExc_TypeError, "not an array type");
- ret= -1;
+ ret = -1;
}
return ret;
@@ -533,17 +601,17 @@ PyObject *pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
switch (RNA_property_type(prop)) {
case PROP_FLOAT:
- item= PyFloat_FromDouble(RNA_property_float_get_index(ptr, prop, index));
+ item = PyFloat_FromDouble(RNA_property_float_get_index(ptr, prop, index));
break;
case PROP_BOOLEAN:
- item= PyBool_FromLong(RNA_property_boolean_get_index(ptr, prop, index));
+ item = PyBool_FromLong(RNA_property_boolean_get_index(ptr, prop, index));
break;
case PROP_INT:
- item= PyLong_FromSsize_t(RNA_property_int_get_index(ptr, prop, index));
+ item = PyLong_FromSsize_t(RNA_property_int_get_index(ptr, prop, index));
break;
default:
PyErr_SetString(PyExc_TypeError, "not an array type");
- item= NULL;
+ item = NULL;
}
return item;
@@ -556,20 +624,20 @@ static PyObject *pyrna_py_from_array_internal(PointerRNA *ptr, PropertyRNA *prop
{
PyObject *tuple;
int i, len;
- int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ int totdim = RNA_property_array_dimension(ptr, prop, NULL);
- len= RNA_property_multi_array_length(ptr, prop, dim);
+ len = RNA_property_multi_array_length(ptr, prop, dim);
- tuple= PyTuple_New(len);
+ tuple = PyTuple_New(len);
- for (i= 0; i < len; i++) {
+ for (i = 0; i < len; i++) {
PyObject *item;
if (dim + 1 < totdim)
- item= pyrna_py_from_array_internal(ptr, prop, dim + 1, index);
+ item = pyrna_py_from_array_internal(ptr, prop, dim + 1, index);
else {
- item= pyrna_array_index(ptr, prop, *index);
- *index= *index + 1;
+ item = pyrna_array_index(ptr, prop, *index);
+ *index = *index + 1;
}
if (!item) {
@@ -587,13 +655,13 @@ static PyObject *pyrna_py_from_array_internal(PointerRNA *ptr, PropertyRNA *prop
PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index)
{
int totdim, arraydim, arrayoffset, dimsize[MAX_ARRAY_DIMENSION], i, len;
- BPy_PropertyArrayRNA *ret= NULL;
+ BPy_PropertyArrayRNA *ret = NULL;
- arraydim= self ? self->arraydim : 0;
- arrayoffset= self ? self->arrayoffset : 0;
+ arraydim = self ? self->arraydim : 0;
+ arrayoffset = self ? self->arrayoffset : 0;
/* just in case check */
- len= RNA_property_multi_array_length(ptr, prop, arraydim);
+ len = RNA_property_multi_array_length(ptr, prop, arraydim);
if (index >= len || index < 0) {
/* this shouldn't happen because higher level funcs must check for invalid index */
if (G.f & G_DEBUG) printf("pyrna_py_from_array_index: invalid index %d for array with length=%d\n", index, len);
@@ -602,38 +670,38 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
return NULL;
}
- totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+ totdim = RNA_property_array_dimension(ptr, prop, dimsize);
if (arraydim + 1 < totdim) {
- ret= (BPy_PropertyArrayRNA*)pyrna_prop_CreatePyObject(ptr, prop);
- ret->arraydim= arraydim + 1;
+ ret = (BPy_PropertyArrayRNA *)pyrna_prop_CreatePyObject(ptr, prop);
+ ret->arraydim = arraydim + 1;
/* arr[3][4][5]
- x= arr[2]
- index= 0 + 2 * 4 * 5
+ x = arr[2]
+ index = 0 + 2 * 4 * 5
- x= arr[2][3]
- index= offset + 3 * 5 */
+ x = arr[2][3]
+ index = offset + 3 * 5 */
- for (i= arraydim + 1; i < totdim; i++)
+ for (i = arraydim + 1; i < totdim; i++)
index *= dimsize[i];
- ret->arrayoffset= arrayoffset + index;
+ ret->arrayoffset = arrayoffset + index;
}
else {
- index= arrayoffset + index;
- ret= (BPy_PropertyArrayRNA *)pyrna_array_index(ptr, prop, index);
+ index = arrayoffset + index;
+ ret = (BPy_PropertyArrayRNA *)pyrna_array_index(ptr, prop, index);
}
- return (PyObject*)ret;
+ return (PyObject *)ret;
}
PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
{
PyObject *ret;
- ret= pyrna_math_object_from_array(ptr, prop);
+ ret = pyrna_math_object_from_array(ptr, prop);
/* is this a maths object? */
if (ret) return ret;
@@ -644,11 +712,11 @@ PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
/* TODO, multi-dimensional arrays */
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
{
- int len= RNA_property_array_length(ptr, prop);
+ int len = RNA_property_array_length(ptr, prop);
int type;
int i;
- if (len==0) /* possible with dynamic arrays */
+ if (len == 0) /* possible with dynamic arrays */
return 0;
if (RNA_property_array_dimension(ptr, prop, NULL) > 1) {
@@ -656,13 +724,13 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
return -1;
}
- type= RNA_property_type(prop);
+ type = RNA_property_type(prop);
switch (type) {
case PROP_FLOAT:
{
- float value_f= PyFloat_AsDouble(value);
- if (value_f==-1 && PyErr_Occurred()) {
+ float value_f = PyFloat_AsDouble(value);
+ if (value_f == -1 && PyErr_Occurred()) {
PyErr_Clear();
return 0;
}
@@ -671,15 +739,15 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
float *tmp_arr;
if (len * sizeof(float) > sizeof(tmp)) {
- tmp_arr= PyMem_MALLOC(len * sizeof(float));
+ tmp_arr = PyMem_MALLOC(len * sizeof(float));
}
else {
- tmp_arr= tmp;
+ tmp_arr = tmp;
}
RNA_property_float_get_array(ptr, prop, tmp_arr);
- for (i=0; i<len; i++) {
+ for (i = 0; i < len; i++) {
if (tmp_arr[i] == value_f) {
break;
}
@@ -688,15 +756,15 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
if (tmp_arr != tmp)
PyMem_FREE(tmp_arr);
- return i<len ? 1 : 0;
+ return i < len ? 1 : 0;
}
break;
}
case PROP_BOOLEAN:
case PROP_INT:
{
- int value_i= PyLong_AsSsize_t(value);
- if (value_i==-1 && PyErr_Occurred()) {
+ int value_i = PyLong_AsSsize_t(value);
+ if (value_i == -1 && PyErr_Occurred()) {
PyErr_Clear();
return 0;
}
@@ -705,18 +773,18 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
int *tmp_arr;
if (len * sizeof(int) > sizeof(tmp)) {
- tmp_arr= PyMem_MALLOC(len * sizeof(int));
+ tmp_arr = PyMem_MALLOC(len * sizeof(int));
}
else {
- tmp_arr= tmp;
+ tmp_arr = tmp;
}
- if (type==PROP_BOOLEAN)
+ if (type == PROP_BOOLEAN)
RNA_property_boolean_get_array(ptr, prop, tmp_arr);
else
RNA_property_int_get_array(ptr, prop, tmp_arr);
- for (i=0; i<len; i++) {
+ for (i = 0; i < len; i++) {
if (tmp_arr[i] == value_i) {
break;
}
@@ -725,7 +793,7 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
if (tmp_arr != tmp)
PyMem_FREE(tmp_arr);
- return i<len ? 1 : 0;
+ return i < len ? 1 : 0;
}
break;
}
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index 85f950947a7..7704ab2a417 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -56,11 +56,11 @@ static void cb_region_draw(const bContext *C, ARegion *UNUSED(ar), void *customd
bpy_context_set((bContext *)C, &gilstate);
- cb_func= PyTuple_GET_ITEM((PyObject *)customdata, 0);
- cb_args= PyTuple_GET_ITEM((PyObject *)customdata, 1);
- result= PyObject_CallObject(cb_func, cb_args);
+ cb_func = PyTuple_GET_ITEM((PyObject *)customdata, 0);
+ cb_args = PyTuple_GET_ITEM((PyObject *)customdata, 1);
+ result = PyObject_CallObject(cb_func, cb_args);
- if(result) {
+ if (result) {
Py_DECREF(result);
}
else {
@@ -76,33 +76,34 @@ PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args)
void *handle;
PyObject *cb_func, *cb_args;
- char *cb_event_str= NULL;
+ char *cb_event_str = NULL;
int cb_event;
if (!PyArg_ParseTuple(args, "OO!|s:bpy_struct.callback_add", &cb_func, &PyTuple_Type, &cb_args, &cb_event_str))
return NULL;
- if(!PyCallable_Check(cb_func)) {
+ if (!PyCallable_Check(cb_func)) {
PyErr_SetString(PyExc_TypeError, "callback_add(): first argument isn't callable");
return NULL;
}
- if(RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
- if(cb_event_str) {
- static EnumPropertyItem region_draw_mode_items[]= {
+ if (RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
+ if (cb_event_str) {
+ static EnumPropertyItem region_draw_mode_items[] = {
{REGION_DRAW_POST_PIXEL, "POST_PIXEL", 0, "Post Pixel", ""},
{REGION_DRAW_POST_VIEW, "POST_VIEW", 0, "Post View", ""},
{REGION_DRAW_PRE_VIEW, "PRE_VIEW", 0, "Pre View", ""},
{0, NULL, 0, NULL, NULL}};
- if(pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") < 0)
+ if (pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") < 0) {
return NULL;
+ }
}
else {
- cb_event= REGION_DRAW_POST_PIXEL;
+ cb_event = REGION_DRAW_POST_PIXEL;
}
- handle= ED_region_draw_cb_activate(((ARegion *)self->ptr.data)->type, cb_region_draw, (void *)args, cb_event);
+ handle = ED_region_draw_cb_activate(((ARegion *)self->ptr.data)->type, cb_region_draw, (void *)args, cb_event);
Py_INCREF(args);
}
else {
@@ -122,15 +123,15 @@ PyObject *pyrna_callback_remove(BPy_StructRNA *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O!:callback_remove", &PyCapsule_Type, &py_handle))
return NULL;
- handle= PyCapsule_GetPointer(py_handle, RNA_CAPSULE_ID);
+ handle = PyCapsule_GetPointer(py_handle, RNA_CAPSULE_ID);
- if(handle==NULL) {
+ if (handle == NULL) {
PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed");
return NULL;
}
- if(RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
- customdata= ED_region_draw_cb_customdata(handle);
+ if (RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
+ customdata = ED_region_draw_cb_customdata(handle);
Py_DECREF((PyObject *)customdata);
ED_region_draw_cb_exit(((ARegion *)self->ptr.data)->type, handle);
diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c
index 599c4312985..e3272c9da1a 100644
--- a/source/blender/python/intern/bpy_traceback.c
+++ b/source/blender/python/intern/bpy_traceback.c
@@ -33,7 +33,7 @@
static const char *traceback_filepath(PyTracebackObject *tb, PyObject **coerce)
{
- return PyBytes_AS_STRING((*coerce= PyUnicode_EncodeFSDefault(tb->tb_frame->f_code->co_filename)));
+ return PyBytes_AS_STRING((*coerce = PyUnicode_EncodeFSDefault(tb->tb_frame->f_code->co_filename)));
}
/* copied from pythonrun.c, 3.2.0 */
@@ -110,8 +110,8 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
PyObject *exception, *value;
PyTracebackObject *tb;
- *lineno= -1;
- *offset= 0;
+ *lineno = -1;
+ *offset = 0;
PyErr_Fetch(&exception, &value, (PyObject **)&tb);
@@ -133,11 +133,11 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
/* good */
}
else {
- *lineno= -1;
+ *lineno = -1;
}
}
else {
- *lineno= -1;
+ *lineno = -1;
}
}
}
@@ -146,17 +146,17 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
PyErr_Restore(exception, value, (PyObject *)tb); /* takes away reference! */
PyErr_Print();
- for (tb= (PyTracebackObject *)PySys_GetObject("last_traceback");
+ for (tb = (PyTracebackObject *)PySys_GetObject("last_traceback");
tb && (PyObject *)tb != Py_None;
- tb= tb->tb_next)
+ tb = tb->tb_next)
{
PyObject *coerce;
- const char *tb_filepath= traceback_filepath(tb, &coerce);
- const int match= strcmp(tb_filepath, filepath) != 0;
+ const char *tb_filepath = traceback_filepath(tb, &coerce);
+ const int match = strcmp(tb_filepath, filepath) != 0;
Py_DECREF(coerce);
if (match) {
- *lineno= tb->tb_lineno;
+ *lineno = tb->tb_lineno;
break;
}
}
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index fb42f7d59e0..ec7eff1756a 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -37,22 +37,22 @@
#include "../generic/py_capi_utils.h"
-static bContext* __py_context= NULL;
+static bContext* __py_context = NULL;
bContext* BPy_GetContext(void) { return __py_context; }
-void BPy_SetContext(bContext *C) { __py_context= C; }
+void BPy_SetContext(bContext *C) { __py_context = C; }
char *BPy_enum_as_string(EnumPropertyItem *item)
{
- DynStr *dynstr= BLI_dynstr_new();
+ DynStr *dynstr = BLI_dynstr_new();
EnumPropertyItem *e;
char *cstring;
- for (e= item; item->identifier; item++) {
+ for (e = item; item->identifier; item++) {
if (item->identifier[0])
- BLI_dynstr_appendf(dynstr, (e==item)?"'%s'":", '%s'", item->identifier);
+ BLI_dynstr_appendf(dynstr, (e == item)?"'%s'":", '%s'", item->identifier);
}
- cstring= BLI_dynstr_get_cstring(dynstr);
+ cstring = BLI_dynstr_get_cstring(dynstr);
BLI_dynstr_free(dynstr);
return cstring;
}
@@ -61,7 +61,7 @@ short BPy_reports_to_error(ReportList *reports, PyObject *exception, const short
{
char *report_str;
- report_str= BKE_reports_string(reports, RPT_ERROR);
+ report_str = BKE_reports_string(reports, RPT_ERROR);
if (clear) {
BKE_reports_clear(reports);
@@ -79,7 +79,7 @@ short BPy_reports_to_error(ReportList *reports, PyObject *exception, const short
short BPy_errors_to_report(ReportList *reports)
{
PyObject *pystring;
- PyObject *pystring_format= NULL; // workaround, see below
+ PyObject *pystring_format = NULL; // workaround, see below
char *cstring;
const char *filename;
@@ -89,30 +89,30 @@ short BPy_errors_to_report(ReportList *reports)
return 1;
/* less hassle if we allow NULL */
- if (reports==NULL) {
+ if (reports == NULL) {
PyErr_Print();
PyErr_Clear();
return 1;
}
- pystring= PyC_ExceptionBuffer();
+ pystring = PyC_ExceptionBuffer();
- if (pystring==NULL) {
+ if (pystring == NULL) {
BKE_report(reports, RPT_ERROR, "unknown py-exception, couldn't convert");
return 0;
}
PyC_FileAndNum(&filename, &lineno);
- if (filename==NULL)
- filename= "<unknown location>";
+ if (filename == NULL)
+ filename = "<unknown location>";
- cstring= _PyUnicode_AsString(pystring);
+ cstring = _PyUnicode_AsString(pystring);
#if 0 // ARG!. workaround for a bug in blenders use of vsnprintf
BKE_reportf(reports, RPT_ERROR, "%s\nlocation:%s:%d\n", cstring, filename, lineno);
#else
- pystring_format= PyUnicode_FromFormat("%s\nlocation:%s:%d\n", cstring, filename, lineno);
- cstring= _PyUnicode_AsString(pystring_format);
+ pystring_format = PyUnicode_FromFormat("%s\nlocation:%s:%d\n", cstring, filename, lineno);
+ cstring = _PyUnicode_AsString(pystring_format);
BKE_report(reports, RPT_ERROR, cstring);
#endif
diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c
index 57ce7b59067..66e8ff510ef 100644
--- a/source/blender/python/intern/gpu.c
+++ b/source/blender/python/intern/gpu.c
@@ -87,6 +87,7 @@ PyInit_gpu(void)
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT);
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT);
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE);
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC);
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO);
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT);
@@ -144,6 +145,14 @@ PyInit_gpu(void)
PyObject_SetAttrString(d, #f, val); \
Py_DECREF(val)
+PyDoc_STRVAR(GPU_export_shader_doc,
+"export_shader(scene, material)\n"
+"\n"
+" Returns the GLSL shader that produces the visual effect of material in scene.\n"
+"\n"
+" :return: Dictionary defining the shader, uniforms and attributes.\n"
+" :rtype: Dict"
+);
static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObject *kwds)
{
PyObject* pyscene;
@@ -183,7 +192,8 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj
PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
return NULL;
}
- } else {
+ }
+ else {
PyErr_SetString(PyExc_TypeError, "gpu.export_shader() first argument should be of Scene type");
return NULL;
}
@@ -203,7 +213,8 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj
PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
return NULL;
}
- } else {
+ }
+ else {
PyErr_SetString(PyExc_TypeError, "gpu.export_shader() second argument should be of Material type");
return NULL;
}
@@ -259,7 +270,8 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj
if (attribute->name) {
if (attribute->name[0] != 0) {
PY_DICT_ADD_STRING(dict,attribute,name);
- } else {
+ }
+ else {
val = PyLong_FromLong(0);
PyDict_SetItemString(dict, "name", val);
Py_DECREF(val);
@@ -275,11 +287,9 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj
return result;
}
-static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_export_shader, METH_VARARGS | METH_KEYWORDS,
- "export_shader(scene,material)\n\n"
- "Returns the GLSL shader that produces the visual effect of material in scene.\n\n"
- ":return: Dictionary defining the shader, uniforms and attributes.\n"
- ":rtype: Dict"}};
+static PyMethodDef meth_export_shader[] = {
+ {"export_shader", (PyCFunction)GPU_export_shader, METH_VARARGS | METH_KEYWORDS, GPU_export_shader_doc}
+};
PyObject* GPU_initPython(void)
{
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 121c5e26e73..c9afb7edf4b 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -35,46 +35,24 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
PyDoc_STRVAR(M_Mathutils_doc,
"This module provides access to matrices, eulers, quaternions and vectors."
);
static int mathutils_array_parse_fast(float *array,
- int array_min, int array_max,
- PyObject *value, const char *error_prefix)
+ int size,
+ PyObject *value_fast,
+ const char *error_prefix)
{
- PyObject *value_fast= NULL;
PyObject *item;
- int i, size;
-
- /* non list/tuple cases */
- if (!(value_fast=PySequence_Fast(value, error_prefix))) {
- /* PySequence_Fast sets the error */
- return -1;
- }
-
- size= PySequence_Fast_GET_SIZE(value_fast);
-
- if (size > array_max || size < array_min) {
- if (array_max == array_min) {
- PyErr_Format(PyExc_ValueError,
- "%.200s: sequence size is %d, expected %d",
- error_prefix, size, array_max);
- }
- else {
- PyErr_Format(PyExc_ValueError,
- "%.200s: sequence size is %d, expected [%d - %d]",
- error_prefix, size, array_min, array_max);
- }
- Py_DECREF(value_fast);
- return -1;
- }
+ int i;
- i= size;
+ i = size;
do {
i--;
- if ( ((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0f) &&
+ if ( ((array[i] = PyFloat_AsDouble((item = PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0f) &&
PyErr_Occurred())
{
PyErr_Format(PyExc_TypeError,
@@ -93,13 +71,14 @@ static int mathutils_array_parse_fast(float *array,
/* helper functionm returns length of the 'value', -1 on error */
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
{
-#if 1 /* approx 6x speedup for mathutils types */
int size;
- if ( (size= VectorObject_Check(value) ? ((VectorObject *)value)->size : 0) ||
- (size= EulerObject_Check(value) ? 3 : 0) ||
- (size= QuaternionObject_Check(value) ? 4 : 0) ||
- (size= ColorObject_Check(value) ? 3 : 0))
+#if 1 /* approx 6x speedup for mathutils types */
+
+ if ( (size = VectorObject_Check(value) ? ((VectorObject *)value)->size : 0) ||
+ (size = EulerObject_Check(value) ? 3 : 0) ||
+ (size = QuaternionObject_Check(value) ? 4 : 0) ||
+ (size = ColorObject_Check(value) ? 3 : 0))
{
if (BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
@@ -125,7 +104,85 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
else
#endif
{
- return mathutils_array_parse_fast(array, array_min, array_max, value, error_prefix);
+ PyObject *value_fast = NULL;
+
+ /* non list/tuple cases */
+ if (!(value_fast = PySequence_Fast(value, error_prefix))) {
+ /* PySequence_Fast sets the error */
+ return -1;
+ }
+
+ size = PySequence_Fast_GET_SIZE(value_fast);
+
+ if (size > array_max || size < array_min) {
+ if (array_max == array_min) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s: sequence size is %d, expected %d",
+ error_prefix, size, array_max);
+ }
+ else {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s: sequence size is %d, expected [%d - %d]",
+ error_prefix, size, array_min, array_max);
+ }
+ Py_DECREF(value_fast);
+ return -1;
+ }
+
+ return mathutils_array_parse_fast(array, size, value_fast, error_prefix);
+ }
+}
+
+int mathutils_array_parse_alloc(float **array, int array_min, PyObject *value, const char *error_prefix)
+{
+ int size;
+
+#if 1 /* approx 6x speedup for mathutils types */
+
+ if ( (size = VectorObject_Check(value) ? ((VectorObject *)value)->size : 0) ||
+ (size = EulerObject_Check(value) ? 3 : 0) ||
+ (size = QuaternionObject_Check(value) ? 4 : 0) ||
+ (size = ColorObject_Check(value) ? 3 : 0))
+ {
+ if (BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
+ return -1;
+ }
+
+ if (size < array_min) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s: sequence size is %d, expected > %d",
+ error_prefix, size, array_min);
+ return -1;
+ }
+
+ *array = PyMem_Malloc(size * sizeof(float));
+ memcpy(*array, ((BaseMathObject *)value)->data, size * sizeof(float));
+ return size;
+ }
+ else
+#endif
+ {
+ PyObject *value_fast = NULL;
+ //*array = NULL;
+
+ /* non list/tuple cases */
+ if (!(value_fast = PySequence_Fast(value, error_prefix))) {
+ /* PySequence_Fast sets the error */
+ return -1;
+ }
+
+ size = PySequence_Fast_GET_SIZE(value_fast);
+
+ if (size < array_min) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s: sequence size is %d, expected > %d",
+ error_prefix, size, array_min);
+ return -1;
+ }
+
+ *array = PyMem_Malloc(size * sizeof(float));
+
+ return mathutils_array_parse_fast(*array, size, value_fast, error_prefix);
}
}
@@ -155,7 +212,7 @@ int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error
if (BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
}
- else if (((MatrixObject *)value)->col_size < 3 || ((MatrixObject *)value)->row_size < 3) {
+ else if (((MatrixObject *)value)->num_row < 3 || ((MatrixObject *)value)->num_col < 3) {
PyErr_Format(PyExc_ValueError,
"%.200s: matrix must have minimum 3x3 dimensions",
error_prefix);
@@ -204,26 +261,38 @@ int EXPP_FloatsAreEqual(float af, float bf, int maxDiff)
int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps)
{
int x;
- for (x=0; x< size; x++) {
+ for (x = 0; x < size; x++) {
if (EXPP_FloatsAreEqual(vecA[x], vecB[x], floatSteps) == 0)
return 0;
}
return 1;
}
+/* dynstr as python string utility funcions, frees 'ds'! */
+PyObject *mathutils_dynstr_to_py(struct DynStr *ds)
+{
+ const int ds_len = BLI_dynstr_get_len(ds); /* space for \0 */
+ char *ds_buf = PyMem_Malloc(ds_len + 1);
+ PyObject *ret;
+ BLI_dynstr_get_cstring_ex(ds, ds_buf);
+ BLI_dynstr_free(ds);
+ ret = PyUnicode_FromStringAndSize(ds_buf, ds_len);
+ PyMem_Free(ds_buf);
+ return ret;
+}
/* Mathutils Callbacks */
/* for mathutils internal use only, eventually should re-alloc but to start with we only have a few users */
-static Mathutils_Callback *mathutils_callbacks[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static Mathutils_Callback *mathutils_callbacks[8] = {NULL};
int Mathutils_RegisterCallback(Mathutils_Callback *cb)
{
int i;
/* find the first free slot */
- for (i= 0; mathutils_callbacks[i]; i++) {
- if (mathutils_callbacks[i]==cb) /* already registered? */
+ for (i = 0; mathutils_callbacks[i]; i++) {
+ if (mathutils_callbacks[i] == cb) /* already registered? */
return i;
}
@@ -234,7 +303,7 @@ int Mathutils_RegisterCallback(Mathutils_Callback *cb)
/* use macros to check for NULL */
int _BaseMathObject_ReadCallback(BaseMathObject *self)
{
- Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+ Mathutils_Callback *cb = mathutils_callbacks[self->cb_type];
if (cb->get(self, self->cb_subtype) != -1)
return 0;
@@ -248,7 +317,7 @@ int _BaseMathObject_ReadCallback(BaseMathObject *self)
int _BaseMathObject_WriteCallback(BaseMathObject *self)
{
- Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+ Mathutils_Callback *cb = mathutils_callbacks[self->cb_type];
if (cb->set(self, self->cb_subtype) != -1)
return 0;
@@ -262,7 +331,7 @@ int _BaseMathObject_WriteCallback(BaseMathObject *self)
int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index)
{
- Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+ Mathutils_Callback *cb = mathutils_callbacks[self->cb_type];
if (cb->get_index(self, self->cb_subtype, index) != -1)
return 0;
@@ -276,7 +345,7 @@ int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index)
int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
{
- Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+ Mathutils_Callback *cb = mathutils_callbacks[self->cb_type];
if (cb->set_index(self, self->cb_subtype, index) != -1)
return 0;
@@ -289,16 +358,16 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
}
/* BaseMathObject generic functions for all mathutils types */
-char BaseMathObject_Owner_doc[] = "The item this is wrapping or None (readonly).";
-PyObject *BaseMathObject_getOwner(BaseMathObject *self, void *UNUSED(closure))
+char BaseMathObject_owner_doc[] = "The item this is wrapping or None (readonly).";
+PyObject *BaseMathObject_owner_get(BaseMathObject *self, void *UNUSED(closure))
{
- PyObject *ret= self->cb_user ? self->cb_user : Py_None;
+ PyObject *ret = self->cb_user ? self->cb_user : Py_None;
Py_INCREF(ret);
return ret;
}
-char BaseMathObject_Wrapped_doc[] = "True when this object wraps external data (readonly).\n\n:type: boolean";
-PyObject *BaseMathObject_getWrapped(BaseMathObject *self, void *UNUSED(closure))
+char BaseMathObject_is_wrapped_doc[] = "True when this object wraps external data (readonly).\n\n:type: boolean";
+PyObject *BaseMathObject_is_wrapped_get(BaseMathObject *self, void *UNUSED(closure))
{
return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
}
@@ -351,12 +420,14 @@ PyMODINIT_FUNC PyInit_mathutils(void)
{
PyObject *submodule;
PyObject *item;
- PyObject *sys_modules= PyThreadState_GET()->interp->modules;
+ PyObject *sys_modules = PyThreadState_GET()->interp->modules;
if (PyType_Ready(&vector_Type) < 0)
return NULL;
if (PyType_Ready(&matrix_Type) < 0)
- return NULL;
+ return NULL;
+ if (PyType_Ready(&matrix_access_Type) < 0)
+ return NULL;
if (PyType_Ready(&euler_Type) < 0)
return NULL;
if (PyType_Ready(&quaternion_Type) < 0)
@@ -374,7 +445,7 @@ PyMODINIT_FUNC PyInit_mathutils(void)
PyModule_AddObject(submodule, "Color", (PyObject *)&color_Type);
/* submodule */
- PyModule_AddObject(submodule, "geometry", (item=PyInit_mathutils_geometry()));
+ PyModule_AddObject(submodule, "geometry", (item = PyInit_mathutils_geometry()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
@@ -382,11 +453,13 @@ PyMODINIT_FUNC PyInit_mathutils(void)
Py_INCREF(item);
/* Noise submodule */
- PyModule_AddObject(submodule, "noise", (item=PyInit_mathutils_noise()));
+ PyModule_AddObject(submodule, "noise", (item = PyInit_mathutils_noise()));
PyDict_SetItemString(sys_modules, "mathutils.noise", item);
Py_INCREF(item);
- mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb);
+ mathutils_matrix_row_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_row_cb);
+ mathutils_matrix_col_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_col_cb);
+ mathutils_matrix_translation_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_translation_cb);
return submodule;
}
diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h
index a8170b8145c..220ae61f47d 100644
--- a/source/blender/python/mathutils/mathutils.h
+++ b/source/blender/python/mathutils/mathutils.h
@@ -37,8 +37,10 @@
/* Can cast different mathutils types to this, use for generic funcs */
-extern char BaseMathObject_Wrapped_doc[];
-extern char BaseMathObject_Owner_doc[];
+struct DynStr;
+
+extern char BaseMathObject_is_wrapped_doc[];
+extern char BaseMathObject_owner_doc[];
#define BASE_MATH_MEMBERS(_data) \
PyObject_VAR_HEAD \
@@ -65,8 +67,8 @@ typedef struct {
#include "mathutils_geometry.h"
#include "mathutils_noise.h"
-PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * );
-PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void * );
+PyObject *BaseMathObject_owner_get( BaseMathObject * self, void * );
+PyObject *BaseMathObject_is_wrapped_get( BaseMathObject *self, void * );
int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg);
int BaseMathObject_clear(BaseMathObject *self);
@@ -115,8 +117,12 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
/* utility func */
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
+int mathutils_array_parse_alloc(float **array, int array_min, PyObject *value, const char *error_prefix);
int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
+/* dynstr as python string utility funcions */
+PyObject *mathutils_dynstr_to_py(struct DynStr *ds);
+
#endif /* MATHUTILS_H */
diff --git a/source/blender/python/mathutils/mathutils_Color.c b/source/blender/python/mathutils/mathutils_Color.c
index 8409344a9fe..7f3f811c41a 100644
--- a/source/blender/python/mathutils/mathutils_Color.c
+++ b/source/blender/python/mathutils/mathutils_Color.c
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#define COLOR_SIZE 3
@@ -39,7 +40,7 @@
//makes a new color for you to play with
static PyObject *Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- float col[3]= {0.0f, 0.0f, 0.0f};
+ float col[3] = {0.0f, 0.0f, 0.0f};
if (kwds && PyDict_Size(kwds)) {
PyErr_SetString(PyExc_TypeError,
@@ -48,7 +49,7 @@ static PyObject *Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- switch(PyTuple_GET_SIZE(args)) {
+ switch (PyTuple_GET_SIZE(args)) {
case 0:
break;
case 1:
@@ -72,15 +73,15 @@ static PyObject *Color_ToTupleExt(ColorObject *self, int ndigits)
PyObject *ret;
int i;
- ret= PyTuple_New(COLOR_SIZE);
+ ret = PyTuple_New(COLOR_SIZE);
if (ndigits >= 0) {
- for (i= 0; i < COLOR_SIZE; i++) {
+ for (i = 0; i < COLOR_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->col[i], ndigits)));
}
}
else {
- for (i= 0; i < COLOR_SIZE; i++) {
+ for (i = 0; i < COLOR_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->col[i]));
}
}
@@ -110,36 +111,51 @@ static PyObject *Color_copy(ColorObject *self)
//----------------------------print object (internal)--------------
//print the object to screen
-static PyObject *Color_repr(ColorObject * self)
+static PyObject *Color_repr(ColorObject *self)
{
PyObject *ret, *tuple;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- tuple= Color_ToTupleExt(self, -1);
+ tuple = Color_ToTupleExt(self, -1);
- ret= PyUnicode_FromFormat("Color(%R)", tuple);
+ ret = PyUnicode_FromFormat("Color(%R)", tuple);
Py_DECREF(tuple);
return ret;
}
+static PyObject *Color_str(ColorObject *self)
+{
+ DynStr *ds;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ ds = BLI_dynstr_new();
+
+ BLI_dynstr_appendf(ds, "<Color (r=%.4f, g=%.4f, b=%.4f)>",
+ self->col[0], self->col[1], self->col[2]);
+
+ return mathutils_dynstr_to_py(ds); /* frees ds */
+}
+
//------------------------tp_richcmpr
//returns -1 execption, 0 false, 1 true
-static PyObject* Color_richcmpr(PyObject *a, PyObject *b, int op)
+static PyObject *Color_richcmpr(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (ColorObject_Check(a) && ColorObject_Check(b)) {
- ColorObject *colA= (ColorObject*)a;
- ColorObject *colB= (ColorObject*)b;
+ ColorObject *colA = (ColorObject *)a;
+ ColorObject *colB = (ColorObject *)b;
if (BaseMath_ReadCallback(colA) == -1 || BaseMath_ReadCallback(colB) == -1)
return NULL;
- ok= EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1) ? 0 : -1;
+ ok = EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1) ? 0 : -1;
}
switch (op) {
@@ -172,9 +188,9 @@ static int Color_len(ColorObject *UNUSED(self))
}
//----------------------------object[]---------------------------
//sequence accessor (get)
-static PyObject *Color_item(ColorObject * self, int i)
+static PyObject *Color_item(ColorObject *self, int i)
{
- if (i<0) i= COLOR_SIZE-i;
+ if (i < 0) i = COLOR_SIZE - i;
if (i < 0 || i >= COLOR_SIZE) {
PyErr_SetString(PyExc_IndexError,
@@ -191,7 +207,7 @@ static PyObject *Color_item(ColorObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Color_ass_item(ColorObject * self, int i, PyObject *value)
+static int Color_ass_item(ColorObject *self, int i, PyObject *value)
{
float f = PyFloat_AsDouble(value);
@@ -202,7 +218,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject *value)
return -1;
}
- if (i<0) i= COLOR_SIZE-i;
+ if (i < 0) i= COLOR_SIZE - i;
if (i < 0 || i >= COLOR_SIZE) {
PyErr_SetString(PyExc_IndexError, "color[attribute] = x: "
@@ -219,7 +235,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject *value)
}
//----------------------------object[z:y]------------------------
//sequence slice (get)
-static PyObject *Color_slice(ColorObject * self, int begin, int end)
+static PyObject *Color_slice(ColorObject *self, int begin, int end)
{
PyObject *tuple;
int count;
@@ -228,12 +244,12 @@ static PyObject *Color_slice(ColorObject * self, int begin, int end)
return NULL;
CLAMP(begin, 0, COLOR_SIZE);
- if (end<0) end= (COLOR_SIZE + 1) + end;
+ if (end < 0) end = (COLOR_SIZE + 1) + end;
CLAMP(end, 0, COLOR_SIZE);
- begin= MIN2(begin, end);
+ begin = MIN2(begin, end);
- tuple= PyTuple_New(end - begin);
- for (count= begin; count < end; count++) {
+ tuple = PyTuple_New(end - begin);
+ for (count = begin; count < end; count++) {
PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->col[count]));
}
@@ -250,11 +266,11 @@ static int Color_ass_slice(ColorObject *self, int begin, int end, PyObject *seq)
return -1;
CLAMP(begin, 0, COLOR_SIZE);
- if (end<0) end= (COLOR_SIZE + 1) + end;
+ if (end < 0) end = (COLOR_SIZE + 1) + end;
CLAMP(end, 0, COLOR_SIZE);
begin = MIN2(begin, end);
- if ((size=mathutils_array_parse(col, 0, COLOR_SIZE, seq, "mathutils.Color[begin:end] = []")) == -1)
+ if ((size = mathutils_array_parse(col, 0, COLOR_SIZE, seq, "mathutils.Color[begin:end] = []")) == -1)
return -1;
if (size != (end - begin)) {
@@ -264,7 +280,7 @@ static int Color_ass_slice(ColorObject *self, int begin, int end, PyObject *seq)
return -1;
}
- for (i= 0; i < COLOR_SIZE; i++)
+ for (i = 0; i < COLOR_SIZE; i++)
self->col[begin + i] = col[i];
(void)BaseMath_WriteCallback(self);
@@ -376,8 +392,8 @@ static PyObject *Color_add(PyObject *v1, PyObject *v2)
Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
return NULL;
}
- color1 = (ColorObject*)v1;
- color2 = (ColorObject*)v2;
+ color1 = (ColorObject *)v1;
+ color2 = (ColorObject *)v2;
if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1)
return NULL;
@@ -399,8 +415,8 @@ static PyObject *Color_iadd(PyObject *v1, PyObject *v2)
Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
return NULL;
}
- color1 = (ColorObject*)v1;
- color2 = (ColorObject*)v2;
+ color1 = (ColorObject *)v1;
+ color2 = (ColorObject *)v2;
if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1)
return NULL;
@@ -425,8 +441,8 @@ static PyObject *Color_sub(PyObject *v1, PyObject *v2)
Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
return NULL;
}
- color1 = (ColorObject*)v1;
- color2 = (ColorObject*)v2;
+ color1 = (ColorObject *)v1;
+ color2 = (ColorObject *)v2;
if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1)
return NULL;
@@ -439,7 +455,7 @@ static PyObject *Color_sub(PyObject *v1, PyObject *v2)
/* subtraction in-place: obj -= obj */
static PyObject *Color_isub(PyObject *v1, PyObject *v2)
{
- ColorObject *color1= NULL, *color2= NULL;
+ ColorObject *color1 = NULL, *color2 = NULL;
if (!ColorObject_Check(v1) || !ColorObject_Check(v2)) {
PyErr_Format(PyExc_TypeError,
@@ -448,8 +464,8 @@ static PyObject *Color_isub(PyObject *v1, PyObject *v2)
Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
return NULL;
}
- color1 = (ColorObject*)v1;
- color2 = (ColorObject*)v2;
+ color1 = (ColorObject *)v1;
+ color2 = (ColorObject *)v2;
if (BaseMath_ReadCallback(color1) == -1 || BaseMath_ReadCallback(color2) == -1)
return NULL;
@@ -475,12 +491,12 @@ static PyObject *Color_mul(PyObject *v1, PyObject *v2)
float scalar;
if ColorObject_Check(v1) {
- color1= (ColorObject *)v1;
+ color1 = (ColorObject *)v1;
if (BaseMath_ReadCallback(color1) == -1)
return NULL;
}
if ColorObject_Check(v2) {
- color2= (ColorObject *)v2;
+ color2 = (ColorObject *)v2;
if (BaseMath_ReadCallback(color2) == -1)
return NULL;
}
@@ -491,12 +507,12 @@ static PyObject *Color_mul(PyObject *v1, PyObject *v2)
/* col * col, dont support yet! */
}
else if (color1) {
- if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR * FLOAT */
+ if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR * FLOAT */
return color_mul_float(color1, scalar);
}
}
else if (color2) {
- if (((scalar= PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred())==0) { /* FLOAT * COLOR */
+ if (((scalar = PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred()) == 0) { /* FLOAT * COLOR */
return color_mul_float(color2, scalar);
}
}
@@ -517,7 +533,7 @@ static PyObject *Color_div(PyObject *v1, PyObject *v2)
float scalar;
if ColorObject_Check(v1) {
- color1= (ColorObject *)v1;
+ color1 = (ColorObject *)v1;
if (BaseMath_ReadCallback(color1) == -1)
return NULL;
}
@@ -528,8 +544,8 @@ static PyObject *Color_div(PyObject *v1, PyObject *v2)
}
/* make sure v1 is always the vector */
- if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR * FLOAT */
- if (scalar==0.0f) {
+ if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR * FLOAT */
+ if (scalar == 0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError,
"Color division: divide by zero error");
return NULL;
@@ -554,7 +570,7 @@ static PyObject *Color_imul(PyObject *v1, PyObject *v2)
return NULL;
/* only support color *= float */
- if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR *= FLOAT */
+ if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR *= FLOAT */
mul_vn_fl(color->col, COLOR_SIZE, scalar);
}
else {
@@ -580,8 +596,8 @@ static PyObject *Color_idiv(PyObject *v1, PyObject *v2)
return NULL;
/* only support color /= float */
- if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* COLOR /= FLOAT */
- if (scalar==0.0f) {
+ if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* COLOR /= FLOAT */
+ if (scalar == 0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError,
"Color division: divide by zero error");
return NULL;
@@ -603,7 +619,7 @@ static PyObject *Color_idiv(PyObject *v1, PyObject *v2)
}
/* -obj
- returns the negative of this object*/
+ returns the negative of this object */
static PyObject *Color_neg(ColorObject *self)
{
float tcol[COLOR_SIZE];
@@ -654,21 +670,29 @@ static PyNumberMethods Color_NumMethods = {
};
/* color channel, vector.r/g/b */
-static PyObject *Color_getChannel(ColorObject * self, void *type)
+PyDoc_STRVAR(Color_channel_r_doc, "Red color channel.\n\n:type: float");
+PyDoc_STRVAR(Color_channel_g_doc, "Green color channel.\n\n:type: float");
+PyDoc_STRVAR(Color_channel_b_doc, "Blue color channel.\n\n:type: float");
+
+static PyObject *Color_channel_get(ColorObject *self, void *type)
{
return Color_item(self, GET_INT_FROM_POINTER(type));
}
-static int Color_setChannel(ColorObject * self, PyObject *value, void * type)
+static int Color_channel_set(ColorObject *self, PyObject *value, void * type)
{
return Color_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
/* color channel (HSV), color.h/s/v */
-static PyObject *Color_getChannelHSV(ColorObject * self, void *type)
+PyDoc_STRVAR(Color_channel_hsv_h_doc, "HSV Hue component in [0, 1].\n\n:type: float");
+PyDoc_STRVAR(Color_channel_hsv_s_doc, "HSV Saturation component in [0, 1].\n\n:type: float");
+PyDoc_STRVAR(Color_channel_hsv_v_doc, "HSV Value component in [0, 1].\n\n:type: float");
+
+static PyObject *Color_channel_hsv_get(ColorObject *self, void *type)
{
float hsv[3];
- int i= GET_INT_FROM_POINTER(type);
+ int i = GET_INT_FROM_POINTER(type);
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -678,10 +702,10 @@ static PyObject *Color_getChannelHSV(ColorObject * self, void *type)
return PyFloat_FromDouble(hsv[i]);
}
-static int Color_setChannelHSV(ColorObject * self, PyObject *value, void * type)
+static int Color_channel_hsv_set(ColorObject *self, PyObject *value, void * type)
{
float hsv[3];
- int i= GET_INT_FROM_POINTER(type);
+ int i = GET_INT_FROM_POINTER(type);
float f = PyFloat_AsDouble(value);
if (f == -1 && PyErr_Occurred()) {
@@ -706,7 +730,8 @@ static int Color_setChannelHSV(ColorObject * self, PyObject *value, void * type)
}
/* color channel (HSV), color.h/s/v */
-static PyObject *Color_getHSV(ColorObject * self, void *UNUSED(closure))
+PyDoc_STRVAR(Color_hsv_doc, "HSV Values in [0, 1].\n\n:type: float triplet");
+static PyObject *Color_hsv_get(ColorObject *self, void *UNUSED(closure))
{
float hsv[3];
PyObject *ret;
@@ -716,14 +741,14 @@ static PyObject *Color_getHSV(ColorObject * self, void *UNUSED(closure))
rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2]));
- ret= PyTuple_New(3);
+ ret = PyTuple_New(3);
PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(hsv[0]));
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(hsv[1]));
PyTuple_SET_ITEM(ret, 2, PyFloat_FromDouble(hsv[2]));
return ret;
}
-static int Color_setHSV(ColorObject * self, PyObject *value, void *UNUSED(closure))
+static int Color_hsv_set(ColorObject *self, PyObject *value, void *UNUSED(closure))
{
float hsv[3];
@@ -746,18 +771,18 @@ static int Color_setHSV(ColorObject * self, PyObject *value, void *UNUSED(closur
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Color_getseters[] = {
- {(char *)"r", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Red color channel.\n\n:type: float", (void *)0},
- {(char *)"g", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Green color channel.\n\n:type: float", (void *)1},
- {(char *)"b", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Blue color channel.\n\n:type: float", (void *)2},
+ {(char *)"r", (getter)Color_channel_get, (setter)Color_channel_set, Color_channel_r_doc, (void *)0},
+ {(char *)"g", (getter)Color_channel_get, (setter)Color_channel_set, Color_channel_g_doc, (void *)1},
+ {(char *)"b", (getter)Color_channel_get, (setter)Color_channel_set, Color_channel_b_doc, (void *)2},
- {(char *)"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
- {(char *)"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
- {(char *)"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Value component in [0, 1].\n\n:type: float", (void *)2},
+ {(char *)"h", (getter)Color_channel_hsv_get, (setter)Color_channel_hsv_set, (char *)Color_channel_hsv_h_doc, (void *)0},
+ {(char *)"s", (getter)Color_channel_hsv_get, (setter)Color_channel_hsv_set, (char *)Color_channel_hsv_s_doc, (void *)1},
+ {(char *)"v", (getter)Color_channel_hsv_get, (setter)Color_channel_hsv_set, (char *)Color_channel_hsv_v_doc, (void *)2},
- {(char *)"hsv", (getter)Color_getHSV, (setter)Color_setHSV, (char *)"HSV Values in [0, 1].\n\n:type: float triplet", (void *)0},
+ {(char *)"hsv", (getter)Color_hsv_get, (setter)Color_hsv_set, (char *)Color_hsv_doc, (void *)0},
- {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -789,7 +814,7 @@ PyTypeObject color_Type = {
&Color_AsMapping, //tp_as_mapping
NULL, //tp_hash
NULL, //tp_call
- NULL, //tp_str
+ (reprfunc) Color_str, //tp_str
NULL, //tp_getattro
NULL, //tp_setattro
NULL, //tp_as_buffer
@@ -831,13 +856,13 @@ PyObject *Color_CreatePyObject(float *col, int type, PyTypeObject *base_type)
{
ColorObject *self;
- self= base_type ? (ColorObject *)base_type->tp_alloc(base_type, 0) :
+ self = base_type ? (ColorObject *)base_type->tp_alloc(base_type, 0) :
(ColorObject *)PyObject_GC_New(ColorObject, &color_Type);
if (self) {
/* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ self->cb_user = NULL;
+ self->cb_type = self->cb_subtype = 0;
if (type == Py_WRAP) {
self->col = col;
@@ -862,12 +887,12 @@ PyObject *Color_CreatePyObject(float *col, int type, PyTypeObject *base_type)
PyObject *Color_CreatePyObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
{
- ColorObject *self= (ColorObject *)Color_CreatePyObject(NULL, Py_NEW, NULL);
+ ColorObject *self = (ColorObject *)Color_CreatePyObject(NULL, Py_NEW, NULL);
if (self) {
Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
+ self->cb_user = cb_user;
+ self->cb_type = (unsigned char)cb_type;
+ self->cb_subtype = (unsigned char)cb_subtype;
PyObject_GC_Track(self);
}
diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index 7e769da14cb..66caed50aa9 100644
--- a/source/blender/python/mathutils/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#define EULER_SIZE 3
@@ -43,11 +44,11 @@
//makes a new euler for you to play with
static PyObject *Euler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyObject *seq= NULL;
- const char *order_str= NULL;
+ PyObject *seq = NULL;
+ const char *order_str = NULL;
- float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f};
- short order= EULER_ORDER_XYZ;
+ float eul[EULER_SIZE] = {0.0f, 0.0f, 0.0f};
+ short order = EULER_ORDER_XYZ;
if (kwds && PyDict_Size(kwds)) {
PyErr_SetString(PyExc_TypeError,
@@ -59,11 +60,11 @@ static PyObject *Euler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str))
return NULL;
- switch(PyTuple_GET_SIZE(args)) {
+ switch (PyTuple_GET_SIZE(args)) {
case 0:
break;
case 2:
- if ((order=euler_order_from_string(order_str, "mathutils.Euler()")) == -1)
+ if ((order = euler_order_from_string(order_str, "mathutils.Euler()")) == -1)
return NULL;
/* intentionally pass through */
case 1:
@@ -78,13 +79,13 @@ static PyObject *Euler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static const char *euler_order_str(EulerObject *self)
{
static const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"};
- return order[self->order-EULER_ORDER_XYZ];
+ return order[self->order - EULER_ORDER_XYZ];
}
short euler_order_from_string(const char *str, const char *error_prefix)
{
- if ((str[0] && str[1] && str[2] && str[3]=='\0')) {
- switch(*((PY_INT32_T *)str)) {
+ if ((str[0] && str[1] && str[2] && str[3] == '\0')) {
+ switch (*((PY_INT32_T *)str)) {
case 'X'|'Y'<<8|'Z'<<16: return EULER_ORDER_XYZ;
case 'X'|'Z'<<8|'Y'<<16: return EULER_ORDER_XZY;
case 'Y'|'X'<<8|'Z'<<16: return EULER_ORDER_YXZ;
@@ -106,15 +107,15 @@ static PyObject *Euler_ToTupleExt(EulerObject *self, int ndigits)
PyObject *ret;
int i;
- ret= PyTuple_New(EULER_SIZE);
+ ret = PyTuple_New(EULER_SIZE);
if (ndigits >= 0) {
- for (i= 0; i < EULER_SIZE; i++) {
+ for (i = 0; i < EULER_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->eul[i], ndigits)));
}
}
else {
- for (i= 0; i < EULER_SIZE; i++) {
+ for (i = 0; i < EULER_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->eul[i]));
}
}
@@ -133,7 +134,7 @@ PyDoc_STRVAR(Euler_to_quaternion_doc,
" :return: Quaternion representation of the euler.\n"
" :rtype: :class:`Quaternion`\n"
);
-static PyObject *Euler_to_quaternion(EulerObject * self)
+static PyObject *Euler_to_quaternion(EulerObject *self)
{
float quat[4];
@@ -154,7 +155,7 @@ PyDoc_STRVAR(Euler_to_matrix_doc,
" :return: A 3x3 roation matrix representation of the euler.\n"
" :rtype: :class:`Matrix`\n"
);
-static PyObject *Euler_to_matrix(EulerObject * self)
+static PyObject *Euler_to_matrix(EulerObject *self)
{
float mat[9];
@@ -171,7 +172,7 @@ PyDoc_STRVAR(Euler_zero_doc,
"\n"
" Set all values to zero.\n"
);
-static PyObject *Euler_zero(EulerObject * self)
+static PyObject *Euler_zero(EulerObject *self)
{
zero_v3(self->eul);
@@ -192,12 +193,12 @@ PyDoc_STRVAR(Euler_rotate_axis_doc,
" :arg angle: angle in radians.\n"
" :type angle: float\n"
);
-static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
+static PyObject *Euler_rotate_axis(EulerObject *self, PyObject *args)
{
float angle = 0.0f;
int axis; /* actually a character */
- if (!PyArg_ParseTuple(args, "Cf:rotate", &axis, &angle)) {
+ if (!PyArg_ParseTuple(args, "Cf:rotate_axis", &axis, &angle)) {
PyErr_SetString(PyExc_TypeError,
"Euler.rotate_axis(): "
"expected an axis 'X', 'Y', 'Z' and an angle (float)");
@@ -230,7 +231,7 @@ PyDoc_STRVAR(Euler_rotate_doc,
" :arg other: rotation component of mathutils value\n"
" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
);
-static PyObject *Euler_rotate(EulerObject * self, PyObject *value)
+static PyObject *Euler_rotate(EulerObject *self, PyObject *value)
{
float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
@@ -257,7 +258,7 @@ PyDoc_STRVAR(Euler_make_compatible_doc,
"\n"
" .. note:: the rotation order is not taken into account for this function.\n"
);
-static PyObject *Euler_make_compatible(EulerObject * self, PyObject *value)
+static PyObject *Euler_make_compatible(EulerObject *self, PyObject *value)
{
float teul[EULER_SIZE];
@@ -302,34 +303,49 @@ static PyObject *Euler_copy(EulerObject *self)
//----------------------------print object (internal)--------------
//print the object to screen
-static PyObject *Euler_repr(EulerObject * self)
+static PyObject *Euler_repr(EulerObject *self)
{
PyObject *ret, *tuple;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- tuple= Euler_ToTupleExt(self, -1);
+ tuple = Euler_ToTupleExt(self, -1);
- ret= PyUnicode_FromFormat("Euler(%R, '%s')", tuple, euler_order_str(self));
+ ret = PyUnicode_FromFormat("Euler(%R, '%s')", tuple, euler_order_str(self));
Py_DECREF(tuple);
return ret;
}
-static PyObject* Euler_richcmpr(PyObject *a, PyObject *b, int op)
+static PyObject *Euler_str(EulerObject *self)
+{
+ DynStr *ds;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ ds = BLI_dynstr_new();
+
+ BLI_dynstr_appendf(ds, "<Euler (x=%.4f, y=%.4f, z=%.4f), order='%s'>",
+ self->eul[0], self->eul[1], self->eul[2], euler_order_str(self));
+
+ return mathutils_dynstr_to_py(ds); /* frees ds */
+}
+
+static PyObject *Euler_richcmpr(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (EulerObject_Check(a) && EulerObject_Check(b)) {
- EulerObject *eulA= (EulerObject*)a;
- EulerObject *eulB= (EulerObject*)b;
+ EulerObject *eulA = (EulerObject *)a;
+ EulerObject *eulB = (EulerObject *)b;
if (BaseMath_ReadCallback(eulA) == -1 || BaseMath_ReadCallback(eulB) == -1)
return NULL;
- ok= ((eulA->order == eulB->order) && EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1)) ? 0 : -1;
+ ok = ((eulA->order == eulB->order) && EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1)) ? 0 : -1;
}
switch (op) {
@@ -362,9 +378,9 @@ static int Euler_len(EulerObject *UNUSED(self))
}
//----------------------------object[]---------------------------
//sequence accessor (get)
-static PyObject *Euler_item(EulerObject * self, int i)
+static PyObject *Euler_item(EulerObject *self, int i)
{
- if (i<0) i= EULER_SIZE-i;
+ if (i < 0) i = EULER_SIZE - i;
if (i < 0 || i >= EULER_SIZE) {
PyErr_SetString(PyExc_IndexError,
@@ -381,7 +397,7 @@ static PyObject *Euler_item(EulerObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
+static int Euler_ass_item(EulerObject *self, int i, PyObject *value)
{
float f = PyFloat_AsDouble(value);
@@ -392,7 +408,7 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
return -1;
}
- if (i<0) i= EULER_SIZE-i;
+ if (i < 0) i = EULER_SIZE - i;
if (i < 0 || i >= EULER_SIZE) {
PyErr_SetString(PyExc_IndexError,
@@ -410,7 +426,7 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
}
//----------------------------object[z:y]------------------------
//sequence slice (get)
-static PyObject *Euler_slice(EulerObject * self, int begin, int end)
+static PyObject *Euler_slice(EulerObject *self, int begin, int end)
{
PyObject *tuple;
int count;
@@ -419,11 +435,11 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end)
return NULL;
CLAMP(begin, 0, EULER_SIZE);
- if (end<0) end= (EULER_SIZE + 1) + end;
+ if (end < 0) end = (EULER_SIZE + 1) + end;
CLAMP(end, 0, EULER_SIZE);
- begin= MIN2(begin, end);
+ begin = MIN2(begin, end);
- tuple= PyTuple_New(end - begin);
+ tuple = PyTuple_New(end - begin);
for (count = begin; count < end; count++) {
PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->eul[count]));
}
@@ -441,11 +457,11 @@ static int Euler_ass_slice(EulerObject *self, int begin, int end, PyObject *seq)
return -1;
CLAMP(begin, 0, EULER_SIZE);
- if (end<0) end= (EULER_SIZE + 1) + end;
+ if (end < 0) end = (EULER_SIZE + 1) + end;
CLAMP(end, 0, EULER_SIZE);
begin = MIN2(begin, end);
- if ((size=mathutils_array_parse(eul, 0, EULER_SIZE, seq, "mathutils.Euler[begin:end] = []")) == -1)
+ if ((size = mathutils_array_parse(eul, 0, EULER_SIZE, seq, "mathutils.Euler[begin:end] = []")) == -1)
return -1;
if (size != (end - begin)) {
@@ -455,7 +471,7 @@ static int Euler_ass_slice(EulerObject *self, int begin, int end, PyObject *seq)
return -1;
}
- for (i= 0; i < EULER_SIZE; i++)
+ for (i = 0; i < EULER_SIZE; i++)
self->eul[begin + i] = eul[i];
(void)BaseMath_WriteCallback(self);
@@ -552,21 +568,27 @@ static PyMappingMethods Euler_AsMapping = {
(objobjargproc)Euler_ass_subscript
};
-/*
- * euler axis, euler.x/y/z
- */
-static PyObject *Euler_getAxis(EulerObject *self, void *type)
+/* euler axis, euler.x/y/z */
+
+PyDoc_STRVAR(Euler_axis_doc,
+"Euler axis angle in radians.\n\n:type: float"
+);
+static PyObject *Euler_axis_get(EulerObject *self, void *type)
{
return Euler_item(self, GET_INT_FROM_POINTER(type));
}
-static int Euler_setAxis(EulerObject *self, PyObject *value, void *type)
+static int Euler_axis_set(EulerObject *self, PyObject *value, void *type)
{
return Euler_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
/* rotation order */
-static PyObject *Euler_getOrder(EulerObject *self, void *UNUSED(closure))
+
+PyDoc_STRVAR(Euler_order_doc,
+"Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']"
+);
+static PyObject *Euler_order_get(EulerObject *self, void *UNUSED(closure))
{
if (BaseMath_ReadCallback(self) == -1) /* can read order too */
return NULL;
@@ -574,15 +596,15 @@ static PyObject *Euler_getOrder(EulerObject *self, void *UNUSED(closure))
return PyUnicode_FromString(euler_order_str(self));
}
-static int Euler_setOrder(EulerObject *self, PyObject *value, void *UNUSED(closure))
+static int Euler_order_set(EulerObject *self, PyObject *value, void *UNUSED(closure))
{
- const char *order_str= _PyUnicode_AsString(value);
- short order= euler_order_from_string(order_str, "euler.order");
+ const char *order_str = _PyUnicode_AsString(value);
+ short order = euler_order_from_string(order_str, "euler.order");
if (order == -1)
return -1;
- self->order= order;
+ self->order = order;
(void)BaseMath_WriteCallback(self); /* order can be written back */
return 0;
}
@@ -591,13 +613,13 @@ static int Euler_setOrder(EulerObject *self, PyObject *value, void *UNUSED(closu
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Euler_getseters[] = {
- {(char *)"x", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler X axis in radians.\n\n:type: float", (void *)0},
- {(char *)"y", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Y axis in radians.\n\n:type: float", (void *)1},
- {(char *)"z", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Z axis in radians.\n\n:type: float", (void *)2},
- {(char *)"order", (getter)Euler_getOrder, (setter)Euler_setOrder, (char *)"Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
+ {(char *)"x", (getter)Euler_axis_get, (setter)Euler_axis_set, Euler_axis_doc, (void *)0},
+ {(char *)"y", (getter)Euler_axis_get, (setter)Euler_axis_set, Euler_axis_doc, (void *)1},
+ {(char *)"z", (getter)Euler_axis_get, (setter)Euler_axis_set, Euler_axis_doc, (void *)2},
+ {(char *)"order", (getter)Euler_order_get, (setter)Euler_order_set, Euler_order_doc, (void *)NULL},
- {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
- {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -635,7 +657,7 @@ PyTypeObject euler_Type = {
&Euler_AsMapping, //tp_as_mapping
NULL, //tp_hash
NULL, //tp_call
- NULL, //tp_str
+ (reprfunc) Euler_str, //tp_str
NULL, //tp_getattro
NULL, //tp_setattro
NULL, //tp_as_buffer
@@ -677,13 +699,13 @@ PyObject *Euler_CreatePyObject(float *eul, short order, int type, PyTypeObject *
{
EulerObject *self;
- self= base_type ? (EulerObject *)base_type->tp_alloc(base_type, 0) :
+ self = base_type ? (EulerObject *)base_type->tp_alloc(base_type, 0) :
(EulerObject *)PyObject_GC_New(EulerObject, &euler_Type);
if (self) {
/* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ self->cb_user = NULL;
+ self->cb_type = self->cb_subtype = 0;
if (type == Py_WRAP) {
self->eul = eul;
@@ -704,7 +726,7 @@ PyObject *Euler_CreatePyObject(float *eul, short order, int type, PyTypeObject *
Py_FatalError("Euler(): invalid type!");
}
- self->order= order;
+ self->order = order;
}
return (PyObject *)self;
@@ -712,12 +734,12 @@ PyObject *Euler_CreatePyObject(float *eul, short order, int type, PyTypeObject *
PyObject *Euler_CreatePyObject_cb(PyObject *cb_user, short order, int cb_type, int cb_subtype)
{
- EulerObject *self= (EulerObject *)Euler_CreatePyObject(NULL, order, Py_NEW, NULL);
+ EulerObject *self = (EulerObject *)Euler_CreatePyObject(NULL, order, Py_NEW, NULL);
if (self) {
Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
+ self->cb_user = cb_user;
+ self->cb_type = (unsigned char)cb_type;
+ self->cb_subtype = (unsigned char)cb_subtype;
PyObject_GC_Track(self);
}
diff --git a/source/blender/python/mathutils/mathutils_Euler.h b/source/blender/python/mathutils/mathutils_Euler.h
index 130384a1792..c42b0daffbc 100644
--- a/source/blender/python/mathutils/mathutils_Euler.h
+++ b/source/blender/python/mathutils/mathutils_Euler.h
@@ -47,7 +47,7 @@ typedef struct {
/*struct data contains a pointer to the actual data that the
object uses. It can use either PyMem allocated data (which will
be stored in py_data) or be a wrapper for data allocated through
-blender (stored in blend_data). This is an either/or struct not both*/
+blender (stored in blend_data). This is an either/or struct not both */
//prototypes
PyObject *Euler_CreatePyObject( float *eul, short order, int type, PyTypeObject *base_type);
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index ea636ef52fb..f10d8c48c92 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -35,81 +35,299 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_string.h"
+#include "BLI_dynstr.h"
+
+typedef enum eMatrixAccess_t {
+ MAT_ACCESS_ROW,
+ MAT_ACCESS_COL
+} eMatrixAccess_t;
static PyObject *Matrix_copy(MatrixObject *self);
static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value);
static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self);
+static PyObject *MatrixAccess_CreatePyObject(MatrixObject *matrix, const eMatrixAccess_t type);
+
+static int matrix_row_vector_check(MatrixObject *mat, VectorObject *vec, int row)
+{
+ if ((vec->size != mat->num_col) || (row >= mat->num_row)) {
+ PyErr_SetString(PyExc_AttributeError,
+ "Matrix(): "
+ "owner matrix has been resized since this row vector was created");
+ return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
+static int matrix_col_vector_check(MatrixObject *mat, VectorObject *vec, int col)
+{
+ if ((vec->size != mat->num_row) || (col >= mat->num_col)) {
+ PyErr_SetString(PyExc_AttributeError,
+ "Matrix(): "
+ "owner matrix has been resized since this column vector was created");
+ return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
+/* ----------------------------------------------------------------------------
+ * matrix row callbacks
+ * this is so you can do matrix[i][j] = val OR matrix.row[i][j] = val */
+
+int mathutils_matrix_row_cb_index = -1;
+
+static int mathutils_matrix_row_check(BaseMathObject *bmo)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ return BaseMath_ReadCallback(self);
+}
+
+static int mathutils_matrix_row_get(BaseMathObject *bmo, int row)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int col;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+ if (!matrix_row_vector_check(self, (VectorObject *)bmo, row))
+ return -1;
+
+ for (col = 0; col < self->num_col; col++) {
+ bmo->data[col] = MATRIX_ITEM(self, row, col);
+ }
+
+ return 0;
+}
+
+static int mathutils_matrix_row_set(BaseMathObject *bmo, int row)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int col;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+ if (!matrix_row_vector_check(self, (VectorObject *)bmo, row))
+ return -1;
+
+ for (col = 0; col < self->num_col; col++) {
+ MATRIX_ITEM(self, row, col) = bmo->data[col];
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+
+static int mathutils_matrix_row_get_index(BaseMathObject *bmo, int row, int col)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
-/* matrix vector callbacks */
-int mathutils_matrix_vector_cb_index= -1;
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+ if (!matrix_row_vector_check(self, (VectorObject *)bmo, row))
+ return -1;
+
+ bmo->data[col] = MATRIX_ITEM(self, row, col);
+ return 0;
+}
-static int mathutils_matrix_vector_check(BaseMathObject *bmo)
+static int mathutils_matrix_row_set_index(BaseMathObject *bmo, int row, int col)
{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+ if (!matrix_row_vector_check(self, (VectorObject *)bmo, row))
+ return -1;
+
+ MATRIX_ITEM(self, row, col) = bmo->data[col];
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+
+Mathutils_Callback mathutils_matrix_row_cb = {
+ mathutils_matrix_row_check,
+ mathutils_matrix_row_get,
+ mathutils_matrix_row_set,
+ mathutils_matrix_row_get_index,
+ mathutils_matrix_row_set_index
+};
+
+
+/* ----------------------------------------------------------------------------
+ * matrix row callbacks
+ * this is so you can do matrix.col[i][j] = val */
+
+int mathutils_matrix_col_cb_index = -1;
+
+static int mathutils_matrix_col_check(BaseMathObject *bmo)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
return BaseMath_ReadCallback(self);
}
-static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype)
+static int mathutils_matrix_col_get(BaseMathObject *bmo, int col)
{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
- int i;
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int num_row;
+ int row;
if (BaseMath_ReadCallback(self) == -1)
return -1;
+ if (!matrix_col_vector_check(self, (VectorObject *)bmo, col))
+ return -1;
- for (i=0; i < self->col_size; i++)
- bmo->data[i]= self->matrix[subtype][i];
+ /* for 'translation' size will always be '3' even on 4x4 vec */
+ num_row = MIN2(self->num_row, ((VectorObject *)bmo)->size);
+
+ for (row = 0; row < num_row; row++) {
+ bmo->data[row] = MATRIX_ITEM(self, row, col);
+ }
return 0;
}
-static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
+static int mathutils_matrix_col_set(BaseMathObject *bmo, int col)
{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
- int i;
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int num_row;
+ int row;
if (BaseMath_ReadCallback(self) == -1)
return -1;
+ if (!matrix_col_vector_check(self, (VectorObject *)bmo, col))
+ return -1;
+
+ /* for 'translation' size will always be '3' even on 4x4 vec */
+ num_row = MIN2(self->num_row, ((VectorObject *)bmo)->size);
- for (i=0; i < self->col_size; i++)
- self->matrix[subtype][i]= bmo->data[i];
+ for (row = 0; row < num_row; row++) {
+ MATRIX_ITEM(self, row, col) = bmo->data[row];
+ }
(void)BaseMath_WriteCallback(self);
return 0;
}
-static int mathutils_matrix_vector_get_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_matrix_col_get_index(BaseMathObject *bmo, int col, int row)
{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
if (BaseMath_ReadCallback(self) == -1)
return -1;
+ if (!matrix_col_vector_check(self, (VectorObject *)bmo, col))
+ return -1;
- bmo->data[index]= self->matrix[subtype][index];
+ bmo->data[row] = MATRIX_ITEM(self, row, col);
return 0;
}
-static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_matrix_col_set_index(BaseMathObject *bmo, int col, int row)
{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
if (BaseMath_ReadCallback(self) == -1)
return -1;
+ if (!matrix_col_vector_check(self, (VectorObject *)bmo, col))
+ return -1;
- self->matrix[subtype][index]= bmo->data[index];
+ MATRIX_ITEM(self, row, col) = bmo->data[row];
(void)BaseMath_WriteCallback(self);
return 0;
}
-Mathutils_Callback mathutils_matrix_vector_cb = {
- mathutils_matrix_vector_check,
- mathutils_matrix_vector_get,
- mathutils_matrix_vector_set,
- mathutils_matrix_vector_get_index,
- mathutils_matrix_vector_set_index
+Mathutils_Callback mathutils_matrix_col_cb = {
+ mathutils_matrix_col_check,
+ mathutils_matrix_col_get,
+ mathutils_matrix_col_set,
+ mathutils_matrix_col_get_index,
+ mathutils_matrix_col_set_index
};
-/* matrix vector callbacks, this is so you can do matrix[i][j] = val */
+
+
+/* ----------------------------------------------------------------------------
+ * matrix row callbacks
+ * this is so you can do matrix.translation = val
+ * note, this is _exactly like matrix.col except the 4th component is always omitted */
+
+int mathutils_matrix_translation_cb_index = -1;
+
+static int mathutils_matrix_translation_check(BaseMathObject *bmo)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ return BaseMath_ReadCallback(self);
+}
+
+static int mathutils_matrix_translation_get(BaseMathObject *bmo, int col)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int row;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ for (row = 0; row < 3; row++) {
+ bmo->data[row] = MATRIX_ITEM(self, row, col);
+ }
+
+ return 0;
+}
+
+static int mathutils_matrix_translation_set(BaseMathObject *bmo, int col)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+ int row;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ for (row = 0; row < 3; row++) {
+ MATRIX_ITEM(self, row, col) = bmo->data[row];
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+
+static int mathutils_matrix_translation_get_index(BaseMathObject *bmo, int col, int row)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ bmo->data[row] = MATRIX_ITEM(self, row, col);
+ return 0;
+}
+
+static int mathutils_matrix_translation_set_index(BaseMathObject *bmo, int col, int row)
+{
+ MatrixObject *self = (MatrixObject *)bmo->cb_user;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ MATRIX_ITEM(self, row, col) = bmo->data[row];
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+
+Mathutils_Callback mathutils_matrix_translation_cb = {
+ mathutils_matrix_translation_check,
+ mathutils_matrix_translation_get,
+ mathutils_matrix_translation_set,
+ mathutils_matrix_translation_get_index,
+ mathutils_matrix_translation_set_index
+};
+
+
+/* matrix column callbacks, this is so you can do matrix.translation = Vector() */
//----------------------------------mathutils.Matrix() -----------------
//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
@@ -123,24 +341,28 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- switch(PyTuple_GET_SIZE(args)) {
+ switch (PyTuple_GET_SIZE(args)) {
case 0:
return Matrix_CreatePyObject(NULL, 4, 4, Py_NEW, type);
case 1:
{
- PyObject *arg= PyTuple_GET_ITEM(args, 0);
+ PyObject *arg = PyTuple_GET_ITEM(args, 0);
+ /* Input is now as a sequence of rows so length of sequence
+ * is the number of rows */
/* -1 is an error, size checks will accunt for this */
- const unsigned short row_size= PySequence_Size(arg);
+ const unsigned short num_row = PySequence_Size(arg);
- if (row_size >= 2 && row_size <= 4) {
- PyObject *item= PySequence_GetItem(arg, 0);
- const unsigned short col_size= PySequence_Size(item);
+ if (num_row >= 2 && num_row <= 4) {
+ PyObject *item = PySequence_GetItem(arg, 0);
+ /* Since each item is a row, number of items is the
+ * same as the number of columns */
+ const unsigned short num_col = PySequence_Size(item);
Py_XDECREF(item);
- if (col_size >= 2 && col_size <= 4) {
+ if (num_col >= 2 && num_col <= 4) {
/* sane row & col size, new matrix and assign as slice */
- PyObject *matrix= Matrix_CreatePyObject(NULL, row_size, col_size, Py_NEW, type);
+ PyObject *matrix = Matrix_CreatePyObject(NULL, num_col, num_row, Py_NEW, type);
if (Matrix_ass_slice((MatrixObject *)matrix, 0, INT_MAX, arg) == 0) {
return matrix;
}
@@ -161,8 +383,8 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self)
{
- PyObject *ret= Matrix_copy(self);
- PyObject *ret_dummy= matrix_func(ret);
+ PyObject *ret = Matrix_copy(self);
+ PyObject *ret_dummy = matrix_func(ret);
if (ret_dummy) {
Py_DECREF(ret_dummy);
return (PyObject *)ret;
@@ -206,23 +428,22 @@ PyDoc_STRVAR(C_Matrix_Rotation_doc,
);
static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
{
- PyObject *vec= NULL;
- const char *axis= NULL;
+ PyObject *vec = NULL;
+ const char *axis = NULL;
int matSize;
double angle; /* use double because of precision problems at high values */
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
- if (!PyArg_ParseTuple(args, "di|O", &angle, &matSize, &vec)) {
- PyErr_SetString(PyExc_TypeError,
- "Matrix.Rotation(angle, size, axis): "
- "expected float int and a string or vector");
+ if (!PyArg_ParseTuple(args, "di|O:Matrix.Rotation", &angle, &matSize, &vec)) {
return NULL;
}
if (vec && PyUnicode_Check(vec)) {
- axis= _PyUnicode_AsString((PyObject *)vec);
- if (axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') {
+ axis = _PyUnicode_AsString((PyObject *)vec);
+ if (axis == NULL || axis[0] == '\0' || axis[1] != '\0' || axis[0] < 'X' || axis[0] > 'Z') {
PyErr_SetString(PyExc_ValueError,
"Matrix.Rotation(): "
"3rd argument axis value must be a 3D vector "
@@ -231,11 +452,11 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
else {
/* use the string */
- vec= NULL;
+ vec = NULL;
}
}
- angle= angle_wrap_rad(angle);
+ angle = angle_wrap_rad(angle);
if (matSize != 2 && matSize != 3 && matSize != 4) {
PyErr_SetString(PyExc_ValueError,
@@ -266,8 +487,8 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
axis_angle_to_mat3((float (*)[3])mat, tvec, angle);
}
else if (matSize == 2) {
- const float angle_cos= cosf(angle);
- const float angle_sin= sinf(angle);
+ const float angle_cos = cosf(angle);
+ const float angle_sin = sinf(angle);
//2D rotation matrix
mat[0] = angle_cos;
@@ -300,15 +521,12 @@ PyDoc_STRVAR(C_Matrix_Translation_doc,
);
static PyObject *C_Matrix_Translation(PyObject *cls, PyObject *value)
{
- float mat[16], tvec[3];
+ float mat[4][4]= MAT4_UNITY;
- if (mathutils_array_parse(tvec, 3, 4, value, "mathutils.Matrix.Translation(vector), invalid vector arg") == -1)
+ if (mathutils_array_parse(mat[3], 3, 4, value, "mathutils.Matrix.Translation(vector), invalid vector arg") == -1)
return NULL;
- /* create a identity matrix and add translation */
- unit_m4((float(*)[4]) mat);
- copy_v3_v3(mat + 12, tvec); /* 12, 13, 14 */
- return Matrix_CreatePyObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
+ return Matrix_CreatePyObject(&mat[0][0], 4, 4, Py_NEW, (PyTypeObject *)cls);
}
//----------------------------------mathutils.Matrix.Scale() -------------
//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
@@ -328,13 +546,15 @@ PyDoc_STRVAR(C_Matrix_Scale_doc,
);
static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
{
- PyObject *vec= NULL;
+ PyObject *vec = NULL;
int vec_size;
float tvec[3];
float factor;
int matSize;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
if (!PyArg_ParseTuple(args, "fi|O:Matrix.Scale", &factor, &matSize, &vec)) {
return NULL;
@@ -346,8 +566,10 @@ static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
return NULL;
}
if (vec) {
- vec_size= (matSize == 2 ? 2 : 3);
- if (mathutils_array_parse(tvec, vec_size, vec_size, vec, "Matrix.Scale(factor, size, axis), invalid 'axis' arg") == -1) {
+ vec_size = (matSize == 2 ? 2 : 3);
+ if (mathutils_array_parse(tvec, vec_size, vec_size, vec,
+ "Matrix.Scale(factor, size, axis), invalid 'axis' arg") == -1)
+ {
return NULL;
}
}
@@ -419,8 +641,10 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
int matSize, x;
float norm = 0.0f;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
if (!PyArg_ParseTuple(args, "Oi:Matrix.OrthoProjection", &axis, &matSize)) {
return NULL;
@@ -434,13 +658,13 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
if (PyUnicode_Check(axis)) { //ortho projection onto cardinal plane
Py_ssize_t plane_len;
- const char *plane= _PyUnicode_AsStringAndSize(axis, &plane_len);
+ const char *plane = _PyUnicode_AsStringAndSize(axis, &plane_len);
if (matSize == 2) {
- if (plane_len == 1 && plane[0]=='X') {
- mat[0]= 1.0f;
+ if (plane_len == 1 && plane[0] == 'X') {
+ mat[0] = 1.0f;
}
- else if (plane_len == 1 && plane[0]=='Y') {
- mat[3]= 1.0f;
+ else if (plane_len == 1 && plane[0] == 'Y') {
+ mat[3] = 1.0f;
}
else {
PyErr_Format(PyExc_ValueError,
@@ -451,17 +675,17 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
}
}
else {
- if (plane_len == 2 && plane[0]=='X' && plane[1]=='Y') {
- mat[0]= 1.0f;
- mat[4]= 1.0f;
+ if (plane_len == 2 && plane[0] == 'X' && plane[1] == 'Y') {
+ mat[0] = 1.0f;
+ mat[4] = 1.0f;
}
- else if (plane_len == 2 && plane[0]=='X' && plane[1]=='Z') {
- mat[0]= 1.0f;
- mat[8]= 1.0f;
+ else if (plane_len == 2 && plane[0] == 'X' && plane[1] == 'Z') {
+ mat[0] = 1.0f;
+ mat[8] = 1.0f;
}
- else if (plane_len == 2 && plane[0]=='Y' && plane[1]=='Z') {
- mat[4]= 1.0f;
- mat[8]= 1.0f;
+ else if (plane_len == 2 && plane[0] == 'Y' && plane[1] == 'Z') {
+ mat[4] = 1.0f;
+ mat[8] = 1.0f;
}
else {
PyErr_Format(PyExc_ValueError,
@@ -475,7 +699,7 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
else {
//arbitrary plane
- int vec_size= (matSize == 2 ? 2 : 3);
+ int vec_size = (matSize == 2 ? 2 : 3);
float tvec[4];
if (mathutils_array_parse(tvec, vec_size, vec_size, axis,
@@ -494,19 +718,19 @@ static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
}
if (matSize == 2) {
mat[0] = 1 - (tvec[0] * tvec[0]);
- mat[1] = -(tvec[0] * tvec[1]);
- mat[2] = -(tvec[0] * tvec[1]);
+ mat[1] = - (tvec[0] * tvec[1]);
+ mat[2] = - (tvec[0] * tvec[1]);
mat[3] = 1 - (tvec[1] * tvec[1]);
}
else if (matSize > 2) {
mat[0] = 1 - (tvec[0] * tvec[0]);
- mat[1] = -(tvec[0] * tvec[1]);
- mat[2] = -(tvec[0] * tvec[2]);
- mat[3] = -(tvec[0] * tvec[1]);
+ mat[1] = - (tvec[0] * tvec[1]);
+ mat[2] = - (tvec[0] * tvec[2]);
+ mat[3] = - (tvec[0] * tvec[1]);
mat[4] = 1 - (tvec[1] * tvec[1]);
- mat[5] = -(tvec[1] * tvec[2]);
- mat[6] = -(tvec[0] * tvec[2]);
- mat[7] = -(tvec[1] * tvec[2]);
+ mat[5] = - (tvec[1] * tvec[2]);
+ mat[6] = - (tvec[0] * tvec[2]);
+ mat[7] = - (tvec[1] * tvec[2]);
mat[8] = 1 - (tvec[2] * tvec[2]);
}
}
@@ -538,8 +762,10 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
int matSize;
const char *plane;
PyObject *fac;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
if (!PyArg_ParseTuple(args, "siO:Matrix.Shear", &plane, &matSize, &fac)) {
return NULL;
@@ -552,9 +778,9 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
}
if (matSize == 2) {
- float const factor= PyFloat_AsDouble(fac);
+ float const factor = PyFloat_AsDouble(fac);
- if (factor==-1.0f && PyErr_Occurred()) {
+ if (factor == -1.0f && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"Matrix.Shear(): "
"the factor to be a float");
@@ -620,27 +846,25 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
void matrix_as_3x3(float mat[3][3], MatrixObject *self)
{
- copy_v3_v3(mat[0], self->matrix[0]);
- copy_v3_v3(mat[1], self->matrix[1]);
- copy_v3_v3(mat[2], self->matrix[2]);
+ copy_v3_v3(mat[0], MATRIX_COL_PTR(self, 0));
+ copy_v3_v3(mat[1], MATRIX_COL_PTR(self, 1));
+ copy_v3_v3(mat[2], MATRIX_COL_PTR(self, 2));
}
/* assumes rowsize == colsize is checked and the read callback has run */
static float matrix_determinant_internal(MatrixObject *self)
{
- if (self->row_size == 2) {
- return determinant_m2(self->matrix[0][0], self->matrix[0][1],
- self->matrix[1][0], self->matrix[1][1]);
+ if (self->num_col == 2) {
+ return determinant_m2(MATRIX_ITEM(self, 0, 0), MATRIX_ITEM(self, 0, 1),
+ MATRIX_ITEM(self, 1, 0), MATRIX_ITEM(self, 1, 1));
}
- else if (self->row_size == 3) {
- return determinant_m3(self->matrix[0][0], self->matrix[0][1],
- self->matrix[0][2], self->matrix[1][0],
- self->matrix[1][1], self->matrix[1][2],
- self->matrix[2][0], self->matrix[2][1],
- self->matrix[2][2]);
+ else if (self->num_col == 3) {
+ return determinant_m3(MATRIX_ITEM(self, 0, 0), MATRIX_ITEM(self, 0, 1), MATRIX_ITEM(self, 0, 2),
+ MATRIX_ITEM(self, 1, 0), MATRIX_ITEM(self, 1, 1), MATRIX_ITEM(self, 1, 2),
+ MATRIX_ITEM(self, 2, 0), MATRIX_ITEM(self, 2, 1), MATRIX_ITEM(self, 2, 2));
}
else {
- return determinant_m4((float (*)[4])self->contigPtr);
+ return determinant_m4((float (*)[4])self->matrix);
}
}
@@ -661,18 +885,18 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if ((self->col_size < 3) || (self->row_size < 3) || (self->col_size != self->row_size)) {
+ /* must be 3-4 cols, 3-4 rows, square matrix */
+ if ((self->num_row < 3) || (self->num_col < 3) || (self->num_row != self->num_col)) {
PyErr_SetString(PyExc_ValueError,
"Matrix.to_quat(): "
"inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
}
- if (self->col_size == 3) {
- mat3_to_quat(quat, (float (*)[3])self->contigPtr);
+ if (self->num_row == 3) {
+ mat3_to_quat(quat, (float (*)[3])self->matrix);
}
else {
- mat4_to_quat(quat, (float (*)[4])self->contigPtr);
+ mat4_to_quat(quat, (float (*)[4])self->matrix);
}
return Quaternion_CreatePyObject(quat, Py_NEW, NULL);
@@ -697,8 +921,8 @@ PyDoc_STRVAR(Matrix_to_euler_doc,
);
static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
{
- const char *order_str= NULL;
- short order= EULER_ORDER_XYZ;
+ const char *order_str = NULL;
+ short order = EULER_ORDER_XYZ;
float eul[3], eul_compatf[3];
EulerObject *eul_compat = NULL;
@@ -718,13 +942,13 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
copy_v3_v3(eul_compatf, eul_compat->eul);
}
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if (self->col_size ==3 && self->row_size ==3) {
- mat= (float (*)[3])self->contigPtr;
+ /*must be 3-4 cols, 3-4 rows, square matrix */
+ if (self->num_row ==3 && self->num_col ==3) {
+ mat = (float (*)[3])self->matrix;
}
- else if (self->col_size ==4 && self->row_size ==4) {
- copy_m3_m4(tmat, (float (*)[4])self->contigPtr);
- mat= tmat;
+ else if (self->num_row ==4 && self->num_col ==4) {
+ copy_m3_m4(tmat, (float (*)[4])self->matrix);
+ mat = tmat;
}
else {
PyErr_SetString(PyExc_ValueError,
@@ -734,7 +958,7 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
}
if (order_str) {
- order= euler_order_from_string(order_str, "Matrix.to_euler()");
+ order = euler_order_from_string(order_str, "Matrix.to_euler()");
if (order == -1)
return NULL;
@@ -759,9 +983,10 @@ PyDoc_STRVAR(Matrix_resize_4x4_doc,
);
static PyObject *Matrix_resize_4x4(MatrixObject *self)
{
- int x, first_row_elem, curr_pos, new_pos, blank_columns, blank_rows, index;
+ float mat[4][4] = MAT4_UNITY;
+ int col;
- if (self->wrapped==Py_WRAP) {
+ if (self->wrapped == Py_WRAP) {
PyErr_SetString(PyExc_TypeError,
"Matrix.resize_4x4(): "
"cannot resize wrapped data - make a copy and resize that");
@@ -774,43 +999,22 @@ static PyObject *Matrix_resize_4x4(MatrixObject *self)
return NULL;
}
- self->contigPtr = PyMem_Realloc(self->contigPtr, (sizeof(float) * 16));
- if (self->contigPtr == NULL) {
+ self->matrix = PyMem_Realloc(self->matrix, (sizeof(float) * 16));
+ if (self->matrix == NULL) {
PyErr_SetString(PyExc_MemoryError,
"Matrix.resize_4x4(): "
"problem allocating pointer space");
return NULL;
}
- /*set row pointers*/
- for (x = 0; x < 4; x++) {
- self->matrix[x] = self->contigPtr + (x * 4);
- }
- /*move data to new spot in array + clean*/
- for (blank_rows = (4 - self->row_size); blank_rows > 0; blank_rows--) {
- for (x = 0; x < 4; x++) {
- index = (4 * (self->row_size + (blank_rows - 1))) + x;
- if (index == 10 || index == 15) {
- self->contigPtr[index] = 1.0f;
- }
- else {
- self->contigPtr[index] = 0.0f;
- }
- }
- }
- for (x = 1; x <= self->row_size; x++) {
- first_row_elem = (self->col_size * (self->row_size - x));
- curr_pos = (first_row_elem + (self->col_size -1));
- new_pos = (4 * (self->row_size - x)) + (curr_pos - first_row_elem);
- for (blank_columns = (4 - self->col_size); blank_columns > 0; blank_columns--) {
- self->contigPtr[new_pos + blank_columns] = 0.0f;
- }
- for ( ; curr_pos >= first_row_elem; curr_pos--) {
- self->contigPtr[new_pos] = self->contigPtr[curr_pos];
- new_pos--;
- }
+
+ for (col = 0; col < self->num_col; col++) {
+ memcpy(mat[col], MATRIX_COL_PTR(self, col), self->num_row * sizeof(float));
}
- self->row_size = 4;
- self->col_size = 4;
+
+ copy_m4_m4((float (*)[4])self->matrix, (float (*)[4])mat);
+
+ self->num_col = 4;
+ self->num_row = 4;
Py_RETURN_NONE;
}
@@ -828,12 +1032,12 @@ static PyObject *Matrix_to_4x4(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (self->col_size==4 && self->row_size==4) {
- return Matrix_CreatePyObject(self->contigPtr, 4, 4, Py_NEW, Py_TYPE(self));
+ if (self->num_row == 4 && self->num_col == 4) {
+ return Matrix_CreatePyObject(self->matrix, 4, 4, Py_NEW, Py_TYPE(self));
}
- else if (self->col_size==3 && self->row_size==3) {
+ else if (self->num_row == 3 && self->num_col == 3) {
float mat[4][4];
- copy_m4_m3(mat, (float (*)[3])self->contigPtr);
+ copy_m4_m3(mat, (float (*)[3])self->matrix);
return Matrix_CreatePyObject((float *)mat, 4, 4, Py_NEW, Py_TYPE(self));
}
/* TODO, 2x2 matrix */
@@ -859,7 +1063,7 @@ static PyObject *Matrix_to_3x3(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if ((self->col_size < 3) || (self->row_size < 3)) {
+ if ((self->num_row < 3) || (self->num_col < 3)) {
PyErr_SetString(PyExc_TypeError,
"Matrix.to_3x3(): inappropriate matrix size");
return NULL;
@@ -883,14 +1087,14 @@ static PyObject *Matrix_to_translation(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if ((self->col_size < 3) || self->row_size < 4) {
+ if ((self->num_row < 3) || self->num_col < 4) {
PyErr_SetString(PyExc_TypeError,
"Matrix.to_translation(): "
"inappropriate matrix size");
return NULL;
}
- return Vector_CreatePyObject(self->matrix[3], 3, Py_NEW, NULL);
+ return Vector_CreatePyObject(MATRIX_COL_PTR(self, 3), 3, Py_NEW, NULL);
}
PyDoc_STRVAR(Matrix_to_scale_doc,
@@ -912,8 +1116,8 @@ static PyObject *Matrix_to_scale(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if ((self->col_size < 3) || (self->row_size < 3)) {
+ /*must be 3-4 cols, 3-4 rows, square matrix */
+ if ((self->num_row < 3) || (self->num_col < 3)) {
PyErr_SetString(PyExc_TypeError,
"Matrix.to_scale(): "
"inappropriate matrix size, 3x3 minimum size");
@@ -951,38 +1155,38 @@ static PyObject *Matrix_invert(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (self->row_size != self->col_size) {
+ if (self->num_col != self->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix.invert(ed): "
"only square matrices are supported");
return NULL;
}
- /*calculate the determinant*/
+ /* calculate the determinant */
det = matrix_determinant_internal(self);
if (det != 0) {
- /*calculate the classical adjoint*/
- if (self->row_size == 2) {
- mat[0] = self->matrix[1][1];
- mat[1] = -self->matrix[0][1];
- mat[2] = -self->matrix[1][0];
- mat[3] = self->matrix[0][0];
+ /* calculate the classical adjoint */
+ if (self->num_col == 2) {
+ mat[0] = MATRIX_ITEM(self, 1, 1);
+ mat[1] = -MATRIX_ITEM(self, 0, 1);
+ mat[2] = -MATRIX_ITEM(self, 1, 0);
+ mat[3] = MATRIX_ITEM(self, 0, 0);
}
- else if (self->row_size == 3) {
- adjoint_m3_m3((float (*)[3]) mat,(float (*)[3])self->contigPtr);
+ else if (self->num_col == 3) {
+ adjoint_m3_m3((float (*)[3]) mat,(float (*)[3])self->matrix);
}
- else if (self->row_size == 4) {
- adjoint_m4_m4((float (*)[4]) mat, (float (*)[4])self->contigPtr);
+ else if (self->num_col == 4) {
+ adjoint_m4_m4((float (*)[4]) mat, (float (*)[4])self->matrix);
}
- /*divide by determinate*/
- for (x = 0; x < (self->row_size * self->col_size); x++) {
+ /* divide by determinate */
+ for (x = 0; x < (self->num_col * self->num_row); x++) {
mat[x] /= det;
}
- /*set values*/
- for (x = 0; x < self->row_size; x++) {
- for (y = 0; y < self->col_size; y++) {
- self->matrix[x][y] = mat[z];
+ /* set values */
+ for (x = 0; x < self->num_col; x++) {
+ for (y = 0; y < self->num_row; y++) {
+ MATRIX_ITEM(self, y, x) = mat[z];
z++;
}
}
@@ -1035,7 +1239,7 @@ static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
if (mathutils_any_to_rotmat(other_rmat, value, "matrix.rotate(value)") == -1)
return NULL;
- if (self->col_size != 3 || self->row_size != 3) {
+ if (self->num_row != 3 || self->num_col != 3) {
PyErr_SetString(PyExc_TypeError,
"Matrix.rotate(): "
"must have 3x3 dimensions");
@@ -1045,7 +1249,7 @@ static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
matrix_as_3x3(self_rmat, self);
mul_m3_m3m3(rmat, other_rmat, self_rmat);
- copy_m3_m3((float (*)[3])(self->contigPtr), rmat);
+ copy_m3_m3((float (*)[3])(self->matrix), rmat);
(void)BaseMath_WriteCallback(self);
Py_RETURN_NONE;
@@ -1068,7 +1272,7 @@ static PyObject *Matrix_decompose(MatrixObject *self)
float quat[4];
float size[3];
- if (self->col_size != 4 || self->row_size != 4) {
+ if (self->num_row != 4 || self->num_col != 4) {
PyErr_SetString(PyExc_TypeError,
"Matrix.decompose(): "
"inappropriate matrix size - expects 4x4 matrix");
@@ -1078,10 +1282,10 @@ static PyObject *Matrix_decompose(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- mat4_to_loc_rot_size(loc, rot, size, (float (*)[4])self->contigPtr);
+ mat4_to_loc_rot_size(loc, rot, size, (float (*)[4])self->matrix);
mat3_to_quat(quat, rot);
- ret= PyTuple_New(3);
+ ret = PyTuple_New(3);
PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(loc, 3, Py_NEW, NULL));
PyTuple_SET_ITEM(ret, 1, Quaternion_CreatePyObject(quat, Py_NEW, NULL));
PyTuple_SET_ITEM(ret, 2, Vector_CreatePyObject(size, 3, Py_NEW, NULL));
@@ -1106,12 +1310,12 @@ PyDoc_STRVAR(Matrix_lerp_doc,
static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
{
MatrixObject *mat2 = NULL;
- float fac, mat[MATRIX_MAX_DIM*MATRIX_MAX_DIM];
+ float fac, mat[MATRIX_MAX_DIM * MATRIX_MAX_DIM];
if (!PyArg_ParseTuple(args, "O!f:lerp", &matrix_Type, &mat2, &fac))
return NULL;
- if (self->row_size != mat2->row_size || self->col_size != mat2->col_size) {
+ if (self->num_col != mat2->num_col || self->num_row != mat2->num_row) {
PyErr_SetString(PyExc_ValueError,
"Matrix.lerp(): "
"expects both matrix objects of the same dimensions");
@@ -1122,11 +1326,11 @@ static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
return NULL;
/* TODO, different sized matrix */
- if (self->row_size==4 && self->col_size==4) {
- blend_m4_m4m4((float (*)[4])mat, (float (*)[4])self->contigPtr, (float (*)[4])mat2->contigPtr, fac);
+ if (self->num_col == 4 && self->num_row == 4) {
+ blend_m4_m4m4((float (*)[4])mat, (float (*)[4])self->matrix, (float (*)[4])mat2->matrix, fac);
}
- else if (self->row_size==3 && self->col_size==3) {
- blend_m3_m3m3((float (*)[3])mat, (float (*)[3])self->contigPtr, (float (*)[3])mat2->contigPtr, fac);
+ else if (self->num_col == 3 && self->num_row == 3) {
+ blend_m3_m3m3((float (*)[3])mat, (float (*)[3])self->matrix, (float (*)[3])mat2->matrix, fac);
}
else {
PyErr_SetString(PyExc_ValueError,
@@ -1135,7 +1339,7 @@ static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
return NULL;
}
- return Matrix_CreatePyObject(mat, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
+ return Matrix_CreatePyObject(mat, self->num_col, self->num_row, Py_NEW, Py_TYPE(self));
}
/*---------------------------matrix.determinant() ----------------*/
@@ -1154,7 +1358,7 @@ static PyObject *Matrix_determinant(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (self->row_size != self->col_size) {
+ if (self->num_col != self->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix.determinant(): "
"only square matrices are supported");
@@ -1173,28 +1377,26 @@ PyDoc_STRVAR(Matrix_transpose_doc,
);
static PyObject *Matrix_transpose(MatrixObject *self)
{
- float t = 0.0f;
-
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (self->row_size != self->col_size) {
+ if (self->num_col != self->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix.transpose(d): "
"only square matrices are supported");
return NULL;
}
- if (self->row_size == 2) {
- t = self->matrix[1][0];
- self->matrix[1][0] = self->matrix[0][1];
- self->matrix[0][1] = t;
+ if (self->num_col == 2) {
+ const float t = MATRIX_ITEM(self, 1, 0);
+ MATRIX_ITEM(self, 1, 0) = MATRIX_ITEM(self, 0, 1);
+ MATRIX_ITEM(self, 0, 1) = t;
}
- else if (self->row_size == 3) {
- transpose_m3((float (*)[3])self->contigPtr);
+ else if (self->num_col == 3) {
+ transpose_m3((float (*)[3])self->matrix);
}
else {
- transpose_m4((float (*)[4])self->contigPtr);
+ transpose_m4((float (*)[4])self->matrix);
}
(void)BaseMath_WriteCallback(self);
@@ -1225,7 +1427,7 @@ PyDoc_STRVAR(Matrix_zero_doc,
);
static PyObject *Matrix_zero(MatrixObject *self)
{
- fill_vn_fl(self->contigPtr, self->row_size * self->col_size, 0.0f);
+ fill_vn_fl(self->matrix, self->num_col * self->num_row, 0.0f);
if (BaseMath_WriteCallback(self) == -1)
return NULL;
@@ -1248,24 +1450,24 @@ static PyObject *Matrix_identity(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (self->row_size != self->col_size) {
+ if (self->num_col != self->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix.identity(): "
"only square matrices are supported");
return NULL;
}
- if (self->row_size == 2) {
- self->matrix[0][0] = 1.0f;
- self->matrix[0][1] = 0.0f;
- self->matrix[1][0] = 0.0f;
- self->matrix[1][1] = 1.0f;
+ if (self->num_col == 2) {
+ MATRIX_ITEM(self, 0, 0) = 1.0f;
+ MATRIX_ITEM(self, 0, 1) = 0.0f;
+ MATRIX_ITEM(self, 1, 0) = 0.0f;
+ MATRIX_ITEM(self, 1, 1) = 1.0f;
}
- else if (self->row_size == 3) {
- unit_m3((float (*)[3])self->contigPtr);
+ else if (self->num_col == 3) {
+ unit_m3((float (*)[3])self->matrix);
}
else {
- unit_m4((float (*)[4])self->contigPtr);
+ unit_m4((float (*)[4])self->matrix);
}
if (BaseMath_WriteCallback(self) == -1)
@@ -1288,26 +1490,26 @@ static PyObject *Matrix_copy(MatrixObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- return Matrix_CreatePyObject((float (*))self->contigPtr, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
+ return Matrix_CreatePyObject((float (*))self->matrix, self->num_col, self->num_row, Py_NEW, Py_TYPE(self));
}
/*----------------------------print object (internal)-------------*/
-/*print the object to screen*/
+/* print the object to screen */
static PyObject *Matrix_repr(MatrixObject *self)
{
- int x, y;
- PyObject *rows[MATRIX_MAX_DIM]= {NULL};
+ int col, row;
+ PyObject *rows[MATRIX_MAX_DIM] = {NULL};
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- for (x = 0; x < self->row_size; x++) {
- rows[x]= PyTuple_New(self->col_size);
- for (y = 0; y < self->col_size; y++) {
- PyTuple_SET_ITEM(rows[x], y, PyFloat_FromDouble(self->matrix[x][y]));
+ for (row = 0; row < self->num_row; row++) {
+ rows[row] = PyTuple_New(self->num_col);
+ for (col = 0; col < self->num_col; col++) {
+ PyTuple_SET_ITEM(rows[row], col, PyFloat_FromDouble(MATRIX_ITEM(self, row, col)));
}
}
- switch(self->row_size) {
+ switch (self->num_row) {
case 2: return PyUnicode_FromFormat("Matrix((%R,\n"
" %R))", rows[0], rows[1]);
@@ -1325,21 +1527,57 @@ static PyObject *Matrix_repr(MatrixObject *self)
return NULL;
}
-static PyObject* Matrix_richcmpr(PyObject *a, PyObject *b, int op)
+static PyObject *Matrix_str(MatrixObject *self)
+{
+ DynStr *ds;
+
+ int maxsize[MATRIX_MAX_DIM];
+ int row, col;
+
+ char dummy_buf[1];
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ ds = BLI_dynstr_new();
+
+ /* First determine the maximum width for each column */
+ for (col = 0; col < self->num_col; col++) {
+ maxsize[col] = 0;
+ for (row = 0; row < self->num_row; row++) {
+ int size = BLI_snprintf(dummy_buf, sizeof(dummy_buf), "%.4f", MATRIX_ITEM(self, row, col));
+ maxsize[col] = MAX2(maxsize[col], size);
+ }
+ }
+
+ /* Now write the unicode string to be printed */
+ BLI_dynstr_appendf(ds, "<Matrix %dx%d (", self->num_row, self->num_col);
+ for (row = 0; row < self->num_row; row++) {
+ for (col = 0; col < self->num_col; col++) {
+ BLI_dynstr_appendf(ds, col ? ", %*.4f" : "%*.4f", maxsize[col], MATRIX_ITEM(self, row, col));
+ }
+ BLI_dynstr_append(ds, row + 1 != self->num_row ? ")\n " : ")");
+ }
+ BLI_dynstr_append(ds, ">");
+
+ return mathutils_dynstr_to_py(ds); /* frees ds */
+}
+
+static PyObject *Matrix_richcmpr(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (MatrixObject_Check(a) && MatrixObject_Check(b)) {
- MatrixObject *matA= (MatrixObject*)a;
- MatrixObject *matB= (MatrixObject*)b;
+ MatrixObject *matA = (MatrixObject *)a;
+ MatrixObject *matB = (MatrixObject *)b;
if (BaseMath_ReadCallback(matA) == -1 || BaseMath_ReadCallback(matB) == -1)
return NULL;
- ok= ( (matA->col_size == matB->col_size) &&
- (matA->row_size == matB->row_size) &&
- EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr, (matA->row_size * matA->col_size), 1)
+ ok = ( (matA->num_row == matB->num_row) &&
+ (matA->num_col == matB->num_col) &&
+ EXPP_VectorsAreEqual(matA->matrix, matB->matrix, (matA->num_col * matA->num_row), 1)
) ? 0 : -1;
}
@@ -1366,52 +1604,97 @@ static PyObject* Matrix_richcmpr(PyObject *a, PyObject *b, int op)
/*---------------------SEQUENCE PROTOCOLS------------------------
----------------------------len(object)------------------------
- sequence length*/
+ sequence length */
static int Matrix_len(MatrixObject *self)
{
- return (self->row_size);
+ return (self->num_row);
}
/*----------------------------object[]---------------------------
sequence accessor (get)
- the wrapped vector gives direct access to the matrix data*/
-static PyObject *Matrix_item(MatrixObject *self, int i)
+ the wrapped vector gives direct access to the matrix data */
+static PyObject *Matrix_item_row(MatrixObject *self, int row)
+{
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ if (row < 0 || row >= self->num_row) {
+ PyErr_SetString(PyExc_IndexError,
+ "matrix[attribute]: "
+ "array index out of range");
+ return NULL;
+ }
+ return Vector_CreatePyObject_cb((PyObject *)self, self->num_col, mathutils_matrix_row_cb_index, row);
+}
+/* same but column access */
+static PyObject *Matrix_item_col(MatrixObject *self, int col)
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (i < 0 || i >= self->row_size) {
+ if (col < 0 || col >= self->num_col) {
PyErr_SetString(PyExc_IndexError,
"matrix[attribute]: "
"array index out of range");
return NULL;
}
- return Vector_CreatePyObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, i);
+ return Vector_CreatePyObject_cb((PyObject *)self, self->num_row, mathutils_matrix_col_cb_index, col);
}
+
/*----------------------------object[]-------------------------
sequence accessor (set) */
-static int Matrix_ass_item(MatrixObject *self, int i, PyObject *value)
+static int Matrix_ass_item_row(MatrixObject *self, int row, PyObject *value)
+{
+ int col;
+ float vec[4];
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ if (row >= self->num_row || row < 0) {
+ PyErr_SetString(PyExc_IndexError,
+ "matrix[attribute] = x: bad row");
+ return -1;
+ }
+
+ if (mathutils_array_parse(vec, self->num_col, self->num_col, value, "matrix[i] = value assignment") < 0) {
+ return -1;
+ }
+
+ /* Since we are assigning a row we cannot memcpy */
+ for (col = 0; col < self->num_col; col++) {
+ MATRIX_ITEM(self, row, col) = vec[col];
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+static int Matrix_ass_item_col(MatrixObject *self, int col, PyObject *value)
{
+ int row;
float vec[4];
if (BaseMath_ReadCallback(self) == -1)
return -1;
- if (i >= self->row_size || i < 0) {
+ if (col >= self->num_col || col < 0) {
PyErr_SetString(PyExc_IndexError,
- "matrix[attribute] = x: bad column");
+ "matrix[attribute] = x: bad col");
return -1;
}
- if (mathutils_array_parse(vec, self->col_size, self->col_size, value, "matrix[i] = value assignment") < 0) {
+ if (mathutils_array_parse(vec, self->num_row, self->num_row, value, "matrix[i] = value assignment") < 0) {
return -1;
}
- memcpy(self->matrix[i], vec, self->col_size *sizeof(float));
+ /* Since we are assigning a row we cannot memcpy */
+ for (row = 0; row < self->num_row; row++) {
+ MATRIX_ITEM(self, row, col) = vec[row];
+ }
(void)BaseMath_WriteCallback(self);
return 0;
}
+
/*----------------------------object[z:y]------------------------
sequence slice (get)*/
static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
@@ -1423,14 +1706,14 @@ static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- CLAMP(begin, 0, self->row_size);
- CLAMP(end, 0, self->row_size);
- begin= MIN2(begin, end);
+ CLAMP(begin, 0, self->num_row);
+ CLAMP(end, 0, self->num_row);
+ begin = MIN2(begin, end);
- tuple= PyTuple_New(end - begin);
- for (count= begin; count < end; count++) {
+ tuple = PyTuple_New(end - begin);
+ for (count = begin; count < end; count++) {
PyTuple_SET_ITEM(tuple, count - begin,
- Vector_CreatePyObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, count));
+ Vector_CreatePyObject_cb((PyObject *)self, self->num_col, mathutils_matrix_row_cb_index, count));
}
@@ -1440,24 +1723,25 @@ static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
sequence slice (set)*/
static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value)
{
- PyObject *value_fast= NULL;
+ PyObject *value_fast = NULL;
if (BaseMath_ReadCallback(self) == -1)
return -1;
- CLAMP(begin, 0, self->row_size);
- CLAMP(end, 0, self->row_size);
+ CLAMP(begin, 0, self->num_row);
+ CLAMP(end, 0, self->num_row);
begin = MIN2(begin, end);
/* non list/tuple cases */
- if (!(value_fast=PySequence_Fast(value, "matrix[begin:end] = value"))) {
+ if (!(value_fast = PySequence_Fast(value, "matrix[begin:end] = value"))) {
/* PySequence_Fast sets the error */
return -1;
}
else {
- const int size= end - begin;
- int i;
+ const int size = end - begin;
+ int row, col;
float mat[16];
+ float vec[4];
if (PySequence_Fast_GET_SIZE(value_fast) != size) {
Py_DECREF(value_fast);
@@ -1467,22 +1751,28 @@ static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *va
return -1;
}
- /*parse sub items*/
- for (i = 0; i < size; i++) {
- /*parse each sub sequence*/
- PyObject *item= PySequence_Fast_GET_ITEM(value_fast, i);
+ memcpy(mat, self->matrix, self->num_col * self->num_row * sizeof(float));
+
+ /* parse sub items */
+ for (row = begin; row < end; row++) {
+ /* parse each sub sequence */
+ PyObject *item = PySequence_Fast_GET_ITEM(value_fast, row - begin);
- if (mathutils_array_parse(&mat[i * self->col_size], self->col_size, self->col_size, item,
+ if (mathutils_array_parse(vec, self->num_col, self->num_col, item,
"matrix[begin:end] = value assignment") < 0)
{
return -1;
}
+
+ for (col = 0; col < self->num_col; col++) {
+ mat[col * self->num_row + row] = vec[col];
+ }
}
Py_DECREF(value_fast);
/*parsed well - now set in matrix*/
- memcpy(self->contigPtr + (begin * self->col_size), mat, sizeof(float) * (size * self->col_size));
+ memcpy(self->matrix, mat, self->num_col * self->num_row * sizeof(float));
(void)BaseMath_WriteCallback(self);
return 0;
@@ -1495,8 +1785,8 @@ static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
float mat[16];
MatrixObject *mat1 = NULL, *mat2 = NULL;
- mat1 = (MatrixObject*)m1;
- mat2 = (MatrixObject*)m2;
+ mat1 = (MatrixObject *)m1;
+ mat2 = (MatrixObject *)m2;
if (!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
PyErr_Format(PyExc_TypeError,
@@ -1509,16 +1799,16 @@ static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
if (BaseMath_ReadCallback(mat1) == -1 || BaseMath_ReadCallback(mat2) == -1)
return NULL;
- if (mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size) {
+ if (mat1->num_col != mat2->num_col || mat1->num_row != mat2->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"matrices must have the same dimensions for this operation");
return NULL;
}
- add_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
+ add_vn_vnvn(mat, mat1->matrix, mat2->matrix, mat1->num_col * mat1->num_row);
- return Matrix_CreatePyObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+ return Matrix_CreatePyObject(mat, mat1->num_col, mat1->num_row, Py_NEW, Py_TYPE(mat1));
}
/*------------------------obj - obj------------------------------
subtraction*/
@@ -1527,8 +1817,8 @@ static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
float mat[16];
MatrixObject *mat1 = NULL, *mat2 = NULL;
- mat1 = (MatrixObject*)m1;
- mat2 = (MatrixObject*)m2;
+ mat1 = (MatrixObject *)m1;
+ mat2 = (MatrixObject *)m2;
if (!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
PyErr_Format(PyExc_TypeError,
@@ -1542,74 +1832,82 @@ static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
if (BaseMath_ReadCallback(mat1) == -1 || BaseMath_ReadCallback(mat2) == -1)
return NULL;
- if (mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size) {
+ if (mat1->num_col != mat2->num_col || mat1->num_row != mat2->num_row) {
PyErr_SetString(PyExc_TypeError,
"Matrix addition: "
"matrices must have the same dimensions for this operation");
return NULL;
}
- sub_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
+ sub_vn_vnvn(mat, mat1->matrix, mat2->matrix, mat1->num_col * mat1->num_row);
- return Matrix_CreatePyObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+ return Matrix_CreatePyObject(mat, mat1->num_col, mat1->num_row, Py_NEW, Py_TYPE(mat1));
}
/*------------------------obj * obj------------------------------
mulplication*/
static PyObject *matrix_mul_float(MatrixObject *mat, const float scalar)
{
float tmat[16];
- mul_vn_vn_fl(tmat, mat->contigPtr, mat->row_size * mat->col_size, scalar);
- return Matrix_CreatePyObject(tmat, mat->row_size, mat->col_size, Py_NEW, Py_TYPE(mat));
+ mul_vn_vn_fl(tmat, mat->matrix, mat->num_col * mat->num_row, scalar);
+ return Matrix_CreatePyObject(tmat, mat->num_col, mat->num_row, Py_NEW, Py_TYPE(mat));
}
static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
{
float scalar;
+ int vec_size;
MatrixObject *mat1 = NULL, *mat2 = NULL;
if (MatrixObject_Check(m1)) {
- mat1 = (MatrixObject*)m1;
+ mat1 = (MatrixObject *)m1;
if (BaseMath_ReadCallback(mat1) == -1)
return NULL;
}
if (MatrixObject_Check(m2)) {
- mat2 = (MatrixObject*)m2;
+ mat2 = (MatrixObject *)m2;
if (BaseMath_ReadCallback(mat2) == -1)
return NULL;
}
if (mat1 && mat2) {
- /*MATRIX * MATRIX*/
- float mat[16]= {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- double dot = 0.0f;
- int x, y, z;
-
- for (x = 0; x < mat2->row_size; x++) {
- for (y = 0; y < mat1->col_size; y++) {
- for (z = 0; z < mat1->row_size; z++) {
- dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
+ /* MATRIX * MATRIX */
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+
+ int col, row, item;
+
+ if (mat1->num_col != mat2->num_row) {
+ PyErr_SetString(PyExc_ValueError,
+ "matrix1 * matrix2: matrix1 number of columns "
+ "and the matrix2 number of rows must be the same");
+ return NULL;
+ }
+
+ for (col = 0; col < mat2->num_col; col++) {
+ for (row = 0; row < mat1->num_row; row++) {
+ double dot = 0.0f;
+ for (item = 0; item < mat1->num_col; item++) {
+ dot += MATRIX_ITEM(mat1, row, item) * MATRIX_ITEM(mat2, item, col);
}
- mat[((x * mat1->col_size) + y)] = (float)dot;
- dot = 0.0f;
+ mat[(col * mat1->num_row) + row] = (float)dot;
}
}
- return Matrix_CreatePyObject(mat, mat2->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+ return Matrix_CreatePyObject(mat, mat2->num_col, mat1->num_row, Py_NEW, Py_TYPE(mat1));
}
else if (mat2) {
/*FLOAT/INT * MATRIX */
- if (((scalar= PyFloat_AsDouble(m1)) == -1.0f && PyErr_Occurred())==0) {
+ if (((scalar = PyFloat_AsDouble(m1)) == -1.0f && PyErr_Occurred()) == 0) {
return matrix_mul_float(mat2, scalar);
}
}
else if (mat1) {
- /*VEC * MATRIX */
+ /* MATRIX * VECTOR */
if (VectorObject_Check(m2)) {
- VectorObject *vec2= (VectorObject *)m2;
+ VectorObject *vec2 = (VectorObject *)m2;
float tvec[4];
if (BaseMath_ReadCallback(vec2) == -1)
return NULL;
@@ -1617,10 +1915,17 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
return NULL;
}
- return Vector_CreatePyObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2));
+ if (mat1->num_col == 4 && vec2->size == 3) {
+ vec_size = 3;
+ }
+ else {
+ vec_size = mat1->num_row;
+ }
+
+ return Vector_CreatePyObject(tvec, vec_size, Py_NEW, Py_TYPE(m2));
}
/*FLOAT/INT * MATRIX */
- else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
+ else if (((scalar = PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred()) == 0) {
return matrix_mul_float(mat1, scalar);
}
}
@@ -1634,7 +1939,7 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
Py_TYPE(m1)->tp_name, Py_TYPE(m2)->tp_name);
return NULL;
}
-static PyObject* Matrix_inv(MatrixObject *self)
+static PyObject *Matrix_inv(MatrixObject *self)
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -1647,9 +1952,9 @@ static PySequenceMethods Matrix_SeqMethods = {
(lenfunc) Matrix_len, /* sq_length */
(binaryfunc) NULL, /* sq_concat */
(ssizeargfunc) NULL, /* sq_repeat */
- (ssizeargfunc) Matrix_item, /* sq_item */
+ (ssizeargfunc) Matrix_item_row, /* sq_item */
(ssizessizeargfunc) NULL, /* sq_slice, deprecated */
- (ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */
+ (ssizeobjargproc) Matrix_ass_item_row, /* sq_ass_item */
(ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */
(objobjproc) NULL, /* sq_contains */
(binaryfunc) NULL, /* sq_inplace_concat */
@@ -1657,7 +1962,7 @@ static PySequenceMethods Matrix_SeqMethods = {
};
-static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
+static PyObject *Matrix_subscript(MatrixObject *self, PyObject *item)
{
if (PyIndex_Check(item)) {
Py_ssize_t i;
@@ -1665,13 +1970,13 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
if (i == -1 && PyErr_Occurred())
return NULL;
if (i < 0)
- i += self->row_size;
- return Matrix_item(self, i);
+ i += self->num_row;
+ return Matrix_item_row(self, i);
}
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->num_row, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
@@ -1694,20 +1999,20 @@ static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
}
}
-static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* value)
+static int Matrix_ass_subscript(MatrixObject *self, PyObject *item, PyObject *value)
{
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return -1;
if (i < 0)
- i += self->row_size;
- return Matrix_ass_item(self, i, value);
+ i += self->num_row;
+ return Matrix_ass_item_row(self, i, value);
}
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, self->num_row, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -1770,16 +2075,74 @@ static PyNumberMethods Matrix_NumMethods = {
NULL, /* nb_index */
};
-static PyObject *Matrix_getRowSize(MatrixObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Matrix_translation_doc,
+"The translation component of the matrix.\n\n:type: Vector"
+);
+static PyObject *Matrix_translation_get(MatrixObject *self, void *UNUSED(closure))
+{
+ PyObject *ret;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ /*must be 4x4 square matrix*/
+ if (self->num_row != 4 || self->num_col != 4) {
+ PyErr_SetString(PyExc_AttributeError,
+ "Matrix.translation: "
+ "inappropriate matrix size, must be 4x4");
+ return NULL;
+ }
+
+ ret = (PyObject *)Vector_CreatePyObject_cb((PyObject *)self, 3, mathutils_matrix_translation_cb_index, 3);
+
+ return ret;
+}
+
+static int Matrix_translation_set(MatrixObject *self, PyObject *value, void *UNUSED(closure))
+{
+ float tvec[3];
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return -1;
+
+ /*must be 4x4 square matrix*/
+ if (self->num_row != 4 || self->num_col != 4) {
+ PyErr_SetString(PyExc_AttributeError,
+ "Matrix.translation: "
+ "inappropriate matrix size, must be 4x4");
+ return -1;
+ }
+
+ if ((mathutils_array_parse(tvec, 3, 3, value, "Matrix.translation")) == -1) {
+ return -1;
+ }
+
+ copy_v3_v3(((float (*)[4])self->matrix)[3], tvec);
+
+ (void)BaseMath_WriteCallback(self);
+
+ return 0;
+}
+
+PyDoc_STRVAR(Matrix_row_doc,
+"Access the matix by rows (default), (readonly).\n\n:type: Matrix Access"
+);
+static PyObject *Matrix_row_get(MatrixObject *self, void *UNUSED(closure))
{
- return PyLong_FromLong((long) self->row_size);
+ return MatrixAccess_CreatePyObject(self, MAT_ACCESS_ROW);
}
-static PyObject *Matrix_getColSize(MatrixObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Matrix_col_doc,
+"Access the matix by colums, 3x3 and 4x4 only, (readonly).\n\n:type: Matrix Access"
+);
+static PyObject *Matrix_col_get(MatrixObject *self, void *UNUSED(closure))
{
- return PyLong_FromLong((long) self->col_size);
+ return MatrixAccess_CreatePyObject(self, MAT_ACCESS_COL);
}
+PyDoc_STRVAR(Matrix_median_scale_doc,
+"The average scale applied to each axis (readonly).\n\n:type: float"
+);
static PyObject *Matrix_median_scale_get(MatrixObject *self, void *UNUSED(closure))
{
float mat[3][3];
@@ -1788,7 +2151,7 @@ static PyObject *Matrix_median_scale_get(MatrixObject *self, void *UNUSED(closur
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if ((self->col_size < 3) || (self->row_size < 3)) {
+ if ((self->num_row < 3) || (self->num_col < 3)) {
PyErr_SetString(PyExc_AttributeError,
"Matrix.median_scale: "
"inappropriate matrix size, 3x3 minimum");
@@ -1800,16 +2163,19 @@ static PyObject *Matrix_median_scale_get(MatrixObject *self, void *UNUSED(closur
return PyFloat_FromDouble(mat3_to_scale(mat));
}
+PyDoc_STRVAR(Matrix_is_negative_doc,
+"True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool"
+);
static PyObject *Matrix_is_negative_get(MatrixObject *self, void *UNUSED(closure))
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if (self->col_size == 4 && self->row_size == 4)
- return PyBool_FromLong(is_negative_m4((float (*)[4])self->contigPtr));
- else if (self->col_size == 3 && self->row_size == 3)
- return PyBool_FromLong(is_negative_m3((float (*)[3])self->contigPtr));
+ if (self->num_row == 4 && self->num_col == 4)
+ return PyBool_FromLong(is_negative_m4((float (*)[4])self->matrix));
+ else if (self->num_row == 3 && self->num_col == 3)
+ return PyBool_FromLong(is_negative_m3((float (*)[3])self->matrix));
else {
PyErr_SetString(PyExc_AttributeError,
"Matrix.is_negative: "
@@ -1818,16 +2184,19 @@ static PyObject *Matrix_is_negative_get(MatrixObject *self, void *UNUSED(closure
}
}
+PyDoc_STRVAR(Matrix_is_orthogonal_doc,
+"True if this matrix is orthogonal, 3x3 and 4x4 only, (readonly).\n\n:type: bool"
+);
static PyObject *Matrix_is_orthogonal_get(MatrixObject *self, void *UNUSED(closure))
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
- if (self->col_size == 4 && self->row_size == 4)
- return PyBool_FromLong(is_orthogonal_m4((float (*)[4])self->contigPtr));
- else if (self->col_size == 3 && self->row_size == 3)
- return PyBool_FromLong(is_orthogonal_m3((float (*)[3])self->contigPtr));
+ if (self->num_row == 4 && self->num_col == 4)
+ return PyBool_FromLong(is_orthogonal_m4((float (*)[4])self->matrix));
+ else if (self->num_row == 3 && self->num_col == 3)
+ return PyBool_FromLong(is_orthogonal_m3((float (*)[3])self->matrix));
else {
PyErr_SetString(PyExc_AttributeError,
"Matrix.is_orthogonal: "
@@ -1840,13 +2209,14 @@ static PyObject *Matrix_is_orthogonal_get(MatrixObject *self, void *UNUSED(closu
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Matrix_getseters[] = {
- {(char *)"row_size", (getter)Matrix_getRowSize, (setter)NULL, (char *)"The row size of the matrix (readonly).\n\n:type: int", NULL},
- {(char *)"col_size", (getter)Matrix_getColSize, (setter)NULL, (char *)"The column size of the matrix (readonly).\n\n:type: int", NULL},
- {(char *)"median_scale", (getter)Matrix_median_scale_get, (setter)NULL, (char *)"The average scale applied to each axis (readonly).\n\n:type: float", NULL},
- {(char *)"is_negative", (getter)Matrix_is_negative_get, (setter)NULL, (char *)"True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
- {(char *)"is_orthogonal", (getter)Matrix_is_orthogonal_get, (setter)NULL, (char *)"True if this matrix is orthogonal, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
- {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
- {(char *)"owner",(getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+ {(char *)"median_scale", (getter)Matrix_median_scale_get, (setter)NULL, Matrix_median_scale_doc, NULL},
+ {(char *)"translation", (getter)Matrix_translation_get, (setter)Matrix_translation_set, Matrix_translation_doc, NULL},
+ {(char *)"row", (getter)Matrix_row_get, (setter)NULL, Matrix_row_doc, NULL},
+ {(char *)"col", (getter)Matrix_col_get, (setter)NULL, Matrix_col_doc, NULL},
+ {(char *)"is_negative", (getter)Matrix_is_negative_get, (setter)NULL, Matrix_is_negative_doc, NULL},
+ {(char *)"is_orthogonal", (getter)Matrix_is_orthogonal_get, (setter)NULL, Matrix_is_orthogonal_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
+ {(char *)"owner",(getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -1911,7 +2281,7 @@ PyTypeObject matrix_Type = {
&Matrix_AsMapping, /*tp_as_mapping*/
NULL, /*tp_hash*/
NULL, /*tp_call*/
- NULL, /*tp_str*/
+ (reprfunc) Matrix_str, /*tp_str*/
NULL, /*tp_getattro*/
NULL, /*tp_setattro*/
NULL, /*tp_as_buffer*/
@@ -1944,80 +2314,60 @@ PyTypeObject matrix_Type = {
NULL /*tp_del*/
};
-/*------------------------Matrix_CreatePyObject (internal)-------------
-creates a new matrix object
-self->matrix self->contiguous_ptr (reference to data.xxx)
- [0]------------->[0]
- [1]
- [2]
- [1]------------->[3]
- [4]
- [5]
-
-self->matrix[1][1] = self->contigPtr[4] */
-
-/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
- (i.e. it was allocated elsewhere by MEM_mallocN())
- pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
- (i.e. it must be created here with PyMEM_malloc())*/
+/* pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
+ * (i.e. it was allocated elsewhere by MEM_mallocN())
+ * pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
+ * (i.e. it must be created here with PyMEM_malloc()) */
PyObject *Matrix_CreatePyObject(float *mat,
- const unsigned short rowSize, const unsigned short colSize,
+ const unsigned short num_col, const unsigned short num_row,
int type, PyTypeObject *base_type)
{
MatrixObject *self;
- int x, row, col;
- /*matrix objects can be any 2-4row x 2-4col matrix*/
- if (rowSize < 2 || rowSize > 4 || colSize < 2 || colSize > 4) {
+ /* matrix objects can be any 2-4row x 2-4col matrix */
+ if (num_col < 2 || num_col > 4 || num_row < 2 || num_row > 4) {
PyErr_SetString(PyExc_RuntimeError,
"Matrix(): "
"row and column sizes must be between 2 and 4");
return NULL;
}
- self= base_type ? (MatrixObject *)base_type->tp_alloc(base_type, 0) :
- (MatrixObject *)PyObject_GC_New(MatrixObject, &matrix_Type);
+ self = base_type ? (MatrixObject *)base_type->tp_alloc(base_type, 0) :
+ (MatrixObject *)PyObject_GC_New(MatrixObject, &matrix_Type);
if (self) {
- self->row_size = rowSize;
- self->col_size = colSize;
+ self->num_col = num_col;
+ self->num_row = num_row;
/* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ self->cb_user = NULL;
+ self->cb_type = self->cb_subtype = 0;
if (type == Py_WRAP) {
- self->contigPtr = mat;
- /*pointer array points to contigous memory*/
- for (x = 0; x < rowSize; x++) {
- self->matrix[x] = self->contigPtr + (x * colSize);
- }
+ self->matrix = mat;
self->wrapped = Py_WRAP;
}
else if (type == Py_NEW) {
- self->contigPtr = PyMem_Malloc(rowSize * colSize * sizeof(float));
- if (self->contigPtr == NULL) { /*allocation failure*/
+ self->matrix = PyMem_Malloc(num_col * num_row * sizeof(float));
+ if (self->matrix == NULL) { /*allocation failure*/
PyErr_SetString(PyExc_MemoryError,
"Matrix(): "
"problem allocating pointer space");
return NULL;
}
- /*pointer array points to contigous memory*/
- for (x = 0; x < rowSize; x++) {
- self->matrix[x] = self->contigPtr + (x * colSize);
- }
- /*parse*/
+
if (mat) { /*if a float array passed*/
- for (row = 0; row < rowSize; row++) {
- for (col = 0; col < colSize; col++) {
- self->matrix[row][col] = mat[(row * colSize) + col];
- }
- }
+ memcpy(self->matrix, mat, num_col * num_row * sizeof(float));
}
- else if (rowSize == colSize) { /*or if no arguments are passed return identity matrix for square matrices */
- PyObject *ret_dummy= Matrix_identity(self);
+ else if (num_col == num_row) {
+ /* or if no arguments are passed return identity matrix for square matrices */
+ PyObject *ret_dummy = Matrix_identity(self);
Py_DECREF(ret_dummy);
}
+ else {
+ /* otherwise zero everything */
+ memset(self->matrix, 0, num_col * num_row * sizeof(float));
+ }
self->wrapped = Py_NEW;
}
else {
@@ -2028,15 +2378,233 @@ PyObject *Matrix_CreatePyObject(float *mat,
return (PyObject *) self;
}
-PyObject *Matrix_CreatePyObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb_type, int cb_subtype)
+PyObject *Matrix_CreatePyObject_cb(PyObject *cb_user,
+ const unsigned short num_col, const unsigned short num_row,
+ int cb_type, int cb_subtype)
{
- MatrixObject *self= (MatrixObject *)Matrix_CreatePyObject(NULL, rowSize, colSize, Py_NEW, NULL);
+ MatrixObject *self = (MatrixObject *)Matrix_CreatePyObject(NULL, num_col, num_row, Py_NEW, NULL);
if (self) {
Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
+ self->cb_user = cb_user;
+ self->cb_type = (unsigned char)cb_type;
+ self->cb_subtype = (unsigned char)cb_subtype;
PyObject_GC_Track(self);
}
return (PyObject *) self;
}
+
+
+/* ----------------------------------------------------------------------------
+ * special type for alaternate access */
+
+typedef struct {
+ PyObject_HEAD /* required python macro */
+ MatrixObject *matrix_user;
+ eMatrixAccess_t type;
+} MatrixAccessObject;
+
+static int MatrixAccess_traverse(MatrixAccessObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->matrix_user);
+ return 0;
+}
+
+static int MatrixAccess_clear(MatrixAccessObject *self)
+{
+ Py_CLEAR(self->matrix_user);
+ return 0;
+}
+
+static void MatrixAccess_dealloc(MatrixAccessObject *self)
+{
+ if (self->matrix_user) {
+ PyObject_GC_UnTrack(self);
+ MatrixAccess_clear(self);
+ }
+
+ Py_TYPE(self)->tp_free(self);
+}
+
+/* sequence access */
+
+static int MatrixAccess_len(MatrixAccessObject *self)
+{
+ return (self->type == MAT_ACCESS_ROW) ?
+ self->matrix_user->num_row :
+ self->matrix_user->num_col;
+}
+
+static PyObject *MatrixAccess_slice(MatrixAccessObject *self, int begin, int end)
+{
+ PyObject *tuple;
+ int count;
+
+ /* row/col access */
+ MatrixObject *matrix_user = self->matrix_user;
+ int matrix_access_len;
+ PyObject *(*Matrix_item_new)(MatrixObject *, int);
+
+ if (self->type == MAT_ACCESS_ROW) {
+ matrix_access_len = matrix_user->num_row;
+ Matrix_item_new = Matrix_item_row;
+ }
+ else { /* MAT_ACCESS_ROW */
+ matrix_access_len = matrix_user->num_col;
+ Matrix_item_new = Matrix_item_col;
+ }
+
+ CLAMP(begin, 0, matrix_access_len);
+ if (end < 0) end = (matrix_access_len + 1) + end;
+ CLAMP(end, 0, matrix_access_len);
+ begin = MIN2(begin, end);
+
+ tuple = PyTuple_New(end - begin);
+ for (count = begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, Matrix_item_new(matrix_user, count));
+ }
+
+ return tuple;
+}
+
+static PyObject *MatrixAccess_subscript(MatrixAccessObject *self, PyObject *item)
+{
+ MatrixObject *matrix_user = self->matrix_user;
+
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (self->type == MAT_ACCESS_ROW) {
+ if (i < 0)
+ i += matrix_user->num_row;
+ return Matrix_item_row(matrix_user, i);
+ }
+ else { /* MAT_ACCESS_ROW */
+ if (i < 0)
+ i += matrix_user->num_col;
+ return Matrix_item_col(matrix_user, i);
+ }
+ }
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)item, MatrixAccess_len(self), &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else if (step == 1) {
+ return MatrixAccess_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_IndexError,
+ "slice steps not supported with matrix accessors");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "matrix indices must be integers, not %.200s",
+ Py_TYPE(item)->tp_name);
+ return NULL;
+ }
+}
+
+static int MatrixAccess_ass_subscript(MatrixAccessObject *self, PyObject *item, PyObject *value)
+{
+ MatrixObject *matrix_user = self->matrix_user;
+
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+
+ if (self->type == MAT_ACCESS_ROW) {
+ if (i < 0)
+ i += matrix_user->num_row;
+ return Matrix_ass_item_row(matrix_user, i, value);
+ }
+ else { /* MAT_ACCESS_ROW */
+ if (i < 0)
+ i += matrix_user->num_col;
+ return Matrix_ass_item_col(matrix_user, i, value);
+ }
+
+ }
+ /* TODO, slice */
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "matrix indices must be integers, not %.200s",
+ Py_TYPE(item)->tp_name);
+ return -1;
+ }
+}
+
+static PyObject *MatrixAccess_iter(MatrixAccessObject *self)
+{
+ /* Try get values from a collection */
+ PyObject *ret;
+ PyObject *iter = NULL;
+ ret = MatrixAccess_slice(self, 0, MATRIX_MAX_DIM);
+
+ /* we know this is a tuple so no need to PyIter_Check
+ * otherwise it could be NULL (unlikely) if conversion failed */
+ if (ret) {
+ iter = PyObject_GetIter(ret);
+ Py_DECREF(ret);
+ }
+
+ return iter;
+}
+
+static PyMappingMethods MatrixAccess_AsMapping = {
+ (lenfunc)MatrixAccess_len,
+ (binaryfunc)MatrixAccess_subscript,
+ (objobjargproc) MatrixAccess_ass_subscript
+};
+
+PyTypeObject matrix_access_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "MatrixAccess", /*tp_name*/
+ sizeof(MatrixAccessObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)MatrixAccess_dealloc, /*tp_dealloc*/
+ NULL, /*tp_print*/
+ NULL, /*tp_getattr*/
+ NULL, /*tp_setattr*/
+ NULL, /*tp_compare*/
+ NULL, /*tp_repr*/
+ NULL, /*tp_as_number*/
+ NULL /*&MatrixAccess_SeqMethods*/ /* TODO */, /*tp_as_sequence*/
+ &MatrixAccess_AsMapping, /*tp_as_mapping*/
+ NULL, /*tp_hash*/
+ NULL, /*tp_call*/
+ NULL, /*tp_str*/
+ NULL, /*tp_getattro*/
+ NULL, /*tp_setattro*/
+ NULL, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ NULL, /*tp_doc*/
+ (traverseproc)MatrixAccess_traverse, //tp_traverse
+ (inquiry)MatrixAccess_clear, //tp_clear
+ NULL /* (richcmpfunc)MatrixAccess_richcmpr */ /* TODO*/, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ (getiterfunc)MatrixAccess_iter, /* getiterfunc tp_iter; */
+};
+
+static PyObject *MatrixAccess_CreatePyObject(MatrixObject *matrix, const eMatrixAccess_t type)
+{
+ MatrixAccessObject *matrix_access = (MatrixAccessObject *)PyObject_GC_New(MatrixObject, &matrix_access_Type);
+
+ matrix_access->matrix_user = matrix;
+ Py_INCREF(matrix);
+
+ matrix_access->type = type;
+
+ return (PyObject *)matrix_access;
+}
+
+/* end special access
+ * -------------------------------------------------------------------------- */
diff --git a/source/blender/python/mathutils/mathutils_Matrix.h b/source/blender/python/mathutils/mathutils_Matrix.h
index 6dfcbb1faf9..2ecbc55da35 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.h
+++ b/source/blender/python/mathutils/mathutils_Matrix.h
@@ -35,29 +35,51 @@
#define MATHUTILS_MATRIX_H
extern PyTypeObject matrix_Type;
+extern PyTypeObject matrix_access_Type;
#define MatrixObject_Check(_v) PyObject_TypeCheck((_v), &matrix_Type)
#define MATRIX_MAX_DIM 4
+/* matrix[row][col] == MATRIX_ITEM_INDEX(matrix, row, col) */
+
+#ifdef DEBUG
+# define MATRIX_ITEM_ASSERT(_mat, _row, _col) (BLI_assert(_row < (_mat)->num_row && _col < (_mat)->num_col))
+#else
+# define MATRIX_ITEM_ASSERT(_mat, _row, _col) (void)0
+#endif
+
+#define MATRIX_ITEM_INDEX(_mat, _row, _col) (MATRIX_ITEM_ASSERT(_mat, _row, _col),(((_mat)->num_row * (_col)) + (_row)))
+#define MATRIX_ITEM_PTR( _mat, _row, _col) ((_mat)->matrix + MATRIX_ITEM_INDEX(_mat, _row, _col))
+#define MATRIX_ITEM( _mat, _row, _col) ((_mat)->matrix [MATRIX_ITEM_INDEX(_mat, _row, _col)])
+
+#define MATRIX_COL_INDEX(_mat, _col) (MATRIX_ITEM_INDEX(_mat, 0, _col))
+#define MATRIX_COL_PTR( _mat, _col) ((_mat)->matrix + MATRIX_COL_INDEX(_mat, _col))
+
typedef struct {
- BASE_MATH_MEMBERS(contigPtr);
- float *matrix[MATRIX_MAX_DIM]; /* ptr to the contigPtr (accessor) */
- unsigned short row_size;
- unsigned short col_size;
+ BASE_MATH_MEMBERS(matrix);
+ unsigned short num_col;
+ unsigned short num_row;
} MatrixObject;
-/*struct data contains a pointer to the actual data that the
-object uses. It can use either PyMem allocated data (which will
-be stored in py_data) or be a wrapper for data allocated through
-blender (stored in blend_data). This is an either/or struct not both*/
+/* struct data contains a pointer to the actual data that the
+ * object uses. It can use either PyMem allocated data (which will
+ * be stored in py_data) or be a wrapper for data allocated through
+ * blender (stored in blend_data). This is an either/or struct not both */
-/*prototypes*/
+/* prototypes */
PyObject *Matrix_CreatePyObject(float *mat,
- const unsigned short row_size, const unsigned short col_size,
+ const unsigned short num_col, const unsigned short num_row,
int type, PyTypeObject *base_type);
-PyObject *Matrix_CreatePyObject_cb(PyObject *user, int row_size, int col_size, int cb_type, int cb_subtype);
+PyObject *Matrix_CreatePyObject_cb(PyObject *user,
+ const unsigned short num_col, const unsigned short num_row,
+ int cb_type, int cb_subtype);
+
+extern int mathutils_matrix_row_cb_index; /* default */
+extern int mathutils_matrix_col_cb_index;
+extern int mathutils_matrix_translation_cb_index;
-extern int mathutils_matrix_vector_cb_index;
-extern struct Mathutils_Callback mathutils_matrix_vector_cb;
+extern struct Mathutils_Callback mathutils_matrix_row_cb; /* default */
+extern struct Mathutils_Callback mathutils_matrix_col_cb;
+extern struct Mathutils_Callback mathutils_matrix_translation_cb;
void matrix_as_3x3(float mat[3][3], MatrixObject *self);
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index cf817003a98..20e951800c2 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -35,6 +35,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#define QUAT_SIZE 4
@@ -50,15 +51,15 @@ static PyObject *Quaternion_to_tuple_ext(QuaternionObject *self, int ndigits)
PyObject *ret;
int i;
- ret= PyTuple_New(QUAT_SIZE);
+ ret = PyTuple_New(QUAT_SIZE);
if (ndigits >= 0) {
- for (i= 0; i < QUAT_SIZE; i++) {
+ for (i = 0; i < QUAT_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->quat[i], ndigits)));
}
}
else {
- for (i= 0; i < QUAT_SIZE; i++) {
+ for (i = 0; i < QUAT_SIZE; i++) {
PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->quat[i]));
}
}
@@ -85,8 +86,8 @@ static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
{
float tquat[4];
float eul[3];
- const char *order_str= NULL;
- short order= EULER_ORDER_XYZ;
+ const char *order_str = NULL;
+ short order = EULER_ORDER_XYZ;
EulerObject *eul_compat = NULL;
if (!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
@@ -96,7 +97,7 @@ static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
return NULL;
if (order_str) {
- order= euler_order_from_string(order_str, "Matrix.to_euler()");
+ order = euler_order_from_string(order_str, "Matrix.to_euler()");
if (order == -1)
return NULL;
@@ -168,7 +169,7 @@ static PyObject *Quaternion_to_axis_angle(QuaternionObject *self)
quat__axis_angle_sanitize(axis, &angle);
- ret= PyTuple_New(2);
+ ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(axis, 3, Py_NEW, NULL));
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(angle));
return ret;
@@ -193,8 +194,10 @@ static PyObject *Quaternion_cross(QuaternionObject *self, PyObject *value)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "Quaternion.cross(other), invalid 'other' arg") == -1)
+ if (mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value,
+ "Quaternion.cross(other), invalid 'other' arg") == -1) {
return NULL;
+ }
mul_qt_qtqt(quat, self->quat, tquat);
return Quaternion_CreatePyObject(quat, Py_NEW, Py_TYPE(self));
@@ -319,7 +322,7 @@ static PyObject *Quaternion_rotate(QuaternionObject *self, PyObject *value)
if (mathutils_any_to_rotmat(other_rmat, value, "Quaternion.rotate(value)") == -1)
return NULL;
- length= normalize_qt_qt(tquat, self->quat);
+ length = normalize_qt_qt(tquat, self->quat);
quat_to_mat3(self_rmat, tquat);
mul_m3_m3m3(rmat, other_rmat, self_rmat);
@@ -485,27 +488,42 @@ static PyObject *Quaternion_repr(QuaternionObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- tuple= Quaternion_to_tuple_ext(self, -1);
+ tuple = Quaternion_to_tuple_ext(self, -1);
- ret= PyUnicode_FromFormat("Quaternion(%R)", tuple);
+ ret = PyUnicode_FromFormat("Quaternion(%R)", tuple);
Py_DECREF(tuple);
return ret;
}
-static PyObject* Quaternion_richcmpr(PyObject *a, PyObject *b, int op)
+static PyObject *Quaternion_str(QuaternionObject *self)
+{
+ DynStr *ds;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ ds = BLI_dynstr_new();
+
+ BLI_dynstr_appendf(ds, "<Quaternion (w=%.4f, x=%.4f, y=%.4f, z=%.4f)>",
+ self->quat[0], self->quat[1], self->quat[2], self->quat[3]);
+
+ return mathutils_dynstr_to_py(ds); /* frees ds */
+}
+
+static PyObject *Quaternion_richcmpr(PyObject *a, PyObject *b, int op)
{
PyObject *res;
- int ok= -1; /* zero is true */
+ int ok = -1; /* zero is true */
if (QuaternionObject_Check(a) && QuaternionObject_Check(b)) {
- QuaternionObject *quatA= (QuaternionObject *)a;
- QuaternionObject *quatB= (QuaternionObject *)b;
+ QuaternionObject *quatA = (QuaternionObject *)a;
+ QuaternionObject *quatB = (QuaternionObject *)b;
if (BaseMath_ReadCallback(quatA) == -1 || BaseMath_ReadCallback(quatB) == -1)
return NULL;
- ok= (EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1)) ? 0 : -1;
+ ok = (EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1)) ? 0 : -1;
}
switch (op) {
@@ -540,7 +558,7 @@ static int Quaternion_len(QuaternionObject *UNUSED(self))
//sequence accessor (get)
static PyObject *Quaternion_item(QuaternionObject *self, int i)
{
- if (i<0) i= QUAT_SIZE-i;
+ if (i < 0) i = QUAT_SIZE-i;
if (i < 0 || i >= QUAT_SIZE) {
PyErr_SetString(PyExc_IndexError,
@@ -559,15 +577,15 @@ static PyObject *Quaternion_item(QuaternionObject *self, int i)
//sequence accessor (set)
static int Quaternion_ass_item(QuaternionObject *self, int i, PyObject *ob)
{
- float scalar= (float)PyFloat_AsDouble(ob);
- if (scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ float scalar = (float)PyFloat_AsDouble(ob);
+ if (scalar == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError,
"quaternion[index] = x: "
"index argument not a number");
return -1;
}
- if (i<0) i= QUAT_SIZE-i;
+ if (i < 0) i = QUAT_SIZE-i;
if (i < 0 || i >= QUAT_SIZE) {
PyErr_SetString(PyExc_IndexError,
@@ -593,12 +611,12 @@ static PyObject *Quaternion_slice(QuaternionObject *self, int begin, int end)
return NULL;
CLAMP(begin, 0, QUAT_SIZE);
- if (end<0) end= (QUAT_SIZE + 1) + end;
+ if (end < 0) end = (QUAT_SIZE + 1) + end;
CLAMP(end, 0, QUAT_SIZE);
- begin= MIN2(begin, end);
+ begin = MIN2(begin, end);
- tuple= PyTuple_New(end - begin);
- for (count= begin; count < end; count++) {
+ tuple = PyTuple_New(end - begin);
+ for (count = begin; count < end; count++) {
PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->quat[count]));
}
@@ -615,11 +633,11 @@ static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyOb
return -1;
CLAMP(begin, 0, QUAT_SIZE);
- if (end<0) end= (QUAT_SIZE + 1) + end;
+ if (end < 0) end = (QUAT_SIZE + 1) + end;
CLAMP(end, 0, QUAT_SIZE);
begin = MIN2(begin, end);
- if ((size=mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1)
+ if ((size = mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1)
return -1;
if (size != (end - begin)) {
@@ -630,7 +648,7 @@ static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyOb
}
/* parsed well - now set in vector */
- for (i= 0; i < size; i++)
+ for (i = 0; i < size; i++)
self->quat[begin + i] = quat[i];
(void)BaseMath_WriteCallback(self);
@@ -793,7 +811,7 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
}
/* the only case this can happen (for a supported type is "FLOAT*QUAT") */
else if (quat2) { /* FLOAT*QUAT */
- if (((scalar= PyFloat_AsDouble(q1)) == -1.0f && PyErr_Occurred())==0) {
+ if (((scalar = PyFloat_AsDouble(q1)) == -1.0f && PyErr_Occurred()) == 0) {
return quat_mul_float(quat2, scalar);
}
}
@@ -820,7 +838,7 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
return Vector_CreatePyObject(tvec, 3, Py_NEW, Py_TYPE(vec2));
}
/* QUAT * FLOAT */
- else if ((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
+ else if ((((scalar = PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred()) == 0)) {
return quat_mul_float(quat1, scalar);
}
}
@@ -906,17 +924,23 @@ static PyNumberMethods Quaternion_NumMethods = {
NULL, /* nb_index */
};
-static PyObject *Quaternion_getAxis(QuaternionObject *self, void *type)
+PyDoc_STRVAR(Quaternion_axis_doc,
+"Quaternion axis value.\n\n:type: float"
+);
+static PyObject *Quaternion_axis_get(QuaternionObject *self, void *type)
{
return Quaternion_item(self, GET_INT_FROM_POINTER(type));
}
-static int Quaternion_setAxis(QuaternionObject *self, PyObject *value, void *type)
+static int Quaternion_axis_set(QuaternionObject *self, PyObject *value, void *type)
{
return Quaternion_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
-static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Quaternion_magnitude_doc,
+"Size of the quaternion (readonly).\n\n:type: float"
+);
+static PyObject *Quaternion_magnitude_get(QuaternionObject *self, void *UNUSED(closure))
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -924,7 +948,10 @@ static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(cl
return PyFloat_FromDouble(sqrt(dot_qtqt(self->quat, self->quat)));
}
-static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Quaternion_angle_doc,
+"Angle of the quaternion.\n\n:type: float"
+);
+static PyObject *Quaternion_angle_get(QuaternionObject *self, void *UNUSED(closure))
{
float tquat[4];
float angle;
@@ -934,14 +961,14 @@ static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closur
normalize_qt_qt(tquat, self->quat);
- angle= 2.0f * saacos(tquat[0]);
+ angle = 2.0f * saacos(tquat[0]);
quat__axis_angle_sanitize(NULL, &angle);
return PyFloat_FromDouble(angle);
}
-static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
+static int Quaternion_angle_set(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
float tquat[4];
float len;
@@ -952,18 +979,18 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
if (BaseMath_ReadCallback(self) == -1)
return -1;
- len= normalize_qt_qt(tquat, self->quat);
+ len = normalize_qt_qt(tquat, self->quat);
quat_to_axis_angle(axis, &angle_dummy, tquat);
- angle= PyFloat_AsDouble(value);
+ angle = PyFloat_AsDouble(value);
- if (angle==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if (angle == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError,
"Quaternion.angle = value: float expected");
return -1;
}
- angle= angle_wrap_rad(angle);
+ angle = angle_wrap_rad(angle);
quat__axis_angle_sanitize(axis, &angle);
@@ -976,7 +1003,10 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
return 0;
}
-static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Quaternion_axis_vector_doc,
+"Quaternion axis as a vector.\n\n:type: :class:`Vector`"
+);
+static PyObject *Quaternion_axis_vector_get(QuaternionObject *self, void *UNUSED(closure))
{
float tquat[4];
@@ -994,7 +1024,7 @@ static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(clos
return Vector_CreatePyObject(axis, 3, Py_NEW, NULL);
}
-static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
+static int Quaternion_axis_vector_set(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
float tquat[4];
float len;
@@ -1005,7 +1035,7 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
if (BaseMath_ReadCallback(self) == -1)
return -1;
- len= normalize_qt_qt(tquat, self->quat);
+ len = normalize_qt_qt(tquat, self->quat);
quat_to_axis_angle(axis, &angle, tquat); /* axis value is unused */
if (mathutils_array_parse(axis, 3, 3, value, "quat.axis = other") == -1)
@@ -1025,9 +1055,9 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
//----------------------------------mathutils.Quaternion() --------------
static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyObject *seq= NULL;
+ PyObject *seq = NULL;
double angle = 0.0f;
- float quat[QUAT_SIZE]= {0.0f, 0.0f, 0.0f, 0.0f};
+ float quat[QUAT_SIZE] = {0.0f, 0.0f, 0.0f, 0.0f};
if (kwds && PyDict_Size(kwds)) {
PyErr_SetString(PyExc_TypeError,
@@ -1039,7 +1069,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
if (!PyArg_ParseTuple(args, "|Od:mathutils.Quaternion", &seq, &angle))
return NULL;
- switch(PyTuple_GET_SIZE(args)) {
+ switch (PyTuple_GET_SIZE(args)) {
case 0:
break;
case 1:
@@ -1049,7 +1079,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
case 2:
if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1)
return NULL;
- angle= angle_wrap_rad(angle); /* clamp because of precision issues */
+ angle = angle_wrap_rad(angle); /* clamp because of precision issues */
axis_angle_to_quat(quat, quat, angle);
break;
/* PyArg_ParseTuple assures no more then 2 */
@@ -1059,8 +1089,8 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self)
{
- PyObject *ret= Quaternion_copy(self);
- PyObject *ret_dummy= quat_func(ret);
+ PyObject *ret = Quaternion_copy(self);
+ PyObject *ret_dummy = quat_func(ret);
if (ret_dummy) {
Py_DECREF(ret_dummy);
return ret;
@@ -1075,25 +1105,25 @@ static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObjec
static void quat__axis_angle_sanitize(float axis[3], float *angle)
{
if (axis) {
- if ( !finite(axis[0]) ||
- !finite(axis[1]) ||
- !finite(axis[2]))
+ if ( !finite(axis[0]) ||
+ !finite(axis[1]) ||
+ !finite(axis[2]))
{
- axis[0]= 1.0f;
- axis[1]= 0.0f;
- axis[2]= 0.0f;
+ axis[0] = 1.0f;
+ axis[1] = 0.0f;
+ axis[2] = 0.0f;
}
- else if ( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
- ) {
+ else if ( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[2], 0.0f, 10))
+ {
axis[0] = 1.0f;
}
}
if (angle) {
if (!finite(*angle)) {
- *angle= 0.0f;
+ *angle = 0.0f;
}
}
}
@@ -1135,15 +1165,15 @@ static struct PyMethodDef Quaternion_methods[] = {
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Quaternion_getseters[] = {
- {(char *)"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion W value.\n\n:type: float", (void *)0},
- {(char *)"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion X axis.\n\n:type: float", (void *)1},
- {(char *)"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Y axis.\n\n:type: float", (void *)2},
- {(char *)"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Z axis.\n\n:type: float", (void *)3},
- {(char *)"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, (char *)"Size of the quaternion (readonly).\n\n:type: float", NULL},
- {(char *)"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, (char *)"angle of the quaternion.\n\n:type: float", NULL},
- {(char *)"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, (char *)"quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
- {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
- {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+ {(char *)"w", (getter)Quaternion_axis_get, (setter)Quaternion_axis_set, Quaternion_axis_doc, (void *)0},
+ {(char *)"x", (getter)Quaternion_axis_get, (setter)Quaternion_axis_set, Quaternion_axis_doc, (void *)1},
+ {(char *)"y", (getter)Quaternion_axis_get, (setter)Quaternion_axis_set, Quaternion_axis_doc, (void *)2},
+ {(char *)"z", (getter)Quaternion_axis_get, (setter)Quaternion_axis_set, Quaternion_axis_doc, (void *)3},
+ {(char *)"magnitude", (getter)Quaternion_magnitude_get, (setter)NULL, Quaternion_magnitude_doc, NULL},
+ {(char *)"angle", (getter)Quaternion_angle_get, (setter)Quaternion_angle_set, Quaternion_angle_doc, NULL},
+ {(char *)"axis",(getter)Quaternion_axis_vector_get, (setter)Quaternion_axis_vector_set, Quaternion_axis_vector_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -1167,7 +1197,7 @@ PyTypeObject quaternion_Type = {
&Quaternion_AsMapping, //tp_as_mapping
NULL, //tp_hash
NULL, //tp_call
- NULL, //tp_str
+ (reprfunc) Quaternion_str, //tp_str
NULL, //tp_getattro
NULL, //tp_setattro
NULL, //tp_as_buffer
@@ -1209,13 +1239,13 @@ PyObject *Quaternion_CreatePyObject(float *quat, int type, PyTypeObject *base_ty
{
QuaternionObject *self;
- self= base_type ? (QuaternionObject *)base_type->tp_alloc(base_type, 0) :
- (QuaternionObject *)PyObject_GC_New(QuaternionObject, &quaternion_Type);
+ self = base_type ? (QuaternionObject *)base_type->tp_alloc(base_type, 0) :
+ (QuaternionObject *)PyObject_GC_New(QuaternionObject, &quaternion_Type);
if (self) {
/* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ self->cb_user = NULL;
+ self->cb_type = self->cb_subtype = 0;
if (type == Py_WRAP) {
self->quat = quat;
@@ -1240,12 +1270,12 @@ PyObject *Quaternion_CreatePyObject(float *quat, int type, PyTypeObject *base_ty
PyObject *Quaternion_CreatePyObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
{
- QuaternionObject *self= (QuaternionObject *)Quaternion_CreatePyObject(NULL, Py_NEW, NULL);
+ QuaternionObject *self = (QuaternionObject *)Quaternion_CreatePyObject(NULL, Py_NEW, NULL);
if (self) {
Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
+ self->cb_user = cb_user;
+ self->cb_type = (unsigned char)cb_type;
+ self->cb_subtype = (unsigned char)cb_subtype;
PyObject_GC_Track(self);
}
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index 9d1a22adb12..e137c7846bb 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -35,6 +35,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#define MAX_DIMENSIONS 4
@@ -54,15 +55,29 @@ static int row_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject *v
*/
static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
{
- float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
- int size= 3; /* default to a 3D vector */
+ float *vec = NULL;
+ int size = 3; /* default to a 3D vector */
- switch(PyTuple_GET_SIZE(args)) {
+ switch (PyTuple_GET_SIZE(args)) {
case 0:
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ fill_vn_fl(vec, size, 0.0f);
break;
case 1:
- if ((size=mathutils_array_parse(vec, 2, 4, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1)
+ if ((size = mathutils_array_parse_alloc(&vec, 2, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1) {
+ if (vec) {
+ PyMem_Free(vec);
+ }
return NULL;
+ }
break;
default:
PyErr_SetString(PyExc_TypeError,
@@ -75,8 +90,8 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED
static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *self)
{
- PyObject *ret= Vector_copy(self);
- PyObject *ret_dummy= vec_func(ret);
+ PyObject *ret = Vector_copy(self);
+ PyObject *ret_dummy = vec_func(ret);
if (ret_dummy) {
Py_DECREF(ret_dummy);
return (PyObject *)ret;
@@ -87,6 +102,217 @@ static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *sel
}
}
+/*-----------------------CLASS-METHODS----------------------------*/
+PyDoc_STRVAR(C_Vector_Fill_doc,
+".. classmethod:: Fill(size, fill=0.0)\n"
+"\n"
+" Create a vector of length size with all values set to fill.\n"
+"\n"
+" :arg size: The length of the vector to be created.\n"
+" :type size: int\n"
+" :arg fill: The value used to fill the vector.\n"
+" :type fill: float\n"
+);
+static PyObject *C_Vector_Fill(PyObject *cls, PyObject *args)
+{
+ float *vec;
+ int size;
+ float fill = 0.0f;
+
+ if (!PyArg_ParseTuple(args, "i|f:Vector.Fill", &size, &fill)) {
+ return NULL;
+ }
+
+ if (size < 2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Vector(): invalid size");
+ return NULL;
+ }
+
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.Fill(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ fill_vn_fl(vec, size, fill);
+
+ return Vector_CreatePyObject_alloc(vec, size, (PyTypeObject *)cls);
+}
+
+PyDoc_STRVAR(C_Vector_Range_doc,
+".. classmethod:: Range(start=0, stop, step=1)\n"
+"\n"
+" Create a filled with a range of values.\n"
+"\n"
+" :arg start: The start of the range used to fill the vector.\n"
+" :type start: int\n"
+" :arg stop: The end of the range used to fill the vector.\n"
+" :type stop: int\n"
+" :arg step: The step between successive values in the vector.\n"
+" :type step: int\n"
+);
+static PyObject *C_Vector_Range(PyObject *cls, PyObject *args)
+{
+ float *vec;
+ int stop, size;
+ int start = 0;
+ int step = 1;
+
+ if (!PyArg_ParseTuple(args, "i|ii:Vector.Range", &start, &stop, &step)) {
+ return NULL;
+ }
+
+ switch (PyTuple_GET_SIZE(args)) {
+ case 1:
+ size = start;
+ start = 0;
+ break;
+ case 2:
+ if (start >= stop) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Start value is larger"
+ "than the stop value");
+ return NULL;
+ }
+
+ size = stop - start;
+ break;
+ default:
+ if (start >= stop) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Start value is larger"
+ "than the stop value");
+ return NULL;
+ }
+ size = (stop - start)/step;
+ if (size%step)
+ size++;
+ break;
+ }
+
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.Range(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ range_vn_fl(vec, size, (float)start, (float)step);
+
+ return Vector_CreatePyObject_alloc(vec, size, (PyTypeObject *)cls);
+}
+
+PyDoc_STRVAR(C_Vector_Linspace_doc,
+".. classmethod:: Linspace(start, stop, size)\n"
+"\n"
+" Create a vector of the specified size which is filled with linearly spaced values between start and stop values.\n"
+"\n"
+" :arg start: The start of the range used to fill the vector.\n"
+" :type start: int\n"
+" :arg stop: The end of the range used to fill the vector.\n"
+" :type stop: int\n"
+" :arg size: The size of the vector to be created.\n"
+" :type size: int\n"
+);
+static PyObject *C_Vector_Linspace(PyObject *cls, PyObject *args)
+{
+ float *vec;
+ int size;
+ float start, end, step;
+
+ if (!PyArg_ParseTuple(args, "ffi:Vector.Linspace", &start, &end, &size)) {
+ return NULL;
+ }
+
+ if (size < 2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Vector.Linspace(): invalid size");
+ return NULL;
+ }
+
+ step = (end - start)/(float)(size-1);
+
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.Linspace(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ range_vn_fl(vec, size, start, step);
+
+ return Vector_CreatePyObject_alloc(vec, size, (PyTypeObject *)cls);
+}
+
+PyDoc_STRVAR(C_Vector_Repeat_doc,
+".. classmethod:: Repeat(vector, size)\n"
+"\n"
+" Create a vector by repeating the values in vector until the required size is reached.\n"
+"\n"
+" :arg tuple: The vector to draw values from.\n"
+" :type tuple: :class:`mathutils.Vector`\n"
+" :arg size: The size of the vector to be created.\n"
+" :type size: int\n"
+);
+static PyObject *C_Vector_Repeat(PyObject *cls, PyObject *args)
+{
+ float *vec;
+ float *iter_vec = NULL;
+ int i, size, value_size;
+ PyObject *value;
+
+ if (!PyArg_ParseTuple(args, "Oi:Vector.Repeat", &value, &size)) {
+ return NULL;
+ }
+
+ if (size < 2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Vector.Repeat(): invalid size");
+ return NULL;
+ }
+
+ if ((value_size = mathutils_array_parse_alloc(&iter_vec, 2, value,
+ "Vector.Repeat(vector, size), invalid 'vector' arg")) == -1)
+ {
+ PyMem_Free(iter_vec);
+ return NULL;
+ }
+
+ if (iter_vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.Repeat(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.Repeat(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ i = 0;
+ while (i < size) {
+ vec[i] = iter_vec[i % value_size];
+ i++;
+ }
+
+ PyMem_Free(iter_vec);
+
+ return Vector_CreatePyObject_alloc(vec, size, (PyTypeObject *)cls);
+}
+
/*-----------------------------METHODS---------------------------- */
PyDoc_STRVAR(Vector_zero_doc,
".. method:: zero()\n"
@@ -137,6 +363,101 @@ static PyObject *Vector_normalized(VectorObject *self)
return vec__apply_to_copy((PyNoArgsFunction)Vector_normalize, self);
}
+PyDoc_STRVAR(Vector_resize_doc,
+".. method:: resize(size=3)\n"
+"\n"
+" Resize the vector to have size number of elements.\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Vector`\n"
+);
+static PyObject *Vector_resize(VectorObject *self, PyObject *value)
+{
+ int size;
+
+ if (self->wrapped == Py_WRAP) {
+ PyErr_SetString(PyExc_TypeError,
+ "Vector.resize(): "
+ "cannot resize wrapped data - only python vectors");
+ return NULL;
+ }
+ if (self->cb_user) {
+ PyErr_SetString(PyExc_TypeError,
+ "Vector.resize(): "
+ "cannot resize a vector that has an owner");
+ return NULL;
+ }
+
+ if ((size = PyLong_AsLong(value)) == -1) {
+ PyErr_SetString(PyExc_TypeError,
+ "Vector.resize(size): "
+ "expected size argument to be an integer");
+ return NULL;
+ }
+
+ if (size < 2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Vector.resize(): invalid size");
+ return NULL;
+ }
+
+ self->vec = PyMem_Realloc(self->vec, (size * sizeof(float)));
+ if (self->vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.resize(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ /* If the vector has increased in length, set all new elements to 0.0f */
+ if (size > self->size) {
+ fill_vn_fl(self->vec + self->size, size - self->size, 0.0f);
+ }
+
+ self->size = size;
+ Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(Vector_resized_doc,
+".. method:: resized(size=3)\n"
+"\n"
+" Return a resized copy of the vector with size number of elements.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+);
+static PyObject *Vector_resized(VectorObject *self, PyObject *value)
+{
+ int size;
+ float *vec;
+
+ /*if (!PyArg_ParseTuple(args, "i:resize", &size))
+ return NULL;*/
+ if ((size = PyLong_AsLong(value)) == -1) {
+ return NULL;
+ }
+
+ if (size < 2) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Vector.resized(): invalid size");
+ return NULL;
+ }
+
+ vec = PyMem_Malloc(size * sizeof(float));
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.resized(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
+ fill_vn_fl(vec, size, 0.0f);
+ memcpy(vec, self->vec, self->size * sizeof(float));
+
+ return Vector_CreatePyObject_alloc(vec, size, NULL);
+}
+
PyDoc_STRVAR(Vector_resize_2d_doc,
".. method:: resize_2d()\n"
"\n"
@@ -147,7 +468,7 @@ PyDoc_STRVAR(Vector_resize_2d_doc,
);
static PyObject *Vector_resize_2d(VectorObject *self)
{
- if (self->wrapped==Py_WRAP) {
+ if (self->wrapped == Py_WRAP) {
PyErr_SetString(PyExc_TypeError,
"Vector.resize_2d(): "
"cannot resize wrapped data - only python vectors");
@@ -182,7 +503,7 @@ PyDoc_STRVAR(Vector_resize_3d_doc,
);
static PyObject *Vector_resize_3d(VectorObject *self)
{
- if (self->wrapped==Py_WRAP) {
+ if (self->wrapped == Py_WRAP) {
PyErr_SetString(PyExc_TypeError,
"Vector.resize_3d(): "
"cannot resize wrapped data - only python vectors");
@@ -220,7 +541,7 @@ PyDoc_STRVAR(Vector_resize_4d_doc,
);
static PyObject *Vector_resize_4d(VectorObject *self)
{
- if (self->wrapped==Py_WRAP) {
+ if (self->wrapped == Py_WRAP) {
PyErr_SetString(PyExc_TypeError,
"Vector.resize_4d(): "
"cannot resize wrapped data - only python vectors");
@@ -276,7 +597,7 @@ PyDoc_STRVAR(Vector_to_3d_doc,
);
static PyObject *Vector_to_3d(VectorObject *self)
{
- float tvec[3]= {0.0f};
+ float tvec[3] = {0.0f};
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -294,7 +615,7 @@ PyDoc_STRVAR(Vector_to_4d_doc,
);
static PyObject *Vector_to_4d(VectorObject *self)
{
- float tvec[4]= {0.0f, 0.0f, 0.0f, 1.0f};
+ float tvec[4] = {0.0f, 0.0f, 0.0f, 1.0f};
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -319,7 +640,7 @@ static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits)
PyObject *ret;
int i;
- ret= PyTuple_New(self->size);
+ ret = PyTuple_New(self->size);
if (ndigits >= 0) {
for (i = 0; i < self->size; i++) {
@@ -337,7 +658,7 @@ static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits)
static PyObject *Vector_to_tuple(VectorObject *self, PyObject *args)
{
- int ndigits= 0;
+ int ndigits = 0;
if (!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits))
return NULL;
@@ -349,8 +670,8 @@ static PyObject *Vector_to_tuple(VectorObject *self, PyObject *args)
return NULL;
}
- if (PyTuple_GET_SIZE(args)==0)
- ndigits= -1;
+ if (PyTuple_GET_SIZE(args) == 0)
+ ndigits = -1;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -390,11 +711,11 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args)
return NULL;
if (strack) {
- const char *axis_err_msg= "only X, -X, Y, -Y, Z or -Z for track axis";
+ const char *axis_err_msg = "only X, -X, Y, -Y, Z or -Z for track axis";
if (strlen(strack) == 2) {
if (strack[0] == '-') {
- switch(strack[1]) {
+ switch (strack[1]) {
case 'X':
track = 3;
break;
@@ -415,7 +736,7 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args)
}
}
else if (strlen(strack) == 1) {
- switch(strack[0]) {
+ switch (strack[0]) {
case '-':
case 'X':
track = 0;
@@ -438,9 +759,9 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args)
}
if (sup) {
- const char *axis_err_msg= "only X, Y or Z for up axis";
+ const char *axis_err_msg = "only X, Y or Z for up axis";
if (strlen(sup) == 1) {
- switch(*sup) {
+ switch (*sup) {
case 'X':
up = 0;
break;
@@ -502,9 +823,15 @@ static PyObject *Vector_reflect(VectorObject *self, PyObject *value)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if ((value_size= mathutils_array_parse(tvec, 2, 4, value, "Vector.reflect(other), invalid 'other' arg")) == -1)
+ if ((value_size = mathutils_array_parse(tvec, 2, 4, value, "Vector.reflect(other), invalid 'other' arg")) == -1)
return NULL;
+ if (self->size < 2 || self->size > 4) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector must be 2D, 3D or 4D");
+ return NULL;
+ }
+
mirror[0] = tvec[0];
mirror[1] = tvec[1];
if (value_size > 2) mirror[2] = tvec[2];
@@ -544,7 +871,13 @@ static PyObject *Vector_cross(VectorObject *self, PyObject *value)
if (mathutils_array_parse(tvec, self->size, self->size, value, "Vector.cross(other), invalid 'other' arg") == -1)
return NULL;
- ret= (VectorObject *)Vector_CreatePyObject(NULL, 3, Py_NEW, Py_TYPE(self));
+ if (self->size != 3) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector must be 3D");
+ return NULL;
+ }
+
+ ret = (VectorObject *)Vector_CreatePyObject(NULL, 3, Py_NEW, Py_TYPE(self));
cross_v3_v3v3(ret->vec, self->vec, tvec);
return (PyObject *)ret;
}
@@ -561,15 +894,20 @@ PyDoc_STRVAR(Vector_dot_doc,
);
static PyObject *Vector_dot(VectorObject *self, PyObject *value)
{
- float tvec[MAX_DIMENSIONS];
+ float *tvec;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- if (mathutils_array_parse(tvec, self->size, self->size, value, "Vector.dot(other), invalid 'other' arg") == -1)
- return NULL;
+ if (mathutils_array_parse_alloc(&tvec, self->size, value, "Vector.dot(other), invalid 'other' arg") == -1) {
+ goto cleanup;
+ }
return PyFloat_FromDouble(dot_vn_vn(self->vec, tvec, self->size));
+
+cleanup:
+ PyMem_Free(tvec);
+ return NULL;
}
PyDoc_STRVAR(Vector_angle_doc,
@@ -589,12 +927,12 @@ PyDoc_STRVAR(Vector_angle_doc,
);
static PyObject *Vector_angle(VectorObject *self, PyObject *args)
{
- const int size= MIN2(self->size, 3); /* 4D angle makes no sense */
+ const int size = MIN2(self->size, 3); /* 4D angle makes no sense */
float tvec[MAX_DIMENSIONS];
PyObject *value;
- double dot= 0.0f, dot_self= 0.0f, dot_other= 0.0f;
+ double dot = 0.0f, dot_self = 0.0f, dot_other = 0.0f;
int x;
- PyObject *fallback= NULL;
+ PyObject *fallback = NULL;
if (!PyArg_ParseTuple(args, "O|O:angle", &value, &fallback))
return NULL;
@@ -607,6 +945,12 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args)
if (mathutils_array_parse(tvec, self->size, self->size, value, "Vector.angle(other), invalid 'other' arg") == -1)
return NULL;
+ if (self->size > 4) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector must be 2D, 3D or 4D");
+ return NULL;
+ }
+
for (x = 0; x < size; x++) {
dot_self += (double)self->vec[x] * (double)self->vec[x];
dot_other += (double)tvec[x] * (double)tvec[x];
@@ -647,7 +991,7 @@ static PyObject *Vector_rotation_difference(VectorObject *self, PyObject *value)
{
float quat[4], vec_a[3], vec_b[3];
- if (self->size < 3) {
+ if (self->size < 3 || self->size > 4) {
PyErr_SetString(PyExc_ValueError,
"vec.difference(value): "
"expects both vectors to be size 3 or 4");
@@ -680,7 +1024,7 @@ PyDoc_STRVAR(Vector_project_doc,
);
static PyObject *Vector_project(VectorObject *self, PyObject *value)
{
- const int size= self->size;
+ const int size = self->size;
float tvec[MAX_DIMENSIONS];
float vec[MAX_DIMENSIONS];
double dot = 0.0f, dot2 = 0.0f;
@@ -692,6 +1036,12 @@ static PyObject *Vector_project(VectorObject *self, PyObject *value)
if (mathutils_array_parse(tvec, size, size, value, "Vector.project(other), invalid 'other' arg") == -1)
return NULL;
+ if (self->size > 4) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector must be 2D, 3D or 4D");
+ return NULL;
+ }
+
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -722,27 +1072,44 @@ PyDoc_STRVAR(Vector_lerp_doc,
);
static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
{
- const int size= self->size;
- PyObject *value= NULL;
+ const int size = self->size;
+ PyObject *value = NULL;
float fac, ifac;
- float tvec[MAX_DIMENSIONS], vec[MAX_DIMENSIONS];
+ float *tvec, *vec;
int x;
if (!PyArg_ParseTuple(args, "Of:lerp", &value, &fac))
return NULL;
- if (mathutils_array_parse(tvec, size, size, value, "Vector.lerp(other), invalid 'other' arg") == -1)
- return NULL;
+ if (mathutils_array_parse_alloc(&tvec, size, value, "Vector.lerp(other), invalid 'other' arg") == -1) {
+ goto cleanup;
+ }
- if (BaseMath_ReadCallback(self) == -1)
+ if (BaseMath_ReadCallback(self) == -1) {
+ goto cleanup;
+ }
+
+ vec = PyMem_Malloc(size * sizeof(float));
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector.lerp(): "
+ "problem allocating pointer space");
return NULL;
+ }
- ifac= 1.0f - fac;
+ ifac = 1.0f - fac;
for (x = 0; x < size; x++) {
vec[x] = (ifac * self->vec[x]) + (fac * tvec[x]);
}
- return Vector_CreatePyObject(vec, size, Py_NEW, Py_TYPE(self));
+
+ PyMem_Free(tvec);
+
+ return Vector_CreatePyObject_alloc(vec, size, Py_TYPE(self));
+
+cleanup:
+ PyMem_Free(tvec);
+ return NULL;
}
PyDoc_STRVAR(Vector_rotate_doc,
@@ -763,7 +1130,7 @@ static PyObject *Vector_rotate(VectorObject *self, PyObject *value)
if (mathutils_any_to_rotmat(other_rmat, value, "Vector.rotate(value)") == -1)
return NULL;
- if (self->size < 3) {
+ if (self->size < 3 || self->size > 4) {
PyErr_SetString(PyExc_ValueError,
"Vector must be 3D or 4D");
return NULL;
@@ -801,12 +1168,35 @@ static PyObject *Vector_repr(VectorObject *self)
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- tuple= Vector_to_tuple_ext(self, -1);
- ret= PyUnicode_FromFormat("Vector(%R)", tuple);
+ tuple = Vector_to_tuple_ext(self, -1);
+ ret = PyUnicode_FromFormat("Vector(%R)", tuple);
Py_DECREF(tuple);
return ret;
}
+static PyObject *Vector_str(VectorObject *self)
+{
+ int i;
+
+ DynStr *ds;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ ds = BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, "<Vector (");
+
+ for (i = 0; i < self->size; i++) {
+ BLI_dynstr_appendf(ds, i ? ", %.4f" : "%.4f", self->vec[i]);
+ }
+
+ BLI_dynstr_append(ds, ")>");
+
+ return mathutils_dynstr_to_py(ds); /* frees ds */
+}
+
+
/* Sequence Protocol */
/* sequence length len(vector) */
static int Vector_len(VectorObject *self)
@@ -816,7 +1206,7 @@ static int Vector_len(VectorObject *self)
/* sequence accessor (get): vector[index] */
static PyObject *vector_item_internal(VectorObject *self, int i, const int is_attr)
{
- if (i<0) i= self->size-i;
+ if (i < 0) i = self->size-i;
if (i < 0 || i >= self->size) {
if (is_attr) {
@@ -845,14 +1235,14 @@ static PyObject *Vector_item(VectorObject *self, int i)
static int vector_ass_item_internal(VectorObject *self, int i, PyObject *value, const int is_attr)
{
float scalar;
- if ((scalar=PyFloat_AsDouble(value))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError,
"vector[index] = x: "
"index argument not a number");
return -1;
}
- if (i<0) i= self->size-i;
+ if (i < 0) i = self->size-i;
if (i < 0 || i >= self->size) {
if (is_attr) {
@@ -889,11 +1279,11 @@ static PyObject *Vector_slice(VectorObject *self, int begin, int end)
return NULL;
CLAMP(begin, 0, self->size);
- if (end<0) end= self->size+end+1;
+ if (end < 0) end = self->size + end + 1;
CLAMP(end, 0, self->size);
- begin= MIN2(begin, end);
+ begin = MIN2(begin, end);
- tuple= PyTuple_New(end - begin);
+ tuple = PyTuple_New(end - begin);
for (count = begin; count < end; count++) {
PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->vec[count]));
}
@@ -903,8 +1293,8 @@ static PyObject *Vector_slice(VectorObject *self, int begin, int end)
/* sequence slice (set): vector[a:b] = value */
static int Vector_ass_slice(VectorObject *self, int begin, int end, PyObject *seq)
{
- int y, size = 0;
- float vec[MAX_DIMENSIONS];
+ int size = 0;
+ float *vec = NULL;
if (BaseMath_ReadCallback(self) == -1)
return -1;
@@ -914,18 +1304,30 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end, PyObject *se
begin = MIN2(begin, end);
size = (end - begin);
- if (mathutils_array_parse(vec, size, size, seq, "vector[begin:end] = [...]") == -1)
+ if (mathutils_array_parse_alloc(&vec, size, seq, "vector[begin:end] = [...]") == -1) {
+ goto cleanup;
+ }
+
+ if (vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "vec[:] = seq: "
+ "problem allocating pointer space");
return -1;
+ }
/*parsed well - now set in vector*/
- for (y = 0; y < size; y++) {
- self->vec[begin + y] = vec[y];
- }
+ memcpy(self->vec + begin, vec, size * sizeof(float));
if (BaseMath_WriteCallback(self) == -1)
return -1;
+ PyMem_Free(vec);
+
return 0;
+
+cleanup:
+ PyMem_Free(vec);
+ return -1;
}
/* Numeric Protocols */
@@ -933,7 +1335,7 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end, PyObject *se
static PyObject *Vector_add(PyObject *v1, PyObject *v2)
{
VectorObject *vec1 = NULL, *vec2 = NULL;
- float vec[MAX_DIMENSIONS];
+ float *vec = NULL;
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
PyErr_Format(PyExc_AttributeError,
@@ -956,9 +1358,18 @@ static PyObject *Vector_add(PyObject *v1, PyObject *v2)
return NULL;
}
+ vec = PyMem_Malloc(vec1->size * sizeof(float));
+
+ if (vec == NULL) { /*allocation failure*/
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
add_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
- return Vector_CreatePyObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+ return Vector_CreatePyObject_alloc(vec, vec1->size, Py_TYPE(v1));
}
/* addition in-place: obj += obj */
@@ -997,7 +1408,7 @@ static PyObject *Vector_iadd(PyObject *v1, PyObject *v2)
static PyObject *Vector_sub(PyObject *v1, PyObject *v2)
{
VectorObject *vec1 = NULL, *vec2 = NULL;
- float vec[MAX_DIMENSIONS];
+ float *vec;
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
PyErr_Format(PyExc_AttributeError,
@@ -1019,15 +1430,24 @@ static PyObject *Vector_sub(PyObject *v1, PyObject *v2)
return NULL;
}
+ vec = PyMem_Malloc(vec1->size * sizeof(float));
+
+ if (vec == NULL) { /*allocation failure*/
+ PyErr_SetString(PyExc_MemoryError,
+ "Vector(): "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
sub_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
- return Vector_CreatePyObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+ return Vector_CreatePyObject_alloc(vec, vec1->size, Py_TYPE(v1));
}
/* subtraction in-place: obj -= obj */
static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
{
- VectorObject *vec1= NULL, *vec2= NULL;
+ VectorObject *vec1 = NULL, *vec2 = NULL;
if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
PyErr_Format(PyExc_AttributeError,
@@ -1068,14 +1488,13 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
* note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
* note: assume read callbacks have been done first.
*/
-int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+int column_vector_multiplication(float r_vec[MAX_DIMENSIONS], VectorObject *vec, MatrixObject *mat)
{
float vec_cpy[MAX_DIMENSIONS];
- double dot = 0.0f;
- int x, y, z = 0;
+ int row, col, z = 0;
- if (mat->row_size != vec->size) {
- if (mat->row_size == 4 && vec->size == 3) {
+ if (mat->num_col != vec->size) {
+ if (mat->num_col == 4 && vec->size == 3) {
vec_cpy[3] = 1.0f;
}
else {
@@ -1089,14 +1508,14 @@ int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec,
memcpy(vec_cpy, vec->vec, vec->size * sizeof(float));
- rvec[3] = 1.0f;
+ r_vec[3] = 1.0f;
- for (x = 0; x < mat->col_size; x++) {
- for (y = 0; y < mat->row_size; y++) {
- dot += (double)(mat->matrix[y][x] * vec_cpy[y]);
+ for (row = 0; row < mat->num_row; row++) {
+ double dot = 0.0f;
+ for (col = 0; col < mat->num_col; col++) {
+ dot += (double)(MATRIX_ITEM(mat, row, col) * vec_cpy[col]);
}
- rvec[z++] = (float)dot;
- dot = 0.0f;
+ r_vec[z++] = (float)dot;
}
return 0;
@@ -1104,23 +1523,32 @@ int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec,
static PyObject *vector_mul_float(VectorObject *vec, const float scalar)
{
- float tvec[MAX_DIMENSIONS];
+ float *tvec = PyMem_Malloc(vec->size * sizeof(float));
+
+ if (tvec == NULL) { /*allocation failure*/
+ PyErr_SetString(PyExc_MemoryError,
+ "vec * float: "
+ "problem allocating pointer space");
+ return NULL;
+ }
+
mul_vn_vn_fl(tvec, vec->vec, vec->size, scalar);
- return Vector_CreatePyObject(tvec, vec->size, Py_NEW, Py_TYPE(vec));
+ return Vector_CreatePyObject_alloc(tvec, vec->size, Py_TYPE(vec));
}
static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
{
VectorObject *vec1 = NULL, *vec2 = NULL;
float scalar;
+ int vec_size;
if VectorObject_Check(v1) {
- vec1= (VectorObject *)v1;
+ vec1 = (VectorObject *)v1;
if (BaseMath_ReadCallback(vec1) == -1)
return NULL;
}
if VectorObject_Check(v2) {
- vec2= (VectorObject *)v2;
+ vec2 = (VectorObject *)v2;
if (BaseMath_ReadCallback(vec2) == -1)
return NULL;
}
@@ -1149,7 +1577,14 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
return NULL;
}
- return Vector_CreatePyObject(tvec, vec1->size, Py_NEW, Py_TYPE(vec1));
+ if (((MatrixObject *)v2)->num_row == 4 && vec1->size == 3) {
+ vec_size = 3;
+ }
+ else {
+ vec_size = ((MatrixObject *)v2)->num_col;
+ }
+
+ return Vector_CreatePyObject(tvec, vec_size, Py_NEW, Py_TYPE(vec1));
}
else if (QuaternionObject_Check(v2)) {
/* VEC * QUAT */
@@ -1179,12 +1614,12 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
#endif
/* ------ to be removed ------*/
}
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC * FLOAT */
+ else if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* VEC * FLOAT */
return vector_mul_float(vec1, scalar);
}
}
else if (vec2) {
- if (((scalar= PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred())==0) { /* FLOAT * VEC */
+ if (((scalar = PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred()) == 0) { /* FLOAT * VEC */
return vector_mul_float(vec2, scalar);
}
}
@@ -1258,7 +1693,7 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
#endif
/* ------ to be removed ------*/
}
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */
+ else if (((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) == 0) { /* VEC *= FLOAT */
mul_vn_fl(vec->vec, vec->size, scalar);
}
else {
@@ -1277,8 +1712,7 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
/* divid: obj / obj */
static PyObject *Vector_div(PyObject *v1, PyObject *v2)
{
- int i;
- float vec[4], scalar;
+ float *vec = NULL, scalar;
VectorObject *vec1 = NULL;
if (!VectorObject_Check(v1)) { /* not a vector */
@@ -1287,57 +1721,63 @@ static PyObject *Vector_div(PyObject *v1, PyObject *v2)
"Vector must be divided by a float");
return NULL;
}
- vec1 = (VectorObject*)v1; /* vector */
+ vec1 = (VectorObject *)v1; /* vector */
if (BaseMath_ReadCallback(vec1) == -1)
return NULL;
- if ((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if ((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError,
"Vector division: "
"Vector must be divided by a float");
return NULL;
}
- if (scalar==0.0f) {
+ if (scalar == 0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError,
"Vector division: "
"divide by zero error");
return NULL;
}
- for (i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] / scalar;
+ vec = PyMem_Malloc(vec1->size * sizeof(float));
+
+ if (vec == NULL) { /*allocation failure*/
+ PyErr_SetString(PyExc_MemoryError,
+ "vec / value: "
+ "problem allocating pointer space");
+ return NULL;
}
- return Vector_CreatePyObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+
+ mul_vn_vn_fl(vec, vec1->vec, vec1->size, 1.0f / scalar);
+
+ return Vector_CreatePyObject_alloc(vec, vec1->size, Py_TYPE(v1));
}
/* divide in-place: obj /= obj */
static PyObject *Vector_idiv(PyObject *v1, PyObject *v2)
{
- int i;
float scalar;
VectorObject *vec1 = (VectorObject*)v1;
if (BaseMath_ReadCallback(vec1) == -1)
return NULL;
- if ((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if ((scalar = PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError,
"Vector division: "
"Vector must be divided by a float");
return NULL;
}
- if (scalar==0.0f) {
+ if (scalar == 0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError,
"Vector division: "
"divide by zero error");
return NULL;
}
- for (i = 0; i < vec1->size; i++) {
- vec1->vec[i] /= scalar;
- }
+
+ mul_vn_fl(vec1->vec, vec1->size, 1.0f / scalar);
(void)BaseMath_WriteCallback(vec1);
@@ -1349,35 +1789,30 @@ static PyObject *Vector_idiv(PyObject *v1, PyObject *v2)
returns the negative of this object*/
static PyObject *Vector_neg(VectorObject *self)
{
- float tvec[MAX_DIMENSIONS];
+ float *tvec;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
+ tvec = PyMem_Malloc(self->size * sizeof(float));
negate_vn_vn(tvec, self->vec, self->size);
- return Vector_CreatePyObject(tvec, self->size, Py_NEW, Py_TYPE(self));
+ return Vector_CreatePyObject_alloc(tvec, self->size, Py_TYPE(self));
}
/*------------------------vec_magnitude_nosqrt (internal) - for comparing only */
static double vec_magnitude_nosqrt(float *data, int size)
{
- double dot = 0.0f;
- int i;
-
- for (i=0; i<size; i++) {
- dot += (double)data[i];
- }
/*return (double)sqrt(dot);*/
/* warning, line above removed because we are not using the length,
rather the comparing the sizes and for this we do not need the sqrt
for the actual length, the dot must be sqrt'd */
- return dot;
+ return dot_vn_vn(data, data, size);
}
/*------------------------tp_richcmpr
returns -1 execption, 0 false, 1 true */
-static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject *Vector_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
{
VectorObject *vecA = NULL, *vecB = NULL;
int result = 0;
@@ -1474,7 +1909,7 @@ static PySequenceMethods Vector_SeqMethods = {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
+static PyObject *Vector_subscript(VectorObject *self, PyObject *item)
{
if (PyIndex_Check(item)) {
Py_ssize_t i;
@@ -1511,7 +1946,7 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
}
}
-static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* value)
+static int Vector_ass_subscript(VectorObject *self, PyObject *item, PyObject *value)
{
if (PyIndex_Check(item)) {
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
@@ -1589,43 +2024,44 @@ static PyNumberMethods Vector_NumMethods = {
/*------------------PY_OBECT DEFINITION--------------------------*/
-/*
- * vector axis, vector.x/y/z/w
- */
+/* vector axis, vector.x/y/z/w */
+
+PyDoc_STRVAR(Vector_axis_x_doc, "Vector X axis.\n\n:type: float");
+PyDoc_STRVAR(Vector_axis_y_doc, "Vector Y axis.\n\n:type: float");
+PyDoc_STRVAR(Vector_axis_z_doc, "Vector Z axis (3D Vectors only).\n\n:type: float");
+PyDoc_STRVAR(Vector_axis_w_doc, "Vector W axis (4D Vectors only).\n\n:type: float");
-static PyObject *Vector_getAxis(VectorObject *self, void *type)
+static PyObject *Vector_axis_get(VectorObject *self, void *type)
{
return vector_item_internal(self, GET_INT_FROM_POINTER(type), TRUE);
}
-static int Vector_setAxis(VectorObject *self, PyObject *value, void *type)
+static int Vector_axis_set(VectorObject *self, PyObject *value, void *type)
{
return vector_ass_item_internal(self, GET_INT_FROM_POINTER(type), value, TRUE);
}
/* vector.length */
-static PyObject *Vector_getLength(VectorObject *self, void *UNUSED(closure))
-{
- double dot = 0.0f;
- int i;
+PyDoc_STRVAR(Vector_length_doc,
+"Vector Length.\n\n:type: float"
+);
+static PyObject *Vector_length_get(VectorObject *self, void *UNUSED(closure))
+{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
- for (i = 0; i < self->size; i++) {
- dot += (double)(self->vec[i] * self->vec[i]);
- }
- return PyFloat_FromDouble(sqrt(dot));
+ return PyFloat_FromDouble(sqrt(dot_vn_vn(self->vec, self->vec, self->size)));
}
-static int Vector_setLength(VectorObject *self, PyObject *value)
+static int Vector_length_set(VectorObject *self, PyObject *value)
{
double dot = 0.0f, param;
if (BaseMath_ReadCallback(self) == -1)
return -1;
- if ((param=PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) {
+ if ((param = PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"length must be set to a number");
return -1;
@@ -1641,19 +2077,19 @@ static int Vector_setLength(VectorObject *self, PyObject *value)
return 0;
}
- dot= dot_vn_vn(self->vec, self->vec, self->size);
+ dot = dot_vn_vn(self->vec, self->vec, self->size);
if (!dot) /* cant sqrt zero */
return 0;
dot = sqrt(dot);
- if (dot==param)
+ if (dot == param)
return 0;
- dot= dot/param;
+ dot = dot / param;
- mul_vn_fl(self->vec, self->size, 1.0/dot);
+ mul_vn_fl(self->vec, self->size, 1.0 / dot);
(void)BaseMath_WriteCallback(self); /* checked already */
@@ -1661,7 +2097,10 @@ static int Vector_setLength(VectorObject *self, PyObject *value)
}
/* vector.length_squared */
-static PyObject *Vector_getLengthSquared(VectorObject *self, void *UNUSED(closure))
+PyDoc_STRVAR(Vector_length_squared_doc,
+"Vector length squared (v.dot(v)).\n\n:type: float"
+);
+static PyObject *Vector_length_squared_get(VectorObject *self, void *UNUSED(closure))
{
if (BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -1670,9 +2109,9 @@ static PyObject *Vector_getLengthSquared(VectorObject *self, void *UNUSED(closur
}
/* Get a new Vector according to the provided swizzle. This function has little
- error checking, as we are in control of the inputs: the closure is set by us
- in Vector_createSwizzleGetSeter. */
-static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
+ * error checking, as we are in control of the inputs: the closure is set by us
+ * in Vector_createSwizzleGetSeter. */
+static PyObject *Vector_swizzle_get(VectorObject *self, void *closure)
{
size_t axis_to;
size_t axis_from;
@@ -1685,8 +2124,7 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
/* Unpack the axes from the closure into an array. */
axis_to = 0;
swizzleClosure = GET_INT_FROM_POINTER(closure);
- while (swizzleClosure & SWIZZLE_VALID_AXIS)
- {
+ while (swizzleClosure & SWIZZLE_VALID_AXIS) {
axis_from = swizzleClosure & SWIZZLE_AXIS;
if (axis_from >= self->size) {
PyErr_SetString(PyExc_AttributeError,
@@ -1704,16 +2142,16 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
}
/* Set the items of this vector using a swizzle.
- - If value is a vector or list this operates like an array copy, except that
- the destination is effectively re-ordered as defined by the swizzle. At
- most min(len(source), len(dest)) values will be copied.
- - If the value is scalar, it is copied to all axes listed in the swizzle.
- - If an axis appears more than once in the swizzle, the final occurrence is
- the one that determines its value.
-
- Returns 0 on success and -1 on failure. On failure, the vector will be
- unchanged. */
-static int Vector_setSwizzle(VectorObject *self, PyObject *value, void *closure)
+ * - If value is a vector or list this operates like an array copy, except that
+ * the destination is effectively re-ordered as defined by the swizzle. At
+ * most min(len(source), len(dest)) values will be copied.
+ * - If the value is scalar, it is copied to all axes listed in the swizzle.
+ * - If an axis appears more than once in the swizzle, the final occurrence is
+ * the one that determines its value.
+
+ * Returns 0 on success and -1 on failure. On failure, the vector will be
+ * unchanged. */
+static int Vector_swizzle_set(VectorObject *self, PyObject *value, void *closure)
{
size_t size_from;
float scalarVal;
@@ -1730,13 +2168,13 @@ static int Vector_setSwizzle(VectorObject *self, PyObject *value, void *closure)
return -1;
/* Check that the closure can be used with this vector: even 2D vectors have
- swizzles defined for axes z and w, but they would be invalid. */
+ * swizzles defined for axes z and w, but they would be invalid. */
swizzleClosure = GET_INT_FROM_POINTER(closure);
- axis_from= 0;
+ axis_from = 0;
+
while (swizzleClosure & SWIZZLE_VALID_AXIS) {
axis_to = swizzleClosure & SWIZZLE_AXIS;
- if (axis_to >= self->size)
- {
+ if (axis_to >= self->size) {
PyErr_SetString(PyExc_AttributeError,
"Vector swizzle: "
"specified axis not present");
@@ -1746,15 +2184,17 @@ static int Vector_setSwizzle(VectorObject *self, PyObject *value, void *closure)
axis_from++;
}
- if (((scalarVal=PyFloat_AsDouble(value)) == -1 && PyErr_Occurred())==0) {
+ if (((scalarVal = PyFloat_AsDouble(value)) == -1 && PyErr_Occurred()) == 0) {
int i;
- for (i=0; i < MAX_DIMENSIONS; i++)
- vec_assign[i]= scalarVal;
- size_from= axis_from;
+ for (i = 0; i < MAX_DIMENSIONS; i++) {
+ vec_assign[i] = scalarVal;
+ }
+
+ size_from = axis_from;
}
else if ( (PyErr_Clear()), /* run but ignore the result */
- (size_from=mathutils_array_parse(vec_assign, 2, 4, value,
+ (size_from = mathutils_array_parse(vec_assign, 2, 4, value,
"mathutils.Vector.**** = swizzle assignment")) == -1)
{
return -1;
@@ -1769,8 +2209,8 @@ static int Vector_setSwizzle(VectorObject *self, PyObject *value, void *closure)
/* Copy vector contents onto swizzled axes. */
axis_from = 0;
swizzleClosure = GET_INT_FROM_POINTER(closure);
- while (swizzleClosure & SWIZZLE_VALID_AXIS)
- {
+
+ while (swizzleClosure & SWIZZLE_VALID_AXIS) {
axis_to = swizzleClosure & SWIZZLE_AXIS;
tvec[axis_to] = vec_assign[axis_from];
swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
@@ -1790,353 +2230,353 @@ static int Vector_setSwizzle(VectorObject *self, PyObject *value, void *closure)
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Vector_getseters[] = {
- {(char *)"x", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector X axis.\n\n:type: float", (void *)0},
- {(char *)"y", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Y axis.\n\n:type: float", (void *)1},
- {(char *)"z", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
- {(char *)"w", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
- {(char *)"length", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
- {(char *)"length_squared", (getter)Vector_getLengthSquared, (setter)NULL, (char *)"Vector length squared (v.dot(v)).\n\n:type: float", NULL},
- {(char *)"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
- {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
- {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+ {(char *)"x", (getter)Vector_axis_get, (setter)Vector_axis_set, Vector_axis_x_doc, (void *)0},
+ {(char *)"y", (getter)Vector_axis_get, (setter)Vector_axis_set, Vector_axis_y_doc, (void *)1},
+ {(char *)"z", (getter)Vector_axis_get, (setter)Vector_axis_set, Vector_axis_z_doc, (void *)2},
+ {(char *)"w", (getter)Vector_axis_get, (setter)Vector_axis_set, Vector_axis_w_doc, (void *)3},
+ {(char *)"length", (getter)Vector_length_get, (setter)Vector_length_set, Vector_length_doc, NULL},
+ {(char *)"length_squared", (getter)Vector_length_squared_get, (setter)NULL, Vector_length_squared_doc, NULL},
+ {(char *)"magnitude", (getter)Vector_length_get, (setter)Vector_length_set, Vector_length_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_is_wrapped_get, (setter)NULL, BaseMathObject_is_wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_owner_get, (setter)NULL, BaseMathObject_owner_doc, NULL},
/* autogenerated swizzle attrs, see python script below */
- {(char *)"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
- {(char *)"xxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
- {(char *)"xxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
- {(char *)"xxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
- {(char *)"xxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
- {(char *)"xxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
- {(char *)"xxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
- {(char *)"xxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
- {(char *)"xxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
- {(char *)"xxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
- {(char *)"xxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
- {(char *)"xxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
- {(char *)"xxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
- {(char *)"xxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
- {(char *)"xxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
- {(char *)"xxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
- {(char *)"xxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
- {(char *)"xxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
- {(char *)"xxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
- {(char *)"xxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
- {(char *)"xxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
- {(char *)"xy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
- {(char *)"xyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
- {(char *)"xyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
- {(char *)"xyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
- {(char *)"xyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
- {(char *)"xyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
- {(char *)"xyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
- {(char *)"xyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
- {(char *)"xyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
- {(char *)"xyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
- {(char *)"xyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
- {(char *)"xyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
- {(char *)"xyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
- {(char *)"xyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
- {(char *)"xyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
- {(char *)"xyzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
- {(char *)"xyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
- {(char *)"xywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
- {(char *)"xywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
- {(char *)"xywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
- {(char *)"xyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
- {(char *)"xz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
- {(char *)"xzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
- {(char *)"xzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
- {(char *)"xzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
- {(char *)"xzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
- {(char *)"xzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
- {(char *)"xzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
- {(char *)"xzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
- {(char *)"xzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
- {(char *)"xzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
- {(char *)"xzyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
- {(char *)"xzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
- {(char *)"xzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
- {(char *)"xzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
- {(char *)"xzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
- {(char *)"xzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
- {(char *)"xzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
- {(char *)"xzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
- {(char *)"xzwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
- {(char *)"xzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
- {(char *)"xzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
- {(char *)"xw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
- {(char *)"xwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
- {(char *)"xwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
- {(char *)"xwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
- {(char *)"xwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
- {(char *)"xwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
- {(char *)"xwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
- {(char *)"xwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
- {(char *)"xwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
- {(char *)"xwyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
- {(char *)"xwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
- {(char *)"xwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
- {(char *)"xwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
- {(char *)"xwzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
- {(char *)"xwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
- {(char *)"xwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
- {(char *)"xww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
- {(char *)"xwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
- {(char *)"xwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
- {(char *)"xwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
- {(char *)"xwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
- {(char *)"yx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
- {(char *)"yxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
- {(char *)"yxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
- {(char *)"yxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
- {(char *)"yxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
- {(char *)"yxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
- {(char *)"yxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
- {(char *)"yxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
- {(char *)"yxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
- {(char *)"yxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
- {(char *)"yxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
- {(char *)"yxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
- {(char *)"yxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
- {(char *)"yxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
- {(char *)"yxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
- {(char *)"yxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
- {(char *)"yxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
- {(char *)"yxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
- {(char *)"yxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
- {(char *)"yxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
- {(char *)"yxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
- {(char *)"yy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
- {(char *)"yyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
- {(char *)"yyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
- {(char *)"yyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
- {(char *)"yyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
- {(char *)"yyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
- {(char *)"yyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
- {(char *)"yyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
- {(char *)"yyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
- {(char *)"yyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
- {(char *)"yyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
- {(char *)"yyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
- {(char *)"yyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
- {(char *)"yyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
- {(char *)"yyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
- {(char *)"yyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
- {(char *)"yyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
- {(char *)"yywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
- {(char *)"yywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
- {(char *)"yywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
- {(char *)"yyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
- {(char *)"yz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
- {(char *)"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
- {(char *)"yzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
- {(char *)"yzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
- {(char *)"yzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
- {(char *)"yzxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
- {(char *)"yzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
- {(char *)"yzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
- {(char *)"yzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
- {(char *)"yzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
- {(char *)"yzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
- {(char *)"yzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
- {(char *)"yzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
- {(char *)"yzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
- {(char *)"yzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
- {(char *)"yzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
- {(char *)"yzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
- {(char *)"yzwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
- {(char *)"yzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
- {(char *)"yzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
- {(char *)"yzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
- {(char *)"yw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
- {(char *)"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
- {(char *)"ywxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
- {(char *)"ywxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
- {(char *)"ywxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
- {(char *)"ywxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
- {(char *)"ywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
- {(char *)"ywyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
- {(char *)"ywyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
- {(char *)"ywyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
- {(char *)"ywyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
- {(char *)"ywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
- {(char *)"ywzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
- {(char *)"ywzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
- {(char *)"ywzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
- {(char *)"ywzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
- {(char *)"yww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
- {(char *)"ywwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
- {(char *)"ywwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
- {(char *)"ywwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
- {(char *)"ywww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
- {(char *)"zx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
- {(char *)"zxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
- {(char *)"zxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
- {(char *)"zxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
- {(char *)"zxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
- {(char *)"zxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
- {(char *)"zxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
- {(char *)"zxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
- {(char *)"zxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
- {(char *)"zxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
- {(char *)"zxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
- {(char *)"zxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
- {(char *)"zxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
- {(char *)"zxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
- {(char *)"zxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
- {(char *)"zxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
- {(char *)"zxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
- {(char *)"zxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
- {(char *)"zxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
- {(char *)"zxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
- {(char *)"zxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
- {(char *)"zy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
- {(char *)"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
- {(char *)"zyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
- {(char *)"zyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
- {(char *)"zyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
- {(char *)"zyxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
- {(char *)"zyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
- {(char *)"zyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
- {(char *)"zyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
- {(char *)"zyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
- {(char *)"zyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
- {(char *)"zyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
- {(char *)"zyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
- {(char *)"zyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
- {(char *)"zyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
- {(char *)"zyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
- {(char *)"zyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
- {(char *)"zywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
- {(char *)"zywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
- {(char *)"zywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
- {(char *)"zyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
- {(char *)"zz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
- {(char *)"zzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
- {(char *)"zzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
- {(char *)"zzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
- {(char *)"zzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
- {(char *)"zzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
- {(char *)"zzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
- {(char *)"zzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
- {(char *)"zzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
- {(char *)"zzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
- {(char *)"zzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
- {(char *)"zzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
- {(char *)"zzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
- {(char *)"zzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
- {(char *)"zzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
- {(char *)"zzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
- {(char *)"zzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
- {(char *)"zzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
- {(char *)"zzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
- {(char *)"zzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
- {(char *)"zzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
- {(char *)"zw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
- {(char *)"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
- {(char *)"zwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
- {(char *)"zwxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
- {(char *)"zwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
- {(char *)"zwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
- {(char *)"zwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
- {(char *)"zwyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
- {(char *)"zwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
- {(char *)"zwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
- {(char *)"zwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
- {(char *)"zwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
- {(char *)"zwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
- {(char *)"zwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
- {(char *)"zwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
- {(char *)"zwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
- {(char *)"zww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
- {(char *)"zwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
- {(char *)"zwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
- {(char *)"zwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
- {(char *)"zwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
- {(char *)"wx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
- {(char *)"wxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
- {(char *)"wxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
- {(char *)"wxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
- {(char *)"wxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
- {(char *)"wxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
- {(char *)"wxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
- {(char *)"wxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
- {(char *)"wxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
- {(char *)"wxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
- {(char *)"wxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
- {(char *)"wxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
- {(char *)"wxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
- {(char *)"wxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
- {(char *)"wxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
- {(char *)"wxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
- {(char *)"wxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
- {(char *)"wxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
- {(char *)"wxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
- {(char *)"wxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
- {(char *)"wxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
- {(char *)"wy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
- {(char *)"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
- {(char *)"wyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
- {(char *)"wyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
- {(char *)"wyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
- {(char *)"wyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
- {(char *)"wyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
- {(char *)"wyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
- {(char *)"wyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
- {(char *)"wyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
- {(char *)"wyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
- {(char *)"wyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
- {(char *)"wyzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
- {(char *)"wyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
- {(char *)"wyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
- {(char *)"wyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
- {(char *)"wyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
- {(char *)"wywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
- {(char *)"wywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
- {(char *)"wywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
- {(char *)"wyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
- {(char *)"wz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
- {(char *)"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
- {(char *)"wzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
- {(char *)"wzxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
- {(char *)"wzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
- {(char *)"wzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
- {(char *)"wzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
- {(char *)"wzyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
- {(char *)"wzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
- {(char *)"wzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
- {(char *)"wzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
- {(char *)"wzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
- {(char *)"wzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
- {(char *)"wzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
- {(char *)"wzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
- {(char *)"wzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
- {(char *)"wzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
- {(char *)"wzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
- {(char *)"wzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
- {(char *)"wzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
- {(char *)"wzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
- {(char *)"ww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
- {(char *)"wwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
- {(char *)"wwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
- {(char *)"wwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
- {(char *)"wwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
- {(char *)"wwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
- {(char *)"wwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
- {(char *)"wwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
- {(char *)"wwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
- {(char *)"wwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
- {(char *)"wwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
- {(char *)"wwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
- {(char *)"wwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
- {(char *)"wwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
- {(char *)"wwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
- {(char *)"wwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
- {(char *)"www", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
- {(char *)"wwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
- {(char *)"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
- {(char *)"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
- {(char *)"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
+ {(char *)"xx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
+ {(char *)"xxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
+ {(char *)"xxxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
+ {(char *)"xxxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
+ {(char *)"xxxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
+ {(char *)"xxxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
+ {(char *)"xxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
+ {(char *)"xxyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
+ {(char *)"xxyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
+ {(char *)"xxyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
+ {(char *)"xxyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
+ {(char *)"xxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
+ {(char *)"xxzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
+ {(char *)"xxzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
+ {(char *)"xxzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
+ {(char *)"xxzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
+ {(char *)"xxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
+ {(char *)"xxwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
+ {(char *)"xxwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
+ {(char *)"xxwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
+ {(char *)"xxww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
+ {(char *)"xy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
+ {(char *)"xyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
+ {(char *)"xyxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
+ {(char *)"xyxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
+ {(char *)"xyxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
+ {(char *)"xyxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
+ {(char *)"xyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
+ {(char *)"xyyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
+ {(char *)"xyyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
+ {(char *)"xyyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
+ {(char *)"xyyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
+ {(char *)"xyz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
+ {(char *)"xyzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
+ {(char *)"xyzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
+ {(char *)"xyzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
+ {(char *)"xyzw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
+ {(char *)"xyw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
+ {(char *)"xywx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
+ {(char *)"xywy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
+ {(char *)"xywz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
+ {(char *)"xyww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
+ {(char *)"xz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
+ {(char *)"xzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
+ {(char *)"xzxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
+ {(char *)"xzxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
+ {(char *)"xzxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
+ {(char *)"xzxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
+ {(char *)"xzy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
+ {(char *)"xzyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
+ {(char *)"xzyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
+ {(char *)"xzyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
+ {(char *)"xzyw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
+ {(char *)"xzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
+ {(char *)"xzzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
+ {(char *)"xzzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
+ {(char *)"xzzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
+ {(char *)"xzzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
+ {(char *)"xzw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
+ {(char *)"xzwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
+ {(char *)"xzwy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
+ {(char *)"xzwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
+ {(char *)"xzww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
+ {(char *)"xw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
+ {(char *)"xwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
+ {(char *)"xwxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
+ {(char *)"xwxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
+ {(char *)"xwxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
+ {(char *)"xwxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
+ {(char *)"xwy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
+ {(char *)"xwyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
+ {(char *)"xwyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
+ {(char *)"xwyz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
+ {(char *)"xwyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
+ {(char *)"xwz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
+ {(char *)"xwzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
+ {(char *)"xwzy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
+ {(char *)"xwzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
+ {(char *)"xwzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
+ {(char *)"xww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
+ {(char *)"xwwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
+ {(char *)"xwwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
+ {(char *)"xwwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
+ {(char *)"xwww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
+ {(char *)"yx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
+ {(char *)"yxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
+ {(char *)"yxxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
+ {(char *)"yxxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
+ {(char *)"yxxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
+ {(char *)"yxxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
+ {(char *)"yxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
+ {(char *)"yxyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
+ {(char *)"yxyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
+ {(char *)"yxyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
+ {(char *)"yxyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
+ {(char *)"yxz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
+ {(char *)"yxzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
+ {(char *)"yxzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
+ {(char *)"yxzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
+ {(char *)"yxzw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
+ {(char *)"yxw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
+ {(char *)"yxwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
+ {(char *)"yxwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
+ {(char *)"yxwz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
+ {(char *)"yxww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
+ {(char *)"yy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
+ {(char *)"yyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
+ {(char *)"yyxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
+ {(char *)"yyxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
+ {(char *)"yyxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
+ {(char *)"yyxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
+ {(char *)"yyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
+ {(char *)"yyyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
+ {(char *)"yyyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
+ {(char *)"yyyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
+ {(char *)"yyyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
+ {(char *)"yyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
+ {(char *)"yyzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
+ {(char *)"yyzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
+ {(char *)"yyzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
+ {(char *)"yyzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
+ {(char *)"yyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
+ {(char *)"yywx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
+ {(char *)"yywy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
+ {(char *)"yywz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
+ {(char *)"yyww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
+ {(char *)"yz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
+ {(char *)"yzx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
+ {(char *)"yzxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
+ {(char *)"yzxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
+ {(char *)"yzxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
+ {(char *)"yzxw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
+ {(char *)"yzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
+ {(char *)"yzyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
+ {(char *)"yzyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
+ {(char *)"yzyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
+ {(char *)"yzyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
+ {(char *)"yzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
+ {(char *)"yzzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
+ {(char *)"yzzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
+ {(char *)"yzzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
+ {(char *)"yzzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
+ {(char *)"yzw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
+ {(char *)"yzwx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
+ {(char *)"yzwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
+ {(char *)"yzwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
+ {(char *)"yzww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
+ {(char *)"yw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
+ {(char *)"ywx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
+ {(char *)"ywxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
+ {(char *)"ywxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
+ {(char *)"ywxz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
+ {(char *)"ywxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
+ {(char *)"ywy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
+ {(char *)"ywyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
+ {(char *)"ywyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
+ {(char *)"ywyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
+ {(char *)"ywyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
+ {(char *)"ywz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
+ {(char *)"ywzx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
+ {(char *)"ywzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
+ {(char *)"ywzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
+ {(char *)"ywzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
+ {(char *)"yww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
+ {(char *)"ywwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
+ {(char *)"ywwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
+ {(char *)"ywwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
+ {(char *)"ywww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
+ {(char *)"zx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
+ {(char *)"zxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
+ {(char *)"zxxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
+ {(char *)"zxxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
+ {(char *)"zxxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
+ {(char *)"zxxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
+ {(char *)"zxy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
+ {(char *)"zxyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
+ {(char *)"zxyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
+ {(char *)"zxyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
+ {(char *)"zxyw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
+ {(char *)"zxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
+ {(char *)"zxzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
+ {(char *)"zxzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
+ {(char *)"zxzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
+ {(char *)"zxzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
+ {(char *)"zxw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
+ {(char *)"zxwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
+ {(char *)"zxwy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
+ {(char *)"zxwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
+ {(char *)"zxww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
+ {(char *)"zy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
+ {(char *)"zyx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
+ {(char *)"zyxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
+ {(char *)"zyxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
+ {(char *)"zyxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
+ {(char *)"zyxw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
+ {(char *)"zyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
+ {(char *)"zyyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
+ {(char *)"zyyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
+ {(char *)"zyyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
+ {(char *)"zyyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
+ {(char *)"zyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
+ {(char *)"zyzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
+ {(char *)"zyzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
+ {(char *)"zyzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
+ {(char *)"zyzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
+ {(char *)"zyw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
+ {(char *)"zywx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
+ {(char *)"zywy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
+ {(char *)"zywz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
+ {(char *)"zyww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
+ {(char *)"zz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
+ {(char *)"zzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
+ {(char *)"zzxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
+ {(char *)"zzxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
+ {(char *)"zzxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
+ {(char *)"zzxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
+ {(char *)"zzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
+ {(char *)"zzyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
+ {(char *)"zzyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
+ {(char *)"zzyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
+ {(char *)"zzyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
+ {(char *)"zzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
+ {(char *)"zzzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
+ {(char *)"zzzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
+ {(char *)"zzzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
+ {(char *)"zzzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
+ {(char *)"zzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
+ {(char *)"zzwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
+ {(char *)"zzwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
+ {(char *)"zzwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
+ {(char *)"zzww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
+ {(char *)"zw", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
+ {(char *)"zwx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
+ {(char *)"zwxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
+ {(char *)"zwxy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
+ {(char *)"zwxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
+ {(char *)"zwxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
+ {(char *)"zwy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
+ {(char *)"zwyx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
+ {(char *)"zwyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
+ {(char *)"zwyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
+ {(char *)"zwyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
+ {(char *)"zwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
+ {(char *)"zwzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
+ {(char *)"zwzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
+ {(char *)"zwzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
+ {(char *)"zwzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
+ {(char *)"zww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
+ {(char *)"zwwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
+ {(char *)"zwwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
+ {(char *)"zwwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
+ {(char *)"zwww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
+ {(char *)"wx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
+ {(char *)"wxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
+ {(char *)"wxxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
+ {(char *)"wxxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
+ {(char *)"wxxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
+ {(char *)"wxxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
+ {(char *)"wxy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
+ {(char *)"wxyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
+ {(char *)"wxyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
+ {(char *)"wxyz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
+ {(char *)"wxyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
+ {(char *)"wxz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
+ {(char *)"wxzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
+ {(char *)"wxzy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
+ {(char *)"wxzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
+ {(char *)"wxzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
+ {(char *)"wxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
+ {(char *)"wxwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
+ {(char *)"wxwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
+ {(char *)"wxwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
+ {(char *)"wxww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
+ {(char *)"wy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
+ {(char *)"wyx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
+ {(char *)"wyxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
+ {(char *)"wyxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
+ {(char *)"wyxz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
+ {(char *)"wyxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
+ {(char *)"wyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
+ {(char *)"wyyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
+ {(char *)"wyyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
+ {(char *)"wyyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
+ {(char *)"wyyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
+ {(char *)"wyz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
+ {(char *)"wyzx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
+ {(char *)"wyzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
+ {(char *)"wyzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
+ {(char *)"wyzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
+ {(char *)"wyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
+ {(char *)"wywx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
+ {(char *)"wywy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
+ {(char *)"wywz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
+ {(char *)"wyww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
+ {(char *)"wz", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
+ {(char *)"wzx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
+ {(char *)"wzxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
+ {(char *)"wzxy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
+ {(char *)"wzxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
+ {(char *)"wzxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
+ {(char *)"wzy", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
+ {(char *)"wzyx", (getter)Vector_swizzle_get, (setter)Vector_swizzle_set, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
+ {(char *)"wzyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
+ {(char *)"wzyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
+ {(char *)"wzyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
+ {(char *)"wzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
+ {(char *)"wzzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
+ {(char *)"wzzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
+ {(char *)"wzzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
+ {(char *)"wzzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
+ {(char *)"wzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
+ {(char *)"wzwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
+ {(char *)"wzwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
+ {(char *)"wzwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
+ {(char *)"wzww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
+ {(char *)"ww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
+ {(char *)"wwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
+ {(char *)"wwxx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
+ {(char *)"wwxy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
+ {(char *)"wwxz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
+ {(char *)"wwxw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
+ {(char *)"wwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
+ {(char *)"wwyx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
+ {(char *)"wwyy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
+ {(char *)"wwyz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
+ {(char *)"wwyw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
+ {(char *)"wwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
+ {(char *)"wwzx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
+ {(char *)"wwzy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
+ {(char *)"wwzz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
+ {(char *)"wwzw", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
+ {(char *)"www", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
+ {(char *)"wwwx", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
+ {(char *)"wwwy", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
+ {(char *)"wwwz", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
+ {(char *)"wwww", (getter)Vector_swizzle_get, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -2154,15 +2594,15 @@ while len(axises) >= 2:
axis_0_pos = axis_pos[axis_0]
for axis_1 in axises:
axis_1_pos = axis_pos[axis_1]
- axis_dict[axis_0+axis_1] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS))' % (axis_0_pos, axis_1_pos)
+ axis_dict[axis_0 + axis_1] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS))' % (axis_0_pos, axis_1_pos)
if len(axises)>2:
for axis_2 in axises:
axis_2_pos = axis_pos[axis_2]
- axis_dict[axis_0+axis_1+axis_2] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)))' % (axis_0_pos, axis_1_pos, axis_2_pos)
+ axis_dict[axis_0 + axis_1 + axis_2] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)))' % (axis_0_pos, axis_1_pos, axis_2_pos)
if len(axises)>3:
for axis_3 in axises:
axis_3_pos = axis_pos[axis_3]
- axis_dict[axis_0+axis_1+axis_2+axis_3] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) ' % (axis_0_pos, axis_1_pos, axis_2_pos, axis_3_pos)
+ axis_dict[axis_0 + axis_1 + axis_2 + axis_3] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) ' % (axis_0_pos, axis_1_pos, axis_2_pos, axis_3_pos)
axises = axises[:-1]
@@ -2182,26 +2622,25 @@ if len(unique) != len(items):
*/
/* ROW VECTOR Multiplication - Vector X Matrix
- * [x][y][z] * [1][4][7]
+ * [x][y][z] * [1][4][7]
* [2][5][8]
* [3][6][9]
* vector/matrix multiplication IS NOT COMMUTATIVE!!!! */
-static int row_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject *vec, MatrixObject *mat)
+static int row_vector_multiplication(float r_vec[MAX_DIMENSIONS], VectorObject *vec, MatrixObject *mat)
{
float vec_cpy[MAX_DIMENSIONS];
- double dot = 0.0f;
- int x, y, z= 0, vec_size= vec->size;
+ int row, col, z = 0, vec_size = vec->size;
- if (mat->col_size != vec_size) {
- if (mat->col_size == 4 && vec_size != 3) {
+ if (mat->num_row != vec_size) {
+ if (mat->num_row == 4 && vec_size == 3) {
+ vec_cpy[3] = 1.0f;
+ }
+ else {
PyErr_SetString(PyExc_ValueError,
"vector * matrix: matrix column size "
"and the vector size must be the same");
return -1;
}
- else {
- vec_cpy[3] = 1.0f;
- }
}
if (BaseMath_ReadCallback(vec) == -1 || BaseMath_ReadCallback(mat) == -1)
@@ -2209,14 +2648,14 @@ static int row_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject *v
memcpy(vec_cpy, vec->vec, vec_size * sizeof(float));
- rvec[3] = 1.0f;
+ r_vec[3] = 1.0f;
//muliplication
- for (x = 0; x < mat->row_size; x++) {
- for (y = 0; y < mat->col_size; y++) {
- dot += mat->matrix[x][y] * vec_cpy[y];
+ for (col = 0; col < mat->num_col; col++) {
+ double dot = 0.0;
+ for (row = 0; row < mat->num_row; row++) {
+ dot += MATRIX_ITEM(mat, row, col) * vec_cpy[row];
}
- rvec[z++] = (float)dot;
- dot = 0.0f;
+ r_vec[z++] = (float)dot;
}
return 0;
}
@@ -2242,6 +2681,12 @@ static PyObject *Vector_negate(VectorObject *self)
}
static struct PyMethodDef Vector_methods[] = {
+ /* Class Methods */
+ {"Fill", (PyCFunction) C_Vector_Fill, METH_VARARGS | METH_CLASS, C_Vector_Fill_doc},
+ {"Range", (PyCFunction) C_Vector_Range, METH_VARARGS | METH_CLASS, C_Vector_Range_doc},
+ {"Linspace", (PyCFunction) C_Vector_Linspace, METH_VARARGS | METH_CLASS, C_Vector_Linspace_doc},
+ {"Repeat", (PyCFunction) C_Vector_Repeat, METH_VARARGS | METH_CLASS, C_Vector_Repeat_doc},
+
/* in place only */
{"zero", (PyCFunction) Vector_zero, METH_NOARGS, Vector_zero_doc},
{"negate", (PyCFunction) Vector_negate, METH_NOARGS, Vector_negate_doc},
@@ -2250,6 +2695,8 @@ static struct PyMethodDef Vector_methods[] = {
{"normalize", (PyCFunction) Vector_normalize, METH_NOARGS, Vector_normalize_doc},
{"normalized", (PyCFunction) Vector_normalized, METH_NOARGS, Vector_normalized_doc},
+ {"resize", (PyCFunction) Vector_resize, METH_O, Vector_resize_doc},
+ {"resized", (PyCFunction) Vector_resized, METH_O, Vector_resized_doc},
{"to_2d", (PyCFunction) Vector_to_2d, METH_NOARGS, Vector_to_2d_doc},
{"resize_2d", (PyCFunction) Vector_resize_2d, METH_NOARGS, Vector_resize_2d_doc},
{"to_3d", (PyCFunction) Vector_to_3d, METH_NOARGS, Vector_to_3d_doc},
@@ -2310,7 +2757,7 @@ PyTypeObject vector_Type = {
NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
- NULL, /* reprfunc tp_str; */
+ (reprfunc)Vector_str, /* reprfunc tp_str; */
NULL, /* getattrofunc tp_getattro; */
NULL, /* setattrofunc tp_setattro; */
@@ -2375,28 +2822,28 @@ PyObject *Vector_CreatePyObject(float *vec, const int size, const int type, PyTy
{
VectorObject *self;
- if (size > 4 || size < 2) {
+ if (size < 2) {
PyErr_SetString(PyExc_RuntimeError,
"Vector(): invalid size");
return NULL;
}
- self= base_type ? (VectorObject *)base_type->tp_alloc(base_type, 0) :
- (VectorObject *)PyObject_GC_New(VectorObject, &vector_Type);
+ self = base_type ? (VectorObject *)base_type->tp_alloc(base_type, 0) :
+ (VectorObject *)PyObject_GC_New(VectorObject, &vector_Type);
if (self) {
self->size = size;
/* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ self->cb_user = NULL;
+ self->cb_type = self->cb_subtype = 0;
if (type == Py_WRAP) {
self->vec = vec;
self->wrapped = Py_WRAP;
}
else if (type == Py_NEW) {
- self->vec= PyMem_Malloc(size * sizeof(float));
+ self->vec = PyMem_Malloc(size * sizeof(float));
if (vec) {
memcpy(self->vec, vec, size * sizeof(float));
}
@@ -2418,14 +2865,23 @@ PyObject *Vector_CreatePyObject(float *vec, const int size, const int type, PyTy
PyObject *Vector_CreatePyObject_cb(PyObject *cb_user, int size, int cb_type, int cb_subtype)
{
float dummy[4] = {0.0, 0.0, 0.0, 0.0}; /* dummy init vector, callbacks will be used on access */
- VectorObject *self= (VectorObject *)Vector_CreatePyObject(dummy, size, Py_NEW, NULL);
+ VectorObject *self = (VectorObject *)Vector_CreatePyObject(dummy, size, Py_NEW, NULL);
if (self) {
Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
+ self->cb_user = cb_user;
+ self->cb_type = (unsigned char)cb_type;
+ self->cb_subtype = (unsigned char)cb_subtype;
PyObject_GC_Track(self);
}
return (PyObject *)self;
}
+
+PyObject *Vector_CreatePyObject_alloc(float *vec, const int size, PyTypeObject *base_type)
+{
+ VectorObject *vect_ob;
+ vect_ob = (VectorObject *)Vector_CreatePyObject(vec, size, Py_WRAP, base_type);
+ vect_ob->wrapped = Py_NEW;
+
+ return (PyObject *)vect_ob;
+}
diff --git a/source/blender/python/mathutils/mathutils_Vector.h b/source/blender/python/mathutils/mathutils_Vector.h
index 0f7fa174d18..4e10e795602 100644
--- a/source/blender/python/mathutils/mathutils_Vector.h
+++ b/source/blender/python/mathutils/mathutils_Vector.h
@@ -41,11 +41,12 @@ extern PyTypeObject vector_Type;
typedef struct {
BASE_MATH_MEMBERS(vec);
- unsigned char size; /* vec size 2,3 or 4 */
+ int size; /* vec size 2,3 or 4 */
} VectorObject;
/*prototypes*/
PyObject *Vector_CreatePyObject(float *vec, const int size, const int type, PyTypeObject *base_type);
PyObject *Vector_CreatePyObject_cb(PyObject *user, int size, int callback_type, int subtype);
+PyObject *Vector_CreatePyObject_alloc(float *vec, const int size, PyTypeObject *base_type);
#endif /* MATHUTILS_VECTOR_H */
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index c5e0d2ab95d..b4f3f4e470e 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -47,7 +47,7 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-#define SWAP_FLOAT(a, b, tmp) tmp=a; a=b; b=tmp
+#define SWAP_FLOAT(a, b, tmp) tmp = a; a = b; b = tmp
/*-------------------------DOC STRINGS ---------------------------*/
PyDoc_STRVAR(M_Geometry_doc,
@@ -76,12 +76,12 @@ PyDoc_STRVAR(M_Geometry_intersect_ray_tri_doc,
" :return: The point of intersection or None if no intersection is found\n"
" :rtype: :class:`mathutils.Vector` or None\n"
);
-static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *ray, *ray_off, *vec1, *vec2, *vec3;
float dir[3], orig[3], v1[3], v2[3], v3[3], e1[3], e2[3], pvec[3], tvec[3], qvec[3];
float det, inv_det, u, v, t;
- int clip= 1;
+ int clip = 1;
if (!PyArg_ParseTuple(args,
"O!O!O!O!O!|i:intersect_ray_tri",
@@ -99,11 +99,11 @@ static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject*
return NULL;
}
- if ( BaseMath_ReadCallback(vec1) == -1 ||
- BaseMath_ReadCallback(vec2) == -1 ||
- BaseMath_ReadCallback(vec3) == -1 ||
- BaseMath_ReadCallback(ray) == -1 ||
- BaseMath_ReadCallback(ray_off) == -1)
+ if ( BaseMath_ReadCallback(vec1) == -1 ||
+ BaseMath_ReadCallback(vec2) == -1 ||
+ BaseMath_ReadCallback(vec3) == -1 ||
+ BaseMath_ReadCallback(ray) == -1 ||
+ BaseMath_ReadCallback(ray_off) == -1)
{
return NULL;
}
@@ -125,19 +125,19 @@ static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject*
cross_v3_v3v3(pvec, dir, e2);
/* if determinant is near zero, ray lies in plane of triangle */
- det= dot_v3v3(e1, pvec);
+ det = dot_v3v3(e1, pvec);
if (det > -0.000001f && det < 0.000001f) {
Py_RETURN_NONE;
}
- inv_det= 1.0f / det;
+ inv_det = 1.0f / det;
/* calculate distance from v1 to ray origin */
sub_v3_v3v3(tvec, orig, v1);
/* calculate U parameter and test bounds */
- u= dot_v3v3(tvec, pvec) * inv_det;
+ u = dot_v3v3(tvec, pvec) * inv_det;
if (clip && (u < 0.0f || u > 1.0f)) {
Py_RETURN_NONE;
}
@@ -146,14 +146,14 @@ static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject*
cross_v3_v3v3(qvec, tvec, e1);
/* calculate V parameter and test bounds */
- v= dot_v3v3(dir, qvec) * inv_det;
+ v = dot_v3v3(dir, qvec) * inv_det;
if (clip && (v < 0.0f || u + v > 1.0f)) {
Py_RETURN_NONE;
}
/* calculate t, ray intersects triangle */
- t= dot_v3v3(e2, qvec) * inv_det;
+ t = dot_v3v3(e2, qvec) * inv_det;
mul_v3_fl(dir, t);
add_v3_v3v3(pvec, orig, dir);
@@ -199,10 +199,10 @@ static PyObject *M_Geometry_intersect_line_line(PyObject *UNUSED(self), PyObject
return NULL;
}
- if ( BaseMath_ReadCallback(vec1) == -1 ||
- BaseMath_ReadCallback(vec2) == -1 ||
- BaseMath_ReadCallback(vec3) == -1 ||
- BaseMath_ReadCallback(vec4) == -1)
+ if ( BaseMath_ReadCallback(vec1) == -1 ||
+ BaseMath_ReadCallback(vec2) == -1 ||
+ BaseMath_ReadCallback(vec3) == -1 ||
+ BaseMath_ReadCallback(vec4) == -1)
{
return NULL;
}
@@ -217,31 +217,31 @@ static PyObject *M_Geometry_intersect_line_line(PyObject *UNUSED(self), PyObject
copy_v3_v3(v4, vec4->vec);
}
else {
- v1[0]= vec1->vec[0];
- v1[1]= vec1->vec[1];
- v1[2]= 0.0f;
+ v1[0] = vec1->vec[0];
+ v1[1] = vec1->vec[1];
+ v1[2] = 0.0f;
- v2[0]= vec2->vec[0];
- v2[1]= vec2->vec[1];
- v2[2]= 0.0f;
+ v2[0] = vec2->vec[0];
+ v2[1] = vec2->vec[1];
+ v2[2] = 0.0f;
- v3[0]= vec3->vec[0];
- v3[1]= vec3->vec[1];
- v3[2]= 0.0f;
+ v3[0] = vec3->vec[0];
+ v3[1] = vec3->vec[1];
+ v3[2] = 0.0f;
- v4[0]= vec4->vec[0];
- v4[1]= vec4->vec[1];
- v4[2]= 0.0f;
+ v4[0] = vec4->vec[0];
+ v4[1] = vec4->vec[1];
+ v4[2] = 0.0f;
}
- result= isect_line_line_v3(v1, v2, v3, v4, i1, i2);
+ result = isect_line_line_v3(v1, v2, v3, v4, i1, i2);
if (result == 0) {
/* colinear */
Py_RETURN_NONE;
}
else {
- tuple= PyTuple_New(2);
+ tuple = PyTuple_New(2);
PyTuple_SET_ITEM(tuple, 0, Vector_CreatePyObject(i1, vec1->size, Py_NEW, NULL));
PyTuple_SET_ITEM(tuple, 1, Vector_CreatePyObject(i2, vec1->size, Py_NEW, NULL));
return tuple;
@@ -273,7 +273,7 @@ PyDoc_STRVAR(M_Geometry_normal_doc,
" :type v4: :class:`mathutils.Vector`\n"
" :rtype: :class:`mathutils.Vector`\n"
);
-static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *vec1, *vec2, *vec3, *vec4;
float n[3];
@@ -298,9 +298,9 @@ static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if ( BaseMath_ReadCallback(vec1) == -1 ||
- BaseMath_ReadCallback(vec2) == -1 ||
- BaseMath_ReadCallback(vec3) == -1)
+ if ( BaseMath_ReadCallback(vec1) == -1 ||
+ BaseMath_ReadCallback(vec2) == -1 ||
+ BaseMath_ReadCallback(vec3) == -1)
{
return NULL;
}
@@ -327,10 +327,10 @@ static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if ( BaseMath_ReadCallback(vec1) == -1 ||
- BaseMath_ReadCallback(vec2) == -1 ||
- BaseMath_ReadCallback(vec3) == -1 ||
- BaseMath_ReadCallback(vec4) == -1)
+ if ( BaseMath_ReadCallback(vec1) == -1 ||
+ BaseMath_ReadCallback(vec2) == -1 ||
+ BaseMath_ReadCallback(vec3) == -1 ||
+ BaseMath_ReadCallback(vec4) == -1)
{
return NULL;
}
@@ -356,7 +356,7 @@ PyDoc_STRVAR(M_Geometry_area_tri_doc,
" :type v3: :class:`mathutils.Vector`\n"
" :rtype: float\n"
);
-static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *vec1, *vec2, *vec3;
@@ -374,9 +374,9 @@ static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if ( BaseMath_ReadCallback(vec1) == -1 ||
- BaseMath_ReadCallback(vec2) == -1 ||
- BaseMath_ReadCallback(vec3) == -1)
+ if ( BaseMath_ReadCallback(vec1) == -1 ||
+ BaseMath_ReadCallback(vec2) == -1 ||
+ BaseMath_ReadCallback(vec3) == -1)
{
return NULL;
}
@@ -411,7 +411,7 @@ PyDoc_STRVAR(M_Geometry_intersect_line_line_2d_doc,
" :return: The point of intersection or None when not found\n"
" :rtype: :class:`mathutils.Vector` or None\n"
);
-static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *line_a1, *line_a2, *line_b1, *line_b2;
float vi[2];
@@ -424,10 +424,10 @@ static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObj
return NULL;
}
- if ( BaseMath_ReadCallback(line_a1) == -1 ||
- BaseMath_ReadCallback(line_a2) == -1 ||
- BaseMath_ReadCallback(line_b1) == -1 ||
- BaseMath_ReadCallback(line_b2) == -1)
+ if ( BaseMath_ReadCallback(line_a1) == -1 ||
+ BaseMath_ReadCallback(line_a2) == -1 ||
+ BaseMath_ReadCallback(line_b1) == -1 ||
+ BaseMath_ReadCallback(line_b2) == -1)
{
return NULL;
}
@@ -459,10 +459,10 @@ PyDoc_STRVAR(M_Geometry_intersect_line_plane_doc,
" :return: The point of intersection or None when not found\n"
" :rtype: :class:`mathutils.Vector` or None\n"
);
-static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *line_a, *line_b, *plane_co, *plane_no;
- int no_flip= 0;
+ int no_flip = 0;
float isect[3];
if (!PyArg_ParseTuple(args, "O!O!O!O!|i:intersect_line_plane",
&vector_Type, &line_a,
@@ -474,10 +474,10 @@ static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObjec
return NULL;
}
- if ( BaseMath_ReadCallback(line_a) == -1 ||
- BaseMath_ReadCallback(line_b) == -1 ||
- BaseMath_ReadCallback(plane_co) == -1 ||
- BaseMath_ReadCallback(plane_no) == -1)
+ if ( BaseMath_ReadCallback(line_a) == -1 ||
+ BaseMath_ReadCallback(line_b) == -1 ||
+ BaseMath_ReadCallback(plane_co) == -1 ||
+ BaseMath_ReadCallback(plane_no) == -1)
{
return NULL;
}
@@ -513,7 +513,7 @@ PyDoc_STRVAR(M_Geometry_intersect_plane_plane_doc,
" :return: The line of the intersection represented as a point and a vector\n"
" :rtype: tuple pair of :class:`mathutils.Vector`\n"
);
-static PyObject *M_Geometry_intersect_plane_plane(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_plane_plane(PyObject *UNUSED(self), PyObject *args)
{
PyObject *ret;
VectorObject *plane_a_co, *plane_a_no, *plane_b_co, *plane_b_no;
@@ -530,10 +530,10 @@ static PyObject *M_Geometry_intersect_plane_plane(PyObject *UNUSED(self), PyObje
return NULL;
}
- if ( BaseMath_ReadCallback(plane_a_co) == -1 ||
- BaseMath_ReadCallback(plane_a_no) == -1 ||
- BaseMath_ReadCallback(plane_b_co) == -1 ||
- BaseMath_ReadCallback(plane_b_no) == -1)
+ if ( BaseMath_ReadCallback(plane_a_co) == -1 ||
+ BaseMath_ReadCallback(plane_a_no) == -1 ||
+ BaseMath_ReadCallback(plane_b_co) == -1 ||
+ BaseMath_ReadCallback(plane_b_no) == -1)
{
return NULL;
}
@@ -551,7 +551,7 @@ static PyObject *M_Geometry_intersect_plane_plane(PyObject *UNUSED(self), PyObje
normalize_v3(isect_no);
- ret= PyTuple_New(2);
+ ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(isect_co, 3, Py_NEW, NULL));
PyTuple_SET_ITEM(ret, 1, Vector_CreatePyObject(isect_no, 3, Py_NEW, NULL));
return ret;
@@ -574,11 +574,11 @@ PyDoc_STRVAR(M_Geometry_intersect_line_sphere_doc,
" :return: The intersection points as a pair of vectors or None when there is no intersection\n"
" :rtype: A tuple pair containing :class:`mathutils.Vector` or None\n"
);
-static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *line_a, *line_b, *sphere_co;
float sphere_radius;
- int clip= TRUE;
+ int clip = TRUE;
float isect_a[3];
float isect_b[3];
@@ -592,9 +592,9 @@ static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObje
return NULL;
}
- if ( BaseMath_ReadCallback(line_a) == -1 ||
- BaseMath_ReadCallback(line_b) == -1 ||
- BaseMath_ReadCallback(sphere_co) == -1)
+ if ( BaseMath_ReadCallback(line_a) == -1 ||
+ BaseMath_ReadCallback(line_b) == -1 ||
+ BaseMath_ReadCallback(sphere_co) == -1)
{
return NULL;
}
@@ -606,24 +606,24 @@ static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObje
return NULL;
}
else {
- short use_a= TRUE;
- short use_b= TRUE;
+ short use_a = TRUE;
+ short use_b = TRUE;
float lambda;
- PyObject *ret= PyTuple_New(2);
+ PyObject *ret = PyTuple_New(2);
- switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
+ switch (isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
case 1:
- if (!(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
- use_b= FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a = FALSE;
+ use_b = FALSE;
break;
case 2:
- if (!(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
- if (!(!clip || (((lambda= line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b= FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a = FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b = FALSE;
break;
default:
- use_a= FALSE;
- use_b= FALSE;
+ use_a = FALSE;
+ use_b = FALSE;
}
if (use_a) { PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(isect_a, 3, Py_NEW, NULL)); }
@@ -654,11 +654,11 @@ PyDoc_STRVAR(M_Geometry_intersect_line_sphere_2d_doc,
" :return: The intersection points as a pair of vectors or None when there is no intersection\n"
" :rtype: A tuple pair containing :class:`mathutils.Vector` or None\n"
);
-static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *line_a, *line_b, *sphere_co;
float sphere_radius;
- int clip= TRUE;
+ int clip = TRUE;
float isect_a[3];
float isect_b[3];
@@ -672,31 +672,31 @@ static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyO
return NULL;
}
- if ( BaseMath_ReadCallback(line_a) == -1 ||
- BaseMath_ReadCallback(line_b) == -1 ||
- BaseMath_ReadCallback(sphere_co) == -1)
+ if ( BaseMath_ReadCallback(line_a) == -1 ||
+ BaseMath_ReadCallback(line_b) == -1 ||
+ BaseMath_ReadCallback(sphere_co) == -1)
{
return NULL;
}
else {
- short use_a= TRUE;
- short use_b= TRUE;
+ short use_a = TRUE;
+ short use_b = TRUE;
float lambda;
- PyObject *ret= PyTuple_New(2);
+ PyObject *ret = PyTuple_New(2);
- switch(isect_line_sphere_v2(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
+ switch (isect_line_sphere_v2(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
case 1:
- if (!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
- use_b= FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a = FALSE;
+ use_b = FALSE;
break;
case 2:
- if (!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
- if (!(!clip || (((lambda= line_point_factor_v2(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b= FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a = FALSE;
+ if (!(!clip || (((lambda = line_point_factor_v2(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b = FALSE;
break;
default:
- use_a= FALSE;
- use_b= FALSE;
+ use_a = FALSE;
+ use_b = FALSE;
}
if (use_a) { PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(isect_a, 2, Py_NEW, NULL)); }
@@ -722,7 +722,7 @@ PyDoc_STRVAR(M_Geometry_intersect_point_line_doc,
" :type line_p1: :class:`mathutils.Vector`\n"
" :rtype: (:class:`mathutils.Vector`, float)\n"
);
-static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *pt, *line_1, *line_2;
float pt_in[3], pt_out[3], l1[3], l2[3];
@@ -737,27 +737,27 @@ static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObjec
return NULL;
}
- if ( BaseMath_ReadCallback(pt) == -1 ||
- BaseMath_ReadCallback(line_1) == -1 ||
- BaseMath_ReadCallback(line_2) == -1)
+ if ( BaseMath_ReadCallback(pt) == -1 ||
+ BaseMath_ReadCallback(line_1) == -1 ||
+ BaseMath_ReadCallback(line_2) == -1)
{
return NULL;
}
/* accept 2d verts */
- if (pt->size==3) { copy_v3_v3(pt_in, pt->vec);}
- else { pt_in[2]=0.0; copy_v2_v2(pt_in, pt->vec); }
+ if (pt->size == 3) { copy_v3_v3(pt_in, pt->vec);}
+ else { pt_in[2] = 0.0f; copy_v2_v2(pt_in, pt->vec); }
- if (line_1->size==3) { copy_v3_v3(l1, line_1->vec);}
- else { l1[2]=0.0; copy_v2_v2(l1, line_1->vec); }
+ if (line_1->size == 3) { copy_v3_v3(l1, line_1->vec);}
+ else { l1[2] = 0.0f; copy_v2_v2(l1, line_1->vec); }
- if (line_2->size==3) { copy_v3_v3(l2, line_2->vec);}
- else { l2[2]=0.0; copy_v2_v2(l2, line_2->vec); }
+ if (line_2->size == 3) { copy_v3_v3(l2, line_2->vec);}
+ else { l2[2] = 0.0f; copy_v2_v2(l2, line_2->vec); }
/* do the calculation */
- lambda= closest_to_line_v3(pt_out, pt_in, l1, l2);
+ lambda = closest_to_line_v3(pt_out, pt_in, l1, l2);
- ret= PyTuple_New(2);
+ ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, Vector_CreatePyObject(pt_out, 3, Py_NEW, NULL));
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(lambda));
return ret;
@@ -778,7 +778,7 @@ PyDoc_STRVAR(M_Geometry_intersect_point_tri_2d_doc,
" :type tri_p3: :class:`mathutils.Vector`\n"
" :rtype: int\n"
);
-static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
@@ -791,10 +791,10 @@ static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObj
return NULL;
}
- if ( BaseMath_ReadCallback(pt_vec) == -1 ||
- BaseMath_ReadCallback(tri_p1) == -1 ||
- BaseMath_ReadCallback(tri_p2) == -1 ||
- BaseMath_ReadCallback(tri_p3) == -1)
+ if ( BaseMath_ReadCallback(pt_vec) == -1 ||
+ BaseMath_ReadCallback(tri_p1) == -1 ||
+ BaseMath_ReadCallback(tri_p2) == -1 ||
+ BaseMath_ReadCallback(tri_p3) == -1)
{
return NULL;
}
@@ -805,7 +805,8 @@ static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObj
PyDoc_STRVAR(M_Geometry_intersect_point_quad_2d_doc,
".. function:: intersect_point_quad_2d(pt, quad_p1, quad_p2, quad_p3, quad_p4)\n"
"\n"
-" Takes 5 vectors (using only the x and y coordinates): one is the point and the next 4 define the quad, only the x and y are used from the vectors. Returns 1 if the point is within the quad, otherwise 0.\n"
+" Takes 5 vectors (using only the x and y coordinates): one is the point and the next 4 define the quad, \n"
+" only the x and y are used from the vectors. Returns 1 if the point is within the quad, otherwise 0.\n"
"\n"
" :arg pt: Point\n"
" :type pt: :class:`mathutils.Vector`\n"
@@ -819,7 +820,7 @@ PyDoc_STRVAR(M_Geometry_intersect_point_quad_2d_doc,
" :type quad_p4: :class:`mathutils.Vector`\n"
" :rtype: int\n"
);
-static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
@@ -833,11 +834,11 @@ static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyOb
return NULL;
}
- if ( BaseMath_ReadCallback(pt_vec) == -1 ||
- BaseMath_ReadCallback(quad_p1) == -1 ||
- BaseMath_ReadCallback(quad_p2) == -1 ||
- BaseMath_ReadCallback(quad_p3) == -1 ||
- BaseMath_ReadCallback(quad_p4) == -1)
+ if ( BaseMath_ReadCallback(pt_vec) == -1 ||
+ BaseMath_ReadCallback(quad_p1) == -1 ||
+ BaseMath_ReadCallback(quad_p2) == -1 ||
+ BaseMath_ReadCallback(quad_p3) == -1 ||
+ BaseMath_ReadCallback(quad_p4) == -1)
{
return NULL;
}
@@ -859,7 +860,7 @@ PyDoc_STRVAR(M_Geometry_distance_point_to_plane_doc,
" :type plane_no: :class:`mathutils.Vector`\n"
" :rtype: float\n"
);
-static PyObject *M_Geometry_distance_point_to_plane(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_distance_point_to_plane(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *pt, *plene_co, *plane_no;
@@ -871,9 +872,9 @@ static PyObject *M_Geometry_distance_point_to_plane(PyObject *UNUSED(self), PyOb
return NULL;
}
- if ( BaseMath_ReadCallback(pt) == -1 ||
- BaseMath_ReadCallback(plene_co) == -1 ||
- BaseMath_ReadCallback(plane_no) == -1)
+ if ( BaseMath_ReadCallback(pt) == -1 ||
+ BaseMath_ReadCallback(plene_co) == -1 ||
+ BaseMath_ReadCallback(plane_no) == -1)
{
return NULL;
}
@@ -962,7 +963,7 @@ PyDoc_STRVAR(M_Geometry_interpolate_bezier_doc,
" :return: The interpolated points\n"
" :rtype: list of :class:`mathutils.Vector`'s\n"
);
-static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject* args)
+static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject *args)
{
VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
int resolu;
@@ -971,10 +972,10 @@ static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject*
float *coord_array, *fp;
PyObject *list;
- float k1[4]= {0.0, 0.0, 0.0, 0.0};
- float h1[4]= {0.0, 0.0, 0.0, 0.0};
- float k2[4]= {0.0, 0.0, 0.0, 0.0};
- float h2[4]= {0.0, 0.0, 0.0, 0.0};
+ float k1[4] = {0.0, 0.0, 0.0, 0.0};
+ float h1[4] = {0.0, 0.0, 0.0, 0.0};
+ float k2[4] = {0.0, 0.0, 0.0, 0.0};
+ float h2[4] = {0.0, 0.0, 0.0, 0.0};
if (!PyArg_ParseTuple(args, "O!O!O!O!i:interpolate_bezier",
@@ -992,29 +993,29 @@ static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject*
return NULL;
}
- if ( BaseMath_ReadCallback(vec_k1) == -1 ||
- BaseMath_ReadCallback(vec_h1) == -1 ||
- BaseMath_ReadCallback(vec_k2) == -1 ||
- BaseMath_ReadCallback(vec_h2) == -1)
+ if ( BaseMath_ReadCallback(vec_k1) == -1 ||
+ BaseMath_ReadCallback(vec_h1) == -1 ||
+ BaseMath_ReadCallback(vec_k2) == -1 ||
+ BaseMath_ReadCallback(vec_h2) == -1)
{
return NULL;
}
- dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
+ dims = MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
- for (i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
- for (i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
- for (i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
- for (i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
+ for (i = 0; i < vec_k1->size; i++) k1[i] = vec_k1->vec[i];
+ for (i = 0; i < vec_h1->size; i++) h1[i] = vec_h1->vec[i];
+ for (i = 0; i < vec_k2->size; i++) k2[i] = vec_k2->vec[i];
+ for (i = 0; i < vec_h2->size; i++) h2[i] = vec_h2->vec[i];
- coord_array= MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
- for (i=0; i<dims; i++) {
- forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
+ coord_array = MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
+ for (i = 0; i < dims; i++) {
+ forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array + i, resolu - 1, sizeof(float)*dims);
}
- list= PyList_New(resolu);
- fp= coord_array;
- for (i=0; i<resolu; i++, fp= fp+dims) {
+ list = PyList_New(resolu);
+ fp = coord_array;
+ for (i = 0; i < resolu; i++, fp = fp + dims) {
PyList_SET_ITEM(list, i, Vector_CreatePyObject(fp, dims, Py_NEW, NULL));
}
MEM_freeN(coord_array);
@@ -1035,13 +1036,13 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
{
PyObject *tri_list; /*return this list of tri's */
PyObject *polyLine, *polyVec;
- int i, len_polylines, len_polypoints, ls_error= 0;
+ int i, len_polylines, len_polypoints, ls_error = 0;
/* display listbase */
- ListBase dispbase={NULL, NULL};
+ ListBase dispbase = {NULL, NULL};
DispList *dl;
float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
- int index, *dl_face, totpoints=0;
+ int index, *dl_face, totpoints = 0;
if (!PySequence_Check(polyLineSeq)) {
PyErr_SetString(PyExc_TypeError,
@@ -1049,10 +1050,10 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
return NULL;
}
- len_polylines= PySequence_Size(polyLineSeq);
+ len_polylines = PySequence_Size(polyLineSeq);
- for (i= 0; i < len_polylines; ++i) {
- polyLine= PySequence_GetItem(polyLineSeq, i);
+ for (i = 0; i < len_polylines; i++) {
+ polyLine = PySequence_GetItem(polyLineSeq, i);
if (!PySequence_Check(polyLine)) {
freedisplist(&dispbase);
Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
@@ -1061,8 +1062,8 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
return NULL;
}
- len_polypoints= PySequence_Size(polyLine);
- if (len_polypoints>0) { /* dont bother adding edges as polylines */
+ len_polypoints = PySequence_Size(polyLine);
+ if (len_polypoints > 0) { /* dont bother adding edges as polylines */
#if 0
if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
freedisplist(&dispbase);
@@ -1072,32 +1073,32 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
return NULL;
}
#endif
- dl= MEM_callocN(sizeof(DispList), "poly disp");
+ dl = MEM_callocN(sizeof(DispList), "poly disp");
BLI_addtail(&dispbase, dl);
- dl->type= DL_INDEX3;
- dl->nr= len_polypoints;
- dl->type= DL_POLY;
- dl->parts= 1; /* no faces, 1 edge loop */
- dl->col= 0; /* no material */
- dl->verts= fp= MEM_callocN(sizeof(float)*3*len_polypoints, "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
-
- for (index= 0; index<len_polypoints; ++index, fp+=3) {
- polyVec= PySequence_GetItem(polyLine, index);
+ dl->type = DL_INDEX3;
+ dl->nr = len_polypoints;
+ dl->type = DL_POLY;
+ dl->parts = 1; /* no faces, 1 edge loop */
+ dl->col = 0; /* no material */
+ dl->verts = fp = MEM_callocN(sizeof(float) * 3 * len_polypoints, "dl verts");
+ dl->index = MEM_callocN(sizeof(int) * 3 * len_polypoints, "dl index");
+
+ for (index = 0; index < len_polypoints; index++, fp += 3) {
+ polyVec = PySequence_GetItem(polyLine, index);
if (VectorObject_Check(polyVec)) {
if (BaseMath_ReadCallback((VectorObject *)polyVec) == -1)
- ls_error= 1;
+ ls_error = 1;
- fp[0]= ((VectorObject *)polyVec)->vec[0];
- fp[1]= ((VectorObject *)polyVec)->vec[1];
+ fp[0] = ((VectorObject *)polyVec)->vec[0];
+ fp[1] = ((VectorObject *)polyVec)->vec[1];
if (((VectorObject *)polyVec)->size > 2)
- fp[2]= ((VectorObject *)polyVec)->vec[2];
+ fp[2] = ((VectorObject *)polyVec)->vec[2];
else
- fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
+ fp[2] = 0.0f; /* if its a 2d vector then set the z to be zero */
}
else {
- ls_error= 1;
+ ls_error = 1;
}
totpoints++;
@@ -1120,9 +1121,9 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
/* The faces are stored in a new DisplayList
thats added to the head of the listbase */
- dl= dispbase.first;
+ dl = dispbase.first;
- tri_list= PyList_New(dl->parts);
+ tri_list = PyList_New(dl->parts);
if (!tri_list) {
freedisplist(&dispbase);
PyErr_SetString(PyExc_RuntimeError,
@@ -1130,11 +1131,11 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
return NULL;
}
- index= 0;
- dl_face= dl->index;
+ index = 0;
+ dl_face = dl->index;
while (index < dl->parts) {
PyList_SET_ITEM(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]));
- dl_face+= 3;
+ dl_face += 3;
index++;
}
freedisplist(&dispbase);
@@ -1142,7 +1143,7 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
else {
/* no points, do this so scripts dont barf */
freedisplist(&dispbase); /* possible some dl was allocated */
- tri_list= PyList_New(0);
+ tri_list = PyList_New(0);
}
return tri_list;
@@ -1163,13 +1164,13 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
return -1;
}
- len= PyList_GET_SIZE(value);
+ len = PyList_GET_SIZE(value);
- (*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box");
+ *boxarray = MEM_mallocN(len * sizeof(boxPack), "boxPack box");
- for (i= 0; i < len; i++) {
- list_item= PyList_GET_ITEM(value, i);
+ for (i = 0; i < len; i++) {
+ list_item = PyList_GET_ITEM(value, i);
if (!PyList_Check(list_item) || PyList_GET_SIZE(list_item) < 4) {
MEM_freeN(*boxarray);
PyErr_SetString(PyExc_TypeError,
@@ -1177,14 +1178,14 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
return -1;
}
- box= (*boxarray)+i;
+ box = (*boxarray) + i;
- item_1= PyList_GET_ITEM(list_item, 2);
- item_2= PyList_GET_ITEM(list_item, 3);
+ item_1 = PyList_GET_ITEM(list_item, 2);
+ item_2 = PyList_GET_ITEM(list_item, 3);
- box->w= (float)PyFloat_AsDouble(item_1);
- box->h= (float)PyFloat_AsDouble(item_2);
- box->index= i;
+ box->w = (float)PyFloat_AsDouble(item_1);
+ box->h = (float)PyFloat_AsDouble(item_2);
+ box->index = i;
/* accounts for error case too and overwrites with own error */
if (box->w < 0.0f || box->h < 0.0f) {
@@ -1206,11 +1207,11 @@ static void boxPack_ToPyObject(PyObject *value, boxPack **boxarray)
PyObject *list_item;
boxPack *box;
- len= PyList_GET_SIZE(value);
+ len = PyList_GET_SIZE(value);
- for (i= 0; i < len; i++) {
- box= (*boxarray)+i;
- list_item= PyList_GET_ITEM(value, box->index);
+ for (i = 0; i < len; i++) {
+ box = (*boxarray) + i;
+ list_item = PyList_GET_ITEM(value, box->index);
PyList_SET_ITEM(list_item, 0, PyFloat_FromDouble(box->x));
PyList_SET_ITEM(list_item, 1, PyFloat_FromDouble(box->y));
}
@@ -1229,7 +1230,7 @@ PyDoc_STRVAR(M_Geometry_box_pack_2d_doc,
);
static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist)
{
- float tot_width= 0.0f, tot_height= 0.0f;
+ float tot_width = 0.0f, tot_height = 0.0f;
Py_ssize_t len;
PyObject *ret;
@@ -1240,9 +1241,9 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
return NULL;
}
- len= PyList_GET_SIZE(boxlist);
+ len = PyList_GET_SIZE(boxlist);
if (len) {
- boxPack *boxarray= NULL;
+ boxPack *boxarray = NULL;
if (boxPack_FromPyObject(boxlist, &boxarray) == -1) {
return NULL; /* exception set */
}
@@ -1253,7 +1254,7 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
boxPack_ToPyObject(boxlist, &boxarray);
}
- ret= PyTuple_New(2);
+ ret = PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(tot_width));
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(tot_width));
return ret;
@@ -1262,7 +1263,7 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
#endif /* MATH_STANDALONE */
-static PyMethodDef M_Geometry_methods[]= {
+static PyMethodDef M_Geometry_methods[] = {
{"intersect_ray_tri", (PyCFunction) M_Geometry_intersect_ray_tri, METH_VARARGS, M_Geometry_intersect_ray_tri_doc},
{"intersect_point_line", (PyCFunction) M_Geometry_intersect_point_line, METH_VARARGS, M_Geometry_intersect_point_line_doc},
{"intersect_point_tri_2d", (PyCFunction) M_Geometry_intersect_point_tri_2d, METH_VARARGS, M_Geometry_intersect_point_tri_2d_doc},
@@ -1285,7 +1286,7 @@ static PyMethodDef M_Geometry_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyModuleDef M_Geometry_module_def= {
+static struct PyModuleDef M_Geometry_module_def = {
PyModuleDef_HEAD_INIT,
"mathutils.geometry", /* m_name */
M_Geometry_doc, /* m_doc */
@@ -1300,6 +1301,6 @@ static struct PyModuleDef M_Geometry_module_def= {
/*----------------------------MODULE INIT-------------------------*/
PyMODINIT_FUNC PyInit_mathutils_geometry(void)
{
- PyObject *submodule= PyModule_Create(&M_Geometry_module_def);
+ PyObject *submodule = PyModule_Create(&M_Geometry_module_def);
return submodule;
}
diff --git a/source/blender/python/mathutils/mathutils_noise.c b/source/blender/python/mathutils/mathutils_noise.c
index bd490d62e94..fceff965fcb 100644
--- a/source/blender/python/mathutils/mathutils_noise.c
+++ b/source/blender/python/mathutils/mathutils_noise.c
@@ -199,18 +199,18 @@ static float frand(void)
/* Fills an array of length size with random numbers in the range (-1, 1)*/
static void rand_vn(float *array_tar, const int size)
{
- float *array_pt= array_tar + (size-1);
- int i= size;
- while(i--) { *(array_pt--) = 2.0f * frand() - 1.0f; }
+ float *array_pt = array_tar + (size-1);
+ int i = size;
+ while (i--) { *(array_pt--) = 2.0f * frand() - 1.0f; }
}
/* Fills an array of length 3 with noise values */
static void noise_vector(float x, float y, float z, int nb, float v[3])
{
/* Simply evaluate noise at 3 different positions */
- v[0]= (float)(2.0f * BLI_gNoise(1.f, x + 9.321f, y - 1.531f, z - 7.951f, 0, nb) - 1.0f);
- v[1]= (float)(2.0f * BLI_gNoise(1.f, x, y, z, 0, nb) - 1.0f);
- v[2]= (float)(2.0f * BLI_gNoise(1.f, x + 6.327f, y + 0.1671f, z - 2.672f, 0, nb) - 1.0f);
+ v[0] = (float)(2.0f * BLI_gNoise(1.f, x + 9.321f, y - 1.531f, z - 7.951f, 0, nb) - 1.0f);
+ v[1] = (float)(2.0f * BLI_gNoise(1.f, x, y, z, 0, nb) - 1.0f);
+ v[2] = (float)(2.0f * BLI_gNoise(1.f, x + 6.327f, y + 0.1671f, z - 2.672f, 0, nb) - 1.0f);
}
/* Returns a turbulence value for a given position (x, y, z) */
@@ -301,9 +301,9 @@ PyDoc_STRVAR(M_Noise_random_unit_vector_doc,
);
static PyObject *M_Noise_random_unit_vector(PyObject *UNUSED(self), PyObject *args)
{
- float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
- float norm= 2.0f;
- int size= 3;
+ float vec[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float norm = 2.0f;
+ int size = 3;
if (!PyArg_ParseTuple(args, "|i:random_vector", &size))
return NULL;
@@ -313,9 +313,9 @@ static PyObject *M_Noise_random_unit_vector(PyObject *UNUSED(self), PyObject *ar
return NULL;
}
- while (norm==0.0f || norm>=1.0f) {
+ while (norm == 0.0f || norm >= 1.0f) {
rand_vn(vec, size);
- norm= normalize_vn(vec, size);
+ norm = normalize_vn(vec, size);
}
return Vector_CreatePyObject(vec, size, Py_NEW, NULL);
@@ -384,7 +384,7 @@ static PyObject *M_Noise_noise(PyObject *UNUSED(self), PyObject *args)
{
PyObject *value;
float vec[3];
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "O|i:noise", &value, &nb))
return NULL;
@@ -410,7 +410,7 @@ static PyObject *M_Noise_noise_vector(PyObject *UNUSED(self), PyObject *args)
{
PyObject *value;
float vec[3], r_vec[3];
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "O|i:noise_vector", &value, &nb))
return NULL;
@@ -447,8 +447,8 @@ static PyObject *M_Noise_turbulence(PyObject *UNUSED(self), PyObject *args)
{
PyObject *value;
float vec[3];
- int oct, hd, nb= 1;
- float as= 0.5f, fs= 2.0f;
+ int oct, hd, nb = 1;
+ float as = 0.5f, fs = 2.0f;
if (!PyArg_ParseTuple(args, "Oii|iff:turbulence", &value, &oct, &hd, &nb, &as, &fs))
return NULL;
@@ -483,8 +483,8 @@ static PyObject *M_Noise_turbulence_vector(PyObject *UNUSED(self), PyObject *arg
{
PyObject *value;
float vec[3], r_vec[3];
- int oct, hd, nb= 1;
- float as =0.5f, fs= 2.0f;
+ int oct, hd, nb = 1;
+ float as =0.5f, fs = 2.0f;
if (!PyArg_ParseTuple(args, "Oii|iff:turbulence_vector", &value, &oct, &hd, &nb, &as, &fs))
return NULL;
@@ -519,7 +519,7 @@ static PyObject *M_Noise_fractal(PyObject *UNUSED(self), PyObject *args)
PyObject *value;
float vec[3];
float H, lac, oct;
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "Offf|i:fractal", &value, &H, &lac, &oct, &nb))
return NULL;
@@ -553,7 +553,7 @@ static PyObject *M_Noise_multi_fractal(PyObject *UNUSED(self), PyObject *args)
PyObject *value;
float vec[3];
float H, lac, oct;
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "Offf|i:multi_fractal", &value, &H, &lac, &oct, &nb))
return NULL;
@@ -585,7 +585,7 @@ static PyObject *M_Noise_variable_lacunarity(PyObject *UNUSED(self), PyObject *a
PyObject *value;
float vec[3];
float d;
- int nt1= 1, nt2= 1;
+ int nt1 = 1, nt2 = 1;
if (!PyArg_ParseTuple(args, "Of|ii:variable_lacunarity", &value, &d, &nt1, &nt2))
return NULL;
@@ -621,7 +621,7 @@ static PyObject *M_Noise_hetero_terrain(PyObject *UNUSED(self), PyObject *args)
PyObject *value;
float vec[3];
float H, lac, oct, ofs;
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "Offff|i:hetero_terrain", &value, &H, &lac, &oct, &ofs, &nb))
return NULL;
@@ -659,7 +659,7 @@ static PyObject *M_Noise_hybrid_multi_fractal(PyObject *UNUSED(self), PyObject *
PyObject *value;
float vec[3];
float H, lac, oct, ofs, gn;
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "Offfff|i:hybrid_multi_fractal", &value, &H, &lac, &oct, &ofs, &gn, &nb))
return NULL;
@@ -697,7 +697,7 @@ static PyObject *M_Noise_ridged_multi_fractal(PyObject *UNUSED(self), PyObject *
PyObject *value;
float vec[3];
float H, lac, oct, ofs, gn;
- int nb= 1;
+ int nb = 1;
if (!PyArg_ParseTuple(args, "Offfff|i:ridged_multi_fractal", &value, &H, &lac, &oct, &ofs, &gn, &nb))
return NULL;
@@ -720,7 +720,7 @@ PyDoc_STRVAR(M_Noise_voronoi_doc,
" :arg exponent: The exponent for Minkovsky distance metric.\n"
" :type exponent: float\n"
" :return: A list of distances to the four closest features and their locations.\n"
-" :rtype: [list of four floats, list of four :class:`mathutils.Vector`s]\n"
+" :rtype: list of four floats, list of four :class:`mathutils.Vector`s\n"
);
static PyObject *M_Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
{
@@ -728,8 +728,8 @@ static PyObject *M_Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
PyObject *list;
float vec[3];
float da[4], pa[12];
- int dtype= 0;
- float me= 2.5f; /* default minkovsky exponent */
+ int dtype = 0;
+ float me = 2.5f; /* default minkovsky exponent */
int i;
@@ -739,12 +739,12 @@ static PyObject *M_Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
if (mathutils_array_parse(vec, 3, 3, value, "voronoi: invalid 'position' arg") == -1)
return NULL;
- list= PyList_New(4);
+ list = PyList_New(4);
voronoi(vec[0], vec[1], vec[2], da, pa, me, dtype);
- for (i=0; i<4; i++) {
- PyList_SET_ITEM(list, i, Vector_CreatePyObject(pa + 3*i, 3, Py_NEW, NULL));
+ for (i = 0; i < 4; i++) {
+ PyList_SET_ITEM(list, i, Vector_CreatePyObject(pa + 3 * i, 3, Py_NEW, NULL));
}
return Py_BuildValue("[[ffff]O]", da[0], da[1], da[2], da[3], list);
@@ -841,11 +841,11 @@ PyMODINIT_FUNC PyInit_mathutils_noise(void)
/* use current time as seed for random number generator by default */
setRndSeed(0);
- PyModule_AddObject(submodule, "types", (item_types=PyInit_mathutils_noise_types()));
+ PyModule_AddObject(submodule, "types", (item_types = PyInit_mathutils_noise_types()));
PyDict_SetItemString(PyThreadState_GET()->interp->modules, "noise.types", item_types);
Py_INCREF(item_types);
- PyModule_AddObject(submodule, "distance_metrics", (item_metrics=PyInit_mathutils_noise_metrics()));
+ PyModule_AddObject(submodule, "distance_metrics", (item_metrics = PyInit_mathutils_noise_metrics()));
PyDict_SetItemString(PyThreadState_GET()->interp->modules, "noise.distance_metrics", item_metrics);
Py_INCREF(item_metrics);
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m
index b26781d8026..365a06c7cd8 100644
--- a/source/blender/quicktime/apple/qtkit_export.m
+++ b/source/blender/quicktime/apple/qtkit_export.m
@@ -106,23 +106,29 @@ static struct QuicktimeExport *qtexport;
/* Video codec */
static QuicktimeCodecTypeDesc qtVideoCodecList[] = {
{kRawCodecType, 1, "Uncompressed"},
- {kJPEGCodecType, 2, "JPEG"},
- {kMotionJPEGACodecType, 3, "M-JPEG A"},
- {kMotionJPEGBCodecType, 4, "M-JPEG B"},
- {kDVCPALCodecType, 5, "DV PAL"},
- {kDVCNTSCCodecType, 6, "DV/DVCPRO NTSC"},
- {kDVCPROHD720pCodecType, 7, "DVCPRO HD 720p"},
- {kDVCPROHD1080i50CodecType, 8, "DVCPRO HD 1080i50"},
- {kDVCPROHD1080i60CodecType, 9, "DVCPRO HD 1080i60"},
- {kMPEG4VisualCodecType, 10, "MPEG4"},
- {kH263CodecType, 11, "H.263"},
- {kH264CodecType, 12, "H.264"},
- {kAnimationCodecType, 13, "Animation"},
+ {k422YpCbCr8CodecType, 2, "Uncompressed 8-bit 4:2:2"},
+ {k422YpCbCr10CodecType, 3, "Uncompressed 10-bit 4:2:2"},
+ {kComponentVideoCodecType, 4, "Component Video"},
+ {kPixletCodecType, 5, "Pixlet"},
+ {kPNGCodecType, 6, "PNG"},
+ {kJPEGCodecType, 7, "JPEG"},
+ {kMotionJPEGACodecType, 8, "M-JPEG A"},
+ {kMotionJPEGBCodecType, 9, "M-JPEG B"},
+ {kDVCPALCodecType, 10, "DV PAL"},
+ {kDVCNTSCCodecType, 11, "DV/DVCPRO NTSC"},
+ {kDVCPROHD720pCodecType, 12, "DVCPRO HD 720p"},
+ {kDVCPROHD1080i50CodecType, 13, "DVCPRO HD 1080i50"},
+ {kDVCPROHD1080i60CodecType, 14, "DVCPRO HD 1080i60"},
+ {kMPEG4VisualCodecType, 15, "MPEG4"},
+ {kH263CodecType, 16, "H.263"},
+ {kH264CodecType, 17, "H.264"},
+ {kAnimationCodecType, 18, "Animation"},
{0,0,NULL}};
-static int qtVideoCodecCount = 13;
+static int qtVideoCodecCount = 18;
-int quicktime_get_num_videocodecs() {
+int quicktime_get_num_videocodecs()
+{
return qtVideoCodecCount;
}
@@ -133,7 +139,8 @@ QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue) {
return NULL;
}
-int quicktime_rnatmpvalue_from_videocodectype(int codecType) {
+int quicktime_rnatmpvalue_from_videocodectype(int codecType)
+{
int i;
for (i=0;i<qtVideoCodecCount;i++) {
if (qtVideoCodecList[i].codecType == codecType)
@@ -143,7 +150,8 @@ int quicktime_rnatmpvalue_from_videocodectype(int codecType) {
return 0;
}
-int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue) {
+int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue)
+{
int i;
for (i=0;i<qtVideoCodecCount;i++) {
if (qtVideoCodecList[i].rnatmpvalue == rnatmpvalue)
@@ -163,7 +171,8 @@ static QuicktimeCodecTypeDesc qtAudioCodecList[] = {
static int qtAudioCodecCount = 4;
-int quicktime_get_num_audiocodecs() {
+int quicktime_get_num_audiocodecs()
+{
return qtAudioCodecCount;
}
@@ -174,7 +183,8 @@ QuicktimeCodecTypeDesc* quicktime_get_audiocodecType_desc(int indexValue) {
return NULL;
}
-int quicktime_rnatmpvalue_from_audiocodectype(int codecType) {
+int quicktime_rnatmpvalue_from_audiocodectype(int codecType)
+{
int i;
for (i=0;i<qtAudioCodecCount;i++) {
if (qtAudioCodecList[i].codecType == codecType)
@@ -184,7 +194,8 @@ int quicktime_rnatmpvalue_from_audiocodectype(int codecType) {
return 0;
}
-int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue) {
+int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue)
+{
int i;
for (i=0;i<qtAudioCodecCount;i++) {
if (qtAudioCodecList[i].rnatmpvalue == rnatmpvalue)
@@ -195,7 +206,8 @@ int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue) {
}
-static NSString *stringWithCodecType(int codecType) {
+static NSString *stringWithCodecType(int codecType)
+{
char str[5];
*((int*)str) = EndianU32_NtoB(codecType);
@@ -204,7 +216,8 @@ static NSString *stringWithCodecType(int codecType) {
return [NSString stringWithCString:str encoding:NSASCIIStringEncoding];
}
-void makeqtstring (RenderData *rd, char *string) {
+void makeqtstring (RenderData *rd, char *string)
+{
char txt[64];
strcpy(string, rd->pic);
@@ -213,12 +226,13 @@ void makeqtstring (RenderData *rd, char *string) {
BLI_make_existing_file(string);
if (BLI_strcasecmp(string + strlen(string) - 4, ".mov")) {
- sprintf(txt, "%04d_%04d.mov", (rd->sfra) , (rd->efra) );
+ sprintf(txt, "%04d-%04d.mov", (rd->sfra) , (rd->efra) );
strcat(string, txt);
}
}
-void filepath_qt(char *string, RenderData *rd) {
+void filepath_qt(char *string, RenderData *rd)
+{
if (string==NULL) return;
strcpy(string, rd->pic);
@@ -658,7 +672,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
}
else {
//Error getting audio packets
- BKE_reportf(reports, RPT_ERROR, "Unable to get further audio packets from frame %i, error = 0x%x",qtexport->audioTotalExportedFrames,err);
+ BKE_reportf(reports, RPT_ERROR, "Unable to get further audio packets from frame %i, error = 0x%x",(int)qtexport->audioTotalExportedFrames,err);
break;
}
@@ -774,12 +788,13 @@ void end_qt(void)
}
-void free_qtcomponentdata(void) {
+void free_qtcomponentdata(void)
+{
}
-void quicktime_verify_image_type(RenderData *rd)
+void quicktime_verify_image_type(RenderData *rd, ImageFormatData *imf)
{
- if (rd->imtype == R_IMF_IMTYPE_QUICKTIME) {
+ if (imf->imtype == R_IMF_IMTYPE_QUICKTIME) {
if ((rd->qtcodecsettings.codecType<= 0) ||
(rd->qtcodecsettings.codecSpatialQuality <0) ||
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 4307529002c..4c2bcee0150 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -112,7 +112,8 @@ int anim_is_quicktime (const char *name)
}
-void free_anim_quicktime (struct anim *anim) {
+void free_anim_quicktime (struct anim *anim)
+{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (anim == NULL) return;
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index ffda20ead7f..101fcc0a732 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -148,7 +148,8 @@ static QuicktimeCodecTypeDesc qtVideoCodecList[] = {
static int qtVideoCodecCount = 12;
-int quicktime_get_num_videocodecs() {
+int quicktime_get_num_videocodecs()
+{
return qtVideoCodecCount;
}
@@ -159,7 +160,8 @@ QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue) {
return NULL;
}
-int quicktime_rnatmpvalue_from_videocodectype(int codecType) {
+int quicktime_rnatmpvalue_from_videocodectype(int codecType)
+{
int i;
for (i=0;i<qtVideoCodecCount;i++) {
if (qtVideoCodecList[i].codecType == codecType)
@@ -169,7 +171,8 @@ int quicktime_rnatmpvalue_from_videocodectype(int codecType) {
return 0;
}
-int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue) {
+int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue)
+{
int i;
for (i=0;i<qtVideoCodecCount;i++) {
if (qtVideoCodecList[i].rnatmpvalue == rnatmpvalue)
@@ -496,7 +499,8 @@ static void QT_EndAddVideoSamplesToMedia (void)
}
-void filepath_qt(char *string, RenderData *rd) {
+void filepath_qt(char *string, RenderData *rd)
+{
char txt[64];
if (string==0) return;
@@ -507,13 +511,14 @@ void filepath_qt(char *string, RenderData *rd) {
BLI_make_existing_file(string);
if (BLI_strcasecmp(string + strlen(string) - 4, ".mov")) {
- sprintf(txt, "%04d_%04d.mov", (rd->sfra) , (rd->efra) );
+ sprintf(txt, "%04d-%04d.mov", (rd->sfra) , (rd->efra) );
strcat(string, txt);
}
}
-int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports) {
+int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, ReportList *reports)
+{
OSErr err = noErr;
char name[2048];
@@ -599,13 +604,15 @@ int start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty, R
}
-int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports) {
+int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports)
+{
QT_DoAddVideoSamplesToMedia(frame, pixels, rectx, recty, reports);
return 1;
}
-void end_qt(void) {
+void end_qt(void)
+{
OSErr err = noErr;
short resId = movieInDataForkResID;
@@ -639,7 +646,8 @@ void end_qt(void) {
}
-void free_qtcomponentdata(void) {
+void free_qtcomponentdata(void)
+{
if(qtdata) {
if(qtdata->theComponent) CloseComponent(qtdata->theComponent);
MEM_freeN(qtdata);
@@ -687,9 +695,9 @@ static void check_renderbutton_framerate(RenderData *rd, ReportList *reports)
}
}
-void quicktime_verify_image_type(RenderData *rd)
+void quicktime_verify_image_type(RenderData *rd, ImageFormatData *imf)
{
- if (rd->imtype == R_IMF_IMTYPE_QUICKTIME) {
+ if (imf->imtype == R_IMF_IMTYPE_QUICKTIME) {
if ((rd->qtcodecsettings.codecType== 0) ||
(rd->qtcodecsettings.codecSpatialQuality <0) ||
(rd->qtcodecsettings.codecSpatialQuality > 100)) {
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index d7ef371873a..b58b4a646e2 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -249,7 +249,8 @@ int anim_is_quicktime (const char *name)
}
-void free_anim_quicktime (struct anim *anim) {
+void free_anim_quicktime (struct anim *anim)
+{
if (anim == NULL) return;
if (anim->qtime == NULL) return;
diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h
index 517e0c8c0f6..f64521bda35 100644
--- a/source/blender/quicktime/quicktime_export.h
+++ b/source/blender/quicktime/quicktime_export.h
@@ -61,7 +61,7 @@ void end_qt(void);
void filepath_qt(char *string, struct RenderData *rd);
/*RNA helper functions */
-void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed
+void quicktime_verify_image_type(struct RenderData *rd, struct ImageFormatData *imf); //used by RNA for defaults values init, if needed
/*Video codec type*/
int quicktime_get_num_videocodecs(void);
QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue);
diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp
index 20202319d44..14b4a7bcf9f 100644
--- a/source/blender/render/intern/raytrace/rayobject_octree.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp
@@ -978,7 +978,7 @@ static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
}
xo=ocx1; yo=ocy1; zo=ocz1;
- labdao= ddalabda= MIN3(labdax,labday,labdaz);
+ ddalabda= MIN3(labdax,labday,labdaz);
vec2[0]= ox1;
vec2[1]= oy1;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index a3c452c7ea7..434e596e739 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -592,7 +592,7 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen
{
MemArena *arena= NULL;
VertexTangent **vtangents= NULL;
- int a, iCalcNewMethod;
+ int a;
if(do_nmap_tangent) {
arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "nmap tangent arena");
@@ -680,8 +680,7 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen
}
}
- iCalcNewMethod = 1;
- if(iCalcNewMethod!=0 && do_nmap_tangent!=0)
+ if(do_nmap_tangent!=0)
{
SRenderMeshToTangent mesh2tangent;
SMikkTSpaceContext sContext;
@@ -701,11 +700,9 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen
sInterface.m_getNormal = GetNormal;
sInterface.m_setTSpaceBasic = SetTSpace;
- // 0 if failed
- iCalcNewMethod = genTangSpaceDefault(&sContext);
+ genTangSpaceDefault(&sContext);
}
-
if(arena)
BLI_memarena_free(arena);
if(vtangents)
@@ -1068,7 +1065,6 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
mul_v3_fl(cross, width);
}
- else width= 1.0f;
if(ma->mode & MA_TANGENT_STR)
flag= R_SMOOTH|R_TANGENT;
@@ -1690,14 +1686,14 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
/* 2.5 setup matrices */
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat); /* need to be that way, for imat texture */
copy_m3_m4(nmat, ob->imat);
transpose_m3(nmat);
if(psys->flag & PSYS_USE_IMAT) {
/* psys->imat is the original emitter's inverse matrix, ob->obmat is the duplicated object's matrix */
- mul_m4_m4m4(duplimat, psys->imat, ob->obmat);
+ mult_m4_m4m4(duplimat, ob->obmat, psys->imat);
use_duplimat = 1;
}
@@ -1718,7 +1714,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
sd.adapt_angle = cosf(DEG2RADF((float)part->adapt_angle));
}
- if(re->r.renderer==R_INTERN && part->draw&PART_DRAW_REN_STRAND) {
+ if (part->draw & PART_DRAW_REN_STRAND) {
strandbuf= RE_addStrandBuffer(obr, (totpart+totchild)*(path_nbr+1));
strandbuf->ma= ma;
strandbuf->lay= ob->lay;
@@ -2134,7 +2130,7 @@ static void make_render_halos(Render *re, ObjectRen *obr, Mesh *UNUSED(me), int
float vec[3], hasize, mat[4][4], imat[3][3];
int a, ok, seed= ma->seed1;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
copy_m3_m4(imat, ob->imat);
re->flag |= R_HALO;
@@ -2391,7 +2387,7 @@ static void do_displacement(Render *re, ObjectRen *obr, float mat[][4], float im
/* Object Size with parenting */
obt=obr->ob;
while(obt){
- mul_v3_v3v3(temp, obt->size, obt->dsize);
+ mul_v3_v3v3(temp, obt->size, obt->dscale);
scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
obt=obt->parent;
}
@@ -2429,7 +2425,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
if (ob!=find_basis_mball(re->scene, ob))
return;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
copy_m3_m4(imat, ob->imat);
@@ -2802,7 +2798,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset)
nu= cu->nurb.first;
if(nu==0) return;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
/* material array */
@@ -2871,7 +2867,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
dl= disp.first;
if(dl==NULL) return;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
/* material array */
@@ -3060,17 +3056,19 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
/* ------------------------------------------------------------------------- */
struct edgesort {
- int v1, v2;
+ unsigned int v1, v2;
int f;
- int i1, i2;
+ unsigned int i1, i2;
};
/* edges have to be added with lowest index first for sorting */
-static void to_edgesort(struct edgesort *ed, int i1, int i2, int v1, int v2, int f)
+static void to_edgesort(struct edgesort *ed,
+ unsigned int i1, unsigned int i2,
+ unsigned int v1, unsigned int v2, int f)
{
- if(v1>v2) {
- SWAP(int, v1, v2);
- SWAP(int, i1, i2);
+ if (v1 > v2) {
+ SWAP(unsigned int, v1, v2);
+ SWAP(unsigned int, i1, i2);
}
ed->v1= v1;
@@ -3256,7 +3254,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
me= ob->data;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
copy_m3_m4(imat, ob->imat);
negative_scale= is_negative_m4(mat);
@@ -3599,7 +3597,7 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
/* matrix: combination of inverse view and lampmat */
/* calculate again: the ortho-render has no correct viewinv */
invert_m4_m4(viewinv, re->viewmat);
- mul_m4_m4m4(shb->viewmat, viewinv, shb->winmat);
+ mult_m4_m4m4(shb->viewmat, shb->winmat, viewinv);
/* projection */
shb->d= lar->clipsta;
@@ -3677,7 +3675,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
BLI_addtail(&re->lampren, lar);
go->lampren= lar;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
copy_m3_m4(lar->mat, mat);
@@ -3872,8 +3870,9 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
}
}
}
- /* yafray: shadow flag should not be cleared, only used with internal renderer */
- if (re->r.renderer==R_INTERN) {
+
+ /* old code checked for internal render (aka not yafray) */
+ {
/* to make sure we can check ray shadow easily in the render code */
if(lar->mode & LA_SHAD_RAY) {
if( (re->r.mode & R_RAYTRACE)==0)
@@ -4371,7 +4370,7 @@ static void find_dupli_instances(Render *re, ObjectRen *obr)
float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
int first = 1;
- mul_m4_m4m4(obmat, obr->obmat, re->viewmat);
+ mult_m4_m4m4(obmat, re->viewmat, obr->obmat);
invert_m4_m4(imat, obmat);
/* for objects instanced by dupliverts/faces/particles, we go over the
@@ -4384,7 +4383,7 @@ static void find_dupli_instances(Render *re, ObjectRen *obr)
/* compute difference between object matrix and
* object matrix with dupli transform, in viewspace */
copy_m4_m4(obimat, obi->mat);
- mul_m4_m4m4(obi->mat, imat, obimat);
+ mult_m4_m4m4(obi->mat, obimat, imat);
copy_m3_m4(nmat, obi->mat);
invert_m3_m3(obi->nmat, nmat);
@@ -4406,7 +4405,7 @@ static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRe
{
float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
- mul_m4_m4m4(obmat, obr->obmat, re->viewmat);
+ mult_m4_m4m4(obmat, re->viewmat, obr->obmat);
invert_m4_m4(imat, obmat);
obi->obr= obr;
@@ -4414,7 +4413,7 @@ static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRe
/* compute difference between object matrix and
* object matrix with dupli transform, in viewspace */
copy_m4_m4(obimat, obi->mat);
- mul_m4_m4m4(obi->mat, imat, obimat);
+ mult_m4_m4m4(obi->mat, obimat, imat);
copy_m3_m4(nmat, obi->mat);
invert_m3_m3(obi->nmat, nmat);
@@ -4611,7 +4610,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject
else if(render_object_type(ob->type))
add_render_object(re, ob, par, dob, timeoffset);
else {
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat, mat);
}
@@ -4857,7 +4856,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* See bug: [#28744] - campbell */
for(ob= re->main->object.first; ob; ob= ob->id.next) {
/* imat objects has to be done here, since displace can have texture using Object map-input */
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
invert_m4_m4(ob->imat_ren, mat);
copy_m4_m4(ob->imat, ob->imat_ren);
/* each object should only be rendered once */
@@ -4929,7 +4928,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* this is a duplivert/face/particle, or it is a non-animated object in
* a dupligroup that has already been created before */
if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, 0))) {
- mul_m4_m4m4(mat, dob->mat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, dob->mat);
obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, 0, mat, obd->lay);
/* fill in instance variables for texturing */
@@ -4956,7 +4955,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
for(psys=obd->particlesystem.first; psys; psys=psys->next) {
if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, psysindex))) {
if(obi == NULL)
- mul_m4_m4m4(mat, dob->mat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, dob->mat);
obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, psysindex++, mat, obd->lay);
set_dupli_tex_mat(re, obi, dob);
@@ -5109,10 +5108,9 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
/* SHADOW BUFFER */
threaded_makeshadowbufs(re);
-
- /* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */
- /* although radio mode could be useful at some point, later */
- if (re->r.renderer==R_INTERN) {
+
+ /* old code checked for internal render (aka not yafray) */
+ {
/* raytree */
if(!re->test_break(re->tbh)) {
if(re->r.mode & R_RAYTRACE) {
@@ -5137,14 +5135,12 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
/* Occlusion */
if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
- if(re->r.renderer==R_INTERN)
- if(re->r.mode & R_SHADOW)
- make_occ_tree(re);
+ if(re->r.mode & R_SHADOW)
+ make_occ_tree(re);
/* SSS */
if((re->r.mode & R_SSS) && !re->test_break(re->tbh))
- if(re->r.renderer==R_INTERN)
- make_sss_tree(re);
+ make_sss_tree(re);
if(!re->test_break(re->tbh))
if(re->r.mode & R_RAYTRACE)
@@ -5314,7 +5310,7 @@ static float *calculate_strandsurface_speedvectors(Render *re, ObjectInstanceRen
int a;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(winmat, obi->mat, re->winmat);
+ mult_m4_m4m4(winmat, re->winmat, obi->mat);
else
copy_m4_m4(winmat, re->winmat);
@@ -5351,7 +5347,7 @@ static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *ve
int a, *face, *index;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(winmat, obi->mat, re->winmat);
+ mult_m4_m4m4(winmat, re->winmat, obi->mat);
else
copy_m4_m4(winmat, re->winmat);
@@ -5445,7 +5441,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
velarray = fss->meshVelocities;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(winmat, obi->mat, re->winmat);
+ mult_m4_m4m4(winmat, re->winmat, obi->mat);
else
copy_m4_m4(winmat, re->winmat);
@@ -5535,7 +5531,7 @@ static void copy_dbase_object_vectors(Render *re, ListBase *lb)
vec= obilb->vectors= MEM_mallocN(2*sizeof(float)*totvector, "vector array");
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(winmat, obi->mat, re->winmat);
+ mult_m4_m4m4(winmat, re->winmat, obi->mat);
else
copy_m4_m4(winmat, re->winmat);
@@ -5863,7 +5859,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
CD_CALLOC, NULL, me->totvert);
where_is_object(scene, ob);
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, ob->obmat);
ms= me->msticky;
for(a=0; a<me->totvert; a++, ms++, mvert++) {
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 3512ffa865b..a45bb63ff06 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -263,7 +263,7 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
/* append or set matrix depending on dupli */
if(obi->flag & R_DUPLI_TRANSFORMED) {
copy_m4_m4(tmpmat, obi->mat);
- mul_m4_m4m4(obi->mat, tmpmat, tmat);
+ mult_m4_m4m4(obi->mat, tmat, tmpmat);
}
else if(mode==1)
copy_m4_m4(obi->mat, tmat);
@@ -312,10 +312,10 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
if(lar->shb) {
if(mode==1) {
invert_m4_m4(pmat, mat);
- mul_m4_m4m4(smat, pmat, lar->shb->viewmat);
- mul_m4_m4m4(lar->shb->persmat, smat, lar->shb->winmat);
+ mult_m4_m4m4(smat, lar->shb->viewmat, pmat);
+ mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, smat);
}
- else mul_m4_m4m4(lar->shb->persmat, lar->shb->viewmat, lar->shb->winmat);
+ else mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, lar->shb->viewmat);
}
}
@@ -393,7 +393,7 @@ static void env_set_imats(Render *re)
base= re->scene->base.first;
while(base) {
- mul_m4_m4m4(mat, base->object->obmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, base->object->obmat);
invert_m4_m4(base->object->imat, mat);
base= base->next;
@@ -422,7 +422,7 @@ static void render_envmap(Render *re, EnvMap *env)
normalize_m4(orthmat);
/* need imat later for texture imat */
- mul_m4_m4m4(mat, orthmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, orthmat);
invert_m4_m4(tmat, mat);
copy_m3_m4(env->obimat, tmat);
@@ -441,7 +441,7 @@ static void render_envmap(Render *re, EnvMap *env)
copy_m4_m4(envre->viewinv, tmat);
/* we have to correct for the already rotated vertexcoords */
- mul_m4_m4m4(tmat, oldviewinv, envre->viewmat);
+ mult_m4_m4m4(tmat, envre->viewmat, oldviewinv);
invert_m4_m4(env->imat, tmat);
env_rotate_scene(envre, tmat, 1);
@@ -528,7 +528,7 @@ void make_envmaps(Render *re)
normalize_m4(orthmat);
/* need imat later for texture imat */
- mul_m4_m4m4(mat, orthmat, re->viewmat);
+ mult_m4_m4m4(mat, re->viewmat, orthmat);
invert_m4_m4(tmat, mat);
copy_m3_m4(env->obimat, tmat);
}
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 2b44bad82ab..78215498a47 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -170,6 +170,11 @@ RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w,
result= new_render_result(re, &disprect, 0, RR_USEMEM);
BLI_addtail(&engine->fullresult, result);
+
+ result->tilerect.xmin += re->disprect.xmin;
+ result->tilerect.xmax += re->disprect.xmin;
+ result->tilerect.ymin += re->disprect.ymin;
+ result->tilerect.ymax += re->disprect.ymin;
return result;
}
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 785d9ac69d8..0b6e1b8ee01 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -203,6 +203,13 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
ibuf->rect+= (ibuf->x*ibuf->y);
}
+ /* keep this before interpolation [#29761] */
+ if (tex->imaflag & TEX_USEALPHA) {
+ if ((tex->imaflag & TEX_CALCALPHA) == 0) {
+ texres->talpha = TRUE;
+ }
+ }
+
/* interpolate */
if (tex->imaflag & TEX_INTERPOL) {
float filterx, filtery;
@@ -225,11 +232,6 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResul
ibuf->rect-= (ibuf->x*ibuf->y);
}
- if(tex->imaflag & TEX_USEALPHA) {
- if(tex->imaflag & TEX_CALCALPHA);
- else texres->talpha= 1;
- }
-
if(texres->nor) {
if(tex->imaflag & TEX_NORMALMAP) {
// qdn: normal from color
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 52fb1eb48dc..555d5c12a86 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1149,32 +1149,17 @@ void RE_ResultGet32(Render *re, unsigned int *rect)
RE_AcquireResultImage(re, &rres);
- if(rres.rect32)
+ if(rres.rect32) {
memcpy(rect, rres.rect32, sizeof(int)*rres.rectx*rres.recty);
+ }
else if(rres.rectf) {
- float *fp= rres.rectf;
- int tot= rres.rectx*rres.recty;
- char *cp= (char *)rect;
-
- if (re->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
- /* Finally convert back to sRGB rendered image */
- for(;tot>0; tot--, cp+=4, fp+=4) {
- cp[0] = FTOCHAR(linearrgb_to_srgb(fp[0]));
- cp[1] = FTOCHAR(linearrgb_to_srgb(fp[1]));
- cp[2] = FTOCHAR(linearrgb_to_srgb(fp[2]));
- cp[3] = FTOCHAR(fp[3]);
- }
- }
- else {
- /* Color management is off : no conversion necessary */
- for(;tot>0; tot--, cp+=4, fp+=4) {
- cp[0] = FTOCHAR(fp[0]);
- cp[1] = FTOCHAR(fp[1]);
- cp[2] = FTOCHAR(fp[2]);
- cp[3] = FTOCHAR(fp[3]);
- }
- }
+ int profile_from= (re->r.color_mgt_flag & R_COLOR_MANAGEMENT)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB;
+ int predivide= (re->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);
+ int dither= 0;
+ IMB_buffer_byte_from_float((unsigned char*)rect, rres.rectf,
+ 4, dither, IB_PROFILE_SRGB, profile_from, predivide,
+ rres.rectx, rres.recty, rres.rectx, rres.rectx);
}
else
/* else fill with black */
@@ -2567,24 +2552,18 @@ static void do_render_seq(Render * re)
if(ibuf) {
if(ibuf->rect_float) {
+ /* color management: when off ensure rectf is non-lin, since thats what the internal
+ * render engine delivers */
+ int profile_to= (re->r.color_mgt_flag & R_COLOR_MANAGEMENT)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB;
+ int profile_from= (ibuf->profile == IB_PROFILE_LINEAR_RGB)? IB_PROFILE_LINEAR_RGB: IB_PROFILE_SRGB;
+ int predivide= (re->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);
+
if (!rr->rectf)
rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf");
- /* color management: when off ensure rectf is non-lin, since thats what the internal
- * render engine delivers */
- if(re->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
- if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
- memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
- else
- srgb_to_linearrgb_rgba_rgba_buf(rr->rectf, ibuf->rect_float, rr->rectx*rr->recty);
-
- }
- else {
- if(ibuf->profile != IB_PROFILE_LINEAR_RGB)
- memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
- else
- linearrgb_to_srgb_rgba_rgba_buf(rr->rectf, ibuf->rect_float, rr->rectx*rr->recty);
- }
+ IMB_buffer_float_from_float(rr->rectf, ibuf->rect_float,
+ 4, profile_to, profile_from, predivide,
+ rr->rectx, rr->recty, rr->rectx, rr->rectx);
/* TSK! Since sequence render doesn't free the *rr render result, the old rect32
can hang around when sequence render has rendered a 32 bits one before */
@@ -2832,12 +2811,6 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
BKE_report(reports, RPT_ERROR, "All RenderLayers are disabled");
return 0;
}
-
- /* renderer */
- if(!ELEM(scene->r.renderer, R_INTERN, R_YAFRAY)) {
- BKE_report(reports, RPT_ERROR, "Unknown render engine set");
- return 0;
- }
return 1;
}
@@ -2995,15 +2968,17 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
/* write movie or image */
if(BKE_imtype_is_movie(scene->r.im_format.imtype)) {
int dofree = 0;
+ unsigned int *rect32 = (unsigned int *)rres.rect32;
/* note; the way it gets 32 bits rects is weak... */
- if(rres.rect32==NULL) {
- rres.rect32= MEM_mapallocN(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect");
+ if(rres.rect32 == NULL) {
+ rect32 = MEM_mapallocN(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect");
+ RE_ResultGet32(re, rect32);
dofree = 1;
}
- RE_ResultGet32(re, (unsigned int *)rres.rect32);
- ok= mh->append_movie(&re->r, scene->r.cfra, rres.rect32, rres.rectx, rres.recty, re->reports);
+
+ ok= mh->append_movie(&re->r, scene->r.cfra, (int *)rect32, rres.rectx, rres.recty, re->reports);
if(dofree) {
- MEM_freeN(rres.rect32);
+ MEM_freeN(rect32);
}
printf("Append frame %d", scene->r.cfra);
}
@@ -3020,7 +2995,8 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
}
}
else {
- ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.im_format.planes, 0);
+ int flags = (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE)? IB_cm_predivide: 0;
+ ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.im_format.planes, flags);
/* if not exists, BKE_write_ibuf makes one */
ibuf->rect= (unsigned int *)rres.rect32;
@@ -3090,7 +3066,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
{
bMovieHandle *mh= BKE_get_movie_handle(scene->r.im_format.imtype);
int cfrao= scene->r.cfra;
- int nfra;
+ int nfra, totrendered= 0, totskipped= 0;
/* do not fully call for each frame, it initializes & pops output window */
if(!render_initialize_from_main(re, bmain, scene, NULL, camera_override, lay, 0, 1))
@@ -3115,6 +3091,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
BLI_exec_cb(re->main, (ID *)scene, BLI_CB_EVT_RENDER_PRE);
do_render_all_options(re);
+ totrendered++;
if(re->test_break(re->tbh) == 0) {
if(!do_write_image_or_movie(re, bmain, scene, mh, NULL))
@@ -3163,6 +3140,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
if(scene->r.mode & R_NO_OVERWRITE && BLI_exists(name)) {
printf("skipping existing frame \"%s\"\n", name);
+ totskipped++;
continue;
}
if(scene->r.mode & R_TOUCH && !BLI_exists(name)) {
@@ -3178,6 +3156,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
do_render_all_options(re);
+ totrendered++;
if(re->test_break(re->tbh) == 0) {
if(!G.afbreek)
@@ -3207,6 +3186,9 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
/* end movie */
if(BKE_imtype_is_movie(scene->r.im_format.imtype))
mh->end_movie();
+
+ if(totskipped && totrendered == 0)
+ BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite");
scene->r.cfra= cfrao;
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index b62484a6995..f261ec41746 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -176,7 +176,6 @@ static void render_lighting_halo(HaloRen *har, float col_r[3])
if(inpr<t) continue;
else {
t= inpr-t;
- i= 1.0;
soft= 1.0;
if(t<lar->spotbl && lar->spotbl!=0.0f) {
/* soft area */
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index 5b81ea85914..ae3748755ff 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -116,7 +116,7 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
/* init everything */
if (!psys || !ob || !pd) return;
- mul_m4_m4m4(obview, re->viewinv, ob->obmat);
+ mult_m4_m4m4(obview, ob->obmat, re->viewinv);
/* Just to create a valid rendering context for particles */
psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, 0);
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 1a58a665e0a..41bfcb55068 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -485,18 +485,12 @@ void makeraytree(Render *re)
/* if(shi->osatex) */
static void shade_ray_set_derivative(ShadeInput *shi)
{
- float detsh, t00, t10, t01, t11, xn, yn, zn;
+ float detsh, t00, t10, t01, t11;
int axis1, axis2;
/* find most stable axis to project */
- xn= fabs(shi->facenor[0]);
- yn= fabs(shi->facenor[1]);
- zn= fabs(shi->facenor[2]);
-
- if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
- else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
- else { axis1= 1; axis2= 2; }
-
+ axis_dominant_v3(&axis1, &axis2, shi->facenor);
+
/* compute u,v and derivatives */
if(shi->obi->flag & R_TRANSFORMED) {
float v1[3], v2[3], v3[3];
@@ -2016,7 +2010,7 @@ static void ray_ao_qmc(ShadeInput *shi, float ao[3], float env[3])
samples++;
- if (qsa->type == SAMP_TYPE_HALTON) {
+ if (qsa && qsa->type == SAMP_TYPE_HALTON) {
/* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
if (adapt_thresh > 0.0f && (samples > max_samples/2) ) {
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index 9459745cdbc..f9992050052 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -1932,11 +1932,13 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
float *nvec = texres->nor;
texres->nor = NULL;
- if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
- if(tex->ima)
- Hscale *= 13.0f; // appears to be a sensible default value
- } else
- Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
+ if(found_deriv_map==0) {
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima)
+ Hscale *= 13.0f; // appears to be a sensible default value
+ } else
+ Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
+ }
if( !ntap_bump->init_done ) {
copy_v3_v3(ntap_bump->vNacc, shi->vn);
@@ -1958,15 +1960,21 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
}
if(found_deriv_map) {
- float dBdu, dBdv;
+ float dBdu, dBdv, auto_bump = 1.0f;
float s = 1; // negate this if flipped texture coordinate
texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, texres);
+
+ if(shi->obr->ob->derivedFinal)
+ {
+ auto_bump = shi->obr->ob->derivedFinal->auto_bump_scale;
+ }
+ auto_bump /= sqrtf((float) (dimx*dimy));
// this variant using a derivative map is described here
// http://mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html
- dBdu = Hscale*dimx*(2*texres->tr-1);
- dBdv = Hscale*dimy*(2*texres->tg-1);
+ dBdu = auto_bump*Hscale*dimx*(2*texres->tr-1);
+ dBdv = auto_bump*Hscale*dimy*(2*texres->tg-1);
dHdx = dBdu*dxt[0] + s * dBdv*dxt[1];
dHdy = dBdu*dyt[0] + s * dBdv*dyt[1];
@@ -2079,7 +2087,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
// TODO: these calculations happen for every pixel!
// -> move to shi->obi
- mul_m4_m4m4(tmp, shi->obr->ob->obmat, R.viewmat);
+ mult_m4_m4m4(tmp, R.viewmat, shi->obr->ob->obmat);
copy_m3_m4(obj2view, tmp); // use only upper left 3x3 matrix
invert_m3_m3(view2obj, obj2view);
@@ -2183,7 +2191,7 @@ void do_material_tex(ShadeInput *shi, Render *re)
found_deriv_map = (tex->type==TEX_IMAGE) && (tex->imaflag & TEX_DERIVATIVEMAP);
use_compat_bump= (mtex->texflag & MTEX_COMPAT_BUMP);
- use_ntap_bump= ((mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP))!=0 || found_deriv_map!=0) ? 1 : 0;
+ use_ntap_bump= ((mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP|MTEX_BICUBIC_BUMP))!=0 || found_deriv_map!=0) ? 1 : 0;
/* XXX texture node trees don't work for this yet */
if(tex->nodetree && tex->use_nodes) {
@@ -3075,6 +3083,12 @@ void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float h
continue;
}
break;
+ case TEXCO_EQUIRECTMAP:
+ tempvec[0]= atan2f(lo[0], lo[2]) / (float)M_PI;
+ tempvec[1]= 1.0f - 2.0f*saacos(lo[1]) / (float)M_PI;
+ tempvec[2]= 0.0f;
+ co= tempvec;
+ break;
case TEXCO_OBJECT:
if(mtex->object) {
copy_v3_v3(tempvec, lo);
@@ -3494,17 +3508,11 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
static void textured_face_generate_uv(float *uv, float *normal, float *hit, float *v1, float *v2, float *v3)
{
- float detsh, t00, t10, t01, t11, xn, yn, zn;
+ float detsh, t00, t10, t01, t11;
int axis1, axis2;
/* find most stable axis to project */
- xn= fabs(normal[0]);
- yn= fabs(normal[1]);
- zn= fabs(normal[2]);
-
- if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
- else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
- else { axis1= 1; axis2= 2; }
+ axis_dominant_v3(&axis1, &axis2, normal);
/* compute u,v and derivatives */
t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 25575fa965f..43761be9d71 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -1026,7 +1026,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
yn= tin*mtex->colfac;
- zn= tin*mtex->alphafac;
+ //zn= tin*mtex->alphafac;
if(mtex->mapto & MAP_COL) {
zn= 1.0f-yn;
@@ -1112,10 +1112,8 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
if(ma->mode & MA_HALO_RINGS) har->ringc= ma->ringc;
if(ma->mode & MA_HALO_FLARE) har->flarec= ma->flarec;
- if((ma->mode & MA_HALOTEX) && ma->mtex[0]){
+ if((ma->mode & MA_HALOTEX) && ma->mtex[0])
har->tex= 1;
- i=1;
- }
for(i=0; i<MAX_MTEX; i++)
if(ma->mtex[i] && (ma->septex & (1<<i))==0) {
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 8cb7009f756..c14a768d1ce 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -640,7 +640,7 @@ static void shadowbuf_autoclip(Render *re, LampRen *lar)
obr= obi->obr;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obviewmat, obi->mat, viewmat);
+ mult_m4_m4m4(obviewmat, viewmat, obi->mat);
else
copy_m4_m4(obviewmat, viewmat);
@@ -777,7 +777,7 @@ void makeshadowbuf(Render *re, LampRen *lar)
wsize= shb->pixsize*(shb->size/2.0f);
perspective_m4( shb->winmat,-wsize, wsize, -wsize, wsize, shb->d, shb->clipend);
- mul_m4_m4m4(shb->persmat, shb->viewmat, shb->winmat);
+ mult_m4_m4m4(shb->persmat, shb->winmat, shb->viewmat);
if(ELEM3(lar->buftype, LA_SHADBUF_REGULAR, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP)) {
shb->totbuf= lar->buffers;
@@ -1987,7 +1987,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
obr= obi->obr;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(winmat, obi->mat, shb->persmat);
+ mult_m4_m4m4(winmat, shb->persmat, obi->mat);
else
copy_m4_m4(winmat, shb->persmat);
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index f2a053e89d9..580a09d5050 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -756,17 +756,11 @@ void shade_input_set_uv(ShadeInput *shi)
}
else {
/* most of this could become re-used for faces */
- float detsh, t00, t10, t01, t11, xn, yn, zn;
+ float detsh, t00, t10, t01, t11;
int axis1, axis2;
/* find most stable axis to project */
- xn= fabs(shi->facenor[0]);
- yn= fabs(shi->facenor[1]);
- zn= fabs(shi->facenor[2]);
-
- if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
- else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
- else { axis1= 1; axis2= 2; }
+ axis_dominant_v3(&axis1, &axis2, shi->facenor);
/* compute u,v and derivatives */
t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
@@ -1274,7 +1268,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
zbuf_make_winmat(&R, winmat);
if(shi->obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 4d654beb287..9cb30c2ba1a 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -269,14 +269,12 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
if(p1[2]<-ladist) t1= t3;
}
else {
- ok1= 1;
t1= t3;
}
if(ok2) {
if(p2[2]<-ladist) t2= t3;
}
else {
- ok2= 1;
t2= t3;
}
}
@@ -1714,9 +1712,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
if( (ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))== MA_VERTEXCOL ) { // vertexcolor light
- shr->emit[0]= shi->r*(shi->emit+shi->vcol[0]);
- shr->emit[1]= shi->g*(shi->emit+shi->vcol[1]);
- shr->emit[2]= shi->b*(shi->emit+shi->vcol[2]);
+ shr->emit[0]= shi->r*(shi->emit+shi->vcol[0]*shi->vcol[3]);
+ shr->emit[1]= shi->g*(shi->emit+shi->vcol[1]*shi->vcol[3]);
+ shr->emit[2]= shi->b*(shi->emit+shi->vcol[2]*shi->vcol[3]);
}
else {
shr->emit[0]= shi->r*shi->emit;
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 633c7ca1847..89f74418563 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -833,7 +833,6 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "strand sort arena");
firstseg= NULL;
- sortseg= sortsegments;
totsegment= 0;
/* for all object instances */
@@ -848,7 +847,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
/* compute matrix and try clipping whole object */
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 4b1894236fc..3637c2de1fb 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -245,7 +245,7 @@ static float metadensity(Object* ob, const float co[3])
/* transform co to meta-element */
float tco[3] = {co[0], co[1], co[2]};
- mul_m4_m4m4(mat, ob->obmat, R.viewmat);
+ mult_m4_m4m4(mat, R.viewmat, ob->obmat);
invert_m4_m4(imat, mat);
mul_m4_v3(imat, tco);
@@ -746,7 +746,6 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
float tr[3] = {1.0,1.0,1.0};
Isect is= {{0}};
float *startco, *endco;
- int intersect_type = VOL_BOUNDS_DEPTH;
memset(shr, 0, sizeof(ShadeResult));
@@ -755,12 +754,11 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
if (shi->flippednor) {
startco = last_is->start;
endco = shi->co;
- intersect_type = VOL_BOUNDS_SS;
}
/* trace to find a backface, the other side bounds of the volume */
/* (ray intersect ignores front faces here) */
- else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, intersect_type)) {
+ else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH)) {
startco = shi->co;
endco = hitco;
}
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 8b383992e65..8efe23c38f9 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -1819,7 +1819,7 @@ void zbuf_make_winmat(Render *re, float winmat[][4])
panomat[2][0]= -re->panosi;
panomat[2][2]= re->panoco;
- mul_m4_m4m4(winmat, panomat, re->winmat);
+ mult_m4_m4m4(winmat, re->winmat, panomat);
}
else
copy_m4_m4(winmat, re->winmat);
@@ -2138,7 +2138,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*,
continue;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
@@ -2318,7 +2318,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
continue;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
@@ -2557,7 +2557,7 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
continue;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
@@ -3300,7 +3300,7 @@ static int zbuffer_abuf(Render *re, RenderPart *pa, APixstr *APixbuf, ListBase *
continue;
if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
+ mult_m4_m4m4(obwinmat, winmat, obi->mat);
else
copy_m4_m4(obwinmat, winmat);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 1d8161086b0..61c3da36203 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -191,6 +191,7 @@ struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *
int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot);
int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context);
int WM_operator_call (struct bContext *C, struct wmOperator *op);
+int WM_operator_call_notest(struct bContext *C, struct wmOperator *op);
int WM_operator_repeat (struct bContext *C, struct wmOperator *op);
int WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
@@ -206,6 +207,7 @@ void WM_operator_properties_gesture_border(struct wmOperatorType *ot, int exten
void WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor);
void WM_operator_properties_select_all(struct wmOperatorType *ot);
+int WM_operator_check_ui_enabled(const struct bContext *C, const char *idname);
wmOperator *WM_operator_last_redo(const struct bContext *C);
/* MOVE THIS SOMEWHERE ELSE */
@@ -331,6 +333,9 @@ void WM_progress_clear(struct wmWindow *win);
void WM_console_toggle(struct bContext *C, short show);
#endif
+ /* Draw (for screenshot) */
+void WM_redraw_windows(struct bContext *C);
+
/* debugging only, convenience function to write on crash */
int write_crash_blend(void);
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 389049d9e59..4fe11044d30 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -43,6 +43,7 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
+#include "BLI_math_base.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -355,36 +356,12 @@ typedef struct wmDrawTriple {
GLenum target;
} wmDrawTriple;
-static int is_pow2(int n)
-{
- return ((n)&(n-1))==0;
-}
-
-static int smaller_pow2(int n)
-{
- while (!is_pow2(n))
- n= n&(n-1);
-
- return n;
-}
-
-static int larger_pow2(int n)
-{
- if (is_pow2(n))
- return n;
-
- while(!is_pow2(n))
- n= n&(n-1);
-
- return n*2;
-}
-
static void split_width(int x, int n, int *splitx, int *nx)
{
int a, newnx, waste;
/* if already power of two just use it */
- if(is_pow2(x)) {
+ if(is_power_of_2_i(x)) {
splitx[0]= x;
(*nx)++;
return;
@@ -392,12 +369,12 @@ static void split_width(int x, int n, int *splitx, int *nx)
if(n == 1) {
/* last part, we have to go larger */
- splitx[0]= larger_pow2(x);
+ splitx[0]= power_of_2_max_i(x);
(*nx)++;
}
else {
/* two or more parts to go, use smaller part */
- splitx[0]= smaller_pow2(x);
+ splitx[0]= power_of_2_min_i(x);
newnx= ++(*nx);
split_width(x-splitx[0], n-1, splitx+1, &newnx);
@@ -406,8 +383,8 @@ static void split_width(int x, int n, int *splitx, int *nx)
/* if we waste more space or use the same amount,
* revert deeper splits and just use larger */
- if(waste >= larger_pow2(x)) {
- splitx[0]= larger_pow2(x);
+ if(waste >= power_of_2_max_i(x)) {
+ splitx[0]= power_of_2_max_i(x);
memset(splitx+1, 0, sizeof(int)*(n-1));
}
else
@@ -835,3 +812,16 @@ void wm_draw_region_clear(wmWindow *win, ARegion *ar)
win->screen->do_draw= 1;
}
+void WM_redraw_windows(bContext *C)
+{
+ wmWindow *win_prev= CTX_wm_window(C);
+ ScrArea *area_prev= CTX_wm_area(C);
+ ARegion *ar_prev= CTX_wm_region(C);
+
+ wm_draw_update(C);
+
+ CTX_wm_window_set(C, win_prev);
+ CTX_wm_area_set(C, area_prev);
+ CTX_wm_region_set(C, ar_prev);
+}
+
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 5d48a3c7a7f..43a691770c9 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -186,7 +186,7 @@ void wm_event_do_notifiers(bContext *C)
wmWindowManager *wm= CTX_wm_manager(C);
wmNotifier *note, *next;
wmWindow *win;
- unsigned int win_combine_v3d_datamask= 0;
+ uint64_t win_combine_v3d_datamask= 0;
if(wm==NULL)
return;
@@ -597,12 +597,36 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
}
-/* for running operators with frozen context (modal handlers, menus) */
+/* simply calls exec with basic checks */
+static int wm_operator_exec_notest(bContext *C, wmOperator *op)
+{
+ int retval= OPERATOR_CANCELLED;
+
+ if(op==NULL || op->type==NULL || op->type->exec==NULL)
+ return retval;
+
+ retval= op->type->exec(C, op);
+ OPERATOR_RETVAL_CHECK(retval);
+
+ return retval;
+}
+
+/* for running operators with frozen context (modal handlers, menus)
+ *
+ * warning: do not use this within an operator to call its self! [#29537] */
int WM_operator_call(bContext *C, wmOperator *op)
{
return wm_operator_exec(C, op, 0);
}
+/* this is intended to be used when an invoke operator wants to call exec on its self
+ * and is basically like running op->type->exec() directly, no poll checks no freeing,
+ * since we assume whoever called invokle will take care of that */
+int WM_operator_call_notest(bContext *C, wmOperator *op)
+{
+ return wm_operator_exec_notest(C, op);
+}
+
/* do this operator again, put here so it can share above code */
int WM_operator_repeat(bContext *C, wmOperator *op)
{
@@ -2667,6 +2691,11 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U
key we don't want the key modifier */
if(event.keymodifier == event.type)
event.keymodifier= 0;
+ /* this case happened with an external numpad, it's not really clear
+ why, but it's also impossible to map a key modifier to an unknwon
+ key, so it shouldn't harm */
+ if(event.keymodifier == UNKNOWNKEY)
+ event.keymodifier= 0;
/* if test_break set, it catches this. XXX Keep global for now? */
if(event.type==ESCKEY)
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index ef463989c64..4fb8751de69 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -124,14 +124,13 @@ void WM_gestures_remove(bContext *C)
/* tweak and line gestures */
-#define TWEAK_THRESHOLD 10
int wm_gesture_evaluate(wmGesture *gesture)
{
if(gesture->type==WM_GESTURE_TWEAK) {
rcti *rect= gesture->customdata;
int dx= rect->xmax - rect->xmin;
int dy= rect->ymax - rect->ymin;
- if(ABS(dx)+ABS(dy) > TWEAK_THRESHOLD) {
+ if(ABS(dx)+ABS(dy) > U.tweak_threshold) {
int theta= (int)floor(4.0f*atan2f((float)dy, (float)dx)/(float)M_PI + 0.5f);
int val= EVT_GESTURE_W;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index fa6521b3ec0..2ab876b2165 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -46,6 +46,7 @@
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_mesh_types.h" /* only for USE_BMESH_SAVE_AS_COMPAT */
#include "BLF_translation.h"
@@ -802,7 +803,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (RNA_property_is_set(op->ptr, "filepath")) {
- return WM_operator_call(C, op);
+ return WM_operator_call_notest(C, op); /* call exec direct */
}
else {
WM_event_add_fileselect(C, op);
@@ -907,6 +908,15 @@ int WM_operator_winactive(bContext *C)
return 1;
}
+/* return FALSE, if the UI should be disabled */
+int WM_operator_check_ui_enabled(const bContext *C, const char *idname)
+{
+ wmWindowManager *wm= CTX_wm_manager(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return !(ED_undo_valid(C, idname)==0 || WM_jobs_test(wm, scene));
+}
+
wmOperator *WM_operator_last_redo(const bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -940,7 +950,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, UI_UNIT_Y, style);
- if(ED_undo_valid(C, op->type->name)==0)
+ if (!WM_operator_check_ui_enabled(C, op->type->name))
uiLayoutSetEnabled(layout, 0);
if(op->type->flag & OPTYPE_MACRO) {
@@ -1625,10 +1635,26 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
/* **************** link/append *************** */
+int wm_link_append_poll(bContext *C)
+{
+ if(WM_operator_winactive(C)) {
+ /* linking changes active object which is pretty useful in general,
+ but which totally confuses edit mode (i.e. it becoming not so obvious
+ to leave from edit mode and inwalid tools in toolbar might be displayed)
+ so disable link/append when in edit mode (sergey) */
+ if(CTX_data_edit_object(C))
+ return 0;
+
+ return 1;
+ }
+
+ return 0;
+}
+
static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(RNA_property_is_set(op->ptr, "filepath")) {
- return WM_operator_call(C, op);
+ return WM_operator_call_notest(C, op);
}
else {
/* XXX TODO solve where to get last linked library from */
@@ -1787,7 +1813,7 @@ static void WM_OT_link_append(wmOperatorType *ot)
ot->invoke= wm_link_append_invoke;
ot->exec= wm_link_append_exec;
- ot->poll= WM_operator_winactive;
+ ot->poll= wm_link_append_poll;
ot->flag |= OPTYPE_UNDO;
@@ -1947,6 +1973,10 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
else fileflags &= ~G_FILE_COMPRESS;
if(RNA_boolean_get(op->ptr, "relative_remap")) fileflags |= G_FILE_RELATIVE_REMAP;
else fileflags &= ~G_FILE_RELATIVE_REMAP;
+#ifdef USE_BMESH_SAVE_AS_COMPAT
+ if(RNA_boolean_get(op->ptr, "use_mesh_compat")) fileflags |= G_FILE_MESH_COMPAT;
+ else fileflags &= ~G_FILE_MESH_COMPAT;
+#endif
if ( WM_write_file(C, path, fileflags, op->reports, copy) != 0)
return OPERATOR_CANCELLED;
@@ -1986,6 +2016,9 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file");
RNA_def_boolean(ot->srna, "relative_remap", 1, "Remap Relative", "Remap relative paths when saving in a different directory");
RNA_def_boolean(ot->srna, "copy", 0, "Save Copy", "Save a copy of the actual working state but does not make saved file active");
+#ifdef USE_BMESH_SAVE_AS_COMPAT
+ RNA_def_boolean(ot->srna, "use_mesh_compat", 0, "Legacy Mesh Format", "Save using legacy mesh format (no ngons)");
+#endif
}
/* *************** save file directly ******** */
@@ -1994,6 +2027,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
{
char name[FILE_MAX];
int check_existing=1;
+ int ret;
/* cancel if no active window */
if (CTX_wm_window(C) == NULL)
@@ -2018,16 +2052,20 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
check_existing = 0;
if (G.save_over) {
- if (check_existing)
+ if (check_existing && BLI_exists(name)) {
uiPupMenuSaveOver(C, op, name);
+ ret= OPERATOR_RUNNING_MODAL;
+ }
else {
- wm_save_as_mainfile_exec(C, op);
+ ret= wm_save_as_mainfile_exec(C, op);
}
- } else {
+ }
+ else {
WM_event_add_fileselect(C, op);
+ ret= OPERATOR_RUNNING_MODAL;
}
- return OPERATOR_RUNNING_MODAL;
+ return ret;
}
static void WM_OT_save_mainfile(wmOperatorType *ot)
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 0ec41c4d1c1..75d1f182189 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -464,6 +464,17 @@ void BPY_DECREF(void *pyob_ptr) {}
void BPY_pyconstraint_exec(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets) {}
void macro_wrapper(struct wmOperatorType *ot, void *userdata) {} ;
+/* intern/dualcon */
+struct DualConMesh;
+struct DualConMesh *dualcon(const struct DualConMesh *input_mesh,
+ void *create_mesh,
+ int flags,
+ int mode,
+ float threshold,
+ float hermite_num,
+ float scale,
+ int depth) {return 0;}
+
char blender_path[] = "";
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index f6189f34d31..40a980951ef 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -438,15 +438,15 @@ elseif(WIN32)
# )
if(WITH_PYTHON)
-
+ set_lib_path(PYLIB "python/lib")
install(
- FILES ${LIBDIR}/python/lib/python32.dll
+ FILES ${PYLIB}/python32.dll
DESTINATION ${TARGETDIR}
CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel
)
install(
- FILES ${LIBDIR}/python/lib/python32_d.dll
+ FILES ${PYLIB}/python32_d.dll
DESTINATION ${TARGETDIR}
CONFIGURATIONS Debug
)
@@ -492,7 +492,6 @@ elseif(WIN32)
else()
install(
FILES
- ${LIBDIR}/png/lib/libpng.dll
${LIBDIR}/zlib/lib/zlib.dll
DESTINATION ${TARGETDIR}
)
@@ -534,7 +533,6 @@ elseif(WIN32)
install(
FILES
${LIBDIR}/openal/lib/OpenAL32.dll
- ${LIBDIR}/openal/lib/wrap_oal.dll
DESTINATION ${TARGETDIR}
)
endif()
@@ -561,9 +559,10 @@ elseif(WIN32)
)
if(WITH_OPENIMAGEIO)
+ set_lib_path(OIIOBIN "openimageio/bin")
install(
FILES
- ${LIBDIR}/openimageio/bin/OpenImageIO.dll
+ ${OIIOBIN}/OpenImageIO.dll
DESTINATION ${TARGETDIR}
)
endif()
@@ -777,11 +776,11 @@ endif()
bf_nodes
bf_gpu
bf_blenloader
+ bf_imbuf
bf_blenlib
bf_intern_ghost
bf_intern_string
bf_blenpluginapi
- bf_imbuf
bf_avi
bf_imbuf_cineon
bf_imbuf_openexr
@@ -824,6 +823,7 @@ endif()
bf_blenfont
bf_intern_audaspace
bf_intern_mikktspace
+ bf_intern_dualcon
bf_intern_cycles
cycles_render
cycles_bvh
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 094277a1e9f..e15950a665c 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -301,7 +301,7 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
printf (" $BLENDER_USER_CONFIG Directory for user configuration files.\n");
printf (" $BLENDER_USER_SCRIPTS Directory for user scripts.\n");
printf (" $BLENDER_SYSTEM_SCRIPTS Directory for system wide scripts.\n");
- printf (" $BLENDER_USER_DAT`AFILES Directory for user data files (icons, translations, ..).\n");
+ printf (" $Directory for user data files (icons, translations, ..).\n");
printf (" $BLENDER_SYSTEM_DATAFILES Directory for system wide data files.\n");
printf (" $BLENDER_SYSTEM_PYTHON Directory for system python libraries.\n");
#ifdef WIN32
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 360a082b03b..445f2b8f0ba 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -241,6 +241,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
+ KX_KetsjiEngine::SetExitKey(ConvertKeyCode(startscene->gm.exitkey));
//set the global settings (carried over if restart/load new files)
ketsjiengine->SetGlobalSettings(&gs);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
index 1c91f498d32..93bf133635d 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
@@ -41,6 +41,7 @@
#include "wm_event_types.h"
#include "WM_types.h"
#include "SCA_IInputDevice.h"
+#include "BL_BlenderDataConversion.h"
#ifdef WITH_CXX_GUARDEDALLOC
#include "MEM_guardedalloc.h"
@@ -51,172 +52,9 @@
*/
class BL_BlenderInputDevice : public SCA_IInputDevice
{
- // this map is Blender specific: a conversion between blender and ketsji enums
- std::map<int,KX_EnumInputs> m_reverseKeyTranslateTable;
public:
BL_BlenderInputDevice()
{
-
- /* The reverse table. In order to not confuse ourselves, we */
- /* immediately convert all events that come in to KX codes. */
- m_reverseKeyTranslateTable[LEFTMOUSE ] = KX_LEFTMOUSE;
- m_reverseKeyTranslateTable[MIDDLEMOUSE ] = KX_MIDDLEMOUSE;
- m_reverseKeyTranslateTable[RIGHTMOUSE ] = KX_RIGHTMOUSE;
- m_reverseKeyTranslateTable[WHEELUPMOUSE ] = KX_WHEELUPMOUSE;
- m_reverseKeyTranslateTable[WHEELDOWNMOUSE ] = KX_WHEELDOWNMOUSE;
- m_reverseKeyTranslateTable[MOUSEX ] = KX_MOUSEX;
- m_reverseKeyTranslateTable[MOUSEY ] = KX_MOUSEY;
-
- // TIMERS
-
- m_reverseKeyTranslateTable[TIMER0 ] = KX_TIMER0;
- m_reverseKeyTranslateTable[TIMER1 ] = KX_TIMER1;
- m_reverseKeyTranslateTable[TIMER2 ] = KX_TIMER2;
-
- // SYSTEM
-#if 0
- /* **** XXX **** */
- m_reverseKeyTranslateTable[KEYBD ] = KX_KEYBD;
- m_reverseKeyTranslateTable[RAWKEYBD ] = KX_RAWKEYBD;
- m_reverseKeyTranslateTable[REDRAW ] = KX_REDRAW;
- m_reverseKeyTranslateTable[INPUTCHANGE ] = KX_INPUTCHANGE;
- m_reverseKeyTranslateTable[QFULL ] = KX_QFULL;
- m_reverseKeyTranslateTable[WINFREEZE ] = KX_WINFREEZE;
- m_reverseKeyTranslateTable[WINTHAW ] = KX_WINTHAW;
- m_reverseKeyTranslateTable[WINCLOSE ] = KX_WINCLOSE;
- m_reverseKeyTranslateTable[WINQUIT ] = KX_WINQUIT;
- m_reverseKeyTranslateTable[Q_FIRSTTIME ] = KX_Q_FIRSTTIME;
- /* **** XXX **** */
-#endif
- // standard keyboard
-
- m_reverseKeyTranslateTable[AKEY ] = KX_AKEY;
- m_reverseKeyTranslateTable[BKEY ] = KX_BKEY;
- m_reverseKeyTranslateTable[CKEY ] = KX_CKEY;
- m_reverseKeyTranslateTable[DKEY ] = KX_DKEY;
- m_reverseKeyTranslateTable[EKEY ] = KX_EKEY;
- m_reverseKeyTranslateTable[FKEY ] = KX_FKEY;
- m_reverseKeyTranslateTable[GKEY ] = KX_GKEY;
- //XXX clean up
-#ifdef WIN32
-#define HKEY 'h'
-#endif
- m_reverseKeyTranslateTable[HKEY ] = KX_HKEY;
- //XXX clean up
-#ifdef WIN32
-#undef HKEY
-#endif
- m_reverseKeyTranslateTable[IKEY ] = KX_IKEY;
- m_reverseKeyTranslateTable[JKEY ] = KX_JKEY;
- m_reverseKeyTranslateTable[KKEY ] = KX_KKEY;
- m_reverseKeyTranslateTable[LKEY ] = KX_LKEY;
- m_reverseKeyTranslateTable[MKEY ] = KX_MKEY;
- m_reverseKeyTranslateTable[NKEY ] = KX_NKEY;
- m_reverseKeyTranslateTable[OKEY ] = KX_OKEY;
- m_reverseKeyTranslateTable[PKEY ] = KX_PKEY;
- m_reverseKeyTranslateTable[QKEY ] = KX_QKEY;
- m_reverseKeyTranslateTable[RKEY ] = KX_RKEY;
- m_reverseKeyTranslateTable[SKEY ] = KX_SKEY;
- m_reverseKeyTranslateTable[TKEY ] = KX_TKEY;
- m_reverseKeyTranslateTable[UKEY ] = KX_UKEY;
- m_reverseKeyTranslateTable[VKEY ] = KX_VKEY;
- m_reverseKeyTranslateTable[WKEY ] = KX_WKEY;
- m_reverseKeyTranslateTable[XKEY ] = KX_XKEY;
- m_reverseKeyTranslateTable[YKEY ] = KX_YKEY;
- m_reverseKeyTranslateTable[ZKEY ] = KX_ZKEY;
-
- m_reverseKeyTranslateTable[ZEROKEY ] = KX_ZEROKEY;
- m_reverseKeyTranslateTable[ONEKEY ] = KX_ONEKEY;
- m_reverseKeyTranslateTable[TWOKEY ] = KX_TWOKEY;
- m_reverseKeyTranslateTable[THREEKEY ] = KX_THREEKEY;
- m_reverseKeyTranslateTable[FOURKEY ] = KX_FOURKEY;
- m_reverseKeyTranslateTable[FIVEKEY ] = KX_FIVEKEY;
- m_reverseKeyTranslateTable[SIXKEY ] = KX_SIXKEY;
- m_reverseKeyTranslateTable[SEVENKEY ] = KX_SEVENKEY;
- m_reverseKeyTranslateTable[EIGHTKEY ] = KX_EIGHTKEY;
- m_reverseKeyTranslateTable[NINEKEY ] = KX_NINEKEY;
-
- m_reverseKeyTranslateTable[CAPSLOCKKEY ] = KX_CAPSLOCKKEY;
-
- m_reverseKeyTranslateTable[LEFTCTRLKEY ] = KX_LEFTCTRLKEY;
- m_reverseKeyTranslateTable[LEFTALTKEY ] = KX_LEFTALTKEY;
- m_reverseKeyTranslateTable[RIGHTALTKEY ] = KX_RIGHTALTKEY;
- m_reverseKeyTranslateTable[RIGHTCTRLKEY ] = KX_RIGHTCTRLKEY;
- m_reverseKeyTranslateTable[RIGHTSHIFTKEY ] = KX_RIGHTSHIFTKEY;
- m_reverseKeyTranslateTable[LEFTSHIFTKEY ] = KX_LEFTSHIFTKEY;
-
- m_reverseKeyTranslateTable[ESCKEY ] = KX_ESCKEY;
- m_reverseKeyTranslateTable[TABKEY ] = KX_TABKEY;
- m_reverseKeyTranslateTable[RETKEY ] = KX_RETKEY;
- m_reverseKeyTranslateTable[SPACEKEY ] = KX_SPACEKEY;
- m_reverseKeyTranslateTable[LINEFEEDKEY ] = KX_LINEFEEDKEY;
- m_reverseKeyTranslateTable[BACKSPACEKEY ] = KX_BACKSPACEKEY;
- m_reverseKeyTranslateTable[DELKEY ] = KX_DELKEY;
- m_reverseKeyTranslateTable[SEMICOLONKEY ] = KX_SEMICOLONKEY;
- m_reverseKeyTranslateTable[PERIODKEY ] = KX_PERIODKEY;
- m_reverseKeyTranslateTable[COMMAKEY ] = KX_COMMAKEY;
- m_reverseKeyTranslateTable[QUOTEKEY ] = KX_QUOTEKEY;
- m_reverseKeyTranslateTable[ACCENTGRAVEKEY ] = KX_ACCENTGRAVEKEY;
- m_reverseKeyTranslateTable[MINUSKEY ] = KX_MINUSKEY;
- m_reverseKeyTranslateTable[SLASHKEY ] = KX_SLASHKEY;
- m_reverseKeyTranslateTable[BACKSLASHKEY ] = KX_BACKSLASHKEY;
- m_reverseKeyTranslateTable[EQUALKEY ] = KX_EQUALKEY;
- m_reverseKeyTranslateTable[LEFTBRACKETKEY ] = KX_LEFTBRACKETKEY;
- m_reverseKeyTranslateTable[RIGHTBRACKETKEY ] = KX_RIGHTBRACKETKEY;
-
- m_reverseKeyTranslateTable[LEFTARROWKEY ] = KX_LEFTARROWKEY;
- m_reverseKeyTranslateTable[DOWNARROWKEY ] = KX_DOWNARROWKEY;
- m_reverseKeyTranslateTable[RIGHTARROWKEY ] = KX_RIGHTARROWKEY;
- m_reverseKeyTranslateTable[UPARROWKEY ] = KX_UPARROWKEY;
-
- m_reverseKeyTranslateTable[PAD2 ] = KX_PAD2;
- m_reverseKeyTranslateTable[PAD4 ] = KX_PAD4;
- m_reverseKeyTranslateTable[PAD6 ] = KX_PAD6;
- m_reverseKeyTranslateTable[PAD8 ] = KX_PAD8;
-
- m_reverseKeyTranslateTable[PAD1 ] = KX_PAD1;
- m_reverseKeyTranslateTable[PAD3 ] = KX_PAD3;
- m_reverseKeyTranslateTable[PAD5 ] = KX_PAD5;
- m_reverseKeyTranslateTable[PAD7 ] = KX_PAD7;
- m_reverseKeyTranslateTable[PAD9 ] = KX_PAD9;
-
- m_reverseKeyTranslateTable[PADPERIOD ] = KX_PADPERIOD;
- m_reverseKeyTranslateTable[PADSLASHKEY ] = KX_PADSLASHKEY;
- m_reverseKeyTranslateTable[PADASTERKEY ] = KX_PADASTERKEY;
-
-
- m_reverseKeyTranslateTable[PAD0 ] = KX_PAD0;
- m_reverseKeyTranslateTable[PADMINUS ] = KX_PADMINUS;
- m_reverseKeyTranslateTable[PADENTER ] = KX_PADENTER;
- m_reverseKeyTranslateTable[PADPLUSKEY ] = KX_PADPLUSKEY;
-
-
- m_reverseKeyTranslateTable[F1KEY ] = KX_F1KEY;
- m_reverseKeyTranslateTable[F2KEY ] = KX_F2KEY;
- m_reverseKeyTranslateTable[F3KEY ] = KX_F3KEY;
- m_reverseKeyTranslateTable[F4KEY ] = KX_F4KEY;
- m_reverseKeyTranslateTable[F5KEY ] = KX_F5KEY;
- m_reverseKeyTranslateTable[F6KEY ] = KX_F6KEY;
- m_reverseKeyTranslateTable[F7KEY ] = KX_F7KEY;
- m_reverseKeyTranslateTable[F8KEY ] = KX_F8KEY;
- m_reverseKeyTranslateTable[F9KEY ] = KX_F9KEY;
- m_reverseKeyTranslateTable[F10KEY ] = KX_F10KEY;
- m_reverseKeyTranslateTable[F11KEY ] = KX_F11KEY;
- m_reverseKeyTranslateTable[F12KEY ] = KX_F12KEY;
- m_reverseKeyTranslateTable[F13KEY ] = KX_F13KEY;
- m_reverseKeyTranslateTable[F14KEY ] = KX_F14KEY;
- m_reverseKeyTranslateTable[F15KEY ] = KX_F15KEY;
- m_reverseKeyTranslateTable[F16KEY ] = KX_F16KEY;
- m_reverseKeyTranslateTable[F17KEY ] = KX_F17KEY;
- m_reverseKeyTranslateTable[F18KEY ] = KX_F18KEY;
- m_reverseKeyTranslateTable[F19KEY ] = KX_F19KEY;
-
- m_reverseKeyTranslateTable[PAUSEKEY ] = KX_PAUSEKEY;
- m_reverseKeyTranslateTable[INSERTKEY ] = KX_INSERTKEY;
- m_reverseKeyTranslateTable[HOMEKEY ] = KX_HOMEKEY;
- m_reverseKeyTranslateTable[PAGEUPKEY ] = KX_PAGEUPKEY;
- m_reverseKeyTranslateTable[PAGEDOWNKEY ] = KX_PAGEDOWNKEY;
- m_reverseKeyTranslateTable[ENDKEY ] = KX_ENDKEY;
}
virtual ~BL_BlenderInputDevice()
@@ -225,7 +63,7 @@ public:
}
KX_EnumInputs ToNative(unsigned short incode) {
- return m_reverseKeyTranslateTable[incode];
+ return ConvertKeyCode(incode);
}
virtual bool IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
index a6712c531fb..54c60096812 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
@@ -36,6 +36,7 @@
#endif
#include "KX_BlenderKeyboardDevice.h"
+#include "KX_KetsjiEngine.h"
KX_BlenderKeyboardDevice::KX_BlenderKeyboardDevice()
: m_hookesc(false)
@@ -106,7 +107,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v
if (val == KM_PRESS)
{
- if (kxevent == KX_ESCKEY && val != 0 && !m_hookesc)
+ if (kxevent == KX_KetsjiEngine::GetExitKey() && val != 0 && !m_hookesc)
result = true;
if (kxevent == KX_PAUSEKEY && val && (IsPressed(KX_LEFTCTRLKEY) || IsPressed(KX_RIGHTCTRLKEY)))
result = true;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
index 63a01db2fe0..3039e69efcd 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
@@ -50,6 +50,8 @@ public:
virtual bool ConvertBlenderEvent(unsigned short incode,short val);
virtual void NextFrame();
virtual void HookEscape();
+private:
+ short m_exit_key;
#ifdef WITH_CXX_GUARDEDALLOC
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 1bfe5945bbc..2aab0498765 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -123,7 +123,8 @@ void BL_ActionActuator::ProcessReplica()
}
-void BL_ActionActuator::SetBlendTime (float newtime){
+void BL_ActionActuator::SetBlendTime (float newtime)
+{
m_blendframe = newtime;
}
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp
index c463068d52c..80a9db4db83 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.cpp
+++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp
@@ -215,7 +215,7 @@ PyObject* BL_ArmatureChannel::py_attr_get_joint_rotation(void *self_v, const str
normalize_m3(pose_mat);
if (pchan->parent) {
// bone has a parent, compute the rest pose of the bone taking actual pose of parent
- mul_m3_m3m4(rest_mat, pchan->bone->bone_mat, pchan->parent->pose_mat);
+ mult_m3_m3m4(rest_mat, pchan->parent->pose_mat, pchan->bone->bone_mat);
normalize_m3(rest_mat);
} else {
// otherwise, the bone matrix in armature space is the rest pose
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 57611d65e14..d472cce2a44 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -197,6 +197,180 @@ extern "C" {
static bool default_light_mode = 0;
+static std::map<int, SCA_IInputDevice::KX_EnumInputs> create_translate_table()
+{
+ std::map<int, SCA_IInputDevice::KX_EnumInputs> m;
+
+ /* The reverse table. In order to not confuse ourselves, we */
+ /* immediately convert all events that come in to KX codes. */
+ m[LEFTMOUSE ] = SCA_IInputDevice::KX_LEFTMOUSE;
+ m[MIDDLEMOUSE ] = SCA_IInputDevice::KX_MIDDLEMOUSE;
+ m[RIGHTMOUSE ] = SCA_IInputDevice::KX_RIGHTMOUSE;
+ m[WHEELUPMOUSE ] = SCA_IInputDevice::KX_WHEELUPMOUSE;
+ m[WHEELDOWNMOUSE ] = SCA_IInputDevice::KX_WHEELDOWNMOUSE;
+ m[MOUSEX ] = SCA_IInputDevice::KX_MOUSEX;
+ m[MOUSEY ] = SCA_IInputDevice::KX_MOUSEY;
+
+ // TIMERS
+
+ m[TIMER0 ] = SCA_IInputDevice::KX_TIMER0;
+ m[TIMER1 ] = SCA_IInputDevice::KX_TIMER1;
+ m[TIMER2 ] = SCA_IInputDevice::KX_TIMER2;
+
+ // SYSTEM
+
+#if 0
+ /* **** XXX **** */
+ m[KEYBD ] = SCA_IInputDevice::KX_KEYBD;
+ m[RAWKEYBD ] = SCA_IInputDevice::KX_RAWKEYBD;
+ m[REDRAW ] = SCA_IInputDevice::KX_REDRAW;
+ m[INPUTCHANGE ] = SCA_IInputDevice::KX_INPUTCHANGE;
+ m[QFULL ] = SCA_IInputDevice::KX_QFULL;
+ m[WINFREEZE ] = SCA_IInputDevice::KX_WINFREEZE;
+ m[WINTHAW ] = SCA_IInputDevice::KX_WINTHAW;
+ m[WINCLOSE ] = SCA_IInputDevice::KX_WINCLOSE;
+ m[WINQUIT ] = SCA_IInputDevice::KX_WINQUIT;
+ m[Q_FIRSTTIME ] = SCA_IInputDevice::KX_Q_FIRSTTIME;
+ /* **** XXX **** */
+#endif
+
+ // standard keyboard
+
+ m[AKEY ] = SCA_IInputDevice::KX_AKEY;
+ m[BKEY ] = SCA_IInputDevice::KX_BKEY;
+ m[CKEY ] = SCA_IInputDevice::KX_CKEY;
+ m[DKEY ] = SCA_IInputDevice::KX_DKEY;
+ m[EKEY ] = SCA_IInputDevice::KX_EKEY;
+ m[FKEY ] = SCA_IInputDevice::KX_FKEY;
+ m[GKEY ] = SCA_IInputDevice::KX_GKEY;
+
+//XXX clean up
+#ifdef WIN32
+#define HKEY 'h'
+#endif
+ m[HKEY ] = SCA_IInputDevice::KX_HKEY;
+//XXX clean up
+#ifdef WIN32
+#undef HKEY
+#endif
+
+ m[IKEY ] = SCA_IInputDevice::KX_IKEY;
+ m[JKEY ] = SCA_IInputDevice::KX_JKEY;
+ m[KKEY ] = SCA_IInputDevice::KX_KKEY;
+ m[LKEY ] = SCA_IInputDevice::KX_LKEY;
+ m[MKEY ] = SCA_IInputDevice::KX_MKEY;
+ m[NKEY ] = SCA_IInputDevice::KX_NKEY;
+ m[OKEY ] = SCA_IInputDevice::KX_OKEY;
+ m[PKEY ] = SCA_IInputDevice::KX_PKEY;
+ m[QKEY ] = SCA_IInputDevice::KX_QKEY;
+ m[RKEY ] = SCA_IInputDevice::KX_RKEY;
+ m[SKEY ] = SCA_IInputDevice::KX_SKEY;
+ m[TKEY ] = SCA_IInputDevice::KX_TKEY;
+ m[UKEY ] = SCA_IInputDevice::KX_UKEY;
+ m[VKEY ] = SCA_IInputDevice::KX_VKEY;
+ m[WKEY ] = SCA_IInputDevice::KX_WKEY;
+ m[XKEY ] = SCA_IInputDevice::KX_XKEY;
+ m[YKEY ] = SCA_IInputDevice::KX_YKEY;
+ m[ZKEY ] = SCA_IInputDevice::KX_ZKEY;
+
+ m[ZEROKEY ] = SCA_IInputDevice::KX_ZEROKEY;
+ m[ONEKEY ] = SCA_IInputDevice::KX_ONEKEY;
+ m[TWOKEY ] = SCA_IInputDevice::KX_TWOKEY;
+ m[THREEKEY ] = SCA_IInputDevice::KX_THREEKEY;
+ m[FOURKEY ] = SCA_IInputDevice::KX_FOURKEY;
+ m[FIVEKEY ] = SCA_IInputDevice::KX_FIVEKEY;
+ m[SIXKEY ] = SCA_IInputDevice::KX_SIXKEY;
+ m[SEVENKEY ] = SCA_IInputDevice::KX_SEVENKEY;
+ m[EIGHTKEY ] = SCA_IInputDevice::KX_EIGHTKEY;
+ m[NINEKEY ] = SCA_IInputDevice::KX_NINEKEY;
+
+ m[CAPSLOCKKEY ] = SCA_IInputDevice::KX_CAPSLOCKKEY;
+
+ m[LEFTCTRLKEY ] = SCA_IInputDevice::KX_LEFTCTRLKEY;
+ m[LEFTALTKEY ] = SCA_IInputDevice::KX_LEFTALTKEY;
+ m[RIGHTALTKEY ] = SCA_IInputDevice::KX_RIGHTALTKEY;
+ m[RIGHTCTRLKEY ] = SCA_IInputDevice::KX_RIGHTCTRLKEY;
+ m[RIGHTSHIFTKEY ] = SCA_IInputDevice::KX_RIGHTSHIFTKEY;
+ m[LEFTSHIFTKEY ] = SCA_IInputDevice::KX_LEFTSHIFTKEY;
+
+ m[ESCKEY ] = SCA_IInputDevice::KX_ESCKEY;
+ m[TABKEY ] = SCA_IInputDevice::KX_TABKEY;
+ m[RETKEY ] = SCA_IInputDevice::KX_RETKEY;
+ m[SPACEKEY ] = SCA_IInputDevice::KX_SPACEKEY;
+ m[LINEFEEDKEY ] = SCA_IInputDevice::KX_LINEFEEDKEY;
+ m[BACKSPACEKEY ] = SCA_IInputDevice::KX_BACKSPACEKEY;
+ m[DELKEY ] = SCA_IInputDevice::KX_DELKEY;
+ m[SEMICOLONKEY ] = SCA_IInputDevice::KX_SEMICOLONKEY;
+ m[PERIODKEY ] = SCA_IInputDevice::KX_PERIODKEY;
+ m[COMMAKEY ] = SCA_IInputDevice::KX_COMMAKEY;
+ m[QUOTEKEY ] = SCA_IInputDevice::KX_QUOTEKEY;
+ m[ACCENTGRAVEKEY ] = SCA_IInputDevice::KX_ACCENTGRAVEKEY;
+ m[MINUSKEY ] = SCA_IInputDevice::KX_MINUSKEY;
+ m[SLASHKEY ] = SCA_IInputDevice::KX_SLASHKEY;
+ m[BACKSLASHKEY ] = SCA_IInputDevice::KX_BACKSLASHKEY;
+ m[EQUALKEY ] = SCA_IInputDevice::KX_EQUALKEY;
+ m[LEFTBRACKETKEY ] = SCA_IInputDevice::KX_LEFTBRACKETKEY;
+ m[RIGHTBRACKETKEY ] = SCA_IInputDevice::KX_RIGHTBRACKETKEY;
+
+ m[LEFTARROWKEY ] = SCA_IInputDevice::KX_LEFTARROWKEY;
+ m[DOWNARROWKEY ] = SCA_IInputDevice::KX_DOWNARROWKEY;
+ m[RIGHTARROWKEY ] = SCA_IInputDevice::KX_RIGHTARROWKEY;
+ m[UPARROWKEY ] = SCA_IInputDevice::KX_UPARROWKEY;
+
+ m[PAD2 ] = SCA_IInputDevice::KX_PAD2;
+ m[PAD4 ] = SCA_IInputDevice::KX_PAD4;
+ m[PAD6 ] = SCA_IInputDevice::KX_PAD6;
+ m[PAD8 ] = SCA_IInputDevice::KX_PAD8;
+
+ m[PAD1 ] = SCA_IInputDevice::KX_PAD1;
+ m[PAD3 ] = SCA_IInputDevice::KX_PAD3;
+ m[PAD5 ] = SCA_IInputDevice::KX_PAD5;
+ m[PAD7 ] = SCA_IInputDevice::KX_PAD7;
+ m[PAD9 ] = SCA_IInputDevice::KX_PAD9;
+
+ m[PADPERIOD ] = SCA_IInputDevice::KX_PADPERIOD;
+ m[PADSLASHKEY ] = SCA_IInputDevice::KX_PADSLASHKEY;
+ m[PADASTERKEY ] = SCA_IInputDevice::KX_PADASTERKEY;
+
+ m[PAD0 ] = SCA_IInputDevice::KX_PAD0;
+ m[PADMINUS ] = SCA_IInputDevice::KX_PADMINUS;
+ m[PADENTER ] = SCA_IInputDevice::KX_PADENTER;
+ m[PADPLUSKEY ] = SCA_IInputDevice::KX_PADPLUSKEY;
+
+
+ m[F1KEY ] = SCA_IInputDevice::KX_F1KEY;
+ m[F2KEY ] = SCA_IInputDevice::KX_F2KEY;
+ m[F3KEY ] = SCA_IInputDevice::KX_F3KEY;
+ m[F4KEY ] = SCA_IInputDevice::KX_F4KEY;
+ m[F5KEY ] = SCA_IInputDevice::KX_F5KEY;
+ m[F6KEY ] = SCA_IInputDevice::KX_F6KEY;
+ m[F7KEY ] = SCA_IInputDevice::KX_F7KEY;
+ m[F8KEY ] = SCA_IInputDevice::KX_F8KEY;
+ m[F9KEY ] = SCA_IInputDevice::KX_F9KEY;
+ m[F10KEY ] = SCA_IInputDevice::KX_F10KEY;
+ m[F11KEY ] = SCA_IInputDevice::KX_F11KEY;
+ m[F12KEY ] = SCA_IInputDevice::KX_F12KEY;
+ m[F13KEY ] = SCA_IInputDevice::KX_F13KEY;
+ m[F14KEY ] = SCA_IInputDevice::KX_F14KEY;
+ m[F15KEY ] = SCA_IInputDevice::KX_F15KEY;
+ m[F16KEY ] = SCA_IInputDevice::KX_F16KEY;
+ m[F17KEY ] = SCA_IInputDevice::KX_F17KEY;
+ m[F18KEY ] = SCA_IInputDevice::KX_F18KEY;
+ m[F19KEY ] = SCA_IInputDevice::KX_F19KEY;
+
+
+ m[PAUSEKEY ] = SCA_IInputDevice::KX_PAUSEKEY;
+ m[INSERTKEY ] = SCA_IInputDevice::KX_INSERTKEY;
+ m[HOMEKEY ] = SCA_IInputDevice::KX_HOMEKEY;
+ m[PAGEUPKEY ] = SCA_IInputDevice::KX_PAGEUPKEY;
+ m[PAGEDOWNKEY ] = SCA_IInputDevice::KX_PAGEDOWNKEY;
+ m[ENDKEY ] = SCA_IInputDevice::KX_ENDKEY;
+
+ return m;
+}
+
+static std::map<int, SCA_IInputDevice::KX_EnumInputs> gReverseKeyTranslateTable = create_translate_table();
+
static unsigned int KX_rgbaint2uint_new(unsigned int icol)
{
union
@@ -1678,7 +1852,8 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
-static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int layerflag, KX_Scene *kxscene, RAS_IRenderTools *rendertools, KX_BlenderSceneConverter *converter) {
+static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int layerflag, KX_Scene *kxscene, RAS_IRenderTools *rendertools, KX_BlenderSceneConverter *converter)
+{
RAS_LightObject lightobj;
KX_LightObject *gamelight;
@@ -1722,7 +1897,8 @@ static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int l
return gamelight;
}
-static KX_Camera *gamecamera_from_bcamera(Object *ob, KX_Scene *kxscene, KX_BlenderSceneConverter *converter) {
+static KX_Camera *gamecamera_from_bcamera(Object *ob, KX_Scene *kxscene, KX_BlenderSceneConverter *converter)
+{
Camera* ca = static_cast<Camera*>(ob->data);
RAS_CameraData camdata(ca->lens, ca->ortho_scale, ca->sensor_x, ca->sensor_y, ca->sensor_fit, ca->clipsta, ca->clipend, ca->type == CAM_PERSP, ca->YF_dofdist);
KX_Camera *gamecamera;
@@ -2854,3 +3030,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
RAS_BucketManager *bucketmanager = kxscene->GetBucketManager();
bucketmanager->OptimizeBuckets(distance);
}
+
+SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code)
+{
+ return gReverseKeyTranslateTable[key_code];
+}
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h
index 2ae7fee1798..6da3ac90aef 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.h
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.h
@@ -36,6 +36,7 @@
#include "STR_String.h"
#include "KX_Python.h"
#include "KX_PhysicsEngineEnums.h"
+#include "SCA_IInputDevice.h"
class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter);
@@ -49,5 +50,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
bool alwaysUseExpandFraming
);
+SCA_IInputDevice::KX_EnumInputs ConvertKeyCode(int key_code);
+
#endif // __BLENDER_CONVERT
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index 81533205909..f320df12078 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -217,14 +217,14 @@ void BL_SkinDeformer::BGEDeformVerts()
Object *par_arma = m_armobj->GetArmatureObject();
MDeformVert *dverts = m_bmesh->dvert;
bDeformGroup *dg;
- int numGroups = BLI_countlist(&m_objMesh->defbase);
+ int defbase_tot = BLI_countlist(&m_objMesh->defbase);
if (!dverts)
return;
if (m_dfnrToPC == NULL)
{
- m_dfnrToPC = new bPoseChannel*[numGroups];
+ m_dfnrToPC = new bPoseChannel*[defbase_tot];
int i;
for (i=0, dg=(bDeformGroup*)m_objMesh->defbase.first;
dg;
@@ -237,12 +237,12 @@ void BL_SkinDeformer::BGEDeformVerts()
}
}
+ MDeformVert *dv= dverts;
- for (int i=0; i<m_bmesh->totvert; ++i)
+ for (int i=0; i<m_bmesh->totvert; ++i, dv++)
{
float contrib = 0.f, weight, max_weight=0.f;
bPoseChannel *pchan=NULL;
- MDeformVert *dvert;
Eigen::Map<Eigen::Vector3f> norm(m_transnors[i]);
Eigen::Vector4f vec(0, 0, 0, 1);
Eigen::Matrix4f norm_chan_mat;
@@ -251,18 +251,18 @@ void BL_SkinDeformer::BGEDeformVerts()
m_transverts[i][2],
1.f);
- dvert = dverts+i;
-
- if (!dvert->totweight)
+ if (!dv->totweight)
continue;
- for (int j=0; j<dvert->totweight; ++j)
+ MDeformWeight *dw= dv->dw;
+
+ for (unsigned int j= dv->totweight; j != 0; j--, dw++)
{
- int index = dvert->dw[j].def_nr;
+ const int index = dw->def_nr;
- if (index < numGroups && (pchan=m_dfnrToPC[index]))
+ if (index < defbase_tot && (pchan=m_dfnrToPC[index]))
{
- weight = dvert->dw[j].weight;
+ weight = dw->weight;
if (weight)
{
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
index a7ef518336a..343cf023417 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
@@ -66,7 +66,8 @@ BL_InterpolatorList::~BL_InterpolatorList() {
}
}
-KX_IScalarInterpolator *BL_InterpolatorList::GetScalarInterpolator(const char *rna_path, int array_index) {
+KX_IScalarInterpolator *BL_InterpolatorList::GetScalarInterpolator(const char *rna_path, int array_index)
+{
for(BL_InterpolatorList::iterator i = begin(); (i != end()) ; i++ )
{
FCurve *fcu= (static_cast<BL_ScalarInterpolator *>(*i))->GetFCurve();
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 2f5125a63dd..4fe436d634c 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -703,8 +703,8 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
}
-void KX_BlenderSceneConverter::resetNoneDynamicObjectToIpo(){
-
+void KX_BlenderSceneConverter::resetNoneDynamicObjectToIpo()
+{
if (addInitFromFrame){
KX_SceneList* scenes = m_ketsjiEngine->CurrentScenes();
int numScenes = scenes->size();
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index b7aee8ec924..9391d12a3ce 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -86,10 +86,7 @@ probably misplaced */
#include "KX_KetsjiEngine.h"
#include "KX_BlenderSceneConverter.h"
-
-// this map is Blender specific: a conversion between blender and ketsji enums
-std::map<int,SCA_IInputDevice::KX_EnumInputs> gReverseKeyTranslateTable;
-
+#include "BL_BlenderDataConversion.h"
void BL_ConvertSensors(struct Object* blenderobject,
class KX_GameObject* gameobj,
@@ -102,177 +99,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
KX_BlenderSceneConverter* converter
)
{
- static bool reverseTableConverted = false;
-
- if (!reverseTableConverted)
- {
- reverseTableConverted = true;
-
- /* The reverse table. In order to not confuse ourselves, we */
- /* immediately convert all events that come in to KX codes. */
- gReverseKeyTranslateTable[LEFTMOUSE ] = SCA_IInputDevice::KX_LEFTMOUSE;
- gReverseKeyTranslateTable[MIDDLEMOUSE ] = SCA_IInputDevice::KX_MIDDLEMOUSE;
- gReverseKeyTranslateTable[RIGHTMOUSE ] = SCA_IInputDevice::KX_RIGHTMOUSE;
- gReverseKeyTranslateTable[WHEELUPMOUSE ] = SCA_IInputDevice::KX_WHEELUPMOUSE;
- gReverseKeyTranslateTable[WHEELDOWNMOUSE ] = SCA_IInputDevice::KX_WHEELDOWNMOUSE;
- gReverseKeyTranslateTable[MOUSEX ] = SCA_IInputDevice::KX_MOUSEX;
- gReverseKeyTranslateTable[MOUSEY ] = SCA_IInputDevice::KX_MOUSEY;
-
- // TIMERS
-
- gReverseKeyTranslateTable[TIMER0 ] = SCA_IInputDevice::KX_TIMER0;
- gReverseKeyTranslateTable[TIMER1 ] = SCA_IInputDevice::KX_TIMER1;
- gReverseKeyTranslateTable[TIMER2 ] = SCA_IInputDevice::KX_TIMER2;
-
- // SYSTEM
-
-#if 0
- /* **** XXX **** */
- gReverseKeyTranslateTable[KEYBD ] = SCA_IInputDevice::KX_KEYBD;
- gReverseKeyTranslateTable[RAWKEYBD ] = SCA_IInputDevice::KX_RAWKEYBD;
- gReverseKeyTranslateTable[REDRAW ] = SCA_IInputDevice::KX_REDRAW;
- gReverseKeyTranslateTable[INPUTCHANGE ] = SCA_IInputDevice::KX_INPUTCHANGE;
- gReverseKeyTranslateTable[QFULL ] = SCA_IInputDevice::KX_QFULL;
- gReverseKeyTranslateTable[WINFREEZE ] = SCA_IInputDevice::KX_WINFREEZE;
- gReverseKeyTranslateTable[WINTHAW ] = SCA_IInputDevice::KX_WINTHAW;
- gReverseKeyTranslateTable[WINCLOSE ] = SCA_IInputDevice::KX_WINCLOSE;
- gReverseKeyTranslateTable[WINQUIT ] = SCA_IInputDevice::KX_WINQUIT;
- gReverseKeyTranslateTable[Q_FIRSTTIME ] = SCA_IInputDevice::KX_Q_FIRSTTIME;
- /* **** XXX **** */
-#endif
-
- // standard keyboard
-
- gReverseKeyTranslateTable[AKEY ] = SCA_IInputDevice::KX_AKEY;
- gReverseKeyTranslateTable[BKEY ] = SCA_IInputDevice::KX_BKEY;
- gReverseKeyTranslateTable[CKEY ] = SCA_IInputDevice::KX_CKEY;
- gReverseKeyTranslateTable[DKEY ] = SCA_IInputDevice::KX_DKEY;
- gReverseKeyTranslateTable[EKEY ] = SCA_IInputDevice::KX_EKEY;
- gReverseKeyTranslateTable[FKEY ] = SCA_IInputDevice::KX_FKEY;
- gReverseKeyTranslateTable[GKEY ] = SCA_IInputDevice::KX_GKEY;
-
-//XXX clean up
-#ifdef WIN32
-#define HKEY 'h'
-#endif
- gReverseKeyTranslateTable[HKEY ] = SCA_IInputDevice::KX_HKEY;
-//XXX clean up
-#ifdef WIN32
-#undef HKEY
-#endif
-
- gReverseKeyTranslateTable[IKEY ] = SCA_IInputDevice::KX_IKEY;
- gReverseKeyTranslateTable[JKEY ] = SCA_IInputDevice::KX_JKEY;
- gReverseKeyTranslateTable[KKEY ] = SCA_IInputDevice::KX_KKEY;
- gReverseKeyTranslateTable[LKEY ] = SCA_IInputDevice::KX_LKEY;
- gReverseKeyTranslateTable[MKEY ] = SCA_IInputDevice::KX_MKEY;
- gReverseKeyTranslateTable[NKEY ] = SCA_IInputDevice::KX_NKEY;
- gReverseKeyTranslateTable[OKEY ] = SCA_IInputDevice::KX_OKEY;
- gReverseKeyTranslateTable[PKEY ] = SCA_IInputDevice::KX_PKEY;
- gReverseKeyTranslateTable[QKEY ] = SCA_IInputDevice::KX_QKEY;
- gReverseKeyTranslateTable[RKEY ] = SCA_IInputDevice::KX_RKEY;
- gReverseKeyTranslateTable[SKEY ] = SCA_IInputDevice::KX_SKEY;
- gReverseKeyTranslateTable[TKEY ] = SCA_IInputDevice::KX_TKEY;
- gReverseKeyTranslateTable[UKEY ] = SCA_IInputDevice::KX_UKEY;
- gReverseKeyTranslateTable[VKEY ] = SCA_IInputDevice::KX_VKEY;
- gReverseKeyTranslateTable[WKEY ] = SCA_IInputDevice::KX_WKEY;
- gReverseKeyTranslateTable[XKEY ] = SCA_IInputDevice::KX_XKEY;
- gReverseKeyTranslateTable[YKEY ] = SCA_IInputDevice::KX_YKEY;
- gReverseKeyTranslateTable[ZKEY ] = SCA_IInputDevice::KX_ZKEY;
-
- gReverseKeyTranslateTable[ZEROKEY ] = SCA_IInputDevice::KX_ZEROKEY;
- gReverseKeyTranslateTable[ONEKEY ] = SCA_IInputDevice::KX_ONEKEY;
- gReverseKeyTranslateTable[TWOKEY ] = SCA_IInputDevice::KX_TWOKEY;
- gReverseKeyTranslateTable[THREEKEY ] = SCA_IInputDevice::KX_THREEKEY;
- gReverseKeyTranslateTable[FOURKEY ] = SCA_IInputDevice::KX_FOURKEY;
- gReverseKeyTranslateTable[FIVEKEY ] = SCA_IInputDevice::KX_FIVEKEY;
- gReverseKeyTranslateTable[SIXKEY ] = SCA_IInputDevice::KX_SIXKEY;
- gReverseKeyTranslateTable[SEVENKEY ] = SCA_IInputDevice::KX_SEVENKEY;
- gReverseKeyTranslateTable[EIGHTKEY ] = SCA_IInputDevice::KX_EIGHTKEY;
- gReverseKeyTranslateTable[NINEKEY ] = SCA_IInputDevice::KX_NINEKEY;
-
- gReverseKeyTranslateTable[CAPSLOCKKEY ] = SCA_IInputDevice::KX_CAPSLOCKKEY;
-
- gReverseKeyTranslateTable[LEFTCTRLKEY ] = SCA_IInputDevice::KX_LEFTCTRLKEY;
- gReverseKeyTranslateTable[LEFTALTKEY ] = SCA_IInputDevice::KX_LEFTALTKEY;
- gReverseKeyTranslateTable[RIGHTALTKEY ] = SCA_IInputDevice::KX_RIGHTALTKEY;
- gReverseKeyTranslateTable[RIGHTCTRLKEY ] = SCA_IInputDevice::KX_RIGHTCTRLKEY;
- gReverseKeyTranslateTable[RIGHTSHIFTKEY ] = SCA_IInputDevice::KX_RIGHTSHIFTKEY;
- gReverseKeyTranslateTable[LEFTSHIFTKEY ] = SCA_IInputDevice::KX_LEFTSHIFTKEY;
-
- gReverseKeyTranslateTable[ESCKEY ] = SCA_IInputDevice::KX_ESCKEY;
- gReverseKeyTranslateTable[TABKEY ] = SCA_IInputDevice::KX_TABKEY;
- gReverseKeyTranslateTable[RETKEY ] = SCA_IInputDevice::KX_RETKEY;
- gReverseKeyTranslateTable[SPACEKEY ] = SCA_IInputDevice::KX_SPACEKEY;
- gReverseKeyTranslateTable[LINEFEEDKEY ] = SCA_IInputDevice::KX_LINEFEEDKEY;
- gReverseKeyTranslateTable[BACKSPACEKEY ] = SCA_IInputDevice::KX_BACKSPACEKEY;
- gReverseKeyTranslateTable[DELKEY ] = SCA_IInputDevice::KX_DELKEY;
- gReverseKeyTranslateTable[SEMICOLONKEY ] = SCA_IInputDevice::KX_SEMICOLONKEY;
- gReverseKeyTranslateTable[PERIODKEY ] = SCA_IInputDevice::KX_PERIODKEY;
- gReverseKeyTranslateTable[COMMAKEY ] = SCA_IInputDevice::KX_COMMAKEY;
- gReverseKeyTranslateTable[QUOTEKEY ] = SCA_IInputDevice::KX_QUOTEKEY;
- gReverseKeyTranslateTable[ACCENTGRAVEKEY ] = SCA_IInputDevice::KX_ACCENTGRAVEKEY;
- gReverseKeyTranslateTable[MINUSKEY ] = SCA_IInputDevice::KX_MINUSKEY;
- gReverseKeyTranslateTable[SLASHKEY ] = SCA_IInputDevice::KX_SLASHKEY;
- gReverseKeyTranslateTable[BACKSLASHKEY ] = SCA_IInputDevice::KX_BACKSLASHKEY;
- gReverseKeyTranslateTable[EQUALKEY ] = SCA_IInputDevice::KX_EQUALKEY;
- gReverseKeyTranslateTable[LEFTBRACKETKEY ] = SCA_IInputDevice::KX_LEFTBRACKETKEY;
- gReverseKeyTranslateTable[RIGHTBRACKETKEY ] = SCA_IInputDevice::KX_RIGHTBRACKETKEY;
-
- gReverseKeyTranslateTable[LEFTARROWKEY ] = SCA_IInputDevice::KX_LEFTARROWKEY;
- gReverseKeyTranslateTable[DOWNARROWKEY ] = SCA_IInputDevice::KX_DOWNARROWKEY;
- gReverseKeyTranslateTable[RIGHTARROWKEY ] = SCA_IInputDevice::KX_RIGHTARROWKEY;
- gReverseKeyTranslateTable[UPARROWKEY ] = SCA_IInputDevice::KX_UPARROWKEY;
-
- gReverseKeyTranslateTable[PAD2 ] = SCA_IInputDevice::KX_PAD2;
- gReverseKeyTranslateTable[PAD4 ] = SCA_IInputDevice::KX_PAD4;
- gReverseKeyTranslateTable[PAD6 ] = SCA_IInputDevice::KX_PAD6;
- gReverseKeyTranslateTable[PAD8 ] = SCA_IInputDevice::KX_PAD8;
-
- gReverseKeyTranslateTable[PAD1 ] = SCA_IInputDevice::KX_PAD1;
- gReverseKeyTranslateTable[PAD3 ] = SCA_IInputDevice::KX_PAD3;
- gReverseKeyTranslateTable[PAD5 ] = SCA_IInputDevice::KX_PAD5;
- gReverseKeyTranslateTable[PAD7 ] = SCA_IInputDevice::KX_PAD7;
- gReverseKeyTranslateTable[PAD9 ] = SCA_IInputDevice::KX_PAD9;
-
- gReverseKeyTranslateTable[PADPERIOD ] = SCA_IInputDevice::KX_PADPERIOD;
- gReverseKeyTranslateTable[PADSLASHKEY ] = SCA_IInputDevice::KX_PADSLASHKEY;
- gReverseKeyTranslateTable[PADASTERKEY ] = SCA_IInputDevice::KX_PADASTERKEY;
-
- gReverseKeyTranslateTable[PAD0 ] = SCA_IInputDevice::KX_PAD0;
- gReverseKeyTranslateTable[PADMINUS ] = SCA_IInputDevice::KX_PADMINUS;
- gReverseKeyTranslateTable[PADENTER ] = SCA_IInputDevice::KX_PADENTER;
- gReverseKeyTranslateTable[PADPLUSKEY ] = SCA_IInputDevice::KX_PADPLUSKEY;
-
-
- gReverseKeyTranslateTable[F1KEY ] = SCA_IInputDevice::KX_F1KEY;
- gReverseKeyTranslateTable[F2KEY ] = SCA_IInputDevice::KX_F2KEY;
- gReverseKeyTranslateTable[F3KEY ] = SCA_IInputDevice::KX_F3KEY;
- gReverseKeyTranslateTable[F4KEY ] = SCA_IInputDevice::KX_F4KEY;
- gReverseKeyTranslateTable[F5KEY ] = SCA_IInputDevice::KX_F5KEY;
- gReverseKeyTranslateTable[F6KEY ] = SCA_IInputDevice::KX_F6KEY;
- gReverseKeyTranslateTable[F7KEY ] = SCA_IInputDevice::KX_F7KEY;
- gReverseKeyTranslateTable[F8KEY ] = SCA_IInputDevice::KX_F8KEY;
- gReverseKeyTranslateTable[F9KEY ] = SCA_IInputDevice::KX_F9KEY;
- gReverseKeyTranslateTable[F10KEY ] = SCA_IInputDevice::KX_F10KEY;
- gReverseKeyTranslateTable[F11KEY ] = SCA_IInputDevice::KX_F11KEY;
- gReverseKeyTranslateTable[F12KEY ] = SCA_IInputDevice::KX_F12KEY;
- gReverseKeyTranslateTable[F13KEY ] = SCA_IInputDevice::KX_F13KEY;
- gReverseKeyTranslateTable[F14KEY ] = SCA_IInputDevice::KX_F14KEY;
- gReverseKeyTranslateTable[F15KEY ] = SCA_IInputDevice::KX_F15KEY;
- gReverseKeyTranslateTable[F16KEY ] = SCA_IInputDevice::KX_F16KEY;
- gReverseKeyTranslateTable[F17KEY ] = SCA_IInputDevice::KX_F17KEY;
- gReverseKeyTranslateTable[F18KEY ] = SCA_IInputDevice::KX_F18KEY;
- gReverseKeyTranslateTable[F19KEY ] = SCA_IInputDevice::KX_F19KEY;
-
-
- gReverseKeyTranslateTable[PAUSEKEY ] = SCA_IInputDevice::KX_PAUSEKEY;
- gReverseKeyTranslateTable[INSERTKEY ] = SCA_IInputDevice::KX_INSERTKEY;
- gReverseKeyTranslateTable[HOMEKEY ] = SCA_IInputDevice::KX_HOMEKEY;
- gReverseKeyTranslateTable[PAGEUPKEY ] = SCA_IInputDevice::KX_PAGEUPKEY;
- gReverseKeyTranslateTable[PAGEDOWNKEY ] = SCA_IInputDevice::KX_PAGEDOWNKEY;
- gReverseKeyTranslateTable[ENDKEY ] = SCA_IInputDevice::KX_ENDKEY;
- }
int executePriority = 0;
int uniqueint = 0;
@@ -470,9 +296,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
if (eventmgr)
{
gamesensor = new SCA_KeyboardSensor(eventmgr,
- gReverseKeyTranslateTable[blenderkeybdsensor->key],
- gReverseKeyTranslateTable[blenderkeybdsensor->qual],
- gReverseKeyTranslateTable[blenderkeybdsensor->qual2],
+ ConvertKeyCode(blenderkeybdsensor->key),
+ ConvertKeyCode(blenderkeybdsensor->qual),
+ ConvertKeyCode(blenderkeybdsensor->qual2),
(blenderkeybdsensor->type == SENS_ALL_KEYS),
blenderkeybdsensor->targetName,
blenderkeybdsensor->toggleName,
diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp
index 1db5f1114c2..a56fbe5bef2 100644
--- a/source/gameengine/Converter/KX_IpoConvert.cpp
+++ b/source/gameengine/Converter/KX_IpoConvert.cpp
@@ -72,7 +72,8 @@
#include "STR_HashedString.h"
-static BL_InterpolatorList *GetAdtList(struct bAction *for_act, KX_BlenderSceneConverter *converter) {
+static BL_InterpolatorList *GetAdtList(struct bAction *for_act, KX_BlenderSceneConverter *converter)
+{
BL_InterpolatorList *adtList= converter->FindInterpolatorList(for_act);
if (!adtList) {
diff --git a/source/gameengine/Expressions/InputParser.cpp b/source/gameengine/Expressions/InputParser.cpp
index 27f4f0b10cb..726fea795ba 100644
--- a/source/gameengine/Expressions/InputParser.cpp
+++ b/source/gameengine/Expressions/InputParser.cpp
@@ -346,7 +346,8 @@ void CParser::NextSym()
}
#if 0
-int CParser::MakeInt() {
+int CParser::MakeInt()
+{
// returns the integer representation of the value in the global
// variable const_as_string
// pre: const_as_string contains only numercal chars
@@ -354,7 +355,8 @@ int CParser::MakeInt() {
}
#endif
-STR_String CParser::Symbol2Str(int s) {
+STR_String CParser::Symbol2Str(int s)
+{
// returns a string representation of of symbol s,
// for use in Term when generating an error
switch(s) {
@@ -373,7 +375,8 @@ STR_String CParser::Symbol2Str(int s) {
}
}
-void CParser::Term(int s) {
+void CParser::Term(int s)
+{
// generates an error if the next symbol isn't the specified symbol s
// otherwise, skip the symbol
if(s == sym) NextSym();
@@ -387,7 +390,8 @@ void CParser::Term(int s) {
}
}
-int CParser::Priority(int optorkind) {
+int CParser::Priority(int optorkind)
+{
// returns the priority of an operator
// higher number means higher priority
switch(optorkind) {
@@ -409,7 +413,8 @@ int CParser::Priority(int optorkind) {
return 0; // should not happen
}
-CExpression *CParser::Ex(int i) {
+CExpression *CParser::Ex(int i)
+{
// parses an expression in the imput, starting at priority i, and
// returns an CExpression, containing the parsed input
CExpression *e1 = NULL, *e2 = NULL;
@@ -551,7 +556,8 @@ CExpression *CParser::Ex(int i) {
return e1;
}
-CExpression *CParser::Expr() {
+CExpression *CParser::Expr()
+{
// parses an expression in the imput, and
// returns an CExpression, containing the parsed input
return Ex(1);
diff --git a/source/gameengine/Expressions/Operator1Expr.cpp b/source/gameengine/Expressions/Operator1Expr.cpp
index 0ef35108233..4e93ee0cb09 100644
--- a/source/gameengine/Expressions/Operator1Expr.cpp
+++ b/source/gameengine/Expressions/Operator1Expr.cpp
@@ -98,10 +98,9 @@ bool COperator1Expr::IsInside(float x, float y, float z,bool bBorderInclude)
}
*/
-bool COperator1Expr::NeedsRecalculated() {
-
+bool COperator1Expr::NeedsRecalculated()
+{
return m_lhs->NeedsRecalculated();
-
}
CExpression* COperator1Expr::CheckLink(std::vector<CBrokenLinkInfo*>& brokenlinks) {
diff --git a/source/gameengine/Expressions/Operator2Expr.cpp b/source/gameengine/Expressions/Operator2Expr.cpp
index 7a012c4165c..11a509e59d0 100644
--- a/source/gameengine/Expressions/Operator2Expr.cpp
+++ b/source/gameengine/Expressions/Operator2Expr.cpp
@@ -168,17 +168,18 @@ bool COperator2Expr::IsInside(float x, float y, float z,bool bBorderInclude)
-bool COperator2Expr::IsRightInside(float x, float y, float z,bool bBorderInclude) {
-
+bool COperator2Expr::IsRightInside(float x, float y, float z,bool bBorderInclude)
+{
return m_rhs->IsInside(x,y,z,bBorderInclude) ;
-
}
-bool COperator2Expr::IsLeftInside(float x, float y, float z,bool bBorderInclude) {
+bool COperator2Expr::IsLeftInside(float x, float y, float z,bool bBorderInclude)
+{
return m_lhs->IsInside(x,y,z,bBorderInclude);
}
*/
-bool COperator2Expr::NeedsRecalculated() {
+bool COperator2Expr::NeedsRecalculated()
+{
// added some lines, just for debugging purposes, it could be a one-liner :)
//bool modleft
//bool modright;
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 3e1c54b0cc7..b1072dd8336 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -54,7 +54,8 @@ extern "C" {
}
#endif
-static inline void Py_Fatal(const char *M) {
+static inline void Py_Fatal(const char *M)
+{
fprintf(stderr, "%s\n", M);
exit(-1);
};
diff --git a/source/gameengine/Expressions/StringValue.h b/source/gameengine/Expressions/StringValue.h
index e5a892ff82d..931858b7eed 100644
--- a/source/gameengine/Expressions/StringValue.h
+++ b/source/gameengine/Expressions/StringValue.h
@@ -43,7 +43,7 @@ public:
virtual CValue* GetReplica();
#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython() {
- return PyUnicode_FromString(m_strString.Ptr());
+ return PyUnicode_From_STR_String(m_strString);
}
#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index 91fdbb0dabc..49150fc775f 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -530,7 +530,8 @@ PyAttributeDef CValue::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject * CValue::pyattr_get_name(void * self_v, const KX_PYATTRIBUTE_DEF * attrdef) {
+PyObject * CValue::pyattr_get_name(void * self_v, const KX_PYATTRIBUTE_DEF * attrdef)
+{
CValue * self = static_cast<CValue *> (self_v);
return PyUnicode_From_STR_String(self->GetName());
}
diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h
index f9697a55d3f..10d8a8abd8f 100644
--- a/source/gameengine/Expressions/Value.h
+++ b/source/gameengine/Expressions/Value.h
@@ -221,7 +221,7 @@ public:
//static PyObject* PyMake(PyObject*,PyObject*);
virtual PyObject *py_repr(void)
{
- return PyUnicode_FromString((const char*)GetText());
+ return PyUnicode_From_STR_String(GetText());
}
virtual PyObject* ConvertValueToPython() {
diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt
index 64c2af9031b..98255bb8b97 100644
--- a/source/gameengine/GameLogic/CMakeLists.txt
+++ b/source/gameengine/GameLogic/CMakeLists.txt
@@ -132,6 +132,10 @@ if(WITH_SDL)
)
add_definitions(-DWITH_SDL)
+
+ if(WITH_GHOST_SDL)
+ add_definitions(-DWITH_GHOST_SDL)
+ endif()
endif()
blender_add_lib(ge_logic "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
index 0547d97285d..15aeef242b7 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
+++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
@@ -88,8 +88,14 @@ SCA_Joystick *SCA_Joystick::GetInstance( short int joyindex )
if (m_refCount == 0)
{
int i;
- // do this once only
+ // The video subsystem is required for joystick input to work. However,
+ // when GHOST is running under SDL, video is initialised elsewhere.
+ // Do this once only.
+# ifdef WITH_GHOST_SDL
+ if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1 ){
+# else
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO) == -1 ){
+# endif
echo("Error-Initializing-SDL: " << SDL_GetError());
return NULL;
}
@@ -124,7 +130,14 @@ void SCA_Joystick::ReleaseInstance()
m_instance[i]= NULL;
}
+ // The video subsystem is required for joystick input to work. However,
+ // when GHOST is running under SDL, video is freed elsewhere.
+ // Do this once only.
+# ifdef WITH_GHOST_SDL
+ SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
+# else
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_VIDEO);
+# endif
#endif /* WITH_SDL */
}
}
diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp
index 336150b2d6d..2a903e4f8b6 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -86,7 +86,8 @@ void SCA_ISensor::ProcessReplica()
m_linkedcontrollers.clear();
}
-bool SCA_ISensor::IsPositiveTrigger() {
+bool SCA_ISensor::IsPositiveTrigger()
+{
bool result = false;
if (m_eventval) {
@@ -107,40 +108,49 @@ void SCA_ISensor::SetPulseMode(bool posmode,
m_pulse_frequency = freq;
}
-void SCA_ISensor::SetInvert(bool inv) {
+void SCA_ISensor::SetInvert(bool inv)
+{
m_invert = inv;
}
-void SCA_ISensor::SetLevel(bool lvl) {
+void SCA_ISensor::SetLevel(bool lvl)
+{
m_level = lvl;
}
-void SCA_ISensor::SetTap(bool tap) {
+void SCA_ISensor::SetTap(bool tap)
+{
m_tap = tap;
}
-double SCA_ISensor::GetNumber() {
+double SCA_ISensor::GetNumber()
+{
return GetState();
}
-void SCA_ISensor::Suspend() {
+void SCA_ISensor::Suspend()
+{
m_suspended = true;
}
-bool SCA_ISensor::IsSuspended() {
+bool SCA_ISensor::IsSuspended()
+{
return m_suspended;
}
-void SCA_ISensor::Resume() {
+void SCA_ISensor::Resume()
+{
m_suspended = false;
}
-void SCA_ISensor::Init() {
+void SCA_ISensor::Init()
+{
printf("Sensor %s has no init function, please report this bug to Blender.org\n", m_name.Ptr());
}
-void SCA_ISensor::DecLink() {
+void SCA_ISensor::DecLink()
+{
m_links--;
if (m_links < 0)
{
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index b055a7b1603..430326cbce0 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -266,7 +266,8 @@ bool SCA_RandomActuator::Update()
return false;
}
-void SCA_RandomActuator::enforceConstraints() {
+void SCA_RandomActuator::enforceConstraints()
+{
/* The constraints that are checked here are the ones fundamental to */
/* the various distributions. Limitations of the algorithms are checked */
/* elsewhere (or they should be... ). */
diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
index c3a8ba0e467..a12619aa925 100644
--- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
@@ -65,7 +65,8 @@ SCA_RandomNumberGenerator::~SCA_RandomNumberGenerator() {
/* intentionally empty */
}
-void SCA_RandomNumberGenerator::SetStartVector(void) {
+void SCA_RandomNumberGenerator::SetStartVector(void)
+{
/* setting initial seeds to mt[N] using */
/* the generator Line 25 of Table 1 in */
/* [KNUTH 1981, The Art of Computer Programming */
@@ -85,7 +86,8 @@ void SCA_RandomNumberGenerator::SetSeed(long newseed)
/**
* This is the important part: copied verbatim :)
*/
-unsigned long SCA_RandomNumberGenerator::Draw() {
+unsigned long SCA_RandomNumberGenerator::Draw()
+{
static unsigned long mag01[2] = { 0x0, MATRIX_A };
/* mag01[x] = x * MATRIX_A for x=0,1 */
@@ -121,7 +123,8 @@ unsigned long SCA_RandomNumberGenerator::Draw() {
return y;
}
-float SCA_RandomNumberGenerator::DrawFloat() {
+float SCA_RandomNumberGenerator::DrawFloat()
+{
return ( (float) Draw()/ (unsigned long) 0xffffffff );
}
diff --git a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
index 5b267c92908..3d88dc467b0 100644
--- a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
+++ b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
@@ -57,6 +57,7 @@ protected:
* System dependent keyboard codes are stored as ints.
*/
std::map<int, KX_EnumInputs> m_reverseKeyTranslateTable;
+ short m_exitkey;
public:
bool m_hookesc;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index 7490e187824..f249510ecc7 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -40,6 +40,7 @@
#include "GPU_extensions.h"
#include "GPG_Application.h"
+#include "BL_BlenderDataConversion.h"
#include <iostream>
#include <MT_assert.h>
@@ -626,6 +627,8 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetRasterizer(m_rasterizer);
m_ketsjiengine->SetTimingDisplay(frameRate, false, false);
+
+ KX_KetsjiEngine::SetExitKey(ConvertKeyCode(gm->exitkey));
#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
#else
@@ -786,6 +789,10 @@ void GPG_Application::stopEngine()
void GPG_Application::exitEngine()
{
+ // We only want to kill the engine if it has been initialized
+ if (!m_engineInitialized)
+ return;
+
sound_exit();
if (m_ketsjiengine)
{
@@ -908,12 +915,10 @@ bool GPG_Application::handleKey(GHOST_IEvent* event, bool isDown)
{
GHOST_TEventDataPtr eventData = ((GHOST_IEvent*)event)->getData();
GHOST_TEventKeyData* keyData = static_cast<GHOST_TEventKeyData*>(eventData);
- //no need for this test
- //if (fSystem->getFullScreen()) {
- if (keyData->key == GHOST_kKeyEsc && !m_keyboard->m_hookesc && !m_isEmbedded) {
- m_exitRequested = KX_EXIT_REQUEST_OUTSIDE;
- }
- //}
+
+ if (m_keyboard->ToNative(keyData->key) == KX_KetsjiEngine::GetExitKey() && !m_keyboard->m_hookesc && !m_isEmbedded) {
+ m_exitRequested = KX_EXIT_REQUEST_OUTSIDE;
+ }
m_keyboard->ConvertEvent(keyData->key, isDown);
handled = true;
}
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h
index a8a976f9dd2..37625dc8998 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h
@@ -103,6 +103,7 @@ protected:
* Shuts the game engine down.
*/
void exitEngine(void);
+ short m_exitkey;
/* The game data */
STR_String m_startSceneName;
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.cpp b/source/gameengine/Ketsji/BL_BlenderShader.cpp
index 6680e9556b9..0f97898c73f 100644
--- a/source/gameengine/Ketsji/BL_BlenderShader.cpp
+++ b/source/gameengine/Ketsji/BL_BlenderShader.cpp
@@ -8,6 +8,7 @@
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_DerivedMesh.h"
#include "BL_BlenderShader.h"
#include "BL_Material.h"
@@ -146,7 +147,8 @@ void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty )
else
obcol[0]= obcol[1]= obcol[2]= obcol[3]= 1.0f;
- GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol);
+ float auto_bump_scale = ms.m_pDerivedMesh!=0 ? ms.m_pDerivedMesh->auto_bump_scale : 1.0f;
+ GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol, auto_bump_scale);
mAlphaBlend = GPU_material_alpha_blend(gpumat, obcol);
}
diff --git a/source/gameengine/Ketsji/BL_Material.cpp b/source/gameengine/Ketsji/BL_Material.cpp
index fd0756d067d..092f9273a6b 100644
--- a/source/gameengine/Ketsji/BL_Material.cpp
+++ b/source/gameengine/Ketsji/BL_Material.cpp
@@ -98,21 +98,24 @@ void BL_Material::Initialize()
}
}
-void BL_Material::SetConversionRGB(unsigned int *nrgb) {
+void BL_Material::SetConversionRGB(unsigned int *nrgb)
+{
rgb[0]=*nrgb++;
rgb[1]=*nrgb++;
rgb[2]=*nrgb++;
rgb[3]=*nrgb;
}
-void BL_Material::GetConversionRGB(unsigned int *nrgb) {
+void BL_Material::GetConversionRGB(unsigned int *nrgb)
+{
*nrgb++ = rgb[0];
*nrgb++ = rgb[1];
*nrgb++ = rgb[2];
*nrgb = rgb[3];
}
-void BL_Material::SetConversionUV(const STR_String& name, MT_Point2 *nuv) {
+void BL_Material::SetConversionUV(const STR_String& name, MT_Point2 *nuv)
+{
uvName = name;
uv[0] = *nuv++;
uv[1] = *nuv++;
@@ -120,13 +123,15 @@ void BL_Material::SetConversionUV(const STR_String& name, MT_Point2 *nuv) {
uv[3] = *nuv;
}
-void BL_Material::GetConversionUV(MT_Point2 *nuv){
+void BL_Material::GetConversionUV(MT_Point2 *nuv)
+{
*nuv++ = uv[0];
*nuv++ = uv[1];
*nuv++ = uv[2];
*nuv = uv[3];
}
-void BL_Material::SetConversionUV2(const STR_String& name, MT_Point2 *nuv) {
+void BL_Material::SetConversionUV2(const STR_String& name, MT_Point2 *nuv)
+{
uv2Name = name;
uv2[0] = *nuv++;
uv2[1] = *nuv++;
@@ -134,7 +139,8 @@ void BL_Material::SetConversionUV2(const STR_String& name, MT_Point2 *nuv) {
uv2[3] = *nuv;
}
-void BL_Material::GetConversionUV2(MT_Point2 *nuv){
+void BL_Material::GetConversionUV2(MT_Point2 *nuv)
+{
*nuv++ = uv2[0];
*nuv++ = uv2[1];
*nuv++ = uv2[2];
diff --git a/source/gameengine/Ketsji/BL_Texture.cpp b/source/gameengine/Ketsji/BL_Texture.cpp
index a306e059442..2c57004e6c4 100644
--- a/source/gameengine/Ketsji/BL_Texture.cpp
+++ b/source/gameengine/Ketsji/BL_Texture.cpp
@@ -38,11 +38,13 @@ extern "C" {
}
// (n&(n-1)) zeros the least significant bit of n
-static int is_pow2(int num) {
+static int is_power_of_2_i(int num)
+{
return ((num)&(num-1))==0;
}
-static int smaller_pow2(int num) {
- while (!is_pow2(num))
+static int power_of_2_min_i(int num)
+{
+ while (!is_power_of_2_i(num))
num= num&(num-1);
return num;
}
@@ -159,7 +161,7 @@ bool BL_Texture::InitFromImage(int unit, Image *img, bool mipmap)
void BL_Texture::InitGLTex(unsigned int *pix,int x,int y,bool mipmap)
{
- if (!is_pow2(x) || !is_pow2(y) ) {
+ if (!is_power_of_2_i(x) || !is_power_of_2_i(y) ) {
InitNonPow2Tex(pix, x,y,mipmap);
return;
}
@@ -184,8 +186,8 @@ void BL_Texture::InitGLTex(unsigned int *pix,int x,int y,bool mipmap)
void BL_Texture::InitNonPow2Tex(unsigned int *pix,int x,int y,bool mipmap)
{
- int nx= smaller_pow2(x);
- int ny= smaller_pow2(y);
+ int nx= power_of_2_min_i(x);
+ int ny= power_of_2_min_i(y);
unsigned int *newPixels = (unsigned int *)malloc(nx*ny*sizeof(unsigned int));
@@ -274,7 +276,7 @@ bool BL_Texture::InitCubeMap(int unit, EnvMap *cubemap)
my_envmap_split_ima(cubemap, ibuf);
- if (!is_pow2(cubemap->cube[0]->x) || !is_pow2(cubemap->cube[0]->y))
+ if (!is_power_of_2_i(cubemap->cube[0]->x) || !is_power_of_2_i(cubemap->cube[0]->y))
{
spit("invalid envmap size please render with CubeRes @ power of two");
@@ -610,8 +612,8 @@ void BL_Texture::setTexEnv(BL_Material *mat, bool modulate)
int BL_Texture::GetPow2(int n)
{
- if(!is_pow2(n))
- n = smaller_pow2(n);
+ if(!is_power_of_2_i(n))
+ n = power_of_2_min_i(n);
return n;
}
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index 2736516bf33..18f9875a804 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -106,7 +106,7 @@ public:
#ifdef WITH_PYTHON
// --------------------------------
- virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
+ virtual PyObject* py_repr(void) { return PyUnicode_From_STR_String(mMaterial->matname); }
static PyObject* pyattr_get_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_materialIndex(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_Dome.cpp b/source/gameengine/Ketsji/KX_Dome.cpp
index 828c327a228..4f959d9d2f9 100644
--- a/source/gameengine/Ketsji/KX_Dome.cpp
+++ b/source/gameengine/Ketsji/KX_Dome.cpp
@@ -255,7 +255,8 @@ void KX_Dome::CalculateImageSize(void)
}
}
-bool KX_Dome::CreateDL(){
+bool KX_Dome::CreateDL()
+{
dlistId = glGenLists((GLsizei) m_numimages);
if (dlistId != 0) {
if(m_mode == DOME_FISHEYE || m_mode == DOME_TRUNCATED_FRONT || m_mode == DOME_TRUNCATED_REAR){
diff --git a/source/gameengine/Ketsji/KX_FontObject.cpp b/source/gameengine/Ketsji/KX_FontObject.cpp
index 7e40af2f3c4..5a4d9065605 100644
--- a/source/gameengine/Ketsji/KX_FontObject.cpp
+++ b/source/gameengine/Ketsji/KX_FontObject.cpp
@@ -41,6 +41,26 @@ extern "C" {
#define BGE_FONT_RES 100
+std::vector<STR_String> split_string(STR_String str)
+{
+ std::vector<STR_String> text = std::vector<STR_String>();
+
+ /* Split the string upon new lines */
+ int begin=0, end=0;
+ while (end < str.Length())
+ {
+ if(str.GetAt(end) == '\n')
+ {
+ text.push_back(str.Mid(begin, end-begin));
+ begin = end+1;
+ }
+ end++;
+ }
+ //Now grab the last line
+ text.push_back(str.Mid(begin, end-begin));
+
+ return text;
+}
KX_FontObject::KX_FontObject( void* sgReplicationInfo,
SG_Callbacks callbacks,
RAS_IRenderTools* rendertools,
@@ -52,8 +72,10 @@ KX_FontObject::KX_FontObject( void* sgReplicationInfo,
m_rendertools(rendertools)
{
Curve *text = static_cast<Curve *> (ob->data);
- m_text = text->str;
+ m_text = split_string(text->str);
m_fsize = text->fsize;
+ m_line_spacing = text->linedist;
+ m_offset = MT_Vector3(text->xof, text->yof, 0);
/* FO_BUILTIN_NAME != "default" */
/* I hope at some point Blender (2.5x) can have a single font */
@@ -95,20 +117,45 @@ void KX_FontObject::ProcessReplica()
void KX_FontObject::DrawText()
{
+ /* Allow for some logic brick control */
+ if(this->GetProperty("Text"))
+ m_text = split_string(this->GetProperty("Text")->GetText());
+
/* only draws the text if visible */
if(this->GetVisible() == 0) return;
/* update the animated color */
this->GetObjectColor().getValue(m_color);
- /* XXX 2DO - handle multiple lines */
/* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
float RES = BGE_FONT_RES * m_resolution;
float size = m_fsize * m_object->size[0] * RES;
float aspect = 1.f / (m_object->size[0] * RES);
- m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
+ /* Get a working copy of the OpenGLMatrix to use */
+ double mat[16];
+ memcpy(mat, this->GetOpenGLMatrix(), sizeof(double)*16);
+
+ /* Account for offset */
+ MT_Vector3 offset = this->NodeGetWorldOrientation() * m_offset * this->NodeGetWorldScaling();
+ mat[12] += offset[0]; mat[13] += offset[1]; mat[14] += offset[2];
+
+ /* Orient the spacing vector */
+ MT_Vector3 spacing = MT_Vector3(0, m_fsize*m_line_spacing, 0);
+ spacing = this->NodeGetWorldOrientation() * spacing * this->NodeGetWorldScaling()[1];
+
+ /* Draw each line, taking spacing into consideration */
+ for(int i=0; i<m_text.size(); ++i)
+ {
+ if (i!=0)
+ {
+ mat[12] -= spacing[0];
+ mat[13] -= spacing[1];
+ mat[14] -= spacing[2];
+ }
+ m_rendertools->RenderText3D(m_fontid, m_text[i], int(size), m_dpi, m_color, mat, aspect);
+ }
}
#ifdef WITH_PYTHON
@@ -150,11 +197,35 @@ PyMethodDef KX_FontObject::Methods[] = {
};
PyAttributeDef KX_FontObject::Attributes[] = {
- KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text), //arbitrary limit. 280 = 140 unicode chars in unicode
+ //KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text[0]), //arbitrary limit. 280 = 140 unicode chars in unicode
+ KX_PYATTRIBUTE_RW_FUNCTION("text", KX_FontObject, pyattr_get_text, pyattr_set_text),
KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
/* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
{ NULL } //Sentinel
};
+PyObject* KX_FontObject::pyattr_get_text(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_FontObject* self= static_cast<KX_FontObject*>(self_v);
+ STR_String str = STR_String();
+ for(int i=0; i<self->m_text.size(); ++i)
+ {
+ if(i!=0)
+ str += '\n';
+ str += self->m_text[i];
+ }
+ return PyUnicode_From_STR_String(str);
+}
+
+int KX_FontObject::pyattr_set_text(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_FontObject* self= static_cast<KX_FontObject*>(self_v);
+ if(!PyUnicode_Check(value))
+ return PY_SET_ATTR_FAIL;
+ char* chars = _PyUnicode_AsString(value);
+ self->m_text = split_string(STR_String(chars));
+ return PY_SET_ATTR_SUCCESS;
+}
+
#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_FontObject.h b/source/gameengine/Ketsji/KX_FontObject.h
index 8fc7a9e9f28..958a6cd3360 100644
--- a/source/gameengine/Ketsji/KX_FontObject.h
+++ b/source/gameengine/Ketsji/KX_FontObject.h
@@ -57,13 +57,15 @@ public:
virtual void ProcessReplica();
protected:
- STR_String m_text;
+ std::vector<STR_String> m_text;
Object* m_object;
int m_fontid;
int m_dpi;
float m_fsize;
float m_resolution;
float m_color[4];
+ float m_line_spacing;
+ MT_Vector3 m_offset;
class RAS_IRenderTools* m_rendertools; //needed for drawing routine
@@ -76,6 +78,8 @@ public:
*/
#ifdef WITH_PYTHON
+ static PyObject* pyattr_get_text(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_text(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
#endif
};
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 245a92a96de..cc078e96e64 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -888,7 +888,7 @@ public:
*/
virtual PyObject* py_repr(void)
{
- return PyUnicode_FromString(GetName().ReadPtr());
+ return PyUnicode_From_STR_String(GetName());
}
KX_PYMETHOD_O(KX_GameObject,SetWorldPosition);
diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.cpp b/source/gameengine/Ketsji/KX_IPO_SGController.cpp
index 70bb2dbb5a2..728d0fb8561 100644
--- a/source/gameengine/Ketsji/KX_IPO_SGController.cpp
+++ b/source/gameengine/Ketsji/KX_IPO_SGController.cpp
@@ -145,7 +145,8 @@ bool KX_IpoSGController::Update(double currentTime)
}
//modifies position?
- if (m_ipo_channels_active[OB_LOC_X] || m_ipo_channels_active[OB_LOC_Y] || m_ipo_channels_active[OB_LOC_Z] || m_ipo_channels_active[OB_DLOC_X] || m_ipo_channels_active[OB_DLOC_Y] || m_ipo_channels_active[OB_DLOC_Z])
+ if (m_ipo_channels_active[OB_LOC_X] || m_ipo_channels_active[OB_LOC_Y] || m_ipo_channels_active[OB_LOC_Z] ||
+ m_ipo_channels_active[OB_DLOC_X] || m_ipo_channels_active[OB_DLOC_Y] || m_ipo_channels_active[OB_DLOC_Z])
{
if (m_ipo_as_force == true)
{
@@ -198,7 +199,9 @@ bool KX_IpoSGController::Update(double currentTime)
}
}
//modifies orientation?
- if (m_ipo_channels_active[OB_ROT_X] || m_ipo_channels_active[OB_ROT_Y] || m_ipo_channels_active[OB_ROT_Z] || m_ipo_channels_active[OB_DROT_X] || m_ipo_channels_active[OB_DROT_Y] || m_ipo_channels_active[OB_DROT_Z]) {
+ if (m_ipo_channels_active[OB_ROT_X] || m_ipo_channels_active[OB_ROT_Y] || m_ipo_channels_active[OB_ROT_Z] ||
+ m_ipo_channels_active[OB_DROT_X] || m_ipo_channels_active[OB_DROT_Y] || m_ipo_channels_active[OB_DROT_Z])
+ {
if (m_ipo_as_force) {
if (m_game_object && ob) {
@@ -293,7 +296,9 @@ bool KX_IpoSGController::Update(double currentTime)
}
}
//modifies scale?
- if (m_ipo_channels_active[OB_SIZE_X] || m_ipo_channels_active[OB_SIZE_Y] || m_ipo_channels_active[OB_SIZE_Z] || m_ipo_channels_active[OB_DSIZE_X] || m_ipo_channels_active[OB_DSIZE_Y] || m_ipo_channels_active[OB_DSIZE_Z]) {
+ if (m_ipo_channels_active[OB_SIZE_X] || m_ipo_channels_active[OB_SIZE_Y] || m_ipo_channels_active[OB_SIZE_Z] ||
+ m_ipo_channels_active[OB_DSIZE_X] || m_ipo_channels_active[OB_DSIZE_Y] || m_ipo_channels_active[OB_DSIZE_Z])
+ {
//default is no scale change
MT_Vector3 newScale(1.0,1.0,1.0);
if (!m_ipo_add)
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index a9be588e6b2..29727dc04da 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -110,6 +110,7 @@ double KX_KetsjiEngine::m_suspendedtime = 0.0;
double KX_KetsjiEngine::m_suspendeddelta = 0.0;
double KX_KetsjiEngine::m_average_framerate = 0.0;
bool KX_KetsjiEngine::m_restrict_anim_fps = false;
+short KX_KetsjiEngine::m_exitkey = 130; //ESC Key
/**
@@ -1857,6 +1858,16 @@ double KX_KetsjiEngine::GetAverageFrameRate()
return m_average_framerate;
}
+void KX_KetsjiEngine::SetExitKey(short key)
+{
+ m_exitkey = key;
+}
+
+short KX_KetsjiEngine::GetExitKey()
+{
+ return m_exitkey;
+}
+
void KX_KetsjiEngine::SetTimingDisplay(bool frameRate, bool profile, bool properties)
{
m_show_framerate = frameRate;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 5a02da07e43..96b737b686d 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -124,6 +124,8 @@ private:
static double m_suspendedtime;
static double m_suspendeddelta;
+ static short m_exitkey; /* Key used to exit the BGE */
+
int m_exitcode;
STR_String m_exitstring;
/**
@@ -352,6 +354,10 @@ public:
*/
static double GetAverageFrameRate();
+ static void SetExitKey(short key);
+
+ static short GetExitKey();
+
/**
* Activates or deactivates timing information display.
* @param frameRate Display for frame rate on or off.
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp
index fec1d9d296c..fa1366874a3 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.cpp
+++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp
@@ -247,12 +247,14 @@ PyObject* KX_MeshProxy::pyattr_get_materials(void *self_v, const KX_PYATTRIBUTE_
return materials;
}
-PyObject * KX_MeshProxy::pyattr_get_numMaterials(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef) {
+PyObject * KX_MeshProxy::pyattr_get_numMaterials(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef)
+{
KX_MeshProxy * self = static_cast<KX_MeshProxy *> (selfv);
return PyLong_FromSsize_t(self->m_meshobj->NumMaterials());
}
-PyObject * KX_MeshProxy::pyattr_get_numPolygons(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef) {
+PyObject * KX_MeshProxy::pyattr_get_numPolygons(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef)
+{
KX_MeshProxy * self = static_cast<KX_MeshProxy *> (selfv);
return PyLong_FromSsize_t(self->m_meshobj->NumPolygons());
}
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index b9ff3759452..392a6633067 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -65,32 +65,59 @@ bool PyMatTo(PyObject* pymat, T& mat)
{
bool noerror = true;
mat.setIdentity();
+
+
+#ifdef USE_MATHUTILS
+
+ if (MatrixObject_Check(pymat))
+ {
+ MatrixObject *pymatrix = (MatrixObject *)pymat;
+
+ if (BaseMath_ReadCallback(pymatrix) == -1)
+ return false;
+
+ if (pymatrix->num_col != Size(mat) || pymatrix->num_row != Size(mat))
+ return false;
+
+ for (unsigned int row = 0; row < Size(mat); row++)
+ {
+ for (unsigned int col = 0; col < Size(mat); col++)
+ {
+ mat[row][col] = *(pymatrix->matrix + col * pymatrix->num_row + row);
+ }
+ }
+ }
+ else
+
+#endif /* USE_MATHUTILS */
+
+
if (PySequence_Check(pymat))
{
- unsigned int cols = PySequence_Size(pymat);
- if (cols != Size(mat))
+ unsigned int rows = PySequence_Size(pymat);
+ if (rows != Size(mat))
return false;
- for (unsigned int x = 0; noerror && x < cols; x++)
+ for (unsigned int row = 0; noerror && row < rows; row++)
{
- PyObject *pycol = PySequence_GetItem(pymat, x); /* new ref */
- if (!PyErr_Occurred() && PySequence_Check(pycol))
+ PyObject *pyrow = PySequence_GetItem(pymat, row); /* new ref */
+ if (!PyErr_Occurred() && PySequence_Check(pyrow))
{
- unsigned int rows = PySequence_Size(pycol);
- if (rows != Size(mat))
+ unsigned int cols = PySequence_Size(pyrow);
+ if (cols != Size(mat))
noerror = false;
else
{
- for( unsigned int y = 0; y < rows; y++)
+ for( unsigned int col = 0; col < cols; col++)
{
- PyObject *item = PySequence_GetItem(pycol, y); /* new ref */
- mat[y][x] = PyFloat_AsDouble(item);
+ PyObject *item = PySequence_GetItem(pyrow, col); /* new ref */
+ mat[row][col] = PyFloat_AsDouble(item);
Py_DECREF(item);
}
}
} else
noerror = false;
- Py_DECREF(pycol);
+ Py_DECREF(pyrow);
}
} else
noerror = false;
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index d9822d131eb..9a2c0cb89b1 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -419,6 +419,20 @@ static PyObject* gPyGetLogicTicRate(PyObject*)
return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
}
+static PyObject* gPySetExitKey(PyObject*, PyObject* args)
+{
+ short exitkey;
+ if (!PyArg_ParseTuple(args, "h:setExitKey", &exitkey))
+ return NULL;
+ KX_KetsjiEngine::SetExitKey(exitkey);
+ Py_RETURN_NONE;
+}
+
+static PyObject* gPyGetExitKey(PyObject*)
+{
+ return PyLong_FromSsize_t(KX_KetsjiEngine::GetExitKey());
+}
+
static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
{
int frame;
@@ -812,6 +826,8 @@ static struct PyMethodDef game_methods[] = {
{"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
{"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
{"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
+ {"getExitKey", (PyCFunction) gPyGetExitKey, METH_NOARGS, (const char *)"Gets the key used to exit the game engine"},
+ {"setExitKey", (PyCFunction) gPySetExitKey, METH_VARARGS, (const char *)"Sets the key used to exit the game engine"},
{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
@@ -1950,7 +1966,15 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *
initVideoTexture();
/* could be done a lot more nicely, but for now a quick way to get bge.* working */
- PyRun_SimpleString("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes'), 'texture':__import__('VideoTexture')});");
+ PyRun_SimpleString("sys = __import__('sys');"
+ "mod = sys.modules['bge'] = type(sys)('bge');"
+ "mod.__dict__.update({'logic':__import__('GameLogic'), "
+ "'render':__import__('Rasterizer'), "
+ "'events':__import__('GameKeys'), "
+ "'constraints':__import__('PhysicsConstraints'), "
+ "'types':__import__('GameTypes'), "
+ "'texture':__import__('VideoTexture')});"
+ );
}
static struct PyModuleDef Rasterizer_module_def = {
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index c8070736b7f..c3e6fa376dd 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -617,7 +617,7 @@ public:
static PyObject* pyattr_get_drawing_callback_post(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_drawing_callback_post(void *selv_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- virtual PyObject* py_repr(void) { return PyUnicode_FromString(GetName().ReadPtr()); }
+ virtual PyObject* py_repr(void) { return PyUnicode_From_STR_String(GetName()); }
/* getitem/setitem */
static PyMappingMethods Mapping;
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index b30e674e821..aa864349035 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -55,7 +55,8 @@ void KX_TouchSensor::SynchronizeTransform()
}
-void KX_TouchSensor::EndFrame() {
+void KX_TouchSensor::EndFrame()
+{
m_colliders->ReleaseAndRemoveAll();
m_hitObject = NULL;
m_bTriggered = false;
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index 08264ce8a67..ddc72c08ea1 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../Ketsji
../SceneGraph
../../blender/makesdna
+ ../../blender/blenkernel
../../../intern/container
../../../intern/guardedalloc
../../../intern/moto/include
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
index 4eadf8e3e66..30344ce3a10 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
@@ -431,6 +431,8 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas)
glViewport(0,0, texturewidth, textureheight);
glDisable(GL_DEPTH_TEST);
+ // in case the previous material was wire
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
// if the last rendered face had alpha add it would messes with the color of the plane we apply 2DFilter to
glDisable(GL_BLEND);
glPushMatrix(); //GL_MODELVIEW
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
index 48e9e93b80e..afa62a9a8c6 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
@@ -43,6 +43,10 @@
#include <algorithm>
+extern "C" {
+# include "BKE_deform.h"
+}
+
/* polygon sorting */
struct RAS_MeshObject::polygonSlot
@@ -573,8 +577,8 @@ void RAS_MeshObject::CheckWeightCache(Object* obj)
{
KeyBlock *kb;
int kbindex, defindex;
- MDeformVert *dvert= NULL;
- int totvert, i, j;
+ MDeformVert *dv= NULL;
+ int totvert, i;
float *weights;
if (!m_mesh->key)
@@ -598,19 +602,15 @@ void RAS_MeshObject::CheckWeightCache(Object* obj)
kb->weights = NULL;
}
- dvert= m_mesh->dvert;
+ dv= m_mesh->dvert;
totvert= m_mesh->totvert;
- weights= (float*)MEM_callocN(totvert*sizeof(float), "weights");
+ weights= (float*)MEM_mallocN(totvert*sizeof(float), "weights");
- for (i=0; i < totvert; i++, dvert++) {
- for(j=0; j<dvert->totweight; j++) {
- if (dvert->dw[j].def_nr == defindex) {
- weights[i]= dvert->dw[j].weight;
- break;
- }
- }
+ for (i=0; i < totvert; i++, dv++) {
+ weights[i]= defvert_find_weight(dv, defindex);
}
+
kb->weights = weights;
m_cacheWeightIndex[kbindex] = defindex;
}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 56c0f46865a..f5787dad41e 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -896,7 +896,7 @@ void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
//ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol);
current_blmat_nr = current_polymat->GetMaterialIndex();
current_image = current_polymat->GetBlenderImage();
- ms.m_pDerivedMesh->drawFacesTex(ms.m_pDerivedMesh, CheckTexDM);
+ ms.m_pDerivedMesh->drawFacesTex(ms.m_pDerivedMesh, CheckTexDM, NULL, NULL);
}
return;
}
diff --git a/source/tests/CMakeLists.txt b/source/tests/CMakeLists.txt
index 40d304ef4b9..74a0ad1c628 100644
--- a/source/tests/CMakeLists.txt
+++ b/source/tests/CMakeLists.txt
@@ -60,6 +60,11 @@ add_test(script_run_operators ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_run_operators.py
)
+# test running mathutils testing script
+add_test(script_pyapi_mathutils ${TEST_BLENDER_EXE}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_pyapi_mathutils.py
+)
+
# ------------------------------------------------------------------------------
# IO TESTS
diff --git a/source/tests/bl_pyapi_mathutils.py b/source/tests/bl_pyapi_mathutils.py
new file mode 100644
index 00000000000..b2e9f27d9ec
--- /dev/null
+++ b/source/tests/bl_pyapi_mathutils.py
@@ -0,0 +1,163 @@
+import unittest
+from test import support
+from mathutils import Matrix, Vector
+
+
+class MatrixTesting(unittest.TestCase):
+ def test_matrix_column_access(self):
+ #mat =
+ #[ 1 2 3 4 ]
+ #[ 1 2 3 4 ]
+ #[ 1 2 3 4 ]
+ mat = Matrix(((1, 11, 111),
+ (2, 22, 222),
+ (3, 33, 333),
+ (4, 44, 444)))
+
+ self.assertEqual(mat[0], Vector((1, 11, 111)))
+ self.assertEqual(mat[1], Vector((2, 22, 222)))
+ self.assertEqual(mat[2], Vector((3, 33, 333)))
+ self.assertEqual(mat[3], Vector((4, 44, 444)))
+
+ def test_item_access(self):
+ args = ((1, 4, 0, -1),
+ (2, -1, 2, -2),
+ (0, 3, 8, 3),
+ (-2, 9, 1, 0))
+
+ mat = Matrix(args)
+
+ for row in range(4):
+ for col in range(4):
+ self.assertEqual(mat[row][col], args[row][col])
+
+ self.assertEqual(mat[0][2], 0)
+ self.assertEqual(mat[3][1], 9)
+ self.assertEqual(mat[2][3], 3)
+ self.assertEqual(mat[0][0], 1)
+ self.assertEqual(mat[3][3], 0)
+
+ def test_item_assignment(self):
+ mat = Matrix() - Matrix()
+ indices = (0, 0), (1, 3), (2, 0), (3, 2), (3, 1)
+ checked_indices = []
+ for row, col in indices:
+ mat[row][col] = 1
+
+ for row in range(4):
+ for col in range(4):
+ if mat[row][col]:
+ checked_indices.append((row, col))
+
+ for item in checked_indices:
+ self.assertIn(item, indices)
+
+ def test_matrix_to_3x3(self):
+ #mat =
+ #[ 1 2 3 4 ]
+ #[ 2 4 6 8 ]
+ #[ 3 6 9 12 ]
+ #[ 4 8 12 16 ]
+ mat = Matrix(tuple((i, 2 * i, 3 * i, 4 * i) for i in range(1, 5)))
+ mat_correct = Matrix(((1, 2, 3), (2, 4, 6), (3, 6, 9)))
+ self.assertEqual(mat.to_3x3(), mat_correct)
+
+ def test_matrix_to_translation(self):
+ mat = Matrix()
+ mat[0][3] = 1
+ mat[1][3] = 2
+ mat[2][3] = 3
+ self.assertEqual(mat.to_translation(), Vector((1, 2, 3)))
+
+ def test_matrix_translation(self):
+ mat = Matrix()
+ mat.translation = Vector((1, 2, 3))
+ self.assertEqual(mat[0][3], 1)
+ self.assertEqual(mat[1][3], 2)
+ self.assertEqual(mat[2][3], 3)
+
+ def test_non_square_mult(self):
+ mat1 = Matrix(((1, 2, 3),
+ (4, 5, 6)))
+ mat2 = Matrix(((1, 2),
+ (3, 4),
+ (5, 6)))
+
+ prod_mat1 = Matrix(((22, 28),
+ (49, 64)))
+ prod_mat2 = Matrix(((9, 12, 15),
+ (19, 26, 33),
+ (29, 40, 51)))
+
+ self.assertEqual(mat1*mat2, prod_mat1)
+ self.assertEqual(mat2 * mat1, prod_mat2)
+
+ def test_mat4x4_vec3D_mult(self):
+ mat = Matrix(((1, 0, 2, 0),
+ (0, 6, 0, 0),
+ (0, 0, 1, 1),
+ (0, 0, 0, 1)))
+
+ vec = Vector((1, 2, 3))
+
+ prod_mat_vec = Vector((7, 12, 4))
+ prod_vec_mat = Vector((1, 12, 5))
+
+ self.assertEqual(mat * vec, prod_mat_vec)
+ self.assertEqual(vec * mat, prod_vec_mat)
+
+ def test_mat_vec_mult(self):
+ mat1 = Matrix()
+
+ vec = Vector((1, 2))
+
+ self.assertRaises(TypeError, mat1.__mul__, vec)
+ self.assertRaises(ValueError, vec.__mul__, mat1) # Why are these different?!
+
+ mat2 = Matrix(((1, 2),
+ (-2, 3)))
+
+ prod = Vector((5, 4))
+
+ self.assertEqual(mat2 * vec, prod)
+
+ def test_matrix_inverse(self):
+ mat = Matrix(((1, 4, 0, -1),
+ (2, -1, 2, -2),
+ (0, 3, 8, 3),
+ (-2, 9, 1, 0)))
+
+ inv_mat = (1 / 285) * Matrix(((195, -57, 27, -102),
+ (50, -19, 4, 6),
+ (-60, 57, 18, 27),
+ (110, -133, 43, -78)))
+
+ self.assertEqual(mat.inverted(), inv_mat)
+
+ def test_matrix_mult(self):
+ mat = Matrix(((1, 4, 0, -1),
+ (2, -1, 2, -2),
+ (0, 3, 8, 3),
+ (-2, 9, 1, 0)))
+
+ prod_mat = Matrix(((11, -9, 7, -9),
+ (4, -3, 12, 6),
+ (0, 48, 73, 18),
+ (16, -14, 26, -13)))
+
+ self.assertEqual(mat * mat, prod_mat)
+
+
+def test_main():
+ try:
+ support.run_unittest(MatrixTesting)
+ except:
+ import traceback
+ traceback.print_exc()
+
+ # alert CTest we failed
+ import sys
+ sys.exit(1)
+
+if __name__ == '__main__':
+ test_main()